From fc28f68bd0f1ea169ebd42030f510ec508d2d5bb Mon Sep 17 00:00:00 2001 From: xtaodada Date: Thu, 4 Jul 2024 19:09:48 +0800 Subject: [PATCH] :construction_worker: Update to MibooGram --- core/dependence/assets.py | 566 ------------- core/dependence/assets.pyi | 175 ---- core/services/game/__init__.py | 1 - core/services/game/cache.py | 29 - core/services/game/services.py | 52 -- core/services/players/services.py | 31 +- core/services/quiz/__init__.py | 1 - core/services/quiz/cache.py | 69 -- core/services/quiz/models.py | 53 -- core/services/quiz/repositories.py | 57 -- core/services/quiz/services.py | 64 -- core/services/search/models.py | 1 + core/services/wiki/__init__.py | 1 - core/services/wiki/cache.py | 41 - core/services/wiki/services.py | 103 --- pdm.lock | 495 +++++------ plugins/account/account.py | 8 +- plugins/account/cookies.py | 13 +- plugins/account/players.py | 4 +- plugins/admin/get_chat.py | 2 +- plugins/admin/post.py | 6 +- plugins/admin/quiz.py | 230 ----- plugins/admin/refresh_metadata.py | 28 - plugins/admin/set_command.py | 38 +- plugins/admin/wiki.py | 19 - plugins/app/inline.py | 55 -- plugins/genshin/abyss.py | 627 -------------- plugins/genshin/abyss_team.py | 132 --- plugins/genshin/akasha.py | 120 --- plugins/genshin/avatar_list.py | 270 ------ plugins/genshin/birthday.py | 85 -- plugins/genshin/calendar.py | 90 -- plugins/genshin/daily/material.py | 790 ------------------ plugins/genshin/gcsim/plugin.py | 331 -------- plugins/genshin/gcsim/renderer.py | 141 ---- plugins/genshin/gcsim/runner.py | 273 ------ plugins/genshin/hilichurls.py | 51 -- plugins/genshin/ledger.py | 353 -------- plugins/genshin/map.py | 197 ----- plugins/genshin/material.py | 239 ------ plugins/genshin/model/__init__.py | 29 - plugins/genshin/model/base.py | 198 ----- plugins/genshin/model/converters/enka.py | 197 ----- plugins/genshin/model/converters/gcsim.py | 405 --------- plugins/genshin/model/gcsim.py | 237 ------ plugins/genshin/model/metadata.py | 31 - plugins/genshin/pay_log.py | 244 ------ plugins/genshin/player_cards.py | 748 ----------------- plugins/genshin/quiz.py | 67 -- plugins/genshin/reg_time.py | 96 --- plugins/genshin/strategy.py | 75 -- plugins/genshin/weapon.py | 145 ---- plugins/genshin/wish.py | 327 -------- plugins/genshin/wish_log.py | 634 -------------- plugins/group/captcha.py | 465 ----------- plugins/jobs/refresh_history.py | 155 ---- plugins/jobs/sign.py | 2 +- plugins/system/errorhandler.py | 10 +- plugins/tools/birthday_card.py | 186 ----- plugins/tools/challenge.py | 2 +- plugins/tools/daily_note.py | 127 +-- plugins/tools/genshin.py | 18 +- plugins/tools/player_info.py | 3 - plugins/tools/sign.py | 4 +- plugins/{genshin => zzz}/__init__.py | 0 plugins/{genshin => zzz}/daily_note.py | 56 +- plugins/{genshin => zzz}/daily_note_tasks.py | 13 +- plugins/{genshin => zzz}/help.py | 0 plugins/{genshin => zzz}/help_raw.py | 0 plugins/{genshin => zzz}/redeem/redeem.py | 2 +- plugins/{genshin => zzz}/redeem/runner.py | 6 +- plugins/{genshin => zzz}/sign.py | 0 plugins/{genshin => zzz}/stats.py | 59 +- plugins/{genshin => zzz}/verify.py | 0 pyproject.toml | 1 - requirements.txt | 23 +- resources/bot/help/example.html | 142 +--- resources/zzz/daily_note/daily_note.css | 121 +++ resources/zzz/daily_note/daily_note.jinja2 | 81 ++ .../daily_note/items/Inter-Knot-Credit.png | Bin 0 -> 7857 bytes .../daily_note/items/Investigation-Point.png | Bin 0 -> 9178 bytes resources/zzz/daily_note/items/bg.png | Bin 0 -> 6297 bytes resources/zzz/daily_note/items/电量.png | Bin 0 -> 7644 bytes resources/zzz/stats/background/liyue.png | Bin 0 -> 408372 bytes resources/zzz/stats/background/mondstadt.png | Bin 0 -> 350631 bytes resources/zzz/stats/example/liyue.css | 62 ++ resources/zzz/stats/example/liyue.html | 256 ++++++ resources/zzz/stats/example/mondstadt.css | 49 ++ resources/zzz/stats/example/mondstadt.html | 261 ++++++ resources/zzz/stats/liyue.css | 62 ++ resources/zzz/stats/mondstadt.css | 49 ++ resources/zzz/stats/old/info.css | 92 ++ resources/zzz/stats/old/info.html | 183 ++++ resources/zzz/stats/stats.jinja2 | 45 + utils/uid.py | 2 + 95 files changed, 1627 insertions(+), 10184 deletions(-) delete mode 100644 core/dependence/assets.py delete mode 100644 core/dependence/assets.pyi delete mode 100644 core/services/game/__init__.py delete mode 100644 core/services/game/cache.py delete mode 100644 core/services/game/services.py delete mode 100644 core/services/quiz/__init__.py delete mode 100644 core/services/quiz/cache.py delete mode 100644 core/services/quiz/models.py delete mode 100644 core/services/quiz/repositories.py delete mode 100644 core/services/quiz/services.py delete mode 100644 core/services/wiki/__init__.py delete mode 100644 core/services/wiki/cache.py delete mode 100644 core/services/wiki/services.py delete mode 100644 plugins/admin/quiz.py delete mode 100644 plugins/admin/refresh_metadata.py delete mode 100644 plugins/admin/wiki.py delete mode 100644 plugins/genshin/abyss.py delete mode 100644 plugins/genshin/abyss_team.py delete mode 100644 plugins/genshin/akasha.py delete mode 100644 plugins/genshin/avatar_list.py delete mode 100644 plugins/genshin/birthday.py delete mode 100644 plugins/genshin/calendar.py delete mode 100644 plugins/genshin/daily/material.py delete mode 100644 plugins/genshin/gcsim/plugin.py delete mode 100644 plugins/genshin/gcsim/renderer.py delete mode 100644 plugins/genshin/gcsim/runner.py delete mode 100644 plugins/genshin/hilichurls.py delete mode 100644 plugins/genshin/ledger.py delete mode 100644 plugins/genshin/map.py delete mode 100644 plugins/genshin/material.py delete mode 100644 plugins/genshin/model/__init__.py delete mode 100644 plugins/genshin/model/base.py delete mode 100644 plugins/genshin/model/converters/enka.py delete mode 100644 plugins/genshin/model/converters/gcsim.py delete mode 100644 plugins/genshin/model/gcsim.py delete mode 100644 plugins/genshin/model/metadata.py delete mode 100644 plugins/genshin/pay_log.py delete mode 100644 plugins/genshin/player_cards.py delete mode 100644 plugins/genshin/quiz.py delete mode 100644 plugins/genshin/reg_time.py delete mode 100644 plugins/genshin/strategy.py delete mode 100644 plugins/genshin/weapon.py delete mode 100644 plugins/genshin/wish.py delete mode 100644 plugins/genshin/wish_log.py delete mode 100644 plugins/group/captcha.py delete mode 100644 plugins/jobs/refresh_history.py delete mode 100644 plugins/tools/birthday_card.py rename plugins/{genshin => zzz}/__init__.py (100%) rename plugins/{genshin => zzz}/daily_note.py (64%) rename plugins/{genshin => zzz}/daily_note_tasks.py (91%) rename plugins/{genshin => zzz}/help.py (100%) rename plugins/{genshin => zzz}/help_raw.py (100%) rename plugins/{genshin => zzz}/redeem/redeem.py (98%) rename plugins/{genshin => zzz}/redeem/runner.py (96%) rename plugins/{genshin => zzz}/sign.py (100%) rename plugins/{genshin => zzz}/stats.py (68%) rename plugins/{genshin => zzz}/verify.py (100%) create mode 100644 resources/zzz/daily_note/daily_note.css create mode 100644 resources/zzz/daily_note/daily_note.jinja2 create mode 100644 resources/zzz/daily_note/items/Inter-Knot-Credit.png create mode 100644 resources/zzz/daily_note/items/Investigation-Point.png create mode 100644 resources/zzz/daily_note/items/bg.png create mode 100644 resources/zzz/daily_note/items/电量.png create mode 100644 resources/zzz/stats/background/liyue.png create mode 100644 resources/zzz/stats/background/mondstadt.png create mode 100644 resources/zzz/stats/example/liyue.css create mode 100644 resources/zzz/stats/example/liyue.html create mode 100644 resources/zzz/stats/example/mondstadt.css create mode 100644 resources/zzz/stats/example/mondstadt.html create mode 100644 resources/zzz/stats/liyue.css create mode 100644 resources/zzz/stats/mondstadt.css create mode 100644 resources/zzz/stats/old/info.css create mode 100644 resources/zzz/stats/old/info.html create mode 100644 resources/zzz/stats/stats.jinja2 diff --git a/core/dependence/assets.py b/core/dependence/assets.py deleted file mode 100644 index 553a2f6..0000000 --- a/core/dependence/assets.py +++ /dev/null @@ -1,566 +0,0 @@ -"""用于下载和管理角色、武器、材料等的图标""" - -from __future__ import annotations - -import asyncio -import re -from abc import ABC, abstractmethod -from functools import cached_property, lru_cache, partial -from multiprocessing import RLock as Lock -from pathlib import Path -from ssl import SSLZeroReturnError -from typing import AsyncIterator, Awaitable, Callable, ClassVar, Dict, Optional, TYPE_CHECKING, TypeVar, Union - -from aiofiles import open as async_open -from aiofiles.os import remove as async_remove -from enkanetwork import Assets as EnkaAssets -from enkanetwork.model.assets import CharacterAsset as EnkaCharacterAsset -from httpx import AsyncClient, HTTPError, HTTPStatusError, TransportError, URL -from typing_extensions import Self - -from core.base_service import BaseService -from core.config import config -from metadata.genshin import AVATAR_DATA, HONEY_DATA, MATERIAL_DATA, NAMECARD_DATA, WEAPON_DATA -from metadata.scripts.honey import update_honey_metadata -from metadata.scripts.metadatas import update_metadata_from_ambr, update_metadata_from_github -from metadata.shortname import roleToId, weaponToId -from modules.wiki.base import HONEY_HOST -from utils.const import AMBR_HOST, ENKA_HOST, PROJECT_ROOT -from utils.log import logger -from utils.typedefs import StrOrInt, StrOrURL - -if TYPE_CHECKING: - from httpx import Response - from multiprocessing.synchronize import RLock - -__all__ = ("AssetsServiceType", "AssetsService", "AssetsServiceError", "AssetsCouldNotFound", "DEFAULT_EnkaAssets") - -ICON_TYPE = Union[Callable[[bool], Awaitable[Optional[Path]]], Callable[..., Awaitable[Optional[Path]]]] -NAME_MAP_TYPE = Dict[str, StrOrURL] - -ASSETS_PATH = PROJECT_ROOT.joinpath("resources/assets") -ASSETS_PATH.mkdir(exist_ok=True, parents=True) - -DATA_MAP = {"avatar": AVATAR_DATA, "weapon": WEAPON_DATA, "material": MATERIAL_DATA} - -DEFAULT_EnkaAssets = EnkaAssets(lang="chs") - - -class AssetsServiceError(Exception): - pass - - -class AssetsCouldNotFound(AssetsServiceError): - def __init__(self, message: str, target: str): - self.message = message - self.target = target - super().__init__(f"{message}: target={target}") - - -class _AssetsService(ABC): - _lock: ClassVar["RLock"] = Lock() - _dir: ClassVar[Path] - icon_types: ClassVar[list[str]] - - _client: Optional[AsyncClient] = None - _links: dict[str, str] = {} - - id: int - type: str - - icon: ICON_TYPE - """图标""" - - @abstractmethod - @cached_property - def game_name(self) -> str: - """游戏数据中的名称""" - - @cached_property - def honey_id(self) -> str: - """当前资源在 Honey Impact 所对应的 ID""" - return HONEY_DATA[self.type].get(str(self.id), [""])[0] - - @property - def path(self) -> Path: - """当前资源的文件夹""" - result = self._dir.joinpath(str(self.id)).resolve() - result.mkdir(exist_ok=True, parents=True) - return result - - @property - def client(self) -> AsyncClient: - with self._lock: - if self._client is None or self._client.is_closed: - self._client = AsyncClient() - return self._client - - def __init__(self, client: Optional[AsyncClient] = None) -> None: - self._client = client - - def __call__(self, target: int) -> Self: - """用于生成与 target 对应的 assets""" - result = self.__class__(self.client) - result.id = target - return result - - def __init_subclass__(cls, **kwargs) -> None: - """初始化一些类变量""" - from itertools import chain - - cls.icon_types = [ # 支持的图标类型 - k - for k, v in chain(cls.__annotations__.items(), *map(lambda x: x.__annotations__.items(), cls.__bases__)) - if v in [ICON_TYPE, "ICON_TYPE"] - ] - cls.type = cls.__name__.lstrip("_").split("Assets")[0].lower() # 当前 assert 的类型 - cls._dir = ASSETS_PATH.joinpath(cls.type) # 图标保存的文件夹 - cls._dir.mkdir(exist_ok=True, parents=True) - - async def _request(self, url: str, interval: float = 0.2) -> "Response": - error = None - for _ in range(5): - try: - response = await self.client.get(url, follow_redirects=False) - if response.headers.get("content-length", None) == "2358": - continue - return response - except (TransportError, SSLZeroReturnError) as e: - error = e - await asyncio.sleep(interval) - continue - if error is not None: - raise error - - async def _download(self, url: StrOrURL, path: Path, retry: int = 5) -> Path | None: - """从 url 下载图标至 path""" - logger.debug("正在从 %s 下载图标至 %s", url, path) - headers = None - if config.enka_network_api_agent is not None and URL(url).host == "enka.network": - headers = {"user-agent": config.enka_network_api_agent} - for time in range(retry): - try: - response = await self.client.get(url, follow_redirects=False, headers=headers) - except Exception as error: # pylint: disable=W0703 - if not isinstance(error, (HTTPError, SSLZeroReturnError)): - logger.error(error) # 打印未知错误 - if time != retry - 1: # 未达到重试次数 - await asyncio.sleep(1) - else: - raise error - continue - if response.status_code != 200: # 判定页面是否正常 - return None - async with async_open(path, "wb") as file: - await file.write(response.content) # 保存图标 - return path.resolve() - - async def _get_from_ambr(self, item: str) -> AsyncIterator[str | None]: # pylint: disable=W0613,R0201 - """从 ambr.top 上获取目标链接""" - yield None - - async def _get_from_enka(self, item: str) -> AsyncIterator[str | None]: # pylint: disable=W0613,R0201 - """从 enke.network 上获取目标链接""" - yield None - - async def _get_from_honey(self, item: str) -> AsyncIterator[str | None]: - """从 honey 上获取目标链接""" - if (honey_name := self.honey_name_map.get(item, None)) is not None: - yield HONEY_HOST.join(f"img/{honey_name}.png") - yield HONEY_HOST.join(f"img/{honey_name}.webp") - - async def _download_url_generator(self, item: str) -> AsyncIterator[str]: - # 获取当前 `AssetsService` 的所有爬虫 - for func in map(lambda x: getattr(self, x), sorted(filter(lambda x: x.startswith("_get_from_"), dir(self)))): - async for url in func(item): - if url is not None: - try: - if (response := await self._request(url := str(url))) is None: - continue - response.raise_for_status() - yield url - except HTTPStatusError: - continue - - async def _get_download_url(self, item: str) -> str | None: - """获取图标的下载链接""" - async for url in self._download_url_generator(item): - if url is not None: - return url - - async def _get_img(self, overwrite: bool = False, *, item: str) -> Path | None: - """获取图标""" - path = next(filter(lambda x: x.stem == item, self.path.iterdir()), None) - if not overwrite and path: # 如果需要下载的图标存在且不覆盖( overwrite ) - return path.resolve() - if path is not None and path.exists(): - if overwrite: # 如果覆盖 - await async_remove(path) # 删除已存在的图标 - else: - return path - # 依次从使用当前 assets class 中的爬虫下载图标,顺序为爬虫名的字母顺序 - async for url in self._download_url_generator(item): - if url is not None: - path = self.path.joinpath(f"{item}{Path(url).suffix}") - if (result := await self._download(url, path)) is not None: - return result - - @lru_cache - async def get_link(self, item: str) -> str | None: - """获取相应图标链接""" - return await self._get_download_url(item) - - def __getattr__(self, item: str): - """魔法""" - if item in self.icon_types: - return partial(self._get_img, item=item) - object.__getattribute__(self, item) - return None - - @abstractmethod - @cached_property - def game_name_map(self) -> dict[str, str]: - """游戏中的图标名""" - - @abstractmethod - @cached_property - def honey_name_map(self) -> dict[str, str]: - """来自honey的图标名""" - - -class _AvatarAssets(_AssetsService): - enka: EnkaCharacterAsset | None - - side: ICON_TYPE - """侧视图图标""" - - card: ICON_TYPE - """卡片图标""" - - gacha: ICON_TYPE - """抽卡立绘""" - - gacha_card: ICON_TYPE - """抽卡卡片""" - - AVATAR_DEFAULT: int = 10000005 - """默认角色ID""" - - @cached_property - def game_name(self) -> str: - icon = "UI_AvatarIcon_" - if (avatar := AVATAR_DATA.get(str(self.id), None)) is not None: - icon = avatar["icon"] - else: - for aid, avatar in AVATAR_DATA.items(): - if aid.startswith(str(self.id)): - icon = avatar["icon"] - return re.findall(r"UI_AvatarIcon_(.*)", icon)[0] - - @cached_property - def honey_id(self) -> str: - return HONEY_DATA["avatar"].get(str(self.id), "")[0] - - @cached_property - def enka(self) -> Optional[EnkaCharacterAsset]: - api = getattr(self, "_enka_api", None) - cid = getattr(self, "id", None) - return None if api is None or cid is None else api.character(cid) - - def __init__(self, client: Optional[AsyncClient] = None, enka: Optional[EnkaAssets] = None): - super().__init__(client) - self._enka_api = enka or DEFAULT_EnkaAssets - - def __call__(self, target: StrOrInt) -> "_AvatarAssets": - if target == 0: - target = self.AVATAR_DEFAULT - temp = target - result = _AvatarAssets(self.client) - if isinstance(target, str): - try: - target = int(target) - except ValueError: - target = roleToId(target) - if isinstance(target, str) or target is None: - raise AssetsCouldNotFound("找不到对应的角色", temp) - result.id = target - result._enka_api = self._enka_api - return result - - async def _get_from_ambr(self, item: str) -> AsyncIterator[str | None]: - if item in {"icon", "side", "gacha"}: - yield str(AMBR_HOST.join(f"assets/UI/{self.game_name_map[item]}.png")) - - async def _get_from_enka(self, item: str) -> AsyncIterator[str | None]: - if (item_id := self.game_name_map.get(item)) is not None: - yield str(ENKA_HOST.join(f"ui/{item_id}.png")) - - @cached_property - def honey_name_map(self) -> dict[str, str]: - return { - "icon": f"{self.honey_id}_icon", - "side": f"{self.honey_id}_side_icon", - "gacha": f"{self.honey_id}_gacha_splash", - "gacha_card": f"{self.honey_id}_gacha_card", - } - - @cached_property - def game_name_map(self) -> dict[str, str]: - return { - "icon": f"UI_AvatarIcon_{self.game_name}", - "card": f"UI_AvatarIcon_{self.game_name}_Card", - "side": f"UI_AvatarIcon_Side_{self.game_name}", - "gacha": f"UI_Gacha_AvatarImg_{self.game_name}", - } - - -class _WeaponAssets(_AssetsService): - awaken: ICON_TYPE - """突破后图标""" - - gacha: ICON_TYPE - """抽卡立绘""" - - @cached_property - def game_name(self) -> str: - return re.findall(r"UI_EquipIcon_(.*)", WEAPON_DATA[str(self.id)]["icon"])[0] - - @cached_property - def game_name_map(self) -> dict[str, str]: - return { - "icon": f"UI_EquipIcon_{self.game_name}", - "awaken": f"UI_EquipIcon_{self.game_name}_Awaken", - "gacha": f"UI_Gacha_EquipIcon_{self.game_name}", - } - - @cached_property - def honey_id(self) -> str: - return f"i_n{self.id}" - - def __call__(self, target: StrOrInt) -> Self: - temp = target - result = _WeaponAssets(self.client) - if isinstance(target, str): - target = int(target) if target.isnumeric() else weaponToId(target) - if isinstance(target, str) or target is None: - raise AssetsCouldNotFound("找不到对应的武器", temp) - result.id = target - return result - - async def _get_from_ambr(self, item: str) -> AsyncIterator[str | None]: - if item == "icon": - yield str(AMBR_HOST.join(f"assets/UI/{self.game_name_map.get(item)}.png")) - - async def _get_from_enka(self, item: str) -> AsyncIterator[str | None]: - if item in self.game_name_map: - yield str(ENKA_HOST.join(f"ui/{self.game_name_map.get(item)}.png")) - - @cached_property - def honey_name_map(self) -> dict[str, str]: - return { - "icon": f"{self.honey_id}", - "awaken": f"{self.honey_id}_awaken_icon", - "gacha": f"{self.honey_id}_gacha_icon", - } - - -class _MaterialAssets(_AssetsService): - @cached_property - def game_name(self) -> str: - return str(self.id) - - @cached_property - def game_name_map(self) -> dict[str, str]: - return {"icon": f"UI_ItemIcon_{self.game_name}"} - - @cached_property - def honey_name_map(self) -> dict[str, str]: - return {"icon": self.honey_id} - - def __call__(self, target: StrOrInt) -> Self: - temp = target - result = _MaterialAssets(self.client) - if isinstance(target, str): - if target.isnumeric(): - target = int(target) - else: - target = {v["name"]: int(k) for k, v in MATERIAL_DATA.items()}.get(target) - if isinstance(target, str) or target is None: - raise AssetsCouldNotFound("找不到对应的素材", temp) - result.id = target - return result - - async def _get_from_ambr(self, item: str) -> AsyncIterator[str | None]: - if item == "icon": - yield str(AMBR_HOST.join(f"assets/UI/{self.game_name_map.get(item)}.png")) - - async def _get_from_honey(self, item: str) -> AsyncIterator[str | None]: - yield HONEY_HOST.join(f"/img/{self.honey_name_map.get(item)}.png") - yield HONEY_HOST.join(f"/img/{self.honey_name_map.get(item)}.webp") - - -class _ArtifactAssets(_AssetsService): - flower: ICON_TYPE - """生之花""" - - plume: ICON_TYPE - """死之羽""" - - sands: ICON_TYPE - """时之沙""" - - goblet: ICON_TYPE - """空之杯""" - - circlet: ICON_TYPE - """理之冠""" - - @cached_property - def honey_id(self) -> str: - return HONEY_DATA["artifact"][str(self.id)][0] - - @cached_property - def game_name(self) -> str: - return f"UI_RelicIcon_{self.id}" - - async def _get_from_enka(self, item: str) -> AsyncIterator[str | None]: - if item in self.game_name_map: - yield str(ENKA_HOST.join(f"ui/{self.game_name_map.get(item)}.png")) - - async def _get_from_ambr(self, item: str) -> AsyncIterator[str | None]: - if item in self.game_name_map: - yield str(AMBR_HOST.join(f"assets/UI/reliquary/{self.game_name_map[item]}.png")) - - @cached_property - def game_name_map(self) -> dict[str, str]: - return { - "icon": f"UI_RelicIcon_{self.id}_4", - "flower": f"UI_RelicIcon_{self.id}_4", - "plume": f"UI_RelicIcon_{self.id}_2", - "sands": f"UI_RelicIcon_{self.id}_5", - "goblet": f"UI_RelicIcon_{self.id}_1", - "circlet": f"UI_RelicIcon_{self.id}_3", - } - - @cached_property - def honey_name_map(self) -> dict[str, str]: - first_id = int(re.findall(r"\d+", HONEY_DATA["artifact"][str(self.id)][-1])[0]) - return { - "icon": f"i_n{first_id + 30}", - "flower": f"i_n{first_id + 30}", - "plume": f"i_n{first_id + 10}", - "sands": f"i_n{first_id + 40}", - "goblet": f"i_n{first_id}", - "circlet": f"i_n{first_id + 20}", - } - - -class _NamecardAssets(_AssetsService): - enka: EnkaCharacterAsset | None - - navbar: ICON_TYPE - """好友名片背景""" - - profile: ICON_TYPE - """个人资料名片背景""" - - NAME_CARD_DEFAULT: int = 210189 - """默认名片 ID""" - - @cached_property - def honey_id(self) -> str: - return HONEY_DATA["namecard"][str(self.id)][0] - - @cached_property - def game_name(self) -> str: - return NAMECARD_DATA[str(self.id)]["icon"] - - @lru_cache - def _get_id_from_avatar_id(self, avatar_id: Union[int, str]) -> int: - avatar_icon_name = AVATAR_DATA[str(avatar_id)]["icon"].split("_")[-1] - fallback = None - for namecard_id, namecard_data in NAMECARD_DATA.items(): - if namecard_data["icon"].split("_")[-1] == avatar_icon_name: - return int(namecard_id) - if avatar_icon_name in namecard_data["icon"].split("_")[-1]: - fallback = int(namecard_id) - if fallback: - return fallback - raise ValueError(avatar_id) - - def __call__(self, target: int) -> "_NamecardAssets": - if target == 0: - target = self.NAME_CARD_DEFAULT - result = _NamecardAssets(self.client) - target = int(target) if not isinstance(target, int) else target - if target > 10000000: - target = self._get_id_from_avatar_id(target) - result.id = target - result.enka = DEFAULT_EnkaAssets.namecards(target) - return result - - async def _get_from_ambr(self, item: str) -> AsyncIterator[str | None]: - if item == "profile": - yield AMBR_HOST.join(f"assets/UI/namecard/{self.game_name_map[item]}.png.png") - - async def _get_from_enka(self, item: str) -> AsyncIterator[str | None]: - if (url := getattr(self.enka, {"profile": "banner"}.get(item, item), None)) is not None: - yield url.url - - @cached_property - def game_name_map(self) -> dict[str, str]: - return { - "icon": self.game_name, - "navbar": NAMECARD_DATA[str(self.id)]["navbar"], - "profile": NAMECARD_DATA[str(self.id)]["profile"], - } - - @cached_property - def honey_name_map(self) -> dict[str, str]: - return { - "icon": self.honey_id, - "navbar": f"{self.honey_id}_back", - "profile": f"{self.honey_id}_profile", - } - - -class AssetsService(BaseService.Dependence): - """asset服务 - - 用于储存和管理 asset : - 当对应的 asset (如某角色图标)不存在时,该服务会先查找本地。 - 若本地不存在,则从网络上下载;若存在,则返回其路径 - """ - - avatar: _AvatarAssets - """角色""" - - weapon: _WeaponAssets - """武器""" - - material: _MaterialAssets - """素材""" - - artifact: _ArtifactAssets - """圣遗物""" - - namecard: _NamecardAssets - """名片""" - - def __init__(self): - for attr, assets_type_name in filter( - lambda x: (not x[0].startswith("_")) and x[1].endswith("Assets"), self.__annotations__.items() - ): - setattr(self, attr, globals()[assets_type_name]()) - - async def initialize(self) -> None: # pylint: disable=R0201 - """启动 AssetsService 服务,刷新元数据""" - logger.info("正在刷新元数据") - # todo 这3个任务同时异步下载 - await update_metadata_from_github(False) - await update_metadata_from_ambr(False) - await update_honey_metadata(False) - logger.info("刷新元数据成功") - - -AssetsServiceType = TypeVar("AssetsServiceType", bound=_AssetsService) diff --git a/core/dependence/assets.pyi b/core/dependence/assets.pyi deleted file mode 100644 index dc1a470..0000000 --- a/core/dependence/assets.pyi +++ /dev/null @@ -1,175 +0,0 @@ -from __future__ import annotations - -from abc import ABC, abstractmethod -from functools import partial -from pathlib import Path -from typing import Awaitable, Callable, ClassVar, TypeVar - -from enkanetwork import Assets as EnkaAssets -from enkanetwork.model.assets import CharacterAsset as EnkaCharacterAsset -from httpx import AsyncClient -from typing_extensions import Self - -from core.base_service import BaseService -from utils.typedefs import StrOrInt - -__all__ = ("AssetsServiceType", "AssetsService", "AssetsServiceError", "AssetsCouldNotFound", "DEFAULT_EnkaAssets") - -ICON_TYPE = Callable[[bool], Awaitable[Path | None]] | Callable[..., Awaitable[Path | None]] -DEFAULT_EnkaAssets: EnkaAssets -_GET_TYPE = partial | list[str] | int | str | ICON_TYPE | Path | AsyncClient | None | Self | dict[str, str] - -class AssetsServiceError(Exception): ... - -class AssetsCouldNotFound(AssetsServiceError): - message: str - target: str - def __init__(self, message: str, target: str): ... - -class _AssetsService(ABC): - icon_types: ClassVar[list[str]] - id: int - type: str - - icon: ICON_TYPE - """图标""" - - @abstractmethod - @property - def game_name(self) -> str: - """游戏数据中的名称""" - - @property - def honey_id(self) -> str: - """当前资源在 Honey Impact 所对应的 ID""" - - @property - def path(self) -> Path: - """当前资源的文件夹""" - - @property - def client(self) -> AsyncClient: - """当前的 http client""" - - def __init__(self, client: AsyncClient | None = None) -> None: ... - def __call__(self, target: int) -> Self: - """用于生成与 target 对应的 assets""" - - def __getattr__(self, item: str) -> _GET_TYPE: - """魔法""" - - async def get_link(self, item: str) -> str | None: - """获取相应图标链接""" - - @abstractmethod - @property - def game_name_map(self) -> dict[str, str]: - """游戏中的图标名""" - - @abstractmethod - @property - def honey_name_map(self) -> dict[str, str]: - """来自honey的图标名""" - -class _AvatarAssets(_AssetsService): - enka: EnkaCharacterAsset | None - - side: ICON_TYPE - """侧视图图标""" - - card: ICON_TYPE - """卡片图标""" - - gacha: ICON_TYPE - """抽卡立绘""" - - gacha_card: ICON_TYPE - """抽卡卡片""" - - @property - def honey_name_map(self) -> dict[str, str]: ... - @property - def game_name_map(self) -> dict[str, str]: ... - @property - def enka(self) -> EnkaCharacterAsset | None: ... - def __init__(self, client: AsyncClient | None = None, enka: EnkaAssets | None = None) -> None: ... - def __call__(self, target: StrOrInt) -> Self: ... - def __getitem__(self, item: str) -> _GET_TYPE | EnkaCharacterAsset: ... - def game_name(self) -> str: ... - -class _WeaponAssets(_AssetsService): - awaken: ICON_TYPE - """突破后图标""" - - gacha: ICON_TYPE - """抽卡立绘""" - - @property - def honey_name_map(self) -> dict[str, str]: ... - @property - def game_name_map(self) -> dict[str, str]: ... - def __call__(self, target: StrOrInt) -> Self: ... - def game_name(self) -> str: ... - -class _MaterialAssets(_AssetsService): - @property - def honey_name_map(self) -> dict[str, str]: ... - @property - def game_name_map(self) -> dict[str, str]: ... - def __call__(self, target: StrOrInt) -> Self: ... - def game_name(self) -> str: ... - -class _ArtifactAssets(_AssetsService): - flower: ICON_TYPE - """生之花""" - - plume: ICON_TYPE - """死之羽""" - - sands: ICON_TYPE - """时之沙""" - - goblet: ICON_TYPE - """空之杯""" - - circlet: ICON_TYPE - """理之冠""" - - @property - def honey_name_map(self) -> dict[str, str]: ... - @property - def game_name_map(self) -> dict[str, str]: ... - def game_name(self) -> str: ... - -class _NamecardAssets(_AssetsService): - enka: EnkaCharacterAsset | None - - navbar: ICON_TYPE - """好友名片背景""" - - profile: ICON_TYPE - """个人资料名片背景""" - - @property - def honey_name_map(self) -> dict[str, str]: ... - @property - def game_name_map(self) -> dict[str, str]: ... - def game_name(self) -> str: ... - -class AssetsService(BaseService.Dependence): - avatar: _AvatarAssets - """角色""" - - weapon: _WeaponAssets - """武器""" - - material: _MaterialAssets - """素材""" - - artifact: _ArtifactAssets - """圣遗物""" - - namecard: _NamecardAssets - """名片""" - -AssetsServiceType = TypeVar("AssetsServiceType", bound=_AssetsService) diff --git a/core/services/game/__init__.py b/core/services/game/__init__.py deleted file mode 100644 index 78e0e2f..0000000 --- a/core/services/game/__init__.py +++ /dev/null @@ -1 +0,0 @@ -"""GameService""" diff --git a/core/services/game/cache.py b/core/services/game/cache.py deleted file mode 100644 index 48531ca..0000000 --- a/core/services/game/cache.py +++ /dev/null @@ -1,29 +0,0 @@ -from typing import List - -from core.base_service import BaseService -from core.dependence.redisdb import RedisDB - -__all__ = ["GameCache", "GameCacheForStrategy"] - - -class GameCache: - qname: str - - def __init__(self, redis: RedisDB, ttl: int = 3600): - self.client = redis.client - self.ttl = ttl - - async def get_url_list(self, character_name: str): - qname = f"{self.qname}:{character_name}" - return [str(str_data, encoding="utf-8") for str_data in await self.client.lrange(qname, 0, -1)][::-1] - - async def set_url_list(self, character_name: str, str_list: List[str]): - qname = f"{self.qname}:{character_name}" - await self.client.ltrim(qname, 1, 0) - await self.client.lpush(qname, *str_list) - await self.client.expire(qname, self.ttl) - return await self.client.llen(qname) - - -class GameCacheForStrategy(BaseService.Component, GameCache): - qname = "game:strategy" diff --git a/core/services/game/services.py b/core/services/game/services.py deleted file mode 100644 index e411525..0000000 --- a/core/services/game/services.py +++ /dev/null @@ -1,52 +0,0 @@ -from typing import List, Optional - -from core.base_service import BaseService -from core.services.game.cache import GameCacheForStrategy -from modules.apihelper.client.components.hyperion import Hyperion - -__all__ = "GameStrategyService" - - -class GameStrategyService(BaseService): - def __init__(self, cache: GameCacheForStrategy, collections: Optional[List[int]] = None): - self._cache = cache - self._hyperion = Hyperion() - if collections is None: - self._collections = [2319292, 2319293, 2319294, 2319295, 2319296, 2319298, 2319299] - else: - self._collections = collections - self._special_posts = {"达达利亚": "21272578"} - - async def _get_strategy_from_hyperion(self, collection_id: int, character_name: str) -> int: - if character_name in self._special_posts: - return self._special_posts[character_name] - post_id: int = -1 - post_full_in_collection = await self._hyperion.get_post_full_in_collection(collection_id) - for post_data in post_full_in_collection["posts"]: - title = post_data["post"]["subject"] - topics = post_data["topics"] - for topic in topics: - if character_name == topic["name"]: - post_id = int(post_data["post"]["post_id"]) - break - if post_id == -1 and title and character_name in title: - post_id = int(post_data["post"]["post_id"]) - if post_id != -1: - break - return post_id - - async def get_strategy(self, character_name: str) -> str: - cache = await self._cache.get_url_list(character_name) - if len(cache) >= 1: - return cache[0] - - for collection_id in self._collections: - post_id = await self._get_strategy_from_hyperion(collection_id, character_name) - if post_id != -1: - break - else: - return "" - - artwork_info = await self._hyperion.get_post_info(2, post_id) - await self._cache.set_url_list(character_name, artwork_info.image_urls) - return artwork_info.image_urls[0] diff --git a/core/services/players/services.py b/core/services/players/services.py index f44ca0a..b52a56b 100644 --- a/core/services/players/services.py +++ b/core/services/players/services.py @@ -1,23 +1,11 @@ from datetime import datetime, timedelta from typing import Optional -from enkanetwork import ( - VaildateUIDError, - HTTPException, - EnkaPlayerNotFound, - PlayerInfo as EnkaPlayerInfo, - TimedOut, - EnkaServerMaintanance, -) - from core.base_service import BaseService -from core.config import config from core.dependence.redisdb import RedisDB from core.services.players.models import PlayersDataBase as Player, PlayerInfoSQLModel, PlayerInfo from core.services.players.repositories import PlayerInfoRepository from gram_core.services.players.services import PlayersService -from utils.enkanetwork import RedisCache, EnkaNetworkAPI -from utils.log import logger __all__ = ("PlayersService", "PlayerInfoService") @@ -26,8 +14,6 @@ class PlayerInfoService(BaseService): def __init__(self, redis: RedisDB, players_info_repository: PlayerInfoRepository): self.cache = redis.client self._players_info_repository = players_info_repository - self.enka_client = EnkaNetworkAPI(lang="chs", user_agent=config.enka_network_api_agent) - self.enka_client.set_cache(RedisCache(redis.client, key="players_info:enka_network", ex=60)) self.qname = "players_info" async def get_form_cache(self, player: Player): @@ -42,22 +28,7 @@ class PlayerInfoService(BaseService): qname = f"{self.qname}:{player.user_id}:{player.player_id}" await self.cache.set(qname, player.json(), ex=60) - async def get_player_info_from_enka(self, player_id: int) -> Optional[EnkaPlayerInfo]: - try: - response = await self.enka_client.fetch_user(player_id, info=True) - return response.player - except VaildateUIDError: - logger.warning("Enka.Network 请求失败 UID 不正确") - except EnkaPlayerNotFound: - logger.warning("Enka.Network 请求失败 玩家不存在") - except EnkaServerMaintanance: - logger.warning("Enka.Network 正在进行服务器维护,请耐心等待5至8小时或者1天。") - except TimedOut: - logger.warning("Enka.Network 请求超时") - except HTTPException as exc: - logger.warning("Enka.Network 请求失败: %s", str(exc)) - except Exception as exc: - logger.error("Enka.Network 请求失败: %s", exc_info=exc) + async def get_player_info_from_enka(self, player_id: int) -> None: return None async def get(self, player: Player) -> Optional[PlayerInfo]: diff --git a/core/services/quiz/__init__.py b/core/services/quiz/__init__.py deleted file mode 100644 index eff5d65..0000000 --- a/core/services/quiz/__init__.py +++ /dev/null @@ -1 +0,0 @@ -"""QuizService""" diff --git a/core/services/quiz/cache.py b/core/services/quiz/cache.py deleted file mode 100644 index 22830dc..0000000 --- a/core/services/quiz/cache.py +++ /dev/null @@ -1,69 +0,0 @@ -from typing import List - -from core.base_service import BaseService -from core.dependence.redisdb import RedisDB -from core.services.quiz.models import Answer, Question - -__all__ = ("QuizCache",) - - -class QuizCache(BaseService.Component): - def __init__(self, redis: RedisDB): - self.client = redis.client - self.question_qname = "quiz:question" - self.answer_qname = "quiz:answer" - - async def get_all_question(self) -> List[Question]: - temp_list = [] - qname = self.question_qname + "id_list" - data_list = [self.question_qname + f":{question_id}" for question_id in await self.client.lrange(qname, 0, -1)] - data = await self.client.mget(data_list) - for i in data: - temp_list.append(Question.parse_raw(i)) - return temp_list - - async def get_all_question_id_list(self) -> List[str]: - qname = self.question_qname + ":id_list" - return await self.client.lrange(qname, 0, -1) - - async def get_one_question(self, question_id: int) -> Question: - qname = f"{self.question_qname}:{question_id}" - data = await self.client.get(qname) - json_data = str(data, encoding="utf-8") - return Question.parse_raw(json_data) - - async def get_one_answer(self, answer_id: int) -> Answer: - qname = f"{self.answer_qname}:{answer_id}" - data = await self.client.get(qname) - json_data = str(data, encoding="utf-8") - return Answer.parse_raw(json_data) - - async def add_question(self, question_list: List[Question] = None) -> int: - if not question_list: - return 0 - for question in question_list: - await self.client.set(f"{self.question_qname}:{question.question_id}", question.json()) - question_id_list = [question.question_id for question in question_list] - await self.client.lpush(f"{self.question_qname}:id_list", *question_id_list) - return await self.client.llen(f"{self.question_qname}:id_list") - - async def del_all_question(self): - keys = await self.client.keys(f"{self.question_qname}*") - if keys is not None: - for key in keys: - await self.client.delete(key) - - async def del_all_answer(self): - keys = await self.client.keys(f"{self.answer_qname}*") - if keys is not None: - for key in keys: - await self.client.delete(key) - - async def add_answer(self, answer_list: List[Answer] = None) -> int: - if not answer_list: - return 0 - for answer in answer_list: - await self.client.set(f"{self.answer_qname}:{answer.answer_id}", answer.json()) - answer_id_list = [answer.answer_id for answer in answer_list] - await self.client.lpush(f"{self.answer_qname}:id_list", *answer_id_list) - return await self.client.llen(f"{self.answer_qname}:id_list") diff --git a/core/services/quiz/models.py b/core/services/quiz/models.py deleted file mode 100644 index 4689495..0000000 --- a/core/services/quiz/models.py +++ /dev/null @@ -1,53 +0,0 @@ -from typing import List, Optional - -from pydantic import BaseModel -from sqlmodel import Column, Field, ForeignKey, Integer, SQLModel - -__all__ = ("Answer", "AnswerDB", "Question", "QuestionDB") - - -class AnswerDB(SQLModel, table=True): - __tablename__ = "answer" - __table_args__ = dict(mysql_charset="utf8mb4", mysql_collate="utf8mb4_general_ci") - - id: Optional[int] = Field(default=None, sa_column=Column(Integer, primary_key=True, autoincrement=True)) - question_id: Optional[int] = Field( - sa_column=Column(Integer, ForeignKey("question.id", ondelete="RESTRICT", onupdate="RESTRICT")) - ) - is_correct: Optional[bool] = Field() - text: Optional[str] = Field() - - -class QuestionDB(SQLModel, table=True): - __tablename__ = "question" - __table_args__ = dict(mysql_charset="utf8mb4", mysql_collate="utf8mb4_general_ci") - - id: Optional[int] = Field(default=None, sa_column=Column(Integer, primary_key=True, autoincrement=True)) - text: Optional[str] = Field() - - -class Answer(BaseModel): - answer_id: int = 0 - question_id: int = 0 - is_correct: bool = True - text: str = "" - - def to_database_data(self) -> AnswerDB: - return AnswerDB(id=self.answer_id, question_id=self.question_id, text=self.text, is_correct=self.is_correct) - - @classmethod - def de_database_data(cls, data: AnswerDB) -> Optional["Answer"]: - return cls(answer_id=data.id, question_id=data.question_id, text=data.text, is_correct=data.is_correct) - - -class Question(BaseModel): - question_id: int = 0 - text: str = "" - answers: List[Answer] = [] - - def to_database_data(self) -> QuestionDB: - return QuestionDB(text=self.text, id=self.question_id) - - @classmethod - def de_database_data(cls, data: QuestionDB) -> Optional["Question"]: - return cls(question_id=data.id, text=data.text) diff --git a/core/services/quiz/repositories.py b/core/services/quiz/repositories.py deleted file mode 100644 index a8a1fa9..0000000 --- a/core/services/quiz/repositories.py +++ /dev/null @@ -1,57 +0,0 @@ -from typing import List - -from sqlmodel import select -from sqlmodel.ext.asyncio.session import AsyncSession - -from core.base_service import BaseService -from core.dependence.database import Database -from core.services.quiz.models import AnswerDB, QuestionDB - -__all__ = ("QuizRepository",) - - -class QuizRepository(BaseService.Component): - def __init__(self, database: Database): - self.engine = database.engine - - async def get_question_list(self) -> List[QuestionDB]: - async with AsyncSession(self.engine) as session: - query = select(QuestionDB) - results = await session.exec(query) - return results.all() - - async def get_answers_from_question_id(self, question_id: int) -> List[AnswerDB]: - async with AsyncSession(self.engine) as session: - query = select(AnswerDB).where(AnswerDB.question_id == question_id) - results = await session.exec(query) - return results.all() - - async def add_question(self, question: QuestionDB): - async with AsyncSession(self.engine) as session: - session.add(question) - await session.commit() - - async def get_question_by_text(self, text: str) -> QuestionDB: - async with AsyncSession(self.engine) as session: - query = select(QuestionDB).where(QuestionDB.text == text) - results = await session.exec(query) - return results.first() - - async def add_answer(self, answer: AnswerDB): - async with AsyncSession(self.engine) as session: - session.add(answer) - await session.commit() - - async def delete_question_by_id(self, question_id: int): - async with AsyncSession(self.engine) as session: - statement = select(QuestionDB).where(QuestionDB.id == question_id) - results = await session.exec(statement) - question = results.one() - await session.delete(question) - - async def delete_answer_by_id(self, answer_id: int): - async with AsyncSession(self.engine) as session: - statement = select(AnswerDB).where(AnswerDB.id == answer_id) - results = await session.exec(statement) - answer = results.one() - await session.delete(answer) diff --git a/core/services/quiz/services.py b/core/services/quiz/services.py deleted file mode 100644 index d3e658f..0000000 --- a/core/services/quiz/services.py +++ /dev/null @@ -1,64 +0,0 @@ -import asyncio -from typing import List - -from core.base_service import BaseService -from core.services.quiz.cache import QuizCache -from core.services.quiz.models import Answer, Question -from core.services.quiz.repositories import QuizRepository - -__all__ = ("QuizService",) - - -class QuizService(BaseService): - def __init__(self, repository: QuizRepository, cache: QuizCache): - self._repository = repository - self._cache = cache - self.lock = asyncio.Lock() - - async def get_quiz_from_database(self) -> List[Question]: - """从数据库获取问题列表 - :return: Question List - """ - temp: list = [] - question_list = await self._repository.get_question_list() - for question in question_list: - question_id = question.id - answers = await self._repository.get_answers_from_question_id(question_id) - data = Question.de_database_data(question) - data.answers = [Answer.de_database_data(a) for a in answers] - temp.append(data) - return temp - - async def save_quiz(self, data: Question): - await self._repository.get_question_by_text(data.text) - for answers in data.answers: - await self._repository.add_answer(answers.to_database_data()) - - async def refresh_quiz(self) -> int: - """从数据库刷新问题到Redis缓存 线程安全 - :return: 已经缓存问题的数量 - """ - # 只允许一个线程访问该区域 让数据被安全有效的访问 - async with self.lock: - question_list = await self.get_quiz_from_database() - await self._cache.del_all_question() - question_count = await self._cache.add_question(question_list) - await self._cache.del_all_answer() - for question in question_list: - await self._cache.add_answer(question.answers) - return question_count - - async def get_question_id_list(self) -> List[int]: - return [int(question_id) for question_id in await self._cache.get_all_question_id_list()] - - async def get_answer(self, answer_id: int) -> Answer: - return await self._cache.get_one_answer(answer_id) - - async def get_question(self, question_id: int) -> Question: - return await self._cache.get_one_question(question_id) - - async def delete_question_by_id(self, question_id: int): - return await self._repository.delete_question_by_id(question_id) - - async def delete_answer_by_id(self, answer_id: int): - return await self._repository.delete_answer_by_id(answer_id) diff --git a/core/services/search/models.py b/core/services/search/models.py index 03e875e..c89eca9 100644 --- a/core/services/search/models.py +++ b/core/services/search/models.py @@ -20,6 +20,7 @@ class BaseEntry(BaseModel): parse_mode: Optional[str] = None photo_url: Optional[str] = None photo_file_id: Optional[str] = None + document_file_id: Optional[str] = None @abstractmethod def compare_to_query(self, search_query: str) -> float: diff --git a/core/services/wiki/__init__.py b/core/services/wiki/__init__.py deleted file mode 100644 index 042a3d3..0000000 --- a/core/services/wiki/__init__.py +++ /dev/null @@ -1 +0,0 @@ -"""WikiService""" diff --git a/core/services/wiki/cache.py b/core/services/wiki/cache.py deleted file mode 100644 index e6fb302..0000000 --- a/core/services/wiki/cache.py +++ /dev/null @@ -1,41 +0,0 @@ -from core.base_service import BaseService -from core.dependence.redisdb import RedisDB -from modules.wiki.base import Model - -try: - import ujson as jsonlib -except ImportError: - import json as jsonlib - - -__all__ = ["WikiCache"] - - -class WikiCache(BaseService.Component): - def __init__(self, redis: RedisDB): - self.client = redis.client - self.qname = "wiki" - - async def set(self, key: str, value): - qname = f"{self.qname}:{key}" - if isinstance(value, Model): - value = value.json() - elif isinstance(value, (dict, list)): - value = jsonlib.dumps(value) - await self.client.set(qname, value) - - async def delete(self, key: str): - qname = f"{self.qname}:{key}" - await self.client.delete(qname) - - async def get(self, key: str) -> dict: - qname = f"{self.qname}:{key}" - # noinspection PyBroadException - try: - result = jsonlib.loads(await self.client.get(qname)) - except Exception: # pylint: disable=W0703 - result = [] - if isinstance(result, list) and len(result) > 0: - for num, item in enumerate(result): - result[num] = jsonlib.loads(item) - return result diff --git a/core/services/wiki/services.py b/core/services/wiki/services.py deleted file mode 100644 index 151c773..0000000 --- a/core/services/wiki/services.py +++ /dev/null @@ -1,103 +0,0 @@ -from typing import List, Optional - -from core.base_service import BaseService -from core.services.wiki.cache import WikiCache -from modules.wiki.character import Character -from modules.wiki.weapon import Weapon -from utils.log import logger - -__all__ = ["WikiService"] - - -class WikiService(BaseService): - def __init__(self, cache: WikiCache): - self._cache = cache - """Redis 在这里的作用是作为持久化""" - self._character_list = [] - self._character_name_list = [] - self._weapon_name_list = [] - self._weapon_list = [] - self.first_run = True - - async def refresh_weapon(self): - weapon_name_list = await Weapon.get_name_list() - logger.info("一共找到 %s 把武器信息", len(weapon_name_list)) - - weapon_list = [] - num = 0 - async for weapon in Weapon.full_data_generator(): - weapon_list.append(weapon) - num += 1 - if num % 10 == 0: - logger.info("现在已经获取到 %s 把武器信息", num) - - logger.info("写入武器信息到Redis") - self._weapon_list = weapon_list - await self._cache.delete("weapon") - await self._cache.set("weapon", [i.json() for i in weapon_list]) - - async def refresh_characters(self): - character_name_list = await Character.get_name_list() - logger.info("一共找到 %s 个角色信息", len(character_name_list)) - - character_list = [] - num = 0 - async for character in Character.full_data_generator(): - character_list.append(character) - num += 1 - if num % 10 == 0: - logger.info("现在已经获取到 %s 个角色信息", num) - - logger.info("写入角色信息到Redis") - self._character_list = character_list - await self._cache.delete("characters") - await self._cache.set("characters", [i.json() for i in character_list]) - - async def refresh_wiki(self): - """ - 用于把Redis的缓存全部加载进Python - :return: - """ - logger.info("正在重新获取Wiki") - logger.info("正在重新获取武器信息") - await self.refresh_weapon() - logger.info("正在重新获取角色信息") - await self.refresh_characters() - logger.info("刷新成功") - - async def init(self): - """ - 用于把Redis的缓存全部加载进Python - :return: - """ - if self.first_run: - weapon_dict = await self._cache.get("weapon") - self._weapon_list = [Weapon.parse_obj(obj) for obj in weapon_dict] - self._weapon_name_list = [weapon.name for weapon in self._weapon_list] - characters_dict = await self._cache.get("characters") - self._character_list = [Character.parse_obj(obj) for obj in characters_dict] - self._character_name_list = [character.name for character in self._character_list] - - self.first_run = False - - async def get_weapons(self, name: str) -> Optional[Weapon]: - await self.init() - if len(self._weapon_list) == 0: - return None - return next((weapon for weapon in self._weapon_list if weapon.name == name), None) - - async def get_weapons_name_list(self) -> List[str]: - await self.init() - return self._weapon_name_list - - async def get_weapons_list(self) -> List[Weapon]: - await self.init() - return self._weapon_list - - async def get_characters_list(self) -> List[Character]: - await self.init() - return self._character_list - - async def get_characters_name_list(self) -> List[str]: - await self.init() - return self._character_name_list diff --git a/pdm.lock b/pdm.lock index 8b8e423..fea3e37 100644 --- a/pdm.lock +++ b/pdm.lock @@ -5,7 +5,7 @@ groups = ["default", "genshin-artifact", "pyro", "test"] strategy = ["cross_platform", "inherit_metadata"] lock_version = "4.4.2" -content_hash = "sha256:d7909b325935f473694ce0d17f58f2c7cb59d89b99bcfa6be284426ca92d6254" +content_hash = "sha256:a71862798602dbee31c53d2ad5d361d3fa0ebe0b060d0e81857c047ae3002384" [[package]] name = "aiocsv" @@ -200,7 +200,7 @@ files = [ [[package]] name = "alembic" -version = "1.13.1" +version = "1.13.2" requires_python = ">=3.8" summary = "A database migration tool for SQLAlchemy." groups = ["default"] @@ -212,8 +212,8 @@ dependencies = [ "typing-extensions>=4", ] files = [ - {file = "alembic-1.13.1-py3-none-any.whl", hash = "sha256:2edcc97bed0bd3272611ce3a98d98279e9c209e7186e43e75bbb1b2bdfdbcc43"}, - {file = "alembic-1.13.1.tar.gz", hash = "sha256:4932c8558bf68f2ee92b9bbcb8218671c627064d5b08939437af6d77dc05e595"}, + {file = "alembic-1.13.2-py3-none-any.whl", hash = "sha256:6b8733129a6224a9a711e17c99b08462dbf7cc9670ba8f2e2ae9af860ceb1953"}, + {file = "alembic-1.13.2.tar.gz", hash = "sha256:1ff0ae32975f4fd96028c39ed9bb3c867fe3af956bd7bb37343b54c9fe7445ef"}, ] [[package]] @@ -251,7 +251,7 @@ files = [ [[package]] name = "arko-wrapper" -version = "0.2.8" +version = "0.3.0" requires_python = ">=3.7" summary = "给你的Python迭代器加上魔法" groups = ["default"] @@ -259,8 +259,8 @@ dependencies = [ "typing-extensions", ] files = [ - {file = "arko-wrapper-0.2.8.tar.gz", hash = "sha256:85167bc6f1dd48e3415a23a7f2f193c1544a450fd6d219ce28043af796c9b4c3"}, - {file = "arko_wrapper-0.2.8-py3-none-any.whl", hash = "sha256:c56b8cdbbd273cc1b7737667374ee600766e9e7f9f9546871b20912024aa0fb2"}, + {file = "arko_wrapper-0.3.0-py3-none-any.whl", hash = "sha256:9230d479c5bbdb4b6add8d75def69a8aa5aad4e7057dc92aebe7d0146a4b95d7"}, + {file = "arko_wrapper-0.3.0.tar.gz", hash = "sha256:6e37ab1f2dbdd961f07313c3267c5864f5e71b39de730e384003aa2af1f68357"}, ] [[package]] @@ -441,13 +441,13 @@ files = [ [[package]] name = "certifi" -version = "2024.6.2" +version = "2024.7.4" requires_python = ">=3.6" summary = "Python package for providing Mozilla's CA Bundle." groups = ["default"] files = [ - {file = "certifi-2024.6.2-py3-none-any.whl", hash = "sha256:ddc6c8ce995e6987e7faf5e3f1b02b302836a0e5d98ece18392cb1a36c72ad56"}, - {file = "certifi-2024.6.2.tar.gz", hash = "sha256:3cd43f1c6fa7dedc5899d69d3ad0398fd018ad1a17fba83ddaf78aa46c747516"}, + {file = "certifi-2024.7.4-py3-none-any.whl", hash = "sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90"}, + {file = "certifi-2024.7.4.tar.gz", hash = "sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b"}, ] [[package]] @@ -716,7 +716,7 @@ files = [ [[package]] name = "fakeredis" -version = "2.23.2" +version = "2.23.3" requires_python = "<4.0,>=3.7" summary = "Python implementation of redis API, can be used for testing purposes." groups = ["default"] @@ -726,8 +726,8 @@ dependencies = [ "typing-extensions<5.0,>=4.7; python_version < \"3.11\"", ] files = [ - {file = "fakeredis-2.23.2-py3-none-any.whl", hash = "sha256:3721946b955930c065231befd24a9cdc68b339746e93848ef01a010d98e4eb4f"}, - {file = "fakeredis-2.23.2.tar.gz", hash = "sha256:d649c409abe46c63690b6c35d3c460e4ce64c69a52cea3f02daff2649378f878"}, + {file = "fakeredis-2.23.3-py3-none-any.whl", hash = "sha256:4779be828f4ebf53e1a286fd11e2ffe0f510d3e5507f143d644e67a07387d759"}, + {file = "fakeredis-2.23.3.tar.gz", hash = "sha256:0c67caa31530114f451f012eca920338c5eb83fa7f1f461dd41b8d2488a99cba"}, ] [[package]] @@ -865,17 +865,6 @@ files = [ {file = "frozenlist-1.4.1.tar.gz", hash = "sha256:c037a86e8513059a2613aaba4d817bb90b9d9b6b69aace3ce9c877e8c8ed402b"}, ] -[[package]] -name = "gcsim-pypi" -version = "2.23.0" -requires_python = "<4.0,>=3.6" -summary = "gcsim binary for pypi" -groups = ["default"] -files = [ - {file = "gcsim_pypi-2.23.0-py3-none-any.whl", hash = "sha256:260b0fab047adc4ac69fc3380284d6635ca390c4c9de07f1a69a477764a40e4d"}, - {file = "gcsim_pypi-2.23.0.tar.gz", hash = "sha256:cff31d76d06ee020254ecdb3990af63108f2498547b976337036372c3310d946"}, -] - [[package]] name = "gitdb" version = "4.0.11" @@ -1480,7 +1469,7 @@ files = [ [[package]] name = "openpyxl" -version = "3.1.4" +version = "3.1.5" requires_python = ">=3.8" summary = "A Python library to read/write Excel 2010 xlsx/xlsm files" groups = ["default"] @@ -1488,63 +1477,68 @@ dependencies = [ "et-xmlfile", ] files = [ - {file = "openpyxl-3.1.4-py2.py3-none-any.whl", hash = "sha256:ec17f6483f2b8f7c88c57e5e5d3b0de0e3fb9ac70edc084d28e864f5b33bbefd"}, - {file = "openpyxl-3.1.4.tar.gz", hash = "sha256:8d2c8adf5d20d6ce8f9bca381df86b534835e974ed0156dacefa76f68c1d69fb"}, + {file = "openpyxl-3.1.5-py2.py3-none-any.whl", hash = "sha256:5282c12b107bffeef825f4617dc029afaf41d0ea60823bbb665ef3079dc79de2"}, + {file = "openpyxl-3.1.5.tar.gz", hash = "sha256:cf0e3cf56142039133628b5acffe8ef0c12bc902d2aadd3e0fe5878dc08d1050"}, ] [[package]] name = "orjson" -version = "3.10.5" +version = "3.10.6" requires_python = ">=3.8" summary = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" groups = ["default"] files = [ - {file = "orjson-3.10.5-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:545d493c1f560d5ccfc134803ceb8955a14c3fcb47bbb4b2fee0232646d0b932"}, - {file = "orjson-3.10.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f4324929c2dd917598212bfd554757feca3e5e0fa60da08be11b4aa8b90013c1"}, - {file = "orjson-3.10.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8c13ca5e2ddded0ce6a927ea5a9f27cae77eee4c75547b4297252cb20c4d30e6"}, - {file = "orjson-3.10.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b6c8e30adfa52c025f042a87f450a6b9ea29649d828e0fec4858ed5e6caecf63"}, - {file = "orjson-3.10.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:338fd4f071b242f26e9ca802f443edc588fa4ab60bfa81f38beaedf42eda226c"}, - {file = "orjson-3.10.5-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:6970ed7a3126cfed873c5d21ece1cd5d6f83ca6c9afb71bbae21a0b034588d96"}, - {file = "orjson-3.10.5-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:235dadefb793ad12f7fa11e98a480db1f7c6469ff9e3da5e73c7809c700d746b"}, - {file = "orjson-3.10.5-cp310-none-win32.whl", hash = "sha256:be79e2393679eda6a590638abda16d167754393f5d0850dcbca2d0c3735cebe2"}, - {file = "orjson-3.10.5-cp310-none-win_amd64.whl", hash = "sha256:c4a65310ccb5c9910c47b078ba78e2787cb3878cdded1702ac3d0da71ddc5228"}, - {file = "orjson-3.10.5-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:cdf7365063e80899ae3a697def1277c17a7df7ccfc979990a403dfe77bb54d40"}, - {file = "orjson-3.10.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b68742c469745d0e6ca5724506858f75e2f1e5b59a4315861f9e2b1df77775a"}, - {file = "orjson-3.10.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7d10cc1b594951522e35a3463da19e899abe6ca95f3c84c69e9e901e0bd93d38"}, - {file = "orjson-3.10.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dcbe82b35d1ac43b0d84072408330fd3295c2896973112d495e7234f7e3da2e1"}, - {file = "orjson-3.10.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10c0eb7e0c75e1e486c7563fe231b40fdd658a035ae125c6ba651ca3b07936f5"}, - {file = "orjson-3.10.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:53ed1c879b10de56f35daf06dbc4a0d9a5db98f6ee853c2dbd3ee9d13e6f302f"}, - {file = "orjson-3.10.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:099e81a5975237fda3100f918839af95f42f981447ba8f47adb7b6a3cdb078fa"}, - {file = "orjson-3.10.5-cp311-none-win32.whl", hash = "sha256:1146bf85ea37ac421594107195db8bc77104f74bc83e8ee21a2e58596bfb2f04"}, - {file = "orjson-3.10.5-cp311-none-win_amd64.whl", hash = "sha256:36a10f43c5f3a55c2f680efe07aa93ef4a342d2960dd2b1b7ea2dd764fe4a37c"}, - {file = "orjson-3.10.5-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:68f85ecae7af14a585a563ac741b0547a3f291de81cd1e20903e79f25170458f"}, - {file = "orjson-3.10.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28afa96f496474ce60d3340fe8d9a263aa93ea01201cd2bad844c45cd21f5268"}, - {file = "orjson-3.10.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9cd684927af3e11b6e754df80b9ffafd9fb6adcaa9d3e8fdd5891be5a5cad51e"}, - {file = "orjson-3.10.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d21b9983da032505f7050795e98b5d9eee0df903258951566ecc358f6696969"}, - {file = "orjson-3.10.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ad1de7fef79736dde8c3554e75361ec351158a906d747bd901a52a5c9c8d24b"}, - {file = "orjson-3.10.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2d97531cdfe9bdd76d492e69800afd97e5930cb0da6a825646667b2c6c6c0211"}, - {file = "orjson-3.10.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d69858c32f09c3e1ce44b617b3ebba1aba030e777000ebdf72b0d8e365d0b2b3"}, - {file = "orjson-3.10.5-cp312-none-win32.whl", hash = "sha256:64c9cc089f127e5875901ac05e5c25aa13cfa5dbbbd9602bda51e5c611d6e3e2"}, - {file = "orjson-3.10.5-cp312-none-win_amd64.whl", hash = "sha256:b2efbd67feff8c1f7728937c0d7f6ca8c25ec81373dc8db4ef394c1d93d13dc5"}, - {file = "orjson-3.10.5-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:03b565c3b93f5d6e001db48b747d31ea3819b89abf041ee10ac6988886d18e01"}, - {file = "orjson-3.10.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:584c902ec19ab7928fd5add1783c909094cc53f31ac7acfada817b0847975f26"}, - {file = "orjson-3.10.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5a35455cc0b0b3a1eaf67224035f5388591ec72b9b6136d66b49a553ce9eb1e6"}, - {file = "orjson-3.10.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1670fe88b116c2745a3a30b0f099b699a02bb3482c2591514baf5433819e4f4d"}, - {file = "orjson-3.10.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:185c394ef45b18b9a7d8e8f333606e2e8194a50c6e3c664215aae8cf42c5385e"}, - {file = "orjson-3.10.5-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:ca0b3a94ac8d3886c9581b9f9de3ce858263865fdaa383fbc31c310b9eac07c9"}, - {file = "orjson-3.10.5-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:dfc91d4720d48e2a709e9c368d5125b4b5899dced34b5400c3837dadc7d6271b"}, - {file = "orjson-3.10.5-cp38-none-win32.whl", hash = "sha256:c05f16701ab2a4ca146d0bca950af254cb7c02f3c01fca8efbbad82d23b3d9d4"}, - {file = "orjson-3.10.5-cp38-none-win_amd64.whl", hash = "sha256:8a11d459338f96a9aa7f232ba95679fc0c7cedbd1b990d736467894210205c09"}, - {file = "orjson-3.10.5-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:85c89131d7b3218db1b24c4abecea92fd6c7f9fab87441cfc342d3acc725d807"}, - {file = "orjson-3.10.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb66215277a230c456f9038d5e2d84778141643207f85336ef8d2a9da26bd7ca"}, - {file = "orjson-3.10.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:51bbcdea96cdefa4a9b4461e690c75ad4e33796530d182bdd5c38980202c134a"}, - {file = "orjson-3.10.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbead71dbe65f959b7bd8cf91e0e11d5338033eba34c114f69078d59827ee139"}, - {file = "orjson-3.10.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5df58d206e78c40da118a8c14fc189207fffdcb1f21b3b4c9c0c18e839b5a214"}, - {file = "orjson-3.10.5-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:c4057c3b511bb8aef605616bd3f1f002a697c7e4da6adf095ca5b84c0fd43595"}, - {file = "orjson-3.10.5-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:b39e006b00c57125ab974362e740c14a0c6a66ff695bff44615dcf4a70ce2b86"}, - {file = "orjson-3.10.5-cp39-none-win32.whl", hash = "sha256:eded5138cc565a9d618e111c6d5c2547bbdd951114eb822f7f6309e04db0fb47"}, - {file = "orjson-3.10.5-cp39-none-win_amd64.whl", hash = "sha256:cc28e90a7cae7fcba2493953cff61da5a52950e78dc2dacfe931a317ee3d8de7"}, - {file = "orjson-3.10.5.tar.gz", hash = "sha256:7a5baef8a4284405d96c90c7c62b755e9ef1ada84c2406c24a9ebec86b89f46d"}, + {file = "orjson-3.10.6-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:fb0ee33124db6eaa517d00890fc1a55c3bfe1cf78ba4a8899d71a06f2d6ff5c7"}, + {file = "orjson-3.10.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c1c4b53b24a4c06547ce43e5fee6ec4e0d8fe2d597f4647fc033fd205707365"}, + {file = "orjson-3.10.6-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eadc8fd310edb4bdbd333374f2c8fec6794bbbae99b592f448d8214a5e4050c0"}, + {file = "orjson-3.10.6-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:61272a5aec2b2661f4fa2b37c907ce9701e821b2c1285d5c3ab0207ebd358d38"}, + {file = "orjson-3.10.6-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:57985ee7e91d6214c837936dc1608f40f330a6b88bb13f5a57ce5257807da143"}, + {file = "orjson-3.10.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:633a3b31d9d7c9f02d49c4ab4d0a86065c4a6f6adc297d63d272e043472acab5"}, + {file = "orjson-3.10.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:1c680b269d33ec444afe2bdc647c9eb73166fa47a16d9a75ee56a374f4a45f43"}, + {file = "orjson-3.10.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f759503a97a6ace19e55461395ab0d618b5a117e8d0fbb20e70cfd68a47327f2"}, + {file = "orjson-3.10.6-cp310-none-win32.whl", hash = "sha256:95a0cce17f969fb5391762e5719575217bd10ac5a189d1979442ee54456393f3"}, + {file = "orjson-3.10.6-cp310-none-win_amd64.whl", hash = "sha256:df25d9271270ba2133cc88ee83c318372bdc0f2cd6f32e7a450809a111efc45c"}, + {file = "orjson-3.10.6-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:b1ec490e10d2a77c345def52599311849fc063ae0e67cf4f84528073152bb2ba"}, + {file = "orjson-3.10.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55d43d3feb8f19d07e9f01e5b9be4f28801cf7c60d0fa0d279951b18fae1932b"}, + {file = "orjson-3.10.6-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ac3045267e98fe749408eee1593a142e02357c5c99be0802185ef2170086a863"}, + {file = "orjson-3.10.6-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c27bc6a28ae95923350ab382c57113abd38f3928af3c80be6f2ba7eb8d8db0b0"}, + {file = "orjson-3.10.6-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d27456491ca79532d11e507cadca37fb8c9324a3976294f68fb1eff2dc6ced5a"}, + {file = "orjson-3.10.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05ac3d3916023745aa3b3b388e91b9166be1ca02b7c7e41045da6d12985685f0"}, + {file = "orjson-3.10.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1335d4ef59ab85cab66fe73fd7a4e881c298ee7f63ede918b7faa1b27cbe5212"}, + {file = "orjson-3.10.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4bbc6d0af24c1575edc79994c20e1b29e6fb3c6a570371306db0993ecf144dc5"}, + {file = "orjson-3.10.6-cp311-none-win32.whl", hash = "sha256:450e39ab1f7694465060a0550b3f6d328d20297bf2e06aa947b97c21e5241fbd"}, + {file = "orjson-3.10.6-cp311-none-win_amd64.whl", hash = "sha256:227df19441372610b20e05bdb906e1742ec2ad7a66ac8350dcfd29a63014a83b"}, + {file = "orjson-3.10.6-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:ea2977b21f8d5d9b758bb3f344a75e55ca78e3ff85595d248eee813ae23ecdfb"}, + {file = "orjson-3.10.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b6f3d167d13a16ed263b52dbfedff52c962bfd3d270b46b7518365bcc2121eed"}, + {file = "orjson-3.10.6-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f710f346e4c44a4e8bdf23daa974faede58f83334289df80bc9cd12fe82573c7"}, + {file = "orjson-3.10.6-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7275664f84e027dcb1ad5200b8b18373e9c669b2a9ec33d410c40f5ccf4b257e"}, + {file = "orjson-3.10.6-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0943e4c701196b23c240b3d10ed8ecd674f03089198cf503105b474a4f77f21f"}, + {file = "orjson-3.10.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:446dee5a491b5bc7d8f825d80d9637e7af43f86a331207b9c9610e2f93fee22a"}, + {file = "orjson-3.10.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:64c81456d2a050d380786413786b057983892db105516639cb5d3ee3c7fd5148"}, + {file = "orjson-3.10.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:960db0e31c4e52fa0fc3ecbaea5b2d3b58f379e32a95ae6b0ebeaa25b93dfd34"}, + {file = "orjson-3.10.6-cp312-none-win32.whl", hash = "sha256:a6ea7afb5b30b2317e0bee03c8d34c8181bc5a36f2afd4d0952f378972c4efd5"}, + {file = "orjson-3.10.6-cp312-none-win_amd64.whl", hash = "sha256:874ce88264b7e655dde4aeaacdc8fd772a7962faadfb41abe63e2a4861abc3dc"}, + {file = "orjson-3.10.6-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:66680eae4c4e7fc193d91cfc1353ad6d01b4801ae9b5314f17e11ba55e934183"}, + {file = "orjson-3.10.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:caff75b425db5ef8e8f23af93c80f072f97b4fb3afd4af44482905c9f588da28"}, + {file = "orjson-3.10.6-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3722fddb821b6036fd2a3c814f6bd9b57a89dc6337b9924ecd614ebce3271394"}, + {file = "orjson-3.10.6-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c2c116072a8533f2fec435fde4d134610f806bdac20188c7bd2081f3e9e0133f"}, + {file = "orjson-3.10.6-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6eeb13218c8cf34c61912e9df2de2853f1d009de0e46ea09ccdf3d757896af0a"}, + {file = "orjson-3.10.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:965a916373382674e323c957d560b953d81d7a8603fbeee26f7b8248638bd48b"}, + {file = "orjson-3.10.6-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:03c95484d53ed8e479cade8628c9cea00fd9d67f5554764a1110e0d5aa2de96e"}, + {file = "orjson-3.10.6-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:e060748a04cccf1e0a6f2358dffea9c080b849a4a68c28b1b907f272b5127e9b"}, + {file = "orjson-3.10.6-cp38-none-win32.whl", hash = "sha256:738dbe3ef909c4b019d69afc19caf6b5ed0e2f1c786b5d6215fbb7539246e4c6"}, + {file = "orjson-3.10.6-cp38-none-win_amd64.whl", hash = "sha256:d40f839dddf6a7d77114fe6b8a70218556408c71d4d6e29413bb5f150a692ff7"}, + {file = "orjson-3.10.6-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:697a35a083c4f834807a6232b3e62c8b280f7a44ad0b759fd4dce748951e70db"}, + {file = "orjson-3.10.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fd502f96bf5ea9a61cbc0b2b5900d0dd68aa0da197179042bdd2be67e51a1e4b"}, + {file = "orjson-3.10.6-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f215789fb1667cdc874c1b8af6a84dc939fd802bf293a8334fce185c79cd359b"}, + {file = "orjson-3.10.6-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a2debd8ddce948a8c0938c8c93ade191d2f4ba4649a54302a7da905a81f00b56"}, + {file = "orjson-3.10.6-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5410111d7b6681d4b0d65e0f58a13be588d01b473822483f77f513c7f93bd3b2"}, + {file = "orjson-3.10.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb1f28a137337fdc18384079fa5726810681055b32b92253fa15ae5656e1dddb"}, + {file = "orjson-3.10.6-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:bf2fbbce5fe7cd1aa177ea3eab2b8e6a6bc6e8592e4279ed3db2d62e57c0e1b2"}, + {file = "orjson-3.10.6-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:79b9b9e33bd4c517445a62b90ca0cc279b0f1f3970655c3df9e608bc3f91741a"}, + {file = "orjson-3.10.6-cp39-none-win32.whl", hash = "sha256:30b0a09a2014e621b1adf66a4f705f0809358350a757508ee80209b2d8dae219"}, + {file = "orjson-3.10.6-cp39-none-win_amd64.whl", hash = "sha256:49e3bc615652617d463069f91b867a4458114c5b104e13b7ae6872e5f79d0844"}, + {file = "orjson-3.10.6.tar.gz", hash = "sha256:e54b63d0a7c6c54a5f5f726bc93a2078111ef060fec4ecbf34c5db800ca3b3a7"}, ] [[package]] @@ -1571,80 +1565,91 @@ files = [ [[package]] name = "pillow" -version = "10.3.0" +version = "10.4.0" requires_python = ">=3.8" summary = "Python Imaging Library (Fork)" groups = ["default"] files = [ - {file = "pillow-10.3.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:90b9e29824800e90c84e4022dd5cc16eb2d9605ee13f05d47641eb183cd73d45"}, - {file = "pillow-10.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a2c405445c79c3f5a124573a051062300936b0281fee57637e706453e452746c"}, - {file = "pillow-10.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78618cdbccaa74d3f88d0ad6cb8ac3007f1a6fa5c6f19af64b55ca170bfa1edf"}, - {file = "pillow-10.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:261ddb7ca91fcf71757979534fb4c128448b5b4c55cb6152d280312062f69599"}, - {file = "pillow-10.3.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:ce49c67f4ea0609933d01c0731b34b8695a7a748d6c8d186f95e7d085d2fe475"}, - {file = "pillow-10.3.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:b14f16f94cbc61215115b9b1236f9c18403c15dd3c52cf629072afa9d54c1cbf"}, - {file = "pillow-10.3.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d33891be6df59d93df4d846640f0e46f1a807339f09e79a8040bc887bdcd7ed3"}, - {file = "pillow-10.3.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b50811d664d392f02f7761621303eba9d1b056fb1868c8cdf4231279645c25f5"}, - {file = "pillow-10.3.0-cp310-cp310-win32.whl", hash = "sha256:ca2870d5d10d8726a27396d3ca4cf7976cec0f3cb706debe88e3a5bd4610f7d2"}, - {file = "pillow-10.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:f0d0591a0aeaefdaf9a5e545e7485f89910c977087e7de2b6c388aec32011e9f"}, - {file = "pillow-10.3.0-cp310-cp310-win_arm64.whl", hash = "sha256:ccce24b7ad89adb5a1e34a6ba96ac2530046763912806ad4c247356a8f33a67b"}, - {file = "pillow-10.3.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:5f77cf66e96ae734717d341c145c5949c63180842a545c47a0ce7ae52ca83795"}, - {file = "pillow-10.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e4b878386c4bf293578b48fc570b84ecfe477d3b77ba39a6e87150af77f40c57"}, - {file = "pillow-10.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fdcbb4068117dfd9ce0138d068ac512843c52295ed996ae6dd1faf537b6dbc27"}, - {file = "pillow-10.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9797a6c8fe16f25749b371c02e2ade0efb51155e767a971c61734b1bf6293994"}, - {file = "pillow-10.3.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:9e91179a242bbc99be65e139e30690e081fe6cb91a8e77faf4c409653de39451"}, - {file = "pillow-10.3.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:1b87bd9d81d179bd8ab871603bd80d8645729939f90b71e62914e816a76fc6bd"}, - {file = "pillow-10.3.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:81d09caa7b27ef4e61cb7d8fbf1714f5aec1c6b6c5270ee53504981e6e9121ad"}, - {file = "pillow-10.3.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:048ad577748b9fa4a99a0548c64f2cb8d672d5bf2e643a739ac8faff1164238c"}, - {file = "pillow-10.3.0-cp311-cp311-win32.whl", hash = "sha256:7161ec49ef0800947dc5570f86568a7bb36fa97dd09e9827dc02b718c5643f09"}, - {file = "pillow-10.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:8eb0908e954d093b02a543dc963984d6e99ad2b5e36503d8a0aaf040505f747d"}, - {file = "pillow-10.3.0-cp311-cp311-win_arm64.whl", hash = "sha256:4e6f7d1c414191c1199f8996d3f2282b9ebea0945693fb67392c75a3a320941f"}, - {file = "pillow-10.3.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:e46f38133e5a060d46bd630faa4d9fa0202377495df1f068a8299fd78c84de84"}, - {file = "pillow-10.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:50b8eae8f7334ec826d6eeffaeeb00e36b5e24aa0b9df322c247539714c6df19"}, - {file = "pillow-10.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d3bea1c75f8c53ee4d505c3e67d8c158ad4df0d83170605b50b64025917f338"}, - {file = "pillow-10.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19aeb96d43902f0a783946a0a87dbdad5c84c936025b8419da0a0cd7724356b1"}, - {file = "pillow-10.3.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:74d28c17412d9caa1066f7a31df8403ec23d5268ba46cd0ad2c50fb82ae40462"}, - {file = "pillow-10.3.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:ff61bfd9253c3915e6d41c651d5f962da23eda633cf02262990094a18a55371a"}, - {file = "pillow-10.3.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d886f5d353333b4771d21267c7ecc75b710f1a73d72d03ca06df49b09015a9ef"}, - {file = "pillow-10.3.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4b5ec25d8b17217d635f8935dbc1b9aa5907962fae29dff220f2659487891cd3"}, - {file = "pillow-10.3.0-cp312-cp312-win32.whl", hash = "sha256:51243f1ed5161b9945011a7360e997729776f6e5d7005ba0c6879267d4c5139d"}, - {file = "pillow-10.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:412444afb8c4c7a6cc11a47dade32982439925537e483be7c0ae0cf96c4f6a0b"}, - {file = "pillow-10.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:798232c92e7665fe82ac085f9d8e8ca98826f8e27859d9a96b41d519ecd2e49a"}, - {file = "pillow-10.3.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:4eaa22f0d22b1a7e93ff0a596d57fdede2e550aecffb5a1ef1106aaece48e96b"}, - {file = "pillow-10.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cd5e14fbf22a87321b24c88669aad3a51ec052eb145315b3da3b7e3cc105b9a2"}, - {file = "pillow-10.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1530e8f3a4b965eb6a7785cf17a426c779333eb62c9a7d1bbcf3ffd5bf77a4aa"}, - {file = "pillow-10.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d512aafa1d32efa014fa041d38868fda85028e3f930a96f85d49c7d8ddc0383"}, - {file = "pillow-10.3.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:339894035d0ede518b16073bdc2feef4c991ee991a29774b33e515f1d308e08d"}, - {file = "pillow-10.3.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:aa7e402ce11f0885305bfb6afb3434b3cd8f53b563ac065452d9d5654c7b86fd"}, - {file = "pillow-10.3.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0ea2a783a2bdf2a561808fe4a7a12e9aa3799b701ba305de596bc48b8bdfce9d"}, - {file = "pillow-10.3.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c78e1b00a87ce43bb37642c0812315b411e856a905d58d597750eb79802aaaa3"}, - {file = "pillow-10.3.0-cp38-cp38-win32.whl", hash = "sha256:72d622d262e463dfb7595202d229f5f3ab4b852289a1cd09650362db23b9eb0b"}, - {file = "pillow-10.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:2034f6759a722da3a3dbd91a81148cf884e91d1b747992ca288ab88c1de15999"}, - {file = "pillow-10.3.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:2ed854e716a89b1afcedea551cd85f2eb2a807613752ab997b9974aaa0d56936"}, - {file = "pillow-10.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:dc1a390a82755a8c26c9964d457d4c9cbec5405896cba94cf51f36ea0d855002"}, - {file = "pillow-10.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4203efca580f0dd6f882ca211f923168548f7ba334c189e9eab1178ab840bf60"}, - {file = "pillow-10.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3102045a10945173d38336f6e71a8dc71bcaeed55c3123ad4af82c52807b9375"}, - {file = "pillow-10.3.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:6fb1b30043271ec92dc65f6d9f0b7a830c210b8a96423074b15c7bc999975f57"}, - {file = "pillow-10.3.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:1dfc94946bc60ea375cc39cff0b8da6c7e5f8fcdc1d946beb8da5c216156ddd8"}, - {file = "pillow-10.3.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b09b86b27a064c9624d0a6c54da01c1beaf5b6cadfa609cf63789b1d08a797b9"}, - {file = "pillow-10.3.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d3b2348a78bc939b4fed6552abfd2e7988e0f81443ef3911a4b8498ca084f6eb"}, - {file = "pillow-10.3.0-cp39-cp39-win32.whl", hash = "sha256:45ebc7b45406febf07fef35d856f0293a92e7417ae7933207e90bf9090b70572"}, - {file = "pillow-10.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:0ba26351b137ca4e0db0342d5d00d2e355eb29372c05afd544ebf47c0956ffeb"}, - {file = "pillow-10.3.0-cp39-cp39-win_arm64.whl", hash = "sha256:50fd3f6b26e3441ae07b7c979309638b72abc1a25da31a81a7fbd9495713ef4f"}, - {file = "pillow-10.3.0-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:6b02471b72526ab8a18c39cb7967b72d194ec53c1fd0a70b050565a0f366d355"}, - {file = "pillow-10.3.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:8ab74c06ffdab957d7670c2a5a6e1a70181cd10b727cd788c4dd9005b6a8acd9"}, - {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:048eeade4c33fdf7e08da40ef402e748df113fd0b4584e32c4af74fe78baaeb2"}, - {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e2ec1e921fd07c7cda7962bad283acc2f2a9ccc1b971ee4b216b75fad6f0463"}, - {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:4c8e73e99da7db1b4cad7f8d682cf6abad7844da39834c288fbfa394a47bbced"}, - {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:16563993329b79513f59142a6b02055e10514c1a8e86dca8b48a893e33cf91e3"}, - {file = "pillow-10.3.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:dd78700f5788ae180b5ee8902c6aea5a5726bac7c364b202b4b3e3ba2d293170"}, - {file = "pillow-10.3.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:aff76a55a8aa8364d25400a210a65ff59d0168e0b4285ba6bf2bd83cf675ba32"}, - {file = "pillow-10.3.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:b7bc2176354defba3edc2b9a777744462da2f8e921fbaf61e52acb95bafa9828"}, - {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:793b4e24db2e8742ca6423d3fde8396db336698c55cd34b660663ee9e45ed37f"}, - {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d93480005693d247f8346bc8ee28c72a2191bdf1f6b5db469c096c0c867ac015"}, - {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c83341b89884e2b2e55886e8fbbf37c3fa5efd6c8907124aeb72f285ae5696e5"}, - {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:1a1d1915db1a4fdb2754b9de292642a39a7fb28f1736699527bb649484fb966a"}, - {file = "pillow-10.3.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a0eaa93d054751ee9964afa21c06247779b90440ca41d184aeb5d410f20ff591"}, - {file = "pillow-10.3.0.tar.gz", hash = "sha256:9d2455fbf44c914840c793e89aa82d0e1763a14253a000743719ae5946814b2d"}, + {file = "pillow-10.4.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:4d9667937cfa347525b319ae34375c37b9ee6b525440f3ef48542fcf66f2731e"}, + {file = "pillow-10.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:543f3dc61c18dafb755773efc89aae60d06b6596a63914107f75459cf984164d"}, + {file = "pillow-10.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7928ecbf1ece13956b95d9cbcfc77137652b02763ba384d9ab508099a2eca856"}, + {file = "pillow-10.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4d49b85c4348ea0b31ea63bc75a9f3857869174e2bf17e7aba02945cd218e6f"}, + {file = "pillow-10.4.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:6c762a5b0997f5659a5ef2266abc1d8851ad7749ad9a6a5506eb23d314e4f46b"}, + {file = "pillow-10.4.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:a985e028fc183bf12a77a8bbf36318db4238a3ded7fa9df1b9a133f1cb79f8fc"}, + {file = "pillow-10.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:812f7342b0eee081eaec84d91423d1b4650bb9828eb53d8511bcef8ce5aecf1e"}, + {file = "pillow-10.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ac1452d2fbe4978c2eec89fb5a23b8387aba707ac72810d9490118817d9c0b46"}, + {file = "pillow-10.4.0-cp310-cp310-win32.whl", hash = "sha256:bcd5e41a859bf2e84fdc42f4edb7d9aba0a13d29a2abadccafad99de3feff984"}, + {file = "pillow-10.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:ecd85a8d3e79cd7158dec1c9e5808e821feea088e2f69a974db5edf84dc53141"}, + {file = "pillow-10.4.0-cp310-cp310-win_arm64.whl", hash = "sha256:ff337c552345e95702c5fde3158acb0625111017d0e5f24bf3acdb9cc16b90d1"}, + {file = "pillow-10.4.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:0a9ec697746f268507404647e531e92889890a087e03681a3606d9b920fbee3c"}, + {file = "pillow-10.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dfe91cb65544a1321e631e696759491ae04a2ea11d36715eca01ce07284738be"}, + {file = "pillow-10.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5dc6761a6efc781e6a1544206f22c80c3af4c8cf461206d46a1e6006e4429ff3"}, + {file = "pillow-10.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e84b6cc6a4a3d76c153a6b19270b3526a5a8ed6b09501d3af891daa2a9de7d6"}, + {file = "pillow-10.4.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:bbc527b519bd3aa9d7f429d152fea69f9ad37c95f0b02aebddff592688998abe"}, + {file = "pillow-10.4.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:76a911dfe51a36041f2e756b00f96ed84677cdeb75d25c767f296c1c1eda1319"}, + {file = "pillow-10.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:59291fb29317122398786c2d44427bbd1a6d7ff54017075b22be9d21aa59bd8d"}, + {file = "pillow-10.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:416d3a5d0e8cfe4f27f574362435bc9bae57f679a7158e0096ad2beb427b8696"}, + {file = "pillow-10.4.0-cp311-cp311-win32.whl", hash = "sha256:7086cc1d5eebb91ad24ded9f58bec6c688e9f0ed7eb3dbbf1e4800280a896496"}, + {file = "pillow-10.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:cbed61494057c0f83b83eb3a310f0bf774b09513307c434d4366ed64f4128a91"}, + {file = "pillow-10.4.0-cp311-cp311-win_arm64.whl", hash = "sha256:f5f0c3e969c8f12dd2bb7e0b15d5c468b51e5017e01e2e867335c81903046a22"}, + {file = "pillow-10.4.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:673655af3eadf4df6b5457033f086e90299fdd7a47983a13827acf7459c15d94"}, + {file = "pillow-10.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:866b6942a92f56300012f5fbac71f2d610312ee65e22f1aa2609e491284e5597"}, + {file = "pillow-10.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29dbdc4207642ea6aad70fbde1a9338753d33fb23ed6956e706936706f52dd80"}, + {file = "pillow-10.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf2342ac639c4cf38799a44950bbc2dfcb685f052b9e262f446482afaf4bffca"}, + {file = "pillow-10.4.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:f5b92f4d70791b4a67157321c4e8225d60b119c5cc9aee8ecf153aace4aad4ef"}, + {file = "pillow-10.4.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:86dcb5a1eb778d8b25659d5e4341269e8590ad6b4e8b44d9f4b07f8d136c414a"}, + {file = "pillow-10.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:780c072c2e11c9b2c7ca37f9a2ee8ba66f44367ac3e5c7832afcfe5104fd6d1b"}, + {file = "pillow-10.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:37fb69d905be665f68f28a8bba3c6d3223c8efe1edf14cc4cfa06c241f8c81d9"}, + {file = "pillow-10.4.0-cp312-cp312-win32.whl", hash = "sha256:7dfecdbad5c301d7b5bde160150b4db4c659cee2b69589705b6f8a0c509d9f42"}, + {file = "pillow-10.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:1d846aea995ad352d4bdcc847535bd56e0fd88d36829d2c90be880ef1ee4668a"}, + {file = "pillow-10.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:e553cad5179a66ba15bb18b353a19020e73a7921296a7979c4a2b7f6a5cd57f9"}, + {file = "pillow-10.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8bc1a764ed8c957a2e9cacf97c8b2b053b70307cf2996aafd70e91a082e70df3"}, + {file = "pillow-10.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6209bb41dc692ddfee4942517c19ee81b86c864b626dbfca272ec0f7cff5d9fb"}, + {file = "pillow-10.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bee197b30783295d2eb680b311af15a20a8b24024a19c3a26431ff83eb8d1f70"}, + {file = "pillow-10.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ef61f5dd14c300786318482456481463b9d6b91ebe5ef12f405afbba77ed0be"}, + {file = "pillow-10.4.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:297e388da6e248c98bc4a02e018966af0c5f92dfacf5a5ca22fa01cb3179bca0"}, + {file = "pillow-10.4.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:e4db64794ccdf6cb83a59d73405f63adbe2a1887012e308828596100a0b2f6cc"}, + {file = "pillow-10.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bd2880a07482090a3bcb01f4265f1936a903d70bc740bfcb1fd4e8a2ffe5cf5a"}, + {file = "pillow-10.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4b35b21b819ac1dbd1233317adeecd63495f6babf21b7b2512d244ff6c6ce309"}, + {file = "pillow-10.4.0-cp313-cp313-win32.whl", hash = "sha256:551d3fd6e9dc15e4c1eb6fc4ba2b39c0c7933fa113b220057a34f4bb3268a060"}, + {file = "pillow-10.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:030abdbe43ee02e0de642aee345efa443740aa4d828bfe8e2eb11922ea6a21ea"}, + {file = "pillow-10.4.0-cp313-cp313-win_arm64.whl", hash = "sha256:5b001114dd152cfd6b23befeb28d7aee43553e2402c9f159807bf55f33af8a8d"}, + {file = "pillow-10.4.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:8d4d5063501b6dd4024b8ac2f04962d661222d120381272deea52e3fc52d3736"}, + {file = "pillow-10.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7c1ee6f42250df403c5f103cbd2768a28fe1a0ea1f0f03fe151c8741e1469c8b"}, + {file = "pillow-10.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b15e02e9bb4c21e39876698abf233c8c579127986f8207200bc8a8f6bb27acf2"}, + {file = "pillow-10.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a8d4bade9952ea9a77d0c3e49cbd8b2890a399422258a77f357b9cc9be8d680"}, + {file = "pillow-10.4.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:43efea75eb06b95d1631cb784aa40156177bf9dd5b4b03ff38979e048258bc6b"}, + {file = "pillow-10.4.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:950be4d8ba92aca4b2bb0741285a46bfae3ca699ef913ec8416c1b78eadd64cd"}, + {file = "pillow-10.4.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:d7480af14364494365e89d6fddc510a13e5a2c3584cb19ef65415ca57252fb84"}, + {file = "pillow-10.4.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:73664fe514b34c8f02452ffb73b7a92c6774e39a647087f83d67f010eb9a0cf0"}, + {file = "pillow-10.4.0-cp38-cp38-win32.whl", hash = "sha256:e88d5e6ad0d026fba7bdab8c3f225a69f063f116462c49892b0149e21b6c0a0e"}, + {file = "pillow-10.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:5161eef006d335e46895297f642341111945e2c1c899eb406882a6c61a4357ab"}, + {file = "pillow-10.4.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:0ae24a547e8b711ccaaf99c9ae3cd975470e1a30caa80a6aaee9a2f19c05701d"}, + {file = "pillow-10.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:298478fe4f77a4408895605f3482b6cc6222c018b2ce565c2b6b9c354ac3229b"}, + {file = "pillow-10.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:134ace6dc392116566980ee7436477d844520a26a4b1bd4053f6f47d096997fd"}, + {file = "pillow-10.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:930044bb7679ab003b14023138b50181899da3f25de50e9dbee23b61b4de2126"}, + {file = "pillow-10.4.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:c76e5786951e72ed3686e122d14c5d7012f16c8303a674d18cdcd6d89557fc5b"}, + {file = "pillow-10.4.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:b2724fdb354a868ddf9a880cb84d102da914e99119211ef7ecbdc613b8c96b3c"}, + {file = "pillow-10.4.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:dbc6ae66518ab3c5847659e9988c3b60dc94ffb48ef9168656e0019a93dbf8a1"}, + {file = "pillow-10.4.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:06b2f7898047ae93fad74467ec3d28fe84f7831370e3c258afa533f81ef7f3df"}, + {file = "pillow-10.4.0-cp39-cp39-win32.whl", hash = "sha256:7970285ab628a3779aecc35823296a7869f889b8329c16ad5a71e4901a3dc4ef"}, + {file = "pillow-10.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:961a7293b2457b405967af9c77dcaa43cc1a8cd50d23c532e62d48ab6cdd56f5"}, + {file = "pillow-10.4.0-cp39-cp39-win_arm64.whl", hash = "sha256:32cda9e3d601a52baccb2856b8ea1fc213c90b340c542dcef77140dfa3278a9e"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:5b4815f2e65b30f5fbae9dfffa8636d992d49705723fe86a3661806e069352d4"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:8f0aef4ef59694b12cadee839e2ba6afeab89c0f39a3adc02ed51d109117b8da"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f4727572e2918acaa9077c919cbbeb73bd2b3ebcfe033b72f858fc9fbef0026"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff25afb18123cea58a591ea0244b92eb1e61a1fd497bf6d6384f09bc3262ec3e"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:dc3e2db6ba09ffd7d02ae9141cfa0ae23393ee7687248d46a7507b75d610f4f5"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:02a2be69f9c9b8c1e97cf2713e789d4e398c751ecfd9967c18d0ce304efbf885"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:0755ffd4a0c6f267cccbae2e9903d95477ca2f77c4fcf3a3a09570001856c8a5"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:a02364621fe369e06200d4a16558e056fe2805d3468350df3aef21e00d26214b"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:1b5dea9831a90e9d0721ec417a80d4cbd7022093ac38a568db2dd78363b00908"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b885f89040bb8c4a1573566bbb2f44f5c505ef6e74cec7ab9068c900047f04b"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87dd88ded2e6d74d31e1e0a99a726a6765cda32d00ba72dc37f0651f306daaa8"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:2db98790afc70118bd0255c2eeb465e9767ecf1f3c25f9a1abb8ffc8cfd1fe0a"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:f7baece4ce06bade126fb84b8af1c33439a76d8a6fd818970215e0560ca28c27"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:cfdd747216947628af7b259d274771d84db2268ca062dd5faf373639d00113a3"}, + {file = "pillow-10.4.0.tar.gz", hash = "sha256:166c1cd4d24309b30d61f79f4a9114b7b2313d7450912277855ff5dfd7cd4a06"}, ] [[package]] @@ -2021,104 +2026,104 @@ files = [ [[package]] name = "rapidfuzz" -version = "3.9.3" +version = "3.9.4" requires_python = ">=3.8" summary = "rapid fuzzy string matching" groups = ["default"] files = [ - {file = "rapidfuzz-3.9.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bdb8c5b8e29238ec80727c2ba3b301efd45aa30c6a7001123a6647b8e6f77ea4"}, - {file = "rapidfuzz-3.9.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b3bd0d9632088c63a241f217742b1cf86e2e8ae573e01354775bd5016d12138c"}, - {file = "rapidfuzz-3.9.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:153f23c03d4917f6a1fc2fb56d279cc6537d1929237ff08ee7429d0e40464a18"}, - {file = "rapidfuzz-3.9.3-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a96c5225e840f1587f1bac8fa6f67562b38e095341576e82b728a82021f26d62"}, - {file = "rapidfuzz-3.9.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b777cd910ceecd738adc58593d6ed42e73f60ad04ecdb4a841ae410b51c92e0e"}, - {file = "rapidfuzz-3.9.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:53e06e4b81f552da04940aa41fc556ba39dee5513d1861144300c36c33265b76"}, - {file = "rapidfuzz-3.9.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5c7ca5b6050f18fdcacdada2dc5fb7619ff998cd9aba82aed2414eee74ebe6cd"}, - {file = "rapidfuzz-3.9.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:87bb8d84cb41446a808c4b5f746e29d8a53499381ed72f6c4e456fe0f81c80a8"}, - {file = "rapidfuzz-3.9.3-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:959a15186d18425d19811bea86a8ffbe19fd48644004d29008e636631420a9b7"}, - {file = "rapidfuzz-3.9.3-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:a24603dd05fb4e3c09d636b881ce347e5f55f925a6b1b4115527308a323b9f8e"}, - {file = "rapidfuzz-3.9.3-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:0d055da0e801c71dd74ba81d72d41b2fa32afa182b9fea6b4b199d2ce937450d"}, - {file = "rapidfuzz-3.9.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:875b581afb29a7213cf9d98cb0f98df862f1020bce9d9b2e6199b60e78a41d14"}, - {file = "rapidfuzz-3.9.3-cp310-cp310-win32.whl", hash = "sha256:6073a46f61479a89802e3f04655267caa6c14eb8ac9d81a635a13805f735ebc1"}, - {file = "rapidfuzz-3.9.3-cp310-cp310-win_amd64.whl", hash = "sha256:119c010e20e561249b99ca2627f769fdc8305b07193f63dbc07bca0a6c27e892"}, - {file = "rapidfuzz-3.9.3-cp310-cp310-win_arm64.whl", hash = "sha256:790b0b244f3213581d42baa2fed8875f9ee2b2f9b91f94f100ec80d15b140ba9"}, - {file = "rapidfuzz-3.9.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f57e8305c281e8c8bc720515540e0580355100c0a7a541105c6cafc5de71daae"}, - {file = "rapidfuzz-3.9.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a4fc7b784cf987dbddc300cef70e09a92ed1bce136f7bb723ea79d7e297fe76d"}, - {file = "rapidfuzz-3.9.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b422c0a6fe139d5447a0766268e68e6a2a8c2611519f894b1f31f0a392b9167"}, - {file = "rapidfuzz-3.9.3-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f50fed4a9b0c9825ff37cf0bccafd51ff5792090618f7846a7650f21f85579c9"}, - {file = "rapidfuzz-3.9.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b80eb7cbe62348c61d3e67e17057cddfd6defab168863028146e07d5a8b24a89"}, - {file = "rapidfuzz-3.9.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f45be77ec82da32ce5709a362e236ccf801615cc7163b136d1778cf9e31b14"}, - {file = "rapidfuzz-3.9.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd84b7f652a5610733400307dc732f57c4a907080bef9520412e6d9b55bc9adc"}, - {file = "rapidfuzz-3.9.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:3e6d27dad8c990218b8cd4a5c99cbc8834f82bb46ab965a7265d5aa69fc7ced7"}, - {file = "rapidfuzz-3.9.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:05ee0696ebf0dfe8f7c17f364d70617616afc7dafe366532730ca34056065b8a"}, - {file = "rapidfuzz-3.9.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:2bc8391749e5022cd9e514ede5316f86e332ffd3cfceeabdc0b17b7e45198a8c"}, - {file = "rapidfuzz-3.9.3-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:93981895602cf5944d89d317ae3b1b4cc684d175a8ae2a80ce5b65615e72ddd0"}, - {file = "rapidfuzz-3.9.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:754b719a4990735f66653c9e9261dcf52fd4d925597e43d6b9069afcae700d21"}, - {file = "rapidfuzz-3.9.3-cp311-cp311-win32.whl", hash = "sha256:14c9f268ade4c88cf77ab007ad0fdf63699af071ee69378de89fff7aa3cae134"}, - {file = "rapidfuzz-3.9.3-cp311-cp311-win_amd64.whl", hash = "sha256:bc1991b4cde6c9d3c0bbcb83d5581dc7621bec8c666c095c65b4277233265a82"}, - {file = "rapidfuzz-3.9.3-cp311-cp311-win_arm64.whl", hash = "sha256:0c34139df09a61b1b557ab65782ada971b4a3bce7081d1b2bee45b0a52231adb"}, - {file = "rapidfuzz-3.9.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5d6a210347d6e71234af5c76d55eeb0348b026c9bb98fe7c1cca89bac50fb734"}, - {file = "rapidfuzz-3.9.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b300708c917ce52f6075bdc6e05b07c51a085733650f14b732c087dc26e0aaad"}, - {file = "rapidfuzz-3.9.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:83ea7ca577d76778250421de61fb55a719e45b841deb769351fc2b1740763050"}, - {file = "rapidfuzz-3.9.3-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8319838fb5b7b5f088d12187d91d152b9386ce3979ed7660daa0ed1bff953791"}, - {file = "rapidfuzz-3.9.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:505d99131afd21529293a9a7b91dfc661b7e889680b95534756134dc1cc2cd86"}, - {file = "rapidfuzz-3.9.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c52970f7784518d7c82b07a62a26e345d2de8c2bd8ed4774e13342e4b3ff4200"}, - {file = "rapidfuzz-3.9.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:143caf7247449055ecc3c1e874b69e42f403dfc049fc2f3d5f70e1daf21c1318"}, - {file = "rapidfuzz-3.9.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b8ab0fa653d9225195a8ff924f992f4249c1e6fa0aea563f685e71b81b9fcccf"}, - {file = "rapidfuzz-3.9.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:57e7c5bf7b61c7320cfa5dde1e60e678d954ede9bb7da8e763959b2138391401"}, - {file = "rapidfuzz-3.9.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:51fa1ba84653ab480a2e2044e2277bd7f0123d6693051729755addc0d015c44f"}, - {file = "rapidfuzz-3.9.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:17ff7f7eecdb169f9236e3b872c96dbbaf116f7787f4d490abd34b0116e3e9c8"}, - {file = "rapidfuzz-3.9.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:afe7c72d3f917b066257f7ff48562e5d462d865a25fbcabf40fca303a9fa8d35"}, - {file = "rapidfuzz-3.9.3-cp312-cp312-win32.whl", hash = "sha256:e53ed2e9b32674ce96eed80b3b572db9fd87aae6742941fb8e4705e541d861ce"}, - {file = "rapidfuzz-3.9.3-cp312-cp312-win_amd64.whl", hash = "sha256:35b7286f177e4d8ba1e48b03612f928a3c4bdac78e5651379cec59f95d8651e6"}, - {file = "rapidfuzz-3.9.3-cp312-cp312-win_arm64.whl", hash = "sha256:e6e4b9380ed4758d0cb578b0d1970c3f32dd9e87119378729a5340cb3169f879"}, - {file = "rapidfuzz-3.9.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a39890013f6d5b056cc4bfdedc093e322462ece1027a57ef0c636537bdde7531"}, - {file = "rapidfuzz-3.9.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b5bc0fdbf419493163c5c9cb147c5fbe95b8e25844a74a8807dcb1a125e630cf"}, - {file = "rapidfuzz-3.9.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:efe6e200a75a792d37b960457904c4fce7c928a96ae9e5d21d2bd382fe39066e"}, - {file = "rapidfuzz-3.9.3-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:de077c468c225d4c18f7188c47d955a16d65f21aab121cbdd98e3e2011002c37"}, - {file = "rapidfuzz-3.9.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8f917eaadf5388466a95f6a236f678a1588d231e52eda85374077101842e794e"}, - {file = "rapidfuzz-3.9.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:858ba57c05afd720db8088a8707079e8d024afe4644001fe0dbd26ef7ca74a65"}, - {file = "rapidfuzz-3.9.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d36447d21b05f90282a6f98c5a33771805f9222e5d0441d03eb8824e33e5bbb4"}, - {file = "rapidfuzz-3.9.3-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:acbe4b6f1ccd5b90c29d428e849aa4242e51bb6cab0448d5f3c022eb9a25f7b1"}, - {file = "rapidfuzz-3.9.3-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:53c7f27cdf899e94712972237bda48cfd427646aa6f5d939bf45d084780e4c16"}, - {file = "rapidfuzz-3.9.3-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:6175682a829c6dea4d35ed707f1dadc16513270ef64436568d03b81ccb6bdb74"}, - {file = "rapidfuzz-3.9.3-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:5276df395bd8497397197fca2b5c85f052d2e6a66ffc3eb0544dd9664d661f95"}, - {file = "rapidfuzz-3.9.3-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:77b5c4f3e72924d7845f0e189c304270066d0f49635cf8a3938e122c437e58de"}, - {file = "rapidfuzz-3.9.3-cp38-cp38-win32.whl", hash = "sha256:8add34061e5cd561c72ed4febb5c15969e7b25bda2bb5102d02afc3abc1f52d0"}, - {file = "rapidfuzz-3.9.3-cp38-cp38-win_amd64.whl", hash = "sha256:604e0502a39cf8e67fa9ad239394dddad4cdef6d7008fdb037553817d420e108"}, - {file = "rapidfuzz-3.9.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:21047f55d674614eb4b0ab34e35c3dc66f36403b9fbfae645199c4a19d4ed447"}, - {file = "rapidfuzz-3.9.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a56da3aff97cb56fe85d9ca957d1f55dbac7c27da927a86a2a86d8a7e17f80aa"}, - {file = "rapidfuzz-3.9.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:964c08481aec2fe574f0062e342924db2c6b321391aeb73d68853ed42420fd6d"}, - {file = "rapidfuzz-3.9.3-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5e2b827258beefbe5d3f958243caa5a44cf46187eff0c20e0b2ab62d1550327a"}, - {file = "rapidfuzz-3.9.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c6e65a301fcd19fbfbee3a514cc0014ff3f3b254b9fd65886e8a9d6957fb7bca"}, - {file = "rapidfuzz-3.9.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cbe93ba1725a8d47d2b9dca6c1f435174859427fbc054d83de52aea5adc65729"}, - {file = "rapidfuzz-3.9.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aca21c0a34adee582775da997a600283e012a608a107398d80a42f9a57ad323d"}, - {file = "rapidfuzz-3.9.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:256e07d3465173b2a91c35715a2277b1ee3ae0b9bbab4e519df6af78570741d0"}, - {file = "rapidfuzz-3.9.3-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:802ca2cc8aa6b8b34c6fdafb9e32540c1ba05fca7ad60b3bbd7ec89ed1797a87"}, - {file = "rapidfuzz-3.9.3-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:dd789100fc852cffac1449f82af0da139d36d84fd9faa4f79fc4140a88778343"}, - {file = "rapidfuzz-3.9.3-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:5d0abbacdb06e27ff803d7ae0bd0624020096802758068ebdcab9bd49cf53115"}, - {file = "rapidfuzz-3.9.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:378d1744828e27490a823fc6fe6ebfb98c15228d54826bf4e49e4b76eb5f5579"}, - {file = "rapidfuzz-3.9.3-cp39-cp39-win32.whl", hash = "sha256:5d0cb272d43e6d3c0dedefdcd9d00007471f77b52d2787a4695e9dd319bb39d2"}, - {file = "rapidfuzz-3.9.3-cp39-cp39-win_amd64.whl", hash = "sha256:15e4158ac4b3fb58108072ec35b8a69165f651ba1c8f43559a36d518dbf9fb3f"}, - {file = "rapidfuzz-3.9.3-cp39-cp39-win_arm64.whl", hash = "sha256:58c6a4936190c558d5626b79fc9e16497e5df7098589a7e80d8bff68148ff096"}, - {file = "rapidfuzz-3.9.3-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5410dc848c947a603792f4f51b904a3331cf1dc60621586bfbe7a6de72da1091"}, - {file = "rapidfuzz-3.9.3-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:282d55700a1a3d3a7980746eb2fcd48c9bbc1572ebe0840d0340d548a54d01fe"}, - {file = "rapidfuzz-3.9.3-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dc1037507810833646481f5729901a154523f98cbebb1157ba3a821012e16402"}, - {file = "rapidfuzz-3.9.3-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5e33f779391caedcba2ba3089fb6e8e557feab540e9149a5c3f7fea7a3a7df37"}, - {file = "rapidfuzz-3.9.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:41a81a9f311dc83d22661f9b1a1de983b201322df0c4554042ffffd0f2040c37"}, - {file = "rapidfuzz-3.9.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:a93250bd8fae996350c251e1752f2c03335bb8a0a5b0c7e910a593849121a435"}, - {file = "rapidfuzz-3.9.3-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3617d1aa7716c57d120b6adc8f7c989f2d65bc2b0cbd5f9288f1fc7bf469da11"}, - {file = "rapidfuzz-3.9.3-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:ad04a3f5384b82933213bba2459f6424decc2823df40098920856bdee5fd6e88"}, - {file = "rapidfuzz-3.9.3-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8709918da8a88ad73c9d4dd0ecf24179a4f0ceba0bee21efc6ea21a8b5290349"}, - {file = "rapidfuzz-3.9.3-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b770f85eab24034e6ef7df04b2bfd9a45048e24f8a808e903441aa5abde8ecdd"}, - {file = "rapidfuzz-3.9.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:930b4e6fdb4d914390141a2b99a6f77a52beacf1d06aa4e170cba3a98e24c1bc"}, - {file = "rapidfuzz-3.9.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:c8444e921bfc3757c475c4f4d7416a7aa69b2d992d5114fe55af21411187ab0d"}, - {file = "rapidfuzz-3.9.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:2c1d3ef3878f871abe6826e386c3d61b5292ef5f7946fe646f4206b85836b5da"}, - {file = "rapidfuzz-3.9.3-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:d861bf326ee7dabc35c532a40384541578cd1ec1e1b7db9f9ecbba56eb76ca22"}, - {file = "rapidfuzz-3.9.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cde6b9d9ba5007077ee321ec722fa714ebc0cbd9a32ccf0f4dd3cc3f20952d71"}, - {file = "rapidfuzz-3.9.3-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3bb6546e7b6bed1aefbe24f68a5fb9b891cc5aef61bca6c1a7b1054b7f0359bb"}, - {file = "rapidfuzz-3.9.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d8a57261ef7996d5ced7c8cba9189ada3fbeffd1815f70f635e4558d93766cb"}, - {file = "rapidfuzz-3.9.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:67201c02efc596923ad950519e0b75ceb78d524177ea557134d6567b9ac2c283"}, - {file = "rapidfuzz-3.9.3.tar.gz", hash = "sha256:b398ea66e8ed50451bce5997c430197d5e4b06ac4aa74602717f792d8d8d06e2"}, + {file = "rapidfuzz-3.9.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c9b9793c19bdf38656c8eaefbcf4549d798572dadd70581379e666035c9df781"}, + {file = "rapidfuzz-3.9.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:015b5080b999404fe06ec2cb4f40b0be62f0710c926ab41e82dfbc28e80675b4"}, + {file = "rapidfuzz-3.9.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:acc5ceca9c1e1663f3e6c23fb89a311f69b7615a40ddd7645e3435bf3082688a"}, + {file = "rapidfuzz-3.9.4-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1424e238bc3f20e1759db1e0afb48a988a9ece183724bef91ea2a291c0b92a95"}, + {file = "rapidfuzz-3.9.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ed01378f605aa1f449bee82cd9c83772883120d6483e90aa6c5a4ce95dc5c3aa"}, + {file = "rapidfuzz-3.9.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eb26d412271e5a76cdee1c2d6bf9881310665d3fe43b882d0ed24edfcb891a84"}, + {file = "rapidfuzz-3.9.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f37e9e1f17be193c41a31c864ad4cd3ebd2b40780db11cd5c04abf2bcf4201b"}, + {file = "rapidfuzz-3.9.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d070ec5cf96b927c4dc5133c598c7ff6db3b833b363b2919b13417f1002560bc"}, + {file = "rapidfuzz-3.9.4-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:10e61bb7bc807968cef09a0e32ce253711a2d450a4dce7841d21d45330ffdb24"}, + {file = "rapidfuzz-3.9.4-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:31a2fc60bb2c7face4140010a7aeeafed18b4f9cdfa495cc644a68a8c60d1ff7"}, + {file = "rapidfuzz-3.9.4-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:fbebf1791a71a2e89f5c12b78abddc018354d5859e305ec3372fdae14f80a826"}, + {file = "rapidfuzz-3.9.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:aee9fc9e3bb488d040afc590c0a7904597bf4ccd50d1491c3f4a5e7e67e6cd2c"}, + {file = "rapidfuzz-3.9.4-cp310-cp310-win32.whl", hash = "sha256:005a02688a51c7d2451a2d41c79d737aa326ff54167211b78a383fc2aace2c2c"}, + {file = "rapidfuzz-3.9.4-cp310-cp310-win_amd64.whl", hash = "sha256:3a2e75e41ee3274754d3b2163cc6c82cd95b892a85ab031f57112e09da36455f"}, + {file = "rapidfuzz-3.9.4-cp310-cp310-win_arm64.whl", hash = "sha256:2c99d355f37f2b289e978e761f2f8efeedc2b14f4751d9ff7ee344a9a5ca98d9"}, + {file = "rapidfuzz-3.9.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:07141aa6099e39d48637ce72a25b893fc1e433c50b3e837c75d8edf99e0c63e1"}, + {file = "rapidfuzz-3.9.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:db1664eaff5d7d0f2542dd9c25d272478deaf2c8412e4ad93770e2e2d828e175"}, + {file = "rapidfuzz-3.9.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bc01a223f6605737bec3202e94dcb1a449b6c76d46082cfc4aa980f2a60fd40e"}, + {file = "rapidfuzz-3.9.4-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1869c42e73e2a8910b479be204fa736418741b63ea2325f9cc583c30f2ded41a"}, + {file = "rapidfuzz-3.9.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:62ea7007941fb2795fff305ac858f3521ec694c829d5126e8f52a3e92ae75526"}, + {file = "rapidfuzz-3.9.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:698e992436bf7f0afc750690c301215a36ff952a6dcd62882ec13b9a1ebf7a39"}, + {file = "rapidfuzz-3.9.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b76f611935f15a209d3730c360c56b6df8911a9e81e6a38022efbfb96e433bab"}, + {file = "rapidfuzz-3.9.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:129627d730db2e11f76169344a032f4e3883d34f20829419916df31d6d1338b1"}, + {file = "rapidfuzz-3.9.4-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:90a82143c14e9a14b723a118c9ef8d1bbc0c5a16b1ac622a1e6c916caff44dd8"}, + {file = "rapidfuzz-3.9.4-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:ded58612fe3b0e0d06e935eaeaf5a9fd27da8ba9ed3e2596307f40351923bf72"}, + {file = "rapidfuzz-3.9.4-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:f16f5d1c4f02fab18366f2d703391fcdbd87c944ea10736ca1dc3d70d8bd2d8b"}, + {file = "rapidfuzz-3.9.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:26aa7eece23e0df55fb75fbc2a8fb678322e07c77d1fd0e9540496e6e2b5f03e"}, + {file = "rapidfuzz-3.9.4-cp311-cp311-win32.whl", hash = "sha256:f187a9c3b940ce1ee324710626daf72c05599946bd6748abe9e289f1daa9a077"}, + {file = "rapidfuzz-3.9.4-cp311-cp311-win_amd64.whl", hash = "sha256:d8e9130fe5d7c9182990b366ad78fd632f744097e753e08ace573877d67c32f8"}, + {file = "rapidfuzz-3.9.4-cp311-cp311-win_arm64.whl", hash = "sha256:40419e98b10cd6a00ce26e4837a67362f658fc3cd7a71bd8bd25c99f7ee8fea5"}, + {file = "rapidfuzz-3.9.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b5d5072b548db1b313a07d62d88fe0b037bd2783c16607c647e01b070f6cf9e5"}, + {file = "rapidfuzz-3.9.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:cf5bcf22e1f0fd273354462631d443ef78d677f7d2fc292de2aec72ae1473e66"}, + {file = "rapidfuzz-3.9.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0c8fc973adde8ed52810f590410e03fb6f0b541bbaeb04c38d77e63442b2df4c"}, + {file = "rapidfuzz-3.9.4-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2464bb120f135293e9a712e342c43695d3d83168907df05f8c4ead1612310c7"}, + {file = "rapidfuzz-3.9.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8d9d58689aca22057cf1a5851677b8a3ccc9b535ca008c7ed06dc6e1899f7844"}, + {file = "rapidfuzz-3.9.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:167e745f98baa0f3034c13583e6302fb69249a01239f1483d68c27abb841e0a1"}, + {file = "rapidfuzz-3.9.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db0bf0663b4b6da1507869722420ea9356b6195aa907228d6201303e69837af9"}, + {file = "rapidfuzz-3.9.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:cd6ac61b74fdb9e23f04d5f068e6cf554f47e77228ca28aa2347a6ca8903972f"}, + {file = "rapidfuzz-3.9.4-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:60ff67c690acecf381759c16cb06c878328fe2361ddf77b25d0e434ea48a29da"}, + {file = "rapidfuzz-3.9.4-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:cb934363380c60f3a57d14af94325125cd8cded9822611a9f78220444034e36e"}, + {file = "rapidfuzz-3.9.4-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:fe833493fb5cc5682c823ea3e2f7066b07612ee8f61ecdf03e1268f262106cdd"}, + {file = "rapidfuzz-3.9.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2797fb847d89e04040d281cb1902cbeffbc4b5131a5c53fc0db490fd76b2a547"}, + {file = "rapidfuzz-3.9.4-cp312-cp312-win32.whl", hash = "sha256:52e3d89377744dae68ed7c84ad0ddd3f5e891c82d48d26423b9e066fc835cc7c"}, + {file = "rapidfuzz-3.9.4-cp312-cp312-win_amd64.whl", hash = "sha256:c76da20481c906e08400ee9be230f9e611d5931a33707d9df40337c2655c84b5"}, + {file = "rapidfuzz-3.9.4-cp312-cp312-win_arm64.whl", hash = "sha256:f2d2846f3980445864c7e8b8818a29707fcaff2f0261159ef6b7bd27ba139296"}, + {file = "rapidfuzz-3.9.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:355fc4a268ffa07bab88d9adee173783ec8d20136059e028d2a9135c623c44e6"}, + {file = "rapidfuzz-3.9.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4d81a78f90269190b568a8353d4ea86015289c36d7e525cd4d43176c88eff429"}, + {file = "rapidfuzz-3.9.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9e618625ffc4660b26dc8e56225f8b966d5842fa190e70c60db6cd393e25b86e"}, + {file = "rapidfuzz-3.9.4-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b712336ad6f2bacdbc9f1452556e8942269ef71f60a9e6883ef1726b52d9228a"}, + {file = "rapidfuzz-3.9.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84fc1ee19fdad05770c897e793836c002344524301501d71ef2e832847425707"}, + {file = "rapidfuzz-3.9.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1950f8597890c0c707cb7e0416c62a1cf03dcdb0384bc0b2dbda7e05efe738ec"}, + {file = "rapidfuzz-3.9.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a6c35f272ec9c430568dc8c1c30cb873f6bc96be2c79795e0bce6db4e0e101d"}, + {file = "rapidfuzz-3.9.4-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:1df0f9e9239132a231c86ae4f545ec2b55409fa44470692fcfb36b1bd00157ad"}, + {file = "rapidfuzz-3.9.4-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:d2c51955329bfccf99ae26f63d5928bf5be9fcfcd9f458f6847fd4b7e2b8986c"}, + {file = "rapidfuzz-3.9.4-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:3c522f462d9fc504f2ea8d82e44aa580e60566acc754422c829ad75c752fbf8d"}, + {file = "rapidfuzz-3.9.4-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:d8a52fc50ded60d81117d7647f262c529659fb21d23e14ebfd0b35efa4f1b83d"}, + {file = "rapidfuzz-3.9.4-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:04dbdfb0f0bfd3f99cf1e9e24fadc6ded2736d7933f32f1151b0f2abb38f9a25"}, + {file = "rapidfuzz-3.9.4-cp38-cp38-win32.whl", hash = "sha256:4968c8bd1df84b42f382549e6226710ad3476f976389839168db3e68fd373298"}, + {file = "rapidfuzz-3.9.4-cp38-cp38-win_amd64.whl", hash = "sha256:3fe4545f89f8d6c27b6bbbabfe40839624873c08bd6700f63ac36970a179f8f5"}, + {file = "rapidfuzz-3.9.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9f256c8fb8f3125574c8c0c919ab0a1f75d7cba4d053dda2e762dcc36357969d"}, + {file = "rapidfuzz-3.9.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f5fdc09cf6e9d8eac3ce48a4615b3a3ee332ea84ac9657dbbefef913b13e632f"}, + {file = "rapidfuzz-3.9.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d395d46b80063d3b5d13c0af43d2c2cedf3ab48c6a0c2aeec715aa5455b0c632"}, + {file = "rapidfuzz-3.9.4-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7fa714fb96ce9e70c37e64c83b62fe8307030081a0bfae74a76fac7ba0f91715"}, + {file = "rapidfuzz-3.9.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1bc1a0f29f9119be7a8d3c720f1d2068317ae532e39e4f7f948607c3a6de8396"}, + {file = "rapidfuzz-3.9.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6022674aa1747d6300f699cd7c54d7dae89bfe1f84556de699c4ac5df0838082"}, + {file = "rapidfuzz-3.9.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dcb72e5f9762fd469701a7e12e94b924af9004954f8c739f925cb19c00862e38"}, + {file = "rapidfuzz-3.9.4-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:ad04ae301129f0eb5b350a333accd375ce155a0c1cec85ab0ec01f770214e2e4"}, + {file = "rapidfuzz-3.9.4-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:f46a22506f17c0433e349f2d1dc11907c393d9b3601b91d4e334fa9a439a6a4d"}, + {file = "rapidfuzz-3.9.4-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:01b42a8728c36011718da409aa86b84984396bf0ca3bfb6e62624f2014f6022c"}, + {file = "rapidfuzz-3.9.4-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:e590d5d5443cf56f83a51d3c4867bd1f6be8ef8cfcc44279522bcef3845b2a51"}, + {file = "rapidfuzz-3.9.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:4c72078b5fdce34ba5753f9299ae304e282420e6455e043ad08e4488ca13a2b0"}, + {file = "rapidfuzz-3.9.4-cp39-cp39-win32.whl", hash = "sha256:f75639277304e9b75e6a7b3c07042d2264e16740a11e449645689ed28e9c2124"}, + {file = "rapidfuzz-3.9.4-cp39-cp39-win_amd64.whl", hash = "sha256:e81e27e8c32a1e1278a4bb1ce31401bfaa8c2cc697a053b985a6f8d013df83ec"}, + {file = "rapidfuzz-3.9.4-cp39-cp39-win_arm64.whl", hash = "sha256:15bc397ee9a3ed1210b629b9f5f1da809244adc51ce620c504138c6e7095b7bd"}, + {file = "rapidfuzz-3.9.4-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:20488ade4e1ddba3cfad04f400da7a9c1b91eff5b7bd3d1c50b385d78b587f4f"}, + {file = "rapidfuzz-3.9.4-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:e61b03509b1a6eb31bc5582694f6df837d340535da7eba7bedb8ae42a2fcd0b9"}, + {file = "rapidfuzz-3.9.4-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:098d231d4e51644d421a641f4a5f2f151f856f53c252b03516e01389b2bfef99"}, + {file = "rapidfuzz-3.9.4-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:17ab8b7d10fde8dd763ad428aa961c0f30a1b44426e675186af8903b5d134fb0"}, + {file = "rapidfuzz-3.9.4-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e272df61bee0a056a3daf99f9b1bd82cf73ace7d668894788139c868fdf37d6f"}, + {file = "rapidfuzz-3.9.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d6481e099ff8c4edda85b8b9b5174c200540fd23c8f38120016c765a86fa01f5"}, + {file = "rapidfuzz-3.9.4-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ad61676e9bdae677d577fe80ec1c2cea1d150c86be647e652551dcfe505b1113"}, + {file = "rapidfuzz-3.9.4-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:af65020c0dd48d0d8ae405e7e69b9d8ae306eb9b6249ca8bf511a13f465fad85"}, + {file = "rapidfuzz-3.9.4-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d38b4e026fcd580e0bda6c0ae941e0e9a52c6bc66cdce0b8b0da61e1959f5f8"}, + {file = "rapidfuzz-3.9.4-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f74ed072c2b9dc6743fb19994319d443a4330b0e64aeba0aa9105406c7c5b9c2"}, + {file = "rapidfuzz-3.9.4-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aee5f6b8321f90615c184bd8a4c676e9becda69b8e4e451a90923db719d6857c"}, + {file = "rapidfuzz-3.9.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:3a555e3c841d6efa350f862204bb0a3fea0c006b8acc9b152b374fa36518a1c6"}, + {file = "rapidfuzz-3.9.4-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0772150d37bf018110351c01d032bf9ab25127b966a29830faa8ad69b7e2f651"}, + {file = "rapidfuzz-3.9.4-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:addcdd3c3deef1bd54075bd7aba0a6ea9f1d01764a08620074b7a7b1e5447cb9"}, + {file = "rapidfuzz-3.9.4-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3fe86b82b776554add8f900b6af202b74eb5efe8f25acdb8680a5c977608727f"}, + {file = "rapidfuzz-3.9.4-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b0fc91ac59f4414d8542454dfd6287a154b8e6f1256718c898f695bdbb993467"}, + {file = "rapidfuzz-3.9.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a944e546a296a5fdcaabb537b01459f1b14d66f74e584cb2a91448bffadc3c1"}, + {file = "rapidfuzz-3.9.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:4fb96ba96d58c668a17a06b5b5e8340fedc26188e87b0d229d38104556f30cd8"}, + {file = "rapidfuzz-3.9.4.tar.gz", hash = "sha256:366bf8947b84e37f2f4cf31aaf5f37c39f620d8c0eddb8b633e6ba0129ca4a0a"}, ] [[package]] @@ -2167,7 +2172,7 @@ files = [ [[package]] name = "sentry-sdk" -version = "2.7.0" +version = "2.7.1" requires_python = ">=3.6" summary = "Python client for Sentry (https://sentry.io)" groups = ["default"] @@ -2176,19 +2181,19 @@ dependencies = [ "urllib3>=1.26.11", ] files = [ - {file = "sentry_sdk-2.7.0-py2.py3-none-any.whl", hash = "sha256:db9594c27a4d21c1ebad09908b1f0dc808ef65c2b89c1c8e7e455143262e37c1"}, - {file = "sentry_sdk-2.7.0.tar.gz", hash = "sha256:d846a211d4a0378b289ced3c434480945f110d0ede00450ba631fc2852e7a0d4"}, + {file = "sentry_sdk-2.7.1-py2.py3-none-any.whl", hash = "sha256:ef1b3d54eb715825657cd4bb3cb42bb4dc85087bac14c56b0fd8c21abd968c9a"}, + {file = "sentry_sdk-2.7.1.tar.gz", hash = "sha256:25006c7e68b75aaa5e6b9c6a420ece22e8d7daec4b7a906ffd3a8607b67c037b"}, ] [[package]] name = "setuptools" -version = "70.1.1" +version = "70.2.0" requires_python = ">=3.8" summary = "Easily download, build, install, upgrade, and uninstall Python packages" groups = ["default"] files = [ - {file = "setuptools-70.1.1-py3-none-any.whl", hash = "sha256:a58a8fde0541dab0419750bcc521fbdf8585f6e5cb41909df3a472ef7b81ca95"}, - {file = "setuptools-70.1.1.tar.gz", hash = "sha256:937a48c7cdb7a21eb53cd7f9b59e525503aa8abaf3584c730dc5f7a5bec3a650"}, + {file = "setuptools-70.2.0-py3-none-any.whl", hash = "sha256:b8b8060bb426838fbe942479c90296ce976249451118ef566a5a0b7d8b78fb05"}, + {file = "setuptools-70.2.0.tar.gz", hash = "sha256:bd63e505105011b25c3c11f753f7e3b8465ea739efddaccef8f0efac2137bac1"}, ] [[package]] @@ -2207,7 +2212,7 @@ name = "simnet" version = "0.1.22" requires_python = "<4.0,>=3.8" git = "https://github.com/PaiGramTeam/SIMNet" -revision = "277a33321a20909541b46bf4ecf794fd47e19fb1" +revision = "05fcb568d6c1fe44a4f917c996198bfe62a00053" summary = "Modern API wrapper for Genshin Impact & Honkai: Star Rail built on asyncio and pydantic." groups = ["default"] dependencies = [ diff --git a/plugins/account/account.py b/plugins/account/account.py index 248157c..62d052d 100644 --- a/plugins/account/account.py +++ b/plugins/account/account.py @@ -1,7 +1,7 @@ from datetime import datetime from typing import Optional, TYPE_CHECKING -from simnet import GenshinClient, Region +from simnet import ZZZClient, Region from simnet.errors import ( InvalidCookies, BadRequest as SimnetBadRequest, @@ -149,15 +149,15 @@ class BindAccountPlugin(Plugin.Conversation): ) return ConversationHandler.END if region == RegionEnum.HYPERION: - client = GenshinClient(cookies=cookies.data, region=Region.CHINESE) + client = ZZZClient(cookies=cookies.data, region=Region.CHINESE) elif region == RegionEnum.HOYOLAB: - client = GenshinClient(cookies=cookies.data, region=Region.OVERSEAS, lang="zh-cn") + client = ZZZClient(cookies=cookies.data, region=Region.OVERSEAS, lang="zh-cn") else: return ConversationHandler.END try: record_card = await client.get_record_card(account_id) if record_card is None: - await message.reply_text("请在设置展示主界面添加原神", reply_markup=ReplyKeyboardRemove()) + await message.reply_text("请在设置展示主界面添加绝区零", reply_markup=ReplyKeyboardRemove()) return ConversationHandler.END except DataNotPublic: await message.reply_text("角色未公开", reply_markup=ReplyKeyboardRemove()) diff --git a/plugins/account/cookies.py b/plugins/account/cookies.py index 1ffa708..08c3519 100644 --- a/plugins/account/cookies.py +++ b/plugins/account/cookies.py @@ -2,7 +2,7 @@ from datetime import datetime from typing import Dict, Optional from arkowrapper import ArkoWrapper -from simnet import GenshinClient, Region +from simnet import ZZZClient, Region from simnet.errors import DataNotPublic, InvalidCookies, BadRequest as SimnetBadRequest from simnet.models.lab.record import Account from telegram import ReplyKeyboardMarkup, ReplyKeyboardRemove, TelegramObject, Update @@ -226,7 +226,7 @@ class AccountCookiesPlugin(Plugin.Conversation): logger.error("用户 %s[%s] region 异常", user.full_name, user.id) await message.reply_text("数据错误", reply_markup=ReplyKeyboardRemove()) return ConversationHandler.END - async with GenshinClient(cookies=cookies.to_dict(), region=region) as client: + async with ZZZClient(cookies=cookies.to_dict(), region=region) as client: check_cookie = cookies.check() if cookies.login_ticket is not None: try: @@ -301,7 +301,7 @@ class AccountCookiesPlugin(Plugin.Conversation): logger.success("获取用户 %s[%s] account_id[%s] 成功", user.full_name, user.id, account_id) else: account_cookies_plugin_data.account_id = client.account_id - genshin_accounts = await client.get_genshin_accounts() + genshin_accounts = await client.get_zzz_accounts() except DataNotPublic: logger.info("用户 %s[%s] 账号疑似被注销", user.full_name, user.id) await message.reply_text("账号疑似被注销,请检查账号状态", reply_markup=ReplyKeyboardRemove()) @@ -342,7 +342,7 @@ class AccountCookiesPlugin(Plugin.Conversation): level = temp.level genshin_account = temp if genshin_account is None: - await message.reply_text("未找到原神账号,请确认账号信息无误。") + await message.reply_text("未找到绝区零账号,请确认账号信息无误。") return ConversationHandler.END account_cookies_plugin_data.genshin_account = genshin_account player_info = await self.players_service.get( @@ -408,12 +408,13 @@ class AccountCookiesPlugin(Plugin.Conversation): region=region, is_chosen=True, # todo 多账号 ) - await self.update_player_info(player_model, genshin_account.nickname) await self.players_service.add(player_model) + player = player_model + await self.update_player_info(player, genshin_account.nickname) async def update_player_info(self, player: Player, nickname: str): player_info = await self.player_info_service.get(player) - if player_info is None: + if player_info is None or player_info.create_time is None: player_info = PlayerInfoSQLModel( user_id=player.user_id, player_id=player.player_id, diff --git a/plugins/account/players.py b/plugins/account/players.py index 7cf5561..f1cb7ad 100644 --- a/plugins/account/players.py +++ b/plugins/account/players.py @@ -2,7 +2,7 @@ import html from http.cookies import SimpleCookie from typing import Tuple, TYPE_CHECKING -from simnet import Region, GenshinClient +from simnet import Region, ZZZClient from telegram import InlineKeyboardMarkup, InlineKeyboardButton from telegram.ext import filters from core.config import config @@ -223,7 +223,7 @@ class PlayersManagesPlugin(Plugin): if cookies.stoken is not None: try: region = Region.CHINESE if player.region.value == 1 else Region.OVERSEAS - async with GenshinClient(cookies=cookies.to_dict(), region=region) as client: + async with ZZZClient(cookies=cookies.to_dict(), region=region) as client: cookies.cookie_token = await client.get_cookie_token_by_stoken() logger.success("用户 %s[%s] 刷新 cookie_token 成功", user.full_name, user.id) cookies.ltoken = await client.get_ltoken_by_stoken() diff --git a/plugins/admin/get_chat.py b/plugins/admin/get_chat.py index 404c54b..b781071 100644 --- a/plugins/admin/get_chat.py +++ b/plugins/admin/get_chat.py @@ -71,7 +71,7 @@ class GetChat(Plugin): if player_info.region == RegionEnum.HYPERION: text += "米游社绑定:" else: - text += "原神绑定:" + text += "绝区零绑定:" cookies_info = await self.cookies_service.get(chat.id, player_info.account_id, player_info.region) if cookies_info is None: temp = "UID 绑定" diff --git a/plugins/admin/post.py b/plugins/admin/post.py index a007bde..107b2f9 100644 --- a/plugins/admin/post.py +++ b/plugins/admin/post.py @@ -68,8 +68,8 @@ class Post(Plugin.Conversation): MENU_KEYBOARD = ReplyKeyboardMarkup([["推送频道", "添加TAG"], ["编辑文字", "删除图片"], ["退出"]], True, True) def __init__(self): - self.gids = 2 - self.short_name = "ys" + self.gids = 8 + self.short_name = "zzz" self.last_post_id_list: Dict[PostTypeEnum, List[int]] = {PostTypeEnum.CN: [], PostTypeEnum.OS: []} self.ffmpeg_enable = False self.cache_dir = os.path.join(os.getcwd(), "cache") @@ -358,6 +358,8 @@ class Post(Plugin.Conversation): if too_long or len(post_text) >= MessageLimit.CAPTION_LENGTH: post_text = post_text[: MessageLimit.CAPTION_LENGTH] await message.reply_text(f"警告!图片字符描述已经超过 {MessageLimit.CAPTION_LENGTH} 个字,已经切割") + if post_info.video_urls: + await message.reply_text("检测到视频,需要单独下载,视频链接:" + "\n".join(post_info.video_urls)) try: if len(post_images) > 1: media = [self.input_media(img_info) for img_info in post_images if not img_info.is_error] diff --git a/plugins/admin/quiz.py b/plugins/admin/quiz.py deleted file mode 100644 index 38edb76..0000000 --- a/plugins/admin/quiz.py +++ /dev/null @@ -1,230 +0,0 @@ -import re -from typing import List - -from redis import DataError, ResponseError -from telegram import InlineKeyboardButton, InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, Update -from telegram.ext import CallbackContext, ConversationHandler, filters -from telegram.helpers import escape_markdown - -from core.plugin import Plugin, conversation, handler -from core.services.quiz.models import Answer, Question -from core.services.quiz.services import QuizService -from utils.log import logger - -( - CHECK_COMMAND, - VIEW_COMMAND, - CHECK_QUESTION, - GET_NEW_QUESTION, - GET_NEW_CORRECT_ANSWER, - GET_NEW_WRONG_ANSWER, - QUESTION_EDIT, - SAVE_QUESTION, -) = range(10300, 10308) - - -class QuizCommandData: - question_id: int = -1 - new_question: str = "" - new_correct_answer: str = "" - new_wrong_answer: List[str] = [] - status: int = 0 - - -class SetQuizPlugin(Plugin.Conversation): - """派蒙的十万个为什么问题修改/添加/删除""" - - def __init__(self, quiz_service: QuizService = None): - self.quiz_service = quiz_service - self.time_out = 120 - - @conversation.entry_point - @handler.command(command="set_quiz", filters=filters.ChatType.PRIVATE, block=False, admin=True) - async def command_start(self, update: Update, context: CallbackContext) -> int: - user = update.effective_user - message = update.effective_message - logger.info("用户 %s[%s] set_quiz命令请求", user.full_name, user.id) - quiz_command_data: QuizCommandData = context.chat_data.get("quiz_command_data") - if quiz_command_data is None: - quiz_command_data = QuizCommandData() - context.chat_data["quiz_command_data"] = quiz_command_data - text = f'你好 {user.mention_markdown_v2()} {escape_markdown("!请选择你的操作!")}' - reply_keyboard = [["查看问题", "添加问题"], ["重载问题"], ["退出"]] - await message.reply_markdown_v2(text, reply_markup=ReplyKeyboardMarkup(reply_keyboard, one_time_keyboard=True)) - return CHECK_COMMAND - - async def view_command(self, update: Update, _: CallbackContext) -> int: - _ = self - keyboard = [[InlineKeyboardButton(text="选择问题", switch_inline_query_current_chat="查看问题 ")]] - await update.message.reply_text("请回复你要查看的问题", reply_markup=InlineKeyboardMarkup(keyboard)) - return CHECK_COMMAND - - @conversation.state(state=CHECK_QUESTION) - @handler.message(filters=filters.TEXT & ~filters.COMMAND, block=False) - async def check_question(self, update: Update, _: CallbackContext) -> int: - reply_keyboard = [["删除问题"], ["退出"]] - await update.message.reply_text("请选择你的操作", reply_markup=ReplyKeyboardMarkup(reply_keyboard)) - return CHECK_COMMAND - - @conversation.state(state=CHECK_COMMAND) - @handler.message(filters=filters.TEXT & ~filters.COMMAND, block=False) - async def check_command(self, update: Update, context: CallbackContext) -> int: - quiz_command_data: QuizCommandData = context.chat_data.get("quiz_command_data") - if update.message.text == "退出": - await update.message.reply_text("退出任务", reply_markup=ReplyKeyboardRemove()) - return ConversationHandler.END - if update.message.text == "查看问题": - return await self.view_command(update, context) - if update.message.text == "添加问题": - return await self.add_question(update, context) - if update.message.text == "删除问题": - return await self.delete_question(update, context) - # elif update.message.text == "修改问题": - # return await self.edit_question(update, context) - if update.message.text == "重载问题": - return await self.refresh_question(update, context) - result = re.findall(r"问题ID (\d+)", update.message.text) - if len(result) == 1: - try: - question_id = int(result[0]) - except ValueError: - await update.message.reply_text("获取问题ID失败") - return ConversationHandler.END - quiz_command_data.question_id = question_id - await update.message.reply_text("获取问题ID成功") - return await self.check_question(update, context) - await update.message.reply_text("命令错误", reply_markup=ReplyKeyboardRemove()) - return ConversationHandler.END - - async def refresh_question(self, update: Update, _: CallbackContext) -> int: - try: - await self.quiz_service.refresh_quiz() - except DataError: - await update.message.reply_text("Redis数据错误,重载失败", reply_markup=ReplyKeyboardRemove()) - return ConversationHandler.END - except ResponseError as exc: - logger.error("重载问题失败", exc_info=exc) - await update.message.reply_text( - "重载问题失败,异常抛出Redis请求错误异常,详情错误请看日记", reply_markup=ReplyKeyboardRemove() - ) - return ConversationHandler.END - await update.message.reply_text("重载成功", reply_markup=ReplyKeyboardRemove()) - return ConversationHandler.END - - async def add_question(self, update: Update, context: CallbackContext) -> int: - _ = self - quiz_command_data: QuizCommandData = context.chat_data.get("quiz_command_data") - quiz_command_data.new_wrong_answer = [] - quiz_command_data.new_question = "" - quiz_command_data.new_correct_answer = "" - quiz_command_data.status = 1 - await update.message.reply_text( - "请回复你要添加的问题,或发送 /cancel 取消操作", reply_markup=ReplyKeyboardRemove() - ) - return GET_NEW_QUESTION - - @conversation.state(state=GET_NEW_QUESTION) - @handler.message(filters=filters.TEXT & ~filters.COMMAND, block=False) - async def get_new_question(self, update: Update, context: CallbackContext) -> int: - message = update.effective_message - quiz_command_data: QuizCommandData = context.chat_data.get("quiz_command_data") - reply_text = f"问题:`{escape_markdown(update.message.text, version=2)}`\n" f"请填写正确答案:" - quiz_command_data.new_question = message.text - await update.message.reply_markdown_v2(reply_text) - return GET_NEW_CORRECT_ANSWER - - @conversation.state(state=GET_NEW_CORRECT_ANSWER) - @handler.message(filters=filters.TEXT & ~filters.COMMAND, block=False) - async def get_new_correct_answer(self, update: Update, context: CallbackContext) -> int: - quiz_command_data: QuizCommandData = context.chat_data.get("quiz_command_data") - reply_text = f"正确答案:`{escape_markdown(update.message.text, version=2)}`\n" f"请填写错误答案:" - await update.message.reply_markdown_v2(reply_text) - quiz_command_data.new_correct_answer = update.message.text - return GET_NEW_WRONG_ANSWER - - @conversation.state(state=GET_NEW_WRONG_ANSWER) - @handler.message(filters=filters.TEXT & ~filters.COMMAND, block=False) - @handler.command(command="finish_edit", block=False) - async def get_new_wrong_answer(self, update: Update, context: CallbackContext) -> int: - quiz_command_data: QuizCommandData = context.chat_data.get("quiz_command_data") - reply_text = ( - f"错误答案:`{escape_markdown(update.message.text, version=2)}`\n" - f"可继续填写,并使用 {escape_markdown('/finish', version=2)} 结束。" - ) - await update.message.reply_markdown_v2(reply_text) - quiz_command_data.new_wrong_answer.append(update.message.text) - return GET_NEW_WRONG_ANSWER - - async def finish_edit(self, update: Update, context: CallbackContext): - _ = self - quiz_command_data: QuizCommandData = context.chat_data.get("quiz_command_data") - reply_text = ( - f"问题:`{escape_markdown(quiz_command_data.new_question, version=2)}`\n" - f"正确答案:`{escape_markdown(quiz_command_data.new_correct_answer, version=2)}`\n" - f"错误答案:`{escape_markdown(' '.join(quiz_command_data.new_wrong_answer), version=2)}`" - ) - await update.message.reply_markdown_v2(reply_text) - reply_keyboard = [["保存并重载配置", "抛弃修改并退出"]] - await update.message.reply_text( - "请核对问题,并选择下一步操作。", reply_markup=ReplyKeyboardMarkup(reply_keyboard) - ) - return SAVE_QUESTION - - @conversation.state(state=SAVE_QUESTION) - @handler.message(filters=filters.TEXT & ~filters.COMMAND, block=False) - async def save_question(self, update: Update, context: CallbackContext): - quiz_command_data: QuizCommandData = context.chat_data.get("quiz_command_data") - if update.message.text == "抛弃修改并退出": - await update.message.reply_text("退出任务", reply_markup=ReplyKeyboardRemove()) - return ConversationHandler.END - if update.message.text == "保存并重载配置": - if quiz_command_data.status == 1: - answer = [ - Answer(text=wrong_answer, is_correct=False) for wrong_answer in quiz_command_data.new_wrong_answer - ] - answer.append(Answer(text=quiz_command_data.new_correct_answer, is_correct=True)) - await self.quiz_service.save_quiz(Question(text=quiz_command_data.new_question)) - await update.message.reply_text("保存成功", reply_markup=ReplyKeyboardRemove()) - try: - await self.quiz_service.refresh_quiz() - except ResponseError as exc: - logger.error("重载问题失败", exc_info=exc) - await update.message.reply_text( - "重载问题失败,异常抛出Redis请求错误异常,详情错误请看日记", reply_markup=ReplyKeyboardRemove() - ) - return ConversationHandler.END - await update.message.reply_text("重载配置成功", reply_markup=ReplyKeyboardRemove()) - return ConversationHandler.END - await update.message.reply_text("回复错误,请重新选择") - return SAVE_QUESTION - - async def edit_question(self, update: Update, context: CallbackContext) -> int: - _ = self - quiz_command_data: QuizCommandData = context.chat_data.get("quiz_command_data") - quiz_command_data.new_wrong_answer = [] - quiz_command_data.new_question = "" - quiz_command_data.new_correct_answer = "" - quiz_command_data.status = 2 - await update.message.reply_text("请回复你要修改的问题", reply_markup=ReplyKeyboardRemove()) - return GET_NEW_QUESTION - - async def delete_question(self, update: Update, context: CallbackContext) -> int: - quiz_command_data: QuizCommandData = context.chat_data.get("quiz_command_data") - # 再问题重载Redis 以免redis数据为空时出现奔溃 - try: - await self.quiz_service.refresh_quiz() - question = await self.quiz_service.get_question(quiz_command_data.question_id) - # 因为外键的存在,先删除答案 - for answer in question.answers: - await self.quiz_service.delete_question_by_id(answer.answer_id) - await self.quiz_service.delete_question_by_id(question.question_id) - await update.message.reply_text("删除问题成功", reply_markup=ReplyKeyboardRemove()) - await self.quiz_service.refresh_quiz() - except ResponseError as exc: - logger.error("重载问题失败", exc_info=exc) - await update.message.reply_text( - "重载问题失败,异常抛出Redis请求错误异常,详情错误请看日记", reply_markup=ReplyKeyboardRemove() - ) - return ConversationHandler.END - await update.message.reply_text("重载配置成功", reply_markup=ReplyKeyboardRemove()) - return ConversationHandler.END diff --git a/plugins/admin/refresh_metadata.py b/plugins/admin/refresh_metadata.py deleted file mode 100644 index 557d28a..0000000 --- a/plugins/admin/refresh_metadata.py +++ /dev/null @@ -1,28 +0,0 @@ -from telegram import Update -from telegram.ext import CallbackContext - -from core.plugin import Plugin, handler -from metadata.scripts.honey import update_honey_metadata -from metadata.scripts.metadatas import update_metadata_from_ambr, update_metadata_from_github -from metadata.scripts.paimon_moe import update_paimon_moe_zh -from utils.log import logger - -__all__ = ("MetadataPlugin",) - - -class MetadataPlugin(Plugin): - @handler.command("refresh_metadata", admin=True, block=False) - async def refresh(self, update: Update, _: CallbackContext) -> None: - message = update.effective_message - user = update.effective_user - logger.info("用户 %s[%s] 刷新[bold]metadata[/]缓存命令", user.full_name, user.id, extra={"markup": True}) - - msg = await message.reply_text("正在刷新元数据,请耐心等待...") - logger.info("正在从 github 上获取元数据") - await update_metadata_from_github() - await update_paimon_moe_zh() - logger.info("正在从 ambr 上获取元数据") - await update_metadata_from_ambr() - logger.info("正在从 honey 上获取元数据") - await update_honey_metadata() - await msg.edit_text("正在刷新元数据,请耐心等待...\n完成!") diff --git a/plugins/admin/set_command.py b/plugins/admin/set_command.py index 5ea1c5e..bc80101 100644 --- a/plugins/admin/set_command.py +++ b/plugins/admin/set_command.py @@ -21,67 +21,31 @@ class SetCommandPlugin(Plugin): user_command = [ BotCommand("cancel", "取消操作(解决一切玄学问题)"), BotCommand("help_raw", "查看文本帮助"), - # gacha_log 相关 - BotCommand("wish_log", "查看抽卡记录"), - BotCommand("wish_log_import", "导入抽卡记录"), - BotCommand("wish_log_export", "导出抽卡记录"), - BotCommand("wish_log_delete", "删除抽卡记录"), - BotCommand("pay_log", "查看充值记录"), - BotCommand("pay_log_import", "导入充值记录"), - BotCommand("pay_log_export", "导出充值记录"), - BotCommand("pay_log_delete", "删除充值记录"), # Cookie 查询类 - BotCommand("sign", "米游社原神每日签到"), + BotCommand("sign", "米游社绝区零每日签到"), BotCommand("dailynote_tasks", "自动便笺提醒"), # 其他 - BotCommand("hilichurls", "丘丘语字典"), - BotCommand("birthday", "查询角色生日"), BotCommand("setuid", "添加/重设UID"), BotCommand("setcookie", "添加/重设Cookie"), - BotCommand("setdevice", "添加/重设设备"), BotCommand("player", "管理用户绑定玩家"), BotCommand("verify", "手动验证"), - BotCommand("redeem", "(国际服)兑换 Key"), ] group_command = [ # 通用 BotCommand("help", "帮助"), - BotCommand("quiz", f"{config.notice.bot_name}的十万个为什么"), - BotCommand("wish", " 非洲人模拟器(抽卡模拟器)"), - BotCommand("set_wish", "抽卡模拟器定轨"), - BotCommand("calendar", "活动日历"), - # Wiki 类 - BotCommand("weapon", "查询武器"), - BotCommand("strategy", "查询角色攻略"), - BotCommand("material", "角色培养素材查询"), # UID 查询类 BotCommand("stats", "玩家统计查询"), - BotCommand("player_card", "查询角色卡片"), - BotCommand("avatar_board", "角色排名"), - BotCommand("gcsim", "组队伤害计算"), # Cookie 查询类 BotCommand("dailynote", "查询实时便笺"), - BotCommand("ledger", "查询当月旅行札记"), - BotCommand("ledger_history", "查询旅行札记历史记录"), - BotCommand("abyss", "查询深渊战绩"), - BotCommand("abyss_team", "查询深渊推荐配队"), - BotCommand("abyss_history", "查询深渊历史战绩"), - BotCommand("avatars", "查询角色练度"), - BotCommand("reg_time", "账号注册时间"), - BotCommand("daily_material", "今日素材表"), BotCommand("cookies_import", "从其他 BOT 导入账号信息"), BotCommand("cookies_export", "导出账号信息给其他 BOT"), ] admin_command = [ BotCommand("add_admin", "添加管理员"), BotCommand("del_admin", "删除管理员"), - BotCommand("refresh_metadata", "刷新元数据"), - BotCommand("refresh_wiki", "刷新Wiki缓存"), - BotCommand("refresh_map", "刷新地图数据"), BotCommand("save_entry", "保存条目数据"), BotCommand("remove_all_entry", "删除全部条目数据"), BotCommand("sign_all", "全部账号重新签到"), - BotCommand("refresh_all_history", "全部账号刷新历史记录"), BotCommand("send_log", "发送日志"), BotCommand("update", "更新"), BotCommand("set_command", "重设命令"), diff --git a/plugins/admin/wiki.py b/plugins/admin/wiki.py deleted file mode 100644 index 2480ad4..0000000 --- a/plugins/admin/wiki.py +++ /dev/null @@ -1,19 +0,0 @@ -from telegram import Update -from telegram.ext import CallbackContext - -from core.plugin import Plugin, handler -from core.services.wiki.services import WikiService - - -class WikiPlugin(Plugin): - """有关WIKI操作""" - - def __init__(self, wiki_service: WikiService): - self.wiki_service = wiki_service - - @handler.command("refresh_wiki", block=False, admin=True) - async def refresh_wiki(self, update: Update, _: CallbackContext): - message = update.effective_message - await message.reply_text("正在刷新Wiki缓存,请稍等") - await self.wiki_service.refresh_wiki() - await message.reply_text("刷新Wiki缓存成功") diff --git a/plugins/app/inline.py b/plugins/app/inline.py index 5251a6f..1c7c1f6 100644 --- a/plugins/app/inline.py +++ b/plugins/app/inline.py @@ -1,4 +1,3 @@ -import asyncio from typing import Awaitable, Dict, List, cast, Tuple from uuid import uuid4 @@ -17,12 +16,10 @@ from telegram.constants import ParseMode from telegram.error import BadRequest from telegram.ext import CallbackContext, ContextTypes -from core.dependence.assets import AssetsCouldNotFound, AssetsService from core.plugin import Plugin, handler from core.services.cookies import CookiesService from core.services.players import PlayersService from core.services.search.services import SearchServices -from core.services.wiki.services import WikiService from gram_core.config import config from gram_core.plugin.methods.inline_use_data import IInlineUseData from utils.log import logger @@ -33,14 +30,10 @@ class Inline(Plugin): def __init__( self, - wiki_service: WikiService, - assets_service: AssetsService, search_service: SearchServices, cookies_service: CookiesService, players_service: PlayersService, ): - self.assets_service = assets_service - self.wiki_service = wiki_service self.weapons_list: List[Dict[str, str]] = [] self.characters_list: List[Dict[str, str]] = [] self.refresh_task: List[Awaitable] = [] @@ -51,41 +44,6 @@ class Inline(Plugin): self.inline_use_data_map: Dict[str, IInlineUseData] = {} self.img_url = "https://i.dawnlab.me/b1bdf9cc3061d254f038e557557694bc.jpg" - async def initialize(self): - # todo: 整合进 wiki 或者单独模块 从Redis中读取 - async def task_weapons(): - logger.info("Inline 模块正在获取武器列表") - weapons_list = await self.wiki_service.get_weapons_name_list() - for weapons_name in weapons_list: - try: - icon = await self.assets_service.weapon(weapons_name).get_link("icon") - except AssetsCouldNotFound: - continue - except Exception as exc: - logger.error("获取武器信息失败 %s", str(exc)) - continue - data = {"name": weapons_name, "icon": icon} - self.weapons_list.append(data) - logger.success("Inline 模块获取武器列表成功") - - async def task_characters(): - logger.info("Inline 模块正在获取角色列表") - characters_list = await self.wiki_service.get_characters_name_list() - for character_name in characters_list: - try: - icon = await self.assets_service.avatar(character_name).get_link("icon") - except AssetsCouldNotFound: - continue - except Exception as exc: - logger.error("获取角色信息失败 %s", str(exc)) - continue - data = {"name": character_name, "icon": icon} - self.characters_list.append(data) - logger.success("Inline 模块获取角色列表成功") - - self.refresh_task.append(asyncio.create_task(task_weapons())) - self.refresh_task.append(asyncio.create_task(task_characters())) - async def init_inline_use_data(self): if self.inline_use_data: return @@ -260,19 +218,6 @@ class Inline(Plugin): ), ) ) - elif args[0] == "查看角色培养素材列表并查询": - characters_list = await self.wiki_service.get_characters_name_list() - for role_name in characters_list: - results_list.append( - InlineQueryResultArticle( - id=str(uuid4()), - title=role_name, - description=f"查看角色培养素材列表并查询 {role_name}", - input_message_content=InputTextMessageContent( - f"角色培养素材查询{role_name}", parse_mode=ParseMode.MARKDOWN_V2 - ), - ) - ) else: simple_search_results = await self.search_service.search(args[0]) if simple_search_results: diff --git a/plugins/genshin/abyss.py b/plugins/genshin/abyss.py deleted file mode 100644 index 2325eb4..0000000 --- a/plugins/genshin/abyss.py +++ /dev/null @@ -1,627 +0,0 @@ -"""深渊数据查询""" - -import asyncio -import math -import re -from datetime import datetime -from functools import lru_cache, partial -from typing import Any, Coroutine, List, Optional, Tuple, Union, Dict - -from arkowrapper import ArkoWrapper -from pytz import timezone -from simnet import GenshinClient -from simnet.models.genshin.chronicle.abyss import SpiralAbyss -from telegram import Message, Update, InlineKeyboardButton, InlineKeyboardMarkup -from telegram.constants import ChatAction, ParseMode -from telegram.ext import CallbackContext, filters, ContextTypes - -from core.dependence.assets import AssetsService -from core.plugin import Plugin, handler -from core.services.cookies.error import TooManyRequestPublicCookies -from core.services.history_data.models import HistoryDataAbyss -from core.services.history_data.services import HistoryDataAbyssServices -from core.services.template.models import RenderGroupResult, RenderResult -from core.services.template.services import TemplateService -from gram_core.config import config -from gram_core.dependence.redisdb import RedisDB -from gram_core.plugin.methods.inline_use_data import IInlineUseData -from plugins.tools.genshin import GenshinHelper -from utils.enkanetwork import RedisCache -from utils.log import logger -from utils.uid import mask_number - -try: - import ujson as jsonlib - -except ImportError: - import json as jsonlib - -TZ = timezone("Asia/Shanghai") - -get_args_pattern = re.compile(r"\d+") - - -@lru_cache -def get_args(text: str) -> Tuple[int, bool, bool]: - total = "all" in text or "总览" in text - prev = "pre" in text or "上期" in text - floor = 0 - - if not total: - m = get_args_pattern.search(text) - if m is not None: - floor = int(m.group(0)) - - return floor, total, prev - - -class AbyssUnlocked(Exception): - """根本没动""" - - -class NoMostKills(Exception): - """挑战了但是数据没刷新""" - - -class FloorNotFoundError(Exception): - """只有数据统计,层数统计未出""" - - -class AbyssNotFoundError(Exception): - """如果查询别人,是无法找到队伍详细,只有数据统计""" - - -class AbyssPlugin(Plugin): - """深渊数据查询""" - - def __init__( - self, - template: TemplateService, - helper: GenshinHelper, - assets_service: AssetsService, - history_data_abyss: HistoryDataAbyssServices, - redis: RedisDB, - ): - self.template_service = template - self.helper = helper - self.assets_service = assets_service - self.history_data_abyss = history_data_abyss - self.cache = RedisCache(redis.client, key="plugin:abyss:history") - - @handler.command("abyss", block=False) - @handler.message(filters.Regex(r"^深渊数据"), block=False) - async def command_start(self, update: Update, context: CallbackContext) -> None: # skipcq: PY-R1000 # - user_id = await self.get_real_user_id(update) - uid, offset = self.get_real_uid_or_offset(update) - args = self.get_args(context) - message = update.effective_message - - # 若查询帮助 - if (message.text.startswith("/") and "help" in message.text) or "帮助" in message.text: - await message.reply_text( - "深渊挑战数据功能使用帮助(中括号表示可选参数)\n\n" - "指令格式:\n/abyss + [层数/all] + [pre]\n(pre表示上期)\n\n" - "文本格式:\n深渊数据 + 查询/总览 + [上期] + [层数] \n\n" - "例如以下指令都正确:\n" - "/abyss\n/abyss 12 pre\n/abyss all pre\n" - "深渊数据查询\n深渊数据查询上期第12层\n深渊数据总览上期", - parse_mode=ParseMode.HTML, - ) - self.log_user(update, logger.info, "查询[bold]深渊挑战数据[/bold]帮助", extra={"markup": True}) - return - - # 解析参数 - floor, total, previous = get_args(" ".join([i for i in args if not i.startswith("@")])) - - if floor > 12 or floor < 0: - reply_msg = await message.reply_text("深渊层数输入错误,请重新输入。支持的参数为: 1-12 或 all") - if filters.ChatType.GROUPS.filter(message): - self.add_delete_message_job(reply_msg) - self.add_delete_message_job(message) - return - if 0 < floor < 9: - previous = False - - self.log_user( - update, - logger.info, - "[bold]深渊挑战数据[/bold]请求: floor=%s total=%s previous=%s", - floor, - total, - previous, - extra={"markup": True}, - ) - - await message.reply_chat_action(ChatAction.TYPING) - - reply_text: Optional[Message] = None - - if total: - reply_text = await message.reply_text(f"{config.notice.bot_name}需要时间整理深渊数据,还请耐心等待哦~") - try: - async with self.helper.genshin_or_public(user_id, uid=uid, offset=offset) as client: - if not client.public: - await client.get_record_cards() - abyss_data, avatar_data = await self.get_rendered_pic_data(client, client.player_id, previous) - images = await self.get_rendered_pic(abyss_data, avatar_data, client.player_id, floor, total) - except AbyssUnlocked: # 若深渊未解锁 - await message.reply_text("还未解锁深渊哦~") - return - except NoMostKills: # 若深渊还未挑战 - await message.reply_text("还没有挑战本次深渊呢,咕咕咕~") - return - except FloorNotFoundError: - await message.reply_text("深渊详细数据未找到,咕咕咕~") - return - except AbyssNotFoundError: - await message.reply_text("无法查询玩家挑战队伍详情,只能查询统计详情哦~") - return - except TooManyRequestPublicCookies: - reply_message = await message.reply_text("查询次数太多,请您稍后重试") - if filters.ChatType.GROUPS.filter(message): - self.add_delete_message_job(reply_message) - self.add_delete_message_job(message) - return - finally: - if reply_text is not None: - await reply_text.delete() - - if images is None: - await message.reply_text(f"还没有第 {floor} 层的挑战数据") - return - - await message.reply_chat_action(ChatAction.UPLOAD_PHOTO) - - for group in ArkoWrapper(images).group(10): # 每 10 张图片分一个组 - await RenderGroupResult(results=group).reply_media_group(message, write_timeout=60) - - self.log_user(update, logger.info, "[bold]深渊挑战数据[/bold]: 成功发送图片", extra={"markup": True}) - - async def get_rendered_pic_data( - self, client: GenshinClient, uid: int, previous: bool - ) -> Tuple["SpiralAbyss", Dict[int, int]]: - abyss_data = await client.get_genshin_spiral_abyss(uid, previous=previous, lang="zh-cn") - avatar_data = {} - if not client.public: # noqa - avatars = await client.get_genshin_characters(uid, lang="zh-cn") - avatar_data = {i.id: i.constellation for i in avatars} - if abyss_data.unlocked and abyss_data.ranks.most_kills: - await self.save_abyss_data(self.history_data_abyss, uid, abyss_data, avatar_data) - return abyss_data, avatar_data - - async def get_rendered_pic( # skipcq: PY-R1000 # - self, abyss_data: "SpiralAbyss", avatar_data: Dict[int, int], uid: int, floor: int, total: bool - ) -> Union[Tuple[Any], List[RenderResult], None]: - """ - 获取渲染后的图片 - - Args: - abyss_data (SpiralAbyss): 深渊数据 - avatar_data (Dict[int, int]): 角色数据 - uid (int): 需要查询的 uid - floor (int): 层数 - total (bool): 是否为总览 - - Returns: - bytes格式的图片 - """ - - def json_encoder(value): - if isinstance(value, datetime): - return value.astimezone(TZ).strftime("%Y-%m-%d %H:%M:%S") - return value - - if not abyss_data.unlocked: - raise AbyssUnlocked - if not abyss_data.ranks.most_kills: - raise NoMostKills - if (total or (floor > 0)) and len(abyss_data.floors) == 0: - raise FloorNotFoundError - if (total or (floor > 0)) and len(abyss_data.floors[0].chambers[0].battles) == 0: - raise AbyssNotFoundError - - start_time = abyss_data.start_time.astimezone(TZ) - time = start_time.strftime("%Y年%m月") + ("上" if start_time.day <= 15 else "下") - stars = [i.stars for i in filter(lambda x: x.floor > 8, abyss_data.floors)] - total_stars = f"{sum(stars)} ({'-'.join(map(str, stars))})" - - render_data = {} - result = abyss_data.json(encoder=json_encoder) - - render_data["time"] = time - render_data["stars"] = total_stars - render_data["uid"] = mask_number(uid) - render_data["floor_colors"] = { - 1: "#374952", - 2: "#374952", - 3: "#55464B", - 4: "#55464B", - 5: "#55464B", - 6: "#1D2A5D", - 7: "#1D2A5D", - 8: "#1D2A5D", - 9: "#292B58", - 10: "#382024", - 11: "#252550", - 12: "#1D2A4A", - } - - if total: - render_data["avatar_data"] = avatar_data - data = jsonlib.loads(result) - render_data["data"] = data - - render_inputs: List[Tuple[int, Coroutine[Any, Any, RenderResult]]] = [] - - def overview_task(): - return -1, self.template_service.render( - "genshin/abyss/overview.jinja2", render_data, viewport={"width": 750, "height": 580} - ) - - def floor_task(floor_index: int): - floor_d = data["floors"][floor_index] - return ( - floor_d["floor"], - self.template_service.render( - "genshin/abyss/floor.jinja2", - { - **render_data, - "floor": floor_d, - "total_stars": f"{floor_d['stars']}/{floor_d['max_stars']}", - }, - viewport={"width": 690, "height": 500}, - full_page=True, - ttl=15 * 24 * 60 * 60, - ), - ) - - render_inputs.append(overview_task()) - - for i, f in enumerate(data["floors"]): - if f["floor"] >= 9: - render_inputs.append(floor_task(i)) - - render_group_inputs = list(map(lambda x: x[1], sorted(render_inputs, key=lambda x: x[0]))) - - return await asyncio.gather(*render_group_inputs) - - if floor < 1: - render_data["data"] = jsonlib.loads(result) - return [ - await self.template_service.render( - "genshin/abyss/overview.jinja2", render_data, viewport={"width": 750, "height": 580} - ) - ] - num_dic = { - "0": "", - "1": "一", - "2": "二", - "3": "三", - "4": "四", - "5": "五", - "6": "六", - "7": "七", - "8": "八", - "9": "九", - } - if num := num_dic.get(str(floor)): - render_data["floor-num"] = num - else: - render_data["floor-num"] = f"十{num_dic.get(str(floor % 10))}" - floors = jsonlib.loads(result)["floors"] - if not (floor_data := list(filter(lambda x: x["floor"] == floor, floors))): - return None - render_data["avatar_data"] = avatar_data - render_data["floor"] = floor_data[0] - render_data["total_stars"] = f"{floor_data[0]['stars']}/{floor_data[0]['max_stars']}" - return [ - await self.template_service.render( - "genshin/abyss/floor.jinja2", render_data, viewport={"width": 690, "height": 500} - ) - ] - - @staticmethod - async def save_abyss_data( - history_data_abyss: "HistoryDataAbyssServices", - uid: int, - abyss_data: "SpiralAbyss", - character_data: Dict[int, int], - ) -> bool: - model = history_data_abyss.create(uid, abyss_data, character_data) - old_data = await history_data_abyss.get_by_user_id_data_id(uid, model.data_id) - exists = history_data_abyss.exists_data(model, old_data) - if not exists: - await history_data_abyss.add(model) - return True - return False - - async def get_abyss_data(self, uid: int): - return await self.history_data_abyss.get_by_user_id(uid) - - @staticmethod - def get_season_data_name(data: "HistoryDataAbyss"): - start_time = data.abyss_data.start_time.astimezone(TZ) - time = start_time.strftime("%Y.%m ")[2:] + ("上" if start_time.day <= 15 else "下") - honor = "" - if data.abyss_data.total_stars == 36: - if data.abyss_data.total_battles == 12: - honor = "👑" - last_battles = data.abyss_data.floors[-1].chambers[-1].battles - num_of_characters = max( - len(last_battles[0].characters), - len(last_battles[1].characters), - ) - if num_of_characters == 2: - honor = "双通" - elif num_of_characters == 1: - honor = "单通" - - return f"{time} {data.abyss_data.total_stars} ★ {honor}" - - async def get_session_button_data(self, user_id: int, uid: int, force: bool = False): - redis = await self.cache.get(str(uid)) - if redis and not force: - return redis["buttons"] - data = await self.get_abyss_data(uid) - data.sort(key=lambda x: x.id, reverse=True) - abyss_data = [HistoryDataAbyss.from_data(i) for i in data] - buttons = [ - { - "name": AbyssPlugin.get_season_data_name(abyss_data[idx]), - "value": f"get_abyss_history|{user_id}|{uid}|{value.id}", - } - for idx, value in enumerate(data) - ] - await self.cache.set(str(uid), {"buttons": buttons}) - return buttons - - async def gen_season_button( - self, - user_id: int, - uid: int, - page: int = 1, - ) -> List[List[InlineKeyboardButton]]: - """生成按钮""" - data = await self.get_session_button_data(user_id, uid) - if not data: - return [] - buttons = [ - InlineKeyboardButton( - value["name"], - callback_data=value["value"], - ) - for value in data - ] - all_buttons = [buttons[i : i + 3] for i in range(0, len(buttons), 3)] - send_buttons = all_buttons[(page - 1) * 5 : page * 5] - last_page = page - 1 if page > 1 else 0 - all_page = math.ceil(len(all_buttons) / 5) - next_page = page + 1 if page < all_page and all_page > 1 else 0 - last_button = [] - if last_page: - last_button.append( - InlineKeyboardButton( - "<< 上一页", - callback_data=f"get_abyss_history|{user_id}|{uid}|p_{last_page}", - ) - ) - if last_page or next_page: - last_button.append( - InlineKeyboardButton( - f"{page}/{all_page}", - callback_data=f"get_abyss_history|{user_id}|{uid}|empty_data", - ) - ) - if next_page: - last_button.append( - InlineKeyboardButton( - "下一页 >>", - callback_data=f"get_abyss_history|{user_id}|{uid}|p_{next_page}", - ) - ) - if last_button: - send_buttons.append(last_button) - return send_buttons - - @staticmethod - async def gen_floor_button( - data_id: int, - abyss_data: "HistoryDataAbyss", - user_id: int, - uid: int, - ) -> List[List[InlineKeyboardButton]]: - floors = [i.floor for i in abyss_data.abyss_data.floors if i.floor] - floors.sort() - buttons = [ - InlineKeyboardButton( - f"第 {i} 层", - callback_data=f"get_abyss_history|{user_id}|{uid}|{data_id}|{i}", - ) - for i in floors - ] - send_buttons = [buttons[i : i + 4] for i in range(0, len(buttons), 4)] - all_buttons = [ - InlineKeyboardButton( - "<< 返回", - callback_data=f"get_abyss_history|{user_id}|{uid}|p_1", - ), - InlineKeyboardButton( - "总览", - callback_data=f"get_abyss_history|{user_id}|{uid}|{data_id}|total", - ), - InlineKeyboardButton( - "所有", - callback_data=f"get_abyss_history|{user_id}|{uid}|{data_id}|all", - ), - ] - send_buttons.append(all_buttons) - return send_buttons - - @handler.command("abyss_history", block=False) - @handler.message(filters.Regex(r"^深渊历史数据"), block=False) - async def abyss_history_command_start(self, update: Update, _: CallbackContext) -> None: - user_id = await self.get_real_user_id(update) - uid, offset = self.get_real_uid_or_offset(update) - message = update.effective_message - self.log_user(update, logger.info, "查询深渊历史数据") - - async with self.helper.genshin_or_public(user_id, uid=uid, offset=offset) as client: - await self.get_session_button_data(user_id, client.player_id, force=True) - buttons = await self.gen_season_button(user_id, client.player_id) - if not buttons: - await message.reply_text("还没有深渊历史数据哦~") - return - await message.reply_text("请选择要查询的深渊历史数据", reply_markup=InlineKeyboardMarkup(buttons)) - - async def get_abyss_history_page(self, update: "Update", user_id: int, uid: int, result: str): - """翻页处理""" - callback_query = update.callback_query - - self.log_user(update, logger.info, "切换深渊历史数据页 page[%s]", result) - page = int(result.split("_")[1]) - async with self.helper.genshin_or_public(user_id, uid=uid) as client: - buttons = await self.gen_season_button(user_id, client.player_id, page) - if not buttons: - await callback_query.answer("还没有深渊历史数据哦~", show_alert=True) - await callback_query.edit_message_text("还没有深渊历史数据哦~") - return - await callback_query.edit_message_reply_markup(reply_markup=InlineKeyboardMarkup(buttons)) - await callback_query.answer(f"已切换到第 {page} 页", show_alert=False) - - async def get_abyss_history_season(self, update: "Update", data_id: int): - """进入选择层数""" - callback_query = update.callback_query - user = callback_query.from_user - - self.log_user(update, logger.info, "切换深渊历史数据到层数页 data_id[%s]", data_id) - data = await self.history_data_abyss.get_by_id(data_id) - if not data: - await callback_query.answer("数据不存在,请尝试重新发送命令~", show_alert=True) - await callback_query.edit_message_text("数据不存在,请尝试重新发送命令~") - return - abyss_data = HistoryDataAbyss.from_data(data) - buttons = await self.gen_floor_button(data_id, abyss_data, user.id, data.user_id) - await callback_query.edit_message_reply_markup(reply_markup=InlineKeyboardMarkup(buttons)) - await callback_query.answer("已切换到层数页", show_alert=False) - - async def get_abyss_history_floor(self, update: "Update", data_id: int, detail: str): - """渲染层数数据""" - callback_query = update.callback_query - message = callback_query.message - reply = None - if message.reply_to_message: - reply = message.reply_to_message - - floor = 0 - total = False - if detail == "total": - floor = 0 - elif detail == "all": - total = True - else: - floor = int(detail) - data = await self.history_data_abyss.get_by_id(data_id) - if not data: - await callback_query.answer("数据不存在,请尝试重新发送命令", show_alert=True) - await callback_query.edit_message_text("数据不存在,请尝试重新发送命令~") - return - abyss_data = HistoryDataAbyss.from_data(data) - - images = await self.get_rendered_pic( - abyss_data.abyss_data, abyss_data.character_data, data.user_id, floor, total - ) - if images is None: - await callback_query.answer(f"还没有第 {floor} 层的挑战数据", show_alert=True) - return - await callback_query.answer("正在渲染图片中 请稍等 请不要重复点击按钮", show_alert=False) - - await message.reply_chat_action(ChatAction.UPLOAD_PHOTO) - - for group in ArkoWrapper(images).group(10): # 每 10 张图片分一个组 - await RenderGroupResult(results=group).reply_media_group(reply or message, write_timeout=60) - self.log_user(update, logger.info, "[bold]深渊挑战数据[/bold]: 成功发送图片", extra={"markup": True}) - self.add_delete_message_job(message, delay=1) - - @handler.callback_query(pattern=r"^get_abyss_history\|", block=False) - async def get_abyss_history(self, update: "Update", _: "ContextTypes.DEFAULT_TYPE") -> None: - callback_query = update.callback_query - user = callback_query.from_user - - async def get_abyss_history_callback( - callback_query_data: str, - ) -> Tuple[str, str, int, int]: - _data = callback_query_data.split("|") - _user_id = int(_data[1]) - _uid = int(_data[2]) - _result = _data[3] - _detail = _data[4] if len(_data) > 4 else None - logger.debug( - "callback_query_data函数返回 detail[%s] result[%s] user_id[%s] uid[%s]", - _detail, - _result, - _user_id, - _uid, - ) - return _detail, _result, _user_id, _uid - - detail, result, user_id, uid = await get_abyss_history_callback(callback_query.data) - if user.id != user_id: - await callback_query.answer(text="这不是你的按钮!\n" + config.notice.user_mismatch, show_alert=True) - return - if result == "empty_data": - await callback_query.answer(text="此按钮不可用", show_alert=True) - return - if result.startswith("p_"): - await self.get_abyss_history_page(update, user_id, uid, result) - return - data_id = int(result) - if detail: - await self.get_abyss_history_floor(update, data_id, detail) - return - await self.get_abyss_history_season(update, data_id) - - async def abyss_use_by_inline(self, update: "Update", context: "ContextTypes.DEFAULT_TYPE", previous: bool): - callback_query = update.callback_query - user = update.effective_user - user_id = user.id - uid = IInlineUseData.get_uid_from_context(context) - - self.log_user(update, logger.info, "查询深渊挑战总览数据 previous[%s]", previous) - notice = None - try: - async with self.helper.genshin_or_public(user_id, uid=uid) as client: - if not client.public: - await client.get_record_cards() - abyss_data, avatar_data = await self.get_rendered_pic_data(client, client.player_id, previous) - images = await self.get_rendered_pic(abyss_data, avatar_data, client.player_id, 0, False) - image = images[0] - except AbyssUnlocked: # 若深渊未解锁 - notice = "还未解锁深渊哦~" - except NoMostKills: # 若深渊还未挑战 - notice = "还没有挑战本次深渊呢,咕咕咕~" - except AbyssNotFoundError: - notice = "无法查询玩家挑战队伍详情,只能查询统计详情哦~" - except TooManyRequestPublicCookies: - notice = "查询次数太多,请您稍后重试" - - if notice: - await callback_query.answer(notice, show_alert=True) - return - - await image.edit_inline_media(callback_query) - - async def get_inline_use_data(self) -> List[Optional[IInlineUseData]]: - return [ - IInlineUseData( - text="本期深渊挑战总览", - hash="abyss_current", - callback=partial(self.abyss_use_by_inline, previous=False), - player=True, - ), - IInlineUseData( - text="上期深渊挑战总览", - hash="abyss_previous", - callback=partial(self.abyss_use_by_inline, previous=True), - player=True, - ), - ] diff --git a/plugins/genshin/abyss_team.py b/plugins/genshin/abyss_team.py deleted file mode 100644 index c8787a6..0000000 --- a/plugins/genshin/abyss_team.py +++ /dev/null @@ -1,132 +0,0 @@ -"""Recommend teams for Spiral Abyss""" - -import re - -from telegram import Update -from telegram.constants import ChatAction, ParseMode -from telegram.ext import CallbackContext, filters - -from core.dependence.assets import AssetsService -from core.plugin import Plugin, handler -from core.services.template.services import TemplateService -from metadata.genshin import AVATAR_DATA -from metadata.shortname import idToName -from modules.apihelper.client.components.abyss import AbyssTeam as AbyssTeamClient -from plugins.tools.genshin import GenshinHelper -from utils.log import logger - - -class AbyssTeamPlugin(Plugin): - """Recommend teams for Spiral Abyss""" - - def __init__( - self, - template: TemplateService, - helper: GenshinHelper, - assets_service: AssetsService, - ): - self.template_service = template - self.helper = helper - self.team_data = AbyssTeamClient() - self.assets_service = assets_service - - @handler.command("abyss_team", block=False) - @handler.message(filters.Regex(r"^深渊配队"), block=False) - async def command_start(self, update: Update, _: CallbackContext) -> None: # skipcq: PY-R1000 # - user_id = await self.get_real_user_id(update) - uid, offset = self.get_real_uid_or_offset(update) - message = update.effective_message - - if "help" in message.text or "帮助" in message.text: - await message.reply_text( - "深渊配队推荐功能使用帮助(中括号表示可选参数)\n\n" - "指令格式:\n/abyss_team [n=配队数]\n(pre表示上期)\n\n" - "文本格式:\n深渊配队 [n=配队数] \n\n" - "如:\n" - "/abyss_team\n/abyss_team n=5\n" - "深渊配队\n", - parse_mode=ParseMode.HTML, - ) - self.log_user(update, logger.info, "查询[bold]深渊配队推荐[/bold]帮助", extra={"markup": True}) - return - - self.log_user(update, logger.info, "[bold]深渊配队推荐[/bold]请求", extra={"markup": True}) - - client = await self.helper.get_genshin_client(user_id, player_id=uid, offset=offset) - - await message.reply_chat_action(ChatAction.TYPING) - team_data = await self.team_data.get_data() - - # Set of uids - characters = {c.id for c in await client.get_genshin_characters(client.player_id)} - - teams = { - "Up": [], - "Down": [], - } - - # All of the effective and available teams - for lane in ["Up", "Down"]: - for a_team in team_data[12 - 9][lane]: - t_characters = [int(s) for s in re.findall(r"\d+", a_team["Item"])] - t_rate = a_team["Rate"] - - # Check availability - if not all(c in characters for c in t_characters): - continue - - teams[lane].append( - { - "Characters": t_characters, - "Rate": t_rate, - } - ) - - # If a number is specified, use it as the number of expected teams. - match = re.search(r"(?<=n=)\d+", message.text) - n_team = int(match.group()) if match is not None else 4 - - if "fast" in message.text: - # TODO: Give it a faster method? - # Maybe we can allow characters exist on both side. - return - - # Otherwise, we'd find a team in a complexity - # O(len(teams[up]) * len(teams[down])) - - abyss_teams_data = {"uid": client.player_id, "teams": []} - - async def _get_render_data(id_list): - return [ - { - "icon": (await self.assets_service.avatar(cid).icon()).as_uri(), - "name": idToName(cid), - "star": AVATAR_DATA[str(cid)]["rank"] if cid not in {10000005, 10000007} else 5, - "hava": True, - } - for cid in id_list - ] - - for u in teams["Up"]: - for d in teams["Down"]: - if not all(c not in d["Characters"] for c in u["Characters"]): - continue - team = { - "Up": await _get_render_data(u["Characters"]), - "UpRate": u["Rate"], - "Down": await _get_render_data(d["Characters"]), - "DownRate": d["Rate"], - } - abyss_teams_data["teams"].append(team) - abyss_teams_data["teams"].sort(key=lambda t: t["UpRate"] * t["DownRate"], reverse=True) - abyss_teams_data["teams"] = abyss_teams_data["teams"][0 : min(n_team, len(abyss_teams_data["teams"]))] - - await message.reply_chat_action(ChatAction.UPLOAD_PHOTO) - render_result = await self.template_service.render( - "genshin/abyss_team/abyss_team.jinja2", - abyss_teams_data, - {"width": 785, "height": 800}, - full_page=True, - query_selector=".bg-contain", - ) - await render_result.reply_photo(message, filename=f"abyss_team_{user_id}.png") diff --git a/plugins/genshin/akasha.py b/plugins/genshin/akasha.py deleted file mode 100644 index 7301833..0000000 --- a/plugins/genshin/akasha.py +++ /dev/null @@ -1,120 +0,0 @@ -from typing import TYPE_CHECKING, Optional - -from telegram.constants import ChatAction -from telegram.ext import filters - -from core.dependence.assets import AssetsService -from core.plugin import Plugin, handler -from core.services.template.models import FileType -from core.services.template.services import TemplateService -from gram_core.services.players import PlayersService -from metadata.genshin import AVATAR_DATA -from metadata.shortname import roleToName, roleToId -from modules.apihelper.client.components.akasha import Akasha -from utils.log import logger - -if TYPE_CHECKING: - from telegram import Update - from telegram.ext import ContextTypes - - -class AkashaPlugin(Plugin): - """Akasha 数据排行""" - - def __init__( - self, - assets_service: AssetsService = None, - template_service: TemplateService = None, - player_service: PlayersService = None, - ) -> None: - self.assets_service = assets_service - self.template_service = template_service - self.player_service = player_service - - async def get_user_uid(self, user_id: int, uid: int, offset: int) -> Optional[int]: - player = await self.player_service.get(user_id, player_id=uid, offset=offset) - if player is None: - return None - return player.player_id - - @staticmethod - async def get_leaderboard_data(character_id: int, uid: int = None): - akasha = Akasha() - categories = await akasha.get_leaderboard_categories(character_id) - if len(categories) == 0 or len(categories[0].weapons) == 0: - raise NotImplementedError - calculation_id = categories[0].weapons[0].calculationId - count = categories[0].count - data = await akasha.get_leaderboard(calculation_id) - if len(data) == 0: - raise NotImplementedError - user_data = [] - if uid: - user_data = await akasha.get_leaderboard(calculation_id, uid) - if len(user_data) == 0: - data = [data] - else: - data = [user_data, data] - return data, count - - async def get_avatar_board_render_data(self, character: str, uid: int): - character_id = roleToId(character) - if not character_id: - raise NotImplementedError - try: - name_card = (await self.assets_service.namecard(character_id).navbar()).as_uri() - avatar = (await self.assets_service.avatar(character_id).icon()).as_uri() - except KeyError: - logger.warning("未找到角色 %s 的角色名片/头像", character_id) - name_card = None - avatar = None - rarity = 5 - try: - rarity = {k: v["rank"] for k, v in AVATAR_DATA.items()}[str(character_id)] - except KeyError: - logger.warning("未找到角色 %s 的星级", character_id) - akasha_data, count = await self.get_leaderboard_data(character_id, uid) - return { - "character": character, # 角色名 - "avatar": avatar, # 角色头像 - "namecard": name_card, # 角色名片 - "rarity": rarity, # 角色稀有度 - "count": count, - "all_data": akasha_data, - } - - @handler.command("avatar_board", block=False) - @handler.message(filters.Regex(r"^角色排名(.*)$"), block=False) - async def avatar_board(self, update: "Update", context: "ContextTypes.DEFAULT_TYPE"): - user_id = await self.get_real_user_id(update) - message = update.effective_message - args = self.get_args(context) - if len(args) == 0: - reply_message = await message.reply_text("请指定要查询的角色") - if filters.ChatType.GROUPS.filter(reply_message): - self.add_delete_message_job(message) - self.add_delete_message_job(reply_message) - return - avatar_name = roleToName(args[0]) - uid, offset = self.get_real_uid_or_offset(update) - uid = await self.get_user_uid(user_id, uid, offset) - try: - render_data = await self.get_avatar_board_render_data(avatar_name, uid) - except NotImplementedError: - reply_message = await message.reply_text("暂不支持该角色,或者角色名称错误") - if filters.ChatType.GROUPS.filter(reply_message): - self.add_delete_message_job(message) - self.add_delete_message_job(reply_message) - return - await message.reply_chat_action(ChatAction.UPLOAD_PHOTO) - - image = await self.template_service.render( - "genshin/akasha/char_rank.jinja2", - render_data, - viewport={"width": 1040, "height": 500}, - full_page=True, - query_selector=".container", - file_type=FileType.PHOTO, - ttl=24 * 60 * 60, - ) - await image.reply_photo(message) diff --git a/plugins/genshin/avatar_list.py b/plugins/genshin/avatar_list.py deleted file mode 100644 index de98e8a..0000000 --- a/plugins/genshin/avatar_list.py +++ /dev/null @@ -1,270 +0,0 @@ -import asyncio -import math -from typing import List, Optional, Sequence, TYPE_CHECKING, Union, Tuple, Any, Dict - -from arkowrapper import ArkoWrapper -from simnet import GenshinClient -from simnet.errors import BadRequest as SimnetBadRequest -from simnet.models.genshin.calculator import CalculatorTalent, CalculatorCharacterDetails -from simnet.models.genshin.chronicle.characters import Character -from telegram.constants import ChatAction -from telegram.ext import filters - -from core.config import config -from core.dependence.assets import AssetsService -from core.plugin import Plugin, handler -from core.services.cookies import CookiesService -from core.services.players import PlayersService -from core.services.players.services import PlayerInfoService -from core.services.template.models import FileType -from core.services.template.services import TemplateService -from gram_core.plugin.methods.inline_use_data import IInlineUseData -from gram_core.services.template.models import RenderGroupResult -from modules.wiki.base import Model -from plugins.tools.genshin import CharacterDetails, GenshinHelper -from plugins.tools.player_info import PlayerInfoSystem -from utils.log import logger -from utils.uid import mask_number - -if TYPE_CHECKING: - from telegram import Update - from telegram.ext import ContextTypes - from gram_core.services.template.models import RenderResult - -MAX_AVATAR_COUNT = 40 - - -class TooManyRequests(Exception): - """请求过多""" - - -class SkillData(Model): - """天赋数据""" - - skill: CalculatorTalent - buffed: bool = False - """是否得到了命座加成""" - - -class AvatarData(Model): - avatar: Character - detail: CalculatorCharacterDetails - icon: str - weapon: Optional[str] - skills: List[SkillData] - - def sum_of_skills(self) -> int: - total_level = 0 - for skill_data in self.skills: - total_level += skill_data.skill.level - return total_level - - -class AvatarListPlugin(Plugin): - """练度统计""" - - def __init__( - self, - player_service: PlayersService = None, - cookies_service: CookiesService = None, - assets_service: AssetsService = None, - template_service: TemplateService = None, - helper: GenshinHelper = None, - character_details: CharacterDetails = None, - player_info_service: PlayerInfoService = None, - player_info_system: PlayerInfoSystem = None, - ) -> None: - self.cookies_service = cookies_service - self.assets_service = assets_service - self.template_service = template_service - self.helper = helper - self.character_details = character_details - self.player_service = player_service - self.player_info_service = player_info_service - self.player_info_system = player_info_system - - async def get_avatar_data(self, character: Character, client: "GenshinClient") -> Optional["AvatarData"]: - detail = await self.character_details.get_character_details(client, character) - if detail is None: - return None - if character.id == 10000005: # 针对男草主 - talents = [] - for talent in detail.talents: - if "普通攻击" in talent.name: - talent.Config.allow_mutation = True - # noinspection Pydantic - talent.group_id = 1131 - if talent.type in ["attack", "skill", "burst"]: - talents.append(talent) - else: - talents = [t for t in detail.talents if t.type in ["attack", "skill", "burst"]] - buffed_talents = [] - for constellation in filter(lambda x: x.pos in [3, 5], character.constellations[: character.constellation]): - if result := list( - filter(lambda x: all([x.name in constellation.effect]), talents) # pylint: disable=W0640 - ): - buffed_talents.append(result[0].type) - return AvatarData( - avatar=character, - detail=detail, - icon=(await self.assets_service.avatar(character.id).side()).as_uri(), - weapon=( - await self.assets_service.weapon(character.weapon.id).__getattr__( - "icon" if character.weapon.ascension < 2 else "awaken" - )() - ).as_uri(), - skills=[ - SkillData(skill=s, buffed=s.type in buffed_talents) - for s in sorted(talents, key=lambda x: ["attack", "skill", "burst"].index(x.type)) - ], - ) - - async def get_avatars_data( - self, characters: Sequence[Character], client: "GenshinClient", max_length: int = None - ) -> List["AvatarData"]: - async def _task(c): - return await self.get_avatar_data(c, client) - - task_results = await asyncio.gather(*[_task(character) for character in characters]) - - return sorted( - list(filter(lambda x: x, task_results)), - key=lambda x: ( - x.avatar.level, - x.avatar.rarity, - x.sum_of_skills(), - x.avatar.constellation, - # TODO 如果加入武器排序条件,需要把武器转化为图片url的处理后置 - # x.weapon.level, - # x.weapon.rarity, - # x.weapon.refinement, - x.avatar.friendship, - ), - reverse=True, - )[:max_length] - - async def avatar_list_render( - self, - base_render_data: Dict, - avatar_datas: List[AvatarData], - only_one_page: bool, - ) -> Union[Tuple[Any], List["RenderResult"], None]: - def render_task(start_id: int, c: List[AvatarData]): - _render_data = { - "avatar_datas": c, # 角色数据 - "start_id": start_id, # 开始序号 - } - _render_data.update(base_render_data) - return self.template_service.render( - "genshin/avatar_list/main.jinja2", - _render_data, - viewport={"width": 1040, "height": 500}, - full_page=True, - query_selector=".container", - file_type=FileType.PHOTO, - ttl=30 * 24 * 60 * 60, - ) - - if only_one_page: - return [await render_task(0, avatar_datas)] - image_count = len(avatar_datas) - while image_count > MAX_AVATAR_COUNT: - image_count /= 2 - image_count = math.ceil(image_count) - avatar_datas_group = [avatar_datas[i : i + image_count] for i in range(0, len(avatar_datas), image_count)] - tasks = [render_task(i * image_count, c) for i, c in enumerate(avatar_datas_group)] - return await asyncio.gather(*tasks) - - async def render( - self, client: "GenshinClient", user_id: int, user_name: str, all_avatars: bool = False - ) -> List["RenderResult"]: - characters = await client.get_genshin_characters(client.player_id) - avatar_datas: List[AvatarData] = await self.get_avatars_data( - characters, client, None if all_avatars else MAX_AVATAR_COUNT - ) - if not avatar_datas: - raise TooManyRequests() - name_card, avatar, nickname, rarity = await self.player_info_system.get_player_info( - client.player_id, user_id, user_name - ) - base_render_data = { - "uid": mask_number(client.player_id), # 玩家uid - "nickname": nickname, # 玩家昵称 - "avatar": avatar, # 玩家头像 - "rarity": rarity, # 玩家头像对应的角色星级 - "namecard": name_card, # 玩家名片 - "has_more": len(characters) != len(avatar_datas), # 是否显示了全部角色 - } - - return await self.avatar_list_render(base_render_data, avatar_datas, not all_avatars) - - @handler.command("avatars", cookie=True, block=False) - @handler.message(filters.Regex(r"^(全部)?练度统计$"), cookie=True, block=False) - async def avatar_list(self, update: "Update", _: "ContextTypes.DEFAULT_TYPE"): - user_id = await self.get_real_user_id(update) - user_name = self.get_real_user_name(update) - uid, offset = self.get_real_uid_or_offset(update) - message = update.effective_message - all_avatars = "全部" in message.text or "all" in message.text # 是否发送全部角色 - - self.log_user(update, logger.info, "[bold]练度统计[/bold]: all=%s", all_avatars, extra={"markup": True}) - try: - async with self.helper.genshin(user_id, player_id=uid, offset=offset) as client: - notice = await message.reply_text(f"{config.notice.bot_name}需要收集整理数据,还请耐心等待哦~") - self.add_delete_message_job(notice, delay=60) - await message.reply_chat_action(ChatAction.TYPING) - images = await self.render(client, user_id, user_name, all_avatars) - except TooManyRequests: - reply_message = await message.reply_html("服务器熟啦 ~ 请稍后再试") - self.add_delete_message_job(reply_message, delay=20) - return - except SimnetBadRequest as e: - if e.ret_code == -502002: - reply_message = await message.reply_html("请先在米游社中使用一次养成计算器后再使用此功能~") - self.add_delete_message_job(reply_message, delay=20) - return - raise e - - await message.reply_chat_action(ChatAction.UPLOAD_PHOTO) - - for group in ArkoWrapper(images).group(10): # 每 10 张图片分一个组 - await RenderGroupResult(results=group).reply_media_group(message, write_timeout=60) - - self.log_user( - update, - logger.info, - "[bold]练度统计[/bold]发送图片成功", - extra={"markup": True}, - ) - - async def avatar_list_use_by_inline(self, update: "Update", context: "ContextTypes.DEFAULT_TYPE") -> None: - callback_query = update.callback_query - user_id = await self.get_real_user_id(update) - user_name = self.get_real_user_name(update) - uid = IInlineUseData.get_uid_from_context(context) - self.log_user(update, logger.info, "查询练度统计") - - try: - async with self.helper.genshin(user_id, player_id=uid) as client: - images = await self.render(client, user_id, user_name) - render = images[0] - except TooManyRequests: - await callback_query.answer("服务器熟啦 ~ 请稍后再试", show_alert=True) - return - except SimnetBadRequest as e: - if e.ret_code == -502002: - await callback_query.answer("请先在米游社中使用一次养成计算器后再使用此功能~", show_alert=True) - return - raise e - await render.edit_inline_media(callback_query) - - async def get_inline_use_data(self) -> List[Optional[IInlineUseData]]: - return [ - IInlineUseData( - text="练度统计", - hash="avatar_list", - callback=self.avatar_list_use_by_inline, - cookie=True, - player=True, - ) - ] diff --git a/plugins/genshin/birthday.py b/plugins/genshin/birthday.py deleted file mode 100644 index 3457180..0000000 --- a/plugins/genshin/birthday.py +++ /dev/null @@ -1,85 +0,0 @@ -import re -from typing import TYPE_CHECKING - -from telegram.ext import filters - -from core.plugin import Plugin, handler -from core.services.cookies import CookiesService -from core.services.task.services import TaskCardServices -from core.services.users.services import UserService, UserAdminService -from metadata.genshin import AVATAR_DATA -from metadata.shortname import roleToId, roleToName -from plugins.tools.birthday_card import ( - BirthdayCardSystem, - rm_starting_str, -) -from plugins.tools.genshin import GenshinHelper -from utils.log import logger - -if TYPE_CHECKING: - from telegram import Update - from telegram.ext import ContextTypes - - -class BirthdayPlugin(Plugin): - """Birthday.""" - - def __init__( - self, - user_service: UserService, - helper: GenshinHelper, - cookie_service: CookiesService, - card_system: BirthdayCardSystem, - user_admin_service: UserAdminService, - card_service: TaskCardServices, - ): - """Load Data.""" - self.user_service = user_service - self.cookie_service = cookie_service - self.helper = helper - self.card_system = card_system - self.user_admin_service = user_admin_service - self.card_service = card_service - - @handler.command(command="birthday", block=False) - async def command_start(self, update: "Update", context: "ContextTypes.DEFAULT_TYPE") -> None: - message = update.effective_message - args = self.get_args(context) - if len(args) >= 1: - msg = args[0] - self.log_user(update, logger.info, "查询角色生日命令请求 || 参数 %s", msg) - if re.match(r"\d{1,2}.\d{1,2}", msg): - try: - month = rm_starting_str(re.findall(r"\d+", msg)[0], "0") - day = rm_starting_str(re.findall(r"\d+", msg)[1], "0") - key = f"{month}_{day}" - day_list = self.card_system.birthday_list.get(key, []) - date = f"{month}月{day}日" - text = f"{date} 是 {'、'.join(day_list)} 的生日哦~" if day_list else f"{date} 没有角色过生日哦~" - except IndexError: - text = "请输入正确的日期格式,如1-1,或输入正确的角色名称。" - reply_message = await message.reply_text(text) - - else: - try: - if msg == "派蒙": - text = "派蒙的生日是6月1日哦~" - elif roleToName(msg) == "旅行者": - text = "喂,旅行者!你该不会忘掉自己的生日了吧?" - else: - name = roleToName(msg) - aid = str(roleToId(msg)) - birthday = AVATAR_DATA[aid]["birthday"] - text = f"{name} 的生日是 {birthday[0]}月{birthday[1]}日 哦~" - reply_message = await message.reply_text(text) - except KeyError: - reply_message = await message.reply_text("请输入正确的日期格式,如1-1,或输入正确的角色名称。") - else: - self.log_user(update, logger.info, "查询今日角色生日列表") - today_list = self.card_system.get_today_birthday() - text = f"今天是 {'、'.join(today_list)} 的生日哦~" if today_list else "今天没有角色过生日哦~" - reply_message = await message.reply_text(text) - - if filters.ChatType.GROUPS.filter(reply_message): - self.add_delete_message_job(message) - self.add_delete_message_job(reply_message) diff --git a/plugins/genshin/calendar.py b/plugins/genshin/calendar.py deleted file mode 100644 index 888f93b..0000000 --- a/plugins/genshin/calendar.py +++ /dev/null @@ -1,90 +0,0 @@ -from datetime import datetime, timedelta -from functools import partial -from typing import Dict, List, Optional, TYPE_CHECKING - -from telegram import Update -from telegram.constants import ChatAction -from telegram.ext import CallbackContext, MessageHandler, filters - -from core.dependence.assets import AssetsService -from core.dependence.redisdb import RedisDB -from core.plugin import Plugin, handler -from core.services.template.services import TemplateService -from gram_core.plugin.methods.inline_use_data import IInlineUseData -from modules.apihelper.client.components.calendar import Calendar -from utils.log import logger - -try: - import ujson as jsonlib -except ImportError: - import json as jsonlib - -if TYPE_CHECKING: - from telegram.ext import ContextTypes - from gram_core.services.template.models import RenderResult - - -class CalendarPlugin(Plugin): - """活动日历查询""" - - def __init__( - self, - template_service: TemplateService, - assets_service: AssetsService, - redis: RedisDB, - ): - self.template_service = template_service - self.assets_service = assets_service - self.calendar = Calendar() - self.cache = redis.client - - async def _fetch_data(self) -> Dict: - if data := await self.cache.get("plugin:calendar"): - return jsonlib.loads(data.decode("utf-8")) - data = await self.calendar.get_photo_data(self.assets_service) - now = datetime.now() - next_hour = (now + timedelta(hours=1)).replace(minute=0, second=0, microsecond=0) - await self.cache.set("plugin:calendar", jsonlib.dumps(data, default=lambda x: x.dict()), ex=next_hour - now) - return data - - async def render(self, list_mode: bool) -> "RenderResult": - data = await self._fetch_data() - data["display_mode"] = "list" if list_mode else "calendar" - return await self.template_service.render( - "genshin/calendar/calendar.jinja2", - data, - query_selector=".container", - ) - - @handler.command("calendar", block=False) - @handler(MessageHandler, filters=filters.Regex(r"^(活动)+(日历|日历列表)$"), block=False) - async def command_start(self, update: Update, _: CallbackContext) -> None: - message = update.effective_message - mode = "list" if "列表" in message.text else "calendar" - self.log_user(update, logger.info, "查询日历 | 模式 %s", mode) - await message.reply_chat_action(ChatAction.TYPING) - image = await self.render(mode == "list") - await message.reply_chat_action(ChatAction.UPLOAD_PHOTO) - await image.reply_photo(message) - - async def calendar_use_by_inline(self, update: "Update", _: "ContextTypes.DEFAULT_TYPE", list_mode: bool): - callback_query = update.callback_query - - self.log_user(update, logger.info, "查询日历 | 列表模式 %s", list_mode) - await callback_query.answer("正在查询日历,请耐心等待") - image = await self.render(list_mode) - await image.edit_inline_media(callback_query) - - async def get_inline_use_data(self) -> List[Optional[IInlineUseData]]: - return [ - IInlineUseData( - text="活动日历", - hash="calendar", - callback=partial(self.calendar_use_by_inline, list_mode=False), - ), - IInlineUseData( - text="活动日历列表", - hash="calendar_list", - callback=partial(self.calendar_use_by_inline, list_mode=True), - ), - ] diff --git a/plugins/genshin/daily/material.py b/plugins/genshin/daily/material.py deleted file mode 100644 index cba0efd..0000000 --- a/plugins/genshin/daily/material.py +++ /dev/null @@ -1,790 +0,0 @@ -import asyncio -import typing -from asyncio import Lock -from ctypes import c_double -from datetime import datetime -from functools import partial -from multiprocessing import Value -from os import path -from ssl import SSLZeroReturnError -from time import time as time_ -from typing import TYPE_CHECKING, Dict, Iterable, Iterator, List, Optional, Tuple - -import aiofiles -import aiofiles.os -import bs4 -import pydantic -from arkowrapper import ArkoWrapper -from httpx import AsyncClient, HTTPError, TimeoutException -from pydantic import BaseModel -from simnet.errors import BadRequest as SimnetBadRequest -from simnet.errors import InvalidCookies -from simnet.models.genshin.chronicle.characters import Character -from telegram.constants import ChatAction, ParseMode -from telegram.error import RetryAfter, TimedOut - -from core.config import config -from core.dependence.assets import AssetsCouldNotFound, AssetsService, AssetsServiceType -from core.plugin import Plugin, handler -from core.services.template.models import FileType, RenderGroupResult -from core.services.template.services import TemplateService -from metadata.genshin import AVATAR_DATA, HONEY_DATA -from plugins.tools.genshin import CharacterDetails, CookiesNotFoundError, GenshinHelper, PlayerNotFoundError -from utils.const import DATA_DIR -from utils.log import logger -from utils.uid import mask_number - -if TYPE_CHECKING: - from simnet import GenshinClient - from telegram import Message, Update - from telegram.ext import ContextTypes - -INTERVAL = 1 - -DATA_FILE_PATH = DATA_DIR.joinpath("daily_material.json").resolve() -# fmt: off -# 章节顺序、国家(区域)名是从《足迹》 PV 中取的 -DOMAINS = [ - "忘却之峡", # 蒙德精通秘境 - "太山府", # 璃月精通秘境 - "菫色之庭", # 稻妻精通秘境 - "昏识塔", # 须弥精通秘境 - "苍白的遗荣", # 枫丹精通秘境 - "", # 纳塔精通秘境 - "", # 至东精通秘境 - "", # 坎瑞亚精通秘境 - "塞西莉亚苗圃", # 蒙德炼武秘境 - "震雷连山密宫", # 璃月炼武秘境 - "砂流之庭", # 稻妻炼武秘境 - "有顶塔", # 须弥炼武秘境 - "深潮的余响", # 枫丹炼武秘境 - "", # 纳塔炼武秘境 - "", # 至东炼武秘境 - "", # 坎瑞亚炼武秘境 -] -# fmt: on -DOMAIN_AREA_MAP = dict(zip(DOMAINS, ["蒙德", "璃月", "稻妻", "须弥", "枫丹", "纳塔", "至冬", "坎瑞亚"] * 2)) -# 此处 avatar 和 weapon 需要分别对应 AreaDailyMaterialsData 中的两个 *_materials 字段,具体逻辑见 _parse_honey_impact_source -DOMAIN_TYPE_MAP = dict(zip(DOMAINS, len(DOMAINS) // 2 * ["avatar"] + len(DOMAINS) // 2 * ["weapon"])) - -WEEK_MAP = ["一", "二", "三", "四", "五", "六", "日"] - - -def sort_item(items: List["ItemData"]) -> Iterable["ItemData"]: - """对武器和角色进行排序 - - 排序规则:持有(星级 > 等级 > 命座/精炼) > 未持有(星级 > 等级 > 命座/精炼) - """ - - def key(item: "ItemData"): - # 有个小小的意外逻辑,不影响排序输出,如果要修改可能需要注意下: - # constellation 可以为 None 或 0,此时都会被判断为 False - # 此时 refinment or constellation or -1 都会返回 -1 - # 但不影响排序结果 - return ( - item.level is not None, # 根据持有与未持有进行分组并排序 - item.rarity, # 根据星级分组并排序 - item.refinement or item.constellation or -1, # 根据命座/精炼进行分组并排序 - item.id, # 默认按照物品 ID 进行排序 - ) - - return sorted(items, key=key, reverse=True) - - -def get_material_serial_name(names: Iterable[str]) -> str: - """ - 获取材料的系列名,本质上是求字符串列表的最长子串 - 如:「自由」的教导、「自由」的指引、「自由」的哲学,三者系列名为「『自由』」 - 如:高塔孤王的破瓦、高塔孤王的残垣、高塔孤王的断片、高塔孤王的碎梦,四者系列名为「高塔孤王」 - TODO(xr1s): 感觉可以优化 - """ - - def all_substrings(string: str) -> Iterator[str]: - """获取字符串的所有连续字串""" - length = len(string) - for i in range(length): - for j in range(i + 1, length + 1): - yield string[i:j] - - result = [] - for name_a, name_b in ArkoWrapper(names).repeat(1).group(2).unique(list): - for sub_string in all_substrings(name_a): - if sub_string in ArkoWrapper(all_substrings(name_b)): - result.append(sub_string) - result = ArkoWrapper(result).sort(len, reverse=True)[0] - chars = {"的": 0, "之": 0} - for char, k in chars.items(): - result = result.split(char)[k] - return result - - -class MaterialsData(BaseModel): - __root__: Optional[List[Dict[str, "AreaDailyMaterialsData"]]] = None - - def weekday(self, weekday: int) -> Dict[str, "AreaDailyMaterialsData"]: - if self.__root__ is None: - return {} - return self.__root__[weekday] - - def is_empty(self) -> bool: - return self.__root__ is None - - -class DailyMaterial(Plugin): - """每日素材表""" - - everyday_materials: "MaterialsData" = MaterialsData() - """ - everyday_materials 储存的是一周中每天能刷的素材 ID - 按照如下形式组织 - ```python - everyday_materials[周几][国家] = AreaDailyMaterialsData( - avatar=[角色, 角色, ...], - avatar_materials=[精通素材, 精通素材, 精通素材], - weapon=[武器, 武器, ...] - weapon_materials=[炼武素材, 炼武素材, 炼武素材, 炼武素材], - ) - ``` - """ - - locks: Tuple[Lock, Lock] = (Lock(), Lock()) - """ - Tuple[每日素材缓存锁, 角色武器材料图标锁] - """ - - def __init__( - self, - assets: AssetsService, - template_service: TemplateService, - helper: GenshinHelper, - character_details: CharacterDetails, - ): - self.assets_service = assets - self.template_service = template_service - self.helper = helper - self.character_details = character_details - self.client = AsyncClient() - - async def initialize(self): - """插件在初始化时,会检查一下本地是否缓存了每日素材的数据""" - - async def task_daily(): - async with self.locks[0]: - logger.info("正在开始获取每日素材缓存") - await self._refresh_everyday_materials() - - # 当缓存不存在或已过期(大于 3 天)则重新下载 - # TODO(xr1s): 是不是可以改成 21 天? - if not await aiofiles.os.path.exists(DATA_FILE_PATH): - asyncio.create_task(task_daily()) - else: - mtime = await aiofiles.os.path.getmtime(DATA_FILE_PATH) - mtime = datetime.fromtimestamp(mtime) - elapsed = datetime.now() - mtime - if elapsed.days > 3: - asyncio.create_task(task_daily()) - - # 若存在则直接使用缓存 - if await aiofiles.os.path.exists(DATA_FILE_PATH): - async with aiofiles.open(DATA_FILE_PATH, "rb") as cache: - try: - self.everyday_materials = self.everyday_materials.parse_raw(await cache.read()) - except pydantic.ValidationError: - await aiofiles.os.remove(DATA_FILE_PATH) - asyncio.create_task(task_daily()) - - async def _get_skills_data(self, client: "FragileGenshinClient", character: Character) -> Optional[List[int]]: - if client.damaged: - return None - detail = None - try: - real_client = typing.cast("GenshinClient", client.client) - detail = await self.character_details.get_character_details(real_client, character) - except InvalidCookies: - client.damaged = True - except SimnetBadRequest as e: - if e.ret_code == -502002: - client.damaged = True - raise - if detail is None: - return None - talents = [t for t in detail.talents if t.type in ["attack", "skill", "burst"]] - return [t.level for t in talents] - - async def _get_items_from_user( - self, user_id: int, uid: int, offset: int - ) -> Tuple[Optional["GenshinClient"], "UserOwned"]: - """获取已经绑定的账号的角色、武器信息""" - user_data = UserOwned() - try: - logger.debug("尝试获取已绑定的原神账号") - client = await self.helper.get_genshin_client(user_id, player_id=uid, offset=offset) - logger.debug("获取账号数据成功: UID=%s", client.player_id) - characters = await client.get_genshin_characters(client.player_id) - for character in characters: - if character.name == "旅行者": - continue - character_id = str(AVATAR_DATA[str(character.id)]["id"]) - character_assets = self.assets_service.avatar(character_id) - character_icon = await character_assets.icon(False) - character_side = await character_assets.side(False) - user_data.avatar[character_id] = ItemData( - id=character_id, - name=typing.cast(str, character.name), - rarity=int(typing.cast(str, character.rarity)), - level=character.level, - constellation=character.constellation, - gid=character.id, - icon=character_icon.as_uri(), - origin=character, - ) - # 判定武器的突破次数是否大于 2, 若是, 则将图标替换为 awakened (觉醒) 的图标 - weapon = character.weapon - weapon_id = str(weapon.id) - weapon_awaken = "icon" if weapon.ascension < 2 else "awaken" - weapon_icon = await getattr(self.assets_service.weapon(weapon_id), weapon_awaken)() - if weapon_id not in user_data.weapon: - # 由于用户可能持有多把同一种武器 - # 这里需要使用 List 来储存所有不同角色持有的同名武器 - user_data.weapon[weapon_id] = [] - user_data.weapon[weapon_id].append( - ItemData( - id=weapon_id, - name=weapon.name, - level=weapon.level, - rarity=weapon.rarity, - refinement=weapon.refinement, - icon=weapon_icon.as_uri(), - c_path=character_side.as_uri(), - ) - ) - except (PlayerNotFoundError, CookiesNotFoundError): - self.log_user(user_id, logger.info, "未查询到绑定的账号信息") - except InvalidCookies: - self.log_user(user_id, logger.info, "所绑定的账号信息已失效") - else: - # 没有异常返回数据 - return client, user_data - # 有上述异常的, client 会返回 None - return None, user_data - - async def area_user_weapon( - self, - area_name: str, - user_owned: "UserOwned", - area_daily: "AreaDailyMaterialsData", - loading_prompt: "Message", - ) -> Optional["AreaData"]: - """ - area_user_weapon 通过从选定区域当日可突破的武器中查找用户持有的武器 - 计算 /daily_material 返回的页面中该国下会出现的武器列表 - """ - weapon_items: List["ItemData"] = [] - for weapon_id in area_daily.weapon: - weapons = user_owned.weapon.get(weapon_id) - if weapons is None or len(weapons) == 0: - weapon = await self._assemble_item_from_honey_data("weapon", weapon_id) - if weapon is None: - continue - weapons = [weapon] - if weapons[0].rarity < 4: - continue - weapon_items.extend(weapons) - if len(weapon_items) == 0: - return None - weapon_materials = await self.user_materials(area_daily.weapon_materials, loading_prompt) - return AreaData( - name=area_name, - materials=weapon_materials, - items=list(sort_item(weapon_items)), - material_name=get_material_serial_name(map(lambda x: x.name, weapon_materials)), - ) - - async def area_user_avatar( - self, - area_name: str, - user_owned: "UserOwned", - area_daily: "AreaDailyMaterialsData", - client: "FragileGenshinClient", - loading_prompt: "Message", - ) -> Optional["AreaData"]: - """ - area_user_avatar 通过从选定区域当日可升级的角色技能中查找用户拥有的角色 - 计算 /daily_material 返回的页面中该国下会出现的角色列表 - """ - avatar_items: List[ItemData] = [] - for avatar_id in area_daily.avatar: - avatar = user_owned.avatar.get(avatar_id) - avatar = avatar or await self._assemble_item_from_honey_data("avatar", avatar_id) - if avatar is None: - continue - if avatar.origin is None: - avatar_items.append(avatar) - continue - # 最大努力获取用户角色等级 - try: - avatar.skills = await self._get_skills_data(client, avatar.origin) - except SimnetBadRequest as e: - if e.ret_code != -502002: - raise e - self.add_delete_message_job(loading_prompt, delay=5) - await loading_prompt.edit_text( - "获取角色天赋信息失败,如果想要显示角色天赋信息,请先在米游社/HoYoLab中使用一次养成计算器后再使用此功能~", - parse_mode=ParseMode.HTML, - ) - avatar_items.append(avatar) - if len(avatar_items) == 0: - return None - avatar_materials = await self.user_materials(area_daily.avatar_materials, loading_prompt) - return AreaData( - name=area_name, - materials=avatar_materials, - items=list(sort_item(avatar_items)), - material_name=get_material_serial_name(map(lambda x: x.name, avatar_materials)), - ) - - async def user_materials(self, material_ids: List[str], loading_prompt: "Message") -> List["ItemData"]: - """ - user_materials 返回 /daily_material 每个国家角色或武器列表右上角标的素材列表 - """ - area_materials: List[ItemData] = [] - for material_id in material_ids: # 添加这个区域当天(weekday)的培养素材 - material = None - try: - material = self.assets_service.material(material_id) - except AssetsCouldNotFound as exc: - logger.warning("AssetsCouldNotFound message[%s] target[%s]", exc.message, exc.target) - await loading_prompt.edit_text(f"出错了呜呜呜 ~ {config.notice.bot_name}找不到一些素材") - raise - [_, material_name, material_rarity] = HONEY_DATA["material"][material_id] - material_icon = await material.icon(False) - material_uri = material_icon.as_uri() - area_materials.append( - ItemData( - id=material_id, - icon=material_uri, - name=typing.cast(str, material_name), - rarity=typing.cast(int, material_rarity), - ) - ) - return area_materials - - @handler.command("daily_material", block=False) - async def daily_material(self, update: "Update", context: "ContextTypes.DEFAULT_TYPE"): - user_id = await self.get_real_user_id(update) - uid, offset = self.get_real_uid_or_offset(update) - message = typing.cast("Message", update.effective_message) - args = self.get_args(context) - now = datetime.now() - - try: - weekday = (_ := int(args[0])) - (_ > 0) - weekday = (weekday % 7 + 7) % 7 - time = title = f"星期{WEEK_MAP[weekday]}" - except (ValueError, IndexError): - title = "今日" - weekday = now.weekday() - (1 if now.hour < 4 else 0) - weekday = 6 if weekday < 0 else weekday - time = f"星期{WEEK_MAP[weekday]}" - full = bool(args and args[-1] == "full") # 判定最后一个参数是不是 full - - self.log_user(update, logger.info, "每日素材命令请求 || 参数 weekday=%s full=%s", WEEK_MAP[weekday], full) - - if weekday == 6: - the_day = "今天" if title == "今日" else "这天" - await message.reply_text(f"{the_day}是星期天, 全部素材都可以刷哦~", parse_mode=ParseMode.HTML) - return - - if self.locks[0].locked(): # 若检测到了第一个锁:正在下载每日素材表的数据 - loading_prompt = await message.reply_text(f"{config.notice.bot_name}正在摘抄每日素材表,以后再来探索吧~") - self.add_delete_message_job(loading_prompt, delay=5) - return - - if self.locks[1].locked(): # 若检测到了第二个锁:正在下载角色、武器、材料的图标 - await message.reply_text(f"{config.notice.bot_name}正在搬运每日素材的图标,以后再来探索吧~") - return - - loading_prompt = await message.reply_text(f"{config.notice.bot_name}可能需要找找图标素材,还请耐心等待哦~") - await message.reply_chat_action(ChatAction.TYPING) - - # 获取已经缓存的秘境素材信息 - if self.everyday_materials.is_empty(): # 若没有缓存每日素材表的数据 - logger.info("正在获取每日素材缓存") - await self._refresh_everyday_materials() - - # 尝试获取用户已绑定的原神账号信息 - client, user_owned = await self._get_items_from_user(user_id, uid, offset) - today_materials = self.everyday_materials.weekday(weekday) - fragile_client = FragileGenshinClient(client) - area_avatars: List["AreaData"] = [] - area_weapons: List["AreaData"] = [] - for country_name, area_daily in today_materials.items(): - area_avatar = await self.area_user_avatar( - country_name, user_owned, area_daily, fragile_client, loading_prompt - ) - if area_avatar is not None: - area_avatars.append(area_avatar) - area_weapon = await self.area_user_weapon(country_name, user_owned, area_daily, loading_prompt) - if area_weapon is not None: - area_weapons.append(area_weapon) - render_data = RenderData( - title=title, - time=time, - uid=mask_number(client.player_id) if client else client, - character=area_avatars, - weapon=area_weapons, - ) - - await message.reply_chat_action(ChatAction.TYPING) - - # 是否发送原图 - file_type = FileType.DOCUMENT if full else FileType.PHOTO - - character_img_data, weapon_img_data = await asyncio.gather( - self.template_service.render( # 渲染角色素材页 - "genshin/daily_material/character.jinja2", - {"data": render_data}, - {"width": 1338, "height": 500}, - file_type=file_type, - ttl=30 * 24 * 60 * 60, - ), - self.template_service.render( # 渲染武器素材页 - "genshin/daily_material/weapon.jinja2", - {"data": render_data}, - {"width": 1338, "height": 500}, - file_type=file_type, - ttl=30 * 24 * 60 * 60, - ), - ) - - self.add_delete_message_job(loading_prompt, delay=5) - await message.reply_chat_action(ChatAction.UPLOAD_PHOTO) - - character_img_data.filename = f"{title}可培养角色.png" - weapon_img_data.filename = f"{title}可培养武器.png" - - await RenderGroupResult([character_img_data, weapon_img_data]).reply_media_group(message) - - logger.debug("角色、武器培养素材图发送成功") - - @handler.command("refresh_daily_material", admin=True, block=False) - async def refresh(self, update: "Update", context: "ContextTypes.DEFAULT_TYPE"): - user = update.effective_user - message = update.effective_message - - logger.info("用户 {%s}[%s] 刷新[bold]每日素材[/]缓存命令", user.full_name, user.id, extra={"markup": True}) - if self.locks[0].locked(): - notice = await message.reply_text(f"{config.notice.bot_name}还在抄每日素材表呢,我有在好好工作哦~") - self.add_delete_message_job(notice, delay=10) - return - if self.locks[1].locked(): - notice = await message.reply_text(f"{config.notice.bot_name}正在搬运每日素材图标,在努力工作呢!") - self.add_delete_message_job(notice, delay=10) - return - async with self.locks[1]: # 锁住第二把锁 - notice = await message.reply_text( - f"{config.notice.bot_name}正在重新摘抄每日素材表,请稍等~", parse_mode=ParseMode.HTML - ) - async with self.locks[0]: # 锁住第一把锁 - await self._refresh_everyday_materials() - notice = await notice.edit_text( - "每日素材表" - + ("摘抄完成!" if self.everyday_materials else "坏掉了!等会它再长好了之后我再抄。。。") - + "\n正搬运每日素材的图标中。。。", - parse_mode=ParseMode.HTML, - ) - time = await self._download_icon(notice) - - async def job(_, n): - await n.edit_text(n.text_html.split("\n")[0] + "\n每日素材图标搬运完成!", parse_mode=ParseMode.HTML) - await asyncio.sleep(INTERVAL) - await notice.delete() - - context.application.job_queue.run_once( - partial(job, n=notice), when=time + INTERVAL, name="notice_msg_final_job" - ) - - async def _refresh_everyday_materials(self, retry: int = 5): - """刷新来自 honey impact 的每日素材表""" - for attempts in range(1, retry + 1): - try: - response = await self.client.get("https://gensh.honeyhunterworld.com/?lang=CHS") - response.raise_for_status() - except (HTTPError, SSLZeroReturnError): - await asyncio.sleep(1) - if attempts == retry: - logger.error("每日素材刷新失败, 请稍后重试") - return - else: - logger.warning("每日素材刷新失败, 正在重试第 %d 次", attempts) - continue - self.everyday_materials = _parse_honey_impact_source(response.content) - # 当场缓存到文件 - content = self.everyday_materials.json(ensure_ascii=False, separators=(",", ":")) - async with aiofiles.open(DATA_FILE_PATH, "w", encoding="utf-8") as file: - await file.write(content) - logger.success("每日素材刷新成功") - return - - async def _assemble_item_from_honey_data(self, item_type: str, item_id: str) -> Optional["ItemData"]: - """用户拥有的角色和武器中找不到数据时,使用 HoneyImpact 的数据组装出基本信息置灰展示""" - honey_item = HONEY_DATA[item_type].get(item_id) - if honey_item is None: - return None - try: - icon = await getattr(self.assets_service, item_type)(item_id).icon() - except KeyError: - return None - return ItemData( - id=item_id, - name=typing.cast(str, honey_item[1]), - rarity=typing.cast(int, honey_item[2]), - icon=icon.as_uri(), - ) - - async def _download_icon(self, message: "Message") -> float: - """下载素材图标""" - asset_list = [] - lock = asyncio.Lock() - the_time = Value(c_double, time_() - INTERVAL) - - async def edit_message(text): - """修改提示消息""" - async with lock: - if message is not None and time_() >= (the_time.value + INTERVAL): - try: - await message.edit_text( - "\n".join(message.text_html.split("\n")[:2] + [text]), parse_mode=ParseMode.HTML - ) - the_time.value = time_() - except (TimedOut, RetryAfter): - pass - - async def task(item_id, name, item_type): - try: - logger.debug("正在开始下载 %s 的图标素材", name) - await edit_message(f"正在搬运 {name} 的图标素材。。。") - asset: AssetsServiceType = getattr(self.assets_service, item_type)(item_id) - asset_list.append(asset.honey_id) - # 找到该素材对象的所有图标类型 - # 并根据图标类型找到下载对应图标的函数 - for icon_type in asset.icon_types: - await getattr(asset, icon_type)(True) # 执行下载函数 - logger.debug("%s 的图标素材下载成功", name) - await edit_message(f"正在搬运 {name} 的图标素材。。。成功!") - except TimeoutException as exc: - logger.warning("Httpx [%s]\n%s[%s]", exc.__class__.__name__, exc.request.method, exc.request.url) - return exc - except Exception as exc: - logger.error("图标素材下载出现异常!", exc_info=exc) - return exc - - notice_text = "图标素材下载完成" - for TYPE, ITEMS in HONEY_DATA.items(): # 遍历每个对象 - task_list = [] - new_items = [] - for ID, DATA in ITEMS.items(): - if (ITEM := [ID, DATA[1], TYPE]) not in new_items: - new_items.append(ITEM) - task_list.append(task(*ITEM)) - results = await asyncio.gather(*task_list, return_exceptions=True) # 等待所有任务执行完成 - for result in results: - if isinstance(result, TimeoutException): - notice_text = "图标素材下载过程中请求超时\n有关详细信息,请查看日志" - elif isinstance(result, Exception): - notice_text = "图标素材下载过程中发生异常\n有关详细信息,请查看日志" - break - try: - await message.edit_text(notice_text) - except RetryAfter as e: - await asyncio.sleep(e.retry_after + 0.1) - await message.edit_text(notice_text) - except Exception as e: - logger.debug(e) - - logger.info("图标素材下载完成") - return the_time.value - - -def _parse_honey_impact_source(source: bytes) -> MaterialsData: - """ - ## honeyimpact 的源码格式: - ```html -
- - - 秘境名 -
- - - -
-
-
-
-
-
-
- - - - - -
- - 角色名 -
- -
- -
- ``` - """ - honey_item_url_map: Dict[str, str] = { # 这个变量可以静态化,不过考虑到这个函数三天调用一次,懒得改了 - typing.cast(str, honey_url): typing.cast(str, honey_id) - for honey_id, [honey_url, _, _] in HONEY_DATA["material"].items() - } - calendar = bs4.BeautifulSoup(source, "lxml").select_one(".calendar_day_wrap") - if calendar is None: - return MaterialsData() # 多半是格式错误或者网页数据有误 - everyday_materials: List[Dict[str, "AreaDailyMaterialsData"]] = [{} for _ in range(7)] - current_country: str = "" - for element in calendar.find_all(recursive=False): - element: bs4.Tag - if element.name == "span": # 找到代表秘境的 span - domain_name = next(iter(element)).text # 第一个孩子节点的 text - current_country = DOMAIN_AREA_MAP[domain_name] # 后续处理 a 列表也会用到这个 current_country - materials_type = f"{DOMAIN_TYPE_MAP[domain_name]}_materials" - for div in element.find_all("div", recursive=False): # 7 个 div 对应的是一周中的每一天 - div: bs4.Tag - weekday = int(div.attrs["data-days"]) # data-days 是一周中的第几天(周一 0,周日 6) - if current_country not in everyday_materials[weekday]: - everyday_materials[weekday][current_country] = AreaDailyMaterialsData() - materials: List[str] = getattr(everyday_materials[weekday][current_country], materials_type) - for a in div.find_all("a", recursive=False): # 当天能刷的所有素材在 a 列表中 - a: bs4.Tag - href = a.attrs["href"] # 素材 ID 在 href 中 - honey_url = path.dirname(href).removeprefix("/") - materials.append(honey_item_url_map[honey_url]) - if element.name == "a": - # country_name 是从上面的 span 继承下来的,下面的 item 对应的是角色或者武器 - # element 的第一个 child,也就是 div.calendar_pic_wrap - calendar_pic_wrap = typing.cast(bs4.Tag, next(iter(element))) # element 的第一个孩子 - item_name_span = calendar_pic_wrap.select_one("span") - if item_name_span is None or item_name_span.text.strip() == "旅行者": - continue # 因为旅行者的天赋计算比较复杂,不做旅行者的天赋计算 - href = element.attrs["href"] # Item ID 在 href 中 - item_is_weapon = href.startswith("/i_n") - # 角色 ID 前缀固定 10000,但是 honey impact 替换成了角色名,剩余部分的数字是真正的 Item ID 组成部分 - item_id = f"{'' if item_is_weapon else '10000'}{''.join(filter(str.isdigit, href))}" - for weekday in map(int, calendar_pic_wrap.attrs["data-days"]): # data-days 中存的是星期几可以刷素材 - ascendable_items = everyday_materials[weekday][current_country] - ascendable_items = ascendable_items.weapon if item_is_weapon else ascendable_items.avatar - ascendable_items.append(item_id) - return MaterialsData(__root__=everyday_materials) - - -class FragileGenshinClient: - def __init__(self, client: Optional["GenshinClient"]): - self.client = client - self._damaged = False - - @property - def damaged(self): - return self._damaged or self.client is None - - @damaged.setter - def damaged(self, damaged: bool): - self._damaged = damaged - - -class ItemData(BaseModel): - id: str # ID - name: str # 名称 - rarity: int # 星级 - icon: str # 图标 - level: Optional[int] = None # 等级 - constellation: Optional[int] = None # 命座 - skills: Optional[List[int]] = None # 天赋等级 - gid: Optional[int] = None # 角色在 genshin.py 里的 ID - refinement: Optional[int] = None # 精炼度 - c_path: Optional[str] = None # 武器使用者图标 - origin: Optional[Character] = None # 原始数据 - - -class AreaData(BaseModel): - name: str # 区域名 - material_name: str # 区域的材料系列名 - materials: List[ItemData] = [] # 区域材料 - items: Iterable[ItemData] = [] # 可培养的角色或武器 - - -class RenderData(BaseModel): - title: str # 页面标题,主要用于显示星期几 - time: str # 页面时间 - uid: Optional[str] = None # 用户UID - character: List[AreaData] = [] # 角色数据 - weapon: List[AreaData] = [] # 武器数据 - - def __getitem__(self, item): - return self.__getattribute__(item) - - -class UserOwned(BaseModel): - avatar: Dict[str, ItemData] = {} - """角色 ID 到角色对象的映射""" - weapon: Dict[str, List[ItemData]] = {} - """用户同时可以拥有多把同名武器,因此是 ID 到 List 的映射""" - - -class AreaDailyMaterialsData(BaseModel): - """ - AreaDailyMaterialsData 储存某一天某个国家所有可以刷的突破素材以及可以突破的角色和武器 - 对应 /daily_material 命令返回的图中一个国家横向这一整条的信息 - """ - - avatar_materials: List[str] = [] - """ - avatar_materials 是当日该国所有可以刷的精通和炼武素材的 ID 列表 - 举个例子:稻妻周三可以刷「天光」系列材料 - (不用蒙德璃月举例是因为它们每天的角色武器太多了,等稻妻多了再换) - 那么 avatar_materials 将会包括 - - 104326 「天光」的教导 - - 104327 「天光」的指引 - - 104328 「天光」的哲学 - """ - avatar: List[str] = [] - """ - avatar 是排除旅行者后该国当日可以突破天赋的角色 ID 列表 - 举个例子:稻妻周三可以刷「天光」系列精通素材 - 需要用到「天光」系列的角色有 - - 10000052 雷电将军 - - 10000053 早柚 - - 10000055 五郎 - - 10000058 八重神子 - """ - weapon_materials: List[str] = [] - """ - weapon_materials 是当日该国所有可以刷的炼武素材的 ID 列表 - 举个例子:稻妻周三可以刷今昔剧画系列材料 - 那么 weapon_materials 将会包括 - - 114033 今昔剧画之恶尉 - - 114034 今昔剧画之虎啮 - - 114035 今昔剧画之一角 - - 114036 今昔剧画之鬼人 - """ - weapon: List[str] = [] - """ - weapon 是该国当日可以突破天赋的武器 ID 列表 - 举个例子:稻妻周三可以刷今昔剧画系列炼武素材 - 需要用到今昔剧画系列的武器有 - - 11416 笼钓瓶一心 - - 13414 喜多院十文字 - - 13415 「渔获」 - - 13416 断浪长鳍 - - 13509 薙草之稻光 - - 14509 神乐之真意 - """ - - -MaterialsData.update_forward_refs() diff --git a/plugins/genshin/gcsim/plugin.py b/plugins/genshin/gcsim/plugin.py deleted file mode 100644 index fd73150..0000000 --- a/plugins/genshin/gcsim/plugin.py +++ /dev/null @@ -1,331 +0,0 @@ -import copy -from typing import Optional, TYPE_CHECKING, List, Union, Dict, Tuple - -from enkanetwork import EnkaNetworkResponse -from telegram import InlineKeyboardButton, InlineKeyboardMarkup -from telegram.ext import filters - -from core.config import config -from core.dependence.assets import AssetsService -from core.dependence.redisdb import RedisDB -from core.plugin import Plugin, handler -from core.services.players import PlayersService -from gram_core.services.template.services import TemplateService -from gram_core.services.users.services import UserAdminService -from metadata.shortname import roleToName, roleToId -from modules.gcsim.file import PlayerGCSimScripts -from modules.playercards.file import PlayerCardsFile -from plugins.genshin.gcsim.renderer import GCSimResultRenderer -from plugins.genshin.gcsim.runner import GCSimRunner, GCSimFit, GCSimQueueFull, GCSimResult -from plugins.genshin.model.base import CharacterInfo -from plugins.genshin.model.converters.enka import EnkaConverter -from plugins.tools.genshin import PlayerNotFoundError -from utils.log import logger - -if TYPE_CHECKING: - from telegram import Update, Message - from telegram.ext import ContextTypes - -__all__ = ("GCSimPlugin",) - - -async def _no_character_return(user_id: int, uid: int, message: "Message"): - photo = open("resources/img/kitsune.png", "rb") - buttons = [ - [ - InlineKeyboardButton( - "更新面板", - callback_data=f"update_player_card|{user_id}|{uid}", - ) - ] - ] - await message.reply_photo( - photo=photo, - caption="角色列表未找到,请尝试点击下方按钮从 Enka.Network 更新角色列表", - reply_markup=InlineKeyboardMarkup(buttons), - ) - - -class GCSimPlugin(Plugin): - def __init__( - self, - assets_service: AssetsService, - player_service: PlayersService, - template_service: TemplateService, - redis: RedisDB = None, - user_admin_service: UserAdminService = None, - ): - self.player_service = player_service - self.player_cards_file = PlayerCardsFile() - self.player_gcsim_scripts = PlayerGCSimScripts() - self.gcsim_runner = GCSimRunner(redis) - self.gcsim_renderer = GCSimResultRenderer(assets_service, template_service) - self.scripts_per_page = 8 - self.user_admin_service = user_admin_service - - async def initialize(self): - await self.gcsim_runner.initialize() - - def _gen_buttons( - self, user_id: int, uid: int, fits: List[GCSimFit], page: int = 1 - ) -> List[List[InlineKeyboardButton]]: - buttons = [] - for fit in fits[(page - 1) * self.scripts_per_page : page * self.scripts_per_page]: - button = InlineKeyboardButton( - f"{fit.script_key} ({','.join(map(str, fit.characters))})", - callback_data=f"enqueue_gcsim|{user_id}|{uid}|{fit.script_key}", - ) - if not buttons or len(buttons[-1]) >= 1: - buttons.append([]) - buttons[-1].append(button) - buttons.append( - [ - ( - InlineKeyboardButton("上一页", callback_data=f"gcsim_page|{user_id}|{uid}|{page - 1}") - if page > 1 - else InlineKeyboardButton("更新配队", callback_data=f"gcsim_refresh|{user_id}|{uid}") - ), - InlineKeyboardButton( - f"{page}/{int(len(fits) / self.scripts_per_page) + 1}", - callback_data=f"gcsim_unclickable|{user_id}|{uid}|unclickable", - ), - ( - InlineKeyboardButton("下一页", callback_data=f"gcsim_page|{user_id}|{uid}|{page + 1}") - if page < int(len(fits) / self.scripts_per_page) + 1 - else InlineKeyboardButton( - "更新配队", - callback_data=f"gcsim_refresh|{user_id}|{uid}", - ) - ), - ] - ) - return buttons - - @staticmethod - def _filter_fits_by_names(names: List[str], fits: List[GCSimFit]) -> List[GCSimFit]: - if not names: - return fits - return [fit for fit in fits if all(name in [str(i) for i in fit.characters] for name in names)] - - async def _get_uid_names( - self, - user_id: int, - args: List[str], - reply: Optional["Message"], - player_id: int, - offset: int, - ) -> Tuple[Optional[int], List[str]]: - """通过消息获取 uid,优先级:args > reply > self""" - uid, user_id_, names = player_id, user_id, [] - if args: - for i in args: - if i is not None and roleToId(i) is not None: - names.append(roleToName(i)) - if reply: - try: - user_id_ = reply.from_user.id - except AttributeError: - pass - if not uid: - player_info = await self.player_service.get_player(user_id_, offset=offset) - if player_info is not None: - uid = player_info.player_id - if (not uid) and (user_id_ != user_id): - player_info = await self.player_service.get_player(user_id, offset=offset) - if player_info is not None: - uid = player_info.player_id - return uid, names - - @staticmethod - def _fix_skill_level(data: Dict) -> Dict: - for i in data["avatarInfoList"]: - if "proudSkillExtraLevelMap" in i: - del i["proudSkillExtraLevelMap"] - return data - - async def _load_characters(self, uid: Union[int, str]) -> List[CharacterInfo]: - original_data = await self.player_cards_file.load_history_info(uid) - if original_data is None: - return [] - if len(original_data["avatarInfoList"]) == 0: - return [] - enka_response: EnkaNetworkResponse = EnkaNetworkResponse.parse_obj( - self._fix_skill_level(copy.deepcopy(original_data)) - ) - character_infos = [] - for avatar_info in enka_response.characters: - try: - character_infos.append(EnkaConverter.to_character_info(avatar_info)) - except ValueError as e: - logger.error("无法解析 Enka.Network 角色信息: %s\n%s", e, avatar_info.json()) - return character_infos - - @handler.command(command="gcsim", block=False) - async def gcsim(self, update: "Update", context: "ContextTypes.DEFAULT_TYPE"): - user_id = await self.get_real_user_id(update) - message = update.effective_message - args = self.get_args(context) - if not self.gcsim_runner.initialized: - await message.reply_text(f"GCSim 未初始化,请稍候再试或重启{config.notice.bot_name}") - return - if context.user_data.get("overlapping", False): - reply = await message.reply_text(f"旅行者已经有脚本正在运行,请让{config.notice.bot_name}稍微休息一下") - if filters.ChatType.GROUPS.filter(message): - self.add_delete_message_job(reply) - self.add_delete_message_job(message) - return - - uid, offset = self.get_real_uid_or_offset(update) - uid, names = await self._get_uid_names(user_id, args, message.reply_to_message, uid, offset) - self.log_user(update, logger.info, "发出 gcsim 命令 UID[%s] NAMES[%s]", uid, " ".join(names)) - if uid is None: - raise PlayerNotFoundError(user_id) - - character_infos = await self._load_characters(uid) - if not character_infos: - return await _no_character_return(user_id, uid, message) - - fits = await self.gcsim_runner.get_fits(uid) - if not fits: - fits = await self.gcsim_runner.calculate_fits(uid, character_infos) - fits = self._filter_fits_by_names(names, fits) - if not fits: - await message.reply_text("好像没有找到适合旅行者的配队呢,要不更新下面板吧") - return - buttons = self._gen_buttons(user_id, uid, fits) - await message.reply_text( - "请选择 GCSim 脚本", - reply_markup=InlineKeyboardMarkup(buttons), - ) - - @handler.callback_query(pattern=r"^gcsim_refresh\|", block=False) - async def gcsim_refresh(self, update: "Update", _: "ContextTypes.DEFAULT_TYPE") -> None: - callback_query = update.callback_query - user = callback_query.from_user - message = callback_query.message - - user_id, uid = map(int, callback_query.data.split("|")[1:]) - if user.id != user_id: - await callback_query.answer(text="这不是你的按钮!\n" + config.notice.user_mismatch, show_alert=True) - return - - character_infos = await self._load_characters(uid) - if not character_infos: - return await _no_character_return(user.id, uid, message) - - await self.gcsim_runner.remove_fits(uid) - fits = await self.gcsim_runner.calculate_fits(uid, character_infos) - if not fits: - await callback_query.edit_message_text("好像没有找到适合旅行者的配队呢,要不更新下面板吧") - return - buttons = self._gen_buttons(user.id, uid, fits) - await callback_query.edit_message_reply_markup(reply_markup=InlineKeyboardMarkup(buttons)) - - @handler.callback_query(pattern=r"^gcsim_page\|", block=False) - async def gcsim_page(self, update: "Update", _: "ContextTypes.DEFAULT_TYPE") -> None: - callback_query = update.callback_query - user = callback_query.from_user - message = callback_query.message - - user_id, uid, page = map(int, callback_query.data.split("|")[1:]) - if user.id != user_id: - await callback_query.answer(text="这不是你的按钮!\n" + config.notice.user_mismatch, show_alert=True) - return - - fits = await self.gcsim_runner.get_fits(uid) - if not fits: - await callback_query.answer( - text=f"其他数据好像被{config.notice.bot_name}吃掉了,要不重新试试吧", show_alert=True - ) - await message.delete() - return - buttons = self._gen_buttons(user_id, uid, fits, page) - await callback_query.edit_message_reply_markup(reply_markup=InlineKeyboardMarkup(buttons)) - - @handler.callback_query(pattern=r"^gcsim_unclickable\|", block=False) - async def gcsim_unclickable(self, update: "Update", _: "ContextTypes.DEFAULT_TYPE") -> None: - callback_query = update.callback_query - - _, _, _, reason = callback_query.data.split("|") - await callback_query.answer( - text=( - "已经是第一页了!\n" - if reason == "first_page" - else ( - "已经是最后一页了!\n" - if reason == "last_page" - else "这个按钮不可用\n" + config.notice.user_mismatch - ) - ), - show_alert=True, - ) - - @handler.callback_query(pattern=r"^enqueue_gcsim\|", block=False) - async def enqueue_gcsim(self, update: "Update", _: "ContextTypes.DEFAULT_TYPE") -> None: - callback_query = update.callback_query - user = callback_query.from_user - message = callback_query.message - user_id, uid, script_key = callback_query.data.split("|")[1:] - logger.info("用户 %s[%s] GCSim运行请求 || %s", user.full_name, user.id, callback_query.data) - if str(user.id) != user_id: - await callback_query.answer(text="这不是你的按钮!\n" + config.notice.user_mismatch, show_alert=True) - return - - logger.info("用户 %s[%s] enqueue_gcsim 运行请求 || %s", user.full_name, user.id, callback_query.data) - character_infos = await self._load_characters(uid) - if not character_infos: - return await _no_character_return(user.id, uid, message) - - await callback_query.edit_message_text(f"GCSim {script_key} 运行中...", reply_markup=InlineKeyboardMarkup([])) - results = [] - callback_task = self._callback(update, results, character_infos) - priority = 1 if await self.user_admin_service.is_admin(user.id) else 2 - try: - await self.gcsim_runner.run(user_id, uid, script_key, character_infos, results, callback_task, priority) - except GCSimQueueFull: - await callback_query.edit_message_text(f"{config.notice.bot_name}任务过多忙碌中,请稍后再试") - return - - async def _callback( - self, update: "Update", results: List[GCSimResult], character_infos: List[CharacterInfo] - ) -> None: - result = results[0] - callback_query = update.callback_query - message = callback_query.message - _, uid, script_key = callback_query.data.split("|")[1:] - msg_to_reply = message - if message.reply_to_message: - msg_to_reply = message.reply_to_message - if result.error: - await callback_query.edit_message_text(result.error) - else: - await callback_query.edit_message_text(f"GCSim {result.script_key} 运行完成") - if result.file_id: - await msg_to_reply.reply_photo(result.file_id, caption=f"GCSim {script_key} 运行结果") - self.add_delete_message_job(message, delay=1) - return - - result_path = self.player_gcsim_scripts.get_result_path(uid, script_key) - if not result_path.exists(): - await callback_query.answer( - text=f"运行结果似乎在提瓦特之外,{config.notice.bot_name}找不到了", show_alert=True - ) - return - if result.script is None: - await callback_query.answer(text=f"脚本似乎在提瓦特之外,{config.notice.bot_name}找不到了", show_alert=True) - return - - result_ = await self.gcsim_renderer.prepare_result(result_path, result.script, character_infos) - if not result_: - await callback_query.answer(text=f"在准备运行结果时{config.notice.bot_name}出问题了", show_alert=True) - return - - render_result = await self.gcsim_renderer.render(script_key, result_) - reply = await render_result.reply_photo( - msg_to_reply, - filename=f"gcsim_{uid}_{script_key}.png", - caption=f"GCSim {script_key} 运行结果", - ) - self.add_delete_message_job(message, delay=1) - if reply and reply.photo: - await self.gcsim_runner.cache.set_cache(uid, hash(str(result.script)), reply.photo[0].file_id) diff --git a/plugins/genshin/gcsim/renderer.py b/plugins/genshin/gcsim/renderer.py deleted file mode 100644 index 75bc54f..0000000 --- a/plugins/genshin/gcsim/renderer.py +++ /dev/null @@ -1,141 +0,0 @@ -import json -from pathlib import Path -from typing import Optional, List, TYPE_CHECKING - -from core.dependence.assets import AssetsService -from gram_core.services.template.models import RenderResult -from gram_core.services.template.services import TemplateService -from metadata.shortname import idToName, elementToName, elementsToColor -from plugins.genshin.model import GCSim, GCSimCharacterInfo, CharacterInfo -from plugins.genshin.model.converters.gcsim import GCSimConverter - -if TYPE_CHECKING: - from utils.typedefs import StrOrInt - - -class GCSimResultRenderer: - def __init__(self, assets_service: AssetsService, template_service: TemplateService): - self.assets_service = assets_service - self.template_service = template_service - - @staticmethod - def fix_asset_id(asset_id: "StrOrInt") -> "StrOrInt": - if "-" in str(asset_id): - _asset_id = asset_id.split("-")[0] - if _asset_id.isnumeric(): - return int(_asset_id) - return asset_id - - async def prepare_result( - self, result_path: Path, script: GCSim, character_infos: List[CharacterInfo] - ) -> Optional[dict]: - result = json.loads(result_path.read_text(encoding="utf-8")) - characters = {ch.character for ch in character_infos} - result["extra"] = {} - for idx, character_details in enumerate(result["character_details"]): - asset_id, _ = GCSimConverter.to_character(character_details["name"]) - asset_id = self.fix_asset_id(asset_id) - gcsim_character: GCSimCharacterInfo = next( - filter(lambda gc, cn=character_details["name"]: gc.character == cn, script.characters), None - ) - if not gcsim_character: - return None - if character_details["name"] not in result["extra"]: - result["extra"][character_details["name"]] = {} - if GCSimConverter.to_character(gcsim_character.character)[1] in characters: - result["extra"][character_details["name"]]["owned"] = True - else: - result["extra"][character_details["name"]]["owned"] = False - - result["extra"][character_details["name"]]["icon"] = ( - await self.assets_service.avatar(asset_id).icon() - ).as_uri() - result["extra"][character_details["name"]]["rarity"] = self.assets_service.avatar(asset_id).enka.rarity - result["extra"][character_details["name"]]["constellation"] = gcsim_character.constellation - - if "character_dps" not in result["extra"]: - result["extra"]["character_dps"] = [] - result["extra"]["character_dps"].append( - {"value": result["statistics"]["character_dps"][idx]["mean"], "name": idToName(asset_id)} - ) - result["extra"]["element_dps"] = [ - {"value": data["mean"], "name": elementToName(elem), "itemStyle": {"color": elementsToColor[elem]}} - for elem, data in result["statistics"]["element_dps"].items() - ] - result["extra"]["damage"] = { - "xAxis": [i * 0.5 for i in range(len(result["statistics"]["damage_buckets"]["buckets"]))], - "series": [ - { - "data": [bucket["mean"] for bucket in result["statistics"]["damage_buckets"]["buckets"]], - "type": "line", - "symbol": "none", - "color": "#66ccff", - "name": "平均伤害", - }, - { - "data": [bucket["min"] for bucket in result["statistics"]["damage_buckets"]["buckets"]], - "type": "line", - "lineStyle": { - "opacity": 0, - }, - "stack": "area", - "symbol": "none", - }, - { - "data": [ - max(0, bucket["mean"] - bucket["sd"]) - for bucket in result["statistics"]["damage_buckets"]["buckets"] - ], - "type": "line", - "lineStyle": {"opacity": 0}, - "stack": "cofidence-band", - "symbol": "none", - }, - { - "data": [ - min(bucket["mean"], bucket["sd"]) + bucket["sd"] - for bucket in result["statistics"]["damage_buckets"]["buckets"] - ], - "type": "line", - "lineStyle": { - "opacity": 0, - }, - "areaStyle": { - "opacity": 0.5, - "color": "#4c9bd4", - }, - "stack": "cofidence-band", - "symbol": "none", - "color": "#4c9bd4", - "name": "标准差", - }, - { - "data": [ - bucket["max"] - bucket["min"] for bucket in result["statistics"]["damage_buckets"]["buckets"] - ], - "type": "line", - "lineStyle": { - "opacity": 0, - }, - "areaStyle": { - "opacity": 0.25, - "color": "#a5cde9", - }, - "stack": "area", - "symbol": "none", - "color": "#a5cde9", - "name": "极值", - }, - ], - } - - return result - - async def render(self, script_key: str, data: dict) -> RenderResult: - return await self.template_service.render( - "genshin/gcsim/result.jinja2", - {"script_key": script_key, **data}, - full_page=True, - query_selector="body > div", - ttl=7 * 24 * 60 * 60, - ) diff --git a/plugins/genshin/gcsim/runner.py b/plugins/genshin/gcsim/runner.py deleted file mode 100644 index d503bd6..0000000 --- a/plugins/genshin/gcsim/runner.py +++ /dev/null @@ -1,273 +0,0 @@ -import asyncio -import multiprocessing -import platform -import time -from dataclasses import dataclass -from pathlib import Path -from queue import PriorityQueue -from typing import Optional, Dict, List, Union, TYPE_CHECKING, Tuple, Coroutine, Any - -import gcsim_pypi -from pydantic import BaseModel - -from gram_core.config import config -from metadata.shortname import idToName -from modules.apihelper.client.components.remote import Remote -from modules.gcsim.cache import GCSimCache -from modules.gcsim.file import PlayerGCSimScripts -from plugins.genshin.model.base import CharacterInfo, Character -from plugins.genshin.model.converters.gcsim import GCSimConverter -from plugins.genshin.model.gcsim import GCSim, GCSimCharacter -from utils.const import DATA_DIR -from utils.log import logger - -if TYPE_CHECKING: - from core.dependence.redisdb import RedisDB - -GCSIM_SCRIPTS_PATH = DATA_DIR / "gcsim" / "scripts" -GCSIM_SCRIPTS_PATH.mkdir(parents=True, exist_ok=True) - - -class FitCharacter(BaseModel): - id: int - name: str - gcsim: GCSimCharacter - character: Character - - def __str__(self): - return self.name - - -class GCSimFit(BaseModel): - script_key: str - fit_count: int - characters: List[FitCharacter] - total_levels: int - total_weapon_levels: int - - -@dataclass -class GCSimResult: - error: Optional[str] - user_id: str - uid: str - script_key: str - script: Optional[GCSim] = None - file_id: Optional[str] = None - - -def _get_gcsim_bin_name() -> str: - if platform.system() == "Windows": - return "gcsim.exe" - bin_name = "gcsim" - if platform.system() == "Darwin": - bin_name += ".darwin" - if platform.machine() == "arm64": - bin_name += ".arm64" - return bin_name - - -def _get_limit_command() -> str: - if platform.system() == "Linux": - return "ulimit -m 1000000 && ulimit -v 1000000 && timeout 120 " - return "" - - -class GCSimRunnerTask: - def __init__(self, task: Coroutine[Any, Any, None]): - self.task = task - - def __lt__(self, other: "GCSimRunnerTask") -> bool: - return False - - async def run(self) -> None: - await self.task - - -class GCSimQueueFull(Exception): - pass - - -class GCSimRunner: - def __init__(self, client: "RedisDB"): - self.initialized = False - self.bin_path = None - self.player_gcsim_scripts = PlayerGCSimScripts() - self.gcsim_version: Optional[str] = None - self.scripts: Dict[str, GCSim] = {} - max_concurrent_gcsim = multiprocessing.cpu_count() - self.sema = asyncio.BoundedSemaphore(max_concurrent_gcsim) - self.queue_size = 21 - self.queue: PriorityQueue[List[int, GCSimRunnerTask]] = PriorityQueue(maxsize=self.queue_size) - self.cache = GCSimCache(client) - - @staticmethod - def check_gcsim_script(name: str, script: str) -> Optional[GCSim]: - try: - return GCSimConverter.from_gcsim_script(script) - except ValueError as e: - logger.error("无法解析 GCSim 脚本 %s: %s", name, e) - return None - - async def refresh(self): - self.player_gcsim_scripts.clear_fits() - self.scripts.clear() - new_scripts = await Remote.get_gcsim_scripts() - for name, text in new_scripts.items(): - if script := self.check_gcsim_script(name, text): - self.scripts[name] = script - for path in GCSIM_SCRIPTS_PATH.iterdir(): - if path.is_file(): - with open(path, "r", encoding="utf-8") as f: - try: - if script := self.check_gcsim_script(path.name, f.read()): - self.scripts[path.stem] = script - except UnicodeError as e: - logger.error("无法读取 GCSim 脚本 %s: %s", path.name, e) - - async def initialize(self): - gcsim_pypi_path = Path(gcsim_pypi.__file__).parent - - self.bin_path = gcsim_pypi_path.joinpath("bin").joinpath(_get_gcsim_bin_name()) - - process = await asyncio.create_subprocess_exec( - self.bin_path, "-version", stdout=asyncio.subprocess.PIPE, stderr=asyncio.subprocess.PIPE - ) - - stdout, stderr = await process.communicate() - - if process.returncode == 0: - self.gcsim_version = stdout.decode().splitlines()[0] - logger.debug("GCSim version: %s", self.gcsim_version) - else: - logger.error("GCSim 运行时出错: %s", stderr.decode()) - - now = time.time() - await self.refresh() - logger.debug("加载 %d GCSim 脚本耗时 %.2f 秒", len(self.scripts), time.time() - now) - self.initialized = True - - @staticmethod - async def _execute_queue( - gcsim_task: Coroutine[Any, Any, GCSimResult], - results: List[GCSimResult], - callback_task: Coroutine[Any, Any, None], - ) -> None: - data = await gcsim_task - results.append(data) - await callback_task - - async def _execute_gcsim( - self, - user_id: str, - uid: str, - script_key: str, - added_time: float, - character_infos: List[CharacterInfo], - ) -> GCSimResult: - script = self.scripts.get(script_key) - if script is None: - return GCSimResult(error="未找到脚本", user_id=user_id, uid=uid, script_key=script_key) - try: - merged_script = GCSimConverter.merge_character_infos(script.copy(), character_infos) - except ValueError: - return GCSimResult(error="无法合并角色信息", user_id=user_id, uid=uid, script_key=script_key) - if not config.debug: - if file_id := await self.cache.get_cache(uid, hash(str(merged_script))): - return GCSimResult(error=None, user_id=user_id, uid=uid, script_key=script_key, file_id=file_id) - await self.player_gcsim_scripts.write_script(uid, script_key, str(merged_script)) - limit = _get_limit_command() - command = [ - self.bin_path, - "-c", - self.player_gcsim_scripts.get_script_path(uid, script_key).absolute().as_posix(), - "-out", - self.player_gcsim_scripts.get_result_path(uid, script_key).absolute().as_posix(), - ] - process = await asyncio.create_subprocess_shell( - limit + " ".join([str(i) for i in command]), - stdout=asyncio.subprocess.PIPE, - stderr=asyncio.subprocess.PIPE, - ) - stdout, stderr = await process.communicate() - logger.debug("GCSim 脚本 (%s|%s|%s) 用时 %.2fs", user_id, uid, script_key, time.time() - added_time) - error = None - if stderr: - error = stderr.decode()[:500] - if "out of memory" in error: - error = "超出内存限制" - if process.returncode == 124: - error = "超出运行时间限制" - if error: - logger.error("GCSim 脚本 (%s|%s|%s) 错误: %s", user_id, uid, script_key, error) - return GCSimResult(error=error, user_id=user_id, uid=uid, script_key=script_key, script=merged_script) - if stdout: - logger.info("GCSim 脚本 (%s|%s|%s) 运行完成", user_id, uid, script_key) - logger.debug("GCSim 脚本 (%s|%s|%s) 输出: %s", user_id, uid, script_key, stdout.decode()) - return GCSimResult(error=None, user_id=user_id, uid=uid, script_key=script_key, script=merged_script) - return GCSimResult( - error="No output", - user_id=user_id, - uid=uid, - script_key=script_key, - script=merged_script, - ) - - async def run( - self, - user_id: str, - uid: str, - script_key: str, - character_infos: List[CharacterInfo], - results: List[GCSimResult], - callback_task: Coroutine[Any, Any, None], - priority: int = 2, - ) -> None: - start_time = time.time() - gcsim_task = self._execute_gcsim(user_id, uid, script_key, start_time, character_infos) - queue_task = GCSimRunnerTask(self._execute_queue(gcsim_task, results, callback_task)) - if priority == 2 and self.queue.qsize() >= (self.queue_size - 1): - raise GCSimQueueFull() - if self.queue.full(): - raise GCSimQueueFull() - self.queue.put([priority, queue_task]) - async with self.sema: - if not self.queue.empty(): - _, task = self.queue.get() - await task.run() - - async def calculate_fits(self, uid: Union[int, str], character_infos: List[CharacterInfo]) -> List[GCSimFit]: - fits = [] - for key, script in self.scripts.items(): - # 空和莹会被认为是两个角色 - fit_characters: List[Tuple[CharacterInfo, GCSimCharacter]] = [] - for ch in character_infos: - gcsim_character = GCSimConverter.from_character(ch.character) - if gcsim_character in [c.character for c in script.characters]: - fit_characters.append((ch, gcsim_character)) - if fit_characters: - fits.append( - GCSimFit( - script_key=key, - characters=[ - FitCharacter(id=ch[0].id, name=idToName(ch[0].id), gcsim=ch[1], character=ch[0].character) - for ch in fit_characters - ], - fit_count=len(fit_characters), - total_levels=sum(ch.level for ch in script.characters), - total_weapon_levels=sum(ch.weapon_info.level for ch in script.characters), - ) - ) - fits = sorted( - fits, - key=lambda x: (x.fit_count, x.total_levels, x.total_weapon_levels), - reverse=True, - ) - await self.player_gcsim_scripts.write_fits(uid, [fit.dict() for fit in fits]) - return fits - - async def get_fits(self, uid: Union[int, str]) -> List[GCSimFit]: - return [GCSimFit(**fit) for fit in self.player_gcsim_scripts.get_fits(uid)] - - async def remove_fits(self, uid: Union[int, str]) -> None: - self.player_gcsim_scripts.remove_fits(uid) diff --git a/plugins/genshin/hilichurls.py b/plugins/genshin/hilichurls.py deleted file mode 100644 index 87418f4..0000000 --- a/plugins/genshin/hilichurls.py +++ /dev/null @@ -1,51 +0,0 @@ -from typing import Dict - -from aiofiles import open as async_open -from telegram import Update -from telegram.ext import CallbackContext, filters - -from core.plugin import Plugin, handler -from utils.const import RESOURCE_DIR -from utils.log import logger - -try: - import ujson as jsonlib - -except ImportError: - import json as jsonlib - -__all__ = ("HilichurlsPlugin",) - - -class HilichurlsPlugin(Plugin): - """丘丘语字典.""" - - hilichurls_dictionary: Dict[str, str] - - async def initialize(self) -> None: - """加载数据文件.数据整理自 https://wiki.biligame.com/ys By @zhxycn.""" - async with async_open(RESOURCE_DIR / "json/hilichurls_dictionary.json", encoding="utf-8") as file: - self.hilichurls_dictionary = jsonlib.loads(await file.read()) - - @handler.command(command="hilichurls", block=False) - async def command_start(self, update: Update, context: CallbackContext) -> None: - message = update.effective_message - args = self.get_args(context) - if len(args) >= 1: - msg = args[0] - else: - reply_message = await message.reply_text("请输入要查询的丘丘语。") - if filters.ChatType.GROUPS.filter(reply_message): - self.add_delete_message_job(message) - self.add_delete_message_job(reply_message) - return - search = str.casefold(msg) # 忽略大小写以方便查询 - if search not in self.hilichurls_dictionary: - reply_message = await message.reply_text(f"在丘丘语字典中未找到 {msg}。") - if filters.ChatType.GROUPS.filter(reply_message): - self.add_delete_message_job(message) - self.add_delete_message_job(reply_message) - return - self.log_user(update, logger.info, "查询今日角色生日列表 查询丘丘语字典命令请求 || 参数 %s", msg) - result = self.hilichurls_dictionary[f"{search}"] - await message.reply_markdown_v2(f"丘丘语: `{search}`\n\n`{result}`") diff --git a/plugins/genshin/ledger.py b/plugins/genshin/ledger.py deleted file mode 100644 index 54138d2..0000000 --- a/plugins/genshin/ledger.py +++ /dev/null @@ -1,353 +0,0 @@ -import math -import os -import re -from datetime import datetime, timedelta -from typing import TYPE_CHECKING, List, Tuple, Optional - -from simnet.errors import DataNotPublic, BadRequest as SimnetBadRequest -from telegram import InlineKeyboardMarkup, InlineKeyboardButton -from telegram.constants import ChatAction -from telegram.ext import filters - -from core.plugin import Plugin, handler -from core.services.cookies import CookiesService -from core.services.history_data.models import HistoryDataLedger -from core.services.history_data.services import HistoryDataLedgerServices -from core.services.template.models import RenderResult -from core.services.template.services import TemplateService -from gram_core.config import config -from gram_core.dependence.redisdb import RedisDB -from gram_core.plugin.methods.inline_use_data import IInlineUseData -from plugins.tools.genshin import GenshinHelper -from utils.enkanetwork import RedisCache -from utils.log import logger -from utils.uid import mask_number - -if TYPE_CHECKING: - from telegram import Update - from telegram.ext import ContextTypes - from simnet import GenshinClient - from simnet.models.genshin.diary import Diary - -__all__ = ("LedgerPlugin",) - - -class LedgerPlugin(Plugin): - """旅行札记查询""" - - def __init__( - self, - helper: GenshinHelper, - cookies_service: CookiesService, - template_service: TemplateService, - history_data_ledger: HistoryDataLedgerServices, - redis: RedisDB, - ): - self.template_service = template_service - self.cookies_service = cookies_service - self.current_dir = os.getcwd() - self.helper = helper - self.history_data_ledger = history_data_ledger - self.cache = RedisCache(redis.client, key="plugin:ledger:history") - self.kitsune = None - - async def _start_get_ledger(self, client: "GenshinClient", month=None) -> RenderResult: - diary_info = await client.get_genshin_diary(client.player_id, month=month) - if month: - await self.save_ledger_data(self.history_data_ledger, client.player_id, diary_info) - return await self._start_get_ledger_render(client.player_id, diary_info) - - async def _start_get_ledger_render(self, uid: int, diary_info: "Diary") -> RenderResult: - color = ["#73a9c6", "#d56565", "#70b2b4", "#bd9a5a", "#739970", "#7a6da7", "#597ea0"] - categories = [ - { - "id": i.id, - "name": i.name, - "color": color[i.id % len(color)], - "amount": i.amount, - "percentage": i.percentage, - } - for i in diary_info.month_data.categories - ] - color = [i["color"] for i in categories] - - def format_amount(amount: int) -> str: - return f"{round(amount / 10000, 2)}w" if amount >= 10000 else amount - - ledger_data = { - "uid": mask_number(uid), - "day": diary_info.month, - "current_primogems": format_amount(diary_info.month_data.current_primogems), - "gacha": int(diary_info.month_data.current_primogems / 160), - "current_mora": format_amount(diary_info.month_data.current_mora), - "last_primogems": format_amount(diary_info.month_data.last_primogems), - "last_gacha": int(diary_info.month_data.last_primogems / 160), - "last_mora": format_amount(diary_info.month_data.last_mora), - "categories": categories, - "color": color, - } - render_result = await self.template_service.render( - "genshin/ledger/ledger.jinja2", ledger_data, {"width": 580, "height": 610} - ) - return render_result - - @handler.command(command="ledger", cookie=True, block=False) - @handler.message(filters=filters.Regex("^旅行札记查询(.*)"), block=False) - async def command_start(self, update: "Update", context: "ContextTypes.DEFAULT_TYPE") -> None: - user_id = await self.get_real_user_id(update) - uid, offset = self.get_real_uid_or_offset(update) - message = update.effective_message - - now = datetime.now() - now_time = (now - timedelta(days=1)) if now.day == 1 and now.hour <= 4 else now - month = now_time.month - try: - args = self.get_args(context) - if len(args) >= 1: - month = args[0].replace("月", "") - if re_data := re.findall(r"\d+", str(month)): - month = int(re_data[0]) - else: - num_dict = {"一": 1, "二": 2, "三": 3, "四": 4, "五": 5, "六": 6, "七": 7, "八": 8, "九": 9, "十": 10} - month = sum(num_dict.get(i, 0) for i in str(month)) - # check right - allow_month = [now_time.month] - - last_month = now_time.replace(day=1) - timedelta(days=1) - allow_month.append(last_month.month) - - last_month = last_month.replace(day=1) - timedelta(days=1) - allow_month.append(last_month.month) - - if month not in allow_month and isinstance(month, int): - raise IndexError - except IndexError: - reply_message = await message.reply_text("仅可查询最新三月的数据,请重新输入") - if filters.ChatType.GROUPS.filter(message): - self.add_delete_message_job(reply_message, delay=30) - self.add_delete_message_job(message, delay=30) - return - self.log_user(update, logger.info, "查询旅行札记") - await message.reply_chat_action(ChatAction.TYPING) - try: - async with self.helper.genshin(user_id, player_id=uid, offset=offset) as client: - render_result = await self._start_get_ledger(client, month) - except DataNotPublic: - reply_message = await message.reply_text( - "查询失败惹,可能是旅行札记功能被禁用了?请先通过米游社或者 hoyolab 获取一次旅行札记后重试。" - ) - if filters.ChatType.GROUPS.filter(message): - self.add_delete_message_job(reply_message, delay=30) - self.add_delete_message_job(message, delay=30) - return - except SimnetBadRequest as exc: - if exc.ret_code == -120: - await message.reply_text("当前角色冒险等阶不足,暂时无法获取信息") - return - raise exc - await message.reply_chat_action(ChatAction.UPLOAD_PHOTO) - await render_result.reply_photo(message, filename=f"{client.player_id}.png") - - @staticmethod - async def save_ledger_data( - history_data_ledger: "HistoryDataLedgerServices", uid: int, ledger_data: "Diary" - ) -> bool: - month = int((ledger_data.date or datetime.now().strftime("%Y-%m-%d")).split("-")[1]) - if month == ledger_data.month: - return False - model = history_data_ledger.create(uid, ledger_data) - old_data = await history_data_ledger.get_by_user_id_data_id(uid, model.data_id) - if not old_data: - await history_data_ledger.add(model) - return True - return False - - async def get_ledger_data(self, uid: int): - return await self.history_data_ledger.get_by_user_id(uid) - - @staticmethod - def get_season_data_name(data: "HistoryDataLedger") -> str: - return f"{data.diary_data.data_id}" - - async def get_session_button_data(self, user_id: int, uid: int, force: bool = False): - redis = await self.cache.get(str(uid)) - if redis and not force: - return redis["buttons"] - data = await self.get_ledger_data(uid) - data.sort(key=lambda x: x.data_id, reverse=True) - abyss_data = [HistoryDataLedger.from_data(i) for i in data] - buttons = [ - { - "name": LedgerPlugin.get_season_data_name(abyss_data[idx]), - "value": f"get_ledger_history|{user_id}|{uid}|{value.id}", - } - for idx, value in enumerate(data) - ] - await self.cache.set(str(uid), {"buttons": buttons}) - return buttons - - async def gen_season_button( - self, - user_id: int, - uid: int, - page: int = 1, - ) -> List[List[InlineKeyboardButton]]: - """生成按钮""" - data = await self.get_session_button_data(user_id, uid) - if not data: - return [] - buttons = [ - InlineKeyboardButton( - value["name"], - callback_data=value["value"], - ) - for value in data - ] - all_buttons = [buttons[i : i + 3] for i in range(0, len(buttons), 3)] - send_buttons = all_buttons[(page - 1) * 5 : page * 5] - last_page = page - 1 if page > 1 else 0 - all_page = math.ceil(len(all_buttons) / 5) - next_page = page + 1 if page < all_page and all_page > 1 else 0 - last_button = [] - if last_page: - last_button.append( - InlineKeyboardButton( - "<< 上一页", - callback_data=f"get_ledger_history|{user_id}|{uid}|p_{last_page}", - ) - ) - if last_page or next_page: - last_button.append( - InlineKeyboardButton( - f"{page}/{all_page}", - callback_data=f"get_ledger_history|{user_id}|{uid}|empty_data", - ) - ) - if next_page: - last_button.append( - InlineKeyboardButton( - "下一页 >>", - callback_data=f"get_ledger_history|{user_id}|{uid}|p_{next_page}", - ) - ) - if last_button: - send_buttons.append(last_button) - return send_buttons - - @handler.command("ledger_history", block=False) - @handler.message(filters.Regex(r"^旅行札记历史数据"), block=False) - async def ledger_history_command_start(self, update: "Update", _: "ContextTypes.DEFAULT_TYPE") -> None: - user_id = await self.get_real_user_id(update) - uid, offset = self.get_real_uid_or_offset(update) - message = update.effective_message - self.log_user(update, logger.info, "查询旅行札记历史数据") - - async with self.helper.genshin(user_id, player_id=uid, offset=offset) as client: - await self.get_session_button_data(user_id, client.player_id, force=True) - buttons = await self.gen_season_button(user_id, client.player_id) - if not buttons: - await message.reply_text("还没有旅行札记历史数据哦~") - return - if isinstance(self.kitsune, str): - photo = self.kitsune - else: - photo = open("resources/img/kitsune.png", "rb") - reply_message = await message.reply_photo( - photo, "请选择要查询的旅行札记历史数据", reply_markup=InlineKeyboardMarkup(buttons) - ) - if reply_message.photo: - self.kitsune = reply_message.photo[-1].file_id - - async def get_ledger_history_page(self, update: "Update", user_id: int, uid: int, result: str): - """翻页处理""" - callback_query = update.callback_query - - self.log_user(update, logger.info, "切换旅行札记历史数据页 page[%s]", result) - page = int(result.split("_")[1]) - async with self.helper.genshin(user_id, player_id=uid) as client: - buttons = await self.gen_season_button(user_id, client.player_id, page) - if not buttons: - await callback_query.answer("还没有旅行札记历史数据哦~", show_alert=True) - await callback_query.edit_message_text("还没有旅行札记历史数据哦~") - return - await callback_query.edit_message_reply_markup(reply_markup=InlineKeyboardMarkup(buttons)) - await callback_query.answer(f"已切换到第 {page} 页", show_alert=False) - - @handler.callback_query(pattern=r"^get_ledger_history\|", block=False) - async def get_ledger_history(self, update: "Update", _: "ContextTypes.DEFAULT_TYPE") -> None: - callback_query = update.callback_query - message = callback_query.message - user = callback_query.from_user - - async def get_ledger_history_callback( - callback_query_data: str, - ) -> Tuple[str, int, int]: - _data = callback_query_data.split("|") - _user_id = int(_data[1]) - _uid = int(_data[2]) - _result = _data[3] - logger.debug( - "callback_query_data函数返回 result[%s] user_id[%s] uid[%s]", - _result, - _user_id, - _uid, - ) - return _result, _user_id, _uid - - result, user_id, uid = await get_ledger_history_callback(callback_query.data) - if user.id != user_id: - await callback_query.answer(text="这不是你的按钮!\n" + config.notice.user_mismatch, show_alert=True) - return - if result == "empty_data": - await callback_query.answer(text="此按钮不可用", show_alert=True) - return - if result.startswith("p_"): - await self.get_ledger_history_page(update, user_id, uid, result) - return - data_id = int(result) - data = await self.history_data_ledger.get_by_id(data_id) - if not data: - await callback_query.answer("数据不存在,请尝试重新发送命令", show_alert=True) - await callback_query.edit_message_text("数据不存在,请尝试重新发送命令~") - return - await callback_query.answer("正在渲染图片中 请稍等 请不要重复点击按钮") - render = await self._start_get_ledger_render(user_id, HistoryDataLedger.from_data(data).diary_data) - await render.edit_media(message) - - async def ledger_use_by_inline(self, update: "Update", context: "ContextTypes.DEFAULT_TYPE"): - callback_query = update.callback_query - user = update.effective_user - user_id = user.id - uid = IInlineUseData.get_uid_from_context(context) - - self.log_user(update, logger.info, "查询旅行札记") - try: - async with self.helper.genshin(user_id, player_id=uid) as client: - render_result = await self._start_get_ledger(client) - except DataNotPublic: - await callback_query.answer( - "查询失败惹,可能是旅行札记功能被禁用了?请先通过米游社或者 hoyolab 获取一次旅行札记后重试。", - show_alert=True, - ) - return - except SimnetBadRequest as exc: - if exc.ret_code == -120: - await callback_query.answer( - "当前角色冒险等阶不足,暂时无法获取信息", - show_alert=True, - ) - return - raise exc - - await render_result.edit_inline_media(callback_query) - - async def get_inline_use_data(self) -> List[Optional[IInlineUseData]]: - return [ - IInlineUseData( - text="当月旅行札记", - hash="ledger", - callback=self.ledger_use_by_inline, - cookie=True, - player=True, - ) - ] diff --git a/plugins/genshin/map.py b/plugins/genshin/map.py deleted file mode 100644 index ff8a40a..0000000 --- a/plugins/genshin/map.py +++ /dev/null @@ -1,197 +0,0 @@ -from io import BytesIO -from typing import Union, Optional, List, Tuple - -from telegram import Update, Message, InputMediaDocument, InputMediaPhoto, InlineKeyboardButton, InlineKeyboardMarkup -from telegram.constants import ChatAction -from telegram.ext import CommandHandler, MessageHandler, filters, CallbackContext - -from core.config import config -from core.dependence.redisdb import RedisDB -from core.handler.callbackqueryhandler import CallbackQueryHandler -from core.plugin import handler, Plugin -from modules.apihelper.client.components.map import MapHelper, MapException -from utils.log import logger - - -class Map(Plugin): - """资源点查询""" - - def __init__(self, redis: RedisDB): - self.cache = redis.client - self.cache_photo_key = "plugin:map:photo:" - self.cache_doc_key = "plugin:map:doc:" - self.map_helper = MapHelper() - self.temp_photo_path = "resources/img/map.png" - self.temp_photo = None - - async def get_photo_cache(self, map_id: Union[str, int], name: str) -> Optional[str]: - if file_id := await self.cache.get(f"{self.cache_photo_key}{map_id}:{name}"): - return file_id.decode("utf-8") - return None - - async def get_doc_cache(self, map_id: Union[str, int], name: str) -> Optional[str]: - if file_id := await self.cache.get(f"{self.cache_doc_key}{map_id}:{name}"): - return file_id.decode("utf-8") - return None - - async def set_photo_cache(self, map_id: Union[str, int], name: str, file_id: str) -> None: - await self.cache.set(f"{self.cache_photo_key}{map_id}:{name}", file_id) - - async def set_doc_cache(self, map_id: Union[str, int], name: str, file_id: str) -> None: - await self.cache.set(f"{self.cache_doc_key}{map_id}:{name}", file_id) - - async def clear_cache(self) -> None: - for i in await self.cache.keys(f"{self.cache_photo_key}*"): - await self.cache.delete(i) - for i in await self.cache.keys(f"{self.cache_doc_key}*"): - await self.cache.delete(i) - - async def edit_media(self, message: Message, map_id: str, name: str) -> None: - caption = self.gen_caption(map_id, name) - if cache := await self.get_photo_cache(map_id, name): - media = InputMediaPhoto(media=cache, caption=caption) - await message.edit_media(media) - return - if cache := await self.get_doc_cache(map_id, name): - media = InputMediaDocument(media=cache, caption=caption) - await message.edit_media(media) - return - data = await self.map_helper.get_map(map_id, name) - if len(data) > (1024 * 1024): - data = BytesIO(data) - data.name = "map.jpg" - media = InputMediaDocument(media=data, caption=caption) - msg = await message.edit_media(media) - await self.set_doc_cache(map_id, name, msg.document.file_id) - else: - media = InputMediaPhoto(media=data, caption=caption) - msg = await message.edit_media(media) - await self.set_photo_cache(map_id, name, msg.photo[0].file_id) - - def get_show_map(self, name: str) -> List[int]: - return [ - idx - for idx, map_id in enumerate(self.map_helper.MAP_ID_LIST) - if self.map_helper.get_label_count(map_id, name) > 0 - ] - - async def gen_map_button( - self, maps: List[int], user_id: Union[str, int], name: str - ) -> List[List[InlineKeyboardButton]]: - return [ - [ - InlineKeyboardButton( - self.map_helper.MAP_NAME_LIST[idx], - callback_data=f"get_map|{user_id}|{self.map_helper.MAP_ID_LIST[idx]}|{name}", - ) - for idx in maps - ] - ] - - async def send_media(self, message: Message, map_id: Union[str, int], name: str) -> None: - caption = self.gen_caption(map_id, name) - if cache := await self.get_photo_cache(map_id, name): - await message.reply_photo(photo=cache, caption=caption) - return - if cache := await self.get_doc_cache(map_id, name): - await message.reply_document(document=cache, caption=caption) - return - try: - data = await self.map_helper.get_map(map_id, name) - except MapException as e: - await message.reply_text(e.message) - return - if len(data) > (1024 * 1024): - data = BytesIO(data) - data.name = "map.jpg" - msg = await message.reply_document(document=data, caption=caption) - await self.set_doc_cache(map_id, name, msg.document.file_id) - else: - msg = await message.reply_photo(photo=data, caption=caption) - await self.set_photo_cache(map_id, name, msg.photo[0].file_id) - - def gen_caption(self, map_id: Union[int, str], name: str) -> str: - count = self.map_helper.get_label_count(map_id, name) - return f"{config.notice.bot_name}一共找到了 {name} 的 {count} 个位置点\n* 数据来源于米游社wiki" - - @handler(CommandHandler, command="map", block=False) - @handler( - MessageHandler, filters=filters.Regex("^(?P.*)(在哪里|在哪|哪里有|哪儿有|哪有|在哪儿)$"), block=False - ) - @handler(MessageHandler, filters=filters.Regex("^(哪里有|哪儿有|哪有)(?P.*)$"), block=False) - async def command_start(self, update: Update, context: CallbackContext): - user_id = await self.get_real_user_id(update) - message = update.effective_message - args = context.args - group_dict = context.match and context.match.groupdict() - resource_name = None - await message.reply_chat_action(ChatAction.TYPING) - if args and len(args) >= 1: - resource_name = args[0] - elif group_dict: - resource_name = group_dict.get("name", None) - if not resource_name: - if group_dict: - return - await message.reply_text("请指定要查找的资源名称。", parse_mode="Markdown") - return - self.log_user(update, logger.info, "使用 map 命令查询了 %s", resource_name) - if resource_name not in self.map_helper.query_map: - # 消息来源于群组中并且无法找到默认不回复即可 - if filters.ChatType.GROUPS.filter(message) and group_dict is not None: - return - await message.reply_text("没有找到该资源。", parse_mode="Markdown") - return - maps = self.get_show_map(resource_name) - if len(maps) == 0: - if filters.ChatType.GROUPS.filter(message) and group_dict is not None: - return - await message.reply_text("没有找到该资源。", parse_mode="Markdown") - return - if len(maps) == 1: - map_id = self.map_helper.MAP_ID_LIST[maps[0]] - await self.send_media(message, map_id, resource_name) - return - buttons = await self.gen_map_button(maps, user_id, resource_name) - if isinstance(self.temp_photo, str): - photo = self.temp_photo - else: - photo = open(self.temp_photo_path, "rb") - reply_message = await message.reply_photo( - photo=photo, caption="请选择你要查询的地图", reply_markup=InlineKeyboardMarkup(buttons) - ) - if reply_message.photo: - self.temp_photo = reply_message.photo[-1].file_id - - @handler(CallbackQueryHandler, pattern=r"^get_map\|", block=False) - async def get_maps(self, update: Update, _: CallbackContext) -> None: - callback_query = update.callback_query - user = callback_query.from_user - message = callback_query.message - - async def get_map_callback(callback_query_data: str) -> Tuple[int, str, str]: - _data = callback_query_data.split("|") - _user_id = int(_data[1]) - _map_id = _data[2] - _name = _data[3] - logger.debug("callback_query_data 函数返回 user_id[%s] map_id[%s] name[%s]", _user_id, _map_id, _name) - return _user_id, _map_id, _name - - user_id, map_id, name = await get_map_callback(callback_query.data) - if user.id != user_id: - await callback_query.answer(text="这不是你的按钮!\n" + config.notice.user_mismatch, show_alert=True) - return - await callback_query.answer(text="正在渲染图片中 请稍等 请不要重复点击按钮", show_alert=False) - try: - await self.edit_media(message, map_id, name) - except MapException as e: - await message.reply_text(e.message) - - @handler.command("refresh_map", admin=True, block=False) - async def refresh_map(self, update: Update, _: CallbackContext): - message = update.effective_message - msg = await message.reply_text("正在刷新地图数据,请耐心等待...") - await self.map_helper.refresh_query_map() - await self.map_helper.refresh_label_count() - await self.clear_cache() - await msg.edit_text("正在刷新地图数据,请耐心等待...\n刷新成功") diff --git a/plugins/genshin/material.py b/plugins/genshin/material.py deleted file mode 100644 index a75f017..0000000 --- a/plugins/genshin/material.py +++ /dev/null @@ -1,239 +0,0 @@ -import re - -from telegram import InlineKeyboardButton, InlineKeyboardMarkup, Update -from telegram.constants import ChatAction -from telegram.ext import CallbackContext, CommandHandler, MessageHandler, filters - -from core.dependence.assets import AssetsService -from core.plugin import Plugin, handler -from core.services.template.services import TemplateService -from metadata.genshin import MATERIAL_DATA -from metadata.shortname import roleToName -from modules.apihelper.client.components.remote import Remote -from modules.material.talent import TalentMaterials -from modules.wiki.character import Character -from utils.log import logger - -__all__ = ("MaterialPlugin",) - - -class MaterialPlugin(Plugin): - """角色培养素材查询""" - - KEYBOARD = [ - [ - InlineKeyboardButton( - text="查看角色培养素材列表并查询", switch_inline_query_current_chat="查看角色培养素材列表并查询" - ) - ] - ] - - def __init__( - self, - template_service: TemplateService, - assets_service: AssetsService, - ): - self.roles_material = {} - self.assets_service = assets_service - self.template_service = template_service - - async def initialize(self): - await self._refresh() - - async def _refresh(self): - self.roles_material = await Remote.get_remote_material() - - async def _parse_material(self, data: dict, character_name: str, talent_level: str) -> dict: - data = data["data"] - if character_name not in data.keys(): - return {} - character = self.assets_service.avatar(character_name) - level_up_material = self.assets_service.material(data[character_name]["level_up_materials"]) - ascension_material = self.assets_service.material(data[character_name]["ascension_materials"]) - local_material = self.assets_service.material(data[character_name]["materials"][0]) - enemy_material = self.assets_service.material(data[character_name]["materials"][1]) - level_up_materials = [ - { - "num": 46, - "rarity": MATERIAL_DATA[str(level_up_material.id)]["rank"], - "icon": (await level_up_material.icon()).as_uri(), - "name": data[character_name]["level_up_materials"], - }, - { - "num": 419, - "rarity": 4, - "icon": (await self.assets_service.material(104003).icon()).as_uri(), - "name": "大英雄的经验", - }, - { - "num": 1, - "rarity": 2, - "icon": (await self.assets_service.material(ascension_material.id - 3).icon()).as_uri(), - "name": MATERIAL_DATA[str(ascension_material.id - 3)]["name"], - }, - { - "num": 9, - "rarity": 3, - "icon": (await self.assets_service.material(ascension_material.id - 2).icon()).as_uri(), - "name": MATERIAL_DATA[str(ascension_material.id - 2)]["name"], - }, - { - "num": 9, - "rarity": 4, - "icon": (await self.assets_service.material(str(ascension_material.id - 1)).icon()).as_uri(), - "name": MATERIAL_DATA[str(ascension_material.id - 1)]["name"], - }, - { - "num": 6, - "rarity": 5, - "icon": (await ascension_material.icon()).as_uri(), - "name": MATERIAL_DATA[str(ascension_material.id)]["name"], - }, - { - "num": 168, - "rarity": MATERIAL_DATA[str(local_material.id)]["rank"], - "icon": (await local_material.icon()).as_uri(), - "name": MATERIAL_DATA[str(local_material.id)]["name"], - }, - { - "num": 18, - "rarity": MATERIAL_DATA[str(enemy_material.id)]["rank"], - "icon": (await self.assets_service.material(enemy_material.id).icon()).as_uri(), - "name": MATERIAL_DATA[str(enemy_material.id)]["name"], - }, - { - "num": 30, - "rarity": MATERIAL_DATA[str(enemy_material.id + 1)]["rank"], - "icon": (await self.assets_service.material(enemy_material.id + 1).icon()).as_uri(), - "name": MATERIAL_DATA[str(enemy_material.id + 1)]["name"], - }, - { - "num": 36, - "rarity": MATERIAL_DATA[str(enemy_material.id + 2)]["rank"], - "icon": (await self.assets_service.material(str(enemy_material.id + 2)).icon()).as_uri(), - "name": MATERIAL_DATA[str(enemy_material.id + 2)]["name"], - }, - ] - talent_book = self.assets_service.material(f"「{data[character_name]['talent'][0]}」的教导") - weekly_talent_material = self.assets_service.material(data[character_name]["talent"][1]) - talent_materials = [ - { - "num": 9, - "rarity": MATERIAL_DATA[str(talent_book.id)]["rank"], - "icon": (await self.assets_service.material(talent_book.id).icon()).as_uri(), - "name": MATERIAL_DATA[str(talent_book.id)]["name"], - }, - { - "num": 63, - "rarity": MATERIAL_DATA[str(talent_book.id + 1)]["rank"], - "icon": (await self.assets_service.material(talent_book.id + 1).icon()).as_uri(), - "name": MATERIAL_DATA[str(talent_book.id + 1)]["name"], - }, - { - "num": 114, - "rarity": MATERIAL_DATA[str(talent_book.id + 2)]["rank"], - "icon": (await self.assets_service.material(str(talent_book.id + 2)).icon()).as_uri(), - "name": MATERIAL_DATA[str(talent_book.id + 2)]["name"], - }, - { - "num": 18, - "rarity": MATERIAL_DATA[str(enemy_material.id)]["rank"], - "icon": (await self.assets_service.material(enemy_material.id).icon()).as_uri(), - "name": MATERIAL_DATA[str(enemy_material.id)]["name"], - }, - { - "num": 66, - "rarity": MATERIAL_DATA[str(enemy_material.id + 1)]["rank"], - "icon": (await self.assets_service.material(enemy_material.id + 1).icon()).as_uri(), - "name": MATERIAL_DATA[str(enemy_material.id + 1)]["name"], - }, - { - "num": 93, - "rarity": MATERIAL_DATA[str(enemy_material.id + 2)]["rank"], - "icon": (await self.assets_service.material(str(enemy_material.id + 2)).icon()).as_uri(), - "name": MATERIAL_DATA[str(enemy_material.id + 2)]["name"], - }, - { - "num": 3, - "rarity": 5, - "icon": (await self.assets_service.material(104319).icon()).as_uri(), - "name": "智识之冕", - }, - { - "num": 18, - "rarity": MATERIAL_DATA[str(weekly_talent_material.id)]["rank"], - "icon": (await self.assets_service.material(weekly_talent_material.id).icon()).as_uri(), - "name": MATERIAL_DATA[str(weekly_talent_material.id)]["name"], - }, - ] - - return { - "character": { - "element": character.enka.element.name, - "image": character.enka.images.banner.url, - "name": character_name, - "association": (await Character.get_by_name(character_name)).association.name, - }, - "level_up_materials": level_up_materials, - "talent_materials": talent_materials, - "talent_level": talent_level, - "talent_amount": TalentMaterials(list(map(int, talent_level.split("/")))).cal_materials(), - } - - async def render(self, character_name: str, talent_amount: str): - if not self.roles_material: - await self._refresh() - data = await self._parse_material(self.roles_material, character_name, talent_amount) - if not data: - return - return await self.template_service.render( - "genshin/material/roles_material.jinja2", - data, - {"width": 960, "height": 1460}, - full_page=True, - ttl=7 * 24 * 60 * 60, - ) - - @staticmethod - def _is_valid(string: str): - """ - 判断字符串是否符合`8/9/10`的格式并保证每个数字都在[1,10] - """ - return bool( - re.match(r"^\d+/\d+/\d+$", string) - and all(1 <= int(num) <= 10 for num in string.split("/")) - and string != "1/1/1" - and string != "10/10/10" - ) - - @handler(CommandHandler, command="material", block=False) - @handler(MessageHandler, filters=filters.Regex("^角色培养素材查询(.*)"), block=False) - async def command_start(self, update: Update, context: CallbackContext) -> None: - message = update.effective_message - args = self.get_args(context) - if len(args) >= 1: - character_name = args[0] - material_count = "8/8/8" - if len(args) >= 2 and self._is_valid(args[1]): - material_count = args[1] - else: - reply_message = await message.reply_text( - "请回复你要查询的培养素材的角色名", reply_markup=InlineKeyboardMarkup(self.KEYBOARD) - ) - if filters.ChatType.GROUPS.filter(reply_message): - self.add_delete_message_job(message) - self.add_delete_message_job(reply_message) - return - character_name = roleToName(character_name) - self.log_user(update, logger.info, "查询角色培养素材命令请求 || 参数 %s", character_name) - await message.reply_chat_action(ChatAction.UPLOAD_PHOTO) - result = await self.render(character_name, material_count) - if not result: - reply_message = await message.reply_text( - f"没有找到 {character_name} 的培养素材", reply_markup=InlineKeyboardMarkup(self.KEYBOARD) - ) - if filters.ChatType.GROUPS.filter(reply_message): - self.add_delete_message_job(message) - self.add_delete_message_job(reply_message) - return - await result.reply_photo(message) diff --git a/plugins/genshin/model/__init__.py b/plugins/genshin/model/__init__.py deleted file mode 100644 index e178a1a..0000000 --- a/plugins/genshin/model/__init__.py +++ /dev/null @@ -1,29 +0,0 @@ -from plugins.genshin.model.base import * - -from plugins.genshin.model.gcsim import * - -__all__ = [ - "Digit", - "DigitType", - "Character", - "CharacterInfo", - "CharacterStats", - "Weapon", - "WeaponInfo", - "WeaponType", - "Set", - "Artifact", - "ArtifactAttribute", - "ArtifactAttributeType", - "ArtifactPosition", - "GCSimCharacter", - "GCSimSet", - "GCSimSetInfo", - "GCSimWeapon", - "GCSimWeaponInfo", - "GCSimCharacterStats", - "GCSimCharacterInfo", - "GCSimTarget", - "GCSimEnergySettings", - "GCSim", -] diff --git a/plugins/genshin/model/base.py b/plugins/genshin/model/base.py deleted file mode 100644 index e1730d9..0000000 --- a/plugins/genshin/model/base.py +++ /dev/null @@ -1,198 +0,0 @@ -from decimal import Decimal -from enum import Enum -from typing import Optional, List, NewType - -from pydantic import BaseModel, Field, validator - -# TODO: 考虑自动生成Enum -Character = NewType("Character", str) -Weapon = NewType("Weapon", str) -Set = NewType("Set", str) - - -class DigitType(Enum): - NUMERIC = "numeric" - PERCENT = "percent" - - -class Digit(BaseModel): - type: DigitType - value: Decimal - - -class WeaponType(Enum): - BOW = "bow" - CLAYMORE = "claymore" - CATALYST = "catalyst" - POLEARM = "polearm" - SWORD = "sword" - - -class ArtifactPosition(Enum): - FLOWER = "flower" - PLUME = "plume" - SANDS = "sands" - GOBLET = "goblet" - CIRCLET = "circlet" - - -class ArtifactAttributeType(Enum): - HP = "hp" - ATK = "atk" - DEF = "def" - HP_PERCENT = "hp_percent" - ATK_PERCENT = "atk_percent" - DEF_PERCENT = "def_percent" - ELEMENTAL_MASTERY = "elemental_mastery" - ENERGY_RECHARGE = "energy_recharge" - CRIT_RATE = "crit_rate" - CRIT_DMG = "crit_dmg" - HEALING_BONUS = "healing_bonus" - PYRO_DMG_BONUS = "pyro_dmg_bonus" - HYDRO_DMG_BONUS = "hydro_dmg_bonus" - DENDRO_DMG_BONUS = "dendro_dmg_bonus" - ELECTRO_DMG_BONUS = "electro_dmg_bonus" - ANEMO_DMG_BONUS = "anemo_dmg_bonus" - CRYO_DMG_BONUS = "cryo_dmg_bonus" - GEO_DMG_BONUS = "geo_dmg_bonus" - PHYSICAL_DMG_BONUS = "physical_dmg_bonus" - - -class ArtifactAttribute(BaseModel): - type: ArtifactAttributeType - digit: Digit - - -class WeaponInfo(BaseModel): - id: int = 0 - weapon: Weapon = "" - type: WeaponType - level: int = 0 - max_level: int = 0 - refinement: int = 0 - ascension: int = 0 - - @validator("max_level") - def validate_max_level(cls, v, values): - if v == 0: - return values["level"] - if v < values["level"]: - raise ValueError("max_level must be greater than or equal to level") - return v - - @validator("refinement") - def validate_refinement(cls, v): - if v < 0 or v > 5: - raise ValueError("refinement must be between 1 and 5") - return v - - -class Artifact(BaseModel): - id: int = 0 - set: Set = "" - position: ArtifactPosition - level: int = 0 - rarity: int = 0 - main_attribute: ArtifactAttribute - sub_attributes: List[ArtifactAttribute] = [] - - @validator("level") - def validate_level(cls, v): - if v < 0 or v > 20: - raise ValueError("level must be between 0 and 20") - return v - - @validator("rarity") - def validate_rarity(cls, v): - if v < 0 or v > 5: - raise ValueError("rarity must be between 0 and 5") - return v - - @validator("sub_attributes") - def validate_sub_attributes(cls, v): - if len(v) > 4: - raise ValueError("sub_attributes must not be greater than 4") - return v - - -class CharacterStats(BaseModel): - BASE_HP: Digit = Digit(type=DigitType.NUMERIC, value=Decimal(0)) - HP: Digit = Field(Digit(type=DigitType.NUMERIC, value=Decimal(0)), alias="FIGHT_PROP_HP") - HP_PERCENT: Digit = Field(Digit(type=DigitType.PERCENT, value=Decimal(0)), alias="FIGHT_PROP_HP_PERCENT") - BASE_ATTACK: Digit = Field(Digit(type=DigitType.NUMERIC, value=Decimal(0)), alias="FIGHT_PROP_BASE_ATTACK") - ATTACK: Digit = Field(Digit(type=DigitType.NUMERIC, value=Decimal(0)), alias="FIGHT_PROP_ATTACK") - ATTACK_PERCENT: Digit = Field(Digit(type=DigitType.PERCENT, value=Decimal(0)), alias="FIGHT_PROP_ATTACK_PERCENT") - BASE_DEFENSE: Digit = Field(Digit(type=DigitType.NUMERIC, value=Decimal(0)), alias="FIGHT_PROP_BASE_DEFENSE") - DEFENSE: Digit = Field(Digit(type=DigitType.NUMERIC, value=Decimal(0)), alias="FIGHT_PROP_DEFENSE") - DEFENSE_PERCENT: Digit = Field(Digit(type=DigitType.PERCENT, value=Decimal(0)), alias="FIGHT_PROP_DEFENSE_PERCENT") - ELEMENTAL_MASTERY: Digit = Field( - Digit(type=DigitType.NUMERIC, value=Decimal(0)), alias="FIGHT_PROP_ELEMENT_MASTERY" - ) - - CRIT_RATE: Digit = Field(Digit(type=DigitType.PERCENT, value=Decimal(0)), alias="FIGHT_PROP_CRITICAL") - CRIT_DMG: Digit = Field(Digit(type=DigitType.PERCENT, value=Decimal(0)), alias="FIGHT_PROP_CRITICAL_HURT") - HEALING_BONUS: Digit = Field(Digit(type=DigitType.PERCENT, value=Decimal(0)), alias="FIGHT_PROP_HEAL_ADD") - INCOMING_HEALING_BONUS: Digit = Field( - Digit(type=DigitType.PERCENT, value=Decimal(0)), alias="FIGHT_PROP_HEALED_ADD" - ) - ENERGY_RECHARGE: Digit = Field( - Digit(type=DigitType.PERCENT, value=Decimal(0)), alias="FIGHT_PROP_CHARGE_EFFICIENCY" - ) - CD_REDUCTION: Digit = Field( - Digit(type=DigitType.NUMERIC, value=Decimal(0)), alias="FIGHT_PROP_SKILL_CD_MINUS_RATIO" - ) - SHIELD_STRENGTH: Digit = Field( - Digit(type=DigitType.NUMERIC, value=Decimal(0)), alias="FIGHT_PROP_SHIELD_COST_MINUS_RATIO" - ) - - PYRO_DMG_BONUS: Digit = Field(Digit(type=DigitType.PERCENT, value=Decimal(0)), alias="FIGHT_PROP_FIRE_ADD_HURT") - PYRO_RES: Digit = Field(Digit(type=DigitType.PERCENT, value=Decimal(0)), alias="FIGHT_PROP_FIRE_SUB_HURT") - HYDRO_DMG_BONUS: Digit = Field(Digit(type=DigitType.PERCENT, value=Decimal(0)), alias="FIGHT_PROP_WATER_ADD_HURT") - HYDRO_RES: Digit = Field(Digit(type=DigitType.PERCENT, value=Decimal(0)), alias="FIGHT_PROP_WATER_SUB_HURT") - DENDRO_DMG_BONUS: Digit = Field(Digit(type=DigitType.PERCENT, value=Decimal(0)), alias="FIGHT_PROP_GRASS_ADD_HURT") - DENDRO_RES: Digit = Field(Digit(type=DigitType.PERCENT, value=Decimal(0)), alias="FIGHT_PROP_GRASS_SUB_HURT") - ELECTRO_DMG_BONUS: Digit = Field(Digit(type=DigitType.PERCENT, value=Decimal(0)), alias="FIGHT_PROP_ELEC_ADD_HURT") - ELECTRO_RES: Digit = Field(Digit(type=DigitType.PERCENT, value=Decimal(0)), alias="FIGHT_PROP_ELEC_SUB_HURT") - ANEMO_DMG_BONUS: Digit = Field(Digit(type=DigitType.PERCENT, value=Decimal(0)), alias="FIGHT_PROP_WIND_ADD_HURT") - ANEMO_RES: Digit = Field(Digit(type=DigitType.PERCENT, value=Decimal(0)), alias="FIGHT_PROP_WIND_SUB_HURT") - CRYO_DMG_BONUS: Digit = Field(Digit(type=DigitType.PERCENT, value=Decimal(0)), alias="FIGHT_PROP_ICE_ADD_HURT") - CRYO_RES: Digit = Field(Digit(type=DigitType.PERCENT, value=Decimal(0)), alias="FIGHT_PROP_ICE_SUB_HURT") - GEO_DMG_BONUS: Digit = Field(Digit(type=DigitType.PERCENT, value=Decimal(0)), alias="FIGHT_PROP_ROCK_ADD_HURT") - GEO_RES: Digit = Field(Digit(type=DigitType.PERCENT, value=Decimal(0)), alias="FIGHT_PROP_ROCK_SUB_HURT") - PHYSICAL_DMG_BONUS: Digit = Field( - Digit(type=DigitType.PERCENT, value=Decimal(0)), alias="FIGHT_PROP_PHYSICAL_SUB_HURT" - ) - PHYSICAL_RES: Digit = Field(Digit(type=DigitType.PERCENT, value=Decimal(0)), alias="FIGHT_PROP_PHYSICAL_ADD_HURT") - - CURRENT_HP: Digit = Field(Digit(type=DigitType.NUMERIC, value=Decimal(0)), alias="FIGHT_PROP_CUR_HP") - MAX_HP: Digit = Field(Digit(type=DigitType.NUMERIC, value=Decimal(0)), alias="FIGHT_PROP_MAX_HP") - CURRENT_ATTACK: Digit = Field(Digit(type=DigitType.NUMERIC, value=Decimal(0)), alias="FIGHT_PROP_CUR_ATTACK") - CURRENT_DEFENSE: Digit = Field(Digit(type=DigitType.NUMERIC, value=Decimal(0)), alias="FIGHT_PROP_CUR_DEFENSE") - - -class CharacterInfo(BaseModel): - id: int = 0 - character: Character = "" - weapon_info: Optional[WeaponInfo] = None - artifacts: List[Artifact] = [] - level: int = 0 - max_level: int = 0 - constellation: int = 0 - ascension: int = 0 - skills: List[int] = [] - rarity: int = 0 - stats: CharacterStats = CharacterStats() - - @validator("max_level") - def validate_max_level(cls, v, values): - if v == 0: - return values["level"] - if v < values["level"]: - raise ValueError("max_level must be greater than or equal to level") - return v - - @validator("skills") - def validate_skills(cls, v): - if len(v) > 3: - raise ValueError("skills must not be greater than 3") - return v diff --git a/plugins/genshin/model/converters/enka.py b/plugins/genshin/model/converters/enka.py deleted file mode 100644 index 1df23a7..0000000 --- a/plugins/genshin/model/converters/enka.py +++ /dev/null @@ -1,197 +0,0 @@ -from decimal import Decimal - -from enkanetwork import ( - CharacterInfo as EnkaCharacterInfo, - CharacterStats as EnkaCharacterStats, - StatsPercentage, - Equipments, - EquipmentsType, - EquipType, - EquipmentsStats, - DigitType as EnkaDigitType, -) - -from plugins.genshin.model import ( - CharacterInfo, - Digit, - DigitType, - CharacterStats, - WeaponInfo, - WeaponType, - Artifact, - ArtifactPosition, - ArtifactAttribute, - ArtifactAttributeType, -) -from plugins.genshin.model.metadata import Metadata - -metadata = Metadata() - - -class EnkaConverter: - @classmethod - def to_weapon_type(cls, type_str: str) -> WeaponType: - if type_str == "WEAPON_BOW": - return WeaponType.BOW - if type_str == "WEAPON_CATALYST": - return WeaponType.CATALYST - if type_str == "WEAPON_CLAYMORE": - return WeaponType.CLAYMORE - if type_str == "WEAPON_POLE": - return WeaponType.POLEARM - if type_str == "WEAPON_SWORD_ONE_HAND": - return WeaponType.SWORD - if type_str == "单手剑": - return WeaponType.SWORD - raise ValueError(f"Unknown weapon type: {type_str}") - - @classmethod - def to_weapon_info(cls, equipment: Equipments) -> WeaponInfo: - if equipment.type != EquipmentsType.WEAPON: - raise ValueError(f"Not weapon equipment type: {equipment.type}") - - weapon_data = metadata.weapon_metadata.get(str(equipment.id)) - if not weapon_data: - raise ValueError(f"Unknown weapon id: {equipment.id}") - - return WeaponInfo( - id=equipment.id, - weapon=weapon_data["route"], - type=cls.to_weapon_type(weapon_data["type"]), - level=equipment.level, - max_level=equipment.max_level, - refinement=equipment.refinement, - ascension=equipment.ascension, - ) - - @classmethod - def to_artifact_attribute_type(cls, prop_id: str) -> ArtifactAttributeType: # skipcq: PY-R1000 - if prop_id == "FIGHT_PROP_HP": - return ArtifactAttributeType.HP - if prop_id == "FIGHT_PROP_ATTACK": - return ArtifactAttributeType.ATK - if prop_id == "FIGHT_PROP_DEFENSE": - return ArtifactAttributeType.DEF - if prop_id == "FIGHT_PROP_HP_PERCENT": - return ArtifactAttributeType.HP_PERCENT - if prop_id == "FIGHT_PROP_ATTACK_PERCENT": - return ArtifactAttributeType.ATK_PERCENT - if prop_id == "FIGHT_PROP_DEFENSE_PERCENT": - return ArtifactAttributeType.DEF_PERCENT - if prop_id == "FIGHT_PROP_ELEMENT_MASTERY": - return ArtifactAttributeType.ELEMENTAL_MASTERY - if prop_id == "FIGHT_PROP_CHARGE_EFFICIENCY": - return ArtifactAttributeType.ENERGY_RECHARGE - if prop_id == "FIGHT_PROP_CRITICAL": - return ArtifactAttributeType.CRIT_RATE - if prop_id == "FIGHT_PROP_CRITICAL_HURT": - return ArtifactAttributeType.CRIT_DMG - if prop_id == "FIGHT_PROP_HEAL_ADD": - return ArtifactAttributeType.HEALING_BONUS - if prop_id == "FIGHT_PROP_FIRE_ADD_HURT": - return ArtifactAttributeType.PYRO_DMG_BONUS - if prop_id == "FIGHT_PROP_WATER_ADD_HURT": - return ArtifactAttributeType.HYDRO_DMG_BONUS - if prop_id == "FIGHT_PROP_ELEC_ADD_HURT": - return ArtifactAttributeType.ELECTRO_DMG_BONUS - if prop_id == "FIGHT_PROP_ICE_ADD_HURT": - return ArtifactAttributeType.CRYO_DMG_BONUS - if prop_id == "FIGHT_PROP_WIND_ADD_HURT": - return ArtifactAttributeType.ANEMO_DMG_BONUS - if prop_id == "FIGHT_PROP_ROCK_ADD_HURT": - return ArtifactAttributeType.GEO_DMG_BONUS - if prop_id == "FIGHT_PROP_GRASS_ADD_HURT": - return ArtifactAttributeType.DENDRO_DMG_BONUS - if prop_id == "FIGHT_PROP_PHYSICAL_ADD_HURT": - return ArtifactAttributeType.PHYSICAL_DMG_BONUS - raise ValueError(f"Unknown artifact attribute type: {prop_id}") - - @classmethod - def to_artifact_attribute(cls, equip_stat: EquipmentsStats) -> ArtifactAttribute: - return ArtifactAttribute( - type=cls.to_artifact_attribute_type(equip_stat.prop_id), - digit=Digit( - value=Decimal(equip_stat.value), - type=DigitType.PERCENT if equip_stat.type == EnkaDigitType.PERCENT else DigitType.NUMERIC, - ), - ) - - @classmethod - def to_artifact_position(cls, equip_type: EquipType) -> ArtifactPosition: - if equip_type == EquipType.Flower: - return ArtifactPosition.FLOWER - if equip_type == EquipType.Feather: - return ArtifactPosition.PLUME - if equip_type == EquipType.Sands: - return ArtifactPosition.SANDS - if equip_type == EquipType.Goblet: - return ArtifactPosition.GOBLET - if equip_type == EquipType.Circlet: - return ArtifactPosition.CIRCLET - raise ValueError(f"Unknown artifact position: {equip_type}") - - @classmethod - def to_artifact(cls, equipment: Equipments) -> Artifact: - if equipment.type != EquipmentsType.ARTIFACT: - raise ValueError(f"Not artifact equipment type: {equipment.type}") - - artifact_data = next( - ( - data - for data in metadata.artifacts_metadata.values() - if data["name"] == equipment.detail.artifact_name_set - ), - None, - ) - if not artifact_data: - raise ValueError(f"Unknown artifact: {equipment}") - - return Artifact( - id=artifact_data["id"], - set=artifact_data["route"], - position=cls.to_artifact_position(equipment.detail.artifact_type), - level=equipment.level, - rarity=equipment.detail.rarity, - main_attribute=cls.to_artifact_attribute(equipment.detail.mainstats), - sub_attributes=[cls.to_artifact_attribute(stat) for stat in equipment.detail.substats], - ) - - @classmethod - def to_character_stats(cls, character_stats: EnkaCharacterStats) -> CharacterStats: - return CharacterStats( - **{ - stat: Digit( - value=Decimal(value.value), - type=DigitType.PERCENT if isinstance(value, StatsPercentage) else DigitType.NUMERIC, - ) - for stat, value in character_stats._iter() # pylint: disable=W0212 - } - ) - - @classmethod - def to_character(cls, character_info: EnkaCharacterInfo) -> str: - character_id = str(character_info.id) - if character_id in ("10000005", "10000007"): - character_id += f"-{character_info.element.name.lower()}" - character_data = metadata.characters_metadata.get(character_id) - if not character_data: - raise ValueError(f"Unknown character: {character_info.name}\n{character_info}") - return character_data["route"] - - @classmethod - def to_character_info(cls, character_info: EnkaCharacterInfo) -> CharacterInfo: - weapon_equip = next((equip for equip in character_info.equipments if equip.type == EquipmentsType.WEAPON), None) - artifacts_equip = [equip for equip in character_info.equipments if equip.type == EquipmentsType.ARTIFACT] - return CharacterInfo( - id=character_info.id, - character=cls.to_character(character_info), - rarity=character_info.rarity, - weapon_info=cls.to_weapon_info(weapon_equip) if weapon_equip else None, - artifacts=[cls.to_artifact(equip) for equip in artifacts_equip], - level=character_info.level, - max_level=character_info.max_level, - ascension=character_info.ascension, - constellation=character_info.constellations_unlocked, - skills=[skill.level for skill in character_info.skills], - stats=cls.to_character_stats(character_info.stats), - ) diff --git a/plugins/genshin/model/converters/gcsim.py b/plugins/genshin/model/converters/gcsim.py deleted file mode 100644 index e1efb97..0000000 --- a/plugins/genshin/model/converters/gcsim.py +++ /dev/null @@ -1,405 +0,0 @@ -import re -from collections import Counter -from decimal import Decimal -from functools import lru_cache -from typing import List, Optional, Tuple, Dict - -from gcsim_pypi.aliases import CHARACTER_ALIASES, WEAPON_ALIASES, ARTIFACT_ALIASES -from pydantic import ValidationError - -from plugins.genshin.model import ( - Set, - Weapon, - DigitType, - WeaponInfo, - Artifact, - ArtifactAttributeType, - Character, - CharacterInfo, - GCSim, - GCSimTarget, - GCSimWeapon, - GCSimWeaponInfo, - GCSimSet, - GCSimSetInfo, - GCSimCharacter, - GCSimEnergySettings, - GCSimCharacterInfo, - GCSimCharacterStats, -) -from plugins.genshin.model.metadata import Metadata -from utils.log import logger - -metadata = Metadata() - - -def remove_non_words(text: str) -> str: - return text.replace("'", "").replace('"', "").replace("-", "").replace(" ", "") - - -def from_character_gcsim_character(character: Character) -> GCSimCharacter: - if character == "Raiden Shogun": - return GCSimCharacter("raiden") - if character == "Yae Miko": - return GCSimCharacter("yaemiko") - if character == "Hu Tao": - return GCSimCharacter("hutao") - if character == "Yun Jin": - return GCSimCharacter("yunjin") - if character == "Kuki Shinobu": - return GCSimCharacter("kuki") - if "Traveler" in character: - s = character.split(" ") - traveler_name = "aether" if s[-1] == "Boy" else "lumine" - return GCSimCharacter(f"{traveler_name}{s[0].lower()}") - return GCSimCharacter(character.split(" ")[-1].lower()) - - -GCSIM_CHARACTER_TO_CHARACTER: Dict[GCSimCharacter, Tuple[int, Character]] = {} -for char in metadata.characters_metadata.values(): - GCSIM_CHARACTER_TO_CHARACTER[from_character_gcsim_character(char["route"])] = (char["id"], char["route"]) -for alias, char in CHARACTER_ALIASES.items(): - if alias not in GCSIM_CHARACTER_TO_CHARACTER: - if char in GCSIM_CHARACTER_TO_CHARACTER: - GCSIM_CHARACTER_TO_CHARACTER[alias] = GCSIM_CHARACTER_TO_CHARACTER[char] - elif alias.startswith("traveler") or alias.startswith("aether") or alias.startswith("lumine"): - continue - else: - logger.warning("Character alias %s not found in GCSIM", alias) - -GCSIM_WEAPON_TO_WEAPON: Dict[GCSimWeapon, Tuple[int, Weapon]] = {} -for _weapon in metadata.weapon_metadata.values(): - GCSIM_WEAPON_TO_WEAPON[remove_non_words(_weapon["route"].lower())] = (_weapon["id"], _weapon["route"]) -for alias, _weapon in WEAPON_ALIASES.items(): - if alias not in GCSIM_WEAPON_TO_WEAPON: - if _weapon in GCSIM_WEAPON_TO_WEAPON: - GCSIM_WEAPON_TO_WEAPON[alias] = GCSIM_WEAPON_TO_WEAPON[_weapon] - else: - logger.warning("Weapon alias %s not found in GCSIM", alias) - -GCSIM_ARTIFACT_TO_ARTIFACT: Dict[GCSimSet, Tuple[int, Set]] = {} -for _artifact in metadata.artifacts_metadata.values(): - GCSIM_ARTIFACT_TO_ARTIFACT[remove_non_words(_artifact["route"].lower())] = (_artifact["id"], _artifact["route"]) -for alias, _artifact in ARTIFACT_ALIASES.items(): - if alias not in GCSIM_ARTIFACT_TO_ARTIFACT: - if _artifact in GCSIM_ARTIFACT_TO_ARTIFACT: - GCSIM_ARTIFACT_TO_ARTIFACT[alias] = GCSIM_ARTIFACT_TO_ARTIFACT[_artifact] - else: - logger.warning("Artifact alias %s not found in GCSIM", alias) - - -class GCSimConverter: - literal_keys_numeric_values_regex = re.compile( - r"([\w_%]+)=(\d+ *, *\d+ *, *\d+|[\d*\.*\d+]+ *, *[\d*\.*\d+]+|\d+/\d+|\d*\.*\d+|\d+)" - ) - - @classmethod - def to_character(cls, character: GCSimCharacter) -> Tuple[int, Character]: - return GCSIM_CHARACTER_TO_CHARACTER[character] - - @classmethod - def from_character(cls, character: Character) -> GCSimCharacter: - return from_character_gcsim_character(character) - - @classmethod - def to_weapon(cls, weapon: GCSimWeapon) -> Tuple[int, Weapon]: - return GCSIM_WEAPON_TO_WEAPON[weapon] - - @classmethod - def from_weapon(cls, weapon: Weapon) -> GCSimWeapon: - return GCSimWeapon(remove_non_words(weapon).lower()) - - @classmethod - def from_weapon_info(cls, weapon_info: Optional[WeaponInfo]) -> GCSimWeaponInfo: - if weapon_info is None: - return GCSimWeaponInfo(weapon=GCSimWeapon("dullblade"), refinement=1, level=1, max_level=20) - return GCSimWeaponInfo( - weapon=cls.from_weapon(weapon_info.weapon), - refinement=weapon_info.refinement, - level=weapon_info.level, - max_level=weapon_info.max_level, - ) - - @classmethod - def to_set(cls, set_name: GCSimSet) -> Tuple[int, Set]: - return GCSIM_ARTIFACT_TO_ARTIFACT[set_name] - - @classmethod - def from_set(cls, set_name: Set) -> GCSimSet: - return GCSimSet(remove_non_words(set_name).lower()) - - @classmethod - def from_artifacts(cls, artifacts: List[Artifact]) -> List[GCSimSetInfo]: - c = Counter() - for art in artifacts: - c[cls.from_set(art.set)] += 1 - return [GCSimSetInfo(set=set_name, count=count) for set_name, count in c.items()] - - @classmethod - @lru_cache - def from_attribute_type(cls, attribute_type: ArtifactAttributeType) -> str: # skipcq: PY-R1000 - if attribute_type == ArtifactAttributeType.HP: - return "HP" - if attribute_type == ArtifactAttributeType.HP_PERCENT: - return "HP_PERCENT" - if attribute_type == ArtifactAttributeType.ATK: - return "ATK" - if attribute_type == ArtifactAttributeType.ATK_PERCENT: - return "ATK_PERCENT" - if attribute_type == ArtifactAttributeType.DEF: - return "DEF" - if attribute_type == ArtifactAttributeType.DEF_PERCENT: - return "DEF_PERCENT" - if attribute_type == ArtifactAttributeType.ELEMENTAL_MASTERY: - return "EM" - if attribute_type == ArtifactAttributeType.ENERGY_RECHARGE: - return "ER" - if attribute_type == ArtifactAttributeType.CRIT_RATE: - return "CR" - if attribute_type == ArtifactAttributeType.CRIT_DMG: - return "CD" - if attribute_type == ArtifactAttributeType.HEALING_BONUS: - return "HEAL" - if attribute_type == ArtifactAttributeType.PYRO_DMG_BONUS: - return "PYRO_PERCENT" - if attribute_type == ArtifactAttributeType.HYDRO_DMG_BONUS: - return "HYDRO_PERCENT" - if attribute_type == ArtifactAttributeType.DENDRO_DMG_BONUS: - return "DENDRO_PERCENT" - if attribute_type == ArtifactAttributeType.ELECTRO_DMG_BONUS: - return "ELECTRO_PERCENT" - if attribute_type == ArtifactAttributeType.ANEMO_DMG_BONUS: - return "ANEMO_PERCENT" - if attribute_type == ArtifactAttributeType.CRYO_DMG_BONUS: - return "CRYO_PERCENT" - if attribute_type == ArtifactAttributeType.GEO_DMG_BONUS: - return "GEO_PERCENT" - if attribute_type == ArtifactAttributeType.PHYSICAL_DMG_BONUS: - return "PHYS_PERCENT" - raise ValueError(f"Unknown attribute type: {attribute_type}") - - @classmethod - def from_artifacts_stats(cls, artifacts: List[Artifact]) -> GCSimCharacterStats: - gcsim_stats = GCSimCharacterStats() - for art in artifacts: - main_attr_name = cls.from_attribute_type(art.main_attribute.type) - setattr( - gcsim_stats, - main_attr_name, - getattr(gcsim_stats, main_attr_name) - + ( - Decimal(art.main_attribute.digit.value) / Decimal(100) - if art.main_attribute.digit.type == DigitType.PERCENT - else Decimal(art.main_attribute.digit.value) - ), - ) - for sub_attr in art.sub_attributes: - attr_name = cls.from_attribute_type(sub_attr.type) - setattr( - gcsim_stats, - attr_name, - getattr(gcsim_stats, attr_name) - + ( - Decimal(sub_attr.digit.value) / Decimal(100) - if sub_attr.digit.type == DigitType.PERCENT - else Decimal(sub_attr.digit.value) - ), - ) - return gcsim_stats - - @classmethod - def from_character_info(cls, character: CharacterInfo) -> GCSimCharacterInfo: - return GCSimCharacterInfo( - character=cls.from_character(character.character), - level=character.level, - max_level=character.max_level, - constellation=character.constellation, - talent=character.skills, - weapon_info=cls.from_weapon_info(character.weapon_info), - set_info=cls.from_artifacts(character.artifacts), - # NOTE: Only stats from arifacts are needed - stats=cls.from_artifacts_stats(character.artifacts), - ) - - @classmethod - def merge_character_infos(cls, gcsim: GCSim, character_infos: List[CharacterInfo]) -> GCSim: - gcsim_characters = {ch.character: ch for ch in gcsim.characters} - for character_info in character_infos: - try: - gcsim_character = cls.from_character_info(character_info) - if gcsim_character.character in gcsim_characters: - gcsim_characters[gcsim_character.character] = gcsim_character - except ValidationError as e: - errors = e.errors() - if errors and errors[0].get("msg").startswith("Not supported"): - # Something is not supported, skip - continue - logger.warning("Failed to convert character info: %s", character_info) - gcsim.characters = list(gcsim_characters.values()) - return gcsim - - @classmethod - def prepend_scripts(cls, gcsim: GCSim, scripts: List[str]) -> GCSim: - gcsim.scripts = scripts + gcsim.scripts - return gcsim - - @classmethod - def append_scripts(cls, gcsim: GCSim, scripts: List[str]) -> GCSim: - gcsim.scripts = gcsim.scripts + scripts - return gcsim - - @classmethod - def from_gcsim_energy(cls, line: str) -> GCSimEnergySettings: - energy_settings = GCSimEnergySettings() - matches = cls.literal_keys_numeric_values_regex.findall(line) - for key, value in matches: - if key == "interval": - energy_settings.intervals = list(map(int, value.split(","))) - elif key == "amount": - energy_settings.amount = int(value) - else: - logger.warning("Unknown energy setting: %s=%s", key, value) - return energy_settings - - @classmethod - def from_gcsim_target(cls, line: str) -> GCSimTarget: - target = GCSimTarget() - matches = cls.literal_keys_numeric_values_regex.findall(line) - for key, value in matches: - if key == "lvl": - target.level = int(value) - elif key == "hp": - target.hp = int(value) - elif key == "amount": - target.amount = int(value) - elif key == "resist": - target.resist = float(value) - elif key == "pos": - target.position = tuple(p for p in value.split(",")) - elif key == "interval": - target.interval = list(map(int, value.split(","))) - elif key == "radius": - target.radius = float(value) - elif key == "particle_threshold": - target.particle_threshold = float(value) - elif key == "particle_drop_count": - target.particle_drop_count = float(value) - elif key in ("pyro", "hydro", "dendro", "electro", "anemo", "cryo", "geo", "physical"): - target.others[key] = float(value) - else: - logger.warning("Unknown target setting: %s=%s", key, value) - return target - - @classmethod - def from_gcsim_char_line(cls, line: str, character: GCSimCharacterInfo) -> GCSimCharacterInfo: - matches = cls.literal_keys_numeric_values_regex.findall(line) - for key, value in matches: - if key == "lvl": - character.level, character.max_level = map(int, value.split("/")) - elif key == "cons": - character.constellation = int(value) - elif key == "talent": - character.talent = list(map(int, value.split(","))) - elif key == "start_hp": - character.start_hp = int(value) - elif key == "breakthrough": - character.params.append(f"{key}={value}") - else: - logger.warning("Unknown character setting: %s=%s", key, value) - return character - - @classmethod - def from_gcsim_weapon_line(cls, line: str, weapon_info: GCSimWeaponInfo) -> GCSimWeaponInfo: - weapon_name = re.search(r"weapon= *\"(.*)\"", line).group(1) - if weapon_name not in WEAPON_ALIASES: - raise ValueError(f"Unknown weapon: {weapon_name}") - weapon_info.weapon = WEAPON_ALIASES[weapon_name] - - for key, value in cls.literal_keys_numeric_values_regex.findall(line): - if key == "refine": - weapon_info.refinement = int(value) - elif key == "lvl": - weapon_info.level, weapon_info.max_level = map(int, value.split("/")) - elif key.startswith("stack"): - weapon_info.params.append(f"stacks={value}") - elif key in ("pickup_delay", "breakthrough"): - weapon_info.params.append(f"{key}={value}") - else: - logger.warning("Unknown weapon setting: %s=%s", key, value) - return weapon_info - - @classmethod - def from_gcsim_set_line(cls, line: str) -> GCSimSetInfo: - gcsim_set = re.search(r"set= *\"(.*)\"", line).group(1) - if gcsim_set not in ARTIFACT_ALIASES: - raise ValueError(f"Unknown set: {gcsim_set}") - gcsim_set = ARTIFACT_ALIASES[gcsim_set] - set_info = GCSimSetInfo(set=gcsim_set) - - for key, value in cls.literal_keys_numeric_values_regex.findall(line): - if key == "count": - set_info.count = int(value) - elif key.startswith("stack"): - set_info.params.append(f"stacks={value}") - else: - logger.warning("Unknown set info: %s=%s", key, value) - return set_info - - @classmethod - def from_gcsim_stats_line(cls, line: str, stats: GCSimCharacterStats) -> GCSimCharacterStats: - matches = re.findall(r"(\w+%?)=(\d*\.*\d+)", line) - for stat, value in matches: - attr = stat.replace("%", "_percent").upper() - setattr(stats, attr, getattr(stats, attr) + Decimal(value)) - return stats - - @classmethod - def from_gcsim_script(cls, script: str) -> GCSim: # skipcq: PY-R1000 - options = "" - characters = {} - character_aliases = {} - active_character = None - targets = [] - energy_settings = GCSimEnergySettings() - script_lines = [] - for line in script.strip().split("\n"): - line = line.split("#")[0].strip() - if not line or line.startswith("#"): - continue - if line.startswith("options"): - options = line.strip(";") - elif line.startswith("target"): - targets.append(cls.from_gcsim_target(line)) - elif line.startswith("energy"): - energy_settings = cls.from_gcsim_energy(line) - elif line.startswith("active"): - active_character = line.strip(";").split(" ")[1] - elif m := re.match(r"(\w+) +(char|add weapon|add set|add stats)\W", line): - if m.group(1) not in CHARACTER_ALIASES: - raise ValueError(f"Unknown character: {m.group(1)}") - c = CHARACTER_ALIASES[m.group(1)] - if c not in characters: - characters[c] = GCSimCharacterInfo(character=c) - if m.group(1) != c: - character_aliases[m.group(1)] = c - if m.group(2) == "char": - characters[c] = cls.from_gcsim_char_line(line, characters[c]) - elif m.group(2) == "add weapon": - characters[c].weapon_info = cls.from_gcsim_weapon_line(line, characters[c].weapon_info) - elif m.group(2) == "add set": - characters[c].set_info.append(cls.from_gcsim_set_line(line)) - elif m.group(2) == "add stats": - characters[c].stats = cls.from_gcsim_stats_line(line, characters[c].stats) - else: - for key, value in character_aliases.items(): - line = line.replace(f"{key} ", f"{value} ") - line = line.replace(f".{key}.", f".{value}.") - script_lines.append(line) - return GCSim( - options=options, - characters=list(characters.values()), - targets=targets, - energy_settings=energy_settings, - active_character=active_character, - script_lines=script_lines, - ) diff --git a/plugins/genshin/model/gcsim.py b/plugins/genshin/model/gcsim.py deleted file mode 100644 index 3fd867f..0000000 --- a/plugins/genshin/model/gcsim.py +++ /dev/null @@ -1,237 +0,0 @@ -from decimal import Decimal -from typing import Any, NewType, List, Optional, Tuple, Dict - -from gcsim_pypi.aliases import ARTIFACT_ALIASES, CHARACTER_ALIASES, WEAPON_ALIASES -from gcsim_pypi.availability import AVAILABLE_ARTIFACTS, AVAILABLE_CHARACTERS, AVAILABLE_WEAPONS -from pydantic import BaseModel, validator - -GCSimCharacter = NewType("GCSimCharacter", str) -GCSimWeapon = NewType("GCSimWeapon", str) -GCSimSet = NewType("GCSimSet", str) - - -class GCSimWeaponInfo(BaseModel): - weapon: GCSimWeapon = "dullblade" - refinement: int = 1 - level: int = 1 - max_level: int = 20 - params: List[str] = [] - - @validator("weapon") - def validate_weapon(cls, v): - if v not in AVAILABLE_WEAPONS or v not in WEAPON_ALIASES: - raise ValueError(f"Not supported weapon: {v}") - return WEAPON_ALIASES[v] - - -class GCSimSetInfo(BaseModel): - set: GCSimSet - count: int = 2 - params: List[str] = [] - - @validator("set") - def validate_set(cls, v): - if v not in AVAILABLE_ARTIFACTS or v not in ARTIFACT_ALIASES: - raise ValueError(f"Not supported set: {v}") - return ARTIFACT_ALIASES[v] - - -class GCSimCharacterStats(BaseModel): - HP: Decimal = Decimal(0) - HP_PERCENT: Decimal = Decimal(0) - ATK: Decimal = Decimal(0) - ATK_PERCENT: Decimal = Decimal(0) - DEF: Decimal = Decimal(0) - DEF_PERCENT: Decimal = Decimal(0) - EM: Decimal = Decimal(0) - ER: Decimal = Decimal(0) - CR: Decimal = Decimal(0) - CD: Decimal = Decimal(0) - HEAL: Decimal = Decimal(0) - PYRO_PERCENT: Decimal = Decimal(0) - HYDRO_PERCENT: Decimal = Decimal(0) - DENDRO_PERCENT: Decimal = Decimal(0) - ELECTRO_PERCENT: Decimal = Decimal(0) - ANEMO_PERCENT: Decimal = Decimal(0) - CRYO_PERCENT: Decimal = Decimal(0) - GEO_PERCENT: Decimal = Decimal(0) - PHYS_PERCENT: Decimal = Decimal(0) - - -class GCSimCharacterInfo(BaseModel): - character: GCSimCharacter - level: int = 1 - max_level: int = 20 - constellation: int = 0 - talent: List[int] = [1, 1, 1] - start_hp: Optional[int] = None - weapon_info: GCSimWeaponInfo = GCSimWeaponInfo() - set_info: List[GCSimSetInfo] = [] - stats: GCSimCharacterStats = GCSimCharacterStats() - params: List[str] = [] - - @validator("character") - def validate_character(cls, v): - if v not in AVAILABLE_CHARACTERS or v not in CHARACTER_ALIASES: - raise ValueError(f"Not supported character: {v}") - return CHARACTER_ALIASES[v] - - @property - def char(self) -> str: - return self.character - - @property - def char_line(self) -> str: - return ( - " ".join( - filter( - lambda w: w, - [ - f"{self.char}", - "char", - f"lvl={self.level}/{self.max_level}", - f"cons={self.constellation}", - f"start_hp={self.start_hp}" if self.start_hp is not None else "", - f"talent={','.join(str(t) for t in self.talent)}", - f"+params=[{','.join(self.params)}] " if self.params else "", - ], - ) - ) - + ";" - ) - - @property - def weapon_line(self) -> str: - return ( - " ".join( - filter( - lambda w: w, - [ - f"{self.char}", - f'add weapon="{self.weapon_info.weapon}"', - f"refine={self.weapon_info.refinement}", - f"lvl={self.weapon_info.level}/{self.weapon_info.max_level}", - f"+params=[{','.join(self.weapon_info.params)}] " if self.weapon_info.params else "", - ], - ) - ) - + ";" - ) - - @property - def set_line(self) -> str: - return "\n".join( - " ".join( - filter( - lambda w: w, - [ - f"{self.char}", - f'add set="{set_info.set}"', - f"count={4 if set_info.count >= 4 else 2}", - f"+params=[{','.join(set_info.params)}] " if set_info.params else "", - ], - ) - ) - + ";" - for set_info in self.set_info - # NOTE: 祭*系列似乎并不支持 - if set_info.count > 1 - ) - - @property - def stats_line(self) -> str: - if all(value == 0 for _, value in self.stats): - return "" - return ( - f"{self.char} add stats " - + " ".join( - [ - ( - f"{stat.replace('_PERCENT', '%').lower()}={value:.4f}" - if stat.endswith("_PERCENT") or stat in {"CR", "CD", "ER"} - else f"{stat.lower()}={value:.2f}" - ) - for stat, value in iter(self.stats) - if value > 0 - ] - ) - + ";" - ) - - def __str__(self) -> str: - return "\n".join([self.char_line, self.weapon_line, self.set_line, self.stats_line]) - - -class GCSimTarget(BaseModel): - level: int = 100 - resist: float = 0.1 - position: Tuple[str, str] = ("0", "0") - interval: List[int] = [] - radius: Optional[float] = None - hp: Optional[int] = None - amount: Optional[int] = None - particle_threshold: Optional[float] = None - particle_drop_count: Optional[float] = None - others: Dict[str, Any] = {} - - def __str__(self) -> str: - return ( - " ".join( - filter( - lambda w: w, - [ - f"target lvl={self.level} resist={self.resist} ", - f"pos={','.join(self.position)}", - f"radius={self.radius}" if self.radius is not None else "", - f"hp={self.hp}" if self.hp is not None else "", - f"amount={self.amount}" if self.amount is not None else "", - f"interval={','.join(str(i) for i in self.interval)}" if self.interval else "", - f"particle_threshold={self.particle_threshold}" if self.particle_threshold is not None else "", - ( - f"particle_drop_count={self.particle_drop_count}" - if self.particle_drop_count is not None - else "" - ), - " ".join([f"{k}={v}" for k, v in self.others.items()]), - ], - ) - ) - + ";" - ) - - -class GCSimEnergySettings(BaseModel): - intervals: List[int] = [480, 720] - amount: int = 1 - - def __str__(self) -> str: - return f"energy every interval={','.join(str(i) for i in self.intervals)} amount={self.amount};" - - -class GCSim(BaseModel): - options: Optional[str] = None - characters: List[GCSimCharacterInfo] = [] - targets: List[GCSimTarget] = [GCSimTarget()] - energy_settings: Optional[GCSimEnergySettings] = None - # TODO: Do we even want this? - hurt_settings: Optional[str] = None - active_character: Optional[GCSimCharacter] = None - script_lines: List[str] = [] - - def __str__(self) -> str: - line = "" - if self.options: - line += f"{self.options};\n" - line += "\n".join([str(c) for c in self.characters]) - line += "\n" - line += "\n".join([str(t) for t in self.targets]) - line += "\n" - if self.energy_settings: - line += f"{self.energy_settings}\n" - if self.active_character: - line += f"active {self.active_character};\n" - else: - line += f"active {self.characters[0].char};\n" - line += "\n".join(self.script_lines) - line += "\n" - return line diff --git a/plugins/genshin/model/metadata.py b/plugins/genshin/model/metadata.py deleted file mode 100644 index cdde2d8..0000000 --- a/plugins/genshin/model/metadata.py +++ /dev/null @@ -1,31 +0,0 @@ -from typing import Dict, Any - -from utils.const import PROJECT_ROOT - -try: - import ujson as jsonlib -except ImportError: - import json as jsonlib - -METADATA_PATH = PROJECT_ROOT.joinpath("metadata").joinpath("data") - - -class Metadata: - _instance: "Metadata" = None - weapon_metadata: Dict[str, Any] = {} - artifacts_metadata: Dict[str, Any] = {} - characters_metadata: Dict[str, Any] = {} - - def __new__(cls): - if cls._instance is None: - cls._instance = super().__new__(cls) - cls._instance.reload_assets() - return cls._instance - - def reload_assets(self) -> None: - self.__load_assets_data() - - def __load_assets_data(self) -> None: - self.weapon_metadata = jsonlib.loads(METADATA_PATH.joinpath("weapon.json").read_text(encoding="utf-8")) - self.artifacts_metadata = jsonlib.loads(METADATA_PATH.joinpath("reliquary.json").read_text(encoding="utf-8")) - self.characters_metadata = jsonlib.loads(METADATA_PATH.joinpath("avatar.json").read_text(encoding="utf-8")) diff --git a/plugins/genshin/pay_log.py b/plugins/genshin/pay_log.py deleted file mode 100644 index 4feadef..0000000 --- a/plugins/genshin/pay_log.py +++ /dev/null @@ -1,244 +0,0 @@ -from typing import TYPE_CHECKING, Optional, List - -from simnet import GenshinClient, Region -from telegram import InlineKeyboardButton, InlineKeyboardMarkup -from telegram.constants import ChatAction -from telegram.ext import CommandHandler, MessageHandler, filters, ConversationHandler -from telegram.helpers import create_deep_linked_url - -from core.basemodel import RegionEnum -from core.config import config -from core.plugin import Plugin, handler, conversation -from core.services.cookies import CookiesService -from core.services.players.services import PlayersService -from core.services.template.services import TemplateService -from modules.gacha_log.helpers import from_url_get_authkey -from modules.pay_log.error import PayLogNotFound, PayLogAccountNotFound, PayLogInvalidAuthkey, PayLogAuthkeyTimeout -from modules.pay_log.log import PayLog -from modules.pay_log.migrate import PayLogMigrate -from plugins.tools.genshin import PlayerNotFoundError, CookiesNotFoundError -from plugins.tools.player_info import PlayerInfoSystem -from utils.log import logger - -if TYPE_CHECKING: - from telegram import Update, User - from telegram.ext import ContextTypes - from gram_core.services.players.models import Player - - -INPUT_URL, CONFIRM_DELETE = range(10100, 10102) -WAITING = f"小{config.notice.bot_name}正在从服务器获取数据,请稍后" -PAYLOG_NOT_FOUND = f"{config.notice.bot_name}没有找到你的充值记录,快来私聊{config.notice.bot_name}导入吧~" - - -class PayLogPlugin(Plugin.Conversation): - """充值记录导入/导出/分析""" - - def __init__( - self, - template_service: TemplateService, - players_service: PlayersService, - cookie_service: CookiesService, - player_info: PlayerInfoSystem, - ): - self.template_service = template_service - self.players_service = players_service - self.cookie_service = cookie_service - self.pay_log = PayLog() - self.player_info = player_info - - async def get_player_id(self, uid: int) -> int: - """获取绑定的游戏ID""" - logger.debug("尝试获取已绑定的原神账号") - player = await self.players_service.get_player(uid) - if player is None: - raise PlayerNotFoundError(uid) - return player.player_id - - async def _refresh_user_data(self, user: "User", authkey: str = None) -> str: - """刷新用户数据 - :param user: 用户 - :param authkey: 认证密钥 - :return: 返回信息 - """ - try: - player_id = await self.get_player_id(user.id) - new_num = await self.pay_log.get_log_data(user.id, player_id, authkey) - return "更新完成,本次没有新增数据" if new_num == 0 else f"更新完成,本次共新增{new_num}条充值记录" - except PayLogNotFound: - return f"{config.notice.bot_name}没有找到你的充值记录,快去充值吧~" - except PayLogAccountNotFound: - return "导入失败,可能文件包含的祈愿记录所属 uid 与你当前绑定的 uid 不同" - except PayLogInvalidAuthkey: - return "更新数据失败,authkey 无效" - except PayLogAuthkeyTimeout: - return "更新数据失败,authkey 已经过期" - except PlayerNotFoundError: - logger.info("未查询到用户 %s[%s] 所绑定的账号信息", user.full_name, user.id) - return config.notice.user_not_found - - @conversation.entry_point - @handler.command(command="pay_log_import", filters=filters.ChatType.PRIVATE, block=False) - @handler.message(filters=filters.Regex("^导入充值记录$") & filters.ChatType.PRIVATE, block=False) - @handler.command(command="start", filters=filters.Regex("pay_log_import$"), block=False) - async def command_start(self, update: "Update", _: "ContextTypes.DEFAULT_TYPE") -> int: - message = update.effective_message - user = update.effective_user - logger.info("用户 %s[%s] 导入充值记录命令请求", user.full_name, user.id) - player_info = await self.players_service.get_player(user.id, region=RegionEnum.HYPERION) - if player_info is not None: - cookies = await self.cookie_service.get(user.id, account_id=player_info.account_id) - if cookies is not None: - if "stoken" in cookies.data: - if stuid := next( - (value for key, value in cookies.data.items() if key in ["ltuid", "login_uid"]), None - ): - cookies.data["stuid"] = stuid - async with GenshinClient( - cookies=cookies.data, region=Region.CHINESE, lang="zh-cn", player_id=player_info.player_id - ) as client: - authkey = await client.get_authkey_by_stoken("csc") - else: - await message.reply_text("该功能需要绑定 stoken 才能使用") - return ConversationHandler.END - else: - raise CookiesNotFoundError(user.id) - else: - raise CookiesNotFoundError(user.id) - reply = await message.reply_text(WAITING) - await message.reply_chat_action(ChatAction.TYPING) - data = await self._refresh_user_data(user, authkey=authkey) - await reply.edit_text(data) - return ConversationHandler.END - - @conversation.state(state=INPUT_URL) - @handler.message(filters=~filters.COMMAND, block=False) - async def import_data_from_message(self, update: "Update", _: "ContextTypes.DEFAULT_TYPE") -> int: - message = update.effective_message - user = update.effective_user - if message.document: - await message.reply_text("呜呜呜~本次导入不支持文件导入,请尝试获取连接") - return INPUT_URL - if not message.text: - await message.reply_text("呜呜呜~输入错误,请尝试重新获取连接") - return INPUT_URL - authkey = from_url_get_authkey(message.text) - reply = await message.reply_text(WAITING) - await message.reply_chat_action(ChatAction.TYPING) - text = await self._refresh_user_data(user, authkey=authkey) - await reply.edit_text(text) - return ConversationHandler.END - - @conversation.entry_point - @handler(CommandHandler, command="pay_log_delete", filters=filters.ChatType.PRIVATE, block=False) - @handler(MessageHandler, filters=filters.Regex("^删除充值记录$") & filters.ChatType.PRIVATE, block=False) - async def command_start_delete(self, update: "Update", context: "ContextTypes.DEFAULT_TYPE") -> int: - message = update.effective_message - user = update.effective_user - logger.info("用户 %s[%s] 删除充值记录命令请求", user.full_name, user.id) - player_info = await self.players_service.get_player(user.id) - if player_info is None: - logger.info("未查询到用户 %s[%s] 所绑定的账号信息", user.full_name, user.id) - await message.reply_text(config.notice.user_not_found) - return ConversationHandler.END - _, status = await self.pay_log.load_history_info(str(user.id), str(player_info.player_id), only_status=True) - if not status: - await message.reply_text("你还没有导入充值记录哦~") - return ConversationHandler.END - context.chat_data["uid"] = player_info.player_id - await message.reply_text( - "你确定要删除充值记录吗?(此项操作无法恢复),如果确定请发送 ”确定“,发送其他内容取消" - ) - return CONFIRM_DELETE - - @conversation.state(state=CONFIRM_DELETE) - @handler.message(filters=filters.TEXT & ~filters.COMMAND, block=False) - async def command_confirm_delete(self, update: "Update", context: "ContextTypes.DEFAULT_TYPE") -> int: - message = update.effective_message - user = update.effective_user - if message.text == "确定": - status = await self.pay_log.remove_history_info(str(user.id), str(context.chat_data["uid"])) - await message.reply_text("充值记录已删除" if status else "充值记录删除失败") - return ConversationHandler.END - await message.reply_text("已取消") - return ConversationHandler.END - - @handler(CommandHandler, command="pay_log_force_delete", block=False, admin=True) - async def command_pay_log_force_delete(self, update: "Update", context: "ContextTypes.DEFAULT_TYPE"): - message = update.effective_message - args = self.get_args(context) - if not args: - await message.reply_text("请指定用户ID") - return - try: - cid = int(args[0]) - if cid < 0: - raise ValueError("Invalid cid") - player_info = await self.players_service.get_player(cid) - if player_info is None: - await message.reply_text("该用户暂未绑定账号") - return - _, status = await self.pay_log.load_history_info(str(cid), str(player_info.player_id), only_status=True) - if not status: - await message.reply_text("该用户还没有导入充值记录") - return - status = await self.pay_log.remove_history_info(str(cid), str(player_info.player_id)) - await message.reply_text("充值记录已强制删除" if status else "充值记录删除失败") - except PayLogNotFound: - await message.reply_text("该用户还没有导入充值记录") - except (ValueError, IndexError): - await message.reply_text("用户ID 不合法") - - @handler(CommandHandler, command="pay_log_export", filters=filters.ChatType.PRIVATE, block=False) - @handler(MessageHandler, filters=filters.Regex("^导出充值记录$") & filters.ChatType.PRIVATE, block=False) - async def command_start_export(self, update: "Update", context: "ContextTypes.DEFAULT_TYPE") -> None: - message = update.effective_message - user = update.effective_user - logger.info("用户 %s[%s] 导出充值记录命令请求", user.full_name, user.id) - try: - await message.reply_chat_action(ChatAction.TYPING) - player_id = await self.get_player_id(user.id) - path = self.pay_log.get_file_path(str(user.id), str(player_id)) - if not path.exists(): - raise PayLogNotFound - await message.reply_chat_action(ChatAction.UPLOAD_DOCUMENT) - await message.reply_document(document=open(path, "rb+"), caption="充值记录导出文件") - except PayLogNotFound: - buttons = [ - [InlineKeyboardButton("点我导入", url=create_deep_linked_url(context.bot.username, "pay_log_import"))] - ] - await message.reply_text(PAYLOG_NOT_FOUND, reply_markup=InlineKeyboardMarkup(buttons)) - except PayLogAccountNotFound: - await message.reply_text("导出失败,可能文件包含的祈愿记录所属 uid 与你当前绑定的 uid 不同") - except PlayerNotFoundError: - logger.info("未查询到用户 %s[%s] 所绑定的账号信息", user.full_name, user.id) - await message.reply_text(config.notice.user_not_found) - - @handler(CommandHandler, command="pay_log", block=False) - @handler(MessageHandler, filters=filters.Regex("^充值记录$"), block=False) - async def command_start_analysis(self, update: "Update", context: "ContextTypes.DEFAULT_TYPE") -> None: - user_id = await self.get_real_user_id(update) - message = update.effective_message - self.log_user(update, logger.info, "充值记录统计命令请求") - try: - await message.reply_chat_action(ChatAction.TYPING) - player_id = await self.get_player_id(user_id) - data = await self.pay_log.get_analysis(user_id, player_id) - await message.reply_chat_action(ChatAction.UPLOAD_PHOTO) - name_card = await self.player_info.get_name_card(player_id, user_id) - data["name_card"] = name_card - png_data = await self.template_service.render( - "genshin/pay_log/pay_log.jinja2", data, full_page=True, query_selector=".container" - ) - await png_data.reply_photo(message) - except PayLogNotFound: - buttons = [ - [InlineKeyboardButton("点我导入", url=create_deep_linked_url(context.bot.username, "pay_log_import"))] - ] - await message.reply_text(PAYLOG_NOT_FOUND, reply_markup=InlineKeyboardMarkup(buttons)) - - @staticmethod - async def get_migrate_data( - old_user_id: int, new_user_id: int, old_players: List["Player"] - ) -> Optional[PayLogMigrate]: - return await PayLogMigrate.create(old_user_id, new_user_id, old_players) diff --git a/plugins/genshin/player_cards.py b/plugins/genshin/player_cards.py deleted file mode 100644 index dae2cd5..0000000 --- a/plugins/genshin/player_cards.py +++ /dev/null @@ -1,748 +0,0 @@ -import copy -import math -from typing import Any, List, Tuple, Union, Optional, TYPE_CHECKING, Dict - -from enkanetwork import ( - DigitType, - EnkaNetworkResponse, - EnkaServerError, - Equipments, - EquipmentsType, - HTTPException, - Stats, - StatsPercentage, - VaildateUIDError, - EnkaServerMaintanance, - EnkaServerUnknown, - EnkaServerRateLimit, - EnkaPlayerNotFound, - TimedOut, -) -from pydantic import BaseModel -from telegram import InlineKeyboardButton, InlineKeyboardMarkup -from telegram.constants import ChatAction -from telegram.ext import filters - -from core.config import config -from core.dependence.assets import DEFAULT_EnkaAssets, AssetsService -from core.dependence.redisdb import RedisDB -from core.plugin import Plugin, handler -from core.services.players import PlayersService -from core.services.template.services import TemplateService -from metadata.shortname import roleToName, idToName -from modules.apihelper.client.components.remote import Remote -from modules.gcsim.file import PlayerGCSimScripts -from modules.playercards.file import PlayerCardsFile -from modules.playercards.helpers import ArtifactStatsTheory -from plugins.tools.genshin import PlayerNotFoundError -from utils.enkanetwork import RedisCache, EnkaNetworkAPI -from utils.helpers import download_resource -from utils.log import logger -from utils.uid import mask_number - -try: - from python_genshin_artifact import get_damage_analysis, get_transformative_damage - from python_genshin_artifact.enka.enka_parser import enka_parser - from python_genshin_artifact.error import JsonParseException, EnkaParseException - from python_genshin_artifact import CalculatorConfig, SkillInterface - - GENSHIN_ARTIFACT_FUNCTION_AVAILABLE = True -except ImportError: - get_damage_analysis = None - get_transformative_damage = None - enka_parser = None - CalculatorConfig = None - SkillInterface = None - - GENSHIN_ARTIFACT_FUNCTION_AVAILABLE = False - -if TYPE_CHECKING: - from enkanetwork import CharacterInfo, EquipmentsStats - from telegram.ext import ContextTypes - from telegram import Update, Message - -try: - import ujson as jsonlib -except ImportError: - import json as jsonlib - - -class PlayerCards(Plugin): - def __init__( - self, - player_service: PlayersService, - template_service: TemplateService, - assets_service: AssetsService, - redis: RedisDB, - ): - self.player_service = player_service - self.client = EnkaNetworkAPI(lang="chs", user_agent=config.enka_network_api_agent, cache=False) - self.cache = RedisCache(redis.client, key="plugin:player_cards:enka_network", ex=60) - self.player_cards_file = PlayerCardsFile() - self.player_gcsim_scripts = PlayerGCSimScripts() - self.assets_service = assets_service - self.template_service = template_service - self.kitsune: Optional[str] = None - self.fight_prop_rule: Dict[str, Dict[str, float]] = {} - self.damage_config: Dict = {} - - async def initialize(self): - await self._refresh() - - async def _refresh(self): - self.fight_prop_rule = await Remote.get_fight_prop_rule_data() - self.damage_config = await Remote.get_damage_data() - - async def _update_enka_data(self, uid) -> Union[EnkaNetworkResponse, str]: - try: - data = await self.cache.get(uid) - if data is not None: - return EnkaNetworkResponse.parse_obj(data) - user = await self.client.http.fetch_user_by_uid(uid) - data = user["content"].decode("utf-8", "surrogatepass") # type: ignore - data = jsonlib.loads(data) - data = await self.player_cards_file.merge_info(uid, data) - await self.cache.set(uid, data) - return EnkaNetworkResponse.parse_obj(data) - except TimedOut: - error = "Enka.Network 服务请求超时,请稍后重试" - except EnkaServerRateLimit: - error = "Enka.Network 已对此API进行速率限制,请稍后重试" - except EnkaServerMaintanance: - error = "Enka.Network 正在维护,请等待5-8小时或1天" - except EnkaServerError: - error = "Enka.Network 服务请求错误,请稍后重试" - except EnkaServerUnknown: - error = "Enka.Network 服务瞬间爆炸,请稍后重试" - except EnkaPlayerNotFound: - error = "UID 未找到,可能为服务器抽风,请稍后重试" - except VaildateUIDError: - error = "未找到玩家,请检查您的UID/用户名" - except HTTPException: - error = "Enka.Network HTTP 服务请求错误,请稍后重试" - return error - - async def _load_data_as_enka_response(self, uid) -> Optional[EnkaNetworkResponse]: - data = await self.player_cards_file.load_history_info(uid) - if data is None: - return None - return EnkaNetworkResponse.parse_obj(data) - - async def _load_history(self, uid) -> Optional[Dict]: - return await self.player_cards_file.load_history_info(uid) - - async def get_uid_and_ch( - self, - user_id: int, - args: List[str], - reply: Optional["Message"], - player_id: int, - offset: int, - ) -> Tuple[Optional[int], Optional[str]]: - """通过消息获取 uid,优先级:args > reply > self""" - uid, ch_name, user_id_ = player_id, None, user_id - if args: - for i in args: - if i is not None and not i.startswith("@"): - ch_name = roleToName(i) - if reply: - try: - user_id_ = reply.from_user.id - except AttributeError: - pass - if not uid: - player_info = await self.player_service.get_player(user_id_, offset=offset) - if player_info is not None: - uid = player_info.player_id - if (not uid) and (user_id_ != user_id): - player_info = await self.player_service.get_player(user_id, offset=offset) - if player_info is not None: - uid = player_info.player_id - return uid, ch_name - - @staticmethod - def get_caption(character: "CharacterInfo") -> str: - tags = [character.name, f"等级{character.level}", f"命座{character.constellations_unlocked}"] - if character.equipments: - for item in character.equipments: - if item.type == EquipmentsType.WEAPON and item.detail: - tags.append(item.detail.name) - tags.append(f"武器等级{item.level}") - tags.append(f"精{item.refinement}") - return "#" + " #".join(tags) - - @handler.command(command="player_card", player=True, block=False) - @handler.command(command="player_cards", player=True, block=False) - @handler.message(filters=filters.Regex("^角色卡片查询(.*)"), player=True, block=False) - async def player_cards(self, update: "Update", context: "ContextTypes.DEFAULT_TYPE") -> None: - user_id = await self.get_real_user_id(update) - message = update.effective_message - args = self.get_args(context) - await message.reply_chat_action(ChatAction.TYPING) - uid, offset = self.get_real_uid_or_offset(update) - uid, character_name = await self.get_uid_and_ch(user_id, args, message.reply_to_message, uid, offset) - if uid is None: - raise PlayerNotFoundError(user_id) - original_data = await self._load_history(uid) - if original_data is None or len(original_data["avatarInfoList"]) == 0: - if isinstance(self.kitsune, str): - photo = self.kitsune - else: - photo = open("resources/img/kitsune.png", "rb") - buttons = [ - [ - InlineKeyboardButton( - "更新面板", - callback_data=f"update_player_card|{user_id}|{uid}", - ) - ] - ] - reply_message = await message.reply_photo( - photo=photo, - caption="角色列表未找到,请尝试点击下方按钮从 Enka.Network 更新角色列表", - reply_markup=InlineKeyboardMarkup(buttons), - ) - if reply_message.photo: - self.kitsune = reply_message.photo[-1].file_id - return - enka_response = EnkaNetworkResponse.parse_obj(copy.deepcopy(original_data)) - if character_name is None: - self.log_user(update, logger.info, "角色卡片查询命令请求") - ttl = await self.cache.ttl(uid) - if enka_response.characters is None or len(enka_response.characters) == 0: - buttons = [ - [ - InlineKeyboardButton( - "更新面板", - callback_data=f"update_player_card|{user_id}|{uid}", - ) - ] - ] - else: - buttons = self.gen_button(enka_response, user_id, uid, update_button=ttl < 0) - if isinstance(self.kitsune, str): - photo = self.kitsune - else: - photo = open("resources/img/kitsune.png", "rb") - reply_message = await message.reply_photo( - photo=photo, - caption="请选择你要查询的角色", - reply_markup=InlineKeyboardMarkup(buttons), - ) - if reply_message.photo: - self.kitsune = reply_message.photo[-1].file_id - return - - self.log_user( - update, - logger.info, - "角色卡片查询命令请求 || character_name[%s] uid[%s]", - character_name, - uid, - ) - for characters in enka_response.characters: - if characters.name == character_name: - break - else: - await message.reply_text( - f"角色展柜中未找到 {character_name} ,请检查角色是否存在于角色展柜中,或者等待角色数据更新后重试" - ) - return - await message.reply_chat_action(ChatAction.UPLOAD_PHOTO) - original_data: Optional[Dict] = None - if GENSHIN_ARTIFACT_FUNCTION_AVAILABLE: - original_data = await self._load_history(uid) - render_result = await RenderTemplate( - uid, - characters, - self.fight_prop_rule, - self.damage_config, - self.template_service, - original_data, - ).render() # pylint: disable=W0631 - await render_result.reply_photo( - message, - filename=f"player_card_{uid}_{character_name}.png", - caption=self.get_caption(characters), - ) - - @handler.callback_query(pattern=r"^update_player_card\|", block=False) - async def update_player_card(self, update: "Update", _: "ContextTypes.DEFAULT_TYPE") -> None: - user = update.effective_user - message = update.effective_message - callback_query = update.callback_query - - async def get_player_card_callback(callback_query_data: str) -> Tuple[int, int]: - _data = callback_query_data.split("|") - _user_id = int(_data[1]) - _uid = int(_data[2]) - logger.debug("callback_query_data函数返回 user_id[%s] uid[%s]", _user_id, _uid) - return _user_id, _uid - - user_id, uid = await get_player_card_callback(callback_query.data) - if user.id != user_id: - await callback_query.answer(text="这不是你的按钮!\n" + config.notice.user_mismatch, show_alert=True) - return - - ttl = await self.cache.ttl(uid) - - if ttl > 0: - await callback_query.answer(text=f"请等待 {ttl} 秒后再更新", show_alert=True) - return - - await message.reply_chat_action(ChatAction.TYPING) - data = await self._update_enka_data(uid) - if isinstance(data, str): - await callback_query.answer(text=data, show_alert=True) - return - if data.characters is None or len(data.characters) == 0: - await callback_query.answer( - "请先将角色加入到角色展柜并允许查看角色详情后再使用此功能,如果已经添加了角色,请等待角色数据更新后重试", - show_alert=True, - ) - await message.delete() - return - self.player_gcsim_scripts.remove_fits(uid) - await callback_query.answer(text="正在从 Enka.Network 获取角色列表 请不要重复点击按钮") - buttons = self.gen_button(data, user.id, uid, update_button=False) - render_data = await self.parse_holder_data(data) - holder = await self.template_service.render( - "genshin/player_card/holder.jinja2", - render_data, - viewport={"width": 750, "height": 580}, - ttl=60 * 10, - caption="更新角色列表成功,请选择你要查询的角色", - ) - await holder.edit_media(message, reply_markup=InlineKeyboardMarkup(buttons)) - - @handler.callback_query(pattern=r"^get_player_card\|", block=False) - async def get_player_cards(self, update: "Update", _: "ContextTypes.DEFAULT_TYPE") -> None: - callback_query = update.callback_query - user = callback_query.from_user - message = callback_query.message - - async def get_player_card_callback( - callback_query_data: str, - ) -> Tuple[str, int, int]: - _data = callback_query_data.split("|") - _user_id = int(_data[1]) - _uid = int(_data[2]) - _result = _data[3] - logger.debug( - "callback_query_data函数返回 result[%s] user_id[%s] uid[%s]", - _result, - _user_id, - _uid, - ) - return _result, _user_id, _uid - - result, user_id, uid = await get_player_card_callback(callback_query.data) - if user.id != user_id: - await callback_query.answer(text="这不是你的按钮!\n" + config.notice.user_mismatch, show_alert=True) - return - if result == "empty_data": - await callback_query.answer(text="此按钮不可用", show_alert=True) - return - page = 0 - if result.isdigit(): - page = int(result) - logger.info( - "用户 %s[%s] 角色卡片查询命令请求 || page[%s] uid[%s]", - user.full_name, - user.id, - page, - uid, - ) - else: - logger.info( - "用户 %s[%s] 角色卡片查询命令请求 || character_name[%s] uid[%s]", - user.full_name, - user.id, - result, - uid, - ) - original_data = await self._load_history(uid) - enka_response = EnkaNetworkResponse.parse_obj(copy.deepcopy(original_data)) - if enka_response.characters is None or len(enka_response.characters) == 0: - await callback_query.answer( - "请先将角色加入到角色展柜并允许查看角色详情后再使用此功能,如果已经添加了角色,请等待角色数据更新后重试", - show_alert=True, - ) - await message.delete() - return - if page: - buttons = self.gen_button(enka_response, user.id, uid, page, await self.cache.ttl(uid) <= 0) - await message.edit_reply_markup(reply_markup=InlineKeyboardMarkup(buttons)) - await callback_query.answer(f"已切换到第 {page} 页", show_alert=False) - return - for characters in enka_response.characters: - if characters.name == result: - break - else: - await message.delete() - await callback_query.answer( - f"角色展柜中未找到 {result} ,请检查角色是否存在于角色展柜中,或者等待角色数据更新后重试", - show_alert=True, - ) - return - await callback_query.answer(text="正在渲染图片中 请稍等 请不要重复点击按钮", show_alert=False) - await message.reply_chat_action(ChatAction.UPLOAD_PHOTO) - render_result = await RenderTemplate( - uid, characters, self.fight_prop_rule, self.damage_config, self.template_service, original_data - ).render() # pylint: disable=W0631 - render_result.filename = f"player_card_{uid}_{result}.png" - render_result.caption = self.get_caption(characters) - await render_result.edit_media(message) - - @staticmethod - def gen_button( - data: EnkaNetworkResponse, - user_id: Union[str, int], - uid: int, - page: int = 1, - update_button: bool = True, - ) -> List[List[InlineKeyboardButton]]: - """生成按钮""" - buttons = [] - if data.characters: - buttons = [ - InlineKeyboardButton( - value.name, - callback_data=f"get_player_card|{user_id}|{uid}|{value.name}", - ) - for value in data.characters - if value.name - ] - all_buttons = [buttons[i : i + 4] for i in range(0, len(buttons), 4)] - send_buttons = all_buttons[(page - 1) * 3 : page * 3] - last_page = page - 1 if page > 1 else 0 - all_page = math.ceil(len(all_buttons) / 3) - next_page = page + 1 if page < all_page and all_page > 1 else 0 - last_button = [] - if last_page: - last_button.append( - InlineKeyboardButton( - "<< 上一页", - callback_data=f"get_player_card|{user_id}|{uid}|{last_page}", - ) - ) - if last_page or next_page: - last_button.append( - InlineKeyboardButton( - f"{page}/{all_page}", - callback_data=f"get_player_card|{user_id}|{uid}|empty_data", - ) - ) - if update_button: - last_button.append( - InlineKeyboardButton( - "更新面板", - callback_data=f"update_player_card|{user_id}|{uid}", - ) - ) - if next_page: - last_button.append( - InlineKeyboardButton( - "下一页 >>", - callback_data=f"get_player_card|{user_id}|{uid}|{next_page}", - ) - ) - if last_button: - send_buttons.append(last_button) - return send_buttons - - async def parse_holder_data(self, data: EnkaNetworkResponse) -> dict: - """ - 生成渲染所需数据 - """ - characters_data = [] - for idx, character in enumerate(data.characters): - characters_data.append( - { - "level": character.level, - "element": character.element.name, - "constellation": character.constellations_unlocked, - "rarity": character.rarity, - "icon": (await self.assets_service.avatar(character.id).icon()).as_uri(), - } - ) - if idx > 6: - break - return { - "uid": mask_number(data.uid), - "level": data.player.level, - "signature": data.player.signature, - "characters": characters_data, - } - - -class Artifact(BaseModel): - """在 enka Equipments model 基础上扩展了圣遗物评分数据""" - - equipment: Equipments - # 圣遗物评分 - score: float = 0 - # 圣遗物评级 - score_label: str = "E" - # 圣遗物评级颜色 - score_class: str = "" - # 圣遗物单行属性评分 - substat_scores: List[float] - - def __init__(self, **kwargs): - super().__init__(**kwargs) - for substat_scores in self.substat_scores: - self.score += substat_scores - self.score = round(self.score, 1) - - for r in ( - ("D", 10), - ("C", 16.5), - ("B", 23.1), - ("A", 29.7), - ("S", 36.3), - ("SS", 42.9), - ("SSS", 49.5), - ("ACE", 56.1), - ("ACE²", 66), - ): - if self.score >= r[1]: - self.score_label = r[0] - self.score_class = self.get_score_class(r[0]) - - @staticmethod - def get_score_class(label: str) -> str: - mapping = { - "D": "text-neutral-400", - "C": "text-neutral-200", - "B": "text-violet-400", - "A": "text-violet-400", - "S": "text-yellow-400", - "SS": "text-yellow-400", - "SSS": "text-yellow-400", - "ACE": "text-red-500", - "ACE²": "text-red-500", - } - return mapping.get(label, "text-neutral-400") - - -class RenderTemplate: - def __init__( - self, - uid: Union[int, str], - character: "CharacterInfo", - fight_prop_rule: Dict[str, Dict[str, float]], - damage_config: Dict, - template_service: TemplateService, - original_data: Optional[Dict] = None, - ): - self.uid = uid - self.template_service = template_service - # 因为需要替换线上 enka 图片地址为本地地址,先克隆数据,避免修改原数据 - self.character = character.copy(deep=True) - self.fight_prop_rule = fight_prop_rule - self.original_data = original_data - self.damage_config = damage_config - - async def render(self): - # 缓存所有图片到本地 - await self.cache_images() - - artifacts = self.find_artifacts() - artifact_total_score: float = sum(artifact.score for artifact in artifacts) - - artifact_total_score = round(artifact_total_score, 1) - - artifact_total_score_label: str = "E" - for r in ( - ("D", 10), - ("C", 16.5), - ("B", 23.1), - ("A", 29.7), - ("S", 36.3), - ("SS", 42.9), - ("SSS", 49.5), - ("ACE", 56.1), - ("ACE²", 66), - ): - if artifact_total_score / 5 >= r[1]: - artifact_total_score_label = r[0] - - data = { - "uid": mask_number(self.uid), - "character": self.character, - "stats": await self.de_stats(), - "weapon": self.find_weapon(), - # 圣遗物评分 - "artifact_total_score": artifact_total_score, - # 圣遗物评级 - "artifact_total_score_label": artifact_total_score_label, - # 圣遗物评级颜色 - "artifact_total_score_class": Artifact.get_score_class(artifact_total_score_label), - "artifacts": artifacts, - # 需要在模板中使用的 enum 类型 - "DigitType": DigitType, - "damage_function_available": False, - "damage_info": [], - } - - if GENSHIN_ARTIFACT_FUNCTION_AVAILABLE: - character_cn_name = idToName(self.character.id) - damage_config = self.damage_config.get(character_cn_name) - if damage_config is not None: - try: - data["damage_info"] = self.render_damage(damage_config) - except JsonParseException as _exc: - logger.error(str(_exc)) - except EnkaParseException as _exc: - logger.error(str(_exc)) - else: - data["damage_function_available"] = True - - return await self.template_service.render( - "genshin/player_card/player_card.jinja2", - data, - full_page=True, - query_selector=".text-neutral-200", - ttl=7 * 24 * 60 * 60, - ) - - def render_damage(self, damage_config: Optional[Dict]) -> List: - character, weapon, artifacts = enka_parser(self.original_data, self.character.id) - character_name = character.name - character_cn_name = idToName(self.character.id) - if damage_config is None: - damage_config = self.damage_config.get(character_cn_name) - skills = damage_config.get("skills") - config_skill = damage_config.get("config_skill") - if config_skill is not None: - config_skill = {character_name: config_skill} - character_config = damage_config.get("config") - artifact_config = damage_config.get("artifact_config") - if character_config is not None: - character.params = {character_name: character_config} - config_weapon = damage_config.get("config_weapon") - if config_weapon is not None: - _weapon_config = config_weapon.get(weapon.name) - if _weapon_config is not None: - weapon.params = {weapon.name: _weapon_config} - damage = [] - for skill in skills: - index = skill.get("index") - skill_info = SkillInterface(index=index, config=config_skill) - calculator_config = CalculatorConfig( - character=character, - weapon=weapon, - artifacts=artifacts, - skill=skill_info, - artifact_config=artifact_config, - ) - damage_key = skill.get("damage_key") - transformative_damage_key = skill.get("transformative_damage_key") - damage_info = {"skill_info": skill, "damage": None, "transformative_damage": None} - if damage_key is not None: - damage_analysis = get_damage_analysis(calculator_config) - damage_value = getattr(damage_analysis, damage_key) - damage_info["damage"] = damage_value - if transformative_damage_key is not None: - transformative_damage = get_transformative_damage(calculator_config) - transformative_damage_value = getattr(transformative_damage, transformative_damage_key) - damage_info["transformative_damage"] = transformative_damage_value - damage.append(damage_info) - - return damage - - async def de_stats(self) -> List[Tuple[str, Any]]: - stats = self.character.stats - items: List[Tuple[str, Any]] = [] - logger.debug(self.character.stats) - - # items.append(("基础生命值", stats.BASE_HP.to_rounded())) - items.append(("生命值", stats.FIGHT_PROP_MAX_HP.to_rounded())) - # items.append(("基础攻击力", stats.FIGHT_PROP_BASE_ATTACK.to_rounded())) - items.append(("攻击力", stats.FIGHT_PROP_CUR_ATTACK.to_rounded())) - # items.append(("基础防御力", stats.FIGHT_PROP_BASE_DEFENSE.to_rounded())) - items.append(("防御力", stats.FIGHT_PROP_CUR_DEFENSE.to_rounded())) - items.append(("暴击率", stats.FIGHT_PROP_CRITICAL.to_percentage_symbol())) - items.append( - ( - "暴击伤害", - stats.FIGHT_PROP_CRITICAL_HURT.to_percentage_symbol(), - ) - ) - items.append( - ( - "元素充能效率", - stats.FIGHT_PROP_CHARGE_EFFICIENCY.to_percentage_symbol(), - ) - ) - items.append(("元素精通", stats.FIGHT_PROP_ELEMENT_MASTERY.to_rounded())) - - # 查找元素伤害加成和治疗加成 - max_stat = StatsPercentage() # 用于记录最高元素伤害加成 避免武器特效影响 - for stat in stats: - if 40 <= stat[1].id <= 46: # 元素伤害加成 - if max_stat.value <= stat[1].value: - max_stat = stat[1] - elif stat[1].id == 29: # 物理伤害加成 - pass - elif stat[1].id != 26: # 治疗加成 - continue - value = stat[1].to_rounded() if isinstance(stat[1], Stats) else stat[1].to_percentage_symbol() - if value in ("0%", 0): - continue - name = DEFAULT_EnkaAssets.get_hash_map(stat[0]) - if name is None: - continue - items.append((name, value)) - - if max_stat.id != 0: - for item in items: - if "元素伤害加成" in item[0] and max_stat.to_percentage_symbol() != item[1]: - items.remove(item) - - return items - - async def cache_images(self) -> None: - """缓存所有图片到本地""" - # TODO: 并发下载所有资源 - c = self.character - # 角色 - c.image.banner.url = await download_resource(c.image.banner.url) - - # 技能 - for item in c.skills: - item.icon.url = await download_resource(item.icon.url) - - # 命座 - for item in c.constellations: - item.icon.url = await download_resource(item.icon.url) - - # 装备,包括圣遗物和武器 - for item in c.equipments: - item.detail.icon.url = await download_resource(item.detail.icon.url) - - def find_weapon(self) -> Optional[Equipments]: - """在 equipments 数组中找到武器,equipments 数组包含圣遗物和武器""" - for item in self.character.equipments: - if item.type == EquipmentsType.WEAPON: - return item - return None - - def find_artifacts(self) -> List[Artifact]: - """在 equipments 数组中找到圣遗物,并转换成带有分数的 model。equipments 数组包含圣遗物和武器""" - - stats = ArtifactStatsTheory(self.character.name, self.fight_prop_rule) - - def substat_score(s: "EquipmentsStats") -> float: - return stats.theory(s) - - return [ - Artifact( - equipment=e, - # 圣遗物单行属性评分 - substat_scores=[substat_score(s) for s in e.detail.substats], - ) - for e in self.character.equipments - if e.type == EquipmentsType.ARTIFACT - ] diff --git a/plugins/genshin/quiz.py b/plugins/genshin/quiz.py deleted file mode 100644 index 4a193f2..0000000 --- a/plugins/genshin/quiz.py +++ /dev/null @@ -1,67 +0,0 @@ -import random - -from telegram import Poll, Update -from telegram.constants import ChatAction -from telegram.error import BadRequest -from telegram.ext import filters, CallbackContext - -from core.plugin import Plugin, handler -from core.services.quiz.services import QuizService -from core.services.users.services import UserService -from utils.log import logger - -__all__ = ("QuizPlugin",) - - -class QuizPlugin(Plugin): - """派蒙的十万个为什么""" - - def __init__(self, quiz_service: QuizService = None, user_service: UserService = None): - self.user_service = user_service - self.quiz_service = quiz_service - self.time_out = 120 - - @handler.message(filters=filters.Regex("来一道题")) - @handler.command(command="quiz", block=False) - async def command_start(self, update: Update, _: CallbackContext) -> None: - message = update.effective_message - chat = update.effective_chat - await message.reply_chat_action(ChatAction.TYPING) - question_id_list = await self.quiz_service.get_question_id_list() - if filters.ChatType.GROUPS.filter(message): - self.log_user(update, logger.info, "在群 %s[%s] 发送挑战问题命令请求", chat.title, chat.id) - if len(question_id_list) == 0: - return None - if len(question_id_list) == 0: - return None - question_id = random.choice(question_id_list) # nosec - question = await self.quiz_service.get_question(question_id) - _options = [] - correct_option = None - for answer in question.answers: - _options.append(answer.text) - if answer.is_correct: - correct_option = answer.text - if correct_option is None: - question_id = question["question_id"] - logger.warning("Quiz模块 correct_option 异常 question_id[%s]", question_id) - return None - random.shuffle(_options) - index = _options.index(correct_option) - try: - poll_message = await message.reply_poll( - question.text, - _options, - correct_option_id=index, - is_anonymous=False, - open_period=self.time_out, - type=Poll.QUIZ, - ) - except BadRequest as exc: - if "Not enough rights" in exc.message: - poll_message = await message.reply_text("出错了呜呜呜 ~ 权限不足,请请检查投票权限是否开启") - else: - raise exc - if filters.ChatType.GROUPS.filter(message): - self.add_delete_message_job(message, delay=300) - self.add_delete_message_job(poll_message, delay=300) diff --git a/plugins/genshin/reg_time.py b/plugins/genshin/reg_time.py deleted file mode 100644 index f95b3c8..0000000 --- a/plugins/genshin/reg_time.py +++ /dev/null @@ -1,96 +0,0 @@ -from datetime import datetime -from typing import TYPE_CHECKING - -from simnet.client.routes import InternationalRoute -from simnet.errors import BadRequest as SIMNetBadRequest -from simnet.utils.player import recognize_genshin_server, recognize_genshin_game_biz -from telegram.ext import filters - -from core.dependence.redisdb import RedisDB -from core.plugin import Plugin, handler -from core.services.cookies import CookiesService -from core.services.users.services import UserService -from plugins.tools.genshin import GenshinHelper -from utils.log import logger - -if TYPE_CHECKING: - from telegram import Update - from telegram.ext import ContextTypes - from simnet import GenshinClient - -try: - import ujson as jsonlib - -except ImportError: - import json as jsonlib - -REG_TIME_URL = InternationalRoute( - overseas="https://sg-hk4e-api.hoyoverse.com/event/e20220928anniversary/game_data", - chinese="https://hk4e-api.mihoyo.com/event/e20220928anniversary/game_data", -) - - -class NotFoundRegTimeError(Exception): - """未找到注册时间""" - - -class RegTimePlugin(Plugin): - """查询原神注册时间""" - - def __init__( - self, - user_service: UserService = None, - cookie_service: CookiesService = None, - helper: GenshinHelper = None, - redis: RedisDB = None, - ): - self.cache = redis.client - self.cache_key = "plugin:reg_time:" - self.user_service = user_service - self.cookie_service = cookie_service - self.helper = helper - - @staticmethod - async def get_reg_time(client: "GenshinClient") -> str: - """获取原神注册时间""" - game_biz = recognize_genshin_game_biz(client.player_id) - region = recognize_genshin_server(client.player_id) - await client.get_hk4e_token_by_cookie_token(game_biz, region) - url = REG_TIME_URL.get_url(client.region) - params = {"game_biz": game_biz, "lang": "zh-cn", "badge_uid": client.player_id, "badge_region": region} - data = await client.request_lab(url, method="GET", params=params) - if time := jsonlib.loads(data.get("data", "{}")).get("1", 0): - return datetime.fromtimestamp(time).strftime("%Y-%m-%d %H:%M:%S") - raise NotFoundRegTimeError - - async def get_reg_time_from_cache(self, client: "GenshinClient") -> str: - """从缓存中获取原神注册时间""" - if reg_time := await self.cache.get(f"{self.cache_key}{client.player_id}"): - return reg_time.decode("utf-8") - reg_time = await self.get_reg_time(client) - await self.cache.set(f"{self.cache_key}{client.player_id}", reg_time) - return reg_time - - @handler.command("reg_time", block=False) - @handler.message(filters.Regex(r"^原神账号注册时间$"), block=False) - async def reg_time(self, update: "Update", _: "ContextTypes.DEFAULT_TYPE") -> None: - user_id = await self.get_real_user_id(update) - uid, offset = self.get_real_uid_or_offset(update) - message = update.effective_message - self.log_user(update, logger.info, "原神注册时间命令请求") - try: - async with self.helper.genshin(user_id, player_id=uid, offset=offset) as client: - reg_time = await self.get_reg_time_from_cache(client) - await message.reply_text(f"你的原神账号注册时间为:{reg_time}") - except SIMNetBadRequest as exc: - if exc.ret_code == -501101: - await message.reply_text("当前角色冒险等阶未达到10级,暂时无法获取信息") - else: - raise exc - except ValueError as exc: - if "cookie_token" in str(exc): - await message.reply_text("呜呜呜出错了请重新绑定账号") - else: - raise exc - except NotFoundRegTimeError: - await message.reply_text("未找到你的原神账号注册时间,仅限 2022 年 10 月 之前注册的账号") diff --git a/plugins/genshin/strategy.py b/plugins/genshin/strategy.py deleted file mode 100644 index 5950552..0000000 --- a/plugins/genshin/strategy.py +++ /dev/null @@ -1,75 +0,0 @@ -from telegram import InlineKeyboardButton, InlineKeyboardMarkup, Update -from telegram.constants import ChatAction, ParseMode -from telegram.ext import CallbackContext, filters - -from core.plugin import Plugin, handler -from core.services.game.services import GameStrategyService -from core.services.search.models import StrategyEntry -from core.services.search.services import SearchServices -from metadata.shortname import roleToName, roleToTag -from utils.log import logger - - -class StrategyPlugin(Plugin): - """角色攻略查询""" - - KEYBOARD = [ - [InlineKeyboardButton(text="查看角色攻略列表并查询", switch_inline_query_current_chat="查看角色攻略列表并查询")] - ] - - def __init__( - self, - game_strategy_service: GameStrategyService = None, - search_service: SearchServices = None, - ): - self.game_strategy_service = game_strategy_service - self.search_service = search_service - - @handler.command(command="strategy", block=False) - @handler.message(filters=filters.Regex("^角色攻略查询(.*)"), block=False) - async def command_start(self, update: Update, context: CallbackContext) -> None: - message = update.effective_message - args = self.get_args(context) - if len(args) >= 1: - character_name = args[0] - else: - reply_message = await message.reply_text( - "请回复你要查询的攻略的角色名", reply_markup=InlineKeyboardMarkup(self.KEYBOARD) - ) - if filters.ChatType.GROUPS.filter(reply_message): - self.add_delete_message_job(message) - self.add_delete_message_job(reply_message) - return - character_name = roleToName(character_name) - url = await self.game_strategy_service.get_strategy(character_name) - if url == "": - reply_message = await message.reply_text( - f"没有找到 {character_name} 的攻略", reply_markup=InlineKeyboardMarkup(self.KEYBOARD) - ) - if filters.ChatType.GROUPS.filter(reply_message): - self.add_delete_message_job(message) - self.add_delete_message_job(reply_message) - return - self.log_user(update, logger.info, "查询角色攻略命令请求 || 参数 %s", character_name) - await message.reply_chat_action(ChatAction.UPLOAD_PHOTO) - file_path = await self.download_resource(url, return_path=True) - caption = f"From 米游社 西风驿站 查看原图" - reply_photo = await message.reply_photo( - photo=open(file_path, "rb"), - caption=caption, - filename=f"{character_name}.png", - parse_mode=ParseMode.HTML, - ) - if reply_photo.photo: - tags = roleToTag(character_name) - photo_file_id = reply_photo.photo[0].file_id - entry = StrategyEntry( - key=f"plugin:strategy:{character_name}", - title=character_name, - description=f"{character_name} 角色攻略", - tags=tags, - caption=caption, - parse_mode="HTML", - photo_file_id=photo_file_id, - ) - await self.search_service.add_entry(entry) diff --git a/plugins/genshin/weapon.py b/plugins/genshin/weapon.py deleted file mode 100644 index 3d37494..0000000 --- a/plugins/genshin/weapon.py +++ /dev/null @@ -1,145 +0,0 @@ -from telegram import InlineKeyboardButton, InlineKeyboardMarkup, Update -from telegram.constants import ChatAction -from telegram.ext import CallbackContext, CommandHandler, MessageHandler, filters - -from core.dependence.assets import AssetsCouldNotFound, AssetsService -from core.plugin import Plugin, handler -from core.services.search.models import WeaponEntry -from core.services.search.services import SearchServices -from core.services.template.services import TemplateService -from core.services.wiki.services import WikiService -from metadata.genshin import honey_id_to_game_id -from metadata.shortname import weaponToName, weapons as _weapons_data -from modules.wiki.weapon import Weapon -from utils.log import logger - - -class WeaponPlugin(Plugin): - """武器查询""" - - KEYBOARD = [ - [InlineKeyboardButton(text="查看武器列表并查询", switch_inline_query_current_chat="查看武器列表并查询")] - ] - - def __init__( - self, - template_service: TemplateService = None, - wiki_service: WikiService = None, - assets_service: AssetsService = None, - search_service: SearchServices = None, - ): - self.wiki_service = wiki_service - self.template_service = template_service - self.assets_service = assets_service - self.search_service = search_service - - @handler(CommandHandler, command="weapon", block=False) - @handler(MessageHandler, filters=filters.Regex("^武器查询(.*)"), block=False) - async def command_start(self, update: Update, context: CallbackContext) -> None: - message = update.effective_message - args = self.get_args(context) - if len(args) >= 1: - weapon_name = args[0] - else: - reply_message = await message.reply_text( - "请回复你要查询的武器", reply_markup=InlineKeyboardMarkup(self.KEYBOARD) - ) - if filters.ChatType.GROUPS.filter(reply_message): - self.add_delete_message_job(message) - self.add_delete_message_job(reply_message) - return - weapon_name = weaponToName(weapon_name) - self.log_user(update, logger.info, "查询角色攻略命令请求 weapon_name[%s]", weapon_name) - weapons_list = await self.wiki_service.get_weapons_list() - for weapon in weapons_list: - if weapon.name == weapon_name: - weapon_data = weapon - break - else: - reply_message = await message.reply_text( - f"没有找到 {weapon_name}", reply_markup=InlineKeyboardMarkup(self.KEYBOARD) - ) - if filters.ChatType.GROUPS.filter(reply_message): - self.add_delete_message_job(message) - self.add_delete_message_job(reply_message) - return - await message.reply_chat_action(ChatAction.TYPING) - - async def input_template_data(_weapon_data: Weapon): - if weapon.rarity > 2: - bonus = _weapon_data.stats[-1].bonus - if "%" in bonus: - bonus = str(round(float(bonus.rstrip("%")))) + "%" - else: - bonus = str(round(float(bonus))) - _template_data = { - "weapon_name": _weapon_data.name, - "weapon_rarity": _weapon_data.rarity, - "weapon_info_type_img": _weapon_data.weapon_type.name, - "progression_secondary_stat_value": bonus, - "progression_secondary_stat_name": _weapon_data.attribute.type.value, - "weapon_info_source_img": ( - await self.assets_service.weapon(honey_id_to_game_id(_weapon_data.id, "weapon")).icon() - ).as_uri(), - "weapon_info_max_level": _weapon_data.stats[-1].level, - "progression_base_atk": round(_weapon_data.stats[-1].ATK), - "weapon_info_source_list": [ - (await self.assets_service.material(honey_id_to_game_id(mid, "material")).icon()).as_uri() - for mid in _weapon_data.ascension[-3:] - ], - "special_ability_name": _weapon_data.affix.name, - "special_ability_info": _weapon_data.affix.description[0], - "weapon_description": _weapon_data.description, - } - else: - _template_data = { - "weapon_name": _weapon_data.name, - "weapon_rarity": _weapon_data.rarity, - "weapon_info_type_img": _weapon_data.weapon_type.name, - "progression_secondary_stat_value": " ", - "progression_secondary_stat_name": "无其它属性加成", - "weapon_info_source_img": ( - await self.assets_service.weapon(honey_id_to_game_id(_weapon_data.id, "weapon")).icon() - ).as_uri(), - "weapon_info_max_level": _weapon_data.stats[-1].level, - "progression_base_atk": round(_weapon_data.stats[-1].ATK), - "weapon_info_source_list": [ - (await self.assets_service.material(honey_id_to_game_id(mid, "material")).icon()).as_uri() - for mid in _weapon_data.ascension[-3:] - ], - "special_ability_name": "", - "special_ability_info": "", - "weapon_description": _weapon_data.description, - } - return _template_data - - try: - template_data = await input_template_data(weapon_data) - except AssetsCouldNotFound as exc: - logger.warning("%s weapon_name[%s]", exc.message, weapon_name) - reply_message = await message.reply_text(f"数据库中没有找到 {weapon_name}") - if filters.ChatType.GROUPS.filter(reply_message): - self.add_delete_message_job(message) - self.add_delete_message_job(reply_message) - return - png_data = await self.template_service.render( - "genshin/weapon/weapon.jinja2", template_data, {"width": 540, "height": 540}, ttl=31 * 24 * 60 * 60 - ) - await message.reply_chat_action(ChatAction.UPLOAD_PHOTO) - reply_photo = await png_data.reply_photo( - message, - filename=f"{template_data['weapon_name']}.png", - ) - if reply_photo.photo: - description = weapon_data.story - if description: - photo_file_id = reply_photo.photo[0].file_id - tags = _weapons_data.get(weapon_name) - entry = WeaponEntry( - key=f"plugin:weapon:{weapon_name}", - title=weapon_name, - description=description, - tags=tags, - photo_file_id=photo_file_id, - ) - await self.search_service.add_entry(entry) diff --git a/plugins/genshin/wish.py b/plugins/genshin/wish.py deleted file mode 100644 index 601052b..0000000 --- a/plugins/genshin/wish.py +++ /dev/null @@ -1,327 +0,0 @@ -import asyncio -import re -from datetime import datetime -from typing import Any, List, Optional, Tuple, Union - -from bs4 import BeautifulSoup -from telegram import Update -from telegram.constants import ChatAction -from telegram.ext import CallbackContext, CommandHandler, MessageHandler, filters - -from core.dependence.assets import AssetsService -from core.dependence.redisdb import RedisDB -from core.plugin import Plugin, handler -from core.services.template.services import TemplateService -from metadata.genshin import AVATAR_DATA, WEAPON_DATA, avatar_to_game_id, weapon_to_game_id -from metadata.shortname import weaponToName -from modules.apihelper.client.components.gacha import Gacha as GachaClient -from modules.apihelper.models.genshin.gacha import GachaInfo -from modules.wish.banner import GenshinBannerType, GachaBanner -from modules.wish.player.info import PlayerGachaInfo -from modules.wish.system import BannerSystem -from utils.log import logger - -try: - import ujson as jsonlib - -except ImportError: - import json as jsonlib - - -class GachaNotFound(Exception): - """卡池未找到""" - - def __init__(self, gacha_name: str): - self.gacha_name = gacha_name - super().__init__(f"{gacha_name} gacha not found") - - -class GachaDataFound(Exception): - """卡池数据未找到""" - - def __init__(self, item_id: int): - self.item_id = item_id - super().__init__(f"item_id[{item_id}] data not found") - - -class GachaRedis: - def __init__(self, redis: RedisDB): - self.client = redis.client - self.qname = "plugin:wish_simulator:" - self.ex = 60 * 60 * 24 - - async def get(self, user_id: int) -> PlayerGachaInfo: - data = await self.client.get(f"{self.qname}{user_id}") - if data is None: - return PlayerGachaInfo() - return PlayerGachaInfo(**jsonlib.loads(data)) - - async def set(self, user_id: int, player_gacha_info: PlayerGachaInfo): - value = player_gacha_info.json() - await self.client.set(f"{self.qname}{user_id}", value, ex=self.ex) - - -class WishSimulatorHandle: - def __init__(self): - self.hyperion = GachaClient() - - async def de_banner(self, gacha_id: str, gacha_type: int) -> Optional[GachaBanner]: - gacha_info = await self.hyperion.get_gacha_info(gacha_id) - banner = GachaBanner() - banner.banner_id = gacha_id - banner.title, banner.html_title = self.de_title(gacha_info["title"]) - r5_up_items = gacha_info.get("r5_up_items") - if r5_up_items is not None: - for r5_up_item in r5_up_items: - if r5_up_item["item_type"] == "角色": - banner.rate_up_items5.append(avatar_to_game_id(r5_up_item["item_name"])) - elif r5_up_item["item_type"] == "武器": - banner.rate_up_items5.append(weapon_to_game_id(r5_up_item["item_name"])) - r5_prob_list = gacha_info.get("r5_prob_list") - if r5_prob_list is not None: - for r5_prob in gacha_info.get("r5_prob_list", []): - if r5_prob["item_type"] == "角色": - banner.fallback_items5_pool1.append(avatar_to_game_id(r5_prob["item_name"])) - elif r5_prob["item_type"] == "武器": - banner.fallback_items5_pool1.append(weapon_to_game_id(r5_prob["item_name"])) - r4_up_items = gacha_info.get("r4_up_items") - if r4_up_items is not None: - for r4_up_item in r4_up_items: - if r4_up_item["item_type"] == "角色": - banner.rate_up_items4.append(avatar_to_game_id(r4_up_item["item_name"])) - elif r4_up_item["item_type"] == "武器": - banner.rate_up_items4.append(weapon_to_game_id(r4_up_item["item_name"])) - r4_prob_list = gacha_info.get("r4_prob_list") - if r4_prob_list is not None: - for r4_prob in r4_prob_list: - if r4_prob["item_type"] == "角色": - banner.fallback_items4_pool1.append(avatar_to_game_id(r4_prob["item_name"])) - elif r4_prob["item_type"] == "武器": - banner.fallback_items4_pool1.append(weapon_to_game_id(r4_prob["item_name"])) - if gacha_type in {301, 400}: - banner.wish_max_progress = 1 - banner.banner_type = GenshinBannerType.EVENT - banner.weight4 = ((1, 510), (8, 510), (10, 10000)) - banner.weight5 = ((1, 60), (73, 60), (90, 10000)) - elif gacha_type == 302: - banner.wish_max_progress = 2 - banner.banner_type = GenshinBannerType.WEAPON - banner.weight4 = ((1, 600), (7, 600), (10, 10000)) - banner.weight5 = ((1, 70), (62, 70), (90, 10000)) - else: - banner.banner_type = GenshinBannerType.STANDARD - return banner - - async def gacha_base_info(self, gacha_name: str = "角色活动", default: bool = False) -> GachaInfo: - gacha_list_info = await self.hyperion.get_gacha_list_info() - now = datetime.now() - for gacha in gacha_list_info: - if gacha.gacha_name == gacha_name and gacha.begin_time <= now <= gacha.end_time: - return gacha - else: # pylint: disable=W0120 - if default and len(gacha_list_info) > 0: - return gacha_list_info[0] - raise GachaNotFound(gacha_name) - - @staticmethod - def de_title(title: str) -> Union[Tuple[str, None], Tuple[str, Any]]: - title_html = BeautifulSoup(title, "lxml") - re_color = re.search(r"", title, flags=0) - if re_color is None: - return title_html.text, None - color = re_color[1] - title_html.color.name = "span" - title_html.span["style"] = f"color:#{color};" - return title_html.text, title_html.p - - -class WishSimulatorPlugin(Plugin): - """抽卡模拟器(非首模拟器/减寿模拟器)""" - - def __init__(self, assets: AssetsService, template_service: TemplateService, redis: RedisDB): - self.gacha_db = GachaRedis(redis) - self.handle = WishSimulatorHandle() - self.banner_system = BannerSystem() - self.template_service = template_service - self.banner_cache = {} - self._look = asyncio.Lock() - self.assets_service = assets - - async def get_banner(self, gacha_base_info: GachaInfo): - async with self._look: - banner = self.banner_cache.get(gacha_base_info.gacha_id) - if banner is None: - banner = await self.handle.de_banner(gacha_base_info.gacha_id, gacha_base_info.gacha_type) - self.banner_cache.setdefault(gacha_base_info.gacha_id, banner) - return banner - - async def de_item_list(self, item_list: List[int]) -> List[dict]: - gacha_item: List[dict] = [] - for item_id in item_list: - if item_id is None: - continue - if 10000 <= item_id <= 100000: - data = WEAPON_DATA.get(str(item_id)) - avatar = self.assets_service.weapon(item_id) - gacha = await avatar.gacha() - if gacha is None: - raise GachaDataFound(item_id) - data.setdefault("url", gacha.as_uri()) - gacha_item.append(data) - elif 10000000 <= item_id <= 19999999: - data = AVATAR_DATA.get(str(item_id)) - avatar = self.assets_service.avatar(item_id) - gacha = await avatar.gacha_card() - if gacha is None: - raise GachaDataFound(item_id) - data.setdefault("url", gacha.as_uri()) - gacha_item.append(data) - return gacha_item - - async def shutdown(self) -> None: - pass - # todo 目前清理消息无法执行 因为先停止Job导致无法获取全部信息 - # logger.info("正在清理消息") - # job_queue = self.application.telegram.job_queue - # jobs = job_queue.jobs() - # for job in jobs: - # if "wish_simulator" in job.name and not job.removed: - # logger.info("当前Job name %s", job.name) - # try: - # await job.run(job_queue.application) - # except CancelledError: - # continue - # except Exception as exc: - # logger.warning("执行失败 %", str(exc)) - # else: - # logger.info("Jobs为空") - # logger.success("清理卡池消息成功") - - @handler(CommandHandler, command="wish", block=False) - @handler(MessageHandler, filters=filters.Regex("^抽卡模拟器(.*)"), block=False) - async def command_start(self, update: Update, context: CallbackContext) -> None: - user_id = await self.get_real_user_id(update) - message = update.effective_message - args = self.get_args(context) - gacha_name = "角色活动" - if len(args) >= 1: - gacha_name = args[0] - if gacha_name not in ("角色活动-2", "武器活动", "常驻", "角色活动"): - for key, value in {"2": "角色活动-2", "武器": "武器活动", "普通": "常驻"}.items(): - if key == gacha_name: - gacha_name = value - break - try: - gacha_base_info = await self.handle.gacha_base_info(gacha_name) - except GachaNotFound as exc: - await message.reply_text( - f"没有找到名为 {exc.gacha_name} 的卡池,可能是卡池不存在或者卡池已经结束,请检查后重试。如果你想抽取默认卡池,请不要输入参数。" - ) - return - else: - try: - gacha_base_info = await self.handle.gacha_base_info(default=True) - except GachaNotFound: - await message.reply_text("当前卡池正在替换中,请稍后重试。") - return - self.log_user(update, logger.info, "抽卡模拟器命令请求 || 参数 %s", gacha_name) - # 用户数据储存和处理 - await message.reply_chat_action(ChatAction.TYPING) - banner = await self.get_banner(gacha_base_info) - player_gacha_info = await self.gacha_db.get(user_id) - # 检查 wish_item_id - if ( - banner.banner_type == GenshinBannerType.WEAPON - and player_gacha_info.event_weapon_banner.wish_item_id not in banner.rate_up_items5 - ): - player_gacha_info.event_weapon_banner.wish_item_id = 0 - # 执行抽卡 - item_list = self.banner_system.do_pulls(player_gacha_info, banner, 10) - try: - data = await self.de_item_list(item_list) - except GachaDataFound as exc: - logger.warning("角色 item_id[%s] 抽卡立绘未找到", exc.item_id) - reply_message = await message.reply_text("出错了呜呜呜 ~ 卡池部分数据未找到!") - if filters.ChatType.GROUPS.filter(message): - self.add_delete_message_job(reply_message, name="wish_simulator") - self.add_delete_message_job(message, name="wish_simulator") - return - player_gacha_banner_info = player_gacha_info.get_banner_info(banner) - template_data = { - "name": f"{self.get_real_user_name(update)}", - "info": gacha_name, - "banner_name": banner.html_title if banner.html_title else banner.title, - "banner_type": banner.banner_type.name, - "player_gacha_banner_info": player_gacha_banner_info, - "items": [], - "wish_name": "", - } - if player_gacha_banner_info.wish_item_id != 0: - weapon = WEAPON_DATA.get(str(player_gacha_banner_info.wish_item_id)) - if weapon is not None: - template_data["wish_name"] = weapon["name"] - await self.gacha_db.set(user_id, player_gacha_info) - - def take_rang(elem: dict): - return elem["rank"] - - data.sort(key=take_rang, reverse=True) - template_data["items"] = data - await message.reply_chat_action(ChatAction.UPLOAD_PHOTO) - png_data = await self.template_service.render( - "genshin/wish/wish.jinja2", template_data, {"width": 1157, "height": 603}, False - ) - - reply_message = await message.reply_photo(png_data.photo) - if filters.ChatType.GROUPS.filter(message): - self.add_delete_message_job(reply_message, name="wish_simulator") - self.add_delete_message_job(message, name="wish_simulator") - - @handler(CommandHandler, command="set_wish", block=False) - @handler(MessageHandler, filters=filters.Regex("^非首模拟器定轨(.*)"), block=False) - async def set_wish(self, update: Update, context: CallbackContext) -> None: - message = update.effective_message - user = update.effective_user - args = self.get_args(context) - try: - gacha_base_info = await self.handle.gacha_base_info("武器活动") - except GachaNotFound: - reply_message = await message.reply_text("当前还没有武器正在 UP,可能是卡池不存在或者卡池已经结束。") - if filters.ChatType.GROUPS.filter(reply_message): - self.add_delete_message_job(message, delay=30) - self.add_delete_message_job(reply_message, delay=30) - return - banner = await self.get_banner(gacha_base_info) - up_weapons = {} - for rate_up_items5 in banner.rate_up_items5: - weapon = WEAPON_DATA.get(str(rate_up_items5)) - if weapon is None: - continue - up_weapons[weapon["name"]] = rate_up_items5 - up_weapons_text = "当前 UP 武器有:" + "、".join(up_weapons.keys()) - if len(args) >= 1: - weapon_name = args[0] - else: - reply_message = await message.reply_text(f"输入的参数不正确,请输入需要定轨的武器名称。\n{up_weapons_text}") - if filters.ChatType.GROUPS.filter(reply_message): - self.add_delete_message_job(message, delay=30) - self.add_delete_message_job(reply_message, delay=30) - return - weapon_name = weaponToName(weapon_name) - player_gacha_info = await self.gacha_db.get(user.id) - if weapon_name in up_weapons: - player_gacha_info.event_weapon_banner.wish_item_id = up_weapons[weapon_name] - player_gacha_info.event_weapon_banner.failed_chosen_item_pulls = 0 - else: - reply_message = await message.reply_text( - f"输入的参数不正确,可能是没有名为 {weapon_name} 的武器或该武器不存在当前 UP 卡池中\n{up_weapons_text}" - ) - if filters.ChatType.GROUPS.filter(reply_message): - self.add_delete_message_job(message, delay=30) - self.add_delete_message_job(reply_message, delay=30) - return - await self.gacha_db.set(user.id, player_gacha_info) - reply_message = await message.reply_text(f"抽卡模拟器定轨 {weapon_name} 武器成功") - if filters.ChatType.GROUPS.filter(reply_message): - self.add_delete_message_job(message, delay=30) - self.add_delete_message_job(reply_message, delay=30) diff --git a/plugins/genshin/wish_log.py b/plugins/genshin/wish_log.py deleted file mode 100644 index 981d9a7..0000000 --- a/plugins/genshin/wish_log.py +++ /dev/null @@ -1,634 +0,0 @@ -from functools import partial -from io import BytesIO -from typing import Optional, TYPE_CHECKING, List, Union, Tuple -from urllib.parse import urlencode - -from aiofiles import open as async_open -from simnet import GenshinClient, Region -from simnet.models.genshin.wish import BannerType -from telegram import InlineKeyboardButton, InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove -from telegram.constants import ChatAction -from telegram.error import BadRequest -from telegram.ext import ConversationHandler, filters -from telegram.helpers import create_deep_linked_url - -from core.basemodel import RegionEnum -from core.dependence.assets import AssetsService -from core.plugin import Plugin, conversation, handler -from core.services.cookies import CookiesService -from core.services.players import PlayersService -from core.services.template.models import FileType -from core.services.template.services import TemplateService -from gram_core.config import config -from gram_core.plugin.methods.inline_use_data import IInlineUseData -from metadata.scripts.paimon_moe import GACHA_LOG_PAIMON_MOE_PATH, update_paimon_moe_zh -from modules.gacha_log.const import UIGF_VERSION, GACHA_TYPE_LIST_REVERSE -from modules.gacha_log.error import ( - GachaLogAccountNotFound, - GachaLogAuthkeyTimeout, - GachaLogFileError, - GachaLogInvalidAuthkey, - GachaLogMixedProvider, - GachaLogNotFound, - PaimonMoeGachaLogFileError, -) -from modules.gacha_log.helpers import from_url_get_authkey -from modules.gacha_log.log import GachaLog -from modules.gacha_log.migrate import GachaLogMigrate -from modules.gacha_log.models import GachaLogInfo -from plugins.tools.genshin import PlayerNotFoundError -from plugins.tools.player_info import PlayerInfoSystem -from utils.log import logger - -try: - import ujson as jsonlib - -except ImportError: - import json as jsonlib - - -if TYPE_CHECKING: - from telegram import Update, Message, User, Document - from telegram.ext import ContextTypes - from gram_core.services.players.models import Player - from gram_core.services.template.models import RenderResult - -INPUT_URL, INPUT_FILE, CONFIRM_DELETE = range(10100, 10103) -WAITING = f"小{config.notice.bot_name}正在从服务器获取数据,请稍后" -WISHLOG_NOT_FOUND = f"{config.notice.bot_name}没有找到你的抽卡记录,快来私聊{config.notice.bot_name}导入吧~" - - -class WishLogPlugin(Plugin.Conversation): - """抽卡记录导入/导出/分析""" - - IMPORT_HINT = ( - "开始导入祈愿历史记录:请通过 https://paimon.moe/wish/import 获取抽卡记录链接后发送给我" - "(非 paimon.moe 导出的文件数据)\n\n" - f"> 你还可以向{config.notice.bot_name}发送从其他工具导出的 UIGF {UIGF_VERSION} 标准的记录文件\n" - "> 或者从 paimon.moe 、非小酋 导出的 xlsx 记录文件\n" - "> 在绑定 Cookie 时添加 stoken 可能有特殊效果哦(仅限国服)\n" - "注意:导入的数据将会与旧数据进行合并。" - ) - - def __init__( - self, - template_service: TemplateService, - players_service: PlayersService, - assets: AssetsService, - cookie_service: CookiesService, - player_info: PlayerInfoSystem, - ): - self.template_service = template_service - self.players_service = players_service - self.assets_service = assets - self.cookie_service = cookie_service - self.zh_dict = None - self.gacha_log = GachaLog() - self.player_info = player_info - self.wish_photo = None - - async def initialize(self) -> None: - await update_paimon_moe_zh(False) - async with async_open(GACHA_LOG_PAIMON_MOE_PATH, "r", encoding="utf-8") as load_f: - self.zh_dict = jsonlib.loads(await load_f.read()) - - async def get_player_id(self, user_id: int, player_id: int, offset: int) -> int: - """获取绑定的游戏ID""" - logger.debug("尝试获取已绑定的原神账号") - player = await self.players_service.get_player(user_id, player_id=player_id, offset=offset) - if player is None: - raise PlayerNotFoundError(user_id) - return player.player_id - - async def _refresh_user_data( - self, user: "User", player_id: int, data: dict = None, authkey: str = None, verify_uid: bool = True - ) -> str: - """刷新用户数据 - :param user: 用户 - :param data: 数据 - :param authkey: 认证密钥 - :return: 返回信息 - """ - try: - logger.debug("尝试获取已绑定的原神账号") - if authkey: - new_num = await self.gacha_log.get_gacha_log_data(user.id, player_id, authkey) - return "更新完成,本次没有新增数据" if new_num == 0 else f"更新完成,本次共新增{new_num}条抽卡记录" - if data: - new_num = await self.gacha_log.import_gacha_log_data(user.id, player_id, data, verify_uid) - return "更新完成,本次没有新增数据" if new_num == 0 else f"更新完成,本次共新增{new_num}条抽卡记录" - except GachaLogNotFound: - return WAITING - except GachaLogAccountNotFound: - return "导入失败,可能文件包含的祈愿记录所属 uid 与你当前绑定的 uid 不同" - except GachaLogFileError: - return "导入失败,数据格式错误" - except GachaLogInvalidAuthkey: - return "更新数据失败,authkey 无效" - except GachaLogAuthkeyTimeout: - return "更新数据失败,authkey 已经过期" - except GachaLogMixedProvider: - return "导入失败,你已经通过其他方式导入过抽卡记录了,本次无法导入" - except PlayerNotFoundError: - logger.info("未查询到用户 %s[%s] 所绑定的账号信息", user.full_name, user.id) - return config.notice.user_not_found - - async def import_from_file( - self, user: "User", player_id: int, message: "Message", document: "Optional[Document]" = None - ) -> None: - if not document: - document = message.document - # TODO: 使用 mimetype 判断文件类型 - if document.file_name.endswith(".xlsx"): - file_type = "xlsx" - elif document.file_name.endswith(".json"): - file_type = "json" - else: - await message.reply_text( - "文件格式错误,请发送符合 UIGF 标准的抽卡记录文件或者 paimon.moe、非小酋导出的 xlsx 格式的抽卡记录文件" - ) - return - if document.file_size > 5 * 1024 * 1024: - await message.reply_text("文件过大,请发送小于 5 MB 的文件") - return - try: - out = BytesIO() - await (await document.get_file()).download_to_memory(out=out) - if file_type == "json": - # bytesio to json - data = jsonlib.loads(out.getvalue().decode("utf-8")) - elif file_type == "xlsx": - data = self.gacha_log.convert_xlsx_to_uigf(out, self.zh_dict) - else: - await message.reply_text("文件解析失败,请检查文件") - return - except PaimonMoeGachaLogFileError as exc: - await message.reply_text( - f"导入失败,PaimonMoe的抽卡记录当前版本不支持\n支持抽卡记录的版本为 {exc.support_version},你的抽卡记录版本为 {exc.file_version}" - ) - return - except GachaLogFileError: - await message.reply_text(f"文件解析失败,请检查文件是否符合 UIGF {UIGF_VERSION} 标准") - return - except (KeyError, IndexError, ValueError): - await message.reply_text(f"文件解析失败,请检查文件编码是否正确或符合 UIGF {UIGF_VERSION} 标准") - return - except Exception as exc: - logger.error("文件解析失败 %s", repr(exc)) - await message.reply_text(f"文件解析失败,请检查文件是否符合 UIGF {UIGF_VERSION} 标准") - return - await message.reply_chat_action(ChatAction.TYPING) - reply = await message.reply_text("文件解析成功,正在导入数据") - await message.reply_chat_action(ChatAction.TYPING) - try: - text = await self._refresh_user_data(user, player_id, data=data, verify_uid=file_type == "json") - except Exception as exc: # pylint: disable=W0703 - logger.error("文件解析失败 %s", repr(exc)) - text = f"文件解析失败,请检查文件是否符合 UIGF {UIGF_VERSION} 标准" - await reply.edit_text(text) - - async def can_gen_authkey(self, user_id: int, player_id: int) -> bool: - player_info = await self.players_service.get_player(user_id, region=RegionEnum.HYPERION, player_id=player_id) - if player_info is not None: - cookies = await self.cookie_service.get(user_id, account_id=player_info.account_id) - if ( - cookies is not None - and cookies.data - and "stoken" in cookies.data - and next((value for key, value in cookies.data.items() if key in ["ltuid", "login_uid"]), None) - ): - return True - return False - - async def gen_authkey(self, uid: int) -> Optional[str]: - player_info = await self.players_service.get_player(uid, region=RegionEnum.HYPERION) - if player_info is not None: - cookies = await self.cookie_service.get(uid, account_id=player_info.account_id) - if cookies is not None and cookies.data and "stoken" in cookies.data: - if stuid := next((value for key, value in cookies.data.items() if key in ["ltuid", "login_uid"]), None): - cookies.data["stuid"] = stuid - async with GenshinClient( - cookies=cookies.data, region=Region.CHINESE, lang="zh-cn", player_id=player_info.player_id - ) as client: - return await client.get_authkey_by_stoken("webview_gacha") - - @conversation.entry_point - @handler.command(command="wish_log_import", filters=filters.ChatType.PRIVATE, block=False) - @handler.command(command="gacha_log_import", filters=filters.ChatType.PRIVATE, block=False) - @handler.message(filters=filters.Regex("^导入抽卡记录(.*)") & filters.ChatType.PRIVATE, block=False) - @handler.command(command="start", filters=filters.Regex("gacha_log_import$"), block=False) - async def command_start(self, update: "Update", context: "ContextTypes.DEFAULT_TYPE") -> int: - uid, offset = self.get_real_uid_or_offset(update) - message = update.effective_message - user = update.effective_user - player_id = await self.get_player_id(user.id, uid, offset) - context.chat_data["uid"] = player_id - logger.info("用户 %s[%s] 导入抽卡记录命令请求", user.full_name, user.id) - keyboard = None - if await self.can_gen_authkey(user.id, player_id): - keyboard = ReplyKeyboardMarkup([["自动导入"], ["退出"]], one_time_keyboard=True) - await message.reply_text(self.IMPORT_HINT, parse_mode="html", reply_markup=keyboard) - return INPUT_URL - - @conversation.state(state=INPUT_URL) - @handler.message(filters=~filters.COMMAND, block=False) - async def import_data_from_message(self, update: "Update", context: "ContextTypes.DEFAULT_TYPE") -> int: - message = update.effective_message - user = update.effective_user - player_id = context.chat_data["uid"] - if message.document: - await self.import_from_file(user, player_id, message) - return ConversationHandler.END - if not message.text: - await message.reply_text("请发送文件或链接") - return INPUT_URL - if message.text == "自动导入": - authkey = await self.gen_authkey(user.id) - if not authkey: - await message.reply_text( - "自动生成 authkey 失败,请尝试通过其他方式导入。", reply_markup=ReplyKeyboardRemove() - ) - return ConversationHandler.END - elif message.text == "退出": - await message.reply_text("取消导入抽卡记录", reply_markup=ReplyKeyboardRemove()) - return ConversationHandler.END - else: - authkey = from_url_get_authkey(message.text) - reply = await message.reply_text(WAITING, reply_markup=ReplyKeyboardRemove()) - await message.reply_chat_action(ChatAction.TYPING) - text = await self._refresh_user_data(user, player_id, authkey=authkey) - try: - await reply.delete() - except BadRequest: - pass - await message.reply_text(text) - return ConversationHandler.END - - @conversation.entry_point - @handler.command(command="wish_log_delete", filters=filters.ChatType.PRIVATE, block=False) - @handler.command(command="gacha_log_delete", filters=filters.ChatType.PRIVATE, block=False) - @handler.message(filters=filters.Regex("^删除抽卡记录(.*)") & filters.ChatType.PRIVATE, block=False) - async def command_start_delete(self, update: "Update", context: "ContextTypes.DEFAULT_TYPE") -> int: - uid, offset = self.get_real_uid_or_offset(update) - message = update.effective_message - user = update.effective_user - logger.info("用户 %s[%s] 删除抽卡记录命令请求", user.full_name, user.id) - try: - player_id = await self.get_player_id(user.id, uid, offset) - context.chat_data["uid"] = player_id - except PlayerNotFoundError: - logger.info("未查询到用户 %s[%s] 所绑定的账号信息", user.full_name, user.id) - await message.reply_text(config.notice.user_not_found) - return ConversationHandler.END - _, status = await self.gacha_log.load_history_info(str(user.id), str(player_id), only_status=True) - if not status: - await message.reply_text("你还没有导入抽卡记录哦~") - return ConversationHandler.END - await message.reply_text( - "你确定要删除抽卡记录吗?(此项操作无法恢复),如果确定请发送 ”确定“,发送其他内容取消" - ) - return CONFIRM_DELETE - - @conversation.state(state=CONFIRM_DELETE) - @handler.message(filters=filters.TEXT & ~filters.COMMAND, block=False) - async def command_confirm_delete(self, update: "Update", context: "ContextTypes.DEFAULT_TYPE") -> int: - message = update.effective_message - user = update.effective_user - if message.text == "确定": - status = await self.gacha_log.remove_history_info(str(user.id), str(context.chat_data["uid"])) - await message.reply_text("抽卡记录已删除" if status else "抽卡记录删除失败") - return ConversationHandler.END - await message.reply_text("已取消") - return ConversationHandler.END - - @handler.command(command="wish_log_force_delete", block=False, admin=True) - @handler.command(command="gacha_log_force_delete", block=False, admin=True) - async def command_gacha_log_force_delete(self, update: "Update", context: "ContextTypes.DEFAULT_TYPE"): - uid, offset = self.get_real_uid_or_offset(update) - message = update.effective_message - user = update.effective_user - logger.info("用户 %s[%s] 强制删除抽卡记录命令请求", user.full_name, user.id) - args = self.get_args(context) - if not args: - await message.reply_text("请指定用户ID") - return - try: - cid = int(args[0]) - if cid < 0: - raise ValueError("Invalid cid") - player_id = await self.get_player_id(cid, uid, offset) - _, status = await self.gacha_log.load_history_info(str(cid), str(player_id), only_status=True) - if not status: - await message.reply_text("该用户还没有导入抽卡记录") - return - status = await self.gacha_log.remove_history_info(str(cid), str(player_id)) - await message.reply_text("抽卡记录已强制删除" if status else "抽卡记录删除失败") - except GachaLogNotFound: - await message.reply_text("该用户还没有导入抽卡记录") - except PlayerNotFoundError: - await message.reply_text("该用户暂未绑定账号") - except (ValueError, IndexError): - await message.reply_text("用户ID 不合法") - - @handler.command(command="wish_log_export", filters=filters.ChatType.PRIVATE, block=False) - @handler.command(command="gacha_log_export", filters=filters.ChatType.PRIVATE, block=False) - @handler.message(filters=filters.Regex("^导出抽卡记录(.*)") & filters.ChatType.PRIVATE, block=False) - async def command_start_export(self, update: "Update", context: "ContextTypes.DEFAULT_TYPE") -> None: - uid, offset = self.get_real_uid_or_offset(update) - message = update.effective_message - user = update.effective_user - logger.info("用户 %s[%s] 导出抽卡记录命令请求", user.full_name, user.id) - try: - player_id = await self.get_player_id(user.id, uid, offset) - await message.reply_chat_action(ChatAction.TYPING) - path = await self.gacha_log.gacha_log_to_uigf(str(user.id), str(player_id)) - await message.reply_chat_action(ChatAction.UPLOAD_DOCUMENT) - await message.reply_document(document=open(path, "rb+"), caption=f"抽卡记录导出文件 - UIGF {UIGF_VERSION}") - except GachaLogNotFound: - logger.info("未找到用户 %s[%s] 的抽卡记录", user.full_name, user.id) - buttons = [ - [InlineKeyboardButton("点我导入", url=create_deep_linked_url(context.bot.username, "gacha_log_import"))] - ] - await message.reply_text(WISHLOG_NOT_FOUND, reply_markup=InlineKeyboardMarkup(buttons)) - except GachaLogAccountNotFound: - await message.reply_text("导入失败,可能文件包含的祈愿记录所属 uid 与你当前绑定的 uid 不同") - except GachaLogFileError: - await message.reply_text("导入失败,数据格式错误") - except PlayerNotFoundError: - logger.info("未查询到用户 %s[%s] 所绑定的账号信息", user.full_name, user.id) - await message.reply_text(config.notice.user_not_found) - - @handler.command(command="wish_log_url", filters=filters.ChatType.PRIVATE, block=False) - @handler.command(command="gacha_log_url", filters=filters.ChatType.PRIVATE, block=False) - @handler.message(filters=filters.Regex("^抽卡记录链接(.*)") & filters.ChatType.PRIVATE, block=False) - async def command_start_url(self, update: "Update", _: "ContextTypes.DEFAULT_TYPE") -> None: - message = update.effective_message - user = update.effective_user - logger.info("用户 %s[%s] 生成抽卡记录链接命令请求", user.full_name, user.id) - authkey = await self.gen_authkey(user.id) - if not authkey: - await message.reply_text("生成失败,仅国服且绑定 stoken 的用户才能生成抽卡记录链接") - else: - url = "https://hk4e-api.mihoyo.com/event/gacha_info/api/getGachaLog" - params = { - "authkey_ver": 1, - "lang": "zh-cn", - "gacha_type": 301, - "authkey": authkey, - } - await message.reply_text(f"{url}?{urlencode(params)}", disable_web_page_preview=True) - - async def rander_wish_log_analysis( - self, user_id: int, player_id: int, pool_type: BannerType - ) -> Union[str, "RenderResult"]: - data = await self.gacha_log.get_analysis(user_id, player_id, pool_type, self.assets_service) - if isinstance(data, str): - return data - name_card = await self.player_info.get_name_card(player_id, user_id) - data["name_card"] = name_card - png_data = await self.template_service.render( - "genshin/wish_log/wish_log.jinja2", - data, - full_page=True, - file_type=FileType.DOCUMENT if len(data.get("fiveLog")) > 300 else FileType.PHOTO, - query_selector=".body_box", - ) - return png_data - - @staticmethod - def gen_button(user_id: int, uid: int, info: "GachaLogInfo") -> List[List[InlineKeyboardButton]]: - buttons = [] - pools = [] - skip_pools = [] - for k, v in info.item_list.items(): - if k in skip_pools: - continue - if not v: - continue - pools.append(k) - # 2 个一组 - for i in range(0, len(pools), 2): - row = [] - for pool in pools[i : i + 2]: - for k, v in {"log": "", "count": "(按卡池)"}.items(): - row.append( - InlineKeyboardButton( - f"{pool.replace('祈愿', '')}{v}", - callback_data=f"get_wish_log|{user_id}|{uid}|{k}|{pool}", - ) - ) - buttons.append(row) - buttons.append([InlineKeyboardButton("五星抽卡统计", callback_data=f"get_wish_log|{user_id}|{uid}|count|five")]) - return buttons - - async def wish_log_pool_choose(self, user_id: int, player_id: int, message: "Message"): - await message.reply_chat_action(ChatAction.TYPING) - gacha_log, status = await self.gacha_log.load_history_info(str(user_id), str(player_id)) - if not status: - raise GachaLogNotFound - buttons = self.gen_button(user_id, player_id, gacha_log) - if isinstance(self.wish_photo, str): - photo = self.wish_photo - else: - photo = open("resources/img/wish.jpg", "rb") - await message.reply_chat_action(ChatAction.UPLOAD_PHOTO) - reply_message = await message.reply_photo( - photo=photo, - caption="请选择你要查询的卡池", - reply_markup=InlineKeyboardMarkup(buttons), - ) - if reply_message.photo: - self.wish_photo = reply_message.photo[-1].file_id - - async def wish_log_pool_send(self, user_id: int, uid: int, pool_type: "BannerType", message: "Message"): - await message.reply_chat_action(ChatAction.TYPING) - png_data = await self.rander_wish_log_analysis(user_id, uid, pool_type) - if isinstance(png_data, str): - reply = await message.reply_text(png_data) - if filters.ChatType.GROUPS.filter(message): - self.add_delete_message_job(reply) - self.add_delete_message_job(message) - else: - await message.reply_chat_action(ChatAction.UPLOAD_PHOTO) - if png_data.file_type == FileType.DOCUMENT: - await png_data.reply_document(message, filename="抽卡统计.png") - else: - await png_data.reply_photo(message) - - @handler.command(command="wish_log", block=False) - @handler.command(command="gacha_log", block=False) - @handler.message(filters=filters.Regex("^抽卡记录?(武器|角色|常驻|)$"), block=False) - async def command_start_analysis(self, update: "Update", context: "ContextTypes.DEFAULT_TYPE") -> None: - user_id = await self.get_real_user_id(update) - uid, offset = self.get_real_uid_or_offset(update) - message = update.effective_message - pool_type = None - if args := self.get_args(context): - if "角色" in args: - pool_type = BannerType.CHARACTER1 - elif "武器" in args: - pool_type = BannerType.WEAPON - elif "常驻" in args: - pool_type = BannerType.STANDARD - elif "集录" in args: - pool_type = BannerType.CHRONICLED - self.log_user(update, logger.info, "抽卡记录命令请求 || 参数 %s", pool_type.name if pool_type else None) - try: - player_id = await self.get_player_id(user_id, uid, offset) - if pool_type is None: - await self.wish_log_pool_choose(user_id, player_id, message) - else: - await self.wish_log_pool_send(user_id, player_id, pool_type, message) - except GachaLogNotFound: - self.log_user(update, logger.info, "未找到抽卡记录") - buttons = [ - [InlineKeyboardButton("点我导入", url=create_deep_linked_url(context.bot.username, "gacha_log_import"))] - ] - await message.reply_text(WISHLOG_NOT_FOUND, reply_markup=InlineKeyboardMarkup(buttons)) - - @handler.callback_query(pattern=r"^get_wish_log\|", block=False) - async def get_wish_log(self, update: "Update", _: "ContextTypes.DEFAULT_TYPE") -> None: - callback_query = update.callback_query - user = callback_query.from_user - message = callback_query.message - - async def get_wish_log_callback( - callback_query_data: str, - ) -> Tuple[str, str, int, int]: - _data = callback_query_data.split("|") - _user_id = int(_data[1]) - _uid = int(_data[2]) - _t = _data[3] - _result = _data[4] - logger.debug( - "callback_query_data函数返回 result[%s] user_id[%s] uid[%s] show_type[%s]", - _result, - _user_id, - _uid, - _t, - ) - return _result, _t, _user_id, _uid - - try: - pool, show_type, user_id, uid = await get_wish_log_callback(callback_query.data) - except IndexError: - await callback_query.answer("按钮数据已过期,请重新获取。", show_alert=True) - self.add_delete_message_job(message, delay=1) - return - if user.id != user_id: - await callback_query.answer(text="这不是你的按钮!\n" + config.notice.user_mismatch, show_alert=True) - return - if show_type == "count": - await self.get_wish_log_count(update, user_id, uid, pool) - else: - await self.get_wish_log_log(update, user_id, uid, pool) - - async def get_wish_log_log(self, update: "Update", user_id: int, uid: int, pool: str): - callback_query = update.callback_query - message = callback_query.message - - pool_type = GACHA_TYPE_LIST_REVERSE.get(pool) - await message.reply_chat_action(ChatAction.TYPING) - try: - png_data = await self.rander_wish_log_analysis(user_id, uid, pool_type) - except GachaLogNotFound: - png_data = "未找到抽卡记录" - if isinstance(png_data, str): - await callback_query.answer(png_data, show_alert=True) - self.add_delete_message_job(message, delay=1) - else: - await callback_query.answer(text="正在渲染图片中 请稍等 请不要重复点击按钮", show_alert=False) - await message.reply_chat_action(ChatAction.UPLOAD_PHOTO) - if png_data.file_type == FileType.DOCUMENT: - await png_data.reply_document(message, filename="抽卡统计.png") - self.add_delete_message_job(message, delay=1) - else: - await png_data.edit_media(message) - - async def get_wish_log_count(self, update: "Update", user_id: int, uid: int, pool: str): - callback_query = update.callback_query - message = callback_query.message - - all_five = pool == "five" - group = filters.ChatType.GROUPS.filter(message) - pool_type = GACHA_TYPE_LIST_REVERSE.get(pool) - await message.reply_chat_action(ChatAction.TYPING) - try: - if all_five: - png_data = await self.gacha_log.get_all_five_analysis(user_id, uid, self.assets_service) - else: - png_data = await self.gacha_log.get_pool_analysis(user_id, uid, pool_type, self.assets_service, group) - except GachaLogNotFound: - png_data = "未找到抽卡记录" - if isinstance(png_data, str): - await callback_query.answer(png_data, show_alert=True) - self.add_delete_message_job(message, delay=1) - else: - await callback_query.answer(text="正在渲染图片中 请稍等 请不要重复点击按钮", show_alert=False) - name_card = await self.player_info.get_name_card(uid, user_id) - document = False - if png_data["hasMore"] and not group: - document = True - png_data["hasMore"] = False - png_data["name_card"] = name_card - await message.reply_chat_action(ChatAction.UPLOAD_DOCUMENT if document else ChatAction.UPLOAD_PHOTO) - png = await self.template_service.render( - "genshin/wish_count/wish_count.jinja2", - png_data, - full_page=True, - query_selector=".body_box", - file_type=FileType.DOCUMENT if document else FileType.PHOTO, - ) - await message.reply_chat_action(ChatAction.UPLOAD_PHOTO) - if document: - await png.reply_document(message, filename="抽卡统计.png") - self.add_delete_message_job(message, delay=1) - else: - await png.edit_media(message) - - @staticmethod - async def get_migrate_data( - old_user_id: int, new_user_id: int, old_players: List["Player"] - ) -> Optional[GachaLogMigrate]: - return await GachaLogMigrate.create(old_user_id, new_user_id, old_players) - - async def wish_log_use_by_inline( - self, update: "Update", context: "ContextTypes.DEFAULT_TYPE", pool_type: "BannerType" - ): - callback_query = update.callback_query - user = update.effective_user - user_id = user.id - uid = IInlineUseData.get_uid_from_context(context) - - self.log_user(update, logger.info, "抽卡记录命令请求 || 参数 %s", pool_type.name if pool_type else None) - notice = None - try: - render_result = await self.rander_wish_log_analysis(user_id, uid, pool_type) - if isinstance(render_result, str): - notice = render_result - else: - await render_result.edit_inline_media(callback_query, filename="抽卡统计.png") - except GachaLogNotFound: - self.log_user(update, logger.info, "未找到抽卡记录") - notice = "未找到抽卡记录" - if notice: - await callback_query.answer(notice, show_alert=True) - - async def get_inline_use_data(self) -> List[Optional[IInlineUseData]]: - types = { - "角色": BannerType.CHARACTER1, - "武器": BannerType.WEAPON, - "常驻": BannerType.STANDARD, - "集录": BannerType.CHRONICLED, - } - data = [] - for k, v in types.items(): - data.append( - IInlineUseData( - text=f"{k}祈愿", - hash=f"wish_log_{v.value}", - callback=partial(self.wish_log_use_by_inline, pool_type=v), - player=True, - ) - ) - return data diff --git a/plugins/group/captcha.py b/plugins/group/captcha.py deleted file mode 100644 index 007bc16..0000000 --- a/plugins/group/captcha.py +++ /dev/null @@ -1,465 +0,0 @@ -import asyncio -import random -import time -from typing import Tuple, Union, Optional, TYPE_CHECKING - -from telegram import InlineKeyboardButton, InlineKeyboardMarkup, ChatPermissions, ChatMember, Message, User -from telegram.constants import ParseMode -from telegram.error import BadRequest -from telegram.ext import ChatMemberHandler, filters -from telegram.helpers import escape_markdown - -from core.config import config -from core.dependence.mtproto import MTProto -from core.dependence.redisdb import RedisDB -from core.handler.callbackqueryhandler import CallbackQueryHandler -from core.plugin import Plugin, handler -from core.services.quiz.services import QuizService -from plugins.tools.chat_administrators import ChatAdministrators -from utils.chatmember import extract_status_change -from utils.log import logger - -if TYPE_CHECKING: - from telegram.ext import ContextTypes - from telegram import Update - -try: - from pyrogram.errors import BadRequest as MTPBadRequest, FloodWait as MTPFloodWait - - PYROGRAM_AVAILABLE = True -except ImportError: - MTPBadRequest = ValueError - MTPFloodWait = IndexError - PYROGRAM_AVAILABLE = False - -try: - import ujson as jsonlib - -except ImportError: - import json as jsonlib - - -class GroupCaptcha(Plugin): - """群验证模块""" - - def __init__(self, quiz_service: QuizService = None, mtp: MTProto = None, redis: RedisDB = None): - self.quiz_service = quiz_service - self.time_out = 120 - self.kick_time = 120 - self.mtp = mtp.client - self.cache = redis.client - self.ttl = 60 * 60 - self.verify_groups = config.verify_groups - self.user_mismatch = config.notice.user_mismatch - - async def initialize(self): - logger.info("群验证模块正在刷新问题列表") - await self.quiz_service.refresh_quiz() - logger.success("群验证模块刷新问题列表成功") - - @staticmethod - def mention_markdown(user_id: Union[int, str], version: int = 1) -> str: - tg_link = f"tg://user?id={user_id}" - if version == 1: - return f"[{user_id}]({tg_link})" - return f"[{escape_markdown(user_id, version=version)}]({tg_link})" - - async def kick_member_job(self, context: "ContextTypes.DEFAULT_TYPE"): - job = context.job - logger.info("踢出用户 user_id[%s] 在 chat_id[%s]", job.user_id, job.chat_id) - try: - await context.bot.ban_chat_member( - chat_id=job.chat_id, user_id=job.user_id, until_date=int(time.time()) + self.kick_time - ) - except BadRequest as exc: - logger.error( - "GroupCaptcha插件在 chat_id[%s] user_id[%s] 执行kick失败", job.chat_id, job.user_id, exc_info=exc - ) - - @staticmethod - async def clean_message_job(context: "ContextTypes.DEFAULT_TYPE"): - job = context.job - logger.debug("删除消息 chat_id[%s] 的 message_id[%s]", job.chat_id, job.data) - try: - await context.bot.delete_message(chat_id=job.chat_id, message_id=job.data) - except BadRequest as exc: - if "not found" in exc.message: - logger.warning( - "GroupCaptcha插件删除消息 chat_id[%s] message_id[%s]失败 消息不存在", job.chat_id, job.data - ) - elif "Message can't be deleted" in exc.message: - logger.warning( - "GroupCaptcha插件删除消息 chat_id[%s] message_id[%s]失败 消息无法删除 可能是没有授权", - job.chat_id, - job.data, - ) - else: - logger.error( - "GroupCaptcha插件删除消息 chat_id[%s] message_id[%s]失败", job.chat_id, job.data, exc_info=exc - ) - - @staticmethod - async def restore_member(context: "ContextTypes.DEFAULT_TYPE", chat_id: int, user_id: int): - logger.debug("重置用户权限 user_id[%s] 在 chat_id[%s]", chat_id, user_id) - try: - await context.bot.restrict_chat_member( - chat_id=chat_id, user_id=user_id, permissions=ChatPermissions.all_permissions() - ) - except BadRequest as exc: - logger.error("GroupCaptcha插件在 chat_id[%s] user_id[%s] 执行restore失败", chat_id, user_id, exc_info=exc) - - async def get_new_chat_members_message(self, user: User, context: "ContextTypes.DEFAULT_TYPE") -> Optional[Message]: - qname = f"plugin:group_captcha:new_chat_members_message:{user.id}" - result = await self.cache.get(qname) - if result: - data = jsonlib.loads(str(result, encoding="utf-8")) - return Message.de_json(data, context.bot) - return None - - async def set_new_chat_members_message(self, user: User, message: Message): - qname = f"plugin:group_captcha:new_chat_members_message:{user.id}" - await self.cache.set(qname, message.to_json(), ex=60) - - @handler(CallbackQueryHandler, pattern=r"^auth_admin\|", block=False) - async def admin(self, update: "Update", context: "ContextTypes.DEFAULT_TYPE") -> None: - async def admin_callback(callback_query_data: str) -> Tuple[str, int]: - _data = callback_query_data.split("|") - _result = _data[1] - _user_id = int(_data[2]) - logger.debug("admin_callback函数返回 result[%s] user_id[%s]", _result, _user_id) - return _result, _user_id - - callback_query = update.callback_query - user = callback_query.from_user - message = callback_query.message - chat = message.chat - logger.info("用户 %s[%s] 在群 %s[%s] 点击Auth管理员命令", user.full_name, user.id, chat.title, chat.id) - chat_administrators = await ChatAdministrators.get_chat_administrators(self.cache, context, chat_id=chat.id) - if not ChatAdministrators.is_admin(chat_administrators, user.id): - logger.debug("用户 %s[%s] 在群 %s[%s] 非群管理", user.full_name, user.id, chat.title, chat.id) - await callback_query.answer(text="你不是管理!\n" + self.user_mismatch, show_alert=True) - return - result, user_id = await admin_callback(callback_query.data) - try: - member_info = await context.bot.get_chat_member(chat.id, user_id) - except BadRequest as error: - logger.warning("获取用户 %s 在群 %s[%s] 信息失败 \n %s", user_id, chat.title, chat.id, error.message) - member_info = f"{user_id}" - - if result == "pass": - await callback_query.answer(text="放行", show_alert=False) - await self.restore_member(context, chat.id, user_id) - if schedule := context.job_queue.scheduler.get_job(f"{chat.id}|{user_id}|auth_kick"): - schedule.remove() - if isinstance(member_info, ChatMember): - await message.edit_text( - f"{member_info.user.mention_markdown_v2()} 被本群管理员放行", parse_mode=ParseMode.MARKDOWN_V2 - ) - logger.info( - "用户 %s[%s] 在群 %s[%s] 被 %s[%s] 放行", - member_info.user.full_name, - member_info.user.id, - chat.title, - chat.id, - user.full_name, - user.id, - ) - else: - await message.edit_text(f"{member_info} 被本群管理员放行", parse_mode=ParseMode.MARKDOWN_V2) - logger.info( - "用户 %s 在群 %s[%s] 被 %s[%s] 管理放行", member_info, chat.title, chat.id, user.full_name, user.id - ) - elif result == "kick": - await callback_query.answer(text="驱离", show_alert=False) - await context.bot.ban_chat_member(chat.id, user_id) - if isinstance(member_info, ChatMember): - await message.edit_text( - f"{self.mention_markdown(member_info.user.id)} 被本群管理员驱离", parse_mode=ParseMode.MARKDOWN_V2 - ) - logger.info( - "用户 %s[%s] 在群 %s[%s] 被 %s[%s] 被管理驱离", - member_info.user.full_name, - member_info.user.id, - chat.title, - chat.id, - user.full_name, - user.id, - ) - else: - await message.edit_text(f"{member_info} 被本群管理员驱离", parse_mode=ParseMode.MARKDOWN_V2) - logger.info( - "用户 %s 在群 %s[%s] 被 %s[%s] 管理驱离", member_info, chat.title, chat.id, user.full_name, user.id - ) - elif result == "unban": - await callback_query.answer(text="解除驱离", show_alert=False) - await self.restore_member(context, chat.id, user_id) - if schedule := context.job_queue.scheduler.get_job(f"{chat.id}|{user_id}|auth_kick"): - schedule.remove() - if isinstance(member_info, ChatMember): - await message.edit_text( - f"{member_info.user.mention_markdown_v2()} 被本群管理员解除封禁", parse_mode=ParseMode.MARKDOWN_V2 - ) - logger.info( - "用户 %s[%s] 在群 %s[%s] 被 %s[%s] 解除封禁", - member_info.user.full_name, - member_info.user.id, - chat.title, - chat.id, - user.full_name, - user.id, - ) - else: - await message.edit_text(f"{member_info} 被本群管理员解除封禁", parse_mode=ParseMode.MARKDOWN_V2) - logger.info( - "用户 %s 在群 %s[%s] 被 %s[%s] 管理驱离", member_info, chat.title, chat.id, user.full_name, user.id - ) - else: - logger.warning("auth 模块 admin 函数 发现未知命令 result[%s]", result) - await context.bot.send_message(chat.id, f"{config.notice.bot_name}这边收到了错误的消息!请检查详细日记!") - if schedule := context.job_queue.scheduler.get_job(f"{chat.id}|{user_id}|auth_kick"): - schedule.remove() - - @handler(CallbackQueryHandler, pattern=r"^auth_challenge\|", block=False) - async def query(self, update: "Update", context: "ContextTypes.DEFAULT_TYPE") -> None: - async def query_callback(callback_query_data: str) -> Tuple[int, bool, str, str]: - _data = callback_query_data.split("|") - _user_id = int(_data[1]) - _question_id = int(_data[2]) - _answer_id = int(_data[3]) - _answer = await self.quiz_service.get_answer(_answer_id) - _question = await self.quiz_service.get_question(_question_id) - _result = _answer.is_correct - _answer_encode = _answer.text - _question_encode = _question.text - logger.debug( - "query_callback函数返回 user_id[%s] result[%s] \nquestion_encode[%s] answer_encode[%s]", - _user_id, - _result, - _question_encode, - _answer_encode, - ) - return _user_id, _result, _question_encode, _answer_encode - - callback_query = update.callback_query - user = callback_query.from_user - message = callback_query.message - chat = message.chat - user_id, result, question, answer = await query_callback(callback_query.data) - logger.info("用户 %s[%s] 在群 %s[%s] 点击Auth认证命令", user.full_name, user.id, chat.title, chat.id) - if user.id != user_id: - await callback_query.answer(text="这不是你的验证!\n" + self.user_mismatch, show_alert=True) - return - logger.info( - "用户 %s[%s] 在群 %s[%s] 认证结果为 %s", - user.full_name, - user.id, - chat.title, - chat.id, - "通过" if result else "失败", - ) - if result: - buttons = [[InlineKeyboardButton("驱离", callback_data=f"auth_admin|kick|{user.id}")]] - await callback_query.answer(text="验证成功", show_alert=False) - await self.restore_member(context, chat.id, user_id) - if schedule := context.job_queue.scheduler.get_job(f"{chat.id}|{user.id}|auth_kick"): - schedule.remove() - text = ( - f"{user.mention_markdown_v2()} 验证成功,向着星辰与深渊!\n" - f"问题:{escape_markdown(question, version=2)} \n" - f"回答:{escape_markdown(answer, version=2)}" - ) - logger.info("用户 user_id[%s] 在群 %s[%s] 验证成功", user_id, chat.title, chat.id) - else: - buttons = [ - [ - InlineKeyboardButton("驱离", callback_data=f"auth_admin|kick|{user.id}"), - InlineKeyboardButton("撤回驱离", callback_data=f"auth_admin|unban|{user.id}"), - ] - ] - await callback_query.answer(text=f"验证失败,请在 {self.time_out} 秒后重试", show_alert=True) - await asyncio.sleep(3) - await context.bot.ban_chat_member( - chat_id=chat.id, user_id=user_id, until_date=int(time.time()) + self.kick_time - ) - text = ( - f"{user.mention_markdown_v2()} 验证失败,已经赶出提瓦特大陆!\n" - f"问题:{escape_markdown(question, version=2)} \n" - f"回答:{escape_markdown(answer, version=2)}" - ) - logger.info("用户 user_id[%s] 在群 %s[%s] 验证失败", user_id, chat.title, chat.id) - try: - await message.edit_text(text, reply_markup=InlineKeyboardMarkup(buttons), parse_mode=ParseMode.MARKDOWN_V2) - except BadRequest as exc: - if "are exactly the same as " in exc.message: - logger.warning("编辑消息发生异常,可能为用户点按多次键盘导致") - else: - raise exc - if schedule := context.job_queue.scheduler.get_job(f"{chat.id}|{user.id}|auth_kick"): - schedule.remove() - - @handler.message(filters=filters.StatusUpdate.NEW_CHAT_MEMBERS, block=False) - async def new_mem(self, update: "Update", context: "ContextTypes.DEFAULT_TYPE") -> None: - message = update.effective_message - chat = message.chat - if chat.id not in self.verify_groups: - return - for user in message.new_chat_members: - if user.id == context.bot.id: - return - logger.debug("用户 %s[%s] 加入群 %s[%s]", user.full_name, user.id, chat.title, chat.id) - await self.set_new_chat_members_message(user, message) - try: - await message.delete() - except BadRequest as exc: - logger.warning("无法删除 Chat Members Message [%s]", exc.message) - - @handler.chat_member(chat_member_types=ChatMemberHandler.CHAT_MEMBER, block=False) - async def track_users(self, update: "Update", context: "ContextTypes.DEFAULT_TYPE") -> None: - chat = update.effective_chat - if chat.id not in self.verify_groups: - return - new_chat_member = update.chat_member.new_chat_member - from_user = update.chat_member.from_user - user = new_chat_member.user - result = extract_status_change(update.chat_member) - if result is None: - return - was_member, is_member = result - if was_member and not is_member: - logger.info("用户 %s[%s] 退出群聊 %s[%s]", user.full_name, user.id, chat.title, chat.id) - return - if not was_member and is_member: - logger.info("用户 %s[%s] 尝试加入群 %s[%s]", user.full_name, user.id, chat.title, chat.id) - if user.is_bot: - return - chat_administrators = await ChatAdministrators.get_chat_administrators(self.cache, context, chat_id=chat.id) - if ChatAdministrators.is_admin(chat_administrators, from_user.id): - await chat.send_message(f"{config.notice.bot_name}检测到管理员邀请,自动放行了!") - return - question_id_list = await self.quiz_service.get_question_id_list() - if len(question_id_list) == 0: - await chat.send_message("旅行者!!!派蒙的问题清单你还没给我!!快去私聊我给我问题!") - return - try: - await chat.restrict_member(user_id=user.id, permissions=ChatPermissions(can_send_messages=False)) - except BadRequest as exc: - if "Not enough rights" in exc.message: - logger.warning("%s[%s] 权限不够", chat.title, chat.id) - await chat.send_message( - f"{config.notice.bot_name}无法修改 {user.mention_html()} 的权限!请检查是否给{config.notice.bot_name}授权管理了", - parse_mode=ParseMode.HTML, - ) - return - raise exc - question_id = random.choice(question_id_list) # nosec - question = await self.quiz_service.get_question(question_id) - buttons = [ - [ - InlineKeyboardButton( - answer.text, - callback_data=f"auth_challenge|{user.id}|{question.question_id}|{answer.answer_id}", - ) - ] - for answer in question.answers - ] - random.shuffle(buttons) - buttons.append( - [ - InlineKeyboardButton( - "放行", - callback_data=f"auth_admin|pass|{user.id}", - ), - InlineKeyboardButton( - "驱离", - callback_data=f"auth_admin|kick|{user.id}", - ), - ] - ) - reply_message = ( - f"*欢迎 {user.mention_markdown_v2()} 来到「提瓦特」世界!* \n" - f"问题: {escape_markdown(question.text, version=2)} \n" - f"请在*{self.time_out}*秒内回答问题" - ) - logger.debug( - "发送入群验证问题 %s[%s] \n给%s[%s] 在 %s[%s]", - question.text, - question.question_id, - user.full_name, - user.id, - chat.title, - chat.id, - ) - try: - question_message = await chat.send_message( - reply_message, - reply_markup=InlineKeyboardMarkup(buttons), - parse_mode=ParseMode.MARKDOWN_V2, - ) - except BadRequest as exc: - await chat.send_message( - f"{config.notice.bot_name}分心了一下,不小心忘记你了,你只能先退出群再重新进来吧。" - ) - raise exc - context.job_queue.run_once( - callback=self.kick_member_job, - when=self.time_out, - name=f"{chat.id}|{user.id}|auth_kick", - chat_id=chat.id, - user_id=user.id, - job_kwargs={"replace_existing": True, "id": f"{chat.id}|{user.id}|auth_kick"}, - ) - context.job_queue.run_once( - callback=self.clean_message_job, - when=self.time_out, - data=question_message.message_id, - name=f"{chat.id}|{user.id}|auth_clean_question_message", - chat_id=chat.id, - user_id=user.id, - job_kwargs={"replace_existing": True, "id": f"{chat.id}|{user.id}|auth_clean_question_message"}, - ) - if PYROGRAM_AVAILABLE and self.mtp: - new_chat_members_message = await self.get_new_chat_members_message(user, context) - try: - if new_chat_members_message: - if question_message.id - new_chat_members_message.id - 1: - message_ids = list(range(new_chat_members_message.id + 1, question_message.id)) - else: - return - else: - message_ids = [question_message.id - 3, question_message.id] - messages_list = await self.mtp.get_messages(chat.id, message_ids=message_ids) - for find_message in messages_list: - if find_message.empty: - continue - if find_message.from_user and find_message.from_user.id == user.id: - await self.mtp.delete_messages(chat_id=chat.id, message_ids=find_message.id) - text: Optional[str] = None - if find_message.text and "@" in find_message.text: - text = f"{user.full_name} 由于加入群组后,在验证缝隙间发送了带有 @(Mention) 的消息,已被踢出群组,并加入了封禁列表。" - elif find_message.caption and "@" in find_message.caption: - text = f"{user.full_name} 由于加入群组后,在验证缝隙间发送了带有 @(Mention) 的消息,已被踢出群组,并加入了封禁列表。" - elif find_message.forward_from_chat: - text = f"{user.full_name} 由于加入群组后,在验证缝隙间发送了带有 Forward 的消息,已被踢出群组,并加入了封禁列表。" - if text is not None: - await context.bot.ban_chat_member(chat.id, user.id) - button = [ - [InlineKeyboardButton("解除封禁", callback_data=f"auth_admin|pass|{user.id}")] - ] - await question_message.edit_text(text, reply_markup=InlineKeyboardMarkup(button)) - if schedule := context.job_queue.scheduler.get_job(f"{chat.id}|{user.id}|auth_kick"): - schedule.remove() - logger.info( - "用户 %s[%s] 在群 %s[%s] 验证缝隙间发送消息 现已删除", - user.full_name, - user.id, - chat.title, - chat.id, - ) - except BadRequest as exc: - logger.error("后验证处理中发生错误 %s", exc.message) - logger.exception(exc) - except MTPFloodWait: - logger.warning("调用 mtp 触发洪水限制") - except MTPBadRequest as exc: - logger.error("调用 mtp 请求错误") - logger.exception(exc) diff --git a/plugins/jobs/refresh_history.py b/plugins/jobs/refresh_history.py deleted file mode 100644 index c51f011..0000000 --- a/plugins/jobs/refresh_history.py +++ /dev/null @@ -1,155 +0,0 @@ -import datetime -from asyncio import sleep -from typing import TYPE_CHECKING, List - -from simnet.errors import ( - TimedOut as SimnetTimedOut, - BadRequest as SimnetBadRequest, - InvalidCookies, -) -from telegram.constants import ParseMode -from telegram.error import BadRequest, Forbidden - -from core.plugin import Plugin, job -from core.services.history_data.services import HistoryDataAbyssServices, HistoryDataLedgerServices -from gram_core.basemodel import RegionEnum -from gram_core.plugin import handler -from gram_core.services.cookies import CookiesService -from gram_core.services.cookies.models import CookiesStatusEnum -from plugins.genshin.abyss import AbyssPlugin -from plugins.genshin.ledger import LedgerPlugin -from plugins.tools.genshin import GenshinHelper, PlayerNotFoundError, CookiesNotFoundError -from utils.log import logger - -if TYPE_CHECKING: - from telegram import Update - from telegram.ext import ContextTypes - - from simnet import GenshinClient - -REGION = [RegionEnum.HYPERION, RegionEnum.HOYOLAB] -NOTICE_TEXT = """#### %s更新 #### -时间:%s (UTC+8) -UID: %s -结果: 新的%s已保存,可通过命令回顾""" - - -class RefreshHistoryJob(Plugin): - """历史记录定时刷新""" - - def __init__( - self, - cookies: CookiesService, - genshin_helper: GenshinHelper, - history_abyss: HistoryDataAbyssServices, - history_ledger: HistoryDataLedgerServices, - ): - self.cookies = cookies - self.genshin_helper = genshin_helper - self.history_data_abyss = history_abyss - self.history_data_ledger = history_ledger - - @staticmethod - async def send_notice(context: "ContextTypes.DEFAULT_TYPE", user_id: int, notice_text: str): - try: - await context.bot.send_message(user_id, notice_text, parse_mode=ParseMode.HTML) - except (BadRequest, Forbidden) as exc: - logger.error("执行自动刷新历史记录时发生错误 user_id[%s] Message[%s]", user_id, exc.message) - except Exception as exc: - logger.error("执行自动刷新历史记录时发生错误 user_id[%s]", user_id, exc_info=exc) - - async def save_abyss_data(self, client: "GenshinClient") -> bool: - uid = client.player_id - abyss_data = await client.get_genshin_spiral_abyss(uid, previous=False, lang="zh-cn") - avatars = await client.get_genshin_characters(uid, lang="zh-cn") - avatar_data = {i.id: i.constellation for i in avatars} - if abyss_data.unlocked and abyss_data.ranks and abyss_data.ranks.most_kills: - return await AbyssPlugin.save_abyss_data(self.history_data_abyss, uid, abyss_data, avatar_data) - return False - - async def send_abyss_notice(self, context: "ContextTypes.DEFAULT_TYPE", user_id: int, uid: int): - now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") - notice_text = NOTICE_TEXT % ("深渊历史记录", now, uid, "挑战记录") - await self.send_notice(context, user_id, notice_text) - - async def _save_ledger_data(self, client: "GenshinClient", month: int) -> bool: - diary_info = await client.get_genshin_diary(client.player_id, month=month) - return await LedgerPlugin.save_ledger_data(self.history_data_ledger, client.player_id, diary_info) - - @staticmethod - def get_ledger_months() -> List[int]: - now = datetime.datetime.now() - now_time = (now - datetime.timedelta(days=1)) if now.day == 1 and now.hour <= 4 else now - months = [] - last_month = now_time.replace(day=1) - datetime.timedelta(days=1) - months.append(last_month.month) - - last_month = last_month.replace(day=1) - datetime.timedelta(days=1) - months.append(last_month.month) - return months - - async def save_ledger_data(self, client: "GenshinClient") -> bool: - months = self.get_ledger_months() - ok = False - for month in months: - if await self._save_ledger_data(client, month): - ok = True - return ok - - async def send_ledger_notice(self, context: "ContextTypes.DEFAULT_TYPE", user_id: int, uid: int): - now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") - notice_text = NOTICE_TEXT % ("旅行札记历史记录", now, uid, "旅行札记历史记录") - await self.send_notice(context, user_id, notice_text) - - @handler.command(command="remove_same_history", block=False, admin=True) - async def remove_same_history(self, update: "Update", _: "ContextTypes.DEFAULT_TYPE"): - user = update.effective_user - logger.info("用户 %s[%s] remove_same_history 命令请求", user.full_name, user.id) - message = update.effective_message - reply = await message.reply_text("正在执行移除相同数据历史记录任务,请稍后...") - text = "移除相同数据历史记录任务完成\n" - num1 = await self.history_data_abyss.remove_same_data() - text += f"深渊数据移除数量:{num1}\n" - num2 = await self.history_data_ledger.remove_same_data() - text += f"旅行札记数据移除数量:{num2}\n" - await reply.edit_text(text) - - @handler.command(command="refresh_all_history", block=False, admin=True) - async def refresh_all_history(self, update: "Update", context: "ContextTypes.DEFAULT_TYPE"): - user = update.effective_user - logger.info("用户 %s[%s] refresh_all_history 命令请求", user.full_name, user.id) - message = update.effective_message - reply = await message.reply_text("正在执行刷新历史记录任务,请稍后...") - await self.daily_refresh_history(context) - await reply.edit_text("全部账号刷新历史记录任务完成") - - @job.run_daily(time=datetime.time(hour=6, minute=1, second=0), name="RefreshHistoryJob") - async def daily_refresh_history(self, context: "ContextTypes.DEFAULT_TYPE"): - logger.info("正在执行每日刷新历史记录任务") - for database_region in REGION: - for cookie_model in await self.cookies.get_all( - region=database_region, status=CookiesStatusEnum.STATUS_SUCCESS - ): - user_id = cookie_model.user_id - try: - async with self.genshin_helper.genshin(user_id) as client: - if await self.save_abyss_data(client): - await self.send_abyss_notice(context, user_id, client.player_id) - if await self.save_ledger_data(client): - await self.send_ledger_notice(context, user_id, client.player_id) - except (InvalidCookies, PlayerNotFoundError, CookiesNotFoundError): - continue - except SimnetBadRequest as exc: - logger.warning( - "用户 user_id[%s] 请求历史记录失败 [%s]%s", user_id, exc.ret_code, exc.original or exc.message - ) - continue - except SimnetTimedOut: - logger.info("用户 user_id[%s] 请求历史记录超时", user_id) - continue - except Exception as exc: - logger.error("执行自动刷新历史记录时发生错误 user_id[%s]", user_id, exc_info=exc) - continue - await sleep(1) - - logger.success("执行每日刷新历史记录任务完成") diff --git a/plugins/jobs/sign.py b/plugins/jobs/sign.py index e026d05..e4970ea 100644 --- a/plugins/jobs/sign.py +++ b/plugins/jobs/sign.py @@ -2,7 +2,7 @@ import datetime from typing import TYPE_CHECKING from core.plugin import Plugin, job -from plugins.genshin.sign import SignSystem +from plugins.zzz.sign import SignSystem from plugins.tools.sign import SignJobType from utils.log import logger diff --git a/plugins/system/errorhandler.py b/plugins/system/errorhandler.py index 26dc974..746295a 100644 --- a/plugins/system/errorhandler.py +++ b/plugins/system/errorhandler.py @@ -25,6 +25,7 @@ from telegram.helpers import create_deep_linked_url from core.config import config from core.plugin import Plugin, error_handler +from gram_core.services.cookies.error import CookieServiceError as PublicCookieServiceError from gram_core.services.players.error import PlayerNotFoundError from modules.apihelper.error import APIHelperException, APIHelperTimedOut, ResponseException, ReturnCodeError from modules.errorpush import ( @@ -154,7 +155,7 @@ class ErrorHandler(Plugin): elif exc.retcode == 10103: notice = ( self.ERROR_MSG_PREFIX - + "Cookie 有效,但没有绑定到游戏帐户,请尝试登录通行证,在账号管理里面选择账号游戏信息,将原神设置为默认角色。" + + "Cookie 有效,但没有绑定到游戏帐户,请尝试登录通行证,在账号管理里面选择账号游戏信息,将绝区零设置为默认角色。" ) else: logger.error("未知Cookie错误", exc_info=exc) @@ -271,6 +272,13 @@ class ErrorHandler(Plugin): self.create_notice_task(update, context, config.notice.user_not_found) raise ApplicationHandlerStop + @error_handler() + async def process_public_cookies(self, update: object, context: CallbackContext): + if not isinstance(context.error, PublicCookieServiceError) or not isinstance(update, Update): + return + self.create_notice_task(update, context, "公共Cookies池已经耗尽,请稍后重试或者绑定账号") + raise ApplicationHandlerStop + @error_handler(block=False) async def process_z_error(self, update: object, context: CallbackContext) -> None: # 必须 `process_` 加上 `z` 保证该函数最后一个注册 diff --git a/plugins/tools/birthday_card.py b/plugins/tools/birthday_card.py deleted file mode 100644 index ceab7f0..0000000 --- a/plugins/tools/birthday_card.py +++ /dev/null @@ -1,186 +0,0 @@ -from datetime import datetime -from typing import TYPE_CHECKING, List, Optional - -from simnet import Region -from simnet.client.routes import Route -from simnet.errors import BadRequest as SimnetBadRequest, RegionNotSupported, InvalidCookies, TimedOut as SimnetTimedOut -from simnet.utils.player import recognize_genshin_game_biz, recognize_genshin_server -from sqlalchemy.orm.exc import StaleDataError -from telegram.constants import ParseMode -from telegram.error import BadRequest, Forbidden - -from core.plugin import Plugin -from core.services.task.models import TaskStatusEnum -from core.services.task.services import TaskCardServices -from metadata.shortname import roleToId -from modules.apihelper.client.components.calendar import Calendar -from plugins.tools.genshin import GenshinHelper, PlayerNotFoundError, CookiesNotFoundError -from utils.log import logger - -if TYPE_CHECKING: - from simnet import GenshinClient - from telegram.ext import ContextTypes - -BIRTHDAY_URL = Route( - "https://hk4e-api.mihoyo.com/event/birthdaystar/account/post_my_draw", -) - - -def rm_starting_str(string, starting): - """Remove the starting character from a string.""" - while string[0] == str(starting): - string = string[1:] - return string - - -class BirthdayCardNoBirthdayError(Exception): - pass - - -class BirthdayCardAlreadyClaimedError(Exception): - pass - - -class BirthdayCardSystem(Plugin): - def __init__( - self, - card_service: TaskCardServices, - genshin_helper: GenshinHelper, - ): - self.birthday_list = {} - self.card_service = card_service - self.genshin_helper = genshin_helper - - async def initialize(self): - self.birthday_list = await Calendar.async_gen_birthday_list() - self.birthday_list.get("6_1", []).append("派蒙") - - @property - def key(self): - return ( - rm_starting_str(datetime.now().strftime("%m"), "0") - + "_" - + rm_starting_str(datetime.now().strftime("%d"), "0") - ) - - def get_today_birthday(self) -> List[str]: - key = self.key - return (self.birthday_list.get(key, [])).copy() - - @staticmethod - def role_to_id(name: str) -> Optional[int]: - if name == "派蒙": - return -1 - return roleToId(name) - - @staticmethod - async def get_card(client: "GenshinClient", role_id: int) -> None: - """领取画片""" - url = BIRTHDAY_URL.get_url() - params = { - "game_biz": recognize_genshin_game_biz(client.player_id), - "lang": "zh-cn", - "badge_uid": client.player_id, - "badge_region": recognize_genshin_server(client.player_id), - "activity_id": "20220301153521", - } - json = { - "role_id": role_id, - } - try: - await client.request_lab(url, method="POST", params=params, data=json) - except SimnetBadRequest as e: - if e.retcode == -512008: - raise BirthdayCardNoBirthdayError from e # 未过生日 - if e.retcode == -512009: - raise BirthdayCardAlreadyClaimedError from e # 已领取过 - raise e - - async def start_get_card( - self, - client: "GenshinClient", - ) -> str: - if client.region == Region.OVERSEAS: - raise RegionNotSupported - today_list = self.get_today_birthday() - if not today_list: - raise BirthdayCardNoBirthdayError - game_biz = recognize_genshin_game_biz(client.player_id) - region = recognize_genshin_server(client.player_id) - await client.get_hk4e_token_by_cookie_token(game_biz, region) - for name in today_list.copy(): - if role_id := self.role_to_id(name): - try: - await self.get_card(client, role_id) - except BirthdayCardAlreadyClaimedError: - today_list.remove(name) - if today_list: - text = f"成功领取了 {'、'.join(today_list)} 的生日画片~" - else: - raise BirthdayCardAlreadyClaimedError - return text - - async def do_get_card_job(self, context: "ContextTypes.DEFAULT_TYPE"): - if not self.get_today_birthday(): - logger.info("今天没有角色过生日,跳过自动领取生日画片") - return - include_status: List[TaskStatusEnum] = [ - TaskStatusEnum.STATUS_SUCCESS, - TaskStatusEnum.TIMEOUT_ERROR, - ] - task_list = await self.card_service.get_all() - for task_db in task_list: - if task_db.status not in include_status: - continue - user_id = task_db.user_id - try: - async with self.genshin_helper.genshin(user_id) as client: - text = await self.start_get_card(client) - except InvalidCookies: - text = "自动领取生日画片执行失败,Cookie无效" - task_db.status = TaskStatusEnum.INVALID_COOKIES - except BirthdayCardAlreadyClaimedError: - text = "今天旅行者已经领取过了~" - task_db.status = TaskStatusEnum.ALREADY_CLAIMED - except SimnetBadRequest as exc: - text = f"自动领取生日画片执行失败,API返回信息为 {str(exc)}" - task_db.status = TaskStatusEnum.GENSHIN_EXCEPTION - except SimnetTimedOut: - text = "领取失败了呜呜呜 ~ 服务器连接超时 服务器熟啦 ~ " - task_db.status = TaskStatusEnum.TIMEOUT_ERROR - except PlayerNotFoundError: - logger.info("用户 user_id[%s] 玩家不存在 关闭并移除自动领取生日画片", user_id) - await self.card_service.remove(task_db) - continue - except CookiesNotFoundError: - logger.info("用户 user_id[%s] cookie 不存在 关闭并移除自动领取生日画片", user_id) - await self.card_service.remove(task_db) - continue - except RegionNotSupported: - logger.info("用户 user_id[%s] 不支持的服务器 关闭并移除自动领取生日画片", user_id) - await self.card_service.remove(task_db) - continue - except Exception as exc: - logger.error("执行自动领取生日画片时发生错误 user_id[%s]", user_id, exc_info=exc) - text = "自动领取生日画片失败了呜呜呜 ~ 执行自动领取生日画片时发生错误" - else: - task_db.status = TaskStatusEnum.STATUS_SUCCESS - if task_db.chat_id < 0: - text = f'NOTICE {task_db.user_id}\n\n{text}' - try: - await context.bot.send_message(task_db.chat_id, text, parse_mode=ParseMode.HTML) - except BadRequest as exc: - logger.error("执行自动领取生日画片时发生错误 user_id[%s] Message[%s]", user_id, exc.message) - task_db.status = TaskStatusEnum.BAD_REQUEST - except Forbidden as exc: - logger.error("执行自动领取生日画片时发生错误 user_id[%s] message[%s]", user_id, exc.message) - task_db.status = TaskStatusEnum.FORBIDDEN - except Exception as exc: - logger.error("执行自动领取生日画片时发生错误 user_id[%s]", user_id, exc_info=exc) - continue - else: - task_db.status = TaskStatusEnum.STATUS_SUCCESS - try: - await self.card_service.update(task_db) - except StaleDataError: - logger.warning("用户 user_id[%s] 自动领取生日画片数据过期,跳过更新数据", user_id) diff --git a/plugins/tools/challenge.py b/plugins/tools/challenge.py index edcfef3..79f0fd6 100644 --- a/plugins/tools/challenge.py +++ b/plugins/tools/challenge.py @@ -59,7 +59,7 @@ class ChallengeSystem(Plugin): raise ChallengeSystemException("无需验证") if need_verify: try: - await client.get_genshin_notes() + await client.get_zzz_notes() except NeedChallenge: pass else: diff --git a/plugins/tools/daily_note.py b/plugins/tools/daily_note.py index 255b2fe..f4d06fa 100644 --- a/plugins/tools/daily_note.py +++ b/plugins/tools/daily_note.py @@ -3,22 +3,22 @@ from datetime import datetime from typing import TYPE_CHECKING, List, Optional, Union from pydantic import BaseModel, validator -from simnet import Region from simnet.errors import BadRequest as SimnetBadRequest, InvalidCookies, TimedOut as SimnetTimedOut +from simnet.models.zzz.chronicle.notes import ZZZNoteVhsSaleState from sqlalchemy.orm.exc import StaleDataError from telegram.constants import ParseMode from telegram.error import BadRequest, Forbidden from core.plugin import Plugin from core.services.task.models import Task as TaskUser, TaskStatusEnum -from core.services.task.services import TaskResinServices, TaskRealmServices, TaskExpeditionServices, TaskDailyServices +from core.services.task.services import TaskResinServices, TaskExpeditionServices, TaskDailyServices from gram_core.plugin.methods.migrate_data import IMigrateData, MigrateDataException from plugins.tools.genshin import GenshinHelper, PlayerNotFoundError, CookiesNotFoundError from utils.log import logger if TYPE_CHECKING: - from simnet import GenshinClient - from simnet.models.genshin.chronicle.notes import Notes, NotesWidget + from simnet import ZZZClient + from simnet.models.zzz.chronicle.notes import ZZZNote from telegram.ext import ContextTypes from gram_core.services.task.services import TaskServices @@ -33,17 +33,7 @@ class ResinData(TaskDataBase): @validator("notice_num") def notice_num_validator(cls, v): if v < 60 or v > 200: - raise ValueError("树脂提醒数值必须在 60 ~ 200 之间") - return v - - -class RealmData(TaskDataBase): - notice_num: Optional[int] = 2000 - - @validator("notice_num") - def notice_num_validator(cls, v): - if v < 100 or v > 2400: - raise ValueError("洞天宝钱提醒数值必须在 100 ~ 2400 之间") + raise ValueError("电量提醒数值必须在 60 ~ 200 之间") return v @@ -63,7 +53,6 @@ class DailyData(TaskDataBase): class WebAppData(BaseModel): resin: Optional[ResinData] - realm: Optional[RealmData] expedition: Optional[ExpeditionData] daily: Optional[DailyData] @@ -73,17 +62,14 @@ class DailyNoteTaskUser: self, user_id: int, resin_db: Optional[TaskUser] = None, - realm_db: Optional[TaskUser] = None, expedition_db: Optional[TaskUser] = None, daily_db: Optional[TaskUser] = None, ): self.user_id = user_id self.resin_db = resin_db - self.realm_db = realm_db self.expedition_db = expedition_db self.daily_db = daily_db self.resin = ResinData(**self.resin_db.data) if self.resin_db else None - self.realm = RealmData(**self.realm_db.data) if self.realm_db else None self.expedition = ExpeditionData(**self.expedition_db.data) if self.expedition_db else None self.daily = DailyData(**self.daily_db.data) if self.daily_db else None @@ -92,7 +78,6 @@ class DailyNoteTaskUser: return max( [ self.resin_db.status if self.resin_db else TaskStatusEnum.STATUS_SUCCESS, - self.realm_db.status if self.realm_db else TaskStatusEnum.STATUS_SUCCESS, self.expedition_db.status if self.expedition_db else TaskStatusEnum.STATUS_SUCCESS, self.daily_db.status if self.daily_db else TaskStatusEnum.STATUS_SUCCESS, ] @@ -102,8 +87,6 @@ class DailyNoteTaskUser: def status(self, value: TaskStatusEnum): if self.resin_db: self.resin_db.status = value - if self.realm_db: - self.realm_db.status = value if self.expedition_db: self.expedition_db.status = value if self.daily: @@ -125,7 +108,6 @@ class DailyNoteTaskUser: ( WebAppData( resin=self.set_model_noticed(self.resin) if self.resin else None, - realm=self.set_model_noticed(self.realm) if self.realm else None, expedition=self.set_model_noticed(self.expedition) if self.expedition else None, daily=self.set_model_noticed(self.daily) if self.daily else None, ).json() @@ -135,8 +117,6 @@ class DailyNoteTaskUser: def save(self): if self.resin_db: self.resin_db.data = self.resin.dict() - if self.realm_db: - self.realm_db.data = self.realm.dict() if self.expedition_db: self.expedition_db.data = self.expedition.dict() if self.daily_db: @@ -148,38 +128,34 @@ class DailyNoteSystem(Plugin): self, genshin_helper: GenshinHelper, resin_service: TaskResinServices, - realm_service: TaskRealmServices, expedition_service: TaskExpeditionServices, daily_service: TaskDailyServices, ): self.genshin_helper = genshin_helper self.resin_service = resin_service - self.realm_service = realm_service self.expedition_service = expedition_service self.daily_service = daily_service async def get_single_task_user(self, user_id: int) -> DailyNoteTaskUser: resin_db = await self.resin_service.get_by_user_id(user_id) - realm_db = await self.realm_service.get_by_user_id(user_id) expedition_db = await self.expedition_service.get_by_user_id(user_id) daily_db = await self.daily_service.get_by_user_id(user_id) return DailyNoteTaskUser( user_id=user_id, resin_db=resin_db, - realm_db=realm_db, expedition_db=expedition_db, daily_db=daily_db, ) @staticmethod - def get_resin_notice(user: DailyNoteTaskUser, notes: Union["Notes", "NotesWidget"]) -> str: + def get_resin_notice(user: DailyNoteTaskUser, notes: Union["ZZZNote"]) -> str: notice = None - if user.resin_db and notes.max_resin > 0: - if notes.current_resin >= user.resin.notice_num: + if user.resin_db and notes.max_stamina > 0: + if notes.current_stamina >= user.resin.notice_num: if not user.resin.noticed: notice = ( - f"### 树脂提示 ####\n\n当前树脂为 {notes.current_resin} / {notes.max_resin} ,记得使用哦~\n" - f"预计全部恢复完成:{notes.resin_recovery_time.strftime('%Y-%m-%d %H:%M')}" + f"### 电量提示 ####\n\n当前电量为 {notes.current_stamina} / {notes.max_stamina} ,记得使用哦~\n" + f"预计全部恢复完成:{notes.stamina_recover_time.strftime('%Y-%m-%d %H:%M')}" ) user.resin.noticed = True else: @@ -187,46 +163,28 @@ class DailyNoteSystem(Plugin): return notice @staticmethod - def get_realm_notice(user: DailyNoteTaskUser, notes: Union["Notes", "NotesWidget"]) -> str: + def get_expedition_notice(user: DailyNoteTaskUser, notes: Union["ZZZNote"]) -> str: notice = None - if user.realm_db and notes.max_realm_currency > 0: - if notes.current_realm_currency >= user.realm.notice_num: - if not user.realm.noticed: - notice = ( - f"### 洞天宝钱提示 ####\n\n" - f"当前存储为 {notes.current_realm_currency} / {notes.max_realm_currency} ,记得领取哦~" - ) - user.realm.noticed = True - else: - user.realm.noticed = False - return notice - - @staticmethod - def get_expedition_notice(user: DailyNoteTaskUser, notes: Union["Notes", "NotesWidget"]) -> str: - notice = None - if user.expedition_db and len(notes.expeditions) > 0: - all_finished = all(i.status == "Finished" for i in notes.expeditions) + if user.expedition_db and notes.vhs_sale.sale_state: + all_finished = notes.vhs_sale.sale_state == ZZZNoteVhsSaleState.DONE if all_finished: if not user.expedition.noticed: - notice = "### 探索派遣提示 ####\n\n所有探索派遣已完成,记得重新派遣哦~" + notice = "### 录像店经营提示 ####\n\n录像店经营已完成,记得重新上架哦~" user.expedition.noticed = True else: user.expedition.noticed = False return notice @staticmethod - def get_daily_notice(user: DailyNoteTaskUser, notes: Union["Notes", "NotesWidget"]) -> str: + def get_daily_notice(user: DailyNoteTaskUser, notes: Union["ZZZNote"]) -> str: notice = None now_hour = datetime.now().hour if user.daily_db: if now_hour == user.daily.notice_hour: - if (notes.completed_commissions != notes.max_commissions or (not notes.claimed_commission_reward)) and ( - not user.daily.noticed - ): - notice_ = "已领取奖励" if notes.claimed_commission_reward else "未领取奖励" + if (notes.current_train_score != notes.max_train_score) and (not user.daily.noticed): notice = ( f"### 每日任务提示 ####\n\n" - f"当前进度为 {notes.completed_commissions} / {notes.max_commissions} ({notice_}) ,记得完成哦~" + f"当前进度为 {notes.current_train_score} / {notes.max_train_score} ,记得完成哦~" ) user.daily.noticed = True else: @@ -235,18 +193,14 @@ class DailyNoteSystem(Plugin): @staticmethod async def start_get_notes( - client: "GenshinClient", + client: "ZZZClient", user: DailyNoteTaskUser = None, ) -> List[str]: - if client.region == Region.OVERSEAS: - notes = await client.get_genshin_notes() - else: - notes = await client.get_genshin_notes_by_stoken() + notes = await client.get_zzz_notes() if not user: return [] notices = [ DailyNoteSystem.get_resin_notice(user, notes), - DailyNoteSystem.get_realm_notice(user, notes), DailyNoteSystem.get_expedition_notice(user, notes), DailyNoteSystem.get_daily_notice(user, notes), ] @@ -255,14 +209,11 @@ class DailyNoteSystem(Plugin): async def get_all_task_users(self) -> List[DailyNoteTaskUser]: resin_list = await self.resin_service.get_all() - realm_list = await self.realm_service.get_all() expedition_list = await self.expedition_service.get_all() daily_list = await self.daily_service.get_all() user_list = set() for i in resin_list: user_list.add(i.user_id) - for i in realm_list: - user_list.add(i.user_id) for i in expedition_list: user_list.add(i.user_id) for i in daily_list: @@ -271,7 +222,6 @@ class DailyNoteSystem(Plugin): DailyNoteTaskUser( user_id=i, resin_db=next((x for x in resin_list if x.user_id == i), None), - realm_db=next((x for x in realm_list if x.user_id == i), None), expedition_db=next((x for x in expedition_list if x.user_id == i), None), daily_db=next((x for x in daily_list if x.user_id == i), None), ) @@ -281,8 +231,6 @@ class DailyNoteSystem(Plugin): async def remove_task_user(self, user: DailyNoteTaskUser): if user.resin_db: await self.resin_service.remove(user.resin_db) - if user.realm_db: - await self.realm_service.remove(user.realm_db) if user.expedition_db: await self.expedition_service.remove(user.expedition_db) if user.daily_db: @@ -293,17 +241,12 @@ class DailyNoteSystem(Plugin): try: await self.resin_service.update(user.resin_db) except StaleDataError: - logger.warning("用户 user_id[%s] 自动便签提醒 - 树脂数据过期,跳过更新数据", user.user_id) - if user.realm_db: - try: - await self.realm_service.update(user.realm_db) - except StaleDataError: - logger.warning("用户 user_id[%s] 自动便签提醒 - 洞天宝钱数据过期,跳过更新数据", user.user_id) + logger.warning("用户 user_id[%s] 自动便签提醒 - 电量数据过期,跳过更新数据", user.user_id) if user.expedition_db: try: await self.expedition_service.update(user.expedition_db) except StaleDataError: - logger.warning("用户 user_id[%s] 自动便签提醒 - 探索派遣数据过期,跳过更新数据", user.user_id) + logger.warning("用户 user_id[%s] 自动便签提醒 - 录像店经营数据过期,跳过更新数据", user.user_id) if user.daily_db: try: await self.daily_service.update(user.daily_db) @@ -315,8 +258,6 @@ class DailyNoteSystem(Plugin): need_verify = False if web_config.resin and web_config.resin.noticed: need_verify = True - if web_config.realm and web_config.realm.noticed: - need_verify = True if web_config.expedition and web_config.expedition.noticed: need_verify = True if web_config.daily and web_config.daily.noticed: @@ -344,26 +285,6 @@ class DailyNoteSystem(Plugin): user.resin_db = None user.resin = None - async def import_web_config_realm(self, user: DailyNoteTaskUser, web_config: WebAppData): - user_id = user.user_id - if web_config.realm.noticed: - if not user.realm_db: - realm = self.realm_service.create( - user_id, - user_id, - status=TaskStatusEnum.STATUS_SUCCESS, - data=RealmData(notice_num=web_config.realm.notice_num).dict(), - ) - await self.realm_service.add(realm) - else: - user.realm.notice_num = web_config.realm.notice_num - user.realm.noticed = False - else: - if user.realm_db: - await self.realm_service.remove(user.realm_db) - user.realm_db = None - user.realm = None - async def import_web_config_expedition(self, user: DailyNoteTaskUser, web_config: WebAppData): user_id = user.user_id if web_config.expedition.noticed: @@ -408,8 +329,6 @@ class DailyNoteSystem(Plugin): user = await self.get_single_task_user(user_id) if web_config.resin: await self.import_web_config_resin(user, web_config) - if web_config.realm: - await self.import_web_config_realm(user, web_config) if web_config.expedition: await self.import_web_config_expedition(user, web_config) if web_config.daily: @@ -453,9 +372,7 @@ class DailyNoteSystem(Plugin): text = "获取便签失败了呜呜呜 ~ 执行自动便签提醒时发生错误" else: task_db.status = TaskStatusEnum.STATUS_SUCCESS - for idx, task_user_db in enumerate( - [task_db.resin_db, task_db.realm_db, task_db.expedition_db, task_db.daily_db] - ): + for idx, task_user_db in enumerate([task_db.resin_db, task_db.expedition_db, task_db.daily_db]): if task_user_db is None: continue notice_text = text[idx] if isinstance(text, list) else text diff --git a/plugins/tools/genshin.py b/plugins/tools/genshin.py index 713423d..feb2a6c 100644 --- a/plugins/tools/genshin.py +++ b/plugins/tools/genshin.py @@ -6,7 +6,7 @@ from typing import Optional from typing import TYPE_CHECKING, Union from pydantic import ValidationError -from simnet import GenshinClient, Region +from simnet import ZZZClient, Region from simnet.errors import BadRequest as SimnetBadRequest, InvalidCookies, NetworkError, CookieException, NeedChallenge from simnet.models.genshin.calculator import CalculatorCharacterDetails from simnet.models.genshin.chronicle.characters import Character @@ -158,7 +158,7 @@ class CharacterDetails(Plugin): return None async def get_character_details( - self, client: "GenshinClient", character: "Union[int,Character]" + self, client: "ZZZClient", character: "Union[int,Character]" ) -> Optional["CalculatorCharacterDetails"]: """缓存 character_details 并定时对其进行数据存储 当遇到 Too Many Requests 可以获取以前的数据""" uid = client.player_id @@ -220,7 +220,7 @@ class GenshinHelper(Plugin): @asynccontextmanager async def genshin( # skipcq: PY-R1000 # self, user_id: int, region: Optional[RegionEnum] = None, player_id: int = None, offset: int = 0 - ) -> GenshinClient: + ) -> ZZZClient: player = await self.players_service.get_player(user_id, region, player_id, offset) if player is None: raise PlayerNotFoundError(user_id) @@ -246,7 +246,7 @@ class GenshinHelper(Plugin): device_id = devices.device_id device_fp = devices.device_fp - async with GenshinClient( + async with ZZZClient( cookies, region=region, account_id=player.account_id, @@ -308,7 +308,7 @@ class GenshinHelper(Plugin): async def get_genshin_client( self, user_id: int, region: Optional[RegionEnum] = None, player_id: int = None, offset: int = 0 - ) -> GenshinClient: + ) -> ZZZClient: player = await self.players_service.get_player(user_id, region, player_id, offset) if player is None: raise PlayerNotFoundError(user_id) @@ -334,7 +334,7 @@ class GenshinHelper(Plugin): device_id = devices.device_id device_fp = devices.device_fp - return GenshinClient( + return ZZZClient( cookies, region=region, account_id=player.account_id, @@ -347,7 +347,7 @@ class GenshinHelper(Plugin): @asynccontextmanager async def public_genshin( self, user_id: int, region: Optional[RegionEnum] = None, uid: Optional[int] = None - ) -> GenshinClient: + ) -> ZZZClient: if not (region or uid): player = await self.players_service.get_player(user_id, region) if player: @@ -370,7 +370,7 @@ class GenshinHelper(Plugin): device_id = devices.device_id device_fp = devices.device_fp - async with GenshinClient( + async with ZZZClient( cookies.data, region=region, player_id=uid, @@ -392,7 +392,7 @@ class GenshinHelper(Plugin): region: Optional[RegionEnum] = None, uid: Optional[int] = None, offset: int = 0, - ) -> GenshinClient: + ) -> ZZZClient: try: async with self.genshin(user_id, region, uid, offset) as client: client.public = False diff --git a/plugins/tools/player_info.py b/plugins/tools/player_info.py index ce20727..4090568 100644 --- a/plugins/tools/player_info.py +++ b/plugins/tools/player_info.py @@ -2,7 +2,6 @@ from typing import Optional from enkanetwork import Assets -from core.dependence.assets import AssetsService from core.plugin import Plugin from core.services.players.services import PlayerInfoService, PlayersService from metadata.genshin import AVATAR_DATA @@ -13,10 +12,8 @@ class PlayerInfoSystem(Plugin): def __init__( self, player_service: PlayersService = None, - assets_service: AssetsService = None, player_info_service: PlayerInfoService = None, ) -> None: - self.assets_service = assets_service self.player_info_service = player_info_service self.player_service = player_service diff --git a/plugins/tools/sign.py b/plugins/tools/sign.py index eed613a..1e54294 100644 --- a/plugins/tools/sign.py +++ b/plugins/tools/sign.py @@ -27,7 +27,7 @@ from plugins.tools.recognize import RecognizeSystem from utils.log import logger if TYPE_CHECKING: - from simnet import GenshinClient + from simnet import ZZZClient from telegram.ext import ContextTypes @@ -106,7 +106,7 @@ class SignSystem(Plugin): async def start_sign( self, - client: "GenshinClient", + client: "ZZZClient", challenge: Optional[str] = None, validate: Optional[str] = None, is_sleep: bool = False, diff --git a/plugins/genshin/__init__.py b/plugins/zzz/__init__.py similarity index 100% rename from plugins/genshin/__init__.py rename to plugins/zzz/__init__.py diff --git a/plugins/genshin/daily_note.py b/plugins/zzz/daily_note.py similarity index 64% rename from plugins/genshin/daily_note.py rename to plugins/zzz/daily_note.py index ff62d9c..58dcbeb 100644 --- a/plugins/genshin/daily_note.py +++ b/plugins/zzz/daily_note.py @@ -16,7 +16,7 @@ from utils.log import logger from utils.uid import mask_number if TYPE_CHECKING: - from simnet import GenshinClient + from simnet import ZZZClient from telegram import Update from telegram.ext import ContextTypes @@ -34,62 +34,30 @@ class DailyNotePlugin(Plugin): self.template_service = template self.helper = helper - async def _get_daily_note(self, client: "GenshinClient") -> RenderResult: - daily_info = await client.get_genshin_notes(client.player_id) + async def _get_daily_note(self, client: "ZZZClient") -> RenderResult: + daily_info = await client.get_zzz_notes(client.player_id) day = datetime.now().strftime("%m-%d %H:%M") + " 星期" + "一二三四五六日"[datetime.now().weekday()] resin_recovery_time = ( - daily_info.resin_recovery_time.strftime("%m-%d %H:%M") - if daily_info.max_resin - daily_info.current_resin + daily_info.stamina_recover_time.strftime("%m-%d %H:%M") + if daily_info.max_stamina - daily_info.current_stamina else None ) - realm_recovery_time = ( - (datetime.now().astimezone() + daily_info.remaining_realm_currency_recovery_time).strftime("%m-%d %H:%M") - if daily_info.max_realm_currency - daily_info.current_realm_currency - else None - ) - remained_time = None - for i in daily_info.expeditions: - if remained_time: - if remained_time < i.remaining_time: - remained_time = i.remaining_time - else: - remained_time = i.remaining_time - if remained_time: - remained_time = (datetime.now().astimezone() + remained_time).strftime("%m-%d %H:%M") - - transformer, transformer_ready, transformer_recovery_time = False, None, None - if daily_info.remaining_transformer_recovery_time is not None: - transformer = True - transformer_ready = daily_info.remaining_transformer_recovery_time.total_seconds() == 0 - transformer_recovery_time = daily_info.transformer_recovery_time.strftime("%m-%d %H:%M") render_data = { "uid": mask_number(client.player_id), "day": day, "resin_recovery_time": resin_recovery_time, - "current_resin": daily_info.current_resin, - "max_resin": daily_info.max_resin, - "realm_recovery_time": realm_recovery_time, - "current_realm_currency": daily_info.current_realm_currency, - "max_realm_currency": daily_info.max_realm_currency, - "claimed_commission_reward": daily_info.claimed_commission_reward, - "completed_commissions": daily_info.completed_commissions, - "max_commissions": daily_info.max_commissions, - "expeditions": bool(daily_info.expeditions), - "remained_time": remained_time, - "current_expeditions": len(daily_info.expeditions), - "max_expeditions": daily_info.max_expeditions, - "remaining_resin_discounts": daily_info.remaining_resin_discounts, - "max_resin_discounts": daily_info.max_resin_discounts, - "transformer": transformer, - "transformer_ready": transformer_ready, - "transformer_recovery_time": transformer_recovery_time, + "current_resin": daily_info.current_stamina, + "max_resin": daily_info.max_stamina, + "exp_status": daily_info.vhs_sale.sale_state.name, + "current_train_score": daily_info.current_train_score, + "max_train_score": daily_info.max_train_score, } render_result = await self.template_service.render( - "genshin/daily_note/daily_note.jinja2", + "zzz/daily_note/daily_note.jinja2", render_data, - {"width": 600, "height": 548}, + {"width": 600, "height": 300}, full_page=False, ttl=8 * 60, ) diff --git a/plugins/genshin/daily_note_tasks.py b/plugins/zzz/daily_note_tasks.py similarity index 91% rename from plugins/genshin/daily_note_tasks.py rename to plugins/zzz/daily_note_tasks.py index 05a6cd0..e50a3a6 100644 --- a/plugins/genshin/daily_note_tasks.py +++ b/plugins/zzz/daily_note_tasks.py @@ -17,7 +17,7 @@ from plugins.tools.genshin import GenshinHelper, CookiesNotFoundError, PlayerNot from utils.log import logger if TYPE_CHECKING: - from simnet import GenshinClient + from simnet import ZZZClient __all__ = ("DailyNoteTasksPlugin",) @@ -54,7 +54,7 @@ class DailyNoteTasksPlugin(Plugin.Conversation): await message.reply_text(text, reply_markup=ReplyKeyboardRemove()) return ConversationHandler.END note_user = await self.note_system.get_single_task_user(user.id) - url = f"{config.pass_challenge_user_web}/tasks1?command=tasks&bot_data={note_user.web_config}" + url = f"{config.pass_challenge_user_web}/tasks4?command=tasks&bot_data={note_user.web_config}" text = ( f'你好 {user.mention_markdown_v2()} {escape_markdown("!请点击下方按钮,开始设置,或者回复退出取消操作")}' ) @@ -72,12 +72,9 @@ class DailyNoteTasksPlugin(Plugin.Conversation): async def check_genshin_user(self, user_id: int, request_note: bool) -> str: try: async with self.helper.genshin(user_id) as client: - client: "GenshinClient" + client: "ZZZClient" if request_note: - if client.region == Region.CHINESE: - await client.get_genshin_notes_by_stoken() - else: - await client.get_genshin_notes() + await client.get_zzz_notes() return "ok" except ValueError: return "Cookies 缺少 stoken ,请尝试重新绑定账号。" @@ -112,7 +109,7 @@ class DailyNoteTasksPlugin(Plugin.Conversation): validate = WebAppData(**result.data) except ValidationError: await message.reply_text( - "数据错误\n树脂提醒数值必须在 60 ~ 200 之间\n洞天宝钱提醒数值必须在 100 ~ 2400 之间\n每日任务提醒时间必须在 0 ~ 23 之间", + "数据错误\n电量提醒数值必须在 60 ~ 200 之间\n每日任务提醒时间必须在 0 ~ 23 之间", reply_markup=ReplyKeyboardRemove(), ) return ConversationHandler.END diff --git a/plugins/genshin/help.py b/plugins/zzz/help.py similarity index 100% rename from plugins/genshin/help.py rename to plugins/zzz/help.py diff --git a/plugins/genshin/help_raw.py b/plugins/zzz/help_raw.py similarity index 100% rename from plugins/genshin/help_raw.py rename to plugins/zzz/help_raw.py diff --git a/plugins/genshin/redeem/redeem.py b/plugins/zzz/redeem/redeem.py similarity index 98% rename from plugins/genshin/redeem/redeem.py rename to plugins/zzz/redeem/redeem.py index 9079050..2fce165 100644 --- a/plugins/genshin/redeem/redeem.py +++ b/plugins/zzz/redeem/redeem.py @@ -15,7 +15,7 @@ from gram_core.basemodel import RegionEnum from gram_core.services.cookies import CookiesService from gram_core.services.cookies.models import CookiesStatusEnum from gram_core.services.users.services import UserAdminService -from plugins.genshin.redeem.runner import RedeemRunner, RedeemResult, RedeemQueueFull +from plugins.zzz.redeem.runner import RedeemRunner, RedeemResult, RedeemQueueFull from plugins.tools.genshin import GenshinHelper from utils.log import logger diff --git a/plugins/genshin/redeem/runner.py b/plugins/zzz/redeem/runner.py similarity index 96% rename from plugins/genshin/redeem/runner.py rename to plugins/zzz/redeem/runner.py index a354ef7..94bf6fd 100644 --- a/plugins/genshin/redeem/runner.py +++ b/plugins/zzz/redeem/runner.py @@ -10,7 +10,7 @@ from gram_core.basemodel import RegionEnum from plugins.tools.genshin import GenshinHelper if TYPE_CHECKING: - from simnet import GenshinClient + from simnet import ZZZClient @dataclass @@ -19,7 +19,7 @@ class RedeemResult: code: str message: Optional[Message] = None error: Optional[str] = None - uid: Optional[int] = 0 + uid: Optional[int] = None count: Optional[List[int]] = None @@ -82,7 +82,7 @@ class RedeemRunner: region=RegionEnum.HOYOLAB if only_region else None, player_id=result.uid, ) as client: - client: "GenshinClient" + client: "ZZZClient" result.uid = client.player_id await client.redeem_code_by_hoyolab(result.code) except RegionNotSupported: diff --git a/plugins/genshin/sign.py b/plugins/zzz/sign.py similarity index 100% rename from plugins/genshin/sign.py rename to plugins/zzz/sign.py diff --git a/plugins/genshin/stats.py b/plugins/zzz/stats.py similarity index 68% rename from plugins/genshin/stats.py rename to plugins/zzz/stats.py index 5ae8a67..1a52be2 100644 --- a/plugins/genshin/stats.py +++ b/plugins/zzz/stats.py @@ -16,8 +16,7 @@ from utils.uid import mask_number if TYPE_CHECKING: from telegram import Update from telegram.ext import ContextTypes - from simnet.models.genshin.chronicle.stats import GenshinUserStats - from simnet import GenshinClient + from simnet import ZZZClient __all__ = ("PlayerStatsPlugins",) @@ -33,6 +32,7 @@ class PlayerStatsPlugins(Plugin): @handler.message(filters.Regex("^玩家统计查询(.*)"), player=True, block=False) async def command_start(self, update: "Update", _: "ContextTypes.DEFAULT_TYPE") -> Optional[int]: user_id = await self.get_real_user_id(update) + nickname = self.get_real_user_name(update) uid, offset = self.get_real_uid_or_offset(update) message = update.effective_message self.log_user(update, logger.info, "查询游戏用户命令请求") @@ -40,7 +40,7 @@ class PlayerStatsPlugins(Plugin): async with self.helper.genshin_or_public(user_id, uid=uid, offset=offset) as client: if not client.public: await client.get_record_cards() - render_result = await self.render(client, client.player_id) + render_result = await self.render(client, nickname) except TooManyRequestPublicCookies: await message.reply_text("用户查询次数过多 请稍后重试") return @@ -56,65 +56,38 @@ class PlayerStatsPlugins(Plugin): await message.reply_chat_action(ChatAction.UPLOAD_PHOTO) await render_result.reply_photo(message, filename=f"{client.player_id}.png") - async def render(self, client: "GenshinClient", uid: Optional[int] = None) -> RenderResult: - if uid is None: - uid = client.player_id - - user_info = await client.get_genshin_user(uid) + async def render(self, client: "ZZZClient", nickname: str) -> RenderResult: + uid = client.player_id + user_info = await client.get_zzz_user(uid) # 因为需要替换线上图片地址为本地地址,先克隆数据,避免修改原数据 user_info = user_info.copy(deep=True) data = { "uid": mask_number(uid), - "info": user_info.info, "stats": user_info.stats, - "explorations": user_info.explorations, - "skip_explor": [10], - "teapot": user_info.teapot, + "nickname": nickname, "stats_labels": [ - ("活跃天数", "days_active"), - ("成就达成数", "achievements"), - ("获取角色数", "characters"), - ("深境螺旋", "spiral_abyss"), - ("解锁传送点", "unlocked_waypoints"), - ("解锁秘境", "unlocked_domains"), - ("奇馈宝箱数", "remarkable_chests"), - ("华丽宝箱数", "luxurious_chests"), - ("珍贵宝箱数", "precious_chests"), - ("精致宝箱数", "exquisite_chests"), - ("普通宝箱数", "common_chests"), - ("风神瞳", "anemoculi"), - ("岩神瞳", "geoculi"), - ("雷神瞳", "electroculi"), - ("草神瞳", "dendroculi"), - ("水神瞳", "hydroculi"), + ("活跃天数", "active_days"), + ("获取角色数", "avatar_num"), + ("绳网声望", "world_level_name"), + ("式舆防卫战防线", "cur_period_zone_layer_count"), + ("获得邦布数", "buddy_num"), ], "style": random.choice(["mondstadt", "liyue"]), # nosec } - await self.cache_images(user_info) - return await self.template_service.render( - "genshin/stats/stats.jinja2", + "zzz/stats/stats.jinja2", data, - {"width": 650, "height": 800}, + {"width": 650, "height": 400}, full_page=True, ) - async def cache_images(self, data: "GenshinUserStats") -> None: - """缓存所有图片到本地""" - # TODO: 并发下载所有资源 - - # 探索地区 - for item in data.explorations: - item.__config__.allow_mutation = True - item.icon = await self.download_resource(item.icon) - item.cover = await self.download_resource(item.cover) - async def stats_use_by_inline(self, update: "Update", context: "ContextTypes.DEFAULT_TYPE"): callback_query = update.callback_query user = update.effective_user + nickname = self.get_real_user_name(update) user_id = user.id uid = IInlineUseData.get_uid_from_context(context) @@ -124,7 +97,7 @@ class PlayerStatsPlugins(Plugin): async with self.helper.genshin_or_public(user_id, uid=uid) as client: if not client.public: await client.get_record_cards() - render_result = await self.render(client, client.player_id) + render_result = await self.render(client, nickname) except TooManyRequestPublicCookies: notice = "用户查询次数过多 请稍后重试" except AttributeError as exc: diff --git a/plugins/genshin/verify.py b/plugins/zzz/verify.py similarity index 100% rename from plugins/genshin/verify.py rename to plugins/zzz/verify.py diff --git a/pyproject.toml b/pyproject.toml index c17dc4b..33e6b28 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -43,7 +43,6 @@ dependencies = [ "playwright==1.44.0", "aiosqlite[sqlite]<1.0.0,>=0.20.0", "simnet @ git+https://github.com/PaiGramTeam/SIMNet", - "gcsim-pypi<3.0.0,>=2.23.0", "psutil<7.0.0,>=6.0.0", "influxdb-client[async,ciso]>=1.43.0", ] diff --git a/requirements.txt b/requirements.txt index 1468f7c..2f393ca 100644 --- a/requirements.txt +++ b/requirements.txt @@ -7,10 +7,10 @@ aiohttp==3.9.5 aiolimiter==1.1.0 aiosignal==1.3.1 aiosqlite[sqlite]==0.20.0 -alembic==1.13.1 +alembic==1.13.2 anyio==4.4.0 apscheduler==3.10.4 -arko-wrapper==0.2.8 +arko-wrapper==0.3.0 async-lru==2.0.4 async-timeout==4.0.3; python_full_version < "3.11.3" asyncmy==0.2.9 @@ -19,7 +19,7 @@ backports-zoneinfo==0.2.1; python_version < "3.9" beautifulsoup4==4.12.3 black==24.4.2 cachetools==5.3.3 -certifi==2024.6.2 +certifi==2024.7.4 cffi==1.16.0; platform_python_implementation != "PyPy" ciso8601==2.3.1 click==8.1.7 @@ -31,12 +31,11 @@ email-validator==2.2.0 enkanetwork-py @ git+https://github.com/PaiGramTeam/EnkaNetwork.py@ca2d8e5fa14714755c6990e986fc30fe430b0e4a et-xmlfile==1.1.0 exceptiongroup==1.2.1; python_version < "3.11" -fakeredis==2.23.2 +fakeredis==2.23.3 fastapi==0.111.0 fastapi-cli==0.0.4 flaky==3.8.1 frozenlist==1.4.1 -gcsim-pypi==2.23.0 gitdb==4.0.11 gitpython==3.1.43 greenlet==3.0.3 @@ -57,11 +56,11 @@ markupsafe==2.1.5 mdurl==0.1.2 multidict==6.0.5 mypy-extensions==1.0.0 -openpyxl==3.1.4 -orjson==3.10.5 +openpyxl==3.1.5 +orjson==3.10.6 packaging==24.1 pathspec==0.12.1 -pillow==10.3.0 +pillow==10.4.0 platformdirs==4.2.2 playwright==1.44.0 pluggy==1.5.0 @@ -82,14 +81,14 @@ python-multipart==0.0.9 python-telegram-bot[ext,rate-limiter]==21.3 pytz==2024.1 pyyaml==6.0.1 -rapidfuzz==3.9.3 +rapidfuzz==3.9.4 reactivex==4.0.4 redis==5.0.7 rich==13.7.1 -sentry-sdk==2.7.0 -setuptools==70.1.1 +sentry-sdk==2.7.1 +setuptools==70.2.0 shellingham==1.5.4 -simnet @ git+https://github.com/PaiGramTeam/SIMNet@277a33321a20909541b46bf4ecf794fd47e19fb1 +simnet @ git+https://github.com/PaiGramTeam/SIMNet@05fcb568d6c1fe44a4f917c996198bfe62a00053 six==1.16.0 smmap==5.0.1 sniffio==1.3.1 diff --git a/resources/bot/help/example.html b/resources/bot/help/example.html index 6a17454..9cb7218 100644 --- a/resources/bot/help/example.html +++ b/resources/bot/help/example.html @@ -11,7 +11,7 @@
-

PaiGram

+

MibooGram

使用说明

@@ -33,18 +33,6 @@
-
-
/weapon
-
查询武器
-
-
-
/strategy
-
查询角色攻略
-
-
-
/material
-
角色培养素材查询
-
@@ -53,13 +41,6 @@
玩家统计查询
-
-
- /player_card - -
-
角色卡片
-
@@ -68,63 +49,6 @@
查询实时便笺
-
-
- /ledger - -
-
查询当月旅行札记
-
-
-
- /abyss - -
-
查询当期深渊战绩
-
-
-
- /abyss_team - -
-
查询深渊推荐配队
-
-
-
- /avatars - -
-
查询角色练度
-
-
-
- /reg_time - -
-
原神账号注册时间
-
- -
-
- /gacha_log - -
-
抽卡记录
-
-
-
- /gacha_count - -
-
抽卡统计
-
-
-
- /pay_log - -
-
充值记录
-
/sign @@ -132,30 +56,6 @@
每日签到 | 查询
-
-
/daily_material
-
每日素材
-
- -
-
/hilichurls
-
丘丘语字典
-
-
-
/birthday
-
角色生日
-
-
-
- /birthday_card - -
-
领取角色生日画片
-
-
-
/calendar
-
活动日历
-
@@ -167,46 +67,6 @@

其他命令

-
-
/wish
-
抽卡模拟器(非洲人模拟器)
-
-
-
/set_wish
-
抽卡模拟器定轨
-
-
-
/quiz
-
- 派蒙的十万个为什么 -
-
- -
-
/gacha_log_import
-
导入抽卡记录
-
-
-
/gacha_log_export
-
导出抽卡记录
-
-
-
/gacha_log_delete
-
删除抽卡记录
-
- -
-
/pay_log_import
-
导入充值记录
-
-
-
/pay_log_export
-
导出充值记录
-
-
-
/pay_log_delete
-
删除充值记录
-
/setuid
diff --git a/resources/zzz/daily_note/daily_note.css b/resources/zzz/daily_note/daily_note.css new file mode 100644 index 0000000..e5fa037 --- /dev/null +++ b/resources/zzz/daily_note/daily_note.css @@ -0,0 +1,121 @@ +@font-face { + font-family: "tttgbnumber"; + src: url("../../fonts/tttgbnumber.ttf"); + font-weight: normal; + font-style: normal; +} + +* { + margin: 0; + padding: 0; + box-sizing: border-box; + user-select: none; +} + +body { + font-size: 16px; + font-family: "tttgbnumber", system-ui; + transform: scale(1.5); + transform-origin: 0 0; + color: #1e1f20; +} + +.container { + width: 400px; + height: 365px; + background: #f0eae3; + padding: 8px 16px; +} + +.title { + display: flex; + position: relative; + margin-bottom: 9px; + color: #504c49; +} + +.title .id { + flex: 1; + line-height: 18px; + padding-left: 10px; +} + +.title .id:before { + content: " "; + position: absolute; + width: 5px; + height: 24px; + border-radius: 1px; + left: 0px; + top: -3px; + background: #d3bc8d; +} + +.title .day { + line-height: 18px; +} + +.item { + border: 1px solid #dfd8d1; + display: flex; + height: 49px; + margin-top: 5px; +} + +.item .main { + display: flex; + flex: 1; + background-color: #f5f1eb; + position: relative; + /* font-weight: bold; */ +} + +.item .main .bg { + width: 100px; + height: 100%; + position: absolute; + left: 0; + background-size: 100% auto; + background-image: url(./items/bg.png); +} + +.item .main .icon { + width: 25px; + height: 25px; + margin: 11px 8px 0 8px; +} + +.item .main .info { + padding-top: 7px; +} + +.item .main .info .name { + font-size: 14px; + /* color: #5f5f5d; */ + line-height: 1; + margin-bottom: 7px; +} + +.item .main .info .time { + font-size: 12px; + /* font-weight: 400; */ + color: #5f5f5d; + line-height: 1; +} + +.item .right { + display: flex; + align-items: center; + justify-content: center; + width: 96px; + height: 100%; + background-color: #ece3d8; + font-size: 16px; + color: #504c49; + line-height: 55px; +} + +.item .right .red { + color: #f24e4c; +} + diff --git a/resources/zzz/daily_note/daily_note.jinja2 b/resources/zzz/daily_note/daily_note.jinja2 new file mode 100644 index 0000000..1863ec3 --- /dev/null +++ b/resources/zzz/daily_note/daily_note.jinja2 @@ -0,0 +1,81 @@ + + + + + + + + +
+
+
+ ID:{{ uid }} +
+
+ {{ day }} +
+
+
+
+
+ +
+
电量
+
+ {% if resin_recovery_time %} + 将于{{ resin_recovery_time }} 全部恢复 + {% else %} + 电量已完全恢复 + {% endif %} +
+
+
+
+ + {{ current_resin }}/{{ max_resin }} + +
+
+
+
+
+ +
+
录像店经营
+
+
+
+ + {% if exp_status == 'DONE' %} + 已完成 + {% else %} + 正在营业 + {% endif %} + +
+
+
+
+
+ +
+
每日活跃
+
+ {% if current_train_score == max_train_score %} + 每日活跃已完成 + {% else %} + 每日活跃未完成 + {% endif %} +
+
+
+
+ {{ current_train_score }}/{{ max_train_score }} +
+
+
+ + + diff --git a/resources/zzz/daily_note/items/Inter-Knot-Credit.png b/resources/zzz/daily_note/items/Inter-Knot-Credit.png new file mode 100644 index 0000000000000000000000000000000000000000..a4ca6f384f3834427075a7b0eadb11be6664e453 GIT binary patch literal 7857 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 literal 0 HcmV?d00001 diff --git a/resources/zzz/daily_note/items/Investigation-Point.png b/resources/zzz/daily_note/items/Investigation-Point.png new file mode 100644 index 0000000000000000000000000000000000000000..33799766c5180fec535c32aad7c89460fbb335bd GIT binary patch literal 9178 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 P00000NkvXXu0mjfn)w)` literal 0 HcmV?d00001 diff --git a/resources/zzz/daily_note/items/电量.png b/resources/zzz/daily_note/items/电量.png new file mode 100644 index 0000000000000000000000000000000000000000..7fd49585bebdb9745896c1f122985a4951c4c501 GIT binary patch literal 7644 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 Ai2wiq literal 0 HcmV?d00001 diff --git a/resources/zzz/stats/background/liyue.png b/resources/zzz/stats/background/liyue.png new file mode 100644 index 0000000000000000000000000000000000000000..1a16959c12b6746f2f71bd4f2581a3e062848831 GIT binary patch literal 408372 zcmXVXV|ZMT({|X{wi~NytVWG(H*Rd(wi~Ch(PU%WNn>rijqPmq$?yNZALcsOIiJtW z+?r?=C22HdVq_>NC^T6aNi`@agdiv=XgI`AA794R8NYlykep<6U7?`ZX#Oi`uToJD zs80e%vXWvNUb$!BwR#JEkE2NNNS5ol|4ek$hQ;Vq4q0~kcv*}T9-W+~g=VEjU5XqX zG!H6ahzSIX2Nl+b=k0*L_qo5pI-9v)aPcC&)Mc*Ha5QJ zx;_}WChSIXg7j=J|DHwhVe#&bYypScK||Zs*|r|Gwa@XFBsab9k%6=Pd!^sD9GoHM zywb#Ytp&jA_a|CVufqnltJTK{ z>XNi?;m)M<-OnwTKnVE)lU(_i>H8B-HuysP&Ah$tJUnC4QH^o_-?Et1UPP+Z6+~+B zkxk+$AxtT7R3cWS$u_8oxC&xo56x*ykywQ!7j&hQ76U^)zhEH59h)S$Sl~6gNx=(AP*`VsdqH3E{H?=vT#8FllX& zGH@#4V6W7xVvOfe4TAqp2@pAOkH}ZrwT9n5GAFXJ^8vNU?NKn;rP*SGX*a`Da=)5? z#UT74JD2wDcOc>I)5WC(bvLTOG?$UhTiHF{hJP<6knFXRtegeVezYd}H5LAoGw$G& zX##e5T5_YBZLU74np~#^Hj;>$j105mlxGOFIV0+?F&H(}sXo%?EKhO=6c7ls*q9_$ z4px&p-x^qdgIkKX;WUo=UO?ESbk0Vt0&1kC-obOswD&*aNPM2n#rmyNieHX>e~Eo7 zUJ&X!Q?qiqjImZZN!y`bKetuMe4Auk&dxwF4L=WO8a} zDYy$N&_W{mKR@4ueh26RswW{ISFKrrvEH%Ix43+h|pxy(qVN1WrlH~p(_ z?N7`3NB#R087${{2EWz9)4jCra?rYQtE6)1Swiv3>WfuYKxFM26hoCi9*)^FJ6O z<$jD8>IUU1q1Z-ul4uh4C_v_+^$bF1?D$IhuJ<&_E68W}_V0D+g_76&x#zz-cHORi zoPEmRlUV>7I>qZ@-HxE>@9xb^&mraniCKidJY|IQhK8utLvgIje?l1aFx}$gPB#R0 z^7{VFG;GIJ_nV7}zU=uXXP?0pM3HmO!CP+vfEeFgANlgx6Hy$%Qy`7%*ntyNGObm^?P$wovi6xpCxI03RWQ=uRWoR=}@0$bpIUH$59`J zpv$LsSdyyPL|M7`o1lHPy#}YNf%MzT{pq1+>p%4)mFoSY10nTqc|*A&BvY8Og8O<7 zgn#63tTTgdq8p|wljkf~x4k(Ar7&R&1XS-T!JI_Nrum&Oo(uK550BZPYCUGmd)tM`W@X?bR9qUo z_5ETZm56aKpvV3kMyTWLYyPlBx!;P3cR>=kLm;RpUUv$X*O^v6rFmu4?b3PJzr6r% zzFMrUSapl~R+F&sTx8c@Z@yLa>o?2?#*s*yDejKk&?#BiDBVB4uazyIh>X!%KUw#& zz>twj894FE5rzK47fVUef=y9_%g##m@0q<5nXd=yev?dqyOM`}%#%G!MfM!Ek-Dv3 z;#QwoboR3hebfxgF)1w^yef`$8N!k#y-qf1*}AC)zLEFdNCQEUy;s&f_xJTzgR|XI z_Q`p(dp*}h$dLEYV8|^vIPkjZs$P`%`Q`8&`FG+g%sG~{A8A7`-*wwQxDe)qu`S0! z7oCyv5wGs`phX#Zpy!7#*h4w?v_7y=&3KMv^et24Q@@6RZS zQ112g#8{9e7Hp*DfB5ZM!YErAQSpfp1b`cvfyL*CmRA#;^_9-;^<61%O`Ue1#rOBPd)kpyxJ37#5h z#u>aLla$_;n?);BXjtDa!#x$QX1CpY-c1_?QaoYK90)8nmqJ zNi|GGctME2RKP7AV z&%eJ}m-~92NX-@nT^D&L0!x=lPEnYDy5!)T`V>NPXc$98|KQBn*KtPw$Xq;{;zNrVN?MiG49wMD zv{X}m`X(W{H-5p{-wtuq2wzH)b#LLyKitEvPuD|93qxggQPOa=;aud(Py1T(9g2CM zZ_msEvp=F5&dH#Ul*NhU;nn~0w|}p8tcBoSde9Q_JVAX5-XBD3LWYg=ShjI_G_FuJ zqjspE{~%geApzdR!c7t};#zgnqg>EHsy*}X@{|XoXB$o6h z8oS*1TQS}uS)w5DY@d+Be+X-q0Q|hu0Se)-w2{RJ+ z2pMyrHnlYMd?epSs?1Ckl@Zpa4_MSbT9iL!Tme|oF ze&>MhrUzaUyt39Ih?DqoW59=(vhhck4U;EHPX@x zX<_pXn*_z3CAFKmbPxYNRfaMa)EEv^x8f|9tvQo~yRukQC~^E*QH0g+l8mzLqy)F@W)3&0;j>ue!B|S4;X)0bK&S?5`gBI5MoX%I3N1!8lkc zTFY#?=~w_9HgE!v{-)2LfOhiM2D+}AhNG4<4gVW!wCI!GBnPy0vsr(rkYb| z>5_629JE@@`|oQ=pi-B1Rs+2xxz=*O#pRxL#90UMDR$M%k9u<#xL!r*IR5WR??ro= zvYhLHTJD#|GE$~3ty!^#X9vnraV#GkXd%X6^;I+a+?s(o#5-qxqZ+`*bjk9&@1&c5 zY`c{UbXx>p*M;z|T*C?Xs~dbchC7u9cKKQ0Iy6BfBP9My`7Nn-=>-r><#W;{-#k{HyITl9eB*#b$evn*me^)wj*l92)P9)J$Y8&K2pTLbxVgMJUn4!zs`?q^R}s9 zfAr7NcWozDqZ7d{MiqxG@Hg~%>&{WHgaG2Ef33r*{zA-4m+qrol`Ni`g=90(zJlm8 z1qca&8gtz`6~MY6A-C7Obx6dwXbHYFiI*ht+oXWoAN&p~SsqK_W5Lf>>yWEAr}GPn z$43Y(@|IxYW#}u#KZ=5@XOJ1N7kx*z-ZAj?Cq%}CCqdxwAkMcYNpi6D?~&BA(tCus zoTISBojVD){5wcryqVnCmMg?UZQS?58ra9TKIo!QdDVybfwgd> zA??8uWVbG}r`0f2Cx7& zNbM6~WcF+#VdnbuUCCg~owl87KLaIAt+i-RSlFW5=r=J>O@u0dhLJ8JSGJ0i+^+S> z0}W6Ej(v@n}?D{Wa>}ZN%mA>O1aUH4DC_iLlXOEib!Rv=m^$<~OZR znN$G#%6e?$j&(pTI9sM&Ho7NQF}!q5z0as`g%`M4s&oy0>z=OogL)K2XM$VOz_VpS zU0^>#ui+EI2@N#UF91;8#hBBfa0SFQnYn$I%YOs$V6HGGGZ>CFi@LR1@b<`|-LYVW z0wMLq?>W1{OlrIRlKdwZJb@cFK|_Y^swUsE?eVikRQc7v0OzUC!P? z6Gh4!j*#_*cjpU2AEM#;)<|AZE(1TaEnaIT$p^hY&B(H3P05Kr)Q`k^x1XN2mepNRZJLtv6o`t+(3S0a357H^bLg zoW|#e%`^#K?_PTDq*ppv%d;)0D0Kbl_4z@#0eS|~FWV)^AKS(%z7tN-57&zbsV=io z;XiW2{ZkfO9&ZGB2_6F!V+CtNeX@)M*8f#7_G9VxqMIBH;IxX6Q8l6J#|G)+rVS-6Ml$< zabvQXGO&9ked^%RP01L}LFV8pJwCOSlKf<;l277*Q!8>&7H%opfVnol8|NfmC08TZ zVR624iIdd}-6gYbl`NuiTSGz?K%3i&gRDHlam!yYBKVkPo*qHJ((~ z)n1Al1Mi)$0s018P+K+39MY_{D;erFzGu#)_Fav&f?tbiIF5BBDMX=@0lvn?1tP*U zW7*kX(=-8lx`gabIGU`7tXoVzrLVP5{%vRGC%!!;H}NcTQUzX3Tok>M%bs1Hx8oh< z_ZA%4_y+rv!G^r$N_MEU3@&ZSv5pN$y^t&5`pf;_h%w_X-|f5t9wWj2_CP<~3WiV} z{nlq{0DIViK}Z?}oSOQp9LXiP{P9`k8Xy8pYfP;Iq|4 zk?zzg#bq$-i(hxf$*K=LJj>Bm4GWo1ip*;Qr|x^+0)FiioVy?{S#3BIdlTX~Fxm@7pBg$+L}*e^=iaf(?9L&ulZO zg^I7RYd$V|v*tj4>%Fje-}lWn?yY&t!H|AGu@J`Y{$MItJJI9Gu!C=?k#nvZ&Y>*_WEhaH>ni56gw^4tMvs4FR|%Iro-hGO zHWO=kaX7bwwvq>Jn9n3^Up%y#i+iVv6&42W(W2UwO+^{JE|^v3g-*w^B8k(B=~#1!Pt_yQ-A{8KJi=Z+<+g62rWfOGR70|80c;ML;v%IOC{z%; zCA9_1>zKv<$d`@Ht+~LfS42BE`F+7eo0is5?5ef=y`ZH5(-_lKy=UjElWD>y*e(9r zVdvtwsu;Nnd&8`ei}$QcS|ja?5#kmFI3f-#HGjKhJsQVG_9(rK11BlCPl}5NH7u!r z6u=GY&C43Iu7*-7op<@b#K|e5>WMUv2VZ+92fF?xD#(%u2^NOcA z!ho9@4DHjV%-@eWM(N5oH#>rCKOG%b+$|cOX*yXCSjiWDibt^DiD%F2b23zbt`lug{cyD%yy3|8>IK4& z(ji5N3=DB9=xcQ;N-PEPI?LDm8Uq;8n#1daKQV&X+~87D-g zovL8D^!QM{9`>TI7=qkY@LW2;Mt{g0jlMDu^YzwrJ?>@{^tg^=1p4$3-qI^0Ir(^x zJHBlLp6>%640|Byv$xarf#IG&FZ(8krUw`cO9Tq+`cT+j-;}4V)S->v*BIn@@5{dj z#sk8xtKE!0whTcS0cV2G!J9o$l+i(7!J8a;2fQzuaPl;s;9b6zh&oJmy?4p(DF~^? zT=l2ncN;QWoZLD&AAW?;7+H{#Z1EOh-tu_i(92{Y-oLu#~L73a5r-ItV|- zluk+Bg4MUIm{)Fl%W-TUGxH_vzVQH#zn^1=)wrx$twYnMI&`AW1{3cqceNA7y(zYI zDkZI!*#IH^7b$}fLU#nN@AdzDra4ei2m2mexRP(E#h}W*d$gd4H&O;W7q7@2$SR4w z+vrIVC^5R|>Psz-Bkz5$rI8TXeLqGLhzM!78?BsCj}aRCt@%l@ZQkW<1{w?A3La;^ zj-jfS0uP0{t)0~4MrgfHe?8KBDvH?Q3nNP{W1Ks?kCpMWKso@P_fDuqaN{yM>GQD3 z>0_G`*yp)3lYN5Pm13R5*pRG7me8iSLeXr+BevPYPhwx9xVeYu$5q z?|Bc5*Sl})r+k?2_;U_#=S8UJTPkH8>C7PAly*S>7SUJEpQd&hCks07dHjylnVl}1 z&Z-)4%>wrNTUNf-RAc-2gfw3^l#K~C|4zF8y_G58%DjL7bD7vvQQbzq;f-1l<^I## zOTSms9@!K+-e8&As)U$ux-5?|=!3AB(Ow^DG!K)0)xTJZi^|4JCh(YS2I^+*Kfm zBH%td_g~b8vtNG)(Tea>7ZYFW>;CQ&wcikya%37UwQAy%j1x(67jati->Gt-!EI*G z8&r^|=;}?ksPEY0``a!~YQGK7ngrzTuOpA|zu98y3R(konh^gOs6e&1=fXF3pw4x# zzx|G50l|BVG>s!~%Ilo`6qaLmsGz#r0I0Hk zs^l-z4}jd?5Gvo+bUG5XV{B+woaY%6pkS|nGhmT zP=G0S&_33*Or?xzNB%i6^}0F{Rq{z`s<3_ak{_ zm}ML_;-wk5hIvM+tPynf4YgvFvzS(D#0v>)e!rZtY+MZR?88jvV`RQ}r5LI>5AgHb zjR0gBN*fl2Lhq6Gf4i~)G7n7Rt;M?celhrnR~Cx6WQ6fXOu)`0PlLzct6+<572?#; zRK0HP;^S!CzuKrS;#ipF8h1$xh=LAUUejJ3Rk}=JKB$`d-rGD~CW%?MNKsrm6&h`> z9$-h#!CsuxK+BvdhO5o>i+O8b8Db)Bax7;JcAHvt>K{hdY7>Xt8m)Oq^t%nChIqZURLT4)Q7H*+X<4K9t_gd5kT zqe&(On|~^O2y23RlfW&56A7{!^|@f*_&bx~B7V$2$c|!!Vs`YJ>q$e?$K0!~nwg*d z-Er~gWMe3?_k8}`1IIb~LntrNk@0dgF7kHJvHi99d?#b`f0?exS(vpj`f`V0#S~U6 z7}mE9=`3Ndv?uV7>iORXqzMKaqw!++-ehD7L@Rxw_wV^t)JF1IKIc=r3kIu^__)G= zl+6*#!qf{=N4Z zZ)?2YONRqH7(BTvh4!KnS@U_JJ^no@`#vNx6<*AFUnr;u9lHBzRE>a)XFV;P3KSVd zD)}~h*oDM*v`Ar-jP1Mrz5b;qL%0M+?!jJoy>})!SR=DEk73w;sXos@{u7Yrj|CB+ zPmrZr4XwxT*KIE2D2#1Vc5kbwaY#pXrzV_h*vZq-`Mfy&sSB=Bg-NY1!V6M)8q8uX zaM3f+mMXoTuy&i;!7rjE8M>JvHNTkix zW8gnA%=C-?<}-^Es4J%!X`U@CJ$q5Hh#E)F=x^EQ8cVSbq$pY!wJ{{!+PPLVR*7S~ z>kg~_U*=4n8bN1n9kSf(6RSvN;~`%`(dH@ZG9_gqxRd}C*AlwsUTyE=govQ;Gxz$z|@AhF^6GCh|rW}mc+zi%1jvc-n z`J_LVGR$@|aXE-Q75P|rUn95Lz7+B?TII4@a^H+~D8_g_#$?9OttYArT>nZ-OVcFw zxRGR^-zdsz(qnLW#7k2L>O7oEVVcXu*i^4r+Ui%UpYk#O@O9OjMA7H&kouB`+b^$q zCA2KTdcG8bm|6y<98I+(V;md$GY-YN4(dzlvf!Z+rYG;=-By8P{p({%{`ozFFri25 z@HSeQdqqMdt*e^pzS1$zl0YQ!r|ZqL@o>h1({vYw{U3FJL;k$F?{qWza#Q@1q#N-I zoYpl><5L|DTlN|Z2X*p!PXir?DNIoclmp1 z=bk)*r%>ccLG~h`Glb?M1O%)`XXGnzeFgH5UK(Cse@;4NG*ta?cAa>`FR3=&A)Vqw zoH#blHF6B^C77}_Em+C&?u+?&3<}G2+V~ZD)>xY+6TCvKbL>Ymhu3AZzpz_S%XoXQnxJBSU3w~?9Lb#^hGj%QcXVN|1(ck z?cUQ-pPqh>mLlb}w6$Y46e2qre302IQMva)X|R`Uu}$h*#_ba)ZD;B^WVy=zuueuoP0dFI8bVe zEheu5{KN>RrG*9%A4Jlc6aLWWSQ#5XL7I|j-E|}M61F0*!LA(O)8aV{G3ho<*ZMgv zcGs3-*cWD>l2Odm(dwO4#5Q56-zY6gRr|?YMuR|stNd}>T&F;39~RX*qmzm8hRC8&H zM_+ca-{&lk<9nS@b{sNci1EA)W5=@SB4*%%*Ym0{#_O*(DW#UB7uWp>&CB|4h;^OC zu6>`7pH9-JJ|~f)6^uexAL-u2Y83r>@<56)lh&Kmu?K`Mx9bVL`oZvY6Nb z8~5(H9b^@m<=R?1+BY!KxfE{G+~eRqTWZg|e8CCcUevu?b`Zw6s+)$W_i?8^o|CH@ zR%kJ{sMMqoj9&DAn`~d6Dn929k@n%-KaI({XbXDYzW%(@yA8~?@5AE9{$GmWKSx(~ z*q+~Z%S7;ET`1my7p6YVODFH$FusG&y!Kj+3%ub60tP4&$u(ZQ|DD*4^WBJRIXu!y zyBBD>YdzH`hd8%#xyp5egE{Ei=LNpf?e?$rfkfN~K%%}AplyM6kBwKWY~TxX!5(kG zv*P5({%vie;1J_KVe{pf7rHESX_2M)lzToZ zG1N2l>Qa>O>5&4}&&>8M?=~5-?tOSiL+$o43M@v%;LoHr5)v|_-waKA4Q78~_K3fU zRPT#4)A$QHSL7KjzdzJmRT%^SgWGMLu)|zTWAey~VepNIDt+@Z?9LV1nij1fHeA|i z@%cqWE$b5aJVJaY`#@WIcp*Dk>yz5Lb+dT~;*#vSniAofh;dkJG`nq-(sF(zI-HlkA?kKTehO&0aR`)Ql^Xyn;yR0HuYGlRG-!4vYr^*ilQj< zUC9NRGmFHp*{t%(@XtALv_+a_{)+otv%~@2vOmUjXmn~ff_O>`v&`cAuoU@Bp6#bi zS0#0qgkwSQ{k+_?T-H=PsoGhQ;y#H%H7(Tm<~ZDTKT35YW8u7O28%m1Hx)Rz z-E)wLtV(BW+i!kFP%qc2RW)Y>Yv7U57>;>xQ7_5F|6qZQ!rg=iG}N<*f zp+kfHg|p!^qqFl4OJA;;bWrPvxXt3A&$jRpV%q(^kLMH}z?A32t%UiBQk%X#d2^uH zU0-}?6^8U7l*)&lNS@BhOqg~~>0y`Y|M~Av}dhihEfdHP&y7 z+?I9Ot@2_apl;T618FBMSBOD`!BWgm-s#m`^V2+oEeT!~qs$Ma;d9A8*l~ez^;Q7)#SS|Cf7admGKhJcM1beF|k3^`yx-T?` z^PMqy5oBpzHA%qG#Mju}Y88<9uoWL7I&hYP+Ua_Rbo zzId)%iD|JTU6Q$X-~{u0q0iN+O7hI5&M07StvyQmdJ_z*WdoPcXD%8q{i=L{ectmI zHZ8=jTdvrs{T&>XrO%Pv3zP0-$e>lZ)ZpXZ?F?BplCEm)Ni$XXq`b9B`nf!6&EE|4 zW}jaGMgY z@a=_nduOHRK>+yv7vnkfvS&6jG5<`2>ca1MHef3A{cQ9(ol*;6?}_DiNSDaZo-&hF9n*0uDY3yoMW(WeqyRD5M{{y$odU z2o$}1e?_jt6T-Tvz!b&pa|1yofrLdc?k+(h!d*L{NQwJEhDdK1l_{K=Dpmnrx|*>B z)A6ZaOXmtAZrlwzUHWZne|CB_Lfq9nsnrBc_M5RCt#XcU!oq&%d9{x1W@+1gwK_S< zZQ}0AP|?YtY)q-g46e-_f9FO#`EJ@4g22fbWF;o2jxRA8x-ouXs7c-3WvSDcXA9$0 zfVWWG=|0!u18&Pdjw6Wr5PIYeJeDa7UmnT9p)H>RyltOy>hc@sw>Yr&=bucwk zaF(0Gd=?F5{|MC>kb%@YPuSW!fh}KH0k-v}9(jh=!anMZN0i1bm5lKZXVxevI)<&D zCP~4$;Vr1SM^j)H)bYZp6HQM(Ag&!t8*QsaNm|It7;CqHE&>&6Q3pIBdnlhA%WVUrHAD9 z=bAYKe?aeA*&E$Bet8CXcwdPIlakX-S}oLtG)DJOWr_LASt0dvsY4M0fI~BTa9L~n zH&p|V^a?@nOeS!Ak$_&)hla;jMG6wIUf?aM+|MxPrbG-)ES2C~Vc5-bo?fc^tz7Hf zAKO*Dx;Hv^gGQx0zJGkgKQQM(-!}+xr>dFq_biEI(4_Nj^oNz6F+lHw)Qs}rjGWY5np2vMvK0oJ6XR7uuEl$5 z^AsrN){||3`sFV|+TV`}QMKCu^Yp;!`~hK!()XoIjI&==G3%7o2qIgB-AXd^zlrR% z@2$T7=dp|unCKG?nU8Q6k;k6+i}j}V`iuD$oT)g%sTn^xz%{HoY!54;GGoUcd|_{h zG<0Ezqi-Q9D#=|mh|fwXDRM}ex>_z@HOg0?nO$=LFofGA|K@dMs^h7p`$ZydBboMN z3cnQH3;SE>o5O8K70*2}j%;%7I9tau_VUcX!1S!C`;io@wS#K6+U~xKB*4{Q%XsUWrGHiN*otB37nwsTgWxf`J@rcwIRr$_*?4gDzDTwNrE|Kl-?(3!V<&F77 zf3}*ba7nZzS%gZ_h7P8-B(_$#4W(r+`gF+BPjg>8b%RQo)t8rd*K0PD*hu8IG;za2 z%48C;_Nk>V2;l-=L38M@-R*UDBx>u(HwcF4NNlF=IM;X zgo~?8sInYkXZBz%_X+9RVzGygNLIJb1eN6(*NFw5r}drr?%7P*2KT0hPU1WJj6mOt zADv1%DPR5;scL6a2Gqh2DNK0TeqR=trBL_oJPpFkcr+l>Ul`LIq@lk{O0HFMRo5Q! zRFHIt)j2-dbVe3v&*lKC?#p!=S;w!OjCIyLM+o!?@SZI}xGz;FZzQK@4h^=M3*rA7 z?5pvnx6|nsu-2`e)0_uj`=2l!i>7PhZ?K2DI#32AX_)6fO`{-YM-<+I>c{%L6rn_$3z1Tg^H}0-uuKFp5 z)$K7Pwx}lKL>rv=p^YR82fW?N|5xwhqVjJi?AfbL;$Ud7F;L_E-Fp|n#(exV<~l?VgWwWIJ_a2}?l&kDm6`r_uG3Q(ph4>tNv1MK zj_X8Tv##x1?7Q~5d^=NA$*#BSIr{D{9sDH{_aA$Q2l}ql>sB3Qz*_y~hsM0}JPCei z`2`EJ5z6=v<2(@2Gw#CV& zUyNr*8d8?Unt1aOnm{{xy(wGFi6gH{uS&6Bs6>j{ck9Ty7-K%+c7UhfXm--17NpDp zYWl3xl2&roTI6ghrOCQ=D8(LHB45ZDw+pJCL&QJzn|9a@0K&}T&Hp`=Y|E6C@JFqc zsCVlC9^hq&@p~&%k5of{;obxRE`5!(!^WJek<@6qHEA4cFdupqKhtA|#Y{?io>$}h zc6z(Uo($>M;6AG0b-HFRxJ?go6rMs?CrQer{Kkk4BGhGSw;_=h3)aM{ z`j#G79_O{CS#^=Bl0sPBXiwXaQYO+&o96L&DktBtUeJy=qz{&=vk9UqrF`0G3^{Xv z#)-WaY^k2|j-jFarlQTF*@Qfpq|?svOBJ=r?XX4~A$^RQm7LazW8n6lL7^W@8y6J& z7->{CaY6bu*}VIb`zBy5vb;l6Y~2s%VJ4*VPgjGAliFnI={Dk?gFY+VT3ZFd!^R9* z${A*!dUp$O$*$@5rN^@2mS90-G;TSgXfh@A?|8~ftXNaU!|KlaqsenxjVtFf-D?|; z`$#%|8_U04o3I2gR9`|P-9A54&OF}!>4#U-UM-6H zHcV1S9d?MgOSOP;5kXNZ$<;DBIXJQ?Ez6Z?FQn_UwNFZcnGQDgLME^>^ zn*FVuTDd)G{7Jzp6gqP+8@fd7L04ah_veTdXGRt4U8kb7FpTc*e)CtHW(=9IeOq5K0==&-Nw@Hl*E|sfg4N${dmr$DkX@RddwPniRC*2gSV2d~Re2Y9 zu%Jn|{%Kpgr_VF+I=1Wa1?&~2HQd4+QXs-H9ty+upr4-~E<1JX*a+713G#WxyjF|v=33c1{6ARX@NVH?Un3--=DHXJR2H~6p>($T z^q9cGbb*A@tkpqgWysQV`S$h3x^j7)KKem4=lJg_R=dp_75ocl&0(`*s|xkw*KV7* zdiXn*Tq6md=(T{tYM0KK}vV}3SM&@7yZ(2}tT?DDgPTnxd6)Zp%#hV2iC;6+TaRPmZRQzI@*2t(6Tx(xx2F8ygH=W1l^~CO#qy8ocg~jkP9^J0FZXVX zid<2ezmE#sqH}Iqb|G!_eNdFyzmDlcuWhtFjl6Mj zMe&*J{yYOFJ=;}&fHRdT935Vax^o3NGz?4B`i9oXqwEjQQH{^oUdD`FxfvNi-G*SX z5ot}SJSF@M`&XMHU4mbG-kGT!SvLz81?4#7_AjeqfxM@!D{O|*q&Dw_6utyNm%ry7$8A=$Wq+F>80az&emc!F%_h#q@nQZA5v%>U-%KInCmHY-@@k%+qIs zN4Cz~PVspXs|2Bi*vkx%@g@p-H^t~<;^X`3_^ZQ8Zq8|tN`2BF!Ts`f>>XCg@$4<4 zsYV{+&oBmGTj!reHWN`|{g%&t65*~;Mv~wB1#}qeYw+AAvIP=Gd#zpVf72V&<~%{2UbEo3vLns_i}D zx5?$O4b&fMJF5#}nfR>363EiJM#iNq-Y0@yr{i~wR`4hlGU^50YyU>!LhZFl@Rsu^ zy2nFGn{-jp(AoKS=+?epa2A3<3UeWMMa}{Y{?zvR7Pvy%3b+hh-8i_;FLKB+LqGFA z1$drQc_Z?{8--d{-75P?JpEKpiT{L1A*chHIn%P8iA zb7>W&j2RlLNaBS&)PH}u*fnIMqGK~C4k1Z`Jv3{fwMHArS{nH3V1MGf;FUz6{d5Vz zbsH^_MAt>>w19S*a3}dKw*o zW&2r0iU>!?MQi&enn$a)&BTZZbwSaGAnt3E0F{KeD|$NHJOFw6 zMu3-D*;S2Z+OI~&p(OazHS+@gvpzThdwFOemqgvxH=#BGHF>`!RaGOz=qH?=sFHFi zlH23Dhfwdk_Z-P{Qb^dH60ZK_w6&Os0T0X|>J5~I)}}2x zhW)XT@R#+C&B@G~QP1R5gc`-?F9bE@0b{?XBhC+vud)H3lz3<^9dlKAbJ0eApBUKe z_4tno6FpV-%k0MAkxO8SeAwiIpL?9tWG=N2Kr_CMT{DO4?Xz^oT~8vH>p6>>BbQsh z@vm+Nn3x$E^{Y2Y3bm}#xwM!l5}{X~*Ja}?rkNL(rffPne@DH= zZcidfu3*qYtqD8P#i8`7)kvnC+3IJO7p}<&pe}&n?SPsJPDj@IuJwy=95ypEGfPve z8mCLc<_7U0iO}s!@~?WW$seYDA40yql?NsVY8m zFiID$ezwgg2|201sMiIOH(#{kzf;QEiwQ=UL=6ReJ1A%SZrxr(CzbD1zBiIaArwbN znv5IfJwaH+K_Tk(K50GC0ZP zw{GJ1KcT?`&Kf=01|Qg&p|^T^1H1a>`WpU1zwt2cpXiJlyNdk&G1lKmf0!ylS3 zD7yM&w%R+OQ?Httx72>aUInjz@tXMI_mK&ee}!jx*&Elbu5R|%yD>vDOOslbc+78B z_ZjRniL)_Z>+zVw?Y{bI4zoxS&=5~7+St({DvTqIBi(#+vY9sJ#(Jn|p|n6<=!+Al zu}q2JD>|IRg|Gag+uT7yZLNjQzI}{}VXA=dO=^LToP`_r1!NPxRoGH$>So-}TvbbE zdAO!_->RYSDKzuC*wkA=Kk>7V@L|DU|JYm>O}wNPT6A1u_sYBMtthNB&kOK8~c zv?{av7g2xh<_P&y+@r`75dnzgOl+^;`Y2QyULNl;uBvHbAZdVYMgCwhjSa@l5i1gz zkI|w;*NuRymHZsJaA{ucY4Q0rtp-`(os^s;vCJCyCrzI-K`#B zQn=kYduSP!Mgk)5SkLF}7{~iv*9G#hmt5aIP_teAhQSJPoju(=HPEE7dN7@0+i+;w z-M0N3jk-NK$V7cW#oCklorSe#lwkCqjhd!(3y+1hHcjj4kaJ}PsFE$$Qa0g}m@LhJ z|4cFqHqT8Zy54F?A>P7A6=$< zvz^=WPqrc*p83^~L+ug9;cYffd!2hXOL9b&WV;y_1G*K5I0a{sm#Z3P5ros_W?4xN zoth+PJSrp98P0*~6vvWfh;_vM3@Bf8NEjWL%7rd0d0NC+YelGa*^ZQ2h}SLQuN%}e z;1gRRN}TD>_-@QshyG}f%tM#&PZe7*fgRh!{H$jg_Kqwq`n27dTUA5(7qw!hmyxLm z*#YkPJ>nXdh7u6|COURP3Qzd4*rAW0Uc3!Mu)Oy?-Sg_s|AKm0^KP_Mc3}psf(Xc5g zJ#DiG1Uo|ZGQGSYX)emg-FZ8+mne)v zNhJaiKUVj&ew$~}VW|haZpD5Wli0#~i9>bNES!X>vNU~4o{kLfZM5IXhGIKvwQ3Hw zruwf%Rkp@&y|f+;mXe_b`i;i7&7xTt76(J(f zq~5w#Um(uwfi|fmPFt=yQIyv4Y7(-SCYiQIP8cx%N77jZMBP7KTuM?>8tLv3kd`j# zlJ0I+x)kZ|hLw`;?(SIWX6Z!`mWCzY{Xg%;?|yH-J2Pj_`Hb83yPq<~Hi}rdHx_So zg*L@yrWFgZm~5-m)D$XxAVxG@Ix{dBYM4KvIKPty-&W`S_kd(YrW5t-n3Rq2Pi#86 ziVATni!RP4gYiNo>Z9#?GJK`z4SjM^0;V`etVt(h74cXJTfjA12w^_Rrx$}b{k&_p zfk;(V^^=&`!M}g+E6HVY8|V3jn8KG;?_na)%bh_$ReT$BG9Mocs_Hvhyu9%uRT-F* zh>?=Hwt3$Bq%TS=XCMM|r<9^Z3m<5X@oJ}2tJqwH>-^|;@vkrCD7^phzT|&q&4WLX zS~n#nUAmH?#Mphp6m`kypHag-4w2Ky4$DJ=^Z#rD*R}J=mhn#A7NdP0{AcAK`8^xv zglSyFH|wRtjItj#`{N9-E|lzqv#Qohg=|Sb(wLv-*$LU?DHe#VwriE{_!x1_*)`PYKg6$$5E!W|29K_m~-7jUr>3{lHhmG;%U;~Vn3WWiCHAWbmt71 z=07`3tH>g$Sg zE6=hGY{(^hlKQ+GMYhR9^|XUr{SSZz3Z{tvGLAW-fe;|rHKF?_8UI)uFGrpte9`CV zPp;{>IK0z_*R=NXfGhYuavB=gcXEdsbP;n0HuGPe*v* zhnI+_^HPXf6^3|s*Z%U$c>-+FH7J29@RsAh{A($^o{iXEV_j9JT}nJmvAn_;Q9;(7 zDsRLaGvgjno#)g~Ro_4DuI~CK_bto)1&92^ShOCx$K(2N7WC>Pha$9_ zHtHD@2HJzcAr#`Q*ZvpS?L`Gch80Uw>_jUc9E?Rf$ulz)&6y74u(~SLrMz@XY3Ihm zVBqJ`sWO+y(92mm7D(|&tAve(o?ByQ)|gIIdqcuYT$rt=E)Qd9t`w=R!#n?d2OpKl zgF5X+WfC@zdRalsfZC8+Wba`umwneV30ciz6qk1NXb}V3u)W+XEr@VtkmDqj^xNk| zsHbL)j#bO|G?&x0W4+8Oos3cAWE5o-H>S8+{~$0BoNm1V64FPzG4YUf-(YQa!uwGb zpU=#uvBa9&)>tFAl}^1d8f_Fhe9?w~+)ZeGTGetM9@phUR}#PSNM%NTa2@x)glEdT9%63plE_*yDy+RE zTm{J90Cjo#)Tth`m}Cd#*W*;pGJY+wB!(Wxfmyb{R>}WZDKabrfS-&kB8D7w8>Sb$ z@z@(kK$HLl+NyA6e2;A9AHd2!t<6~B8TRO8X6tHT7 z&c|Ylyocw@Y>KMN@1@%@XvL!x4h6A<6OjhBOtw?AR8|V}PxGUyOnbtx7})zaArTXs z-A(QtA|T%8@v}C9f$TO_t1DVay+dMCoY6w}Q4t%0z*MM}x9Sms7y+Js?cvs`RY~^G zgn3Unz7>jV`fz?kA73nE=I?q_LPOpU+fD5uEUbx_7#a+%qE{6>rSzD}7Y&feR)SCS zW2Px+s>l6=7n>AAACs1+AAB3mw%9CzkdE~b&WD1|(agn~VwY294q{K7U3I_ct51S5 zpGOMCn^R`z5=1h{y^B+B*w+YlDVdaYdex5itVJl%w}~U^VE*21y#u;`xDUPv-KLF3 zWbKqB{(qq9B6{yRg0A;!+8b8;a%3$2`d6#x1-=5gm@M+FY zuqRZU!=wde5n_@LsrvIkk7uejughf^?7!+p@I!cUod)r??;^urLg(?rSklU5>#K#> z>Fbbfz_{D!&T|{`!#vUUuYog5@Ea}?R45hK-Sdgt_t89T5U>0{(G0N{7|u@3<0Asf zN50hnqMJ@&g@iXOvdfIcFqJdK1Rd0mUxuA)LEJ&K%thK zi@5%RS6Ydnzr8c&^NSsUS5=1LaZ5Q$qoyJ^8gJ9T&N(ObVIEsQL1iHiyYNh&npK7| zPn|sHuZAYuZ68>dCT6u#m(A7BIRY}-k+*dasr^RDrt==y`}0$t|Y8Q`J<>`nw^+l)RZd4 zlGG}+7_yM0-MT-|e?kKg$h|!Gm>i55IQ$oTQz{`p&eU~~Wv-B$TNM(ZlxXncAh>6h z))pK*?BzdEG)?l{H}PatB>9U>@-1e(;3CyDq9A*Q^+cNR5}DUuMN*GR$x}}U<>9{- z+a0A9rf>CS$k&RoPKVBu-<$bo`&5~_P}D1M+GhrFrE z!5@OJH0*@^kw>YsCe)@*PBl8>8CpDNI_121yF&h>)ewBO(M}Ouzzy0rkIWt5D6RC~ z6|i5SR|bfy7esQiD@>kj)qBlsB7G*35#TUwLy;U0PU0I6+kiKo9P z|NEFuhD;wWk$NuDP(|AWjaF~rh4eoY>z>}$enRkhqQw2#BRpJk8wG-G4+7x$6!>6x zbJsKM`Z~gO^$dUbGt2Ir1FzT9{I88ble(5YF{t%O(zfWX{`-uNe=R`)kJdw<|Ql)zp)UBP4pnYfaj(jM~C$ZzW;6aI{f0gCXoLQN&ZlUU{ zGE)`#MRh@d9KoS#`9)xR7nVgka($Mj6o9cBfLkOKq2j7XBOq0t(m;!@Fipc02)&qPBM|>>Q2lDBF12xcvCM*8!r$Lg`9$*csaX$n;im z!6B8`E}`WLi8#r6498wue>mO_W%k>-#Pj`3vi!F) zs7fUVm|>}*=IWQ*i6JXhhggc^=tG#zL<@Y9nZV&Jz^G`{u zLm}168UD7?E#kmeo!uy1Z%q3D1fx@|zw)zhRDm@!r$jK#x!>q9@X> z-GwURof)Q$PCzfVqwYet+A`0G0 z1`Omzw50L^q*KZ$9R6nZ2B*vR?vHO{{&NU8y0w=-y|jY&?s}goU4w69 zO`q2syPj7Y+142ddtTE1^YYv`QUR|(Jy+rq539ojd6S#I=jXY-&j~>}wa*v8i-gw_ zQ^?cxzUslNBK}MFBhu?Fs+y`2IJ}en8+^x4uvdfO6pZqd%(d@|_6L-A3+I$=qqW=$pGty5M3))_i?0E4kvVoklm&gU*Y z7`fv}R_tv>ro4&nrL74cwJ~WKX04P1*SqWItGTAvg^sJ%5C?(;ZAD9d{c=RWtN0f` z9Q7v2WbSwT6?Hg`0-0jeu`oxMA-}_g+0DCjcGAn?_fT^!Q95s-(to|rq7##gxw}rv)dkI$hmIf{clZ<3x#L%xH;vE=s}=! zaLqiqj9~XORVsitk*CRErTI7Vr?ik_nM-Oi0u~RFn4&n*qzh@2b(7>)!!hps>b5@8 z#X8AZ6$ajcx01=>Khl1-?dH6*!T7{U1hY<&A;5^$RV=JZw&0`>OGQzUs~`2ZJc#Bim4-dC3!-lf+`)|SZg%k-hBetL`M1K-pZMCLCJ z2g_YiM}mzN*Scyc3fI2F5a zGMKyO0WOqt;ruo9KWn|Ifen|LN4<7lNz@j`y2*;QqES9&mcW2H3lg*}}Jf`>uG96!^gL!>i@ z-D~KSDq2kP7f+_fX0H<+y~#gg2lgh8y~ng@e;NNtfTN~a?KL-iI!;0s)aO7f8)4BY zI^`9Bo)a%1eiGVcVrH+fhG=<2H_G$T7c|r97je_&Z_s>A%p-Uzvf#X^8rmqcabyCQ zFE!pVxUobCid%$qQYmi#@0Ah6NW6{<1;3;KOnN2GD^30LY6Jfw2pQ*L_TIPi^}xTN z+p}=+%b@rDjvCcZG_O&jyW-Z@-O?w+*X7sP*Sp@QoTvLn*Uj>c*Ve|V;FCd)K|T|t z&4gWeo`TLqWkX;DxOfk49XFccl1IGoqNo7s1;+RANd}J5KK5NeO5{SmRDV#fEa^;Qo7$_0!TTJx3NtFdxv zO`d{|UC#LDCqo0!5(+6w=RPzjZ`At>QGH&dJB1^?Bd#hsfKE%p7@oZIuP7M#w{JhW zx6bpmVEes$MJPsXhZe_Jfeu|cwUc^|BgfA6de!%ggS?0NFNY>HnKI0j?Fm=A4;jdA zYNPYz59Qc?V&j%G&pmfg$CgztFt6EXuzy6#PAa?7rVHt4(rIGi%^TJL?$BMn_QZjImQT{`XDIb(=0p!fwgUc=TzrsmCZ8 zp~rPT0(_b?Wo$yD2^D50%qRk$+f}RSw(q4CTr!C(h_%D2`_-t#c8$e$UQX^5ac0Vz z6LAGf+zKld+x3!uDR4xZIa!f}F0wjR0NghS7NyZyEwq4cwUG=)MH_kNr-41M{4ld^r|v2?w&kHP9pZ4M0bzBNs=TuUS_nx2mDhxH>I2JkJcterc^@X=XX^4XX`) z{2<93A~WM$a!AgXA0O77W~vD?6d9XKCeIpun0{m|_31sl&=Pwv1!*Tm-x zeXaGxp#N(Hxr{jY#69Tf>^09r?9kXm<%ry7nC%q^%FrXT&ZwAxHy%9(n2$G&P$M!PF_YMxSfj-qT8s75sjXw9ETMw~0 zqr6j4vZL!r@Cj%Wv8GTIa`OEzb|G%>^SU$k3h8|y?R}1bp2yYpjMP5Qo#a-{r=5yF zA7=Ny3QB+yg1q{JVUN)Bna7+HoFi3^gNeqeahpl-W5R3i6I1XB5CZBw&no4FqOv}1 z318%72!f&5pu<+=RUyG%tS)-EVnU005klOD!?NJwU*JbHDuFCib{^OwS*Um17%^iS zQ^_@{w`GXUNxSvZy?%yye(8iKX|fLPgaE;|t~iI0Mqz^0yinO-zzvkL$bVD$;T!Jl zi&4NrHC3%x_o&5+Gq~4hBTmZi1$lpS+i(HlPE@8i0e1${~_TEk)ah@%aqPi-rB z&5#bf?pxOPC<`0_<}IZdJA zWHa88C&*Tn!@Ekl-T2h8VnZeL&7vc#JJHojT7~8h!v*tzgSYiv26>@ts)Xa{lTp>T zj~>jW6@qM2I&u*-XqK4W425mlau{cpQygc%Sl*Ymr<5X0B6)PY)sY*w%Q2k}vyjxa zCn|=t7;VN}J$|{5Bw;0-9$6wJq*J7^Hv%q3>$oXm%`L#=w*AyXLl}o-%N$azUS~K` ztRaV?`&&5a`y0Gy9PDx3{LPLSgkKw5&oF`_s4HZCi;nJw6t5mGyKCQ$c`>Ty8Jt*^ zlUoHI=3Ve_@x=u6<|FiTV)}|C>mj9cewFANim4YGuafoMd%~+tyBmYyS^EB*&lOT0 zV8w~`9IAFpM%6945FerQ>Y3$>XRgS{`0oA(foh z*~qa{MTTI1t;VuM5UgNsQHjk!PvYC(Mf$?lpt;m>FvNAAot&N7ljm6h(f;1#^*5QF{NJBdltInGeP=X64B_ z-SNqDykt>7kQ51-$pf>KTmM6jKQ3(k=QLW}C%znxwbCoaflU&}f)0-S(Ny~AmA7mo z2R4)NA1*AyP`ecOOJah8ZpuQ(4gy5qXp^g;c?>4l%${Cq>XajhHECJN28 z)ATeF+s+81SY$s#Z!mf1)l?OP_^<}Ap9CdPTVT2am#ZfMwN)5| zgGSVBU*)=*?i3ZOQP*}~h(n#}G}hIS&-tYm_JZ&#mE1QCabloe-&Y5KM_Qb!Uk(dy zz56~|VnzN|f9cTD0_qiEmP>m@JvPeq3O4Fb*Yc>wjBL~hqu!W_ulD-qfg>L4MM9ny zqsE|*BmRN7Px6TOC_7~@f#PK)iMo}<#<7sMD&|O+9_-kGvD=OK_y50t0ctz7j6efV z#9q!jp;!O=7c+fXJIT#634H$)rUtxpeP(mLI)$%Zf*(LZGhQ2kHszB>{Qe3yPp7X> ztuUOIxZYuSpiIqp30j5!`gBM{p8r$+zKySp%C+ks@*^G<7d(>!mf706U7dk=+%&Go z!#+O41gte*12?apIeHmhA@vVN7m2c!7wo| z_Ae{WHz<2zkwY?LLdUgmJ<8~Nra8VH`&y+;&n9(TNgy%iZJxS5YlW~RkZ4<52}(Hi_!Nt0s-+-7Wp9yZP) zI7pg$T>|lTUUm2t4#XdUiC5vFp@HXi1tV2!A=cKKnBj}pPR1scmP_cTcBAT_1$Z@5 zH>%1Snc+~fiHt~+L-OcQSrQ)8E> zXfa$*zfWJq8*5l#P+(9-Tk569V2{COcQ=;MiS{PPDcI0V`?^gN ztPb^ebe9&pe5^qCWOt&><8z@k+fomAZ`86)@)vPRBcy5lOgu^|xUODvNUcKGP-tpo z6riVqWR4Rwd6m!#W2F6pK~v${zCxbWQIJSZ>MYjk6326}SXXmiU6NKxedfMN2>^La zc%T=yLI^1R<4ujH67U69S@DU^Sx)y|q0h!TObs_3jyVrk9G=`IwD}XC5`I{3gPI?e zK=pw)FZ?VeVfqD|=!aoa_kSMuG*LD{s8e41lPBH3vD159g-1P)tVQtqxX|EF4c3<< zr8|EW_a)FgaSWg_axrt9tw!shhuB;3y!T&JlSjSc3Kbj(bPa+cz0ASwOM1aDm9ta4 zep-0*Ai5m`6g!}Lo>7DCs0|RUxzGfQgx8-7zQS$q5)YlPb6Ob}rRXj?ikmPZp8)Jf z`n^P{W7ytzDcE=9zrJk6P*o^}aL8uE^z{Cz=LC4P9NrgfPX^x*-&T&AxHKBZuTOf< zw?m+J!Qg88z6Z7=Za>RG)QMzfYK!uv>#Ke#0e9y+#!k@3$>1-=uKTN= zB?nAlHQZkB4r)(s5ZoV~nK^p@2IOQalJbm(`+u$Z8s(Rdrv8H?@oFqHmzL1oS}T?n z(PS0?`QehZ>ohtMNqa&#c!fklt+ca%fDsp`OBwOf64ZqE(l$uih#ULlu0T8Z(m3+~XDUtFUa z3_De*J6q!zm4*T24xcl=5Wte?X;=jDRhX;~lF!q;&M0%$Ip+ARSIH&b4dUKtE2TEB zSIx&e4^S+qzq@i_akitA0n8~Ttq>+}h6`!;UoRB72X#~?BmxR)_bJ+2<5pX;)3tnb zbJnlBJ}h&i{whN|>$F@#tK5c98ohZN8`3~_YrU_}f!f5LwDXGLrWO(8r z&o`he5pX~T7&ZtL^CAl|y}tm#Hq^F!j|2MlD*bSRzrbT%9U0vL@&R4$V)hT;o{!zr zV%3ybxmt}m75?@90_(nv(!@!`w>iRa&VonxdXHUqB2HdmOMQ|dR7A(czV$|H0|r$1 zfj`{IOp9AqyuUpVUo(;5JIPjK=fpsL zpNNJTJ^NUbF4fu?20$N08$a5pbzfLI^!ZPUNL6<`K4{3_%&x05jDQ&eomP3 zWDYsjb^m*!r8EcsidMzp@&Xr|M1^T4F=7{HrHH2ASgJPzbts^j;kv`_RCP70M@&_; zNmnh|d0eX^oo|sHiuPzR3##EQ!u4y2%-u;WM^>#B201#HB1~5{#xkMrVJC zTzz|u2@u!CpNEZ*wdXvxO$k%uTNYL38`8^ME9+>|YX8y=>EcIUtYcPU8vlq$pN>#; zCUW7(YWzc3Vo@PFC>;Ix3fAe;Ymf(|=|-__lQ#<$Dv5XQY6Uq04F|9d0N99aWClNt z((#3obdZ}^f?a*Eqo2lAU>pCkJl{Ya4s7I4`4JUzqkV=&*FM)~k*C)=M>*R6_@YEN zM&6z&`^SN&c94R3zO-;y81(Jkz(UY`n<@7OEpJj+ww{*RpZ6;%=}H&+2wkG11$U(k z50F`}KnKSeY^{K5>1bG0f~0Fd;#$z1e|RhP_k)XC5pQt5oWO}upk4^jk6dlc2PR4rvT0fIb{Q2v`| zDG3&(@SgtXvFUxv*xKd_KK0bhhREUFJN7;>-l>MZ{sTS@TS^QD9iU41IUwF&zs3AD zIy(BO&-Nj?uFLK19s?H`0R=P(7Qs$CR|Fc1AKT{HE+f^PL9=auH&d8FtrA8r(tCS9I$UE@BAn>^8OV)ICQ`2JEAz*I0c_7ph1?OaDW! z5cMlERg#^*!G)5kE?2F?qG1|HwAZpcX$3oh6X%$NAYZr=aYh$NKevJ z!^<$EjH+~F9m4f#N*85fEyJwj@MF&LucCU+pa_$9m?@h9-NPSN$BGBe)P&}{))fBQ ziAXnDtZ!bltDP%zXqghAxLVGNE%j=78?4X?$rk1LKN^C3Ih*=K>;VTgmqckx!5*>W z=FM6)zn~~-S?75_X}xMKh4eTjOkLI^YQ1)a!q;L;P@2Pxy>TSe5B>j$CplLiblv={ zVa`7;O<5yqUnoiG7f69T@2sfwSI%s=LV+s zm0%XC^Lhy}!YM4Suy6k#)1rH`5fY<03otHy>c+fHxD&l-NSOvbKS0}F zG4ye}H zpcSdITz@CZU2dG=jem#R*+D0?GpufZ%t5%3{ayc|*{6)zKIRb-9`{XIQ$7T6(lk(E z6)h)X@u9Oj=a_Y_fq7GU>GQ_H@e_h`{2SZ2*c*L>nz+Oqv}QR44#iRi zo|EarR`#i=%{*b}J%S(NkZF_KANi%tcrG^XF#=ItJEv_q(?lw&b5i@KX@6G~%IvKB zS2)ss9k)=o**mCgk~;1-?n+>H)3cz5s8W;unODx-)*Kx1=i1gn;44^Chxkp>87ox+ zmqwGBSy-$o>NV@@sdY8j9Y*YrH-$(FTIF%-j#`F{jZcS51q`Zn%UGM+$-i|5wuUU? zQDN37ZN`cmfPpapOesQYnMuN&k!ZTbkg-(e`S(v2a3JJq+uVr`(;TsL`eHYS3}X&N zy`ptn{Ep3Bb>ybv==qW>YL`L3YWyf`5E;*-h_M>w}?f=m0Z?&X;b0Vx_V(0MaZe81pz+papllB#_BJLK3i= z-(SKVpYKu#uj|#sK5VdGBH|3PZL0lOZt{_-#K~X@FYwXB(X<2P`kbbAx+3*DvAnfE zD$%(u5`6j6zqjH4?L`{`!tQNe^|-TsFg)J?uy4JKKno`h1P8B9dZTd}DBGYWQ%qd_ z{)CP6wQ*-2?`@~gdu>jSOx@^zU-#eG`BsEs0q)T}dAUdPb_JbucSR(y$?7(e}`-o{6$*Gpb-rvRqGcj_My zM+KRX+11J+(uD^*CY=;+LV#0Q6OX?&Z0uWTfj@8`0tDcC7i8v$Nc@(EVNR6<|vfwmH#_->s&8rp)J2GWK>F>}eIF2s7W4;uY0Ff&h0D2i!=e{qE>HLF*It$Y* ztI&;f@B^573_1__bblsSal5o+lCJOOn!5PD&ZbXyN=SnJV&-X(qJ3rGFi4B&G9%h* zI%zg^s3De_FwOfk3#rrgv_`q{Vh%JeO|ar54p!*tkWyDotkZ}-*tX= zMvwLHJxZQ7K7gE2;0Kn<0rA1_JdP9%N}V0)G=An18i;QTxHRzu>*UD{pj=wK#}QH) z3I^rmceeL{>;d;$_U*~9|hA_?6q!@@rN-tAxdpMrAiOjk& z%wa!w=Q>pKaQUNWqGtUm5pKYSiJEXr2kwVLF<~U5N9vkt3errDUjMrzkb&56opNh< z0>wf$-EzxsW5g9hiPCl|b!nQM%<%(9NTXpL)eyHQ$|i$k(T4aU!H`(tvhVpoBcOl( zPu)sun0Tl|FW8g_8HSB6mS@;Uhi3U|Z~pqhh0~F#4FU^%73zepFAhD{k|}-@20Py! zNkSy=Nw2FE0dXizNlBRUfC2F6(Q()uQ!&OA)+MlqPbT zFCFr|`&+jq3b{pg8YOKk*(&{GE2??s~R#>h-IqPm}}AhL$;g7&VBSb&0T}5hdSsTpS=Xpz8N4j za-%0NKxtaIi`SqruqMqyu3o7;EoL$z_Z@lz&(gr-UU5JP_*De?Jq%U! zE3oenuadpk|E?Sp}=nv)Q#qmiw@i5>7=hQ*h3*s`c~1}f^?=~x}{LpA2GJmbrg~JMupZq z>z`x|7rNOS6`|C5jyINMs>*YKV^OhSulz%jI1M=v0)+(TjV&mqLb#kRYwUJ4`&0Ah zgt7K&yzkU**_NFybotE(GcLYKm50C%U*&-pjPyhcaI3afP?9c_n!!^)F98+p1iZZ_*D z@iq5(ElIkq#!1zP*|VaF9&!iejtX1a$C00)MEq#iCK8nfS z9-k?K)gJHQ{T#6+3r9a%q%pR|dO9bpVp!BEffNv*H4VVif0u><;=B?OfmM?BCVzREJc5!T^g=P{@WXnH$d@KQD z4uuh`a(oxhzSMVu3vPMvoa485VTOscXXY856Qp;)pDx=dUCW23FkFZLWsF!P=>B#a zpV@Q@<73rz!ws~5M(Xri5ds`i46wz zWm1diNZy;JE!FA|&Ow|?%(7hvn9f55e12NThHL>US9x!a2p~MSH!&Po< zx>DIyr?-@cArmNf&*CLkGY2$xT&z7W@5%Lyz{6K#%(nDD_&WEu+AVGGR(=!cTJJYP zUouf89x*wi8+*JHYI6g!sl+Ott`mAE54s5@g1?R51qJp06qFcVcNN<LbVD7E2>n%r`48f-46M z(jOEHoicTbu~XQjdV7+#kq0^?j;^)$dYG}v1(IC9T2gXHwtq{LzF-?1cx%LH2zep! zZQJWCx$K%2=E*1iAtlT*Lzm#6wkk(?c(=)bXDnt!J_G^Lm9|9)Z))1Ps?=%X;&>zR zpda)oAu}s5|CBDExJyI}jpW6ml%(NQ)d`a%acD|tGMbe_#x>(d+aG>%WVO>2WufCC z4oTKxv>!ML$YV6;=c24Z%5yd8;grcae*bwcY8!c*C)}~u^<*p1Yyu^JU33cwFu-<$ zBkZVzp6p(qq|_Y)52}B4-t{c5n?}aBeQ18aK<7PHxncTW*X<%p7yQUK=~V?c*=_BZ zKA*U%<#at`-r?Z)L3=K?qtu>V^Ih+y0w0D~hu^jaJr|;Hb?(+6PhN??;E*?Q)(43ymcOd_#o+H=}Zv53K6M3Lydo4t0bAZ4>Cwy(} zXNwPnHPTaLt#hta4g6Z8wb_L$3fXyls)eSAy^2C1putYl;1`$fwKOARMFxcx2i9V; zm?PR#KEA32>cT1ao0hW8g)B@R+K(RY5|q=HRnW4YwVvfljVz+k42kF5;XnulXlSN@KM|Hx<8>`ewg?y5M&jmL0TV3Wk*VzORD0 zn7I(Gvsx2r-Mg|Ez7hAqRfp*|ygA$-2qo3E5c6T~svQq2w>|oIRUhk7~)RABJEctTZ!c)R@E4`A;Vosn+UQmIdYON$l_6E9{mVBIG>jG8&<~%H&S#qy!Bl2|SFoZ`DU|I)}jg z4l1tuSy_AUH{$5KO`CY=woL{x3@D0u?PyB~S%mhy#9eSlo%FRTFUKJu$jP&jj4V)R32sMy)J_@ZUG)&fgTT$D`rvyropY$HHK)8gZLxls11CJA>Zp@In z|2ZOfW2)ExyzA{;0-t`O?~_=Og!;Yq(jE46(SIgaW)0_qs1JWu!lktc@6ty2|S(N%T##KcJ=TbPw3l9kyc6$lQU_1U(eZyVd_nbmxCB zo-P1<1Q9DEI%`_bM!M6C115iG$9AZS3jJ zb8k<$&{|QLE7&{4O<(@YkcbLlAiqxd9fS%!f&he1TN+Xc+7vNHo9CTB`v^aa&nXtiyZ$_^1dXpzMW!K`0G2~Aa=R(8G~%8wCIm) z){5%g$(p-cN}pL3xA(7OQ_P3GI%#|ltOAw9C!Hw821xaBN^`BzEwUzZkh+G27)Wtu za$C<>$k{~eCb+dt$hTvlrsp-?qmC!b?RVP<5?e%+CMIqk0^4l&DJfi+aI|N{q$cdC z6ugh=n(v+*Y9VD@EtFy{5y#Bz`8i|`lfl%navY=6!o*Sp^JIUk_V>%WOP&i~d+)y! zz6%k*HZ^omMLcnw1dbET#AHD%m0b62*I~Pyo?TmJaB* z-V4&1cPA9?iozz8CT}b#i#)GW+cF5n0oK#4RLgIV7FX>f9usa`hs77VyfoP zKA-qk$MY4w+v&9(S%BBweFDVv?Ir&1T|_1j z!A*oB0Z-~cvbk?w%Cu%tia)fgvObd2nwLhA3J_Ik3orjUJ*dS+P%bf9ZcrIwZJa(5 zpRy%1SV8#`-E7j6FP-xHV{;ZwCUko4y>X0i=0uBk_c99Fb#6CeX4tT!-uDul;7WAv zKkh@tB^7Q!n;J!-4bZCIi>#YU5}=XghKTSpsGCd|mwp$ZkjMh4QmR?0ntTcqg{c$pcB3*)tv9LN`%<_x zX9!kwcfWlpeU>nCY!yeFTdk(v?R20uS63L_z+Y6B93J~Fs+!Q~vmVmAWLue>&UW(; z1ALv_oo{i#YG%#4c?4Y~uWTOj&r5ZbD~A&T#ADQVsW`0z5zQ9a=P3v+@lh#_=Oa0H zB)&jQ--K_yZVv_rfP)ZJ94Z>=1EV~(zr;S?Pl*6;asOM=o|kq|;ckFBYl8a9(28~| z^&mTYUYa^@jsSk}tg6^oslN!i%9DGWJ%50|w7rq&ZqX(1ydKj2jO6ia0=Ou67fy+U zfGC=}A4$I^`Yl4XC-ZaKQzur?{z@{S`KuHhHtQ#C)jnG_N53!vX22|o#kv*xxWFmo z>KzeZ$I*tmFT@P?jVAIuKP9t;wJ8>V&@hNH=^kT|&N*aqG}Veef^LM8LMl2f>z*ej zJ6vRHDrou90&6u+7`It=SoX5Vgj7aP9&dz)*$7D2)(j04dn+fh%K;akmfyX+YIP#7*C&QS335PO`}VbITL$m-8LRvhf3pE` zKhjXSL-|s)%D*iwC~@ky?XJJ38^}m_99U*w*Mgp3TD1j>LL#aHYN4%f@`t=!}xaz9%g@wl|yJ2m|GpcM@34K2$64B&l3VQeYVes=Q;cu%r^qY4n!nuuIfCzXpf$UyvW=0)zp@;e%6tG z@Q@0hTH5JyBAr=s3J=ZR8T?*4Bu(XOM|c^H)1)~>ssmqWypFIt=_+Z^>DZ?5dIk<0 z{Ib)WfmYM@HoCM+RQZ~+4zv1-SeUdcm9jakXg)DL z%u))gU0uKBR{u7J5}B7k36K*r)&$HJR6dsTvp@OloGR-}PP2KMmt(O!RexGF;_0mv zb@8rRxv|kCTP2y!EFzg4 zn|b*r`zgP)s^tFx>p&F0KqpmJs}-e`iD>Wj*MD+zDOt`n-hbQ~7X$y&`L3wHmJ2%Ga^5-EJAj5s;|MoFHdBM?IkfsG?YqjiQ)C@iq^6xHnX@ zo!|i1MM#Xw4zWJ$tf^np;X_m zm;IT3>bH9V16P8OZ@f?U{@?qb?tFhFfIlMm(f;|x!yPLHeZ{Sy5t)?0N8BC9yue2s zal|W+8_3^Z{o0%S)nED4&SyXQ`33*w@BZZ0!(Fad{8xYF>yLf9+saSQUUKrRp0d4@)*xs0el>vM||AjO`Xx# zv8uz?l;WpU28@JyC6@XUB2B5-)WaVIUe-XTPx|@I*$sy3eqleAx^g~euVsk{0@`lK`yna_QV zYHCN_wjgi%zx#I6K8w#vQ^J`EE4K47EWud!6hNca_e@=alBHk)lCzoXs^Fc zD)=4=eDj>wm74o?y5F|@eeTK_vY7#1T13ajd(TwFrd1*rb6O~?R7!!Ed#%;{<%4Fi{(ONx%1+#6U8 z34d51E9q>&$I1p{+!Tgf7({RrHkTut?S{)zNW&@boj;-$rEHY6DV%RND3#4-i`#~c z4iqn8B|CI-+1QSipIyGk=g3@?gi(3--A9Nx#=vGA`T4_#jP*X|E4CjNMlLu_11ld; zfs<9@^g-p`>Wuf^A2}`O3_7wI4B1w=7)d0ombf>nqhd%B)TQ4JXVSg7TtZmbPM_a^ zu9Cd&^FH4C7}|f1mPY=qlQYKcTvtK-4sPxGWo+9B^&Jwlm(|^a1nxB_^X#@%sK<9QAAeER{T$P(l}ZcNSw!NfOtm@%1i0d>w8+03 zd4R2Lrvg^($~f8~YPCfs*lzz4XUYS-6L7Gvw2uQK9(L6|g@N?`uq1z(FK1_ec0arB zop%4e*FQfJz#jp;J(wKv;$ddUC%_6?RMDKV@&szCBW}boFYpmZ9P!HH2J-hSZ$IE~ z{N^w0eD>&Ki@?##La0rJ4#CKIN zzGwk|kT%j(6E$o=3sg^})ft|Y&}FsvFP~LRb)f{gvG~s*fa1lD=Q}EhpR)q_?zmg~ z*?|uHyr+kQIf(Dre$U$mGSSErt5eG~u4`3O-icEsoF?x$1Zl zWIGcAGll6B*&*D#4!2L(gahuJ^Rlb|tlhI~Ys{2VD3S3wFK8p4rrfpd983G?UK6*K zMVcxO8Ud4iXA(9u+$xkURw}DnCdFf1c3nPlP-*!zJ7Fcw0=k#8s{?mRy~qcAO*wZU z^XJzR1MI5ImN|~46Ei+ru}R`0P4yB5U*~7hHbukc)E3 zb{GIBjg_-isHS^vU(9g^T!d;MR_PK`Z7Rza&Xw~qvQi-1=T)oxz3vFDU=3$&ct-AOR&(y6tBoYYXewhEeZCO11{kx)1<$NNrma^zt)-8L z&U~$59WFclqLb;?%D$Y%wSVSU&-bL5iQnc>;i;9Oe;3z(B!E8x9POW9E_@=apdl2i zi>R9;?glrTEuoKjfsZ)ih*tsb*XE7?!e{UCcmKxQJGaU0X#9u&=?^%+ygjh!2XB9l z@BZQ!AM5lA{14tg=QH)m?^7Rlh2mXt_XX~|)z6Xax*HC6-{;>xH-f{w|@Jg=ii&q7uLhxxsk32Nm^b- z(NK)Jg*wt_D^^Pa8VWj*nI!Kda{s&iHK|nH7Yee40(JRaSCPr$vng<^ogZ(u%M1Hb zRhbll{dguW$E8KP-k2M<6Cf4}O7jTDac?Azg)OkHwg^tfI91_|)rvP( z1NVl+AWF4&NS6<}KaSih%J%$%^Y`9mkV1N}W*A;4xp8u0oSGq<3+gZ+l5kOs%7^D4 zP_6Q?WX{F0i^6>u$}k|7xIEwBUb*L)m1b(rV9u~{T$SVrs{?KpBwM>54KlFx+EkE< zaU1uilrpPyg1b{{X0$c6CURYYWlCAIML4y>$)g}Av#hXn;zFE96vQi+)%ek$`~_cH ze}>BsF440s7qzlkC3H|;KU*VKaaCL^)t%8w5UM&vzp^^_kJg@DrP;^iG5}(q0PXF) z3^v#&jQ9J_QW@-C!fsmo9u-Xy^lf#S_tcxMa#QPL)Y8a1Rgwszf;DUDBw%$!a+=Hn zx~*_ZDb}`CNt*xv?ETxXB-@tWhyBKwGa_?cs&?&t&gmPwn=Lk}Zj#+iHrW=hqC{A* zW%V+0Rsl?7s-JAZy7Ks+N9WoB#JUgix-I$+0^Mimp*&fuBvs(jF@u_ zKa3fXky&f4ti4y&soJ}89PCq7nHdo?X3Sg6Z+zc}m<50-+S-J+*IFShlUX8rbI*IW zHi_IU9g<^wiG-JmiZGZqIdh}b%GO5m<9gB7%mvYmCSkOpVcAonhBJAKCsB&*C(_JP z-h1QFE_r8S=+5Ja@4jC$TIc#cXfqEbp;Xv`$unpg_b#?O2Yc-=M!~slF2;0`omBY@ z$~Hh;gt*Uk50NL=Ky)K~?#&_Z#@8tkXJQ0Ti4=M9y|g-Z-GRWnIY<}s&#%|T^52u{ z#WH+)#`i2b?t71qcK>>v!-)a>&cn@KW7VAEJ%M>fcp6%a4|``10}zpqK!P4{fxKCPg+KhW_ z`#Zd!!?ND>(*ITZq#SENkBo=jeJ7UDT$V+q{2QNNkKFr_@$G2-#ezY3SNV?B_3`QJ zVQZ+PPv^)Fj@RXp`QezyY)y#9hUp#%gT~&pjQ2iQcgOM;u@znm#x3xKFMncu|NGbc z?9V@A{PGsoN;+SWd!>58+Bx?(0VmHnn`I$WN|a$BuQDP|ts~VTX@|Q|3*`Lu=l>li z<>-&zS@!gqWF`bdWFyRP43tGhabM6^EKdIjZn-GQ$nP)mI7GU+4-;4H-2U4=pb z6Iq~hp^QesVAUbD%uD=ihPzS6LK#K`==z?jghaCnHi4IIW)+=eYFm9Rd_=9CZ`!c0 zR%e-MRY)qB=D4?F!3=Hp)sacXsJT(jYDKCc)#xnz&P4>TP|c}X@f2W&db@SAU>i1I zHcH&&NoO2-H-ET5ozQljd__w;CRl_jDdrp*aW^tD11ft!U=AgLx}L5$;+gX&XXLDOT3Jis!me458&cU&zWjn0 zpJ(LajQ(dfZ2e0HU(uaE<>uMI^Wg;wT=f^ca^?1kfQ|g{iw&h1l*-MJxzRPMnagcu zyxy>N;gkNHVgqGdMIwVbLo!6xq|lq7_ltJ#)_}K+TZaQL=k;^ag{j%lhaeB_x|uih0!C$)eF`CAGE|%yttc5#aAQR&H)@5b^M1B-ou)XJ?rSuZl~eO5#=|&aX~a3u;2fshu*G!Z=2M%xNK~ya=y#2BAe2>pE~J zS;0!h#)6l)r*;`?9Z?|Vo}9Gx`v&s1_0E)3Vv7Z*s-o7l`)SWzX>)4SaW<&cuo{f~ zkb;iyJ?re5zQ?XzhH9LPsSVWtaT`!+Q$mS5Dvsp&O)L^*ES|k;dlwWUX{LF@OPOXc z3CZ&|Ub;_Ed9c25MXiu(+=HeZ{_S(Z4It4U7qngC^wRc;noPY2iZ^xVAPUxYAE}M2 zR*fNFMCUNDd}@BuBwyzFuXw2AJ&*JiN23``nhH0qsr$n0N1| zj-!$>1#8&?(%yTr?5_Z9T8lT;fD?l8j^pJ0`(cJRzl3kQ6f`2FuA_|O@!g11ym6c) zp-*v&Q+%W29`N_+WzT=`@BUHxZh!IkxBkl?@CQG>e)yCk{O(`;EjFwEjf(K^Zbtr> z*Y^X;j|EVU&3GR=KzNE%oZ|h&#G-hUcpG5v*Num+`@R(tUSm$Z_TAkX>u;+r-!}vL z+djW&3U-}HH-oRxfbD6c^B%xlL>RZ3oO=4y;bN4rQpy$Eo6mXqd7+ccnRTSJBIiuX zU9jR@P{|FTvHf-?!SX3)b$AeYnp86A$@r@wSQYkzlGR?J<^i*OIo)(twWHGI!VSC&pE+ z6*CJEW)X+yJ*E~SA^~1cj4hgP=ESrU+e@JHgL9ZPnP`}$NcX@vXyX(+5Y`M4jceRd zzWW%wy9iZ;J=@@e-``cg_tlAw1=SUO&H;LqsN3t!E#Lp)kNAtf{*->bg4|O@x!pQt zDCAtQT1a(++J=>9dKc{GmhIJ-jJ8Gl#8yX!?5HHRHUxm4pt`Z$j+hCh6nwlzNz?&s zbgFD|gT5-;Qlrf!Cz+!rBvaUqXs2|NsS^9}wKU+!D=u);9$;-U=o6@-q*$6rZJ@6< z7G;74l8HE;8*5vA2IiAElQ;IzXHr&7g^DoHGvZj?P_|o&gZP&1HsMxz@x?1HKDnl1 zcq&|5Vkjdwo5Iad8BH)LxFpOgp$gnsj%~i3Wz8RG>w8IA&1-b}x3HVH>mBQ(eJ10? zR@|5Pof5$=E-o-Dh(pdw&KdIn$ch`9n3MF}BS~agHr2d$&gs0%`Tn8A!Nax3)c@vx zn}K*J1b7=`+I59CKG~wbO2~nWgx_$ggdeU?b^m%o<6$fr)TxbkqEIIQ5W%S^f{kVG zUU&Wfb$|B5``(Se3pQ`F(rBnI%=LXRt}Ix;hh^U@&#X|;5(qp1;lr{-z3tQ*Ad-)g z2<{ad4N0l7!F3*=rZIgQ*QW%W`I+N0(0f?USSL39G{7cRk_4MNyT)474R308L(&-lXW3@iwb{cbIQ7A)uI_q=5@RMe>}30S4U0Iu z|HC)|!0$3n^1B~&d@NGXh>&uoj^q0-$+s%pEZD#&N$69Y;uPPcFr$?68o+UJ*6~04 zcYc}mYJc?~RJ^Yh&gA^z!D-%Y2I0;zMWPp5pz+ zA%W^!zS2Dk9^S>6y-zypu47;OY_XU6+PC*?!oJNo3P8PY4^Wvlh~l3Q)$?7O9bXk- zJA9VM7?S>m0QkEC`rb8wc(h#~H35D&%tqXIvWgR%3Z`eVkmtMOnWp>%D?+h>l!R3l zzWd1;o9~^IbK%)1=k%*YP8D%T+T&FyBWRa^ao!+QRdVit%s7s0#x2R=`fA|nW<*F_ zTxM1)!F>STfSo_;{=fYr>M1^^cnvVIv;$})w)S(|phkpI!H@<52U`-`2U!k#$UF{A z8`q8D>mtqDcLzR*Ly}+tAD$y{Ih{TT57fq@GqXMU&eyKJkb-_lQgZ@<8ulF4#ceO& zn>4mAe=n0NNMm0&09h7e-*hLtdWb*G47ACHiZ-xnHXm@4SlcJcI4%kUs6cuXP;4$Q?;_SEmxa?vaO6mrHsby_6qD1%BC{bkzOoV zxLc^rTiL6TYIt=DW3Z=9;y;1WCvR4z)Rrvd3y?DJK$NKBge+8}woU#S=8OXXs*Hdz zw#*0(>LLjzNtDY=<++Yfydf>C0FX@SHQ`jYrg#ymIJsXlZWGsEZpr68DLY?|mF>2& z*%qp4WL!xKmZs5Ud#wS~3vl#6`D$ix9)ui#MoaeZ1Psmqvj;16Z;jU4&J517Yv(B? zx-MfS=IEs1&y9g=0N6R_UGhe49CvjlWvbMYIPO} z#>Y0Exa`19A;ubC{7HLGPJp;>ktDMNEo1C&L zClFgiTGG)jxk4BI-ZKEasC0Eg^7@WzOm%VsfZt)*iT(Rwhkra$(4vawjFpGI8&C1o z!u=!(eTq|@;+qq0M!f_4U9S@V)4%phTwd(YhyUoGea=7lr=K4^@9+Qo_xK0D@h9G> z4BxHBfAajA&K}-^fBy`dQ=H-y-=ugG5P139!|#q|O+R$q4&~|u6R?h{ik(} zuLCfjVizgSvBpxK*ltl9ArIW%UlOuV7M<93 z%wQ1Ws5J(019jY;(Skt@O@ejtJQ~I~|ND@s_u4u}rg{qiS&;BWT>u(~_k7m^VJ|^P z6thCHf{Bw1&Q>e@@{(a&_^-cz!_()lc=n0#?DC8(g~Z6^SthF^U)=Ki^INvBUh;g^ zb9uhvx~>>&p{q*SICUu0O{ET7s8BYJl|r$B)yhbt1`s4p%7P3~2k25*0;H6qt=SHg zN1Io*$KEF`kHOoso58mfy`Ruc2Ts-*{lQpS7L)Xgi<;b==qXClW z@`~BdRcZYvk_hH`^$zg&@VV}{sa<=U{kW}pc;_9k8f?s+FSMD3Hgk(C3KKxpSi~;g zyl-^|tIQ=54x zM63D?T!$jT&KGz3z0bp(Q(M9d?U~%Akh%ngcd0s!`P;^NN0?Z_Q+u51VL47N6I0v@ z#an;!5^cNge!FCz&tr8f!>%2$2LiuV?t_PH!wAim0Hy?pMVX4=Qe%2c3b{toNtZ#D zu8xSs^DY&!`>Xz{X~a32}BeT4{(2R?!A!x zK6FAX-c_8~zu$=XXr!P4ZN3DjcKP<>Bnf?rQ=H;M53e=A--F0W`JepNU*gkGR(qfS zxBv1>{)>O`*z>))C2d()mvdhpUzQ%o10sn z|L7%Oehx`5_|Ew!SQWZ%Mc0iCbp$FYE1Cqf!N;!DB5XI#?ad9tMjG(EX1sCCD_uWw zeqK3S7gEkmTC&IGu}S*Jp3g}c>J;CsSk8adG?<6pSY8c@^~RQiiS-3|14>h{95p3U z3g2KB;ORUXOq<`0fp>_(xI4+2WoX@fX7nM8a=K%s!XyRkAtkNd{oC7fLdpW9nHX1d zJ+NStEr28yX|ngtAJ%DJ>5I}&tgK6nUtQtTbSx4=`;QM<_yn{)BZ}akGUV;{5QHvmPLq%6i!F zoi1~klqcg4QC(5e6aMw{8_sT^lM8Hni`o_$N5-w-rD6%PWD*%E39lE_?UpWOYSm!U zRUug>AtVx|_vS;8k!rXKwJ|1(80rb>8YtxgDLhZ{@FX3uMf(kqY(yDxiaJj$;W)Ro zvaJT1!W+64RH3MX1^BDxC`Pex1}`G0=kN(nnVbY4N5r>0yUhI3&wU5ExMj2+bj|AQ zf{k^Qw8qb#V!g3i511>}M)0_66>SMtG5hSTK^F7<(N|}YImu!IjM{^zw(nipV^K2q zzx_2_ZVYmyB}YiGGQBBtB#rv7&C}Qn(A1U}3jl8+jXU4Nay>qQe+Tz5x7V4;DRaA@ zfUxEL-ccJ&J$_a#@#XnjvPp4@J5nP#010-jq}D#0&-h(n<9#uWJ<`r)O_JL^z&vOS z=d=KBr~BjJ`5)AYs#DDvC*R{7=TQ{5#kjg$qXi0yxzinazfsAEdNAN+m;46}1XkOt z?>+EWXp;AWc}2`a;+Z;+%PDp9?+<}~GYd6}_IxG)czSTl#Dzl!^AwS!WKhHZI@s1e zCmdys^=oy|74k>6rbH?xReLThE z!_6q;NIFSEpW+m!_`t$Sxl@%y1pfM8`USrCowL2qfA9BS@t^&@9~?dJ&}IJ9zxF!} z{c$A?1^%xuulbd7S|6R_6sLGQag6o5jE4ZohXB|6*38F1+Mjm3@9Wr#j^wXL1Hh*^ z#kVI8$HQ7fMs)H4o_00d1XCfEAW+x@`e^e>>=L9zRt<2r0d2HR>$}*t_sU`3v7zlM zkQ8s5-(n2}HX}=b&#FqboxH0|^sq%@)?Lis*RCbOT@*T&&?mKy3Bm&Sf9Fn5m z7}lEb^%+ktpKv=4Y`suA#kPsMspxg#YS_~CpYzLq{O9;%KYPX(&tEcJeL=eYgfD+D zbM^g^^K&D4#!Rsh$O#R!ke)Nl26E2f9cztYsEu`*5}F$e+e@f4r+B`j8`UbwDqfW; zmD&k?-v^L0RysAhO@QKJ6PThDDGV5+8``fa7PT*kY6B5PyrKq~NJ>%$G@=kucU4?8?0weDjR{iQ$m zbNuozJlXr~4}N^jfBJWS|L7FqBK+;Y^4q+4dih30`QKjM@)w8l#^d5?ih4L63t*fQ z!M@$0hcEaC-`lrndGaP8@Yi7kKlE8_cpV(O`14)A1s-Fix*sdSyKVr7b=W?gH&)(W zqU2rA#}7NeYX=?q`aO4$cMniMu7#%5k<$t@Vb}&suIq)IQ)6$`hPmtm5WA}j?iI*f zKKYdLy)(XidBuwtBlYv=JgYr7o67nukvp2~rDHW1$7So>+`updyC`4(#Gh5Bm z&SSD#g<27_*M{7Q!8QAr%8u>SC~kWjgs$*ZUZ23_29Pa9=65W#9g}%xgH3EMw+5y+;9KROyvsUUf=kTcuQ&Fu zun+p|&aD@Ks)-`O>@}b;&eFKrL05$8 zC44tqeN`a<-vnlYNu^|=JL}N%jxtp0b%4pF9vzK5LN-Vay}`xP-1Ysnf@$!1b)oqWe zkZx|HUh@j?l-emaR7MY(WPnQeOZ$|ZAiH)yKg$CE^)AJgeFoz0d!5?)qHkD}*cNxX zu4~sYN-5#rs*_Z&%)X~ir4*x7XB?feI@J|(UF=CL%e8|z@4AQOpAUJQE)@e_V-QdO zq2WE;t~mp0?qISLyw}h=sl+{oPi+nP`{oTB>`Vy{=;lwoEZ1Qfr?DkjKW)Ni8=!rVurJ{Ik4c~8@v zG=0YY85t#xv{kS*MrBt z>->-V>i4HrKks{dKX(0hJwLtc1fOa1ZXAr4FR$2aHuQbs>^zgQBWimac!x~CVig-k zZpV?7oSRK$v)wY7v+CEFDPKIlg6GC+-J_BitKgmxa!7)vb1u(5BX`0uY`EQAqYA5a z&(HnhIy{5hJ6I`WFm=?CRIqYfwdA2V{(RnT`+MK*`xM{oIF{&C8~D5Xa<_TzH0fTe z0fbKdI%xwDpq7f2LM;WUmE`-LjkPhrW-#OcfSj*&08lLffhCYIdA{y5pJeYEzBn&; z{C#=N9Se72IBNh49-HrzJnkXTGqd)*u^4?PeIHCmdF@)(d^%m?8WUJ`jOF+GeFT`o z9m!P_*gk<>uYb26Wf;S|Ru^*L?w~^IdT!W~$#`{!A;5m^d-Qz8b(gsL{E~n2yT8W| zf3o3E{TrXMG9{Z)*G~Tnj{m3zfC1DBq{^s;Y8J{8WX5qDlEg_FtTI?ZC6Vd*&Irml>^)CPUM2G78KXFoo&L!g>x(tFH;$JLApF5aB8|d&aLxvyw~#EiB9sbiV`hVj z1>11~>s18I0yNgdN;4xPT}q7Nq^zvF6-MD|dyS;T#l>fAiZe>#^P3gpzy6~X->^FG z=(;B;=inp5?U!6$0tBPI%ZV;SErui@DMDB|1(>vB;2#1@EdIUhKX-w?Q)p|SOW)N1 zfJ3HNys>*brPi=~aPfJp5SIW!o0n@H3u7^=DdvKiQm`4Q+JUrF8=Szzv{&wj{(cAq zPhj8#0#1IqhXAn1egep{FDzN3%epfFi)5I?I@*DyI{v_&7xM!2oX1i3dCz_FSf20WpuOFWCC)F+ zR)idF&K)pR<67p9PHn^?r$kPf?YaY1a<@YJ74$up6QzqWJg080esM`oE07Ue6}ok0m7SGVvI`@@ zX1ck0N=k{F>kXw8L^4%6QXZkgI#tdtw%oi*49{=5{G^bpa(z{J`l-;>=RBA1@JhbN zcP}oS#;^yo7@E{+lK zj}iRs$oPBg?vBoX$G$#t{dc|oIC_2=P+4I$g_o>uaj7Kj8Mel?CdRZyB~izo)L&v0 z)CRg?gpEU&DV;HGjNQ=j{NExcPE+6tgNLxZITYhDM)PgHwoW_;1+Dw;u8pB z)Nw>q$m@<#jBH@TfR>7?FyN$BCa-$D8Xol0s0j&=^4b`(E(}*Bf9V zjm2pNZm!VV4LK)RCwi@{F26&$+VIc+(F->J@;N{A$rF&m0MvYrt_qA5w}R#H&D{(m zGCFGkE<0+@R2%WFp|z*?GuE92Q+L>KR(lNRdR3@>MZ~#Hna%kH{VF4QO_h#qf6i7r ztUsfyJHGt#bJF#Qnovl5;fCcpI-;#H04MH=rdUOmyQ@+ zZ%{!7<6Lvp@zXQ9^EDUxb8Ink-|<=3)2E)SiF}bUxun(+xFz)i<^@d|>=`3lJUgrk zzO7IcY67W<7LcBl()`>ez-xMbod;`oX4+1PSZ(C1UgkBh=mNZKZ6MWxl28T2ckQ%+ zpdwDnLh_v!P5_mSp-4z)-&SX+0se+ibVc34(+p^;1ao-V{)&~>4ihP*1^CyP#_e9M zC6ZJZj9`_goYec8p z638@lAeF(lh#0D1=2*30nC1Xt@f}-J35ISd1w&DRTE|dHr~+fiiK}L^c!0O9uM6S7 zYwblt+Ss;y{c*sOkUZLldel!+MI^;NxM1FVv&}GbloV|tX^guwaH~!Fd`ch@JR7cU zm|2KZx6z&2^6SJW7Ol_81u=kuvRGp^5Iov(^Wv>hE>mH)5@_w!J=(%(Fj$Pwsu^gq z?n!6)^6A}Z3A(CTn?k*T*1}XA6R@Nthcr|$Cx@m5qYBpd3}+W~U5EEQ(#V5iM&4GS zvT+Yp3^bZ;eKNOe#65``8cGYAv`orZT6kV#0E||7LKPl#VJnlF2ibM-rpBbFMIy_ zU;HC`)7&r`|F8e-`)szy=Yt>o+;{me{`{YQqq6)`t^D6!UU6(I_3Om9AHY1tDZYLj z?;r1nA^%l@AYTpN8AOHgwiA`}ciiMJr*#y0ebdr|^I*0sh)Bk`@fZ zyI6?FB79AEj9GIhxxg4K#9AtO3?I@7yqy_iS!S8pnI+a(fy>Z9SL0o%fe+JTQQf_@ zh%DH?4ao7u~SWRimU7BZ|F*AfA*d+U%fJct%}FlHsNTg@D5o>fknpb$d3pXBoCpRzEvuy@p{JDci!$ zxTSpeDd*i&3W?jn@lB!Ej&Ajg{xWg>#UC=i*vC~^iM9y=g+v2 zFSywh*4>IO^(eymx?{Y)#&2&)W+Z7o!(E4TJx_o3d#u)L$Q?x-%}si@2Bf~VknOfs z@hZ}wdZpG1G&yB8r1|X5eZd?}JE>-fe63n(8N=B&5-plv>arcl;_vh4!rX`B-?HajI|12KKbyR$m*rWqLFe+(5;YI* zZLTA4lDTahFcPHQIg49kmK%-+@Y%q`u?9e0+a9`-KztsDqJQ5X%Q0fQ_d`X4U6PY7 zEN8TNR=<8<%Rj4I1J*<47?|6DP0ztRK-RIe`-0q(1O%HsY+a)dx&YePstZ5&r9|`e zSxPCqj28g#G&U~VLEMovP&a^I6Wf*53@>#~9t!_oBZ#um9@N7LeXnjk#ztv3zI^V> zb}}(&mqVqt@mLL19k)tFs2C(Agv8c1D-9<7@^k0#9 zB#6Ax3(%7NEasT*4x7e`yWUIPPaeQ;HLTInPw~wScc)Gu@JA4u(!4M}#k&i4r%Y_% zk3nYq6sI`FPe0oH_0V|UW#!-dE5AtJEf?(YH~!A|`SRs)iRS0ep78(qtA8#w8ji#h zcmD4$uedm^i%xNhuO3GkL?2%qlSKR~$1gVo9s+;weXqOg`MhP&{4R;NDPCj9sT}SJ z?Zs=G??)+gr*Zq?__+ILN+}pD4rk{*KmSKQ<;l|xudX)S-rO>b%66=*&Mr9XdaS&n z4g)C_aw=r5czOFJ>+>_t)0$1W;=IqS)*Y{2y+VCOpWxQFblr+o&Xny9tF@4`Lp`IK zA%w4Q7AK#rI6KQEA1Dv3JC?xA{qbQx-&6YAhy8rMi7^43ZcZ%{;F#{SsEpWH?=RNS zXVR*}w1G5Z!N(CB$6)#K^%IVk-jP0myyp0}z~J~$LIAh<=SmlTjN0Ycz_)3BpFjv^ zwkr_6kL;$wrHp7)Mt~-^09JegV%i41-KEna2F=q_8Ynyg5_^d#jj>s)A*mvsf@K(} zbg+`6(DO0N<45rTcqZBC2KeqIMVmY;O(uD&)%m&D!FgW?0i#ZK{+@fkZ=gy_t=uNz z^{h(H%JZ8qSXt$4)nTJC+5`XzHjHdjMXRAh#m8VPs&;guWHK^XfD{QdYa}4Jq2jFj z%nRAl*G!fk&lz{v3)SsseQ+NhYPl<@uWY>{I$@&yb|SMo*c< zuH6-@3=Jrn0Hhr&K3dZ-6wdlYN>RVLtBeCMpJzgh_7nTO?vflP8z+|ocJB=S?gP5Z z=N`=|q}^>|8S0Mtoew-&_oa53j~6j$Qp-UVl?kccwXegxMU6ftHSRSm#GCYV1N___ z@AS2@FC#a`{{$qqS__a7D6I^J#HeOM62m=!-%_EPu`MITp;CaB2x0;Zkr?Akuh|5t zftv>|i_3bFrOdB{Oma|%7gEpDaUOtdj3LeMSHN^9H@%<1F*Sf4U^mJV5 zjrlFjD#3%PY!K~T_Q2l>psjNfL(B(>$v4_jvzX^vJ=mf<`J$Z5I-Kfgn%~4hCgA&? zemxy~LL%N)_=!pRZ3#CEKj8E(I7=T`$j%S=l)UinW4 zXZW~d?hjURwye)qTwFfo>89t^t84!7_bcUgODY}b&(7%2m7A+S#Px>DC(3GdMzN9g zI+3!&c0<>l(dCRv0lR?GGi+{=9?B+Dwo2D^bgtZt1y|v$@1Trq$7^z0W40#A>+SQT z7;=hJEMvI`u>=F9$(%N+PY=mdYruo%j*bq!JPQCsiH+!LP)4YQ9 zHi8*Aff?+|c^7y)0jCfW>*kKs0=3C0w{6EsKK!9M)>Q+Xo`E+ShLnBx-itlFoP^t`A=SuE#a#b>(rAilUzy3p-<$#BjrTr z4yE8ZA?uF*lS^zYkW;j`1@kX#2@JCdsAq16stK=^VHntMdd|)}a?W&JWt&E7(OJS_W z;I%P;+c|7EPE1K2G6C)=E;f%fhvk|8;H4k>U3C*DTi%@FZXp5PfYQUY{NX#p%tlVp zKI+^?oKg#3Evz0ItJbR%-pz)%qPasXAsyhky;~T_{pG*wJ!8pK$97C$nb@u{vt#FD zJ-odqRxp5gg&GM;rB)0uSDfa#yqsSeds#H3pi$;=UTl|;5$EN#d_bv2^^i2zmRyv( z0D#kaMZM$wYVs=<5k}j!doka!*c+G~EasMMamQSE_^$a{@^UM;vfqc6aaa48`oakS zeoJxkQvG&?l`>BZ-}-1Ea2dzrzdgmHV~-7d@&-P|DNgaoI41c##jpRdXZ#z#^mOmD zfBvst@ZbEmUmU-NDu45@{SL35oWD_-{-diK{>=Eebzf+Oe;)&V-~2jvgU!2r)#)=o`25&4 z9#{Ww3R>@}Jnn5?Gym?s;~$D+?fYTA@tXj|CkEfUjAI_RkHzoDaU|!Cl%UqaSPJF? z{W|fT^*LFJ{6K^W?H(>kZe#bA%pUEB%F&JEvNKq>ws_b-1h%5y~jk0-lXw z>y#1BSBlDt!3I*dV!b}cx33s)uF+MZ){cIqP`>Fi?89+v{5ZD!dH3;1kLgF3|6PwS zM^`WpfBWe9_s!_{e-FEQRuOg9yuFXe}IzyuDLkTdpRw;}`> zrCqS@M%({A`)y_dUzVVW`mR1*1N8MK1?<$lJ~gq^repWO7eHM?YS<@md)K1eoka6G zO^U2LRG*+YH7kQw))${(H#f-YC24bmj$6EJslyg*q_4q#^{kZYj8bWjkgUp}J(fBw zDV`K3GrF@`!|l4`=~>U!%@xmYHVioZlXJ8?W9U{Cbw26W)KZ#%YK0_0>P~`*^86<+ zD8>wT7-wtk#L`wz9o#lDC>jz5}s@#<-mS9c?om zg1^hYW&T>bT7s00?hSDhi&Df%x)1!`HIz+2EfBuD?!Z1kx0D37W&4sCiKcUF^WO#L zemw!WbNLUz$muuJpRaws=sQLvfm9bpbB1bElVJY3wWN|553B~@W)4|fKcD=zy@7s` zPz`|cE)aNb6I0(~H%{zA=eht5rg8hXOc`AZ8Ms0ON3>;(J zY*8IU9=#^W9nxi766!gm>)+sgYYA?8wOtwN?s+C;ejdAei2Lg_;o{*HUX4;J(m?&{ zP&7vpN!kJQB7!d1^}2YMjDG4M&4b$79I@CB3Y@!Ay^YDMj)dzjA#3Tb%=Wi=?KdgYUg(ZtumpndD(hjq348bGy*x6(;IRPYDc*0S zl;@4qoO5g%jvK_3^?J>x-_2CLMDzx1M1W4t==~FVKWFe8(z+w}E4G`8bUmas+hUlk zNqL|aNV$+#38x@h(3N7MR1!&7hzXll*Oc2W>rb3oo$8bP^wwv`48@h z)rI`+bpK0V&_z8g?)9+D%jcOysUD10QAPWViBOX;nqWoHzGt03BVS&^=9=;91=Rz< z$)WL$^c@3Gq;l2;(^Rc;CD5%io)y=Gr=DUR=*UZR*0o8lN`|~b&dx}h*qXAf12XjV z{TZ5^Q37z%+~F!%iNuARGZ&Xn@v^13(E~$D=(f*8@QQ7nGK`Q1Bz2@N<2fVi_3XKR_>QEFb-OqI zoA2to0l)!P5&-n{yQv*mB=LmbaG|*4rBX{sLaPSzmz^rt`Bmo)HXVPkotUAbl99LMjd_lV3=Vv1!wT8< z-+y0A)?lY*frqECA`M91w>P>gP5|&@!~KnzH>ddKh5N_l2P~>+&ZqYLQw(>fp4h;r zIK?TxVtB1@tUQvF^4I_3A0emRM#fl-zxj86pYjG0&Hw06{VMi)jwEhUaVOMN@|X zhAlP}6vI5-+3(=Z=C;Yt(5uDfcnYu-4Th*o!8Cy=(r4&WfLjhJb^9{P6R5B#gNigT zt^Hf$J}00Bf@ud0WCO%QUOIVW4Z1X6(k2z^6=%m#V{yMC`{Pjjy^>HU6_+spQ4*Lp zkZm8FnM&pm^1>5KtN{SQVr$pb9njs-sXaibvh((x!MjCy&GuQIcY*oyIh_WIIZ~re zIx##6BhJeal60j05|NIyHa5dHKr|T1%J3tvFSiRzq45$;Uy#Z9sW^nQfo$7xAam(mzwr<8G`d{Y%rez@osMaJweDoEqdsH?7-?+PzzVccmR$B{g~EV8D(ZV6b@r=fwjICgoOR$m~Mq+9e^>05?S<5oPW# zyT0!S>*rY-yyI$U*iA(7K!meB*4bW$TuXJ1AXr_ zAj0AnzOsYkYSy=#HecQ!JRuYep%-ruSNc{i_W; zUVy&=CL7-5mUU(j$FtF-b0Uu0WFfG)jyq0)Ce17jpq;>B0Y;DKo4Sm28AP#Whu{Wi z$h$KoBQL>Vh%tQ{QxCx3gy3oF^X-__wBQ>XJ**d)|64Sas7E3J#A-|Fu;z`tWCb52 zbS%g269D|kI7vT$yTi?}QqcTybQMjJ(RlK+{^^FbjHr|n@-cW%pW+m!_R}vamp}BouT#GJj{Pd%f1T?;_W9gbru$}w$M&bM8jntZ z_}BsF4?M=9l5>YkqLhkRVUq2OO|OpIn+?_AVh!rokiLvf{@i2R#sH}jjJkxj09d5C{nZ}OS!IV>+;{JH_{P{Qm zg?AsWi!v@}4Q28Hh8_5;xp|FN3vxtb)`~ecR%{q4!+^S>3-I#JOTXdG&z^}I8|2l) zyH=7idiWS>N=TPOD%hQbl5?hdSh;zVqBgTVaCZU?maMfUsHvLg-v-F3jiuK%?oAr7 zvIAR|Kk5*PCaKzK zCD(!U>Lu7Mbm6&4CrAP9da`6j2@r2nMmjPkFxH9<1Dcei3B`C;Z;@A5lyO5+3yWWz zbz?5RI$txEn1iwaIkS>PO^xB2l!`SlKk`k+(YW<3mIJ)XDaZbB-BRm_myp>`q6{hF z=BUvCrT}V0Q}ZO1nVA{@*)mx`D8(3tLN^w={*1m)^u306>jHEPmT@o^XTV1Vv4g}w z4WMlPjo;lz=k_Ln3eF&vO*u~?6`#`NZ#)6V`{xR32S@_AP$ zQ~Qg1oS4(Qd3`Ett@Tb{)#dNT#?a1r*Z!+Z*jZQwV!Rp6snT%KNe#e#&ml@|=XD%l z+YS)D>-xeDyjImFtu6cGjbyy3{7m34(rSOvFXiCxd-d-&CmQUHO$2bS2&p9_c(stb zcBhyjQW2CayLrMI=qwI5L#(e-V^SZ^mrL30>Hf6IlA8$mKp`UJ`0Jch=(XUfB}$lM zHZkg%pM3z$5{WYl0D6AMtTBI>83ud4=hi&YmjE!%to~5UPz`GVNlKw%BPk@}bJsmM zkD0$d56p~be3mtzlQN=`7D+?aaTE3w z-^{RDn=i+=JDYn7&3PV-Pw`WX2JA=!g84|=+bK?QiZ_d|!up-!XTN*SpZepU?S1y& z{i_%Ji{E>3^w{Ump76K-(w}{!>m=Ymes#@fZVT_O$IT(fH;L}{pn>US>fz(<7{Ktp zcj!KJhRY+X=O}^dk^8U5YwzJixAzU8KKA)8*dfyfqB{`Me~NPBuc+IfA=NFp{{h#xFSxZ8mlqwQ+)}lp%S!4L(eO-E zRj#f!^!+(&d(M}`inH%Ho?kNFK4G1E#^DCHr`+-hKcAgc|B%~@k?}=k{K*Tt^UP1^ z_>MZ`IK~FQrWvS76M%Dg{|Ag;w__FbaQnz_DARaf*s*u;V+`eE=RdN(c=Q|SJ7&Ni z>)+EjxKqMyo6Yn3^jP_h&2JCa-_fTp4`2W2^FIOizjA}#ph>jH*M$%9alO`=3pxwm6HDNcOG-j&TiX^2I4RFJR z>Vj#2V2C{z1AUKoYf4eN^@_ghsnw7%x`;YR4aWbT2db>W z3of@HBPNcb;cw}J`iO{9Euos`4SI2FY*pfS&}d_V8sr-P4ejw(X}7Koy=lzafKugv^K|!VkzXFT_pf}+W6a;%xVGT7`|i5O^mTx@$Dv* z|5DlkP408UP1S?tEjCNePQZnx#Fh#I$pic~4*8SmAJ6V<;yG1on#gnroKsuKk-lfG+i3Dj_2;RNN;C^(nz($HE6f_Im*Yr_i4d=Jqfk zSrD;#t5iH#qew$H^n zV686NjktkBt%Z_PjKA#Kc1FNUv`q@tYItE!-ni9}T1mAcqvORGeZbw?xvUYCD;vqA zK0_~94+RH{KBXoM40tI>F}jAYnmZWA0Ac?I-R`ZGDz*IeedNi9yW-cyvKMgq|lgCnM%m6Tm8hBc{!F zz9pDQ+S~i6@c<%uVJeUL2>|}O;bte6l*mN;z!@KJD^kwXaXe*8zlWHlNlvoR zr#QtafY@wlp5b35QWE~!zxDHbL&(dkf#3c6$9;ddtDe94Z~u8peltaa|Mkr+f9fqO zq8!`cJ55jTHjXkbA9?;0!|$6N$NT3`@Ac7)@hoMrd(=`T9BGIMTu=XYmnNl}PHg?T!NfYFpDcU2e z4(&lbd`2;cv0~$ZTy_kla3=8V*)xi+DZ`dmFJ7R}608=R+un9vi9UNDcDi3DA9@1N zY5sgneCYN2c!h{#-zN~8*+Y|hgu7E}18CUqL(`a`Gf-x$yFKI)IS~-^IQPrLQW~*mu#jMMx9KjF1R_X3=2a;_N&(n>=c5jMHfto0z?GB3)8Y-2qGHv;3*Idz$W7+Cs<7 z0#P@gl@X;$?8?+uq^a%-dlIi4jJx7f)%YIpJbhBzKV6waJo*&>Iz>d)5T_uv1 ztWMISgmcXt~vv4 zUFtwH6N`AXN_D4Hr&y(m#F!vcr)ZMO4-Bl+I^(b|?|K4L{oj}9Gk?C{HFotsVariT z?9>S=E4bOc|FGZ(Zb?m0;Xq4YIfe~lUJ}T%z7tT=_!!}&!nzHa}PNPQ!)OvcI1mW z#{$$(v(K;uu@4sQDevyXqZ4ZGW>tvYthX!AYtMZ#Z|vB(yZ*Ag9*e)^s#`zBBZW6fxz!EPO{LaIK@XE z9+ER(H`(lWe)DH|dfD%N_P77bA5hA}K(dSQxBl{<&G-@Rdc=nULbyyG}M|HsAK0~qiAVkwEWf34Wq`s&wtXuW&*{UP|fWdAPz{JQb( z6C{qc?>8_1-lqBd*%5&84u-7A;vDbzUF&%7{_x*@?rX2^ew4!b*xJ48`7Sq=t#l3O z2(+h;;XA0(GmHc7BYmGKZ9k>&dp4WW7{$WYGNwZ65>k4QLQ3JvIn-c{6&opD=(ORw0jM*gn37-|hVK&NZgq`TFT`2__%={BC4I zC7|s!0HVTZFjQ+`S!^PU$Sjvh+sqc%U_x2NDvOLv1q8D#pfj`3(Euz|z!XgxZy*I` zvxF_g+#sb#i=s6+#W_i1nT9;*);3g8vUaEz3@F3E)%b!sY{~fSGwPnO3B+t5AX0GY z5a|(Ci08)k3#Ol#!9xCYZ(|=1Ca>>+ui~}?91&gFK9w&~IM5ush4rRl%^Aa`LffAZ@mvkIA5VFF} zA6FaGa|#ieN&hy1QLXN#;nwlJVby)N2GD7IZpsy&92bd$WtEl(&RV7_*skM@F z&w0OMd|A+BcmnSodcl)3c*xkAmK`9d9$-7+sjLW6WLM8~+i3M7FiDP=0<}1-ASFeU zW3_M73MfNX0S3`>x6*N%66dj|kd-muKzpSQjgePbW;c9rmnW&%{b zv0h^g)^_?sscZ+tLatdRAkrL4!ArqwZEWPWq?UxJGKxnsOim~sNp~p)BiD_B&ER`@ z1-FEe6fEu}+7cBUFuW3q4^y)<+C6x9w_6EG<_7X2Hn%@T<|G4a*VF~z4~-qK3sALN zBVEE$2b!7}H|@Fax0~9=%{Y@|-b6Odqa`+Qcq}amLzTYo(VS!dU1VM@OmpH?wENcJ zhrs@uU@1#bSaNFh6?JNd&%KSwJ^|-KD2PH!iXa~N!TacRjS~R;HKLaCMi257->&es z8UL~P0iQtN4Ao%-Jh-F`x{ywum%y3quBqS}=VN2PLB<(PR zVT6>0uIsqI-GD18b(FFJ3{hu$9de>p*7)dXs-!c4RmV8?R0CB(%&CmwhpCDibj7KC zu%dLiLDuLrBJA&^p5lXxcQFpUi8aVa6W+LnVl#VFH8Z+1x(0hnWx?01lNSxz?( z|H>s$F<+mV`8xp%t}?SQC-83qw388Fu+!QAP;3UXB?XW?d2_ni-noG0J-h&c#gXPK z8_8h7@SDKATsN$I1PhN}tpmAkS*vrl7Wz-t_+~`S5jDnIsl!Ox7PJa(Jzirzu!FT& zaU*R#Y&KL#6R;@-$pa}RUaf_dK~2i=EFrn0|4BtlVLV^sxx*=l8d3vjLsqyHJb{!6 z5Tt=pHYXDV_EdKOZflnzjVq`qxq(dMP}y!P>$BAQC}@i02FU?lSyKqRi%oi8LgLh3 zCh*txSnJGIbQ245`rqDpC6ch0iI~$p)f)9|7R>1xfD(w5gaG|ImswtT>R;6jS)?e< z;O{a4b1&JVfri@pk}A~&FG}&Tu^}6v?u{85=rvwzWBo>QNOi$nLUO$^Ppz@|qoZl` zMV*-0vIE2S>ZXCeDtqOh>d?$$jPPAz!gR0J0ANM1DM5rNLVVU*QR_$Uj#69yj6cSk z+em-`JS&nqJPC#c2{*+>&5SBO`{Yi~TC44zd+VcupyG%)wTwtgIH{G@=4XOeR2uof z3e-u(u7r$z1AXT4(S6iIg=Gjg|ne%q-tSsd-uayW<^a*h8IP;~qxJX5$NN_x8eCI>ST3NR|24z%N{Jp z8H99UR3U4@a*yOSBC7^6Ebg~~z|P_3JTuTR{T2v7A}3UIzFxybvt+|b`%h1_&Cx-QXWIKxSUlSG5% zTxx*8IAtiv7^t#L$q5U9vbsS9F{64gXjP>#sB6g53V14XPgi8C40T|<$jEnA$ZCar zv8CSLlGkTQ4RBn?iineH^o5$0q2x#uX#LEju>zaA-wa4L)*&9xTs6&d$s*yWIt&BD zFs*qFcc`jlc0lM}@|8QHJ9*x_p1~}Yd;qL2!Bk&9vnh#6CU$T5OFE35HJbs@h|L~+xG<@z|qrN1-_0g@3 zF%A}gFAnC$=+Q=sf$0P`F6N2mA90unI**fcvP%HB^ZH}@P1G2IV76etx9@H8+HPa4 zO$=nSMpnDyoyllf z)i7;I2fgDmP({M;+UtA{Maa5qUs%J=rf0PPCu5EfYyo-#RA~tz4XlOeOV<3#t$ANh zNj);vi#y(uOH>tdkJYh_$Kk1)5IlJ5?V6EeCg+ON=@5KYY^T5$=h~DD@>tgHU7+t*VGy4p;(deXclF0o3O5_22ZSwdBS|2uQtC*t%-KpA#%%z= z{VKc^-RW`;e>pOm2XLi~Ldp)Ev8|b+=bUwl)B(ztv{EDqRg__@44Vd;kZ>v{vFV4z zHnND|^?va8+Yn!6eEksPZI%Dn`2O*R2dhg#T}dQ{>TI^K9Xl#R19!t8b>7^cz)Z89 zv?rB`xo-r(SkUNiUU6}1185yUjH-3^nVlrr=RZY|e1*6*pI;bDTqgj{@RppITe!}0 z$e1HyWX@)`o!bJyvS<%ueTml%)vpoOB<(>mCO(6;usaS~o1E4ghu=#uHz#098zC>4 zW=jTOM4vmhb&J_fzS$*!1|(#QO@%|Jgdm|P_6BqA^b0Yc8KM&aooE2s1oX$r=WDpx zf>qiWdJ~&b7C@FTGeyw=z9!GgW(f_<*x7>J7D+6s8nUnMxJP?T2p5Bsu5NIxs2J<6 z=RB=QZj_sW>Pj68Y7W|w0jY|YR{tqQT{gas;UT5%0aO-OL=$-e$1Jr(fsndhe>uWg zMmr~64UDUbU7UffS^eOOQf|PNygDO!k0nEVP2D=<%|L0;z9dCcPfC!?NfeBcn)8Br zt4K;n$}>x^+ATS+aaYP%n{|`#k{ObO&vQ!-=yKj0>q^~c$leuqF=+3a&zHd9VIt

x;1YnpOE5NexDw99Ml`mlV{zbEhCCE!*YNoxYuYjvuJCvt5* zz!SSSh7XzB#svOWmte#;DQ%IduN=t1-!cEp$ssbaW_O{gJ3tfJ>l^U{3E5=Xoxfr1 zah~Rti|z<$)3f&GJ?>V6Z96BM7`4#+uLs<7_y9*{0l1;!XxhnsPyXXN)sHzY6{97` zXu(AYpXVsU;AKv(QH^Kl5_>~C1(vByQ-j&H)mepLG0u7>Kw77%O@s`!t3XQBv`lc= zjjJZizU0W{H?Mf}G)`>{i1A5)g*t=^()HxN!$h$p2-+TftE0xsK70m;ZFbilUSFTj z&u#JNlq4|M38BCtNdx4)>l}Bzx3$Ej@X6lqOFL$|oB-fA4L75ne1A{TqLxDbSp0yA z%*06!`V{X!CSTAK5PXVLe8a;Z=kt3QT~_|BKl8JDpZ%-vzvBBpxO%u4BK+;Y{Abzr z-5Xu!J7)avZjQ@IztfQ2#?0&A&Hwj^_;xcuPH`+wo5qiex8HyE0m8cX+2MQmlmY#w z=lwb$@KV-pIocTWzT<}*lXqLtbzb}X(cyEkdo}&-s{z5&_3s1S-fjOo%FzD6L8HTs zrNg?fN9ylwq%hyN`Bh4x))kT}DqE@zbV*4HLoKNG;r~09x$I-J8_J!c3f^bB%S6hG z-v$Xqyix{8T(HhY9!IDH=8Dik?nsvL+Ed*~q#0~*b(Co%+HljodYh_m2T(kAP4>w3 z$596AK)w?8lD(Z|}YK&hh(O&hR}JrUj<};pONKr8qaY&Stwmd(F(u2{1Ir ztON*9N5mSaLnY8RW3~gRWV-QcsI8h z44pw%309d26tg=w*wuHlTJDrm61A3)N3BghJ10mTmNnR_f$FWqY-ux*+Q_>}M}2&tFnjYc}Uk*@$yn2V64a%|I=$=rS{7 zHRr^7)v-#M>2z!XRpkYr(<(cME!W^3qxmZghNQ*YP1H`BHQ_Sh2aUt&1CWG%ukuFi^ z`k0*NchA9Svh`v!keak7;ZQ2U_OGZ$(nOt-H8hjDjHjk#;6D4Bqx(q!Z~CsYTzlNr z7k7P7_kQmxjoqywDPJc>b@(s)WD0%PwHDV4eEjvjvJ(LOCgFYpe^0R=9+JH2V*`P6 zKJ|qUC??+zP3hy2B|pU}z76q~f!`^9|Gz&vdfY$wjX%MUzxU}I zU+4dLeZ%ED-XK4=!2ZDZ=fCms&KbH#PJd$UeAw~W_Hn#_zuEJDECcv$$K<2+*f@HQ zx7hO{T?X*m>VJpln%HbADOkHw zsWuXP;Ko==9epocZ*S(!=V2&&?Z{tlMy1b9q9$NYH%qJlgZewUe@ME@+;xv0YlQ1S-Ss8z%jO|jQjn!l?^0OR5T zQkc*{rGP!Agq3;RoPd%A5MXZezvtgh_vX_d4a}avek0hhL|G?rXl`6d_E>4g?*3nA zs}1eaUEBfg9^Sv%cuK9XD)-g4B%DktZO|1u3AC5Y1!-OCF3!ru*Mt ztB43CjR8!#1t8v-&Mr`Z+lzD9UU8wy`XZ5s#My0OT)~$=d&VcDbDdXwao+O>!+5T7uCM7d@yREju)4T-?Kv#Rl%20^e4ZAJ%4rTq^|diz z`MoxVB)b-{dw#NG?N)QD`<{}(+%|2I+`t6(>K^l58Ynrn)0r{90JskU@9GWcZ{D`m z12!*h{Hg*u8Zc%)`$UT-G{M4cdv9%EZA`hVPNs9|9rZSY*sV{coPq)Fcgwin%MzXX z>mDF)QU6V19J5F$G28Wh+X4QrLarH?U_7g5XaHj{N7;=n+Pu*vYQoxBkZORIs*0=O zRjIW$-{Hzm%+8~ax8F_UO>K4`(yRw);P3S3ShfUAsi+C1)&}gRVDYNNRHMY$zo_tN z(-SNl?K`JTr-DnNR;N^p{;$%;#e^rF{nzW1U<4umJUthgE91d99G4GQ6ZgIIEZZ>J z`j_ow$M=$cU}o0e*-zQWey4HYIRU`OqXB)VoyJofhPT9k)V&#F>e~>K5(!Qq@COuA zJCw!AX?+Ew>SoMkD_&2|^_t`)CXPV546`n4ULyZ+f;zMWZaGEE;p zQWARJ3>7=r3~C$fb87lj;Db%6JIXwtyRjygz}R%SHzvSxbN4Xz!QaEpFdEZiA5cDg zetuZN2S8>d_&bXzB^;P-6E?SWL%S7 zSfwjmmC?V0r3 z>i{0AQOZC~j?$xJfWFBGlu8wl#-toe4F^jViW%+_-mtZj8mbTgY{+2-JGjlKWkr$! z})QW3J|qV4cS6BuY|cY+j@@xYF8!OJfYC9q8MjwU84fW)5xA zyn@YhU9Gz$oWUwx*Hc|628l#Y5eiURI=g6snRbo^f$x=}Z0IY~a zyGY@2oefgz8A)u+xEwDqDg|d$C+9Ahl*Pz6b=V-Zzr1!nf8|`8aW!oD(T{$@@1L#6>orxB?NH(7nqF^sc7D!xK7GdRcA&4uc>Mx1 zMb9pIIShP$^_=1(zfiu%joor%hSg6od&;x4!Ssfqj*Qzgelpzha;)6C@#4#$&<{8K z%6FgAc_!tv29z>A{k=6uwXp%e6O(qg0MrKd&27qqb*ieQq@)xux0{9Es`w1#=G+ zgd}uh0|x`wW?sg z#XT{;TU$yfK8%RNs_!Xfh_TEPr5J-c-6xmSb>{i)4WDjTl+7mOt#d|I8AU1G3i>sh z^9!D>&gl_uHn&{aK<+!Tf!=PoacTXz;AM-Ik!>NE!8xOK6D;;I)>k3<6g zqwA1Lt;ssD9oN(XU2mlBmaV^{ zP;oA)L$IqvM$ESKoznXm!v3g=~9c9D$MYBsJ?~`ql>~w%Rx|V{->}yamrF9p+A!kY>h}S`)6@ zB^@q&E2m1SLomtq62>Ng2|_e9gg>SE7rR&73pDTJM<)>a{uH9zopclOt_jT<={nF9 zp16z4%K|u)RK1fePU zpm|BVG(g$M2K?^8#pW=Ih~sB#YR;$`GFJNAk=15kwXIwf;r5fWkYY8XLs98*t8Ly1 zc5iAGEtBl57?OiA*lA*vil!!+I}|pz1A=nCTC?qJ_6ki*62mcTBgRJqC(cuQ)4y?yWSST-FQT>XmYJBnX`}}~+v(Hv|%DlR+)Zs^rX52Og`Sr^e zoYfI~@`R^n&$#wxeLzcqXr7=V+7k5knX`Abl_`N>pKUrN=uLjSux#n!YrIPkkj414 zT>I%AZTGM|?jg^sHLh>cq>mQ~8P>S#ySRnaCwoh{~k}ZJJGK`oRs|KvAD&yn}EumZ>8Ip!%a`i|m z@j)r$h~lif9%zI`tB5<}aJ!etIr~N94aiS1Mh=BiZX!7(WxAY50xB7+Mrnznvr38w z%e{()-*AnwSvBLXjOLWlBN-;A0B`#a?K{Q>a&OEbbCpQ8>E$yYwNFNB)M~z^89GbeD*#!b*zS0v0L+d zpYE^qk^2Y)hsqE4g+zw!z2ChFt~j;HIaCnejrlH1?!7MN+5LB}soZnlYpM$$4{G&Q zqk$;A(({i{5G_T-JP^Y3rA{Ly#7UOvSs-hO=S>-X3D{(T!3cgIl*+vAS^3UMb`a*P3I z`r!BPTw?X77~iCK)kEO-aHHZB-<+7)hA7%L*2V(kSYf54JlE^`Z9-)vdm zp2tSC514IGF0di->L&xwe>iZy5>{Oz=kQe&@co9p4C;?PiUe>q zC)c#0Gd1pbAv|BhMX`Z%y7R0xb&40ROJzH5xt1+o3~-ea3OsHhC zBx>5C4Zy24n5B3yqmx+(8hgkDyVu1Ac=MjrGy{@`fsJSx@SG7*NIkGqADRBXT-T_> zEM3}|gz5*0P7MgY4`iFbCC!sMv$QS?AX*@RB~i@BMf;3rU^YqR3ZoJXIIDD0Iq!uP znbfV&3#C67>Nrw{k&K|O)X6VZ6>&pVX76FaB9U1eh+8T}D`ST9^E1};Y`(an4g;$` zbK6TWC`ZV3S{Db4uDXC3NfT&?du7~~nawPwT&A8|8@RpMGSm%KjaAL8yA{vYJzck< z?~L1R;pYT&b-~u*lI0yvo7=5cfP|KcyjiXTDzvOGRb|@lDt!Ezrv&-vXoN>W-s9T z6i}AZ&e5-#!Lm4q?|BQ$L2HcT37O|bdwl&m0oY1)$WuRVvd(UxiH1*OZnNISl=$W) z#)Vpg?OLdeA`}g-z zo~MgX$E1|#`#xB^79cWS5lxZg;32y|)vqG-DbYzVm7Pi%ZbODyV?0U-L{0~SkhOu# z4ZA=hslrA`T}6C_)mR7B8lb!M8BwK{8Vq?+$VzERfV%GJ*Xu~28%Ks=VEghV)@5Y1 zBAu^EmzSiJ(Q%-Z%J}LfUYiuZ8KqXnqTIaPLRZ+XJ1Up3UIi05ccim3I6H@~LsQ3X zb#n7_7ZJ)(VA#ZXHWm_2R|{$}KA=jKL`ksDXE9~8x+bSR&-cStdDuSg8)4_99N$0g z@HdBX_`68n2QU zQX z^YZBh|Gz)=$KUuG8Ten_-hSO8p5hdzc#rWR0hV7SKBRJgNM)Jgn*^F3V*u~hufKN8 zHz_{Ew(>SZRVeHL5qF_FSatBk$~!2T;o3-YNv|uewpTDJSrVI};AFb4W3$=Pb&0%6 zlp6LDopv*GCG~4e))em$?b&VzZZwlu8TXM_w>Ok>&e{4IPtF`KH`JRgGK_RSsGPzXx4v3s2C4qhdGDIN>hEm-a zEZ$FU>cFNNueOyJ=RXZmEflLaW}!uvPR9w&rx~;h%Ti!IClTQiGgW34q*6_<(B2h7WZh>k5}b*a`=T zi#uc4BHAJDxDkHQ69}B5&{j3Pk!K*J$=OQyxk?$yYMk{wm+Q>=#W}qxReQE-=!eKCz1tZq%1IyD6dsAdclwixMb&E@4K>mIhRuAxtuf{fm*LM)ho zo){fQj6}5S)Mt|R6dSp^-OzO%XJ;!mDKkjNt>3aK70*yaup*4v=*|;oS{a8e)Gg;W za+!?tyurP)diso)&kLX5-jHqJ7cNGAb-m$dR>FC=;@Nq{8OT|&XDeRS6<^pH{R`#h zdH{LCC!bs(RFXKKT%2=pcF9V6Hf>y(pS204f&HqvDFfKv8f+=2tg3q+!4m`cp*RFj zCqPR@XBP4FJJnb#Jk&nTD_#j8)560S4YsdY1IHSFzXD}yXVdk~D8(3y1I8g0lx*Sdlv1g!Z)*+)u#1p#u++P*i+=Bofv?JX zy~ZVl6#h7ZHA5_4B;T8}${i}sFm9n1R3T@j)NM#zqs{+%lJ%wmoI=To)OV=lrg-95 zO1K2mKc^1M3agI(;tUh0HydPIK$Mz|VHg5LO$q7Oq&|{n)Ie7qRg@}%cOBc*k-HV1 zSC~0PQzOuIku*{(gBds5%I11Q|H&o!;(|^iX~6^}_oQwOU5Z3QHgXcK4?_Cqw`Kd44`=KhsVY|AkjU4;V zRc6ZvG}5G;mQc{k|0MPmd@BE)?Z9^y znT0!(%C8y6Oi17PF!hcv@YwqK*2m-O|6PMZM**BiGq@f;|J%I3uLDNOvG)6po43qw zymvEaj$Zz#N9M8P@5A9q=P-28C-`Mv9P z<~RL4@sag&?Dh{m*ni3~6>r*C%W*FI)kuSDe3Yl%qY+NYx zhz1bg3}_A(nW{9#+fE8J=GK`1vdo;Mnf;m&GzY`eJpe&PNG=3KD>%1wsYA7+mNSM; zV!TakH_EtGw2Y8fB+VplQ7eqT!7UO;>Ne!7(Vi>@YKajPV}F%aR?GbO8V(Hl=XWd)=P$sAM}hhTUsf)qzeNIshc zi!wENXw1WJH7k~snv8;TracI3WJ9U9WIE(r*ji?zMk!8~cnuA*Y@^0`_`KRmsC5K~ zE|4|clu^Sg*|;V5T>vo^aHW!XVU_3Gk*B`qIwi(UW*jRWhG%EvLPgN=mLfg9jC{6A z{Ob44`K5Csb4}`uS2kk9mULU``Zc4R@#TvfuAU2*T~8+Qb5Ea=vj(7iwkG!-My6Cp z>t?ssB3OhbJ2rkWs9zt$CNS70hWBoyX~zdM)pZH<#xEwe_p!Nal7PNXt~{<5Y-~ZP z-njbBXSbT;(mr>gIPqtDXE8vkQ)&Rs)uD<}B)rf?pf>O0NMhN4T@UhX`<*be+eMag z;jfo@dEZl_%fxQ2wW5|#4W_zQ(0;`P+nE`qDbK11+6AO3?$oh>6(-8Eiqqwc2v{v~ zTrDk`#;7SFt2H@ivL>uT83xK&7#o*)d)CvhSLB?rX)h)z)nFV)23M?8^7)!_c}}s) zP#sMjq)gSyn0u-lW6o^EkXjH)xC-4TPcfJ9Q};mH^Ei^VLp6~vp9J$5NZOG_NDZ_; zcSDjjOOE(#W}b^8)fnCAl7^{oHByDHi#|V!BkMCdhi=%yE2EYHwqX;Ha%SiZB{eB> zFsn^s+)%&!-R?dK=p}o1mJ6@*S)6A1jFhr8pYgbYMV!QlRg+UY4y@lN7Buze5X zSO4f!`fj&iz1(|_D zlo$0o46E<)>66b`Kl=lG`yuj;vPG7O}N0?*{GwDv6$*l&h*BrW0?qZKwwuI6yiBqit9R@R)QY`3kLPjGKj%c%k!8S$F5idPP}78DXe}(meeAYw>*#(O{HS@&f$b1BVyPOf-O3b89lJ1?d2) zKvlmgn!CO0uw>GTp+7D%u$2iZqGt@bHcQl$3>JnKF!^ z5^Oq2jg31=JUdoK#2vLl!dN9(cfwg#x~zQnERm@6Wy@+akcTaPdkaG$iE_QUp|eD? zo%}6;T6mzc$~cqsc*vW3f}$`;Fq}&l2?C?Ti|ZR?bZ$3W%$*DCDdtEO3W_HoOG0t7 zLvy=UpE@{D>55i%sgb#C0i-dy(v;3Z>H-o5+ zb~}0MF5B!fdEN{v;d_dB3?W`|htZnow>hQ#E1#3*>V1`CwhV1!s&+N(u z0;|Wkm^1+BVCzpr%K+N$TOUkd`1I!l2Fm2$Z5D~OOXg^+o1CMqjW$FQ#aMRr<~8J( z9mH!W3}^{?d==K0m$<_1?Jc7ubfx4c7o4A;vtFMw4wYB0Ua`H|;O?Zr39!+tw?NqB1?(#}QSlT}%-`tal44%F>Ha!4-7 zsw1T}IYk*ngsfeA_QrVq0&C3YZq>0`t-vbdc0(DqbiI;NhYHkjL~5Z!Fo)5V(JDD* z^lU{^LHh(lK?)&l-A_pfM5}DR(sP?!w97Yn?>Gd3eepSW{QXVB7l{c=7O=bHDH`F_ zE@z52JLZ1e*>bJGoRo9|fTw8S-8cP(>=f@eCbnhD`J)2YP9X3%E3DR#-ca4iL!aUl zr+BmQkQXwu46e0`B44BfBszIP`O{D||t&3NC}KNb%GqIYd# zKlIxV{a!zYaIZiP_LMudIzut6DoIyV-I8<1`sq_@J!j07_0vy~6851N7P5#WqhEy- z^mZ)hBngNhInl2a)k^jNkgLDsynDsdr#&w=!i$@V=O;Y9e8T#|(eq4N3#C5c^XtUT z2tWL>vb|E0C(iOMmuJRj-#zD(PdmC^8-Oz<#aaLh@0KSQWz|l`2g-hk{rxR8?Z8gi4Ev+C#5)l5}jFU?!IHL z)1Al*(8KOrW;_6LzwkX?G6*Rj>>$Ayr(eGx!Kp#0*XS z48AU7A7njfW$oSYzV||19J2Jd-Z2biW>6QESyFll0?)wjT}m0d6YhO}2ttSmViUj+ zvbH3_bB9?x$DHOEl;}3E=v6uIm5VO(q!-R}Vx>;T z$n_Sr5#L@-Fs>EJco!V(N)SDD?PSjdMj=BM^Nu2X?!7#$0$_2Sc zxudVfXcu&1sBh`7w*2T{zv4$y7;Plw%+>8nC>Lx8qjm*WE3R)c z>vX~QRz2VSYz?_^GmO+BA-UjGa+a1{p*xV$Qj;3594c=u6=Pmo)3N|D*@2q-34IT< z93PU7K9ta%n8)tUXd%Izl7lOy7Tlq@QHxV3jioG%?ifx%LT=fEIbK*u;L@aVxVaDWrk%xvc-WB^yOdIZ+p~hgWIds?#CvLWYo$iQNCW5H zjWUds+bx34iVN3e02R9Rn)CIFygs9@R`^iJeaEOuU9B0qHKSBUgOXO!9CFCFR|yGi z_g2m>2a{bZ>1^i*UCj{^x$BXnm@48zmvsiN!D2j_n7W$DIdgGw#;WhQy}sh=%Ym}l zQfr~hYu2ld^Yb%u-_iFyIYkoS|DU~o>5(K^wl%R&MAgjP!y_`YYCq22=XLvb1N{I2 zf&gbdBS3%v`Lj6YZ{U!Bfn(0d838uXjlO+vpU2(%)UI7wnHdr8ZlfXqyVv_DHc(~EiJT_zN-2A6-ZM!CX*dRD#*a%} zZvnH4G^nF9j~X)W!w#(mvtgx#U$PlWfYvF62XIJW$N0azrr);s_{0Fdcux6{D&XV! z`8|6a@6zd~&vqH?b)LmB(MNfXGx(c&zxHnVpb(&O|F&lU7@oo3=lE9*H^XX0hvDfD z|BOOXB8h}w!E^j1!YwL+*UGPFpWx?sj&F#ydiw{Ec>Y-Y&F^-+dNG~;Zq1+c{{6%6 zf5X?WZobog{twIY-fN%E#(QG>PyG7lHQmoUo|b6-Y2V8}b$mSqxP2R-?W6BMC1L&1 zcRxLzY@g@h|D%p?lGi+6*N^wn@0|_)J>NgR@8kbu0PU&qzp@-U0I<}M)pSp!l=$M! zk*iGw8#x{v+}Lb346f{#g;$?#xj!5L7>0pi+|X?1>S_#MI;mteHd9Cv=9CzQ#!~iN zjSJV)Jq$C4{eeI4kG#IkWZy7OnZrC&mRp9~JBl@yV`A`$Y>kxm407bft6wo~6bSYm zKJ<2TobaamX#0L*1OJ?q8J^?cJ~G{dy9KMaxUnxY_xnAEW#*49V**tL(}dl8lj4#wUpjM0NE$3LbL&hzW6<#2RaxioMzes>ObkzB0BC5J6^1EI zj5(OOQ@Y`B568VS-zBVUn9>$WF(xOSSW1NomL1U%^-Zig90s{!Ojiu~ie^GGW6+pq zP$89IN155GoC>ZdpegARa+vBkiI!T-Y1+`tx0*mN8HLtaW9#>?z?Z-S#v$w99xtAl zt*S^$C#$YF7Ff+v*Ux_}9)k!U`uF->X5q!U@|Q(ZFt>>|8}tkS4jLfnVV)VXvfFOh zZmuY;GM9y=1{jz6v8yV-ez9ef6E~a8%OSDViY$Bla7UYu=rSYHsLO#`4q!%8@FC#; z7e}GCMzw;b+JekScGF)omj%WyLB7oF za^lrEk=^+H<`q)!5IKN2hYGE3xRO^eJFi~6Nsq9bna*PkmwSBaaIlMG}$%97_U8oz(wcKl-6U z$PY@UuiwAcU$l1W=PMg{4YL4wA(+@=o$c#}cM0m|QMlDS0MjN)!#V(Lm?%ww#>vxr zm3&Sv6wX-qnVlTZHD_SkP&DQd_tikRD}KvIpD_dQjXt`9i4Pd^W}xXk0Q|D8QZKM5 z^TK?%5Ab&w5QjV}qCqyhpBJ(unhy9hU_+*vabFwWj=_*l8NVJ_rST`vXQ^+qxYinl z9x8^U-VV)>+M*4ID3YtKF{P0qWpc{6H{2T{p^D&U)MJ5Mv2lQ$gT-ux+Gea4uG@gr zLOI;wZD2|-n5Gdi=V%LB7ie+)59%NlYYSz*3%0K}+~R$;hS!kUHjR1nW}2wpSmsJi zm7Fu1F_V)*$t-VPg9W2INhYm;ygam1_%7h@$Kt)`oDaPAjoWfghuM03s)*a^mLQ}D z%;Okq{y;5)3ugK+9sqW;U@bl;3ZLU&G0Y5VJ>6h`DIuz)VR#->Ke1Su>-2?~YBz#; zj_3F#$Bz{By^R0n-@khB_ka4QcO2)BGj;!m|L(v1PWuqxzpqR8#XHAi&#@0}_p$g` zWpMw%C&iOX_8;7%_tW~+Qx?iU_jvN*>02brJ{~{xnE&`a*q&fGe;WYjqw!SpKEbek zdi*`%(d*xQjO)YgN4NhLr}xqCf8zaMKwiH1(LcX?JZK+(^cx=c&-V}YF9-NT4wP>` zi3{e&hrZL{p@*}`d+mMN_M7(Mr?mZt-uwt~+&}STeaJTh%#qlCdi#&XQ|cg}np8U2 zJ=^ITHK)}hSsSG})h6 zYYTZq8}KS&c=<{3{obEGb$R5UsKD`kFK<3|{q)rQle(m2WA(umKxutW8>)rGW)hap zx=gB!)=R5wKFbzM>Y&Ft-MhEMu~hEnnYX2~x5nNYhbAmGky<3KlZEK9dpRZh>41re zAW6^!S>2XY!95#zGYcj^I*%^HAe_K{SLJeL?z!$50_S^!j}4&JP6>(lk?tV40!JlfkD zY7LYC+}ykWW&GQ4q;(+30&o@;yc*S=Bo_UqEx3$vyt=Zw3^{@Az8==;*>shuwUtTO z>|vk0ICg;Sg(3o*iKSMO34>&gwP9Hptf4Znm?JK1^2B`qCHt?xN8I)tseG}UxMPGjl{COKB)keG-*9Mm4C92Vp~Uzp%oH=O zUtP0lZy<-Hay4Tdg`7e480^#x+rJWQH1>aV$}%%vT{EllA8(!C?r-`1Z$C%3aKGGP zW@L|kxa{wFr#s9t)khj5O>*~YZiqte1y5Wu6)zdS(t;h?8LU}DCf6<239yi}V&3Re zN_Ur4YOO47EgBD-h?NWM9_+}J8X^{RO;-${1HsJ%H0C_34k>(XOBEI?7((sishx1y z0A`yzwHG(IBz(}*ym?}@ilA<&hfa~7{Ek61p(-3#CTlM`P)SiR(u+t$9F>G>3NCT# zW4<$$2N#+UjM5Y`<1tQy;qQx4F>=rkfpY$duM-IWbHd(hyAZ z-!d^VGO`?EyTuxohnVL)3ODw*Gsk^G&B?{!Xym4(D`iXK&;R*L7&H0bUs3Zy znJY_$MF;$N;Ho-W@1YsK-B70&fU;~yHpQ5Z1)D3gSB|NnB*fs@_TbLw!e~Zo2V@-4 zX~I>}%?4WvURsn$EHh;}Ak)BZcf~Q~_ntoDxzira%V+lPgEfH&tya{HoD$xp$xUK@ zBW1+T>&FN87+JyE_lqmm<7h3`6-jfykLc+;)-e?0wEx{2Sp-#!`yRjG@YbFsYoFtL z3u}FGm;QBS@P6zes^npKX4U@`!~HA|{mcq}j$dN!5{zXSKnzr|5aX6bROTPz~I|__xBmQ@tV2_W{T*BLO}-@WT3VM>CBaHlGjeF z#3|?GuX6?^UF-s4)UXb7?Z{bTUI1Iz-`$10Ty@%9INlfLV?z%f42|ZP1k<9mMyVAP zzIx|ey-B?MOnLG73vOO2<0Oc_Lxv-D{&%Pg&5fiI5`ZlvAE%s|>mk^BV$5kJx-60Wu;4MmWic>O7?P@dy2k8)zQ2`1hjqc1!z^N0}uhZ2B7 zCfHZ*jt^T7wJ^^G^99p{;ViAPl)~+yg=}#(iW!T952mB28F)T1*B*LxW>g(XtGA~i zzDi9>0097K_xRTCiP>l!R8~!h?{IT!t0Yx+;|7H12+M>uute?Msct!od+p)_YKaLOGFZ`n2h4VbDt5>5$8{>8Y-B$l#(YQA0 zDV3G)aF2SgKp_c^utBs?_L{IGinmvE=Run5C0SY?eG3O z{^q}U!GHO;TMk~RwUXWhi<^taEoT&&U8FN$S5`MY47`vL-)nI3i zDD!j%+VY8=8X%UaGnyhMNOQ~_NddYgi+9OpgaMs0=TyEojuy(YJ7EG1-^FiDhRENQ@+<7AKl zm5fWUrK89zK%kXbxUPfNe)wJ2Z>RCW`M!3kJQhT(N61YeNJ89|Hx2{ zHhnagB>muVwTnI~5_0?FxWN##RwM;m)jZmb=9o&zum}8!x-zY8QVgqxYsi1E`K>&c z7$=>*-)h5~oh6+ISegX`ScE){Ov6YM#fzb49PaN}_Ax&X!@w#f4GwdmHlximl9cVV zVax-jGyDBL+p@u@4Z|={1@7@0uD@5d_GLf1{Jnl}_&=Y0;T@2yq+V>&Dy<2j}gZ z18KbC`mC5~PH$i}5?W<; z@Jg9ymi->D&<=@mr_A?_&8Xo6H!9hcl!n-@#jzw+j`z-T6mH+Z^{d9qUsbMN9J$&Z zDUxv?pv|acG&xI|IWCo9P{wUW9r8E?ODP*zc+*W&!e1w}9ck@|&x#*M1~-27>WaVn z+bwU#jFOm-h2>DuRvC06X=c#Oz2A`}ha5H9y)su&7{u2U+M4_mtOIb>z|#R-X)d^R zwunl!vluWwb%j5*i+o!A+Ij-B3TXGMCOS6O4?Ky5#243Z)j_ zF3xeDIm`=3Z@3B-;n)gGEwtJhizdM^UdOVDon0J9rB!iIl;;t-L(462Pzs zB2F_8FGbJb7E-IN;Vq$Ac(wgo%#5WRNhxu2^@{EGikvp6W(MD$rCr@HZ&a%s7sq|( z?N^n7$;{O_b`rV?lQFqR6|-Nkyxe?nt^$@ zxK%_uF~cPQ4~cX3W+wpn@~XN!>cJFU6ZPWf_r3|A4HX4@__oG83TH21cL~p9wO}s0 z)67U7eZx7k%N{58?Gfm3hV284{-(R%+9#TY9I74exe?)aFShtNaPY?LjajcKr6AI9 zEsRO|{NMc+`^^>a{`_a&{OJz-k4!g->(4jbYzOd}c9>b-zQO)HpMZ~ADZ4`h*PD5R-z0j+YUO}q>(>tp*j(Lsey;Tt1f;5&1)Z5D}y&YYc)X7-qxlML&Vy_AAj+&5fcqlszSVB^4&m3f{y=Hb-lcXxLT-q=o8 zQE1nh`KN1Aqqri7Nr{S`n5}DJo+bqo%t8)2g|PcsKG_VfHLjt>{2WC@1baFuk}^no z@7h1^1MM3y#I+x#M}2MWS3!CYklNf)I|JB#Z^-HX@P5BNjnV#{A|HPi`cNNt_g^3Y z+(C_JQ0h7Ut)i7e8irpUcqS56O1--1IexlfX6GtORWzk%R`7HDbmNlc+ZXab#rXGs z_mKVjAO7L(liU2m-~aAA@8|EIi{+l)gTLP`o&sYpQ_zVfslmJ*uJBEy+jaW+@3e@5p4@xTu@d0Z}d3(gu zjC-Z|6mp~~WA}~M|M-^W_s(v&Q(t!$I5eo7{gS*f1y@yCbLN7JEMUf5;#29Sa5EGI}?^nWIt-PIQ z?&pQC4u=3(TV=6ex>Xz}7>i?<2wwXf?L05W{M!)G?&cH>SP}2cBqOW#aT$!QBp~?7 z{mDFvW1Ce(8bT!1a|%Z9HplbFqyh9^PcPVx*W^4R4CD^xwCcDkwK<1<;qALy?(grp zJ1EEF%(B?|eo-r;jf}!3BetSRLEv4MMls_!H$GnqI@SQ`QYHZ-iL8lHls9exx{HON zbt|;GKx-sb5+lt+Ms^K<#8iX}CYlFO{%wnxLPj?d{;p?W7FIcZ?aBaxXhsFhH3~@{ z-#ahxH@$dd{m^~u@xAsj7_k0b(}tYD+iMPA|Cw>R=kI@ajZBqA7V@%Ve>em~&Y+cr zQ5(f8$Imysd3WT0`XB#S-rODd>%aLM{_Fqx?|E^xVSe|9ufF_(<*VScqC#oTY;m0| z33JO(p(Vw0fb;6XDx@?v72KCDLEAlEhZJC$1%O{Pu1NrwA=kRfLAwZbGf+LPCywj6 zT}6W>?h>z+QfSSg%N?hbU`#X`)f1)z`}-L`?D>_C3`v-qu|Lcl)EUOaVh6m+g(!5;sa_Tn2q&0q#St(2)2S~#dhJ19=V8BG!FaiR z|Mb5V{Dsnt=7glPLu+D#CpAPMRYB`c)z^!Lt`R<(}!!x z6Qk5WTtw&|GQH~2ZmXEb<8jvfTmYg319)u3A<~7qa$3G7ss0Nttwc?DVx< z3jgjjq$o0J-OGA}L38+Ow}$up?OI4;y{%M*?RHC^#?x`%-QBT$v*1Hwc(G&i>J_`2 zYldN9b2p=!ncFe;w@MG=s0L_UN{n4q$OcWqciskLm`1iY*X);td7i_vJxB42_VKsO z%ehdo1rRKCK+QXde!hOKHM}(>cfh`b+>W7gRw!`=J3sUQq!4v*#b4fFeB zmiXg-bNQK7^<{nS#QHUl!Yc`O@cJ4;FA|FT(B*jh5F`IQmp_)CKJW8GMQZEMFAD(f ze!oA(2fgR`X-BJ-JPf})&`bo4aw6#~vNE zmB0S&?!jyS=^x*HbelIXZ`f})-+5o3e?!9K=g^Kn<#-0HzVG;9+xPuci^$#ea~`)-#)$% zVEOwF$--u{VY!2OU%1-6K(w-ydz^%8Jr}vbiKzoUu_*x%3n}CUT?nSDb{R~?Tcue8 zTL?YpE}`0>F1M6}vm6rje!vbHtBpY#d4!`U#H4!!S}?3uFH9G_&7_>!r9`!XS}Xf^ z#+RlXZU=aAB>9L~06()kr5J}Js2X=~mDakf^y17%!&)$R++fp=xD4PEng_O1V$6-Q zZ~XB;-6Q)w$Ll@Y?L^)V3{yrXr`keckN6elg7rsNF$o|?74Ndp@DNmq<^c7!y^)<)C!kpt-Bqx|s zX2j7931u7-Eyui(v)~&=(!@M3G$cU_d^&suxLfu{9~*L8p)0gHCg;_O22H$pDu83@xp`t1AGoZhN}A z7u{<0v4wtrzbsy|Gx#4D@8R)0jzs}6ED3Mkyyh!8^81^_NaN;aLmCQKlZM>(0$+V~ z&li7w%iDJ|PU806!hWvY9~=McKYl@L@OOXxD<&OT+BJV}2SgIN7ZxoRNVpU1($?%G z`P*#fP#UFy*uao8)sJj)1}D5vRUi-12TfQ8PGG6#F1KuUVzM5SQu`uEk_H>HuR&sr zq!W|xU;#j;1jC@Dq>L`03F!bE?)YIroajFU=w;?C%fhiN|I{0OtRi~DXm`KYez3+3tKjNk8%kCm}`8pHkV5b;&q zJPO2myJ$bZ6H|W$;re)22;kAW5BRztiTU^OF#%oKA;4ejz%3qX1(=|DZQF!y2J$%K zDrhxiHi{Ic?S^rhn9|BfzE}gM0DN=KTB90IA8Q|0p-|J703Lkzk z0I)p+P|xv0hWm*L{7VGOv`byIT0c0cKF3cl+#RnqQl!t!;OF?U#KptGI#-RG9RaUeliv8@T3~s~2OikiLGy%_cMMCK`q}?Mv~7*_l;z2~6lI0VM%$nqZAc zsC70@tuwV9@wNoO6m$vP1SvCz+rqLRq3js)1gT*4Kxqfi>)2nXJ*swQhJ&c%c7 zsdeURBW$LLY8#e+DjbJ9bh>BUWv)Npa`j>&Z-hLK*fM}BK7`M5ZH?AIS2=61YwO|W zCrQmn@->hv%)n&~f8mu12ptvrY4o$__{(C{V2lQR^_+Nbof$jtXO5+^KUVG*xGTn8 zb&j5>BvPM;!qZR~ptJWB8qocCT@0nsB!Fg37BbJNoSucuR{7`P1&SzYV;r9tf|KO@ z%w*O9N>@NoBiKm-;u&w5B$*)%U7oc?0ZD`EHRNt7m?+YWcXvnr<%>V@#TQ?3*e`50 zS4^ogq|Ash`OIhytqa+VT!mIDPGcN1F2-iFVV(=)<_b{$^KQ#H4KNG!u;8s=t#X_T zdtloEu~qW4^}=<{6DcK1e||CzWr1LUh5Y6U7(4)1A3sZe?A{ZoP{>braMwEn_#`LY z+gC(8n=b{ZloXY`;<@MDJ$m6`G1dDZl0W*)dqqw@Q;IQecG&h;{Aq9e5C3Tf8lU}k z$IZ=xinGZ^IqdoJ%Xj?qAHU-D+aoeuVav?T&5qA^SKQsb;~)R!f9CD|m%Q4<utq zt9WfBb;cx!4+w%4r`G5rVjTc8m^)B5Wo6I-**JN+LYi?r9ytz58wZj>F=6qLTy}TT z3ihM~se1rhAnvF89&w)#1U2Q50=P3(swyoJ+a|?T82Yh=r)na506M8uhGOJtVzb%O z+JIP$ts#XRbWIs;#+a088VM0ZV>@J$4lD!wxwg2E8fdj(H#f(d(3(+_q18Z~tE(6M z{onl!uRgnB95eg7d;auJ$fj%|PIvXA8OK)|}E`t2k}-{_V_LTfMV2 zqwBiHgIO#W$M=B2{Adis?}uYVx@>a@C-n9^eIP*p53Ox&Ws`PrZe>58Kj05OTP;)= z*1mb#m&En5R--_I6?pF8Wdm#VR9uvDLUKl~CQ=^oW5cCzEDcg(vzZvC5kpV1#UjGc zq9`rr%$PUf9_-F2BcqJm&kJsesTPtoq#4o*NrX0pwM8065>Q&qcf}gWK;CX(X;d>z zgp>!;FktR17RQiN!b?SyBC0H{u`Ekh!!W!>0b?TMvUM1+oN%JR&*fb3V!h*?`l%VC zD&q74#tSL^qztP+Z%Uf~7Npdy$Z>6^49d{{O%+t$qLUb3cCo*q!qnfcV?rJ!Jp>(;x1h+~&>8>%VAUH@}cJ zeU9h&F~twh;QVPnH$AoV_)z8lb9{Py3IO}D@BG;7A7XI)r3}lT3Tk|K#|Mk^EQ z;axf=!CWXy@T%0-gm*~c77u2bFM>-6mY*4OX&evEsFf@Su6Nf=yNN-S_IBaTyFFj0 zw~U+2)%BK}&q4}R#{lqDj8b7Pf_r0=t{(VsHk>>T-P_N>CXCKb(Iq4aIpS1ADre`v zZ;Bs!{{7T3@bjKqzexsljg-5GrMK{L^h7h5Yo*l6+uOonDcmlFV$OnMo`Ucsf|v)p z%IgW-06odvrW`an@0!wS_3uq*#&JlQ3Q2=qmGg*74(68x16TaSWju|4BjeqB+ew%k zN)#}tPPk>tA|&l{vuX?}qnc^eDOQ=`B=Nc5A2}W?t+SSM&b;&^8$i7v$0OPnhUQ4C zA%|)cP#G{Ka^GUVP5ADw7$L#ptpuAu-&&i&v)UQXM0qX+&hAS;7Yi zU`gpdqjCbTqyrk!KE3Hr%&&g^#ZO?-hx&q>1<}7J@Gpl`{2f4}ik{?nRdW=tJQ_Os zaPt81x(BG(qrP|n0Dq`ouAkjDWATQJBh%-UF%L$Y6g9;wmCJo56MQVU+gGfyE?p$GPlHi-n ze7&WX@JFt7!CgY8Rs)Eg=Y^CNtl?J4IkDUANJ+T8zl(XL3aKPoi|d?*gu7E}uzW$H zpL&2t;=PFD0{)32l85~yd}%vKbpfn#0kExo$uGdkOAp|+=*)4Xf8GSV1EIAkrL|yT zdPq_)&8VFjZU(i6=Wp%j(Jbz>?i#lj*HgiU^nMiR;D?poJ|vZU*$$Tg@ZY&4T3?gefV;JriA z%(NRxHuK&wDXXYkkEaZxnqU^@$h#ey(=VEyu-U-)?+ABreU zi8;V)!>u2SI4Pwl#^|3tjkON&Ix$w)v31%-KVO%a_tzZzW96btp!)K7E|33b4FG#< z!8m-5=lGF?_kx6!^Dh$^6NxII4i-Mg&o5Rmn6=Vut+aZUihhnyiFGma2=M)-#_xV} z_2BRS{KeA%@LwYT4Djk37PwC(`G4rq{zLEo>G-rG{E$DfJkRmH#mD+j zJVgH+9?VZLJ_eKq0Q>1P@W;OYaRvN$oe#cmp!ccc`P6;iwL5k>@$1iTc$u#_?2ml? z)oV)La$_4_{puy=3(Yd6hV5%Ypr!^#1YkdvT!zkVrlFN6{AyQm|@NgW;xP3`FwXJy?;oon@=5k5Mq(j4U~% zsR;&UYYk*U9i#>0MrFiEA%7jO(CmP_p=m;S3DqbZX?mo-F1&j?qv}kX#EY8^o9z|J zz-HkezWPU|O=A1virtGH)71_cN4&sNjQiVOM4}-t8vb=#^02{x%7WJx?didi6bd2> zLE(G~0Dg|2a@@}ESgHl6VZvg5y zQHzNnqLeQ0ocg16u*n>i7$xq4N+RWfakyfdHVk_|`a_lhkK@d={qXxHkTe+94_ICD z@p<9I5?ehb`*tDE>mPio_z(!ZHH~?yR^)mlT~A;Y706c`_J=FJ{OA9`+q%cnhLJ|0 zV7VYbZcf`5jER(9lFV>snjAq210zW@+aWXNgm|M`L6U^ubkeT<+j@J1J9@Lmu{B=a z&B(9|W@2ek)H4Lwrmig3Xnt-p(bSte*uN#qiK!d zWB+cq^uU|lH8G&5C{ba!7@? z6ucNM8$QBz*wEZ46t2dJ`}qhl;4*?Qa+ld-k;= zNy*L$#Ll8j)5JKANRGm~`!D}QJa!>PXIUjaL9z zRX^C4ClJ(v`70Vl7CGmWdVr>MTEjI9AU@~l2bc5flZrT=}V*Ut+MO=+q)9SYT5A6Px?|y`m)b`s89Yp0bqY-{XWN!H@tgM|B^vq z%^6XBmW2KVgqzVGNx_^XVSb7I|2aM$9{_s4shabb8k;Hc>cw>W+uZrnpAS!NcifDB z(f)Sc_|Oy8r;gs|(f?_oPqg4SJzW0l#rM0$ej3pEwDWuV_VZ~ywDIvGx2MiepVYZ&@L^ghGoD?3`8>SFDGt(wdLkTf{if`pYiUl(CP$iSgPYz z0;u+ec*ENP)gwc0f!Qa{5Kqj{Pp=+6t$^aa@%w1L@$Mn{7|c7d1WUsdiU?I4@BY}?gBe&jk~J}i z259QWjIpl^hkE2c?>E$1Sr(&~hIK|SWZVV@nQ%-F-NnYseAa+s9wqS1=pJw?5;lNYI_qNk9Foa-_dM|4JoDvL_^ToFcQk%0NAAjN zHg5`bG6o&l4w?IQU^8x6YQx5fr5T=&+>9IM{hsujm%P5eXM6oQqKPFnj#t-+zvXIq zO>P00+v41%8}9N8-VVR%MHz|I^A2HI75{4@dgDQ1czX|NFnejtj5Nm~vq+1>4{9 zGA(>jH>6?05Q^QR8O9+o$b?sAM7#H=aF`dWHLRV-SQC$aR-H80C>Gje5M?ScpWoOU z>}F)Y8(3Q6s(}tr1j0?Y->9vhv`S})Ha7c0(b!jR!i;f9&fv<;(KrkZwGvXVBGeqL z@SL3Fdj`8k)R81qGh97>JQ#e*X69D86-N|Ot!(PZZfc1A5ua|*6m0v}g0WqiV6BlA zUf3;zPW-V}{^hu5*zEYt)fL;T3ArBm)$X?p+YL4-6=M-&Z(+%llQWJJtplb*l4!qL z$$*H`nxUFbbA`9A{2>nktqysfy{MfoFCT!}+P7EsVPN1I&o|y;ns339HiKm;VJBg| zUy9Qtu8Vm{O*a?ZDmAbbcyOg%vQ_3ydUwuyATye03_#V~9 zahZ|XNIoJcDQB!X*EP}9kZB-kLVZMAMv`HEV4m+8No2{iX{3$=g9#bKQWS#>HGFvQ zeI`*rl+=V}DQJexICLiQ%rYCBA+t%bF1&rYCAC6({f?nP(g9&)yLo}5C|^>|5Oq`x zpZ91IWK={qp+?h;)(jNVkdc&WwFLiYuHm#HjZvK36#)!bmWA1)C@AFwgxCF;wBKhP zJjMOA_x*F>Puyp*#wvCGScynP$eWSs9{$4PHDfXCxKQp7ly^tQyhKsKkf^(McZ%G{K(!VU@Y3%fy4})9 zzYGB0K3|jPc#h}znZ=U;-Ve+$U-$l8{Pfd}Z(@o)#VCNM0c^7XYietl&kUO@e*N1k z-g3v+fBKrY|MXFinxh)*-Z{ckuJxfta%Amr0jAv3+r?x^VGj2w$ zm9jKaz9LOVYr@#pY-!^o@oHqVP2At!asTEmw2{rYqZ}pt z?=~7h-C^OY{T=V#9@q?-m%kpEh7BogS>}bqpJu*(_l~QV8@AUYd3VcZN(@(9+~D@@ zk#c)rf1FTBwDG`Zt4y0j%E8KnIBu1U*bUYtaZTn^GMNtWEysi=&|KCl-jkJb`ks%) z&wbYTb_GK6@b3p8@WV0q9#dwB6sZCkM{vX|LP!*oW80-QW;2e9@ot{EosaC7!oIfd zJ?pd@LZNHl7J|Wh+P4XfbMiQ()cgDD2wfUh2#H|m%-@9Q3NWnfqQoGXo2ysc+`QuE z>T@>JE`YeDP>zLVnVGiR0J2g-W%aNQpbJ1+1%{A;mLYts(?~1I>#yFCHMUu5r8(Rm z4;=0eSZ&m~u-i-|A4#Jy3Z%9m^+2LAWZ}93i{V+YaiUEVLSbm2bLBRT+(#ZBZG{nI zJ4{pqlYucOvI$sY7!p|qUf;jt%lV$$7dH&o!-IZekMc|b2pg@1AE%kc$P>q`phy z*L&|@{2kY?vrcWj{{2OyzaBvFI(?ztw^x;BA&1{QKG)o+=2VAf zN-;Z)#Y#J|K_kx6W`izwl-qO~<4c%Nvq2gL3pb`Z@8q)mI zKi7WxULR`bY8>e|>^u%pgp(3}*a!A8+o`z1CHj~U67=cPPI2uw9yKp#dFW_gd!nfH zF-!Sp0|2jp+Vg|*bNp1o!r&mZ=YOdoAqo8~*Z#|l$AB^j^IG z9DiB7x|tsQ{q@`VTWvRwe_6p%<>yu{_#Dsi96$ef>OS**uPr|9K6erWdvuuJCP^G0 zc#^{U7aiBPji-RbB7$>kzEOweOWmC%Yn^i!|v*eY1*P`!Vi_B zLE9?_{U^4YE3U7POydpLQ)YIki-(8mxF_We!^|D(!r*Xj5U7*ZvG|l1Vi^z zjP;1j2bTFrwE}q}TjJiK<%zqS4aaFDrz2wVyjZ3i=4NCQiWRagY-GdRCM-H|l@qBt zV}emfL^JnqZ~1yLmKR$jr&D6w{r%pk7DX9>r}-)Iev*7{0SE`X@jPzVxJ=5MJJLFM zx}vU+z~87xIB&C-BCLR-r;tm<{FLDTkaY9;{_)M@V`T>-!9wIBpCSV40koa=4>)!z z&K4l;4;=4~C`wAo;)Ovg(`HMV7XZjWH@`NkpR9U-=(UFZ>dEpeVKhnyYf>IgQmtYk z>)!^YBUP9;OodSbh{0R;#J#XB@L+kySh+0b=-#w$Ar&mnve{CVIQ|SZ!JL%RV$M%e zQ5wk#CW??qBoqzl=al+2fZUm;dI3UDn;kE=8+N;EcDC@9RqX9OSFf)4)$cZJUi=k# z96Jlz8AfH3h2#E~x34E&|HD_*`^q$J`2DYc%lP6mc6oy;)T}gjsufxbsrRhGBG#PQ z?RMzb?@qweWnWxhJ26_<`2{}}i-^eCqxTWe`=P${`27|5GNiMxW53OW+MK1f?n@l! zZYa%Lm)H#t*@cjIu5AT?jp|U_xd_4CPxJf<=(+^9<}ltf2#@8F|*0KnoW)t)#`>40QsPJ5S-cf-3R@d;E{K})#yp`ZVVVNyOd%ES4eC;;Wk!knlX}AQMBHkW zDiRD*3+eGw`-tFGs3p!nYa)wcwQ<}Z7&_357{|Lkl46}&C8V>-iM!*0a=)kUj|{zN zpteRzEww>l2iC1 zllpwsf3IM$t@q?d1r@!Uoo1g8t?dD{_BCC!vFQ2dLb3Dg$ zJjV|f-}T=5Bt!6dPXAuxn-W8(1kQKZ{zIXncxO6E7K#NkByR>j|J#>b-E6q~`j)#d z-!b1F@S^0r!F5CzVOc7Y4EJD6HS45>&WzbF4$VlCNRm)Xco8bW242*|lMjhx=_$iB zoEQuND$qf5Fi1&g6wG?kE02VxsKEfo zV?{h+C9%9s$nlC+AWKCw(b|l)ic?71Wj&{mT{Ke)#^HXZ+%Ig#fz5Ve7z7qYkIruQ zTN1)t3vGPExS7zLnexOiW^9+pIlOhE_hVlYV$9%C<=pp6<9(P3pBfEY2>y`O`50dKegmJl-IaK&!( zg6($4*sf3?DRX6&ipGR7Pb3*}9Zvv|S?z!jq@<_{svDZkXcDrG!7NT!*tW3Q6w=|A zK^1C2sE8$MIdUvB%twC3J2tXmGh8uRLM_;S$FyM@Z#al?>qZ@KI1U+d$i?4iBW)(C z>?o}=SY|nV$xx2u@dh_#(TTBDvKcvNsu_pl!ksD0xWlGb57=4m5B<*}@btPS&O19V z-j~ic4Y1KVlgoq?SR^V~0$ff&5gjx(5A%<7@jQHK*P!Z@=i4;DiX_~ka z<*?gQ=9zJu*}mG6Hv>7RU{$t46T!#KZrU*JK4-q0d2{$0b!WPo7_KIoL9LDBVMfKt zIxwc_J%b8kKMr$ev)NEeA*IABO&gb9PKp`l{(jM~#CXboKIXx$x^V(EIpy8fdBaU` zi9Xy6YI919aUSj1y??vHKCYm?#O-c4R3t$NM8v4Q~U@D>TE@Xk%g+2SgG} zIieWULb)#-_XVA1b~i71u^Sn3X7+Xh@aK7ESr)FQxFaq#ij!79a&HD!kyf#4%=f|g zm1YbnNAXa~NJ_!}##!zH0IszmNg1y;TwQH2Z`65VK7{SS>Lc7r#g+xr5jqGi?%^pc z8)OJscyBYdEYW^gpC9P*{)$c;d>Ua$U2#T2eSouVR`_v$e1UahTVMP5;nqK@O4{P_{Xa1ih+dmZR`#)XO$sKF$1fV^~ zbNp1}83gWe$p-EcC(rR5@L^CGE*Er^o%`tT=VbAZC#Lb? z!gN`lUI)1dHGTY{@0;R}D!hDNYkeS|Gq9f$pDMBYV~?Nv`Tg|c35MB^{GRu;1nS3& zDL?Lk{B%6_SbqQgkAMG9eSAE9{O9%;`9OPo;^{j=sTEge7zaE%r4%X!#7QsV<@TDZ z?ZBHqyyc63c+GsfCl5DF)0Vk5+`IpwJLWA8w6hhgDXj)eXHCMQJ)tSa!2-0AA%W%- zGbg3+jkDB~oZblbOv9zJn)T(Ovxj5_X;x3x4%T!~)~sPxd&05OT8ZSY8CetKI3SuS zw#QA_UX6?|H~is0-*dg&adWkU3b%iL&3?W^i_?aQlnvEPN{U#>9pX-sOv;I^Z^FmA zH0s{DyW0asnuI)Nu6HllTqlN|(ryZDDl!>)5;oTp=+LDaYd^2lSsKRyP%A4cNeVv)-4NDV_uHkKIVAV*q;#MhL9$3y?q2AAX ze@_9@oi0_~v^k_=k3%Alm0SkK(P(7m{h!Ge zo~^0_HcsR=gDp71>$@ZW^5&ks45ZIqQqq83cr>m_?+47N4h}aDN&3~JSM5<(>1FId8wRb#(k@2x z=LDwVf=gWBDjAWC(@=^2?-r8a>c(O@v_Vs}NpdeMD({edmQhYA8@ zMT;)t4EDDZ!238ZRX5h}eOx4?s-%lPdXiGF0gRRwY+&o)r+F}Ht9$q$&he*03pf>#t-z{3I(Cs>=kuX4va&Hd2)oV;r}4Fd&FQ?ng<9*$8+iqqY1WHEH0Ei|=(I&?XacVba6r7_YnhEmu#hF;DZ^%h?KV^g zdNIj5Hq1PVwN~l>k3^%ZJ@oH*yp-_Hx_+P(0l`-8#UQn0XfYnVYejn!d`M^?yWacj zdqt$D!k1p~;dU_>eDm6F{hps5;`9vsKF7~6thG}`*)Kg-Ht_Q}e~zc(LseIoamf_E zydgfgIj-+N-0-^}%y-@9+a#ASANHPl{k_$PzxSSh=yT8UlZ%ud0l?+^ohSce%KW$O zS)%_rp5r;5d&3-`hYp4Id!%{B&V7fPOwQ_93(SLnRK;5#uUj+3GhmRT7@JbC%A&VCXS~H zNf*uR5$Z`88jme_uFk7fe=a}Y@< z4?#_I8Sdx!cwB(M@;)E}m!QGJ_k@9^HulGv{n5Cc8~4@OS7WXLteJ6=5Eg5s7C@Rf zC-2WoaKX(m3wDkX05b?AUvU9kR|(fO$qwL%2XGY%m8)NABIl7!-ZD))w$qkT2WSKX zOTw$MQ9>TH7K+6uGsiSod3pgf7=FR{ z4HlNmN#zys4gjoU@&t@2+WkE7^FG6CmNS6U*`@?-nzOTg#cwJ*-4gLErc z5TIB{kctW}il8z7U?EGcDTEoClcWO>cGhvQam(&kJ9Md7ZKNSHZFekbq75@L8dhdx zKH$p{YZWm)wNZ9X3^r7$CRDG~4xHyaa9kWc9#Il$9Js!IL28X!_ua?!e67Si0Banz zGl(vLd&3;6q$p-0WNGPOQStz2!iYf00_`*}7~*#No&ais!5B>(g+f)%*FYUKInyA_ z3aQzNi9AhPw!0e=nWZ+&jUf%F20ZTO;q5tW$azFcX7FG-BaXI0s|Q3AhueF;{^HLZ z-rXU8{X2g3`AZ}x)HAj2Lk3v7OmGLeFZ)-}nmbU;!@`2gSS4g10!?x;|C~RwzMeFp zeSg-VRAcEsr8)(P_LE@YR-9r^wfLTe*tV|MQhI?!KZbNM08Bva%&2`_9P#)ZK6H-n z5k^)<=HsG_bzF4-7(Bd-Yr|>)s!===A4{^b>cj5h)c&fc1l`(>!DfwoO*tI#T#+`Q z({wuKlR|*mNk05TOjA`ov9nX|%-|eK3vJ$$(gx;+l-lQ_5`7)TOX2?h9a{}Ug24sP zQIK#r95~z`;~FF3%UlYjg!+nVMkP^7MKz%sDhO>^pjN~cxhT3>+DtZM$^(13?ftk<)o$T%`QGJcOindJ=l3DzLw9N|(QmR+yG*zV zcoIm8l_*7o1%nuPy5{#d0pP!Gy!iSz=KK1M?jhr*$ z@tkC4!9dZ33gjd#%gk(r@v{wo^V#qD{S5c7-|_WVU&EJ${e2~2c*~I=bfwh*n5q@r zB@&rEnO>w}sUg|PwxGF@Go(?GQ4ndMj$qU}1pC*#Uu)}f#+`Aurl1T2qq*R1l`d7R zDvnZ?M6F;JNxN19RLyCiEemaLET_&U9NUp&S-A2SEO!fc$I8$~UcTD#H-CG@XD=p} z1AP7V4fDQn*jKD&#&N?mMq=MtNW&%=U*_Z_Y_IHnuMs!*s-Hm^D(GI)kp@9`NDE z;>pqfJ$rC}`ZL$ZkI%lfg29JDU|-ok{bvQ|R=>ghlGq;?-W`wJ&5gN1MKMp{39A95 zYHa~fNoNhE0Jyq?Y!qjl*jur7m(EI(APJ!={d}x@{;tOz64W839_^tXN&BTaS%9o- zgV2`7Y%>XCv)!QLxK@mrVufNeBxlgX;;FOI5~`~=Wk|Zlt|}sp)(Q)TkZ~*2FbQW6 zVJU@%GiW5Dr!=u0CdQO`{pzpSmv=OsFjrbxSaPByrC4P`Nohq?3!^$}N~<9|?}M{% z6_L#L>IGA)*#1b<27|ImjaDkJZx4LAuN?CgSKAk;3M0nR)@!m}`&B+W{!9oDyn&OR zhJ+$m(i4MkWp9C;7{KXb(-k~O5|YIFh!J+l{57-AGBm_jhWPtT&5yCTPSUp@VmS66 z8*_jqtCa5wZn@zez}q?`q@T0&XUT+6G`1%x?h91}#)0AGOU7$shG1duZ?XF~_+ds; zc<#C>&1+|MT6oAO#j?VX5zW|;$u-0MOu0WW$iU0bUolM+$IWZ_=Rfs+-3y1zXq|~E z4XSrAU5GIv0dX3Ni83fy3Rze&=_hI+fd#3Dr>{69w+=qGljr6%ZLk(<6(R{{2RQ?B z;xkE|jFEvs6Gg-0+YGLTkghGYMd4KKKF2to;aHtkL5_vxZXYtQ&1m~Oj>kQ+d%<#l zpuD?7j)h4QLrNU2aP0Ek>wINqB+gc8m$@%!eOyC;o)1}x=RU^+(D9Oex_;migj78X zo43}ewNZ*wtI?XXD1>E!V(t`&=1>6h#@x;l?QjNmV~on_2C_0|*E#bPb{;D$DAp;# zF`iaC!3z-V5Qr!9w+hOPAgjI@`JzmDEO+8JV^Sa#G^B zWX|G_&4sd5yeza*$Xx|g+)jl%t9rrZ_&#|%YiAK#_s4AuLlVZM%*%{t7>hHsnA3|@ ztR87(#0rP|`;bt_Vcf9UY%me#`G}QDvWgLN;JVLJO33XmAqj1@vK_`~Npo5W_0Hyv zq*0h?Zj{=%Gbio$ok`sg4-i!?iZ>4L?l6SqxUkKe@S|U^iH8sH(n01ZuF5elX#eq8 zzh+UAgxs@0SSU!2xj_d^5-y3fdZ24()Angtd*9RckYIE%3}R?Kl39Pu(yb}j{n9sD z3xIleW+>fuMYVhX%E|v(M9xg{3ozGvQ9>gMwjS*JG>$LFw4Vze9`*kpKLGp;{65Do zD4s#!hasw@am4!^@C*b$$8$W#FFg*&hiu$&{C4+?o4Y-4UtE9Z{r$i5$U%hd^Zff9 z&+!~TllZsK3o{dcc8+#C0A8;AQy z_HDPy?nan4J7!=U2F5&)GNb{9jUZzH5z1BUvnNMeYm~X6GLS`Zt*Atr%`BMFNe9d; zr7X<*iFvQwzs=OcKvLLTC3ZVw+%BY@Fm76xz_#u^$w{tPZ%_-^yFa|VI?ua!B& z8AzGu`Q&%_<=w>WjiVV0U?kimG?H7T)rA2id+K0+!cw9LEY?n7ZvYf_0##B<0rI9* z?p!djkaX_AuZtkn(3C)}7yAT=l@Qd8ahS+Dkkf{o##53$iIS3XEJwyMqhd$`uix#=kYQB;r;#ROff_96Sr z>{OWhQ0_Ux7_~I zzcAOrB2JnT$IQbvGox7x09XuZ9ZYMXH7$~YRVyi!D{`jVj9CZqT`6u<3E$dckTi;N zl6MBMcg9`{58_%YxLwqUbU)b@_;&+aX!Q)tSalAEnXg~J<-RtW!Qw`#u*@|WyH?4f z+!n)*3$kw&O)yL&!|>3D^s;}bD&`k?0=Wc! zqxj%d2y>bP1JqqX$JSQgSv_^OOBv!7$Xs7*tx?UX&1q)TzO9?lL@}&;{swp-*Ykp< z@4P>bLOI+hpFl)4FOYZaM@pz;( z=iTi)rVa>G8%>5_t}cb4_pxP(?@K9R?i}y#NjbCKZkdLOec5w39LYGMPHRgj6;#Mx znXQo1xuBuU3;Sy1VaqU1kTOXWQ$U1fEedKZilmSfM(?_^ZWYmlOB5Em_hKwN_qotX zc<3Fy_Rq(2Y<^_hc{yJN16*i*j?!LlAe@=SlL<`{MTLc~o&#M$#G!koUw-!)1P;&} z9+nPW7JfXnKKjuDz-|_xkJ-~7evaq(8O1XQ{C-G^#a&2^Jo^Jb$8$W#FE`%ZE)V|R zZNJ@8?z1ib?FKEbegGJpRBz~mo4{wFLp z`E-Wd54*np{sFD;_xzrEzjVDz3m+a&d$N5#9-j(uM}vO&7{1-m{(c$0PhFo+ji<*yAH7LDb@oq| zy_XI>NciWOUzk@)3Z|kputK7tCTJR{ZQ!skn9OjqC2bm;?TB4%sc($-)|ihlsUq57 z43?{mPD+mJj43R;M62gyu-4&}7|S`+?v5l?sLt^i3L?W0Yn4(8xlXipmZ%gDiqPtj zHWFY?Y6`94`;a9ZR)!l1aSwK^1rgF)qtOs?YQE!sDQwuX$)BUe(Kp87wzBAvFKkGtD^gl`MGgasaHv9CW~w#z*E{~x?sxd`icy_k4TuTVHE{vL1tfp{3w=58go}|71aUpE)U*954!q!{H?OXZ~-P~ zu+k87l0zdTTO|oigdq)md^A*qQ8gH_A_0IT5?7|Ql&BnO(io|X z4%%R#A#zVP#XUoQ$#S)09umG8V9aDM$o?J2um6OOLjL`);razt70ejeuxO+GHZkn? z=$BtJmm|u=ZWc(e49+0Vm^alu@c49nxN^7r59LTFf|4lXu3htHKKb|kIef4?)Uh#<*Q-Cyr1!M zFaE^l?JcRjp~)L`vm@O%)&hbg;mz%9pUjHW5c1hGwyO-RjBqDZD1u3PrZ%qk zauFd*#w^xRB0?H+^xG`xkYj1n@7b*;mfBbv91&)m+CqZdRakJUMeR%w;Jf_-VSRWB za;}d(=4S?H^!xy+trs<<6f(&IQE)}rDI(E#n$pJ_0pz=%pBdb7Ch!*Wzpi1y-YQ=E z{5RhP8@M*KHpF5dRVBbgtFhcl8u|K8GFQ!UO*}ygb|)I3{A5aQ&aza@76zOV31Gh& zqy|IA9MXk_z z)5MTN>psne%qq>ENu7C}Qlb#Ru^*41P^6(|+_Xx)e@%L!h`tI?RkS}V1w&kO6oJgt zxE~@cHLOe0IFcu&`i#gBZK*Lwh$>CHZ?!nNuchVG`=T)BRC=K2!jC9OxGe60&HPZk zv|SV#;LcIw+#MyO9UxxWy3l*q2a5mzJf#!!Iut5|unFnKDy*cr6a`SH?ZfKj#{~d; z_s4i<`aQ=lJf1<|4}=JsVj{D(IOKVrc#h|Ij$c^(`Rj*r%)k0<^R2e~-4|c+zyAI2 z|Dt{VKgJFJ$1?L>?ns{skUb4hd}@mEsrY`s|H(S zNdWR^Zfx)*!0_btdjep6asWNmfu7j>IeymhL+2^J&HeSnI@AG40xrz+%baR zfDDPdcS@<5`*~!0eZ$o*VY|e%QS#QfdtC#dMaXGn7{&l*dy?;JyC)Au(u$-;@=RMY z$3td58orFUAMiHQ=7D8DV9S8{0hc}6l-dEKVREi-GTR*tW5u-M?T1a#{m}RCZxfeH zPP%WRt%-gqaSqwTQxNb5ssqV0|Mc}8OKIHCg}b@3m{L)iC#pk8r`m-LRqFd(nKoyD z+QbQuRik#$g{5I)k>L>JTi|Z6$9;a@tWWBMq_(2Miw*I&9F*6>T_x zOqdTWO#)y^3S&Nj?<&UVj--iJ8k(jq@v4Y4l(-Iw5@3#d+^bd=xErorid`BB0xmKx)B= zRac4;lJ?sPAC$!eyFx4?+>T%a1Wnt?e|rwMmZcQ$GPuI(bjMayzWxszGJZ` zAk;lrwkC0G%=+GWoUZXj5kkymiYinIp?qo_t1Sz|&{Y}q?0fAVp22iBwDuxZGte}4 zVAT7(+zScUz6d9W2<0sO|4rAxx@v%596J}+cAbCUV+OCU>BDT=hd|!P3K8$U-}iss z_F`Y0*VUKn<~4p40I-{#fZykMj^~JY27$jJB>aK3-zc6L!O!s=&+$u&cXtb=7(-_g z{N}T5$jI5p=fS`K=P&sG{O|ua@!<9y0VPUpAJZ*3?%?vCdRaoZA@wl+v z?f_`bX;r#UZwGiRG*z66&Pr+-@j@v^TMS>6<(OFJjJ>Of3ObIU(At5l1#QNDU(r@ESx8gm=32RV z0lL{RX2l7`h2bK$itgIg;i{4Y!Q2LB}0K zzGli-Ow)#O9QopI&tbpd=4jrq9X?~X`4z8jKI3Y$WmE~Ussn&AmIBlSC}LecJTmer zb+C11u&)5)10XnK9SyV=vd=ClBtG3kZWBc%k##tIA9PR9tcV1oZgaI`n6}JI#WjJ$ zvJ~9IV-_nUSF9P;8YvC9hxDv@NL>%ZKy#zkN^Omt2aeV_9uCx5(eawyUvF9RfG>Nv zxkAP*3mQB3CUe;X3X?hcZ|-`tFn5?LTiMp{LhMqiRd^F;QBdjNb3(9$aN zKOhLRju-_alZFY&Q@m&4XWdeOrk=vH*Brcg$hb<5qMpvqHW569l(l#O$i)*4PN1GT zWQhVKT#=<>-Wj8vfhi7N8$)Zf7EH+`)+O3C3X+;ff2Di95^4xF15?6=k@h0g8;-{# z%@gC)K_!hg^X9a-_mp|2WygjsWl`E;#!6wC56BEOA<2l45tEa;gj>b81KD7bL^5T* zn<=+5n-{<4YIn`;ZDAPli8byiz%E|_(LOhxJg_e$$;CZnaUad6ADUzFvxIVdrH6E} zN5M;3Lh5^7Du+^8$TUgFkSJ~xZ_E~crzR5e;(h^IT>xJz`|dYPLE$%hj&|1yNLyt1mElrYxoLjr~k4Z;5|%+thpC+ zd9c=#o+QGh7e*yk5Vv(3fNl-&A;A9e_~2sP*u&47ee-tfI%55A9b0m7tygC8H*N2| z-4oqsdM#pFk3rtw{t{&V;Q(L{Z(qMK0Dq3>c#enh3<7^7E*Qbj$^p;u9MADf33vFz zpYHj0e{%!CFercXS3Cack9Qy4ZgZUZ+dq84KmP6S{-XW<-={17`?~Pi6VkIs-ej#-e^^Ll%Ic&N3k;QOjg#? z1(gS9GNXF17@Na>sr>oPEq{9bmb?9dws}RBknS9Y0W@Q+QI~~QD+4vW50j#K2#H8m zzemN|dV#F7>beZ1N|$3+a!yEcL>r=xCJWD9Z-^8?$a&&=`&+KB{)#bg;`?x}uYN;Y zls50#4lns^_d9N;&)H7f@L25^q3^w!x zz6t@xkwFy4SyNG}`k?+wM7ykX_#W049;T8qb8Q_*5tddNbfB4I$A%pbXW%+3l9Xn` zvCc@lB@LN`QHpWAuTTcm8g7-ZsAxrI3D+SsmzBx z^>|=d7IsO|lsPuT5Slbp&V#MGb>?Ws`)rl+04EtuI{`Z@`&@~F6}@;}0jz^@eSY+w zl()5QWo3qeSwpSjEu?y_dl93(Z>#D+cBm zh7xk}c(55wq{~7Jl2ey6HwF_@>j1SF?nknx?%^7RHN`4TVbDYtr4C9tRLly(Ku#@y zRcSO|NI23O*}JEC7Pi2~9ak8Old8d7ks%}6hjud>4eKft)x0y96|qLD1#x3qv@=4_ z#h%*xx;QNAC>2ee<>>UW660f0Xr6-!n-b+p(R9uJI&=Hm7o;!m;P#$!*pt#gtraUr z1|3+IitLZHd!uPX^p4s_4)+I;kfEMSFk;71nKl!7v+1(34f6s+BONRGYM>sJ!*b8t zufD=>ZqOH>^WtVlQsp>@S8F*&8zMQ1FjlVk3MzGW<0WJNk|Fqh#I+SNs{(>Zc%8e& zIH|R=l!du8<_;njF)S%YFn?z=iib+V`p{+a{(b!n2={9x`rx=O3w|CHgz>P{^K?FD zr#Z4uc+vJ9WN)Q{#W}Q6@fM8DBocFU0kZ(CU4@he$O&?+FLa0km^5U_=``jG9?aMk z_v~B<5 ze_H_fRN3+j`aZ{VeA{>ifu9JGlSl9~5d0j^@f^Q|_=o>|djfy~{;PlY@<{*~;D7u7 z`wxFH0DLRL|7~;4|Ml?hUxmB%=>XOb?E(CW47?xsK4sstN9GS6PcUe|Z;5gHp0BTb z@BROWji(DpzTfYE>iU2G65OA5eZTJloA0{-;nOX!pK8DF+e7`+zW-ATs9e@0Zvw47 zx$PJ&K!s$y{A^?zHVk?PWzX?W@wk@lJvQ^TF ziR0?bZIu|+6H{PGR^ zQ&Uf#zw2?hcrdkIORVC8`}sIlIZV2g=qU;9A&(0WXQp^huIQfQ@cXa#RD4I{%a;AIJx zX%gnvkk&{lmY`u`n z9%%(yCD#R$#L(g%GWd}+2pbw4543t<)I>6nY9Ni2K$Al9@R`E^wB<^Y2F!<0Rl^k@vSMH#{XjgZe@lMQapgaB+@}{#fOkpw+=Lt(@El7MY}|C&p!`2 z+M_nSh4R9%-UzxU{7D|Z`_v*suxIO8I)0UrPAQ!L;LE5rtTw2rVn6 zG*X|>)g0T;XmzyI0LR@|k!RMLo?wW#Q?ZJ+5`-&vl6!!!eeKu!y>opU4G(lb75s$~ zM~v5iH2ZxD$GQYJ5cBZ=pS^#Jk!{P;^RRD>IpZ`N2l~oFklF`P`w#9DLCG5j#+ij2&&&(5l|Yxg--72{x^+&eO2UFLPg_{abMA_q{j zDNihW`Av~cQpGz3aIv^!elXX=ec67jOER_X`i;oEXw?G=A3a z@8>;!*4M{VyxCCY7T^$i;eArz)d*j+l8PYb&%Ww+ZiU2PeL z6={`F0h5YVBgz0>PEoyO!Q5_G4MCjFzXI>xl?RfhQ~d_4Yh!(pnEZ6s!*Q4^W(A|5 z!HEe{gdqq)owJ95GzjA$jr|*)6on9tAcZguNDyk+BL0F9jLmAqErJEM7%Bs3z-pk( zLbcfBIwgQ7%qLWzGsa9x8TA>fb4${066Y&;^40@3;|0&38Sg)ZJZFa0$mVR%*_kqK zv@u+);?|POEm?Z9Mf*{rF(N@i?DDs5+`pLM#dhNPZpXI5)*#0Knh;UyZth3u(vv;$ z9C{w1RyjzF=2|G#$x8xTj+65a+WA0gU5dBAE&|%5KAWs&#jG*SMt#6)e9VK*W7gw_ zAmCmI-k9L2Yk)tbZ#ai@Age8$V-zw4h!R^OFYJ;+iYx7m>ghKn7*OVaBQjClBiu3iR z$;s9k4~m2}$sUnw1CUB~^3)`Yi$gBEHqT_oylv9dig14Zfc2^s1I%hz6jtLot8q;+ zVLz89`wTo7g|=Mvdv$Ax^VGeNG0;FknGC8mim!>>E=b`9ceT#G6&lcmJJik)7rWIz zBHCH&Jy~BXmgzvEqhV~okQ**ds&wf=?dz$CFpD?vH*^M^wRLs@x9|nnzX6GwylZUI zvl2V<*+8>og@E&*&dmFXL4|cvprB<(^h~Uk>#`%HfprM1ta%1owdNPEd*W7!^Pa(t zRVmc#Ejw?F$5f0-E4t5Q&-gU4$rZmAYMsGmrcI=*BE%-IUTcN!yIS25&jfEp6{<=c z8hc(tYoCb*lu6J=KwG@LH9!aq77+?U!M%1VX~Vop0gpBH@g`IU^-2ja?Pfmy=n{sA zM%#feEV7pfckDYGwvYXiWovx!Ug4wO!igq<1Fyu0*>8@oW9xr4Im|B)3SCNgfiu1DA9#~>SM3Z^j-GiIpt&<*HAX_{ z*RQq7z58w8@Gkq*%$Vo-a2yFrjIm#TFYfEldp96plgAEb3?X7UBgGkA$aZ%9&0uWM)Y ziV0R~-wWEjHv}ty8#QM%7u1|th3ZXppavnd2UG-YVECQFhowmBZXC)HI>6g^#IEXn z!}MLGuwOQQUpB5^%IZF9iC8)Md_arrcic_58XDo6y{{FY0@rVBLCqR?B`J=z`7Jv0u-@o^>fAVkr zCg1(?JIq7+Oy~Z;j2ph}g?~Q38f0_y7Ip|9J-h?`xmW`&s$b*Y~>5q_6$?*B(Bv=>hzCFAqN_Q9IM%z+MnT zRS+4N>kLs?JrdqMTcadub}nBerl-nBKYY#)-@jzH-BRa~r~#1y7o+HLGOK|Zw;4n? za(pf6)R;ksgj;7!0xU|6H%T$Um-X)so8rK>D27C5NP%Gu>oZu7Fa$#>gdwmV62l0p z1t?t#72Jee2O4-6hzTMEGpN~c&#c3S5R8y!JmiC)s$0NO+}@?;J2@bLiy#EhpzV~}Gms95LuQ^}-#Q|1h0~)2VEWNi)wQ>OPPVwo{*j@|krM*^b zWy&+tH1WYMaJ}1dHP4u8^8t>5kh}b+(7c0tQq|2c(FVI$N2Rf_vUQelgH9SV${eK0 zIX7k-DAvZTdY4*VfMDs;u8vg@jSR!Ull329y}Dq%dc>fs4j5Vk1|+a40d&nU28K9N zi{iER>y{?FzOaA}62W$qJicMvH-_*6XZLx#Jbwxe?4+#`8rq*~wZGb!ZoYsS>J40} zg<31Sec}1#H7_o=Y3T<{dFcQW}}3jF--`Ejvn{kj=;{4h#}VB5YOz zV~Xrc#T1g&CXwtFuT8cZjByoMtwz?qrRs{SQu$~PS5+x7AW=c$;pxuIpj2e>0hTTq z>y06~01bz>m&R#pzSZru)IB##$=#z;8Yo3utGxHQh;)WwXRE0m9&;A82NOH64iD?D z`GE!N?gZ%)rs5z4T!zMz1{B@7dQ(Iy++%FPMsvOD5Eb(VSXlv_@281C%r{ zYh;hH_e!-DW64Ap)S%4WXV-;V9H*fBN}VTinHVf!`S=&qqN^rU?#`%;i7NSCOtq6DWgG|NPE zMT6tJ%J#W1ZDM0n25?a%1&SATIWx~Qa~a9Lr}~T&!4sIY;tn&)UYTdZYGY*Y^GvA~ z5AFKjU7s<^$o2l3=XTA^$R=)B5l|hPKQc{uV;Bb9TcJt=)@UH;!UA*$YwXiy{x3|$ z8-L&1617c6y1|&%eXg?`+DSIWD%e}`i?3eaYhTlJ z0cDpD^f^Oq`=l@6eg{Sm_t*0i4S!zN$J(XZ1qrFIccB-xqyrNdj2a^g`@U@n4&Ccl zVu0L5|GNh>(iqkY^R;?I3#Au2dVVOhT1K$9XVhZ`?s5&#F@NrU{tm17 z&TGeP-Ism0y9?0E(Y&xD*6}A8^hcoa^0K?XCIEbdm@fd!31m6NDc)S1K;R!UdZpE& zO6J50KE)|c@iP*C@9#h5SHAV+ko@|Czxas%@*h0oqi6e9er~hd^Jo6X-{mj=Gk@YU zo!5c??dky=zvNGs`QG=R;^lE4gYW+I?-%=d`-{#{y!ZO<`TgrNG+*!hU-0gK;CVn_x%115APEL_=_F)_s^R>|9t@GKp4OMU%e1RmsjKQ8&WgZC~AQo->t|%>mX~o$^ z8Y8PHnj<3Xo{+5sQOGSx>E1j;RTH%+H4k_Vl=zRp6N8?S^g(+s6KCgvM~^o=o1bGZ zRy_Y5=fiJr$=P}I)xdl27M{HIf@l7KJk8YNL=B`xy~+wIjx+wGhRSD(`^MK7CEw>g zL7nH!cE9Jv)g@O~SG*seG)CmOZVCBPVK#!nfNQ;wiWBIhWA(XX&L@+E{-J%iRGFP6a#&u@@&aN!y#J zms_BiFXs!mmu?f#z=WY@HhITI-m$jA#r7#XQN~SVi02?qc0)?@XWfK~R6|Opx-x`; z5G&aW)PkLzQ$j(r;6ceTGE0Ce?9GuJ2nbOtJ_M3S3XokHhmrkzYwCkD#@yJIzCU6K zs*+;Gt@njUFF-P~G*Ca*))v((O7nIF(8b#`Hh^6ff<$zPNDN36a?NagPcp%BX<&DV zL=8|XWi~#XjdMv1*(henDp3W>oQc)h>A+kH*-KNZC>eDns1d~27D$@Fr*XV*`0G2TiSoSzBF2htE*!4gi4vB@!8rPkW^clTRBlpkR=s!DYugc}** zy8tj!Z&eAlwp6ke+$!^K%l7)3se66bG+s#Dn`}POx z8`katT{{3@0Nxp-hum&orw{jF-hHFn8mTy<@gV!_bP4g}I$XJt1ulKeh<9+%T4B#I z;An1*9qh-~NSDjLVLKmK_qr6(2%X@1YaRbY9~@s=pSRj2qE&7RI;=CErLVC7nvEd@ z#GLFEVuaAVn^RvamgljBxVaPrs0y_jK?Sk4cd>wu%Q|LV0=nO`_Hu!61Vq2=`R!$F z-@8oQMdDhl%k3ZCe~1AK;pRSjf8j#ZL`;dHI=*gR&0!cJ##T^Z5D_pzB8yA*VNX}@ zg&-<7lHDDUUVbip?YFM~sGp9;^WDC@57>QKeA@4C?LD-5^4slv8&tjbNM?hl%|JgtJCH~$2 z_;>EDuKnikz0V)|&2RHx{PHh+rgInIf4RQkf4;lq&wMHf{OV`Kd-1K;T%X@OKy;tS zjX0h~%V325sH z#VHvhBP&lB+LFrZ1TRf4wPe=1V(kH&jqPmgsjLQPy-uvhi0ItN9^FH3KTWs=#&HGV z3Na&9A^3o~GFK=F9$@e-Qk&PP)&wZER;*^sCd#~FNKW-jQo3ff8HsU&>N)SfU&zlM za`}V8<@aaiQrUcM;K?6)$oQp!XS*#}A)+l2XG@}65E4yo_P+J&p684E6fo{vzwa5o z^}hLg-}=)K&E+5cdTtV!wQ1_2*1ZSCaWPyQBQnT9u7>xta=>`@)NTW}gRYe8QPD z0MN5FXnD54AQ16~?)%`6}FSp$Zb|5O4d z()_TkCAw7_s|?y!XGaPChQq8dYx1|bOn51btH$szxv#|I=M3(WozvB zA7fMDYCrW-jqsb(o)_ycQ@`|tO>)-tio6;c zGk-U6UW6=_D>qytr9yOAtyYaeJq1GSV0y@eO=MUlWE{Avh3|*=*v-zf$#~&LjRB80 zth}HB%7pCp#Qly?n+JKVP%zNm_S*UaZkSjtabIrcQU@i+PNkDlC>;oCzrO)N4j_qS ziYal}Fg$vKxGW>qFe5!PuS zY9hr%9V6SZlCv-nn6>i$s`Ay{hVxaz^2C0gnAMmxawQMgpP#cz4wo~@5^+CM^SlA`zj+)_yylk~Fd}hFHYwjPH%jY7LT@%(>j}@w{g&b}4*v^ILgD~X4muzHSIYHN~d_z>hsO;<1JeV~yq#dhaU^521g3WCau+D_6 z>r6A>Q`672sD)sfmI zd+BWW1Gp$S146TR2;vM$nrE_tY9v{qzXqfJBt@Ruzs7mt)Nv<5rTmiBhWxokb~dtV2eCOpPN+tx{j*ME(H^Y};^2^ioJ(&fMHa+b8}s{6a#ih*j&F4iRWRqz;@LLy2) z%8XjYMA!zfD8yRHWzW8>k@W+7H4wMWo4ly9U#+OI6($m5`>x*G*aTt}vh)t<&pB<( z1*!^FgY<-R7T@>YB6@pmN1D{V10Lfo7Or@EGV?MWj@3VSYd+MDvEF6= z9{y+trVn-lwcXD&eQU#&0rpYE^t=koNKj`6Daycuq<&EWhQk2eia`R9#*p5hdzIK}4_p@T?eKk@O0 zJG^dq^yDGK#fCU+sr6a&Rck4IK*1w!0W%13*A65=Xwrh>iuB4K6{psP#i1Z8+=NmJ zxf&mS|BS24iOZ`!(+>9giD7^+wsc*c6Ez!o^2Q1#?Zv+w{M9wp@$ zCPT&15D2Q6L!$jO91D#hDYYf@Vr#(*S)@G(YUZs7jntXF=G&1yaCA~m?$oR?2UO+?#i++rsjJrSQW<4-C1*4tHT^LLa+AE204094iel zQEzjt&ABE6+K6h3Tk{?@-!-0F2GK-_XROAzSdVYB8Xn)uv$nZ$(>C6d!N(Gv$M0_d zAO~RK)B5DVcDwUgcSmh%(x^0#$E&O7Ts^Oxovm4|N087YTumt1nCHxXH?!OA+07HG zYf5&c!np{mam9Ob&a|6h`;2!r@#Qq3#rgPZ%P7xyumUU1ld=IK;UL3mX4Kk?S2P{G zS5q7bF`??j!3m=P#`(TUgAS9irc!rX%!QRChV#ISx+7}hqO3p?Rg@x?IYIHt9AL;Z z!+uA~GcgXhueh!&u8H_=q99}!CXZAJSapIJ0hleLUa>kifSw9&l-gG0;Ckqfr5M6{ z`yUeb%UqCvYGbRKfz;C8-3uh-NLc}IY&@gl5+Fo8+(_^T1hoz%Rio;S$Mx}eJM)QH zC*r(A%S`Y>5Ssb{kb=T`MO<(2v}vjY5=aI(=pg9=w=jP|_j>aZGt`2I} z{&8RR8|>Btt&bZ^x9wA2t*r?HUOR9u(%&125t#Gge2esSYosGa zbC0{V(9LH2)%(94ALAu&T|oU?`x5Qc#f^|6SVc?`H$s=hrdlgTDl>y98Y7nHw(q*r zynqWDS^-@+6>_5f#-+SvboxcG8>(x2m6XD;O zw?Ai)=;y0~^SSR*Kl3J@CzYd9oZ=LpPlzij))K;5xqJ%KwX=C3q%$S0oYguK$ADR; zlmg-mDWWnk%X5x1Z;c7llDF>8RIi&PVpt=#W}YM0SH_FyJFa(`>#NMPo3Szz)JdTb zR}Ko*3So>$F=Q6X)+n=gdFkepX_W)>02+g$CB@ozu1rgiEs5T`0Kv4aW$?yCLR(_c z)CeIquT7eywW?yK)B@ABv7Z9db730;>1@Z4gmI;;)`^rxTr!fJ5C^WT5D2IWnwx|x z-n=u#jUr8g*(p@dh(bz%Aw&=(49d6}Dbv9Ava-80uAk3LTcZ>uO_6zjjc(x4H`ZKy zX@sFL=f)y^({Z22_kFv!z2?K*eaBxCsD}i%E}oO%Uh&dF!Z>0s?2Be3Uq^^^m`KnM8U6 zFSI4KyL>4$2Av>?m99oAcnYMT?DjjZuPP;H%o45vH<(LhH)VGFnf-oZE}3gpHbdg# z>>OWj5X+o-=G-Pqaq35xoL>Y|e86_PVn|!g(}t^UCiQ14s}YHjVT=u6?BGn4#5N1X z3a&zRVeY<-nv80dh%l(I!Z^1~oi5Sso@z=8k@!H+x?-w{%W7QWR52bE<)IsvCfG(2x*qK%P^Q1+Ozg1!?SGSb&_Ss&D{q zJ~{XsxFLds*nlW)%yIKV6(`nmn1tefSjiVQH|}@>9TPqdRB43>N@Jhlb5nz;ZG@^@ zI}eQw`e=WNls!YACTv(E-Wa1=DpE3QtNhl}EqOii2R0ktS#1C# zNX4WOYGEq_s}wlX&W!Ks6N$(wB`meVn{ek_qfxLqvzuY|#)^*8#{FC}d77C@VF&}m z5DBsE7r`O+{eo(UHjdkY`CA+FEd)hFVpRo~K!}Y&pCum{^HBrI3K|0uXHaQ-odzz} zi4Bk0#);9O%E0wSM5>XlcbGW45guowYV*yVJu~ONM*}GYf;8XWc`i)T%v=i|6p~`a z`S9t-)O7}L1rln;q_A^u1qj6mYE*Zk2r((6kJQ>6y_fsuF3>8AB4YSNQOGgixa3Do zqyg1Jmlj{vm4d|32sM2LG_wO^@?~*%E*yir){8<|#NsO9$ZDo6h{1AcUdGGX@4d*WR%$L-w+?V=^2i-_@8@gxa?CO{ zZk`rpDKz2b;4gsPqX2Zbfcq2pqC?d-mYn7Ryr{q60x=-P+xT6cC6VTTUJb34)Vhpa zEs$rlR>Uh#E9~>7b5lTF`q*q^P(%-H-tIXxE0dtz8-Ceadl44ic?st?d;U|L;uNPi#VI~Zh!@<9 z5S0fHN9KLu`tmuuZ6XdzTCX^JIPl<6AdE9A(?P;e%pndGvja1%u@xIr%y427YK=@g z;l<^a7tfsQOK08(+y=_{10)p2WQ+lvjHyr%3gFR5!+;KgOQCkqj-aHJ$g+3llFlN;7!e70NMJ^GsI#-%Ixn6> zjLNVIq?HnrqYQ)yV;a!M%||aF1PU4&dke1(T#LDT?m5AlXw*13F;%FQoX@zrtZbiG zo_#cN{k%X{60!MBW}#T-@jDxyeDjQOJ~LY-$r?m)|M||pg^*bM{g5RQeUnfPuAoXW z<8rP%yPkP=z2iF9=3N~YtW7Z@cw=Ri(#B6hF=_0zB}u*jAPZw^NtnJ&ZN$a!MpGt; zbT({bS0Uacn`z*KxgGov0VFCCHjL?l_39Dp@d;<^hg^&o#5iEJ+eaJSfn5>|+ za#o!8rpnouFM0bMR^Lc`kk7e{Ykv5C;Mxos1t&E?LLjK1CT(pf&HG%lVbg@<87;Yc zJv&`s`vBS;_w#Wdi8n=oMI+i#OpPiui?VrtNb27m56%BmAw^`p!c!pU=E)n?p_aye z>vGT9KOfCdD&o%B?is-ggBM1rjZG&`Xiy%ikb_X90Wdbt zgur?nu&BHUE5<1z7P$7xbD5}ThRcAM@KiFWP|cX8!hXLeOwReR;z8JOWet#YZ~4bn z8Xz@=45Luy!ezZ`Y6hi{_Y+sDyx8tpmq!qUV%~~WM2R614PvyWgy43E0el;LdKt6! zc%3{}ASf&VTrU`LXUc_Atw~yUuVvHF0m9C@Y!l%2*yjfLT3)NYnB|!L8bZ7Un%!l< zmQrqg#;e_0>&A2=3B6#_#{g%Rdh7ZsPL#%?ZtG;Al-6%nDyTLI><-E`{8p&af!XR1 zj?@;qY_z6`_G60o{lkumow$ibK6qIpmit+xfp4wjF0im$dlAzzo}wtb5IR8J+<9F? z^NGeO4oN#OdDJ)V4T!C@LXuAde}9y?FMnc3`)@12>Of|nr| zKrOiyeR;*a5Ct?W($YZc>+-ViFY75?M%f(kwrV#S^d{LXy#S%Xu6AHNi??UDrC90E zZpQ%coiNXXSGD(j?f+wY0H5L%r}$!pmC`n&c$&^Xkysvp zPGImUPH~E#f^dibZFIJR& zB5#fBXPLMzq(O)(U6y%*bk<}ot7GP!v7wzsD7Y%MI@2_>y`I?bXRInQCekpXDMQRe zsW`cVNdu-sm(OjAPZ)f(^ zDFl#&Hp9c#uht~c6=5La>QvFg4%mrWJ%Qb%T_v=?AEY>s?&;=d#Z`zB3DN)nb7_iU z7-p?FVexZq9-4_EjjYBmv0go7y?)4Q*f7Si6)cdcR(rDk=6upJ@dwbt;1h}9yY0UG zePPcnfXMNCkG+2v@Hgko^Qkh=GyDCXYMo6lPzuzVm@hAxt%Gsa`brUkL}FAP!~vam zlxb#86|6AU%()e=Z02HIGb-$JZE64^QV7f$(y$_qdwkdWJtn~|(B!!*HG`WHlQIll zYMaO~LQF94ya{;^k<84zzhvA$<;7%SIBC>G(gQrHN-kYTxy#Wy7-_PgE+x5 zVwKf&MN%P#=Eo{xs5fa~RVBp8K1Fg+)QsRWTlVazcp7;U6J?%w<};VIfp}h(>VYX2 zSVJ{q+lw76v^j|taur@=Z3PH9AK324&jeX35l4a$Yb3^q4*`_{Q76?ENWeu2DN^%H ztwzO2VQ9X(b~FClTxb%@B{#mKp%iOv<()Yw7(!re%>!FSNUB7HfDv;W^Jfp};YLwXRnf6M z4{3~zRVrPHp;oLKvGjXcR49*R+Lxl9W&dj1mfz%{%~0*K@08X1&WK*xZwx(_mY2q z8AuvMv0SLJ?Y$v{zHd576|Xn#b=dok)=*zOfP35Mp*UojCyIA#ibG2*#VYm^#f>|0 zm}?6Y7-wDSpPKePdPVqAkR@+8-0)cd- z8GMRUoZ^cVm)DuU{MWzBfAydF`r);+b>hGN7rw#&>o0zX?f%tllVHZ5|Es^wgUc;{ z=Z}2rGhfF)(8&L2^O%2Yy5e6byU%=_Q=H-yr#QtaeqO_9NwMmRq?wB+g|mx+7wDTY>I>oaCXal>j)s%et~6cKXw1CB`uF>-MR$V9a(oPy^^ zm`94vjSV3YG=T>wj$2@wD|t6VmL^%PjrEqTB0&$nzAge9aczm}3LSiH9*AZ}?kty- z5~~>5&KYqhxD$aWEupV0a=~398pD}z42_B4fe2LJweN6YKxJUcrODcgVhH;WGSv*z zOdP@i01h1>^z}dtEvc?Vf*NB|Vh}K8`y8%bK(#mWH>Xv@{fO=Ctp2d zvTbMPr0!4I;L4xpSb%?6#MC zn)UjOq;C<1kr)P~OK)Ns#83)$M+W?5$=>4viGy9$a?N*=!k;FWx+K4ssI^i`;XB`b zzX8D0)WF@4Ahdf-DdA{iiva{91tGbU+!`};-sAHnaj5uaq}G{Oolyh3q@35pd4PHA ztaM-#gj9q$IcG7kT9w9(i-JgF1DhE`XhkJ?n$hUQ;P~9;%McYYXWm!hJ}@w#Dp;K; z^EKNF!x*p#XJ3As%MWLsZ;k8i#EYp=qc9DT4`L+hFETw}v3)VJPXQkaV=P3SQLC&& zVK&I_)Z!g%>;Q#BoC{Vf(t(UB+TaV(1{HQd=(znC8Dcl1F5Z$F4h%jK7(#5GoOz;J z?chiU-j3(bkcgWN#7MOU{D#g(x4?n*i!`-_RE=0>Ql5x;CenPQ1B!d|$__yYs)Qhv zI5NjX5$DV@K?>WDxz2@YH}bX``+1@Ufgxfc5lo;6IV;y!Tf|ziLAKgtjAJ-R;QDIB zMX;D|?uiD(h{GxZ-u8rfE?91o!$VMHToLC0wJ>cB8)8?#FmR;=M?BwR*d4P?Yi;1T zgg{j&R#~UOIz@(BI1hnjnIMft97IUcWv0C#HsNM`6bgQp`0DtGuUrb-t4nq{6Vo}n zV9d3!uf{wi@{lOjuET2t?BqmnM;O|=F>cZT-@NFErk)emgb z!!f)msMJ~sv4N@U%?1sD?GExZH-!}u2y)|H-KDS>5E6jUKw-M1a2w!l5<4JOZr{@# zhV#O}ei?Y(`lPjatrhi~!XK3mbjAP$#G5q-5+EjIvnIueJe^pihTGh0lGZOP3qF4B zN3ARWkr=5#Tbp#ixjh$kiSpi1;x`2Ztwf`jk|Mq=^v)>gLsd0)=YWGph#04(xLCouRFr#QtIAb$6ISNzSt z^F#irKYHT_{P1Gnzwyt1lYjp&|1Ou;uVw-R{IS3LTRePm#b5iU{|U-xv=-Qj@V{AI z@M|UUZ_Zbof5!Fk^OkVF_xzu;2kw1xO!~$z?`Pd3_hCEA&5PH&dF>5n( zYHjkmoNp+*JvGm)ED&SBBs2hq8*r=ryzv_LYE*-5o$xrIDNQkVSn<{`R?Pw-kW zj9Ch~6s~p?q1MJOxpttS7~)0}NU^a?L}4UykseT^9umph>nrw`FE}69Jo#qg;!7hw zI(e=nA4od3r2gQ|1o=&lpVv$Syzb+}edqTM?x?nL;RZQ7`(0+9XMXqT%v35ZNgYQ<``VZFLwNN1$j7=CUIJgVK75Y?7Y?yRdN!Mprf{DY6%uO2a!5B`-M zKnUD0rxu29Yga!c%NGyA2%dO!zTxTfnSIHGn21rCb73k4T)9}ElWWGjH1?<) zan8h?3AqsG8TCDZk)0S*$yhObh~!{cF(f8R-QhYk$kTXJbEHpM*^$roJ;A+e}!^8S9WK;{< zd1SiCy=v>vWesaZ4}Cqe#vncb_n~{|nsp#T4wF(uU>MNVK+!;*3WGs#p$K>c%Zo>< z(iXl-oF~$}CFMOHBBoHfGjJ48jh!tFa~P;`z^sy{YaZB4O@XI7c=mka#W=8?3fsKv zjKF|uW6BGP(okrNf>lRCXbKRaGt#Mu26RX_vaIf?HOcjH9Gd?whLnQkOf+fjU5wf# z^gUOmT7bqPHwSVh=;D#RNWkg==&WwYG!ut`5CqFJgA6=g4~!0*>I^A?Mslf$Hwowz zoH4*Etk{J;KiJNEXlH~67o3lgvpO?eUo*tSg|_0W*-Mi~j)4i7rLmAlkL28CmIVkx zNXoF;uuhS2IA`mH7axDXbp4#OM-O=L-h0##@l0P=gq$kaES+{r&2ua&Ksr>)61x8pQr4S}>- zu?fN)_vGAcwVJ1H&kHZgCnB&g=na|-nozB;_1^L6>bHs$?uPraKFC29UG+wu+N?>% zw~KDfY>wK!326vsaww8AX{=m}iVx{97v%1Fy{%6RJNnbWU%N-aNACRoZa&8G!vWjx z8vEF!v7&=7<4KXO3gWbVQB)|^SrL$snlCSkt0Ey{x#B}0ri6?`>z|{d0x`!!Yd5pD zw=C))nBfHEkU-I<4q(>7V{K{=FHv?l{`>J9JIsgv-%H!;PWvpNv&daGZ~IyLW^fGt z-ny1M*RlL=d0sdHz^6FH&rp~dUJBs^0>Akzh9RPkZ6e>qm zaN~)Vrx|^GhRriJ8EVRaQpCtzj4&*oY~l;tfJ;OrHo3j@kSqabMfJ$!MhGCGz4xip z*l{WZ1?Cyw3REM7gqFst!&}0zI!G~0x?iE~Nt;#oTZZ*|#k}8PE)45)-uvbmvNEbV zLt2sYfM>8!s8&d%y9?{n4pB7pf_pb#nldAY6I5#-#hqr_&$G-i-aIf$&Ixst%3rq zQj7Co{e-i#GtSN~*sRYPhjZ|R)d)Faaz(X_dqoFDWI*X-yfid%8T$<=Icm9=ByT_Q zZ~r7HvV7M41~|TvzqJF15M$(*e(~#k``gBReT_zCwMtx8W8Q68*`sF%(ZtWXQ?XN>_YMvAeoe-&H_A#xT!$=tj3 zvx8UCiv;RyO=iC{|Fo6^Ahz`1@i8nanuhlKQX6pUP=v;;o52>j(P~gC=HqN!M!^`GM86p!1d6rwP9j*{p&_9P z5^H0_h0Zt(up&T^W)aZaDX6j@2UcmI&dxd|)(Xy!TAe5nObNx9Lz8}9Cb=Nhaa$Ogov~SrTIx;V(WmU=$8ECs9WQJ5@=OH{w2oc<^H4kz12q@i z4E0{1hLRDA8N~{N+yK6}`snByUd8;qZ~tFr_2GTXk7W(C20**FHPA(lR)SVXsMgui z(iq&{8m4S0?~&e4);%7-w6Od#VLNq!p*2T6H+>X zz`tK1f*dN@PrkvYIK?SGzxW$}`v(k3`Gdds=Kj zEB=-L;IHyG|HQBGTi^P|XTFw?MEPH=9`F~+#J@RT@yLIM3S{onLb`_`{JII=dl|m3 zdH(wuME6Ko%B%a@?zz9$2asQV{`)`w*%=q6c zb`@lNz@tC*F`I4T`Nt#AerW8jcg#{466m1JGLbYjkRv-@8^eeoO);uE)g7x1Y}U}2 zf+ZVMnJH%v36m4944oX!O=eoFvv!!JvAaAuP|;F5V5%6Qu`;FLQSf188`e}41~DEC ziDzcinqU$n2$o7?hgC&tV*UID9-C)fkcdd4s3BEYO_dx9wKJn#TCy-|XTPbF@{SnS zY^C5avRZABxuE+UBM@U{N{M|MC=!S!3_~H}t1?4sQnqSClNkP#F(e|?`}Y4={+3(p zsF%fk9(_Mb{@_(|h@s9M5bVCW+7j$WlVBa(5f%1x;N#284?lXrv+bVjjt&nP*<&GK z1d2f|?R&N01T{Qnn&)FcBsCVe8X^_MDK>yq+zs=L&={mvg`6wonKT4Kh*YhZ6+{gQ z6%%3JXQU{h1f&=-!mO~D0lj#_*~Qm*`0xS45Yf;Q-lcAF7py{V*?tCf5=wH%t@P&} zMGgRm-;!gc%T=p4R{O$)>!h$la#}iDbBSZgP!VY?cH!V#8$}xnasf=D^7XHMg(r_6 zl5-};h?y}>6SY>7D*y2P_xbksKjgvrIp=8wmmjg7u6cV1?A6J`6L!N}OyZ1w&0B8B zHscf?js;5($TDzN_pHjmGam4q$a`s`UOnQ)^qj{VWt^Yz{%#L)&4YDfV&+*qgp0QbWX|UuV=2Teyc5>Uk0bN& zG5>JhpfiLZ)T->L#2~EQ7^lqjuxTFjG)7%9C%BL#pcVFMg_@Isa~7Q_LLw03*zWIf zqCS6)mWikpTN$DTMHs^XVasZ>W;@U9i!&xgN?}NCo?l2oqA+=;N@LTnLt?#(Ordh- zit0>Muq1>~2wYNQL52ZlC&WyZ!Vn{&gHAyL^HedJ_~ii}&hQt1==`0$X7%-N@U8U) zyYGFQhr5BiF34C(Q`>)aT(b&+p=2J%nG&5E3pGenrpN`U1*W=&PXz-z_xgy&54+9abxZ24lR zGfzi?DkTUyU9yoq+xeQD*06d+*{m@!hB@M5RILzN&4*X;8O~OT-Np6I`eTKfBIEgr zI3~8GlCLIWZ64QBTFI0Lr3P&UJ@uyOWNEKs#`fLkg}YMKy6iKDm;KgH<)#S6r2(Yc z+1FB>X_&za$%Wt%HNl&%JrzhPP)fn4rrNSHC3zq#Ou-pLAc#U~7AUGsZh9#!h<@`O z$Cg}$frt^hJp4^Dl_8=me(c4SSvmMi%OVqPhIHBfNOC%_yho-;uJrN;qE68`16WGHQmWK z_!Or&#pe@$CyYrpZqy|pQ^R{r#V{u_Md{SW!; z|I{C5w;Dh5_57tc@@paSKge7Dn|XH+v~mjg{29=ncl@m1|NR93zfTwPa~ePE6bww*k%@~z2 zMPyJ!nuMR2Atj?aKoZ0os27qoA3G@&Z*t80Qb{SG-WbwW>fx(y16g2<13Pc*PH|9g z;;UwreJRALpo247Y|O*GF-*oN!Vm){hN&GA=Fq?n#z+`8gs?$EAwIuk+Rp^w;o}V# z@1F7C$vbSzvmd+vf1EM#MPUfvl^#4W6vL`9aWE*Q$!)t5HIOv2ohw(@*L?JB%k!(u zE<06Y_t_O@Nmzwat+UA$k%&lx6Reiy0%)Fn4q|BV=1Ix6dmkFA4Tj34$;7$}X>1A9 zTyg_ULufTswcShf0W%@#z_^a2l-O>KT_|W=GmIlC4T!Y!=gypTm*yFp;-Nimm}^TL zDRKnX-e&0ZBs<|&d&2FaoQ2VQ11#z-w$JggkNfJFDcpREhr_X!_r@5R=ZVdu$GrQc zuaQDvgR>t5|3|;ezRdWlc`gFfTv`E$NGnV;TJeduBza7U6k?asZHfP!n@6ivWuE7Q z%&Dr9volXSbQEG&4Ji8^`|XSj5ivnmD^!&+K$Hd`T}_pz+Z`WX?whAAFbo4@9Gkqc z8}7zjG9mgc2~t&QeP{K+?4vUu4-7Peg<|N9^4!3k(3qydt%*RpQ0m+i210D>SNA7f zdc(NQ{94$3hbWaHZCIbL*{w#dfAA687nj5e!+K3zWL&LwA5Djnu~Hk;bWEMy*or~a zyCX6PG68I?ZSk;2mnIM%KjWEC<%Hy!&-5>0@nqWV*Y5pJ@ zmMdlhdp*a>+$3AQHpyiXGzC->V@go2$~Xu?6L@XFhB+H)p4QR2k2Nraz&Zq?M%KfK*L;{0Ap~N$nTv}rxoVS>mk^pn zuy=N5N$dyZ;(X5^vmJl;I`gaV7p@*h{^U1)5&QmkSqZoXw&#J_BWg2iGHIQWazUWY z4<#Tf_%JjuNfo9o#6SUNl*wlH(-nFDLkh494=|0GB%FX1V+ecl!woUK!zNx4OT}uX z?A!gQXal!Ikg)+b?zv18+x^5$!H2-)LLpEkLifgQ4Bm=+ zxb^*IVPG%J_b#&A=20KJ0YS9Mgag!WVbK7rz@mU&UBImYh(ZH{JAmla2IBVlw4Bq9 zs`-wu&ptc%Of<@u<+c6*&2#^$kHYh|A2L*d4!sWvQN?4jr*EEWMB^zJGYDK@6> zeEovy>N#`SQ>_xh86gU>TW#nN$kz4=5eOOyQ86-=%I3-ArYw+WG`BS&hl@_bm& z+CFsS6|LSR*zZ&D_%xM@5E`#pKP1@bK>@yo9F z)1JLo@_xr#QvWXePR@K=BBedcWZlfUxTt>68z zUwNB%-&*sZ{*CW*wY}en?i;`NK41F5NBrl1;#c?wzwousd`&Mz`QH!c{J-Ohe{;U# zkJLA8g7>E5bM^p!{rGv`gFf&3e@%w?Px4Ye!};%TzxzJ_x_58_aNlHn(E;*%ukZDK z{e=;r|1FrY3>xC5fU;e<^d$bJhNU6q!^e)$R$&(<&RZkW3<%97F7|fcp{ftdo z(ZeEvF6L;^1}=vtiel0{i5u(mC5haFGQuYT;^RcH*^R7od+i8(KLQ$F25_hgEXU#1@?pqfZJX~E+#0d#r$i(v(AF=;vZW8I6?tfY51};XS)OKz)u&IGKDUQUb zFdNaG;7;yEBkoQqGqqZmV2xOv5mCl8FouC(8FhzJ$>P)+v0;OVFiK|hiXpt%SHAu9 z1t0I7x6W4RYG97-UJNJ5A~V|NIvvnM78c&(Ltcq#Y;7;y!PjnlFC7~DOob3{nAmM8 zk2b_$gGuAGqRts{micHsbp3$@^wj^ zzrE)ld}RFQRc2S5M`wvuYTlf)7slF(j$*e2&;Y9xSdD=p210b!ri>QAm3bA=^EKhwa6#=gxsjxh|0;Ps$%GX^IjNUa!|Bmu`!Gisk8$&647(Ty<$W?v+T zV`KS7In147!0s^5I&09(7-V3=8RN{i&I)B#{7#~qeVVWEK9mf?KQrpu+$lKi6jSevpVw2WIT9H>Qnd~!j&Xhc1Qzqw1mcYCR zS)XA}^Szcf_!sp<4T2qc?h3b`T^d*>jTp1+BQy!{ga~6*D>7 zD?^hU7inJ9{rrL3&rz+AfKSBn8hcoC57)jN@203HrNnBr>eq97y}kR~w&Z?qig*-v zLoq^72>m?Wm3zdP=N6S40Z38 z9{TCW6}i36-ud0(9uGg2n_JQYsV<840)(d2A+2%@7e_VSDmqxsbNAnitn>mnFH+8T zs~`HHuHmSmw%@e_+L3d89Xr#QtaK9BfO5^lN7l)B?=b;0Ae zFDO-*^348+j%#f)%A1kkkvbQ!1|}rwpl_{|Y*;pOF4Sz);+Q6)B*Ho(A>l#EO)(O& z$bPzN9*-fkq?|UUL^YV^Le&0V5lj@15rSgw%wULp8gNIx5P;N}%z0D+=2Ww-(sXb9XFIttae0eu3-@ ztH%wXj5ag$V@@5oRuiWEo-$W-7!GW?ph^-Y*H(lOW9;o?hy?ujAqHwGm{pVpN`x4x-n@O6_FwvD`FSYt z!I|a>QRhq}n@5kEwEp#$A_}{iI?vSo?f|4Aj)X`^O6^QaHA72A%Zyq%%%z=;nkS?<4{bo=Sp(bLS|yuB7a zxN2i^h=Em7RxvOJVGK$TCCW_d#Sr@xSU-Ni*^>(fD@-4MOxSLTwGaciH*hip8XH`U zVHj{Xf;Zr0aOvQ7gqQ(PbRDGh>=4soA8aJ}43uDy* zbRw3KsWt}qH_jEgF8t<;EB6svCcYdeq!^)l ziZ8`ZRT^L|B_Oq}Zwtt@4uN%77I-&gN`<*r=9t)JW0!Z7=a;y^bl&<_rK^~{;GEGSW~Lg`l>U+Tk)0>mW{iAR{HO6?NN7u z-j@J$B0^oje_i~6+da%>CWJsr33q3%8Bi(I5UGnScy6A| zpDZ$Z`F-4NpJji!d#{H+KJM>34BJn8|KUCLC@-$P;OXf7%Y2%KYYt8w68%{%_}yyg7oZr%G?2fpv~5WVm7_c3IDysP=*s~&OQ5uzuBVG`>yYGhwpt1%FjF8jg$u56M351 z?wph==MOi0HNo$dYc6+N=295P4dZx5#wb%ETR^K&a%I0S%u}IOZ!B90Xi)ZJ#3f=9 zK@(LPyP=c}?u2lg{pr>iOco-63$X40U zGv^BCGo=fbkB z0HvS8>RC>Ep9wafOr9SfYYZ((T0C&Qoq2Y7&C}g@qr6o zcHqrZFZU#^Ye2(53W;KXO7q;)2Fxr)2&w^*Gsax_ws0+g|KvFD$7bnj%`!W$j#e-8lQmlCyBaMk9gabfW7VpFWAvWn}b!kjSAb2=1 z%Z`EB24XB3<(oD>27p5d2PWD9jI0%Rj@ZC2PaNL`U}|lQ=!H$Screy#4C?{k7KDIe zOu4c;-|*zCU*iWKyN7EVzkgCg;N?ys^r`}3MDjo*;+F(2BHdXO?e>3 zF8fUbM)M4{$idgJR!7`8-wdqR%JtQZgf&H#wK_WOh;Gbj&GXC5)2oTEefg_=`JJ~g zVq?Ar#ZkOYxRtiXRRg5AL#5WXR!M47s;Y}8YHP33st#JB-WwxLo#v^FVcPpJDD|*j z1VRc;Hn;<18X6#NcjnA7GfkvjSI|JU%v3AlLR_s`(R^9+^B0(V15s0K?TcdpO0Wic zAxNE(GLdQ_c5vPWG!AWSX<&|tJ&|jHXI8nK_tZQv6lZ15&IK%x6dtA(XG7!y_yZ3T zPr}4MHYgwL0+U77NqKTUaw*p&QC6y4q{t>l*3#I>UMrzGCY7=p86RCRy!C+dbwWPg z;mr<6^YGn*42^F+A(QlZ?P|BMj&)Q@=Dbvd2Lp3uP6;j zs+~dIrmhk+QK^KW2l-^QvBX1&>4ttq&l8#tkCwrkxxmk~6j15db2Ig)S@EgL<@m!bA zxOF4XnQ3>$wA(hO{AxwHx~7(y#<6z17V>^irJd_)DooR!i<}wK3KbzX)SR3lX2Xl2 z*814Ge!Zl~I1Kpp^MfC}FKs6@)yf!PzWx2`?)4wPejK;e5RTZy9XwrFt}lDKxCM~r z0@ZHb*Y`ye+L*#Ar8FynQku`R_WjEZA>yKaOmx+kt|WjqBG#gMaTiDx5xfH0rPDRy z+UDY-5}^ygdQ&6P3LU!)`2hjG6XJbL=+Rg^y7$Fr_(zFXJpVpW+m!_zA`Let6Bl^B;bjf9}tGm3QB|&EEZmuRq|u zcQ*XhUwxnNeE0I+W5rtezWY$Z)wB77uWpv@|J%! z?^u1o6Yr-u#qUSlpWuJ90O1$E5bbrZ?`OP%;5Fmk{{Nht?~RYoFTn7)kI`33MP(qS zp?T5eLK*^3-Z`i0z<0kp^TGSqTtBV&Ah<>5$tYz;r^XH`)p1&Zu!hu_Pbj(xjiFgu z!q#F-E&^C7tU{n#lTxkOpjJW}7|zdGU96e+6E^Q)oOMiZ#hgx1Vpl~M|* zGHkv304klnN$|?xFu0>p@$T*B)<7PWb}Onv?kP1&!L_m4T2_W9enjKu+oAkE+z3r!L3bId?C-I=-oV@f2vzUO)%qvi^J(K@0ez2Sk-1$y?|o`i8f(_)LR@Xwyz?bqy!SEt z4?m{HND$CcNH~a5-H9=hVj|al%Wb5HX{ERk<4B0s+v&zr)67~SK=ronh#?^!KpGvC zYMJYKPp)SW14*5jXM(}DIv-zWa?U&)1CQ1tA5MbjO7#K~P&0ya06q?F4-Ks9EWa2d zu`{=<_g(07vRY%D);i;+SQd)3^+UT-f=Oc)55sVf*{-!>)o=v~5h?W({j&58K)@TT z+Xb(cg@HTe%+-F+x@Jru#?;twp~>fm)W8axGExiFLM$2e#=drxN+5b*C&qOWa%lH6 z&BoPrVVet^@r>sNnTmO4>w8Gb`6{!K$d}gd@)h6n&V!jhvN_`iF9QGIgPCVjrtBhb zpRWlHgE<>jRsv(U1TYswSL6u#_?)wMAGU&`7gzA?Im297ZAOaT07+6?J82L!HrA<# z6Nf;sR=i+1r5Y9*TTew=zxN^yb1*580znoZX2-o!=U!}4A%q1U>0qBU8EUomo+ed% zK@HCdH8W0YN=QJt}4H@EBw6=Uhvy_&$r`4&c*>H^Ntq2Wsr8I$p{MvKU?kP z7Pv5n&Lx*_qu|!TBSWZMr-2luF}nS_%i%VU*q}n(Jwr6$Lu&&MQv+X7Bq(39eP=W( z)tuQY)dh|1IpEv#m-%3K#Ya=7#zaVK3IS?cm)A*q!Bb`NNTmxKm^X0x;EM}wOfLI{ zIpug=>+6~K_aWLmYI`5hi!odq6Z04_Zgc2pjgtn_mwLmb4+k)|g4cdc;Z_08U8d{d zIjgUY#TTFSE?FDDSnQ^N@*KGj6eJInV;s6lT`F6PH~E#Y+P+K|K4Bx4u9&8 zzRMr^r6;$3w^>F0#Xt8ozWe?)f9-F*&-2Uq-s4?dZutxU>96s7xgq z{n|wMKMiO6J88|ok+=LSdG}NBfO=nX&KKQw;pe=#=rtLnuOC0aZqE1DdZ<8ape+J)5C$ zJ~&}CY8A|tv@!NVf}$a%}|FaS2ProCa{*Ej=K2eL5jkv3LyqE zr6pQ3gdre0Lj4gmpnJR=2!8eYcrQWs-tYJ~>+@#;f$t`Pmqco<4P<||h0Du{7nd_v z6I8~Qz>k7UZLDhmFHOd?8dUHCR0U6no+0A}GK`2p-ES$o=j3S%QW2+FM7lRdX&ew; zqcTwCjHwKyePSI4VsM5aj8PerQhZO&nKBi2<(hFE8}O$zHfRO$+I$Fuq691m7Mu_p z*rNR&76zJx*riXK^mQu?h^RVlxyjHTlIl0@c+A)pS%3_=)wT=s>=*z(Zg=zzb+z$JHGd!MX?U zY?XCfvggtyvqdPSU|tx86(J~QGhs+b3RGLbVWoIwnw$5jCP%%=7`qD}Ki~3fI}wAh z_B}T3pd_S5YRR}7;{vK$Ti4o!w#5998hFd%>D$@S4Zvvy0gG&~Sz|Nn0s>fL{)S=1 zQ-_=Kj7^y`4uljzZ#AvZeoR0}YWGLF@fSuW9 z{@w@Q=PT!xZ@m?Gca_+MN*)XyM!2}(ow{wF?gGJ$Sgq%_8UV@g06mYa-Z^JXz{k(g zr5R0y5{Yz^X2_Hzs-v8 zmziWc9&akYFs=!?f%QZodn=q!T0x6AZ5+9RbzgIhL{(y+$6K$MDpF^th6cyPFcm_I zBp$RmE}$`V5F5ZTD-8S6+2CFF8Eu6srBb}`BwVtqGh2Z?tQm%ZU`F&z5Lm4Sc2?Qv z(&xG3-oWHig&{PCrkS;Z5bYAWeZ4#ONWBZ_0tc|yg*I-aSxFq$MUL0C1&DR%a_D;# zltoUu=`*M}bf)gI&fYDAxqB_V#i$}sYMY2+=ZFpT@sp;FYp&X zmWPop743^m^hqlE6sI`Fj~QmpU;p(V@Q>cV;?Mu7udrF)ehmETm(KX_{!72eZ~WHB z{Q7_KA-UWS(tPFp5Bc)H|5x~(Z+w|w|0jNl%ZtrtzP^t|`9BQj{NK}>e|_HZFPEPN zAo$J1k17N7S>v>Qe7^DHd?`M~Pd?uC{5r)?cf9HO`Qse_W$!JedC^L!6yJkbS9lU~ z70UEO-g^8NZ}Es9<{jUA{xL7EXCx{q1;RLzt1+8{D~96QJS`m|Zg(hwBua5%t`2Hw z5C#I2mZSnx{%;E^$mY_yQH5`D);x16g{WDgd=dU8Jr5@8)Xc(lGC zRb`eDnIdzBGL`1pI3&&jy`Z%L zJUJM9F|s%5)F}P_q$i4L_gZry@Ag=|W*Q1Bj1(e-N|1=SBG%*s<({wCpURB+5yr-k z`kpr#$Dk!N_RTa+TwPtU+wJ)7bEVXT*@)pFgZ02DZJZ?y zjN`zBv#S$x&IpwdSA-y#8d{W^4WqHpO^xb}WiBx=j*WS_xDns5ep*sDNb{zSF(O`W z`CRs^KD6I$HrpqeyCE!Q)JF`mBUTh}i;ecGK3fvqDJ62ww|;lrmu?ju65Bd6Nb?L2 z)zLA+FrYCuze+cfz>oqeMy{1Cg;JEc6sp^eJTbKafMN}B(gqeUK*~6-83sor6H;UT z<=hhWDTVf0P&C92T-D~CTH)E{72CZt1_*h}i>J@1!vjLt5JVejD1umKD*IMBU^k$* zh5#|(;;o-M0Ng;G*1pZtx3i^#fj7X+D~JaOh6HWv*EBQj_i!!5^~m~cLl}p~Z1kqy za2K37W^@OP;NE~rH_Qv-#(EfG7$^y-P2PG4iFFz|8%GjKo@d7Oio(Qny{umis4iyg zF|Gt=H|lHzRfei0iOeZd3+R5!oP|0GUX4_p^DuC}8VMngA1Wm(zf&Sl_mPV_bGA-w z+$nX(c`<@$lg&pdSYywHhz^l@{+RKtk?|r>pMHdY@DZDxK?>}nf)%Vb5L{dtLL@p( zu_8MuHDAzxH;LrM`!xhYh}g7k1s7ErV)KTDh^aSFYtZzL4cB)DhP@~U1ZGgWt zX1v6}U{BdkYl^Os@fxwG#2hHP;^P?j!RjCJj$iPn(qlFPQgf3)_dP#&{t?$22n;w4 z04`R$RCr^lvyZp-1J!tItoSs5HA(Xjgph>UVX74(3}s}yEr658CdXXqZ0A}rSskeb z1Vr2UrfFuHX43xGu_tfw@ZGOd&o3|n$zT(N&8V0re45B!sIHA%t6hS5nK!-v7FK;T z_HAuyM5ahTh1{TGEMY{TBYwohXLMxMM z_hPsD!)=k~w<90(n|ZuQ7Sq8z>EI!K4OVS3?SFFzlEJBe=b!+MuE|3k&dunl#w*tCb*NszY z>I~_2b9~}?_tU`M!~0(I`Q)IQ(ZSWj-;ZF%E@4bu2-Yv4J3#p3R{eKvP z9&UY>MYnqC$9|P}&tv^PxMR}9$B&aOdS}di+B4v%{rf(E{bu}s@;%4n_vbaQc8XK{ zT!*_;az>Yj-cus%rzS*O#Xit0Pft?Or#Qtae!TeZ``7$G{)2zWpZVkO@sEA;;jQ1P z3V-yM-{M=}e8}JU+dtqR{@#mw!9sE87ryg7zWICK=eK|H>-_CM@{hAykDvMaejtJW z-FVKwJ*@fH^Ok=(?-+l=jLG`O8JMs3$h<#+`-ZRYp3~pwG5bYl5Z?>1+~WcJ`WNte z3|W8e=dw54Kd;H~{Yi}O<75xqByHLk`}+zU@Ao`^WxQdJ+t+4Dzb*s&b%)=5{eRy8 z_`KWqzCG{WC&)-f{B1dL<0B?8zu!P^CPZ=O49X;Un2<3d3RWU&3GtcP_C(#IVZ=jVDlnTf z4g=>z(({Qk{Q=_uA?_H`jM*NsijL>(JW#Jd#aInWP{;Qfi4F8IExc|2fVqOLBEC6e zsw;Lc0?3A8bA}BwW6WUJ)OyM0?1IgsFLAkz{G<0@Fua%>aO7Ri*^R1npT`2LL@5=| zgm+w2SG@5ZI)1Jg=baQ5ra1gEPyHp~Ty)raO$3 zwp4xEAamSbEhBx8Mf~CS$J^ZTmi~#+e`ma!PBaNrh1wGE%k_&0gJ0o9rYc-c&gFIC z*>z#JPvjD*);w`7fcdVSUj>z+dGhHVF9Y>@MCXyDhRIAe11$(|6J*`|r#&|h*0{nS zya(&IiO+;-e@&<}8Xz0Z_iuH<#0JTYjZ9QrXFMpCOfC)dNZJ_eB0{JMN0}!lj@rOY z@2uLK2?Trw+bZfxu^GCTZKTOWO9)gdgDR_#*n~_V6RZJ!uDw4y^Gs?z01}6!GqfTC z5$p)K_{8Y&CfVBn=r*omjNQ*rh;g9Wp60!&pJ4f_YV-0wfGEp2b<8TNLe)Sir2%K= zma{E{Aj8(ZZ<44@!h;oVhdY9k;|7g?*`98YB~@ zz@y+?e7xo3F=1yb>KI#}mV(*bR1Z8;QL=-MD<(HKgCKb#&NI7sPLc|FCQlXD5n+Jo zl8qWW-vAC8NTGQ@)@e(awG}I=L|LDDr9SnSs4Ou z1?EUD*G+jM3(kfN%q3$u>+1)6C(o#UNDOQKa2cTp)PYN@xLm;M1u|yfjA`FwmFt|_ zKAVofDY>)$2F0qf&tM*!^mh(W+xQ6xQ_Uce;)QA3*78!JmVmIr!bmMM5hny^vK?~( zOOdTap6Fv9rOMlz4>`XOb|tdS!d%u|{vhx?>?k!-?3`(T%@AkKR*77dnZP>NF8v(X zyHgcX3{6SF8WXqOTU!@zAiL&+d~4sbwk{n5Shcf4m(Qwed#3E`W$MrO%@$Uu-4%Ob z;iucw$WN@bx;%fmbkBD0MIbcWiO{T@MH|ByH~@-C1G!rXG{*sN#VY0~)+CB80~HBQ z@tNIpO>kofidgf`h7rympzDb>m0<59Pd{Kq+mlsCY*-;Ou<8X7`*O{8ABfj;D`1dj z-BC+v;Bo*Tlr%xcn7U#^B%sCdY?x{r*T}&~_ok^DA<4^4@zAm-9lxjL589tvm**bo zdkwh1n#5EOlH0w|Fa)R-suP7)To7OuVOC``jHEO)>HA`&)FA9an-8(pRuG8eq49ec z1qbP@TXUysQ>_qhMM9MUZT#`}&}4>KJ$$|N!~d3Xvy9pPvwzPJK!P??0g;2Er{HL8 z?Pc@aeB}dFU!EU7**1sI-!W6}x6{L#%(}}F$Ztq>qUZ?#KE)}1p2NDVg@({%v`+EU z6>>)^x&y&>0)tO+ic{PZ(_HyWfBk#>_IIB1XaD4vxj4IB^SN0^{=%RBDu48s-{x0; zTnfZEayA<4 zG*fG8%sR8?Gs+D+LRHzU)~tts?O{7#Q!ghp27-I@lq4f&ttr1N0z3Xh3?<6VX6- z1C0g*boYbUf<&N+VvA(4SXnt|-n`=(V%po?&1@|_nC~4s;>101Gf!RSP_ga}oQOU6 zU~X<^zP|N+AM2&DTt!xkifAT;3%c0A-5`)Bq4}eMpe*{1S~Ed~6eB`v3Ha(j4-7)OC8Aej7Lv}JY0~pa(aA9Oh;S}6XVquFI&W#f3HfD;?tS6BhuKER%SU@ zcd9$oidajyCG999cqkOTqIhB53(IAXmkuq*gzguZk61`d-G&e&RaebNwaCo=xXJ20 zWPiAS`2}KcQsX4nBQi@Hsx=nj3=-nPl#jT$+H!V&#raiXtin{4QUj%eYfI4YSz5a! zc@quC=%@&jjg+z_%fBi%nJNb|ib!Q)#k15Q9 zSwx7UtYgQxK4mKrn+lyd2|=eyXOUI6fG*%#(HM|4`-#uTJ4t2C1&PjB4N7y=E>-aA zm^4OaHD@fDDOZLO((D^eEqu5-;^#SVaT$>MHrl<#v-LS|CC5%q7?(<{OID-MUv8Ne z28$l($+@DQ$QXlwOHU*HD_Wt`p2b+{6&A5)GYyODd4bLzzoj^N3j1>m zb53n9FIp;PoEllZR{8@;Z<}T3eFpyBnum0V+L-gjDAmcB~x!hRS5+XbKS|QDT&r04-)Y?3ryAX*QC?=GW5phx% zDF(SzthV(;^b14+TMJB^iCng4Rw&bi5D2{x2uM&WZEkRH>mc~6$0!&f9NHhqt?&9C z?Dg7;6n69UZNT;JBKR-%T;g)GukF@@cb@yM7(v?_6~Fr#_HL%{FTV~nvj+h9As*td zd$@b64B9PNA7r6_J7WfeC4_zD+JkTKLp;Po+!sIp=!*aR|M^4yy+3-&-}&y-g9oP; zPagIBZ~ud@^U1R<|NLKl!iS%1?%ignmB01pKjgdL`w4&f?XUA^fA}pntHrN;j4ws` zzjsIcleFePE?fSOdBc16Bv2pXP2)Gbkm%P85WVTF>h~P~?S#gw-~V;b>%VS*?&bq< z2w|UW2%#ln@7cnae1!My{!4DZ-*AuRUw;A4>+hd8_gH?9iug6Rsk|_ObyNwKmnL*jPIfA3>ea z?373MCJO zG_hPJyemx8h6asHtol}+5QgO zCG&U3U^p&M2z?;gg!xOXY%zntf~afgdWf<0HFJuW88c`enUYowyeT6d6^RK=M<6{_ znjCSTl&*`!&;bAJg~?L$1Pu^0l9Eue&EPIX4>R+t$vcWPf6lSwnLSxR3PXk7VWkbI zZpfltm6!7&iIVe^p!ni>~K}M&`PS+(yj9fDz&fu8MQqd~SubGi` zw?GJtH8&}B4@|}AB+#dTnWCOq#CDvy7&TA085bXX$W#O4PzWJ#VS%4|$1fC$9`T2( zM3f^=>k5X#%Q`ZYfhd74bc~x3NrBMlWO%K34wSJ_O6BbQ6W%#p^3FStNh(~98%9fH z6}HugQBZY4NW`dw&>@m3S@+<4*cGTTGl9JUhM`tMpZ0#sFc&e**C^LYsJSu5<{|_W zp*WOM0d35~*gUoCjvPh#GusL)c?vbQj0ZKy(&7(Yxk*R*(Xv; z^b6>NvJ8pdp);qepk)GcjwO((6jh=MVg?SOWa@CqN2TzM_ut~=trc1dz4we)nX=td z&z=#VU*e?_&G$arlYob2DWKXsRx6Hb^NcNOa~~~iM{V-90Vb;yGiolBQV0Z08>^aX zH`atZ!28l5|sDJdyLN-b=* z8S%{OXpNh2x!I6&X3_O5I!8P+lu9WRUDweEVHykLm|H)0ko>q(mHeN`ziE2g_3M18wDoU4@Ec!KJv1p1EQ)b-O{ro^}Qq~sQ+QOKDO0MJZybs&_P2&|n z`JVT8*ZA{5;9@je588e1R4Ns z0Q?XS@en{8@QN9t`Tzv~w#RN!^WYo&5D)PXUm!{~{`tT9l<)oMjQ{z+_b%Uf|LB#^ zyz_L)KmLc`udbkAAXCAqhH-4cq77p zo>u&qX~qAt4E!f$!ynar{}=CwUpD~pn?4r*y4&a8_$_D1{>HcOZ+INaJ?|2HyT58^vNu5xKEOGf$Fnmj5;+K7E4S1 ziQyh*S4Kf%z}?8xfL%Cs%E-wv-Qt*T3XGcz$}|!?2+JmK8phI?hr#H2M`K2OgXDpz zPFgLgxiOAh8UVal2x&Q@IuYYLxJ}eNF_jV66{{K|0joVJ_J~3)6Fya3DygqT1^12+ zmS}mzryn>!`N=tFXGXVt#BzCp>V|!SwhCsIGBb3H=5t!iDYa6WWkpS>#gSTxsUz1y zkqM27AuG>bj$D3vMsLohMEY(?zv@_|$kEDJ#18jDl}ysrKAE}`q~BdnaqgYJ{wl|Z z*GfNsPE^Z?7(pCY#Zk7Cb8$X!em3yIvt6RTZ?qz`IgM&#(U><6yu(E3u1LWgiY+)= zJfce-AzU(Dol)}^Tv1(MDdHO2_6&kC%Xe2)9HfJ=B4~$1p>@s$CLKl~YMmLtN^|iv znAv^fq=*X3P6#OxQzjcQ7X)Zkm_a$>0QW-l#&%CZ4;WRq z=c746dy5@>$TZslwzt_+hY9fz=j})X5_jPAj@fGm9+j^E%IbSr&O;XJzQ6eFJ$qwb zElgh9*s%yKo;+n^1=*gFv@%s=91CSAT$mHJZ%om&Xy8XNj=RW86`Pbr5{{Nj60o&_ zWmJN7lw3KAk&{j+10;dBk9v-RGYk{S3s1Et<#TM@vg#7LTJz&eV~7JUz2|!`2EO;v z$2>lHhp)VyIDWK5b0J?`l1*4HBB?kvHfH;9enH)icWq27~uMo~cO@tN1K9{BJT}2f;KzUY16IB9?z_imFwQ>v zl*>$hD>Xb5DhY-?`CPEql(FqOu*Hx;ToQz;m;r|cLSfTe+qG1WpY zl{y29S%lz?g%|z$zG~yK;}&SCPHn!<;)FdgrW6eXZL;pU=4)oX3mQ9yyhYWCQRrij zicqJKQYtY<-g&3+(pj$!=>y?C;l1rCfA+7R@%`_8%GL8@`ejcY zDlD5sd(N3WO*l%7&5PNZyaFlczL*Gef@o7aKpMzD%fYMaT>NB+HMwV{GFU*WQ!SIC z^WUYXtJ>@c55}Jz0DO4e4kN%k#?D}G4Et@kJBZHG&^tiv#_;=v;&5EP z>vff;>LK%SD(xCMGvjjxws&LbzVOGPiZw-&DtLt`5z&A%&c(e2PPLehj zxM8HGn6Oy0SUsX&oe;D~Q>3V}$s>8HL>d5XRuFqt@zZAfv2s7l_lrJXy^j5R8+87> z@81Og1C%m>8BN#R_V=~95vyS7V9jN1E*Eb;!eWkwu=jP|&3!hn)!YvmcNH&0kRhc%$XJ3gS2C`@3S-j}DLTl|HI6uQRzWMsQkN2oC`8Lp;Po z+>9L%tlE5VzU(UZhxqd2wr{YRwQASjf+XofJj6r%yNmP7iT~#R{WIQwcg_Fo@4my+ z$FH(>zxwW)ufDtHqfa;d|NiYWe*WPXk%l(@;QK%2_kZv+e)P@v`LjR#7B3zh|H{W{ zz<(bX{P%IecP;aulr8^39r$fBGWfCqpkJ2pb35*R#`!I082+ZufA=!P?qdkwD=~WC z-STD(wEN;sEtr+-%KgL2@V)%yeb@iZcK^l%;$Qd5`rh-uX8?Fp0{Z>q-vdc_gx*UG;0G%O;N$k3jRm-B@K5rv`yACzGuuD^;3= zXQ`R#vXZw0<{Q?1$MHfrSuYV$stuSJ5(C}%oUvTXod%pzM#OTvbc@EKOqzg}yezd+ zriw<0v8O)*n+B+bTqgiR42ZUbTMP{h4w^6%L@MHeplgJuOu6#n!ua&#E6!gSi|&}C z)iH=rR1j|od#X{YkxOPOjeXk^f0HZa9ivyYmA5wkKU#UmOTQ~1CJ5NHgTU7~i(XY{d0v?p}ObgtwX=xlM=c}v@##0VQQEO zr4(v)++gy0Ey-#yO;eMX?IJ>B&sQ-BiGZ|ZvKc!`)7wCrIkgjfG}a-ojsdb0OgZWU9m4roNg=Ql$i;D#P93cRo;X=3M_uIk#e|si=txi# zY=T9KoE)t=4g+Pn;;pV@(Ip=D#y8$uu!%j-w_E<@<-}F_n16Hi8T}%%R-sIlK^BA) z;ff1Na$ZcAeAAXJtjEVl9TQPc2}E)Zgf1eh)5Z+7N_FT|Ny&)S zFfH`HX!k{}h{`Oz3RPPY-o{Mn*t38SnT-tqHn0W&iL?TYYKB-Q84a*So5yEpU}!bi zOe5RvK==F^ahh0an?ttafJ^20@d-zZCCd~*jIN6;VnAv^OC{wDb!`5yF`-jMrb37b z7iYAJ$L0%KF`{_08wi3&rC0|z<5}gSA3tNAdTJT?_=C^5`0N}XN0Jzyl?G~d)j*o8 z@mMl05R##}6>F3>K~c@fR&f+f%4$0`nOm`T?*nF`$+FLk$dDpwRuJ&gJhwFlx)8|2 zFyG&`frm5Wc;^EgV+3#V%k{wTv;irNiJr~ym{_cppn+TmqB}=@&)44_c=9Cjx7O|Mj+dRq%Pp0H z9gA15Up!v=eo0&$p&=o71IOp$r0UjW zzg39@swgIP-xjy!ivOzPuC?%eugwJOR$N5`+Yc2)q!xS}fey6_s;!VwLhBZKy|S~7j+57-SW`aVJg=}2e;qbum7~2jVLYwk<$8Y>nL9+ zK2IG)HMHW$?5#yM&C+758?}n&#JC0Pv+3fc&NxIJ_Z1`o{ae_Y?Q^pTDXj zxjS+m_kCGau^B?xB~9xL`W7>CsWStrCCRPAWxc|r$HnMS#!KOHs+1~?9ceq(UjwTe z+Y`hZgDqYdMD)8v-B}YfbG;S%S()kMO&k@Uv#ZVG4E(swv|3ia3Uf`CH5Xqx3 zY-DC6MM8{(c*gO1!Kz;oLcu+QWr`bOm9Q{s&9ndE%+w4m(d{TNUrcN_nTwYr7ncKs zKw5&vZR=Yapw29#;tc?vDw8+Bz+Gk;X&RfxGLryFn{TPZqbF;E7%x8C&>t!9eC;Xd z3iakoIc_J$s|}+}3|%0{L=^!K&3{vss53}POZOczKflblouB+=@1~R@6&MEN>@xHG zY~bP|Gi31D>v$)1>+aN9Qqw4ix1{%;9ShgYJKASep0OP#M$Vd_Wi+hcU<{Z!ULWB$ zgEqQjO4=;o4PKj^Xk-6I#AUV#E_+{4cgL-?Z2&Fpsxxs&$kj-*4{%Ch@9*2>B9&5R zKTr{h)f;n4v_hm3%@CU3rD^lkCMae*Z&BZad|%|6-af-h3uYo#^{S{q$pAo(-I8rb|#{!6=#K%2}>g zoIl@k6a!s=VQfC)%Visnwh~!%6|=%%5nCo=2e|@a!TQt?F{T=bU0}IV#*Hv(V38n7 zL5Gf|Ea}sl!Izj_@b!LT5w<+PI^%DypRzq!@$)iqnMY3gBPM!2xT;)iH~7)O)zm=k z;E`2YQ#Th>+tO*}(kh>BN2aTZttU49l1UxeDBn4tn&_o|n0~m8@ z`4y4Y|NS7}Vvb`on0m7Spw=D3Fkls?I#J8SLg9GP(ajRnc&1pTRwq{@mQ1RJBR7_P z$8p~g6J$L?qp)7CSoaIUNugbkW7$jT!lb!fg(VpNT7(a6~`(RoLmca ztWBz#=CONOjmtKp`z)cuyX&{Hr79cKIHU=+{Kx31CpN8fV+;trxIXP6eQ}g-lwWmuxCdOEr zpY9QTD;lv@JhB_RV+=%`RoAYsN^RqS3MmRf0w>2SPS?L}O-}%;p?WgCY*wHNumFIN&RdQ_S6jP6gkaNbojaTNSNy^UN-|n+afjfOl5C!oj z`z=;kXl#o57#Szz4zHQ0M!>LKnMOn0K>{&Dw-i#!zyOv|O;D8W#U;;QtQociw}6yP z1F`}&bW{m5+q8kYH5b$yVC|vJ87b;3hu4A^Yx&%?#N!e}30}aw`FY1y9Ae&-JX-1Sd=7Hcn|6QRpVKb4 zWrly1*l*)=Ucc+}x93g~A&{}{C3qynjt~QM9oqNUG#5YXytbX^xTc7C(<1RMAYXz) z6=c>9xjvRziRTNJ?;RE&9G=}?bz@hcu-A$Xn9Nf8e13cHo&gTGcl-U_x$KzT2z!+X z+#dkohj@sGczyWnfAIhW{|<(zsjHd?YH@}?>*;xKR%&XA1Z27MJYVyzz!EZdn_ss#KH%q|Z&#=B{t#mH~@%6{|rVQFQ zk9#TNU-}W48RIxIO%r|JlTw;JJu4yJw^sdiH{h4ue!u?f^P3&7zyIEtq5g*WUKbmP zCL&mcJWCiC2RGq-*kEQ9bEYy&eAdQJ1km7kn57iW$&*7>qDLakpzqClBp^**7Z49j zQ|8jP^!-E#5OgE~UCC^Qf&l*U_EXbqu>gX0!1Qu3T(HP=bvtI6Smo@ArQI*NvK|$MC{CHOKGwymcCQ>%3#VSn}@IPRQPKH5Pm$OhX{Z z0+MlYNv} z1Df=+h!B&qSS*@H@xiu4^v;C+j?y?M|_$Hd4kIe^7#d^>p9+> zvAQshS4t0T$B4PoC&BAT4vDY;3(jRObjt<4QZ9#)%RUem!qrr`)BvjvkC}1w270Y0 zE-ojAZbjD%xvz|4#81}HRW{ozUS2GCYq7vm$C(+Ms4P3DSizF=u55{Y&uN*sDif#2 zYo_Epv56@r(n|QC5B%HbXPj@Hue|jxPuEARg0Nm6ai+`Ge?w+tju8+l>y%lAiDhYk zmx(jhnGs5drLL*2xg#;$NaVX)V=}7{-S_^XM)MDC*FtB1N5KuMRgA)fQS+9C!%66Q zBxAc5+{seOYR!MU2a6r6-yf!_dHW_&sK!Y15Zx7c zPzu?bl7a~gdB94g)CtrvZT`)rI;e77GShg*XFs_hhK^hU#hWZ`4S_@hV`?sYzvPr= z_I#;a)?wcsL1JS(<_xY)W;Y4uG@WCRq+PJB+tZx3ZQHhO+qSE1bK3T_ZBN^_ZJW2h zbI$#-e^f+8Ra8X9elv5e_2iI3MyXHqWyhX^(@?RJFgE@K%<2#uL^|TwL_68V=Pq`k zykbl%452H7J^K`_kt%8Eib*kRKI4ww=%QoQq>*0MU$l}n!nVA`)5LkG;B*K)k$gyB zwmKh83_43uMM|a&rUMb^V$}XtVm77hPmMfQCeM-#-Jl4wN%iHdyht^P{KDkOL$wW5 z)$qR4_ue|N(1fnVz9?BkPdgq>EEq)=Tc{-BpM=aj%JV*w)b!%;k2wWdL=3tAqvu9xCX-sJ7g#e;KgS3$xO3b>!$tn-5xlrBWgyjDT` zE#8x@Uo)T%y!FrLo%ZxY*g9S9W}t6l?x}7%Das(A>$!5)e>+c>tOGUhqH~A2Nhd%Z z1Zwv89|2m|r<|oBpsnmElnqb>?09sdxvG;lV@Q|{7$I!!_Ouh_;Xih@&52gv)SYL* z=gjM9tE(I%)R(?1U-~Yd-qSDj}7T7%M$SvSBZfU$=A=)E=n&K;c(XKLT=y$LiP zpzh%AQw7jRsq?-B2J-#6y2I&Fya_za;HV*YGe zqWn(c2Y8VazZ{h9Uw@B!f5?ANt$z%{>)+XTe+Q0NyaTT!{eVqBzjyWThrjQ<0oUC6 z$MnA6nKmgkQu2PYBaq*=8aLaa;M;Zm{MFiDikKQ-YrLd>Z63y$LVg_e<72e(%8F zsd3vEkJs4JG(D^9&qG}ix%$q)ksE~(?%%iDEn&;gJqW=zLo8^`{|3xPV2w$&rSa@c zkF}S8WJ&zpf){|QrrE0!9!=qG|7a`Uj4Vu6{tt{2R4KD8sa3Gn)tZ{zCNV<04UfIKX{d z)6oUVd}pSvlgLdD-+H`B(kO$7o*p8He|=9lY)Ihml!{?CT5xMohH|;Gu`P`x^F}(S zPLt`bDgqH7dC7aXxnn&EeHMDR;e<8>mGMd~p!47%0ZFKD&Y6#!e}8ar;1ymiYgNSS z8pDU^hZy3;R!mssN-Yc?|Mhm8Z5T3aG-@4Vp`Vo4P(Y*ufX zQ(-c#VU)U(%t_fZA2omlDbrVOkY6`dgZy08(P1GSzKm%Aw|tjP$0VJCS3kMZ5U`m! z;EMl;L{@KYFuVb_I#0v3U(QRh`cM!a`K$#v=JSzLLTHJ#8O|Osfm^iRf)CTvS1w5$1w!(1Y)!^TX3hQ zam(WRV0z%h^47X%LTbZ~-R~r-LD3`!3$perbf>ctG_~F&J=k(Y$CJbrSC~S_lsIgJ z4K_L_eUEX8mBGOvAP1*GBgp41aB?5DGGxw{VqK<1VxV>BW5T2PvhBm{kOMN)QHZy} zi^tGZ8jIg}vFi1V?DpgZar!ZE(q-_S{Q7QlF>(JAyp+<}t$xo5qb{vA8W+7O1{((1 zYcxJ3jf}1B&WQWgh$eczHyFtX#0u2ISish-YrXm!LWq)mSkF0W@G1&S+-3uX^Pu>=8;84yIm@EP+%5$@P!^3KO834C=Lq5GgMn=E*~ zj)T=ja8A&1RpZ~*#mNy$eT_&(s8?C<5UQkuBG7WEr3-3V2C^H#&gK-DvI%7bSmAUF z80iC$g7F;af(xFVvO=oI36CRAj&LrM%VjW;6~^UdEw+KmMW|sY?lkC1QUgT`S`6q? zA$_>xsOvVKo~WEd;e99G;>CG6ibT2$^+6ib_i^;EtJ4sAIh5@PV#-F(s&_Ayk8sF$ zv8r6pxTUX->h>uE<)=D2Bz{bufnMpgP9WEXDJ*33Lw3J z#}b;P}?yC9D0560Y0C+ zZrGSTpVz8ouRucJ_1T}X5t^>i_%DP0Zz}%bR9A5Xk})g?2`_MSt+fFRaSgQlUm5>$ zj`@=r{Tj#r39#$)?_PgQmh$*KP${ez_x`v~l)s+vc@E9-^=^*0{raZ)+uMIy0ghYu zuZv$FmwxxczE4f=uTj^4Aoy)>-f(AqfIjiJIqwm_toTPE*G=4c%Jz4aA^0|XO}8(P zuQB{Ky{Dd^Gt>kn#7OZmMQpQvr6d}-| za&<7!Tu-ZNXVC^h3nkO+Y$e+$>EhS0sjXnGGB$+stgQH<8H-=V?^fPT>d2fOMe*s1 zLB@KTbVyNjwGz1Vi@hFAgY}M%j(tvTMd$54dnV6$_Gb0~;E-i+njTNU=z7ofmv=+U zHV0piZ%@bu`RqsNd#X1@?=va#wJ|~zOI&p%JHOH2otVi~mfC~x$=4Kkemu@?NKti^ zTn0?Yu4xW45-`F^AmutJ`lSOK))ta9nqDGS8IRNi!a59f8}xNf!4A;b3>-^DP}h2> zpJi10R%zjCoL=ntqy7oi*0A*mU`;@*`P~L<{f7q8^r1^)i`Wg;n=K}(tY$|AXaovX z`%cQMz8W0ukvO>cv-Ct!mg59d76@=D#r+!TWaKZAqRS-S?Eg{@696jvDqx#own4o~GD;3zFuzeVqIgcpZ$qI|-EL-~E0+rsw44J^I}C zj=N{NOZcbhE_zAlp^i?1=-cTUN?5msce~Xwtkccw$aDyi+`0?N)$oS(MAniPP*ZPn zvGx1o4ZaLjrl|?I!-PvD6NOJgWQ4zT`a)bN4iUeLZ61FL(SJJrW4YC|TIm_#*=I^$s1O$-5 zXgUhkW^a|sspBOcvDsdthu{Tvbscu3ekG7>l|U}eWuG}u^2yF9C1|Xpb6!x84qt~! z3K(boRx{#E-E|y+UY!h=D%P9kbD}8JtXzF1;V|{uQB9AyIgA)2P|xycQxhuUPb#81 z$tn5uh|W=ofPH`@%kd#SA6VF-S4>>$h>(WMSZUp{A|+S^k3N|grUtF|n3H5mpiBCA zw|T1*9Uc8@=ScKC)EH%yBY`~(1PSI0db+b^{gNX6>jTx)_%`!c`n?WHLiD`=qO)l=?CD|XpsuF^Tv9@_O{6SXcK%4G(#PwUb+P3sc z(lO&$=7I-0kx<@JH1Wb7iK|@f&SeW(_tPTnb@%$bJL2q^(JbQv?e?0O?^6T$$Ncy5 zFPqQ=arvCuleeLZ>|s*sKcdTyDrk^WwKG@pS&7wx`DL~raX#L(tq8@E?{v%3N_IQd zCWJ^DrLDib7}FN)D)U{*3RI3-vCqj;nZKuBw8A$mAqjg9h-0?Y2i{10LnHw*OwH z3uXX9lS|0*xo>bwHEioo%J28pK_i3kd9K_2SqGyoMTe|N9^xpvNwrB|C2j&o!@ciy z>{X==7R@#N1Ofjzun1uc55wgr?T8>3xmnc4l26N>7HC)h1Cc4HfF|RtII0Y0pG=Ck zr0qYI57)gmp)@QWg?U3_Z7Vb&SU#udftH2MP46{+-FTkkFY4VlH^3`n!JwhUha&Vc4j3=LOIQe`NH6gF+^uO71YFh%)oq50nK#y#s%6!> zTq~wi5$w;C&+Clf1we&*C!zMjgA}!Q;q$OEX$5E(X8gZD`Rq`FHUT-j069KD6)&}Z zOUM4C8ej1L$qT-ZwOVyr_y_rZssEWU!CYD}IvyF`|I-%yeEPd2g}--7k2}AwGJ5Ve zO97W%kJP!y0rs7K6YN|3M;}gm-u!@3{jZnkNrkJGv%cqz*P&^?J#7B>@cVt%?e{76 zm%f(np_MKw{!dZks2lw-(r;IdJ8!+0?LV~N*w`GtH_*P}+jEdD2Xp#W^}eVA8>B_R z6MFCrUIhW@O?w=D;B{(`c!OsCQwk`ho{=DFE#l);rVyAoh!R!}@5%enSh&wjVD{bi_I_wEQ&z4rQtX&=?yC7cbiSy~ zy+4CG^cXE1D1-qu9a)D@J z?qk`3P+nmuVp5dQo?3|dHw|CoY#iO0`$H?Zqxzg0pEl*i)>1zb4VT7_}l}e(%0%eUo9N~YevwG+6!l# z{ytot^LN5_sg846mWxl_DZO=t1%Y3sSemy-qvxRNkWqg>yhe{hcjYGSxF|`0H$q33 z%5*F*qE*AlGQgTB(kM|=L@=_UZDgfw7QSByq5#%K4@0I5jXd!avv zKuzp##fJGvQv_L}XHI*AGZSvaxdMYq%5Mf-8)T; z6xuN~#ccgkDOT61HW8hmbbhR05II>{4A3a7G?2=!Y>@P3@g6uJx-u?|yA-Twd+kn^ z3Da~b4^&|DZMCJq(k06R%U>(cm4|Gj*3+xvzkn1nglY+WIvbV4HjO#5P8t#YLz>f1m}zkKAVIfaaHLt{$$=JCNktV z9D`-(xxzes`Z#Erdj2!rKy6{=(;QH+Y_s3d?6d59ZPeB5T;FWVoCb#7>;X5DJZm-i zHBfWd2Jhx}-R6_fI%(i%`kUWoox9up<(k@iQ9Uj}d-+IiF`j$+_{#SS2JCz6RjmzlW+LB_Dxd{~LNi`rh86_Po4Aij(vDJ!B69j_tD&uWq(@IL}_Z{ho2Z z4(xj-r};V$=zU)jbNzniakB4c&vex<-rsxEKZvhaUf++H=a;DMZ?arop9itw58{Xq z{W->OO7V|RuDhRRhrjuh9pTFJpW`F@*1u=MEfT9PD1r^&nGH%Dd_Igd!M>m^;}%{p z;mXltQLezVtX>-?XHihvCKbdwHB8%>I^YCGIRVi@sOn@!<6;6WD5X)#B&CA52n=o0 zj%k}ViuRhB?d;5sBx}PgF{ddPur%lZ|5hVRhvM@e+Z<`e86HUwb)Dn&zppOX-Q}Lo zBfLfU+xFI$SHFE>gbe+^3Xn_r%0?ZOS-Ek5H^W`4%+=qaE>bcG1qz~Nc3^OjvPY;Z z?_=qhq@X!iKU%)?K1(tDls_aT^y}qa6$@IBBVSkbCNtG#Ll?_%{Gp-V zaHgh-buf)-f)3GQ)}*djOiZ3*y*HF&NKyI?t!qP{xi%(`6-5!dq`}(7Tm?d(=Hcns zcP}XU8R-5tFwS&S1Ya4qoc62(aDq@D$^cJ2clNl3vVV+lb**iqV_wgF+K$ljt z=g*0gG^6h+Nh8=}PfWjg13Rg~T12r%rUFPR-qb~mf?Y)@!dhOoCFxz4 za~C5TWSTgpD0k|pA4b+Hr8&N;P4o+6KbB%k{0b*p4Z+Fn$`#gu>Z7Mj5z7ZD+r~+U1=boIG80g~^sp!bOH?PL!+agvc3?`0}KV{_*k-lhgGB8k6hM*yC%o zu96*c>!AnWaodl*Yc*j%4^|79x=*lyj)omO1jV4clPLD11PXW4oyEfZ$%DTRwHAXl?@ zb!PH>vQqHNBD(g8&&CS>a4Chn^P>r#nhgwFZJBk*Brf*WfA#5!5 zk~i%KvTau%rcEL5x0*Hr_XHvlHWU!EyAq&F!D=KQ>G}v%*p%OQ2n99sS%xq}a078{ z(1WrI@W@BaC5NW7Zw!~AFDdMP2KQTiubf1Q< zIHqFxwk|iSeP(J5T_G$KQ7VsU8;NH4MB1%ZRI83-<1X-Sh&Xu3VMEUUvSkb8@~oM; z496{S|J1FAUISW)U7NYC)fVuK4;aO#S?DFkhA$ zH?itp%dR{8<)He{%go96dxXA8d(~%$PYl+}J@{(=)4R`g+f@WP4$7fM3gCaj=UPO< z11-b`GO|!7w=04BP%p8WiNg1iYTL?ero{%bQNXn^DFx4p>#)qtma4V3+T`fMq1E81 zLzmTj@I`79F~i`DgqDB8WwcO|rzw$P+B6`o4Y+teUyGYxH@f)OgeZWk|8*RWJ~u8a z*S58lt6&bfaPBz(K`Ri$63GXmbrR2sD=6JeC0MD~S(=2k;D-oBR%uYDHCKwdA5Zx+ z=%8F#DZ+H##LXnwjI36c!rlVmYD*iW}(^QZk((o%Pm-RYxtH=^O-V4gNs5O9Bl3T0=>@ z85~|)QGzG>K41!6nSlbLdm? zKaL&#L4=zkxiO4*FbfCYN)>`dT(pKVNUb$*459Z-SL~D|D_=;rOzp#Vpu)nCKG*~7 zyhbHNQLjWZsOC$BxdnRWr0+5p%9-TKh~|xDk!*Uxw(m1{tb*&nLM;ghT3(cj$S2}G z4vfiboJ7Whw7JV56D2rit=NTqHg)!KBtn3^+4*(&{JmK1=Z4U#Rl`|W>xUHSj~y`w zQOx-M%QDlySe>-(q-$V`dZ&U-ad}y^NxcYoa(N&N!gISTZaH8$ZvFa<9k|8`b6zw= z`l<%IGi%5{=W4Is?%{_8Jw8SVOq?hEB&yQ@R#Jq{f$^j`sDLv%4u^dFNZfVG9i z!7!6W>Z%8Q%`&N*KuPmt!$$9~V3}?&x^?X44R{eMz=gA}ji)dcyMHloaa6gSs*p2@ zHT~%K2@67!!n?n>L5JheBx)C0tnp5nUsRQwO*4J#hEAQ<&%Yg4(W*oS(^WhwL8)M= z-Ms%wpg_wy$>g`JD&dd><)K)gAtZ1ks>(uJE77scB&g>K!$PV{1$i(*Fh!MwJgk*J zb+HbFiaD9l&k|J#!$uyYMGCK^wpP#w6LyFV1JErn_e`Q)-~rYke{X+k=$EpAzveU{S;P|JJ&-EX zvXbN^fh1yMti6=ZRWXfUc6z5Bq-{Eeq{xFO?IX8Djx-6P3Kz41hi@p?UJ&Y`&~+G& zRw3B?3quDI*)ZTBQ-QPDQ28#}jmXVvqaer$T2xn{f3L$uDe01TOjN@Y*m}8CepS}h z5>F!M%oIIX%DmvlUoMlCdDkv&W@bI|3`I#$1GOZ)HVJh)OTx^>Z&sVtkG<2aE{<2VV0=!pAL6gqKKU0qRZin>{l)VzkPb($4^!Hok@Y zRsFWm0Uhh+2uHAOQo3b!bk))Xs_njPPe-uT^cSbo{T;*ZC)o4uPA7r}%(wuHiCQP2 zKx$!uwBu~p`#XriaH+}*wbHkk7Rb#y>)$jkTEa%g{xw(FdJlfA>bvcfu2T7rSzaHs z_x-x3KDFZ+%2sFX9m`LS2dMWy-{@`e04ViKjUtbK-+wQG4{UyHM?E{+fN${Yo{poq z?)$VFze9@@ns!X_ih=(OOdq%SU4!Deb}wJ@Q!lgAQ|Wi-!!g73^gm6*+wsTf_ly1O z&Zqm!*R@X!{FdLZ4&$HupD&@8Kf?M;Qs@3X+LSP`Q z)c*!Y4q-&CKmo&1hz(G)0fSVIE^`eUBqVI`h81ISSCxCob7?Vq5p-Y$GGMX;)uSO9 z7~`fyG$>HW8ols<0lQ{l>4hG;E6U!lJJO$lV-NrE{wtv`w~>0$EQV7=Dm@wB%WKNL z^Dyt;LkwI}438>Lb1=7LJjDV?c?@2Qd%ki&K^o_Jh0IBEwK@x>C8C5bi6jxJC|Zcc#Jr>y5k3euPz>%+eZ+jO1*29>L%JmfWFy$3cmq_;VbnNvTqNY51D-dL z`(RIy0qetnZ0t_A2ocVvIRS*s6*duTh@+`*Mh`JWFX*iC{pMk}g>bN;qk8tD zjqp?_TAH9ZQgJm>p@B@qk|2~juc!-vvhenORMK`zTdnbs`&tHRn!0hfh*2^Vvw{pD zkS);xq~5EkxJT@%AD=zFWd%O!D)v|Fcb>_%NgrJa{9+~!7MO|wUwr1(e;rfj;L}q+ z6QB&44oy(i1r{sqry{jUYkj+5&hdGG+NGFv<@Hp)m8@H<-allits6TKqZ{Hd9b;oY zB&*2e8l*8UE=2pMLn%69+)uiPRn}C9{<|8Vps^o;*{WJ1{8DEXn3pez>yk%(j7I%x zXUR&(EiVveFZ9aJtfDG+REH;pyfR84NtVsM0LnU;m`IUW-xHHz8sOGuip*UtH2nu7 zuD%b=#UnruNNyd3e5Uo8BEMnA|!7=-z&)W=B7xYp= zG^c`UX1n}E-Lv+YkX()GRF)hEnWq6xZlm{cxr(7eTzm!ERT{;;3a}OFTGV|3vSyY6 zg(3A9MCa8v9+(;nv8T6*@HucFA3@G+>&^=1O(B? zt*XMITQ3;P^MDsK4I)c2pFb|&2Y&1d+f&H! z8X;nh+ZT;~$Twc3t!(nc>RB;bqt5j?*S!aQIiU>$<-AN!Rc;Se3LH$6J#`k;`6hAGNvStRdjI%?beW z|Ea_A_M~IfHTueJ4IhCZzU_vN1Nwf!ocxa>z8ROz^H3iLc+VsUJg>)Hn}CCMK0if1 zZ|U7Wf4}@pf$op!Kl+B%(|o?t@{a(Y$N2Y;xqcJ1C;!s`z;{2g>hW;-7VdvZ%YGD- zebwOHKieGOF9!7Ji@$9H&(4OuY{q87H*vp?lkt0LuT>;3gGT>F6GCxPywgZ8IpUVG zfL}|bmJnS~{4+#@oQX_<8akvQAy}qeYyy71?&t{`SjZ8pD7HUXsvYet0tXkW-FoY< zE44~aX&g;M{Lr;mtrGQs6%mDZO0B$#r0FBq@n7!kt?j_0RA76hnG+r4FR9D1rzN=~O~ItNx7lE0a69rmUHS-fXG=Y!?`4Z#q zd9M+w1|JmcF6<(z;TeYWQBnn*eNF7^Sc@FxD=e)&;U+Xoq9s!VQnFC-8knWvZFK6| zoc&Bj6Rk}tGu|_dTwIEZY_w0oc`W4qz-yx*$p+BC1OS4_ zH5XxC8#XtE#7^>~-J!n@DK;33$+(I@H)){?v|CpY)hN;fDNtCQ`s|MawK#deIAbCj z?s$Hfj%1Sp?R~uo9$Z2a__;E_}7~E;-(wtH(4DGh#q8)R$ss~37Sh~1Px+b zxW;{l+hAv1iPMxu6@?sQhZ*dvE55lLSf)2<kiKQQR=J*MjN@)=r3 zgiqnN1k1J=B)fuKc-`@65_#w6lQIiNdH>*I@9JwPyzdvHC$~erM*Tu`TtAU3kN0mM zC#%zptTOJwUsLSJbi|?^nxT#Mw&~Pok#IvSCOW7#Lp8eLtdk+YLP^`L5R7imr@wU? zF%K*Z= z57NNpy~CMqn_bU}m1tkvlW=L@K^PF8`beMa@d6Z_`T!?HjSv{hy z@t}PWJUuE1*I|kRJ$)x*+y)XDbWqK)Wm1HeMqSbsk4&HwF=->n$=W$*l`~+D*3pAI zfVK-@G96=KB`fFFgR{c67G3u$_(NWm0AdsxiS*A%ZEXaMSt=TCW?oIB(b>WdT)Z)m zx>tBW$-+2-+KQXt`3(yPq;aYO$dno({U6Q%{6b)Lm&^0=%JH?zzlzH$dq7W{_4cA} z&sv4}h_BEp=*?cEttRM|ipf)--LjwG2RB+hZ#AJi>uU^LJu?&zpe8OzGblR}Q{y zQ4!uRYv(I9>_=1yT{?Hi0iQKd>(|!-pE?YR<+Dp_Ku0QdY8sx>2knQ&{JD?sZN0S1 zgIm>1=%kyUo67+`xx*Y=n%EbSmn0P7`p47uF}m)ts_p}Jya(=C)c?QGzh-c&G%!f9 zn8j9ggTLiQ%l!qx&k*!;^?$7mxY2x^|AY|q{jNE$d35hK?Roc}yM3KX)g2)FTY5al z{yQA1KQ}#$@69|j-zdAE%Db0z3+oM8KSPgUkUHGjCacDtNsE6#CJqY z&C4->@^%Pz`@Q>{;rWYgIKSsom*2A;!pFMmJy$oe@?bfrK#7bbngEK~lCOJS+R2l# zr^na_Q=&r8-O(+lhzK!1(Zzp_Q8l1?G?D9%B}Rm9o;+_koCRI+Xp-c`U*+yWh4cVi z#Jdw&2d*h7AypnRG(5$;NTgk{#J%pY2lf5#_v0MJoq+uB;?S<{_X7O~rtggYk%7GA zGaWswOxs_Zl$&=LUVZ0bX(+weg?z%3QmV!UbJAfQ`M@&L#xNZUQArhqg!uulzBV{= zwl5a<8jVs-k(#7ZCaxO^OT&3WX3{qkDiA8E7LlEuT*BuA+Tzq(Uqi&cPxj*F!ZRGq zL9n`FLg8SJ&Bg_4|EiE={%T>LJElmBAn(a8F<9I;H!?IBEZkPW72DM*82SXCBjzJ> z1$QH}6mt?bgA$rU?FISHCblov=hGVU#9_v9tI2~{ULJ5w*(A1_uZ*f<)9ZpMS?K35 zX;BSFiSSP2kj{i470;wbB;_LoDWr}y%*-NcEc7DfD-(K>L?R_2jk|zmL3BGfUBiU1 zTgnTTEw0!w)7Mb_Feb8eV-K*()~<+?+UZf|){v%YEq#*~&3-{cckFet4bKRGB|zjv z&W$Guh}Y)y29m%OJXFyyLuVTUGleK+)h&Fo7GiOST=4!AGxMKW^=1NL9?v{?%M{G- zzD@wjzt*7PGQxk}iliiK2h&w~n^|$)Q#kroNlqrZBA(}X|Hgv5Nb52iPQ+e83}!$V zSfycK?Zi3<$hhr$`EHqZ#c{f5yD5o0;q_ikam2dlnyiwdMdcU}=ex+n<;KegOPIF4 zL7tK=U6WPk*ryG_R;xr;z=)I9mW`{8FnUXAAxN=Vp%O_kK(Z>(P6J)jXj9G|@uUa5 zVphgeIOA8!rtq@3sZkb3XpF$tLcIeNj4xa6m&+E~Y%7F*e#7yN6!v8Ws*p(<@>?UI(UJ>1XSA&Vje$$ZLP*G;6$lxVg9l@zVhF*Hnent_PV z$OZED;r~#2==3>B)AUg1$a`-Xr`|%__a3c#n|3?Yr&%ri683+z#8jB0nrgYuJRe?? z5r|XQbAM_Y#^2x@4$})>yrGetYUaH@5YtLh?@yamtni<$gG9i>#(Ck4hhwXvyT+&_ zKL`u~L$}NBgNi$_{9*)2Q#zxM+x@{%+d6Rp_!(4V>ErHk279wenDE_#h zQ|6v8m}R^acxdL=wC8-@#d!5cW|W7nvaz)Ox5Hz<34Ak()AspIxuOItrPZllPsS-gul~kCU*EZ7ct3fX8tmx1s$_ zu2SzGIa-&v$zHoTCN5D4oPU*E@;O@&&KTkOo6Rg+B{^>e^e<{{Z#)ifVq~)@h}f0o zL`Y;B7XgO@74S-i7*i2)nRb#49$nHA9n`Twou<<_We#_#5)mpf+_Lp(WD4K2U8 zyV>5hKkn!fyz-&vu`j1}c>G_Pzl_ADPJ0R5|108T`?3`d;`)RCfAbDKY_~r+wI4Fi z-SpSsFkrvpM-l$1_#Zb5xx>D?VF1tCaW7Xbcy*Z2{BNtA{2!;BKkw~!!*3xi@VjB} z9{Y9OBMjHWwbLg0a@`;JO-IAwx{tro%U?P{}c9^oDVOh5dPLQbn2qn(uuBytiDPkw-fF&FbeSdHByOu04x)W1HFKl5<$s= zsoc&2yl6_2Hy`6bCk=W4<)l3p1x6wpxihfLm=z(xx;Yv;s=81jf1#hK1|i0y3<2gL zWGtnQ&fzj%K@mmWFhi^yeZgRplm$u;bv#g_*Huo-D(To-X3BqRbY!iOGP9+HO@6Va zW}DcKFDQyy1eBHPkP2x~)Af&s%Yf1B<>y8v%Ea%)w_0<8D-vS+0U-(TgmUdrLy6`66{I5ry+9np<2lIEupGv0e3}rQSdKU+3SQ1! zh-id$CtlsRr0NNS7!Fjfl|S6JX??lQ&fo^YbSt5^6or}wSki`?cBF)}G&zUfA*NYu z(#*uhL+$Dq1P@6fjMMPH`VW0>TnnO2U9+Q%$*h2H-B`uoEGZO;SiHEwVYHd<<4|Xt`3MTp~&#B}gj|M+9NUg_z_F5%;M! z&%7xC<-xL)bSLrjfRLhq@PuREW@E_B!3$gb*N@;gI=7vXug=fjeU;22i+c-MIIuia z8XevL)(s?2G7R9GthqcGpl%#=R z$D-@Xcd)Pu%c0HWl11=g%9lep=$3rl__F7Kh!T#3>74!CqlE;GgcrdwSUP7g?3t3l zi+~AL*E|$A(kttmgj|U&{R%hT_?n1>q$0$NOEnG~Dx{}uqUg05EilN{@F;@rE>#aY zD#Wv@mmU;H1~KSbvLt))Y&B`TL&5$v?#`C)-;UK1@6U3F?3eyA$EVKyoM?NgB!E!< zo2H|bCP9PYT(Tr|!BwvcO+cBT8s5eLr*6|m6iSwWGX$Kw=Gx7pIbSS*9uqa%*16`u zYVu$qt5XyHnziU6KSjb%?5cm9?Jno}oZZsa>J=dUlPW2(6giuG z|Jf%Rjfj|^d~&0D9O{-&@g550dn7nF>|OfzIeblfXIC6rx<`te5$d1l!XxD4FPe9^5^ zq-gUkj7^}}zSiSzsutVYcj+norJ2wSl{i5%^bygm8Ks;#9?HvUTS!i%+)C!+fxH4& zw(LGyf>y%;t%>f!`=8Vr>!m zyP@%&(Air*nN>O}YJz6Bjo|?6ftSLm3(ZdqHE>JkTDd0I(~iIBy3@e^;qU8l#^F|u z;M1`x95re#%%AXf{HUO_uQ&ETh{kvIzv_Xh5JceL@E^uWD-Js<(F0O*0TS742aLvg ze~SZJCdIXn3$}jLzYc^VBgKp`CpwF#Biu}sOK-WjxS6z!u;)JBxmfwtx_}-D5aa2C zF4brk^^4=ipzEunIv?+e<=6X_p_b$BjweJFY=5iXjcTd{nkt}|r>yqORJZrCmPn8* zuCIT-PR3I?)2B_gHyOv{PhXQg@aw%l!Rv0&k1p#=hxfG=+->gY|8MoIsxuGalMwlS zghC{l*wTeJ_zx7M-!U@y()Tmc|2aS8tL?X;p9uL8r9E%=5B;2$$nX3)_ol`78!A;j z9e>K;rXls;@zuTp5m)Jme9sdd|JTtw;N?o&{s0|7Hs*(__MvV#sIB*^zuN0(0qXan z{u`oa)#KzjW1$;UbZR?!_oZ0=wkNA`f!a|XzwP;*S@@74!R2k2&T07dn~EmEp~D#x;LluCI0Ucl7Z3USp1*wkKHEJtyy&jIoTSIdY~VDc z(Y>v00>uoTVP!k6R-?C83w4|PMg9Y{zzi^8$U-^=?Ly9ZR(<_p;dB&C_}0Q|kW{ub zWm2g2l{}Ucq`65slAx0X3gM^=e-KhMRQ1fvl~MoVa@yaBQ?CRJ6(AXG>rkRpt7U-o>Uqi`8Bi+eiM1<% zGl)>5f?ndm&e57FEhMYL3K>EKXCXz1L~1Zt*M77*m||{@Oy4p!NRYgi( z7Pl$ZM`6N)fj2i1ZS_ekPwXL3T#7o+SW%Tiz0qq~A>V9)D%%<~h(&?LK}9^&Algjf55X8oh-1D( zCs0LjL&76!C5?iWad4r~WNa9m_PGR>1XG^w@I6#LW&Up&7JQRgH(0Yt;U?$O@$_P_ zW~g@8Jw?=#2I&-C`P<%|KbDXmhs}4hM}g1y+&wKC&P>%SD~$XaE*~-Yyrx+=K8}5s zJ%M(8%^gOsDgE5Bd{dpM+lP0=$5xq|L!^S)wsg^~c_dTigi)x_8e0O(xAoeNeNd(A zaTF;dhmb7+IMMYkCRiL;(E6_)M%W?u)j^`B8zyI9cdMvR3Cup1jBctJmGzv}CsYn3 z4hNxs`iW>(_2^nXy7T0u)uNh_jq(sfgUOoWxKm*8kO;u`CJhN&A1X3j#4stBGG`a30~ z^u5v6b^Hq`1p9L|vxcMNv;h+mmZD{Ji0BkPL?yoq*xVW+3z%(aq*#I+X#K7sR0)Eg ze9O>PbeTQlf|Wt0%hr!AN>zT{rl99iStu%@NBj-ADn_AcBnnskhK!21bTgR%J#%P> zT)ERFfm99Q(e=k7oFl1J#dcl?y;^(g(s|zqbzIxle{by;#lo0i_3z1S`OPO*Cnb}> zLG87mwf-4!egF9@Dg*o7sZ}lL#=5zFM6hqKJFN~?*R%qR3MNA1u~|-xpa|k%YHOTN z-S%XP_+uv>#{zy1D4&~yKRs8muab9iXhUOvxfx;EM?ScO&B@rN9W%7ahykUFIcXKx z+S3u{{?qt(lP1~4nqcU6-dl(&siL{z{%eGY8J`sAj z|JQl-(G+{B@bVuFWV-t~OMDpj=NU}d^Bj{j{RqRSMgDcQ4H(=0%#`=^WV|iR&HkZ^ zWZ&=Ed~Em>>AXC}@$Ibhzxmf)zl<(#?~88(a^<&tH%RdO247@AzC|_e^@CZjy$=6t z$jY?8dhctpF#);32cNJb-re8Q__O-9opmBdypG$in=Rj)>y!A7&kkbJTrdxWSF0UY za_Gc_!JpRuk`?X!#WLZj+vK8?7>}g3WYR7H)77YKLa@O*d8q2bM`xE*?3%S&HM}gx z^&kHa)<7x0-I4FB=Bv+gZL>^diQnE2{6oSKqk*{g$t54`ofUTvXXrur)Ll%?oeuz3T!#A=Cj+9=<~6{EcSaXrx}9G zg&Q~9vDQk?1tVjUQ58}bST5H{U1Hmb7tcS2lT+}FXuM{KdK;r0=7N)5^3AAqnmu0| z82R$KaVi~87Ary*xx5m*TjJ4q{_-Wu@e1oIom~53deD{xw&vN|m@CZ_PP`%-XclX_ zPl)Z3&^uDbjzKJ{yA8xu?nFkE(0pN+iRgpxzwWihnrn(1&^!^x?Zl&} z#_8iFb=fnW8)?<7-LiC=vDHfPU9KKkJqIz(c>CN7RCWom#B46L>y1gfE> z5F;`;_%jGyMNixq9V4N4BpTxocs`7La(2$k&4yZ>zKe}@A0pcKd#2rC-@8^= z39qp58be=^pwxVmoqqfG%W0s7MA%+2jw4rPL{!LDu&WD>PET&!7l->-pq7g7azWRN z>G=krG1G6e{0{D)y%Ns+Bey>*1~WLgJGaB4FQ4Vz8wlBeV3TVmaIJH}W{_*Y(HRKd z0c=5(J}IepTw+_tW}p0x^toIH$u-|)nLhXh|L(^F82k_q@z*+DUQGPypMA=o{@JHId9>hL zUq9yezJ9{V(cNJ1qvMW0{-d|}<3D<94+j7E=jS|s`T1aQKTiC?_kYSCeE+9xmJ5FT z&9Cs|Z+wN%o<4e`WB*tJ|5;e`pM^E=c;!E^fq(E?X7HCiuDyQy_dln+836O;$D08> z_XFH-w*5n9>3&;&od79yY!BxMAx45mFlX8pHk%EbQD;V&6SO_xRP&rV{{-6?sbgvB1W$-AAsj(E!PAmO zJZk4*PAwy4xS$MYSh+wZW{J?qG)ZGY_Z7ULA&{1lTBn1gz?`5V%q$dX%(2(SeFXr& zRB!n*;`PV>st49B(DXhAv>*6d?ly7wbuu*wQ<}jb2dpJ8ED2#wbnWF*WoCk??!7i& zAFprWFWW)=zPML_0ijf97>sFzk`3*4Y@L8CPLNVTmsIVr9b?EN5J`H(YPBH7<|(^c zpJFwzt(VwT2}g?=Y}E$Z2{_U$=!#K8gMHh<0<$FE4z$FqfydT-c}1iFk-3d%X`y%p zlQ!n8)@xQ>qHMODKN~sQT;KvRb>v#9xsXzighZwJIX1Aj0l*?oOhVtaap==e2fBPl z|Mn?ee+njqlPBmB?DB%)gKi3?pLA-mE8>>T% z7Xe;MopB8zM&(hsq7TX2GVy6Aw*3(IvDZo2EC~&eJM&v{v|2S}{x@qP0npccLufQ`YOm>iCF7aH3z* z=_Mvhu%6%r)dbO~rER1?TGOvrSW1*}yaD((fZJzJyg=3F^XReBSIpX+9Oi3>2pMYy zCQSph^>;UN&WvV690GJH5o00-X>*tvIXCTrScMeZHQV=danvI@XO53n{K2>1XPP$r z_-CImmW;;^L)dOchH1ptYs_ivZjF0+%hx5mYppjD^Ebwh*8ms0{#0>v_T=38Txy6& zObpoxZqOw{0F_F&gm=IGRZbrtadq_q?T#Ql0&VEiAvl5X7hqBG~jm~dSWi5nu)>CTDa&TbV}+vY`!jH6Sh#S6H0(-p=`A@rlCe8 zSKv368Z_24xSR^#xkpJ1W^_Os~R}cKvXE9d7+yb79cHp;-Y7{ zToM;ODj60FYIcU_8_p3f*DIdbiYL#M&2Uc6g_4z+65DAa*O7E4Oc%;hd-A5T&4nv> zMxUT+lO!cF;uNW<8O4lJlx3_#3GccZKCbvd`ZM7aCj zYw2NakBH23st$mfA%N;!W?6MIBf`Ud`}TcV-}=7KNK3-%me22uUtI5bxhy0gS;DJP zy^?bxc@E&N=UZ0BueXYvS>}XXY&?Ilob-ER*+U6a04bSN24sk}79`S8XzsMRGSBmI zehT^Lv!V$IfA|%+T|vFGB8|UNfz{dh-vf6&ly>ej|Ln-x1CXrbK5nNjyS##a;*Pc! zz^ulo8NjuZlaOy3h=g4z%Pf&8Zf0$&xZD^+K0sNR7?G3R+oTyOUDnTT2S;lXUbEHJ78> z3xpa$Dme-q*83zUUtf;=6D`^rYJ@d zZ)i@Waio%1_P1;{Bek|DSjjo0+3yi%1{IhGGe}zo+Zhznp{+A!~2mi~DxxU=-m%sB{{N?w*!;5EE zU+dgImBfFRF8I&V1s{0hPi*2pwLO1i^E;(QALH*wyek1^HlMv`tx7*_@>Dzk+>&vF z`LJ*}RPJsM%+pL=%CSoQxT!<~9MS-d4JG9ro6QcWEc0uY=?-B*ct4U_s}xlKSu38K zt`g9zOj(@gDtXnjOx;T;E6ir@Xbq=D9?U~}RtOp8HL10#y(@%tWC~gJ ztl_hHI8^HVnzk7k+{r2Y{_I@eiP1a~U}h}}E;P=q6k)Rosl)4=#5CP7 zPmRq*A&*BIoa#cWMzt2+ihY<{**#7# zQ0NKbt~VG`&gOmmj&X6;JA4sXzTLNtGohZZ<90hFRFu$~HM$b;fLrNl7*!P0$7A!_3W1<;Cs9tHZ+WvS6}B#*oN0 zQQ9(NOB572jxC0@74%hF_2>s3Bu>kQoCd5p31ut=O$%-_!&oTolCm4PdREws*X%|k zrN;A@6Spr6EfPM7NkKyja&vjbu-S4wJFT82>${SKOB95dG%AjD0RPxe{Uq(GqBIXS zI|7Rv(i%pK;*nkyl~Q8JiCmP7#`PP)o|eu$^^>1t_;D(kk)>U8{pt(0+bw_a55AA& z!oU9Ur_^dlQ4aIMG%ZATTBSriimA?%>^xwq#Xr7cY>+p8Ke8h`XxykVPug0n7L38_ z%FVuU_q?+EY^Gg|B!lV`DkB$HPrwIg10R3f~?yyep`{*uo={hXiw{0l|~o^H#L z$%s1BM98BPK>0jRlwl;hP*6rG3^^ps+n55*yxeebqY++}mJ^E%R1H8>+?ma|T^z?q zh2GcTFeuAY<)uKaji+K11-q%#)+j36C86eolh~%z=j+orvddfc(*c_oS_4bY-YXZI z!jtzu;MudpbXVEm%*aO@_G4ly%Cukb8>6W(FOI2VNtqU?bLQn2Mky2etZ;p!?Dv^D zE0ZL=b@c{unhKf(yBd_AV@vaSM%=(FK>ptcE2a)kZlS!cTlF z;A3uLC-{`{~bQSX$_dBx~qM%@@^~fx3b~=Xk?>vGT=Q*DZ|97Bi&Qcyr3(@%k1JZUygF zuiuCF?EL?l^GSyMZ2Vi_Q-%1PzEPQ&cv!Bnw+~fD3gJf&}JZDSx-`Cf3&VaCJ zFOC(VDM#<)^J}ZMA{s?x`HcPia6AuIZa)1xE91o_Wp~Lu?L!4gPldB7rLgVr6C-$+ z2dquZheH&>sDf0qTyQyFV0YK7?9!Drtg0+s@u_{u8at-L`)WRKi?0NKA?E!K1dGT~ zo#m_c&FA;(xaM4e-m~|_dB!^68Fu| zPx#BObv;J^{o(yM7G}topWAx=Uv?eGB8$~~do8v=9s%ITc#OyR`x8;s)%}8HO_)6T z1%Kn?0T>(=jO|M&?Zn9idO zcOCRszn;!K9Hsl~o_qZb!-!R9o)-3Z3x~Uf=`d4kY|x7gGI06FVkQobcE^PXziZm+2>os-s`4hXbv1DpvN@ zzsoCPLiO8Y!pGLa=CyP?fi^Hv&=T^`K7&^v<63}ATol)WYQf6}N`_>#G+~yA985yQ zp(jk^^c=H_8zd3Nlu!~jPgre?xv=yqc_dh9aorvK=H30{UGdKD`3{Ehm+brht;Ibl zy0`rOohQ(%$rX+_*ff|oE|4VTLrp=7k}U`5rvgc6Lr>b*7ROQTvcyg^yO&^oTlhQ9 z@89+K^v>J!jsdC(EDh#aF*0bzl&%~Ai|esn0>~Xuub2eBb(kCTVvr`TZ=Q2|_niIV zHMJcW$8waIh2F0dKqSIZg>>FPr^I@&XTb@XT`>nSTC1Ja5G>`xJ`&7MrdBvC6ZN)n zH5P_6aPee=?ncruu()GW>ma{Sy)oQN`u6_QK?3u}IF4*;M$~Asz_6o@uq?HYV+A*% z9pxrH3P@U)HFY5=Buz96KjOu@?6s{D!~Nn&Sll|4NnXVl_ z?6@k=xE!w7k{pXCRF#|IGFZuC)MUI$ z@S+$p1gQE9Xot#tJ#o05In0f{8?zQHkJ!}68vb(Ff>o#0wJ1O+CSU|Jm_+Gb$EwhL zp`?Lf7$6x*jol`9N!HAEm$^*OIQR=he!=$Yz;}P^J;X-#lfw&`E6jC9hmrT6z0cFj z!Z?mJNi<)ue&4LOE60Rx2jTVf2&pQ`{FoHJ#|+B}a>9rNe3k&HiV8!?Y=#xY34mJw z(U3}(l_9s*JFRLIEkOTq+_JxW!QI`&xO>Xes~zK5sGh?Mw>i_&sMZ*ypI5Ut)>h}q z+T%}t`+L^+t-qcUyYV-(DAK6DkXjUlNfMGqVf@^Ly9s{rGiRc4@vX%0^a2xMsn_6z zR*l2mXI!Z9osSp3^IMnv>T}4$6Yic1*S9YieWqk(Oo>5-lnRJY8_Wo!Y-sa=xlJs& za43nEU><}+8X3kd?Xc(O?!e51Z%T+4s8gD-v_zW{a#!(c7z>BCP~EuMz^8fUb#pc) zv3qZaUc5)$Of1s^TSdy2oD_<(O_}og25$H0MM1{_xt-Z~^tnwECSUmV{)XlHhB9ne z9P)Kzsm|SQWX_dwS{U~Wn9!urQpGe;sZ^Ba7u>v_sk3qT6)Y~?>^G1%xC%?1!5fY- zHyG7uKy^5z!eLcEXogfmGFp_GhPMRGF*T|zOyYPJ+?C|8X+}HDBwfe|zq`G_tn$Jt zb)LCkVN@d@GV)q6pSjK%)xuDOlw@_UMMPMZ!pEE-MUjSgzz#E-c?Tfxvx-%Kqst5@d5m|gMa=rY4>EOQj1cuJTi z8hx!T0%E9TSXSn3jJ2v!P}xMnU)3!NK15K_sLt$@nJ8GZD0=Dl1`%9S2O=M^o29Ee z#04Mc(DU&QV$HFBMstpQ?^*y5gJ0ik=o{eg%KB}s9l_s+ao%6lPkm@zio2}fbbl_+ z_5!Nm&1-#qv=UR+Vk38_xnZr6;)dV5zI#8aeNPzn6fTLfyJGX?8PnZ0LS?(#^`fZN zlBf6IevIr5vx=%wijZ_cmTQE>Fev*KFh|Jg)b}5@N57@fuF~h5H(Kt^_%bH``uCL6 z>9sR<_PLbtSAG5{PSbs(;r^QYc%F7D5I6@^&->neAo#)l?hKTESS-NVk2pv51N9St zOInM^(y>3CAOB%LeB<@grM>|&uVDYWK3UH}xPM%E>$B903(nj3thnJ30Dg?ec#OZ7 z;qG{?v7GITR(S-2zxg2&4Db~UZtb2d&|^HtV|=sY(=YaX`o*6A&;RgizWvcIJcGY` z#WCMAMqdl;YWP-e9w#-GxD%KCSgQ^)ymRHLqW$2 zmPwfB#4;5e0XZCH^+bAwaymt(b=Hp6_{(BUHw$;KX38dH<+bm)<9@aN^QOnrH#Pn`tlx*9<3WPLRHz!D zZ=M#~VUDD;2&oKYlx11qc48Vw+zi1ePV`SbLw&yCVFvT!%!}Y&K$O;&V91&wa`NGJ zIyfl#n2bEsg;#es=$EXa_^k|+XI&t(@gaK4TX zcCPkB?MZ>4Gb>bC>e78#6DngAf|!LL@pi*)$*|pGIpKK^atJ9+jb}>;)>X)BX2Nva zSr)^lg}b}P#psj_wN6asj*^}twHLT(Ci1T#OC0CuAawuA05EcattDK9+JRtfVMe;| zZ1|XphbQeS^XV4HI#13W0bLQ6;Wf6+Y|55xQZh4benrxk4CBO@Z{uE_Rlp>XBO9)5 zCX&&CSV5~&SijGB&$cw6d14l2_RNA(yNvhYGBY2X!%bpYHh4-Tf$WYUh*h#HVh!~| zNg2r*^8~JBue9crG>}uMO%zR}tdT^&dr2vV42_%`IUBXcn7YY{-8hl+9plrPXCEle z!iz6%dG#uxdCR`S^)!)O`Cz+a_w0&gy5n|#$5QF4PJnB$TwG}$ev-|l7a|Die(X2V zGEVJ%$c6A~%sGee`d>Gw*wNGZl%S3|XPPUU0^4z9o)66X z16hULZo|vl20DOv$Pl*{Z0ED2^m&2GIZJ1KeucMtG2R~|?D(07Y&J=ume6WH#$aep zY_upH1_WnogF2BX+pN~BM z^jCcP>z^~-hR^Mjp^$0JR%xP0DYUA1%Glsc7mlm(`ex6e74pSX#=C{(0Mmi!v*uK< zBzGh=UgZtVp?T@jtU{H{JUDI4*zFD1`-)r+$cIUw;a&s4667z@TBZ`kzlTsm!G}hv(NW@w0Xwn$uo3RhGpXF?!b0F;A$Lv zL&bvi=o6wNMRv?Jv)t@yy1~=Hp@OAg1-5GBRmov3Yyzq(hg?|70IrN}L91a3OG<=H zzavB+T)eVu2E++z-QJ%EcXSEK=tAc8Fft8WZs!H7H%#Ib%jle$tx`v4S6~MAR2C1L zjv*@8L=U{Azi)JfTTnksBogeXGHIkC$F(=@%&=4(3=!y>+<7`H9f*C31q zo<7-1Lm z26_n2zbn2B$i3&Qta8M|Tkmh@K=9j&ZSVDqGZ1(!AUGAO();jV`INsjVo$SP)2UB! z)^|Gge|8;RJ>ZNr{bn)O+kZdy@3VieMQ-bw@%*zUs|weBY4wNeh_!wFtPm|&z;d+V zc?5tT<1rrN?|ryM!UQ-?nMCv>F!30V@y!o+_~oZ}{PNQ~{@;K4 zE57^f3x4puCw%|6uPFKL?6HsD-}2G>TmIvJ{4IX<*&YApC$IR)&##&0_NCu*b#uob z{`rsi!$1EKce@Qg`QCT<$@jj+XCJy91H|JDxtC${H5wuy^> zEB?UW^l|X-wnXo7Q|3xAe+6q$Yp{H;pU=$mOkDza$dXX)UWe}Co2DgzhfE=Zk?QHE%H)ivSNu&*fr{kJb+ z{MFCDoey2Yo9m``nb=zNk@aJy!jgqrf=ROP$?U_jP!$d(k+LAOkqz1q*)+9~PgSh5 zO*;toH7U^V`t-X-?yoy~+B=(1s3z1!a4Dcr?a&z^O2!aP!Q5*#l7u1*!@xLhDY-$; zXxVVJ8Q5LzIP5REzIo36a80Qp7a6Q}Lt0?0uEFN=&fr=LXhULfO<2dC$~3&d5s;)u zDZJJir6lIsdh+))W;h|kKBr4G6(l7V(ayaL;&IW)G)rflrc@$9u5_q7^}>wCASGBg zt&b}vgt)<)SS94+S*po<53!)m#r#0cH2~CP7@UlmnB8%g5LsVc$kYJ&b z_#81|ps@7;@dP!~7NaeV7kWW;ShC<{L`z|=#=af`h|e2JhK!Mk`$ZCJYZykWceLhY zT}V1&OGQ&iS5{`M+>#QI8k)K%JOX)3(k=V>*K96lKK{;AN*eg(Urzk|r^d^hLd^>Y zHcSk(1zy}8c=B`$E5o}wNBUzy_qmyxy9l zLogJVx`GfV@b(;NdIWR%?qw+glK+6XN-ytlB8J0#U3Cqen&-mevsWp7(SShsK7~@~-{@I%X z+1aM|I4swUi{f+R)*JI~hssEHXFDi1W>Qf$E?5c%?M{?kDO_I_hMY+=%=1hu17#e@ zV#s7{c02AaHry2OL*vN-p4R9?)fSc%^H`!w9uw@T)(pu5a~^T`4vy~eCL{|FSj-qC zG2#dTn%9)5s$_$0>mJRL0yuWiE)$P6s)5hpNgGzC783I6AusEK&wIQKn3k>@;Ybb@ z6klK|g)GX@8grf4`y7AM0AVHfg4we^xiZdFLk1oE$VjuEV~OXK`)u5|6f!gcNfH;A zLixiqiUUoQHb;Sxa9XE|JLy=2==Z+YdjZnQev|G4ZgwBAT7j~20P*}843Bmwr5vBX ztlWDx1tT{lr?@BX;qO~CB&$6sUIP@CUZk?797Pi9M%y}N5NdPgy+?aXNUEm{yD}cX z|6#a0RS&=bO{igXjwC2qdGFbd!h!2sr`;~>_l;x|xlU1-QY88o0lb+?w{Fnhu7c!* zSErqw`x?=18dAhZDf{?Y*Zrz`WTuib((E+X^@7V2cy?9*!~OB^;dP((6C8`r)VsAf?#LbHZMtQiXL8PH&K*n*uz79cBC!`US87$J zr9s*w>e$xU?4F*UpR;)=u9KtU2@mdrofW-(RlJMoY69Nu`23xN^KWDQKKz>`Jpr&h z06)(PC#=(A-A{HAC!gxL-*Hd+uMbxC4}sK&?Xi0Eu7wTaF;4o~bI{CAg@f)i{8-d- ze*MSq6p8n6pZULzZ6~1l{@Je2!o5NlPHXn_`*A$?6|p`)2Y&>BALB6|;~N%7FnFyX zTbaR+@y(9&>b6HP_%R;iH!94WPkwR3C%?EMCE<5|>xv(I{|Vpy&L!zBQpY0josV~X z=i?oJ{7=8l&whEs4?lU$C%?F+wJ#qtc6SH<;a~iifA|+aX1^Kv$}eHZ#z^K ze650xWWixSaeKRGzu&`rL2KYHWC>}p)sszJ8Ahd{Xim5!oXp&y&cPP0Em3wOIus;D zLL(1b%0*_Q1JmZ>RGGYP7JF58trdIyXP7l=U05Zo?#bh=(teyL%42gI%!daOc4u;X zG52QN5{MB>a)O{(6Rfq^0GoyXX&%V=f+QP~?hv_P;hH8M+vJo3z|mlfi5se2_L6*L zSdbGgN=*mw2^A1;h#4hik{0&1aCqf>vizKJ9JsjLa(TI7yBjEj5QPQr?%VI`e_ywE z{@w1~XUUSDWH1SzFU#>WZxSqx{Y_=>6;ef2*^I&^87(1a7lL~Yx_{!jc7K?Nc^H5H z$EOb7pr{s*0KSBkff5Xol2gb-`+}=bHY1zehEf#qM#`Dp_6kkU*o;p=wqVb(_8B7i zsPr63{SLCbQQLwhft0$`V@O!8vWDUN*rjqM62aETj>F*)tRx3X!Dx}3$R0kVs*Y~9 zPzEeJ-ru9p@2epS-n`37w=Q!Ta_$0b#*ub-PHWDPM{*j-GJ*&r;VT@{?H#zYM)Qia zNQ|!R;-ss;T9>O7?`#r7JsrJ$ful!VBBU@yB4Hk5a!)uC>xZX&8?hO!2W)vw;*MdM zNZDz&kYyL1?KsW4ZINW?44^h7#6srV=LM|cmZ;L0X=u8F6h$sYB|zA=$Lh?oEIeDT z@ibuLNJ|aTfkhiFHBw6K4+|HY%#a8$P7W--FcUK3=~7shMy4RHOgaS!E)FswX+*W5 z#nGHtECE|mx?nRr{;QdP^A|IR+xPKt$IbqZw%MWM1&3wN7q4FN-qpZ+ z7bCl!;)jM!-sPW9HUnmUyr(O3&Rg$j7Jaz6LyIS+S;K23d#FkjO=O{izri$29nhDQ zjwnaNNm@cmbuEB6vI7GI){^7-Fe6gWC5jS~q9ujru#}V3VwY;CGxg5>de0ecaGE2( zY>apt~#xT$1I#Y&VELTygLNRCbN@+{@ zk{6A0ToyP3;*RXI2YqratXOj^xmITH^12TgnCE>}L|DWbOGXEw;>>g)O7+BM?AN-= z+Db1X5~us#u8(Z23yuunvvYpPs5}1OPqNPdS(Tyt#=1MXl;e3PIRlA%p<{6&sUU6v zWOdb<@D+Bf+p(yE9QEprL=^gLw!)Acx0z)&Xd&6$+QgEbl->@(9H0F%Q$$ePfrXt0 zUIU2EFsN~58!l}_y)%j!psF`a0Cz8dL974U&bB_kVP>) z70bNQt`GhXeP{FF6xzICwb5#gbxTSl5oQYy^MQ1HW?F0a_W$mF53F9_bM8y5nn@W_ zl5PtDW!Nz8wk)@W$?Ea5QIJ==)kU=ZWTD!$O(Wy>k}?Q$GtkWCZp(6P-<1V?2AuZs zy2 zf0yI?^N@TqpYaA+1`ZjtR&+M}wsE+v-0h8h z6RKaba|s_WH7da-&^(})LJpdzNKR{ZNMdPFSP)9Q zzh%6w?1^BhNS?YcqhU1?`(Z^I@@=gumL^PYNOFnlB~747L((m}6sQ&45M6?`X2GT= zCy-2a$85pH$wg5ev6ivAq1=ALJU5gbX}n}|r?myNk$u6Z?<0$G_v(&$xZ}xtmCaKn z?V#)mskcR|hI+8OB5@zmiSH_)_`0i&ul;nqW2x(J9NgBm4b;jW?vlXa`01uz9^OZZevMsTh8H%f+yvTx?-nnD!I0G_o1RgqF%X zuJEfvJY;}1g=b!Ct+PyXmpV_}=V@C9`@&l-v&A*o=1to1`jdAb?iMV7CeZZMPRUo+ zKs<75QOBBy4iC=^73O8ffeYr`aJz|&p2T>v469sVVs4eiJ3~wz7h_0UL}#{JL1d;L z8p#ruWy>DtHf>O8nC!_Vl31+`)Wb+!67%ct!0?*O_wU%eXTZYL2tVSKP)#gL!gQhx zw^+^G-Mr81&j*%i$7nYsb&43(V0I7YPY0TJx39P>SG2q#H^mKFT0jPr5iqhe!k4uM zJ5~drR*b3c*%gPhCfqE1B$;WsqB4;rz;kZ_w8k+KM#W8WIRxV>r4BmGlw_2&VNR7M z3Cla`vV`J+8dw4^U<1`Bywn)yT4rb)F0_O!CUI)&`Q;=>;v{Ffp;T3q-zy zr^GP6Vtn=&eEfTtT>s4Y{J+2DSHDQyP8;sF$|4I>23KcLCpqk2&%AiCu-iUGQzfSx zu7||ZLh7|G3$;3C;bmzk)IGJGn87F~KwSi{jUkutHJ%!?3sM@FLt&>*QXxx4QzDlV z(xu)aX^b-u0d^!Dt4qkeN@i|`k&x*I+gvcKP*q7jkqs_$qI6gpbLPVwtZI!Si83Uz zNvLu3y=UsGWao+6BbXs4& zb%7sl8S*pCE~qb+&u$I!mM7ygL@T#D=d+SgGs>``6=g4t-IEJ!zh`q$c4@<1Nl*%9 zYFx=c*?k?f! zMTY0Xp(YMe*bEn3=ITulJPw4afl*m81pp%qWLmNFGHltyR2DY_c+nFtoTI z;hCy5jHX0UPZADAXezX6X7<7~HRff{b}MWy544uTo??Na=cwiu1sam0II3Z|D|E0) za5Nc0<7Ik}w#jVSvzum$7nYU-HpnwOnK3f2n=qwJsz#avaH=iX#B1S#NOZESCwXM+ z4EBbDH>w$=0EC+x!f+2bJ{3X4czsnl+Cpd&HbgC8c12B?T#yF21BejH63tieVg*bB zFkXugMS{s1^Yr~9#Bvj~+|XOizY6vgu$ zO&h3CNN5v$X^=3Mjfe&dFusILkA{7Q=+jl z8hdC^LS5xp>;et(gqDGZGh3sjgcEFNs|_!m(Vtf3Aww+yb=;9&6y>6L3khk_PzrH3 zvSmc`QKQ(*@YZ7g;75{ijIsF9pW5J9a0U1GnfHqu5+-1*1=hj-l~zej(8JVOo)Se5 z(mk+q4#Ny>Y$P#~!IcHaRVfzzsdDlf*1qq;!RCc|sSFn*P^e89Bq3I@*3gUhd39Tn zn@>@P(Vc2W^+Gklr4l}`-gJe_x3*>;8j(s_haUS?-zz)AZKW`#`;?oOU~kzEa~3;um|@^ zd@V#i0nA6qYVU=}BH?LU4Yeo?(;7a*l^Bn5>go*^g$b5U((miIwX(%-k!hyRk5-}{}X{NC?8Wttm5`S~?J{Ny#i z{PgxKhm3KW`S*YPGyeS_|BRXvzxd8aeDb|-@w4Chn0fe{0~rqdnGF0{8u-6+#lPp3 zKe0W3Vh4WD=fClB|1QM48GQdMoygxf`bM!!ta@j$iH0oka0hjU!|lT1rZVjtb#Yuv z$PDVzE8;V%g`5j2xhIhtX|qLAri>dTWiYVX*-wpN(KaQ!9yjIMlLE`K;BsGr@+AM& zJ%I9-F$EZ0?*}20mOPnBs>+99XcTDIPI8ZGV6b<8#E`< zkh&aJRJwa>EVbb>5k_aH>gvE;1wX6$b`P(^W3sNZ2wIB`_Hh&cfC=If9*v>{o`y*5 zX$HwSjmwMQ24C3Uyx_2Z&hvU;*u&L(JD#R3O+o@yRS`QKd-X+oSNywXsK5K@|MniB z^906<8^0bLyBN_FRr>SwEw}T;zD+D`L#Y$eoN);`MfHV64(u*Rp1%K-dAh^0b5kM- zHB5=IwE#SekiMqEd&=N75_njN=S)&OV+8OR$l6(=P(rdV=Ygfxo)n6NW4s64D5)UP12d=}w?P$T_QO zB=@v4Le4w`F~?bD^aL{jpAel%7WY3%=3*Gw0#+w{|C*d&l$o4`Q6!jPOGYeVxmN&) zqNa#!Ix9ILO)v`=V)q7ONDA<%c|}l$VeCn7>&(39i#ZSEJkSp9SX3}~P-7SdRH4?2 zrhH87yTLRqm_f-yct{@taFSFI83Xtw05HLDKTw+^=_y&CQLA#X6F&TK!}fCG=Cgrc z|NNR?{Op$3ueTiX7TY9T#$JeHxU`T(UMkODzvSX_;MwICaSdj=1Ut>KkXs|ALTfQDNGi-;v8<%4Cp2cB&kK2;sp3>xFXj<8 zk}ydKjiJF@4Otqc6h_VXW`ks6DA2ZZ9*ARW+dd`*$$MUP}?3+!>rN>FU{~uRVuKE9%cM<&X7w0lt3eZpcu~; z>x{G3CGukpR>{eF(SnALs0ScwB@_Ux8q`MeV6P_;pY4FBwI~jel=1d}Imi7q+nl5i z?XezQpNATvG{>Tdb8pghj0cW$Zy)$h=hG}?xMf{4_GhB|TOParVjV1r`xO|o9Oe9{ zY3bnZ$&21S?(fPhH0^BysClsd*UCAw-cH^zPC3d7y9u>c7&0b`IvmUpZ?qKB<#l$Z zX^(oyQHKq|snE=A3OV}Jx~hhP3Cm$&+Rs$q^PSC(@uLse^j;<Pks<)`0|VA?uXaRwHieY+4`FLdGKKS1CJlFr9_tO=~JRhg6|9xG8s_JnKan8V0QItN1_46^J2oUM) z&a)Fa0)F&j2TcUzD92|m=gelaVYzXpX@-(0nFi&(8PD-goxP8}pBDbzZ@Z2OXHCB{p&Q<@+czbdh5O^zx}QA}$JR~2*?oM=`Mhmre_Jua z!+)>8pYL^7;CU^6ac?n(ciRhtZoA@dJ>Ek#hx6}!1b`poF&^VLD&7EtS9zO9F!&oE zM=*F@@U~M0>0>;`V|=sYFg5=ChcEc^AHLvXTln4Yg-rBE?{DAw{&7hBgWr9|Klt5e z><^V6|LmF{ee#-5zqtEKa5A^X_kZ>)zW=jd;UfI%TOaVrcfZ9?fBRe9?KWTQ8var; zf0?fMf2J!w_QoH3fWd#{)87Hl(Z6nd_1ODP08RcKkKOM=puKw{5*s#gBd72LT&9Y> ztlZolxVfp!Einw2jN^b=rOpejG=u?7J5t^SGeg2S^@x^G~ zFbf&BEJ8{`83*Ru%CbzP)$=#qPq1}`&EW5*4P^{gWMjl+A(fF~v%^b<&MNRZJihRm zB!!d)yk67VO!EVxz1rCY_k@{XddZkZ@;H*pa6E@PHV8^>xu2MG zJpt%zVoId5G~S*RIR36%B!Q#>Nt^IM6Gzl=tITGMIWvwMTHWByIJ`d4>MgCo)%%W) zYjw9F_$e{Q-+g}iJL8=myJuIR^2Xa=?*uObmMB#iY9d$2cMJ8dlJ9bt&|4@&VHh`f zX)HI57xgt4S5WiJB80S}c>qCfp`!Y=2edUwoQ_rbrv$no(#{f|sTT*H5}M=yfECac zBqkWY;Qjx-rOv@4B4KJ$aY|2oB}|Ow3+RldMD-oFcl8KtwboEcSOZrh+k!5Fq>@oTyfu%sFWO_qLPp#w8gNN5#2H91-1xvN>nRYEi6@7=J3KElTb<_u(C*;B9OD< z>ew_RKA;qYXNb=M!>OTE+=ly|TtX)KUZRzDOv-C#lp&pIqmI}q@fqX!nGfT6(*G=( zyn+NP$o7Wx;CeboZ~?r_Cc3Yzqtksmdj54_CB92p(oF8fDD}|rWufYUSq<79m;Rc8 zLegNVq-t1|?rofC>2NF_iQzHW^S&6hHAoXF1rtvMBzMMWb6R$iCA^#7hF71`S|rEg z8Uh?yS##bKoJhhop+jeUC8aIKw1hOVltc{;Xy#fenn{|1wdD;h!6IDpYlII;d`zp( zINtHzd&cDs+MM~>Usitk4r*#f~1q*XlnspM~*n|!zzRNHYvunubuyX&H|1C1-bXy!&n)b zr{k@IP(LTh9h~aNR49o6&!Q>0nT6CY(KhnpX5v@3x73^&E()7=V5v@Sl|h7*6BFJ4 z5@qm46UduOgvN4rhkBuuk(PvQDr6T1%}6dNUG}&$zr=*n8EaA$uP|8!a|TV}nVS>R zAc@9tB;jII1qrSoSu)}s08N1|s%Bg&s)c02pxu|%oXG>sE;a?mq%GudEwhNSNW#pS z6spC2&(`m!rV}g8L!{HJ(mYst?sCLdtU8la)GCWOOM|)2?5mTr!No-|<=jclp@nZ` z?x1dy(-KtHA4wPu>urz6xP$qsK8=`D-54pP6tdJg8=fsJK>8ZhTL%+Fk05J@!Y~N{ zq*;six`bza2k2CLJ|z}mC-4CJKn1_#te;Ma?rH2tz{!MQO1rc56T`69P*qtAeBk8w zdhFxe2TD$!?<**I-xG7SK5&om-_k1Se|pafR$4O}p{}&f<#|Z=&OwilS1-8i-rFYO zQ7(NQ?&`Q3ul5rx7P8f@NR8_+yB%Y`;O210tJ`aqWnojIc+^%_pDM1w+)N5N$2>VL z3%7R%_S4K^eg!YDdGBh*EaNUzV0LBd>Ow2$X~~W0D8>f9Q%*60$J8UEyKIN`f*HDVtqlZ|JS0qdxdj- z9TQ{Jn`7pE5cvMzk867i7Nrs6xycCtKD{s6FG&<_)P7BERSfX{8Sank_xiKPbE+Mn z4c(jdTcXyp|z#2UsJ40+*^Sapya~`ke3l>T~{g|NLL_`TI}#>G!_PC*S=R zuby0ft!wyH692he@}KJ^PcZ)XcHobF&p)+^@!ul*?=jvUl2Rubg~V(Uz@Y7&yH^W` zU*EBBiCHd4n-$v&O_il>*e|Uos6rwyYYHhrfjW2asWmEsrV&X2 z&dv=si(u8Td7)XQEzaREbC|Aa%N=dnG0#S81#2Y|{W#76Nyd2T>@FL-ODB~Y9&xZ&pRHKPd4g;hv1iZUD(N8hrAS_?PY+3#z=3YLR*#>`i< zDDEW<&q3gG5Pm&Cm#+IA&mp6gqnkyg&jdPs>~r#o(GD)$Np{u z={X;Le8YzyIIlm4Pk#cx{)Kb>T&TW5Hydos%*p7mQb@wPb=IM>RN?w|&#Pg>P8Clc zzP>1;iH31-XKoAHoSi0CA<}wG?ss3o4rHr=yM-+RU|Ei!t4Vmx2Qb$Qz6mB{Z8Z|% z+)psWXFo}a%z`tJSM^)B!Q28^g$x{G;f_VJwv#B+C=J1MW=m<7P!S>7U`$v_L03-*4+!S0ynmv}pn$}Q%5JT#3_2^M0?IpoyM z*v*w$0=7tH!%&oxZphq`1eWaplVNJ46u#R@1sM`PDqcHV)+$D(wuQq|QEP0=fM~`` zqN>x>7z9)rF3wT{O!ltK(cH1*)S^t8uo0fI`xT$lk}8dAHAzNV0T_4VK3;l4iaConHO$?c5E8sD^fqpw3} zXYM*NW_!0T5T%+j=5ytl6PR)WSna;d+Tqdx}8KMEuiiGnHCx}3BA*OfBXy})_DdRu5`r>=ma zsvg(8W_BtPiv>hi5|n!dX1)U9jbkC-u?5}V7@}9UyKDE3ma`}OIR2+lM;HfM+mg2z zr*x^fsTmtM>3G1P8vs#U@y^W-Ho1EgweBR%@EKq+-yWJ~RSoiMhv4mqyyNH~8uRXEe(Ex?Jzc&Ic3KitRIH~^S z*R{qY0Q?w_@feRmOeAfUo_Pd=e{({D1s;-Nk6`d)JjQQYyuO+FAO8Gv{)a#RoM%r) ze(?P#{NQ^}czQLw_5Byy!XN$q`~1=Gzt8KNnIHf3H9!31H7{OG@BFS0pTFY6=dbt= z{>Q)I^^*%e`EG#0pMUV|>si` z|5d|fmHTS}dLXoear>fj{bFL83d7Yio;~{r*$c_XLHIF1a%%rYGi*EQ?YH?#LQt(q!$Bp!<PQaOj^^-GG}jQmPL6wKS@tx^40%UNBY896DR-Y#2VW2ire$>_4;M#( z!a9(iyhYW$bvB?Xl7qD(D~JOpe<LwC@l7eL{il!255R{Y_XceT8@)ng5 zY{aA@Y`{Z;G?Eov8dg&GYtnc2&%g8WjLLP$UKuZu^};9LY6g;E9j6hU%uAmoxC@@n4c_w1>0Dm z){J?LM6!1OSP}5Bhw)~(ba~I7Buz)EubuV9`@kF!Nw?8nVY&}sKR#4>@EsvbT&*Z9sqkPiL42Aq176) z{a&fwXfi?CVkwjxBt;^A9iy8YN!G%c4t#dWd(n{ct<}1GxC2pS(Apdxy3JYI%yv^S zGnT~=qTsyC0*H^T2+Zd3}Ay_SrMc_k`cFGn;X!&eZ!+>51h;$k$@w zD{0nQ)G9~{Y37u|^U*CNYRv+K&i%8sHH?tfEV%=+UHNMz=UV?P2CK`tH>27@78o?< z`;=06{N_wM+%h-gt~qyi2j-=bQtkx>j@t?y$4_)UIWAmQ0Bh~*59635Ute1ba@ObJ z0fQL)UXt02UOaGm%{0+!3}3cP;Enx$qSXK;o?c!8Mqy$W$hjZGES_s=Bpk6ykpOmT zt%zsJFd(Wdwjg;#Rj5+g*M(ABe@4RtvSteqN$H-44R=F*A-hvr<-(Og6Qfn~vQTdC zNNzMWprNfYnxK+tG<@nRIE&K`Gpo`ASgfhs*l5T$x4VTsbC;cuwHO}$qvpZvRJ*^P zSlf9WhwiDWxF3rF>Fg~pLNz%8cts6Gp$gT7>sL1{b;rfHVa(xCE@7HW>vMq^$MxIV z7o3c#GvjPc&{{)1C4*uo1p*wamBV68(}8(DkV>XuEX&f@Msl>y5D(_r=^DEYg9HeT zhLpBxVzNqImN!76^WU`>Ts3pNwy5LlU~J+H0Fe^__wYCm*>mRw73)~}Hed=M)ppF| zsVbW8zh8SH$?@;r6=GHZcwO_Dh4R7?yb0BX+t!$p;w48>&&`4CjXWgCg70D++-^ht zW}-_sA6_%Rh9@cv8Fc7{C^%V^+*#op50FP7{47dAHUqn>ExOw=;Lwz20@bNvEUmJ* zA3c?0tkWYHxk_0Fxz&%weJO>Kkgb5Btl;G7->cv1I`>KncDHnZU%ZdaZz*1RTZrb< zTy1^V;T}5fB6uD!wc|4oA36!-p7)ux!0v7A%JVo^S~!8Pr{_7GE7n4bbpd=1{CQs& zf}brmPT=nYfONgSbxf8hLRkCd3W6u;3LL~7obo^;BU;cjVw!+V9=4R-4r{kj$bm2| zm4s3@v4^a+#{6^!Ca#xq1fb7>$rU(#%Pl)+SpRk7yf|0;+!yOEKepxH+OENK70eBpzvGbxK}!Lqtlv|lfr?^nF@`b=4_2o zG63G=!B%CFn76{-raz-=!3)wqvswq7*3ztP?*0e>KgMG`#$!B;b1+zSt;qYUEovU) z?{Pc;gTsHTy>n6d7?1H7-;8+qdg4$2#b^BKzxa#~o^ANu4hCOcyxqt5$>qR5{)Zp( zkN@F^ym&S7qo2O!N1wdr_07Bed7r$#eb0yIRr7zx-12dgk?u#(X`Ho_@ga z^clmG_h1;P9^jL*1xZNFq+y5T_}!LC$}-9mY6c3(0bC0S3BN zYMt00W){E0<$!b_LscP{is(e6B3dYE!=W0>9M9O0Gf#(0wohL(Y!#7(S|O(`x$F>u zY6~}ZN3{b>s~irBwUKeW;>mj#+3`(5Y`~LZ$#8LO4o}3^f|0l; z+jGu{w4-Nc>%jJ5e+X|x{Yv!_q=Vcxf%hf*d}s1tDi8E2L4$DdWq`G*_l+CMQ9(0~uXr z^1T1uXE>ffz4Jc2hRE9`Do+5zxm@~ru|x;JT=1pQ#3{o-9tt)!=GK^}#_iz{V~-ek zMO;{>TUwnNE-pyJKtjnL>Lytln+_wX04Xdl#0+IY&1pX2+VBk9Wnx|yT5~qttGcM5 z-Z)6Cg$6UYn;A6GT4QiWY++lS?V_|AlE|BzJF-H7mlw~3vD*1Ls zlXIaNJyb+8V$L*8SnA&9%gk)2f=xpau_NeXW~6#1Eh;COQ$bKy>QwIoiXuG;AHPqn zku@`<(#IVGg_gjjkg9MvEKJiv$;#Ds!!BpCgaU)G`qQpOF-{YusbC~p&ZH$kaI{w; zH9{s`Gos;7ZC>%(NWHKkE74C~j~?PH0K8tKs#20bp#$Si?L{cHRa#x5P~>b}J|AO6 zx=b&@_zl*bqh<_}7(|&kjcMnA`teyk19;DWj_3O&;P3ILM9wa2mmJsre026{?q2XI zC35$R27;mJPU#3qt4g>;J3_)b+nXViw_Eh`3aK#53v@rB1Nb1^EeoR?dAs3aEX9_lLE*KX*Efv>78X`~Uw9l044L(71U7tD9p$b5?< z)F#Z;7)fXrsIBjFr1z`7ZtQn6r_|M2VW4}3j9*_58uKip(z}bhX zRk~ij#gmo(gEAPvGjFc4o;{~MZZ^8ns5{;oIT$Uj{ERh9{%kS0Dg?ec#OyRidYAKimj}LhdElS_PoMJ9`&)kZdr$bm_pZ3u zy&VjG@9D@tefkmq^dEi1=g$uT2LJRmw|DPGGIsj|zyGg4;rIXbC(J|PXTS9kKmG2v z`T2J~qUOK3@N5JAR5tu++VFqlJ^q2u{7DCczyCEEc3(TbwukS(V`lR^JW?$vebCtf z)`Z(vGy9iHkt=lf9;8h$x0acdAeDmohS>y_O$TQc^NRJvsiqVgeF>IB?Os0X zsM6U(lJ2o0x)NyjrHjN@HS5*-hUc~FT*$R2nVUtjB_)E88{Ti)1aE>h?-j=ik}=7h z{o62yls2Sv0Y1fgNfXsT>KuvHk|?R5qJ4uNjIdw|IEZ!cEQ>^|S@(K`lvB@A^`y%R z*i@s+DM3qrO}m__dk5t^$mFZUnq**=&W@yRwWty&CuAs;P2%F}id3FQQrK4j9_Wb_ zL62bQ-&VZS!uOpA`0D3JOivPk9XMO%aorszXSr?6*AwLcx*c)Kah;TkcGh}gkisSn z*gPP2j=!4WnKBn=*%)`DFd`IhXmePcw~N&MH7>7%h-Lx)s_aP*)bAPWkbX-j5*w{U%H zm<3=bte#|D+RuzpH2^SgSY41-qbR~BhR}mY+MZ#6aZ?Z!5~LhHl($QG#%8GjVznti z024-ENcujTGNQ?u79;B=+hNziu8A}scyaeD_P3S8&B8S8nKniqg=MMXU)zFy;Jz~D z3`j>N)jighzj<%&|67ji5Qv1^Lzd&iMDN=`;Pby5XGIJ0V8-aoCA>3Y2ru%rkKbk| zZ=GzFEFhbNPl|6 zC2Jz#)K+E#{9=kOnmpVmF&Qh>%1|Ib;VMxQNYTGxhDQGBVC zjnbwH23ZCwg-Sv5B|hxfq|bQz%-D=@`%?JXkKo0pN~>X0P_5B)z*2$X64w!HT`s*k zbrVcYZ}g;Vuq1B}l}}$?^Xw_zM^l)W#$rZGPD028faaZjx&px7^(<|bmdu4xVl1vT z*jcT$&Xx|qVfD{mf#Ee#Z%eRimZjo0)9Os>Np$y^M{KEBO1P&;8tdvm>1?-KE{6e` zGNlyUg=J|#jcl#S5#U<;=K3rI!{@6d8t*Z8-V*mfiwEKE6iGCzA-n1U;N8uQ*SD3! zzA@{_0}=T4guQKw>{v zuBtF~0C;B!w*ZpcVl1vvv^Fou+}L)1iZK~jW3wFCtXQ^!&J%v9ND~Sbq%k{a(cSipOBOohRp6_pe%_}LSDAj8GQ9ckLyThAjry&Z>^!4F_fFzJ=gm^6XBno z&)DoI@OJ%t_t8!QSwn8U89qlLQ#z-^aZ<85g6XSYY&2+mk3W1q-Yg0_pKnUi&V&um zYPA66QV0EpBe?HmImrtL?kQ2QDS{S z{GU~o6tW+&KUtqObLx@FOFu^JMWS8$d~dxtODqaJonGM8?me4tw}H7|9CP~nSC6af z>n1BBK8hIVvi|PDuwKUi!;h*H=ieX77hN`c9jnjwYNvBJV==p7eSXpL3Yo(uA{1*D zOcPqRzUbwlnZ6pArd`1sZ#44?P%+>W4Jjp8gYaFkyEvi4uk=lq_n>qzhSC9TDV7W-q#Ve8kt7m(PA?R;$e zH@Lq2Iv=c0S7!9_9Pagq;4go{5B~BOw50s<+aL1DcfZX~fBR#m@$ItIf0c0HFJ#~^(!l?Nr+n8d zf8uxiiS7A)pZ`~9G`>sz>F;{6O(eQ{i8X>(XWCchsc?C5$-XLscSf8ocuz`;hXkic z$njZQPO^roNREWR)fUNxT4}8!l8#J|H6fC^VnzH2&KawtStMh$11!>|SNlddrx9<) zJjI5+j2TMCtTIg#J5P9Zd?CC+wR`R&7@4IVsMb&&P}!1F2CKL^waz4i<~5jDC0I1g zx{RmCxk^vw+}~ucEZ(TRmj`W5GrU%0$oJU|JgC|}gMs`AEO{^y8=(8R7ORn%N&}t* zl2g+XvUv0)RQD)-Ynk_##Jl?U*Nt};$p3Xt_HCc{(-Gp|ev}CWsLe?vHfcoEm=2Xg zn{anVSMpWCnoN!7$qw&W~$OFUn0SZg6}frQn^e6Pj42k_QqlSdTZ;r=bd>g z1HwR^HeA1OZm+@Q6_-~7o1LPXaT<7+%X3Ao(wehhDz8M?w?=9UR}L4Vlp;s=@7uq> z%iO8qz915E=dC6V`s z>8D@$44%%7NKCFw~Ch~8)Lb1rn`zQjVWjD zHW|?cO+p@=VHEPl88*(aN#r8D|18lKBlmIHtsxo--8Ne<@-bS2rOU0BGU6KSsA1Uk z#CNdBN-0OV!p&wwtuylye!eAVS`8o5Qc7pI7v{qqNt9BySWT#GNaK6>ux0n;&lxr! z@WrnZKmFmJ!}Z8ec1(85>)Qj8#@HLBkwr)5mZ=sprh_DwwDbgVfa}SF5j`z4zy9Jm zn~O_?@R2ri>YBhbkak~^HVU!515D9Jteb>up9i%DV|ev~L{`R`BaP0CUOIa%{Eksa zq~ca-wW8^C%;_+5m?vC?A&(R}$^VKtDJh%HhMWtVoXKfG#JWxdN6GGUf7G?#K?hLY z!Vr4cm*3fcAH46JfhnRO0gNA(nd_U0*Ef}ANyz0DAAk3P8->q)cEiQhhL6AdTYUQ2 zOFsM63)@HZ%|a-u0Omal+Ul)F12!CiuPaLIm=5ymvp>Lh+CbhLXa& zaqYh;M={7uVrj;%Dyct@O^n51-X9Qe3_0=f<&&;J7haZTA!*(^6S(5t`_eEBIZDRI zc}{hr3>$`_KvI^uk&99^(XE~DF@RI=r$-NQ4BRL=Sk}`t(dvSWGi(aUPW^g4j`e~$ zRmD`WqLkf;Y=$VNxY=X-bu24K5Nv%`^6D|I+HFrB6mHyme%c%3djOg7+#5zRrKBjt zDt(++)nGx|bjs&wfW=9bQsNx0udloBYsliKZmFWJ1yDIEX-Mc;Fb`Sa=HUe|B{7ss zWV*p8ff>>QgC~YmNK$BevM~uNtsnobBG}ahj5~aD$)3zyLw-6lG7K9g4p;-xPzS11 z#2}fG8zG;pdSZJX$D%&RbpZb%fPS2xL#yWm2(I9ro{c$gjBEFQe|Udl-nIZH_5S=U zE=R=-h_T-~`NmiFwg3`f=EJe`ypNpL``mla!{40~@VSD3=eXMnG`iV4i9hRiuI;i+ z3z`#Jay(nl!NN&K7L!A&1O(O3Y{X`*i+ad5Ldt&$rA`W`YA2&H!!?)~#&hM?~%>5=mHR*j2SkS(BesCNK z7XC>h`u_3XR{XG@fBHZF;CKEnUv<*|;U9i<@Av=yUw-~oZ-0!(c#OyRjfmrdqXU8K z^KMiMfFQ%OdjJg9^;!Cw|5Ia`{fP);$J=ISD)=MbFMB5IlX;@c)2Tl?>m?L zqkr%L-}-2Ws&I3+bZOtO4t3|r^)27~`LFrI|K-Pg=ht5_EDMM2hIx296Zx+iuSNNn zGV)*PCI6LP@=HmKG(KWM@bDx1>XYNBG4(h3d1tI3-k1HnEAD&nJ^YDb`^#Vd3dN^L zTDjx4P?C~m!`-XI^{WB5OFR|)sxXWLI;7a>r5t{1ttY%`Av;PW<5V>K6LUsXnQG;B ze@m;C-1mR#nYuXpn**8#a#4n{P&VPUYu0FP><@R$lLhmlGYSD{k$fqdpa``^@>@K7 z@UTY3>NUbROY&nGH8ZcCzd*sazfe(gcJcyvTDTA#3+p?^t(Lolpkwf-{k|l2y5Tk@)Oq3o?Jq%g+=HwpWcjEClUKncHiw z(^Ecg&h=u*EnL2U-L*n>Zrt$_?9Gj2vO!Ck{gVw}Jjwig>trveR7$;N^qE`+ZkG+e zdQtfN)yRwXjM_S{OOzl!FVuEG+!^f-wF5K_-_(rz z0By^@X2zjV>mATTlgRl;o|rNU-=LE3E5qGZiv%jjG%&xn0MovygMU1;?{ zNfOWXQt?-xlT||2Sb`aq)p>SNxGc`~P?*XEGVW;C&(XVE)HB1l!&pdk-@6ulP|@y@ zT&NA&;^fk}+7vd!hMIQl$1%KbUtVL=fiVXIs@f_knNb6o4NY)ynHh`YtrsvfxSND| z+A=?TN!cVcr;t@9yeAH#!`a~Zw{^XVkgbVvDR@EjUol_eFq^)3Kn3WMRa8% zS!Y_o@!whtLmqL$5+V&5x@AOj=W?kmlKAB!{OH>G`5vwp$ey^`4m{g9&vpZCx?{TA z^YqyVeEj|IlRx-?{bt~G-O#99?h@NU$=A1BJip=U<(_=o$k(@QZ)eKwg4`|WzS0nu z9AKJEAw9gw8Cn#I1ONp|3-g$$OEA?K6_fDdEh&f6_Xfm`F^v=o9l^p=qLOKOK*{*x zl%X(5W0Hl-ao|}KUXF#qz~_nEG4aXaj+efm#Tk6zkSe(|{q|ybQ8qb2QSP?R&^*|o z?i8~C*81Gvx+H&_!VbXZg`$}@FJw_@M#`16K&#=OyICq9RN=j0OB1+}2~UI+ZI`+g zQ(8;hO-41i&B9@qXgQHAWSi%_;jkImwMJ?a*(+NOrHk1sNMh#zN|MgJT`C!8SS573 zXRCN9r67c@h_wKxa>CT91lLTGl5(uIyc#wycn*+tUGRvmY}0VAtR3Vnr6A_mQo~wJ z70Ze!JiEALv)eGMu`CsBPP*8_Z@mW}e!#fhF<)OZU0~wEhHYYd;bb+2B&0F3l*Em| z^TWc6+dBps*o+sHl)^sb?wWSE<#Ll5n=`kGd2T$t7%$HAt4?eyh?n)C%a5(9(ZU#Wg|BvByKf zTle91Ton_c0@*wmhLWIzmzH9#Z*l_j=m7pwYglQ-P65yKTv_Vu%kD+&6_fEqL$Z>_ zk=YxI2vr10u|7!>j=R!-T)aOziIfL4<(Ow%19wv2EA>@p6z=tYCcT6x@+bYr&vFjE z!Gbg2i?r69M1KYl?Kzkzs9e7f2lGmGW6%`ED}*e$iG|I8Ti+x5y)B>6Z3_CgJu-kF z<1rrNF}_B)JKkC>d_<65z4!kZ9F8J+lUGT^M^xORGmpAr>SNs=x#rrh=6T9R8WPARR zPhVOW`*j(Hf7|g+2J$T1+Iz)aM{*5Lym0TmDQ9| z3Qw|Qy?8(GbpN>FQ`IYbQ}`4%J*#?t%eAf*^DDcmc_d(wlaJ@on~J`{Kl|?0pR(3^ z1en+JK33PS*SaQN;5b*Ve_t!1*Mx$Z^=p^KUTlHz}(yQMHy+Lm^(`? zNKMq6i9=hs7!s*$Se8a@j;WH%NUe@gNLjheh9+n6hA#_tH#67VJtrGTp}ND9#CWm8 z5MI~HX2_J?GnS<>>}M=F#o~EPE))x2$iJ$adEEDmCc(8aY$h(B8vFSMVc?fPPrP`Y zxOjHOX19gpNY32a%%N3g0VbzSmDC)kP*oWg!&%t(zA^zf^Tb^l@a;g&3w|(^k-S{8 z?60_az2(Krk(NS8A0t{AJSzs%p z-FR=fAggoN7WT_sBv!YXv1MeKdG*=n;FW~)!Eb#;xwzyYb}V#Y32)ROQ$_-KWn(SN z!glRP57;&>SG>olubNm^!k}>^p}mzU-jC<$Uc&+&=q4N8E$*j8e#`j zo?bai(j%lKU}fCL$rrEg`4qgCZl;kpOdwFfSg8^8~YL_67#i zyyvDJu$LA0MtLzY?k0v&NkzydzW2k+3tSV;l|ck6Kw40BJZBD5_{CdRW_K(*rj5xf zlh1e_nEZ}1D8r^85GkN)cCH@y6OV!l!GI52EC zSV|!k+*%u6n>H|{5E4sv7@}E zc~9_nU-%=trO!#)y?V1I=q$vzf2aA%X-CFkP9tavrar5MLJEmqH}a;Co8uCmo1xs1 z$dV~2H=Ui>EZt+EsVb>6uIb>dnFAKG>8$hAm-pS3MfQ-LcmBFdC~cV5z%RPgv-a`s zxxlZlZ~5izfjd$1X2UjRN)i?=NO4GsGHlrFwzvwlRyJkeqYpmh`HO{G3psnp^J_u9 zQQfGuvK?AyJUh}Ft`Y!<2Eb9RuSxp$t zVO-2Ht6UZ5RqYHa5o(g7+^sKRQQ@#Z!E3Rx)iZDW5^|P zN3|i=8MvAP5R$~FLVaaX zM}Jf466%8^bNDKkQqWW|n;6HDbaBDl7V5H~l1M{FZ9!UNn+wmLTv0?h9PW-PI!=rQ zLoZS~N~9{WHdF}~t_sx~``Vc212rr409Vg0W0ldsG=VGE`&;aAV3#u6%L~e;gkq0H z-%KK85Bck{3@ph=T2K*MHKwJ38Wn@Xgye#z)o<3ZW+82^N?R7vyx>El<%D%@jp~NF z(Xh|-D4L1b(Cw~x~^WwE;z00`#wZd7vc7V>zfKb z=f|YW=dZ7>^0@aT*B|ujduj{zCPVz*cl35U-#aK_2cxDO`rK1n192qVu@F=>{OHXB zY)dJjR;hKN&IimYGS6sdw6EWpb4JC__I&rx>9|+xW8AWYO;Z|1N=|V;i&3rNLnfz0 z-VD^fo?6?cweT)JT`L?FP9EI1^E%37f9Zt)@%A@mknJsO;fHN~oWnZsZtl$H%*XrL z_ihO0vFDSseQlDiC9_&}9Q$(gi@heoa3t1cE*f?(&B(p@`yM&RJPM#CiU(W;uMPJW zt?|7)%CRW$uo;l-~LU$1`}Q!qX|_?uc>d6m<3f92;@peN@Q2x~fL!dS%kLN5?c z%y$zuEigCQ^)1;N_GHI=Dcs&H%(KB#s0fRPgl5)4YAupu*%`A!0TW?AH`-z0_O>z0 zOn%+atA!;Sx&wK-Lw1S5{0LGjfJ5p{cFvgivPdWRpYVA#L}zwSGasRR_RBrH$m9oY`F6~4oC+tVN&Pzb){~F&9e2b-3 z=&``Vd{6LRE-`B?wqO#n({34IKwM~PAH|*C#~flT$`UM>DuxQU#n>0j6v2~%hRpx! ziP_e<0tE>MNA_p57D^z~jiWb)h#kkN>0*HdsIl25%HX6VY_gIy{JDpcA%(BHYq0h_ zOg2d^{G*34F^nU%#_>|h?Du{Ed|g50XTH)TatxL^*ZmF1(2j2oJb0X!_3Xi4Y@%b;(8Rty%IL?9jvt# zv^asZ>m227;cuzIE?cFrwKHYbJ`<`Mjz~GpgBB9Mhw8Xi#vI2@;^JMNtXN(0qQRiGI|j`panGUUSKkX6xs z|3f$?#xWJ)<22xNp3adEL@-hRM!zTtY>bJ!$qhAkWlc`+`fke`1> zn-5?Iv`!3~*^pTjW*YNef(e@hx@<6AWhCXq)O!CiWAR2aXck2lDoQPxln3yH`GU}} z8fM$-S(MkUA{N)YG7(Y1B{8?k|DU}-dzR(9^82vQ+Cydy=bStICg6wR z2Q<)ZvYTR)RFk&l2imm4Rw!u6FaE#$Vn;X}w)NmQTekdQJzEhDhC&LH7TIK@8#5XW z{H8mcp{g=-@4c2ER%TV5d+%>(KutD*vm$QXsZLd9*3O-KukUoJZC+z{NX{U$?XiR- zkW@pMuayJ7Hm`-%jB5ToG4XpIz|P1qp`E^$H$I=J+}h z2gPIX_2zPbD$8}8kJFrBYx66XadQtOo&TZ&7L7J@3w5<7bUkt0VN>zXQ6GPCc`vgg z>27&;q5(tDG^^3K8?-7icm#pSGXKo$0^&@LHDVBG>O!p;==+|$>KXS3>TsC9VG#3t z-Qzi&-8*(Rw$JPS>lWediB$V#>ecn_@%uQ(uk}7K&GFlr$4v-G1g!a5Ae@c&v)3*^ z{{R3#)I&YgL;V$$sk+?_4`A?bRf$_yvVg&@9obtC^-vG>n_sONKmPd*KmPd*IR`%Y z+9lul#ue|swfrHwJ`F==`#*04M(UhvdEV?<@)gBBu}{qn9r&f=A5wQt2J-J zOeiCbeHrO2Vnt}TBjM24C~Q&(EpUB1vAdfnqY}h0jjkdq4P#;$jZi1@3RagZR+}DD zChftj(sqV4MXo3GdJmzpedm%(>CoNi*6L>TO`HgTTZdPSIyZGcuS8DPsX>I&lo*uN zrO|IXGRn_?dJWps5otqVxGPAC?5~Z`Wd|p+5NXJ$STi(rw9xV4svVnjGOJU@aRgD) zw(;_-iD`-)ZVTaX;4tiXzAuauNXS@Kax`M7h>V0#$O%GLkU1~2%^Bh5w(x|4ghmb% zslT93japrql2f9K39M0VV!C}n%4?(vQ4+PmFqJvCF!A2kzrv>++#`5C`{^Vk_jkcOf&|$^W5(q8WpW>*DImN=rG&Um_euc_@cU%eOj#g zP%v@x!~iuaV|AeCQGA47nlPWLAjv_o)(R~e7UHZ<;{Vbh z=EX-HI=P#Kh+$HxwX)ky?DmnSYo>KanVn8V=O(Bsv~~mpk8`t`|IwB!G3V?~l_~=! zJ(k@OBhJ@iAr(0otf&MeMl`wwCvdcsT>ujiA%{qu)mzM;Bf;%xnnAVT-{V5eVtFRcW8MUdCy?Py zik;6J_hxQoYfVq!j~O9Eng$O0k-ykACNuhr3%2VEk{MzJH3tpvCI{RuV#ns{iaHgL z>~1u*aMkzZnAlDe>u9VhmL-IDK12xloCNt>ps&m z6Ae#b!mEiluY!z897I~8D+NLH^g1~s#vX|sXXHmIa~z2pXd}hUN&<)CHuNF5tH(6# zc=6(zRY+W}S40hHDdavbI=~}oshZ*D$wCeZ3x-6W<6~=VQsQyfbD1MMaR|-Ti_oTl zP)4r$Em!NF{lyx|8FfYnd3HmH<|=Amvnxx!Z;X-cQGcIhDBlNHIgvv-{a={DKWm;z zzo=w^#kAJP3a7otLR?+;8)lwW9a%uenKTe);8|av*N*ewJeK5Da?IKIT9mi1j=THo zlGpb<%WIB6cQ~ETg5I@KY2!q(c|D?b1lCYNY~Gi&ghq98kr*}}sJm-yydy}(dUxG$ z@Y2nTp%7!DOMxc-$!2RvuQc85|4N}UycJgD6vogAcNa#9u8z_p&X>MJv`}wm+ zX9Csvv+GS|<_;M1?(nqEegMfpHoxt9fA-HW=i!tf-)A)ex{mJA6T0ms^6VE*tg6lL z)3f&vBJMoHLQwTJVnq-V8Y67hgkpqtpo|AXgV2d{4BC9BEXOi~$yyx%PAT!|$z!g; z_o21;zFT}>PnhrDR{-GibDW3zGGP54o5`lHDTL3z+s|3c-hVAekltpJw_?Y=?LCFJ z__|U8Xtdcu>&@TE^5+Kt_@N%^p&sh5xX!`g5a&FM@I~#bhx&KELn_s0UKlsTtKlsTteHZ!mH?H{3H?Mf_?adpxK$}(K5B|ne{@`ys<@$Ewhd;gM zhd;aF=I+Y_uG{^A-~Zl^`Tg(xnB8{GPrmt8e*D4vJb!ZaYn{udME>(|#edEf-?qYk z$Q}RK?s)4km5VGedVRK%b+C5aj?@yerfWA zxe;RG$8-*6F3f$Knd%bc*jPDk=(PdSuk8XRN2Tk9oR<9EzrMBaov9yE#4t*8I{%Uz z^+osBQm-i_=DM5)y0nFqIp_$j@pQXoyXu*yfx`sNI*f+S_QV}VHP3?ElYqvWK-0!y z*pd50Sa)1@E2Qg)vkIq92Sz=xiEi0AXl3YnZ&F0as&r;30S!VCW!1ji`OSui-q@lM zlaV_3%KMGojWXsK)bV1#<0&6l;c#t<8+JB_s%0qf&}t6{bm%SW)W;+G7f}G-~sl=eX*4{FQgeIrH+x3qJbU&p8Z*M_+xP z?&5->R`%n-IF8h2gxLF7X^QDd5sbW9#eD}aKa6jUn6fhGfaR?vj7h<+BpE;#6G#TDTK zp-XgE5us7X14SF-;m)Vy5DC&jQ$m|<{ZXcH@O;G?B=L+-AF&Z{@S*}lrpd6;f#^NZ zr$AOEgb5KNts<*cf~cevxV*}&9wk%*Q&kW{Yy(meF>>FLQ_s|1q5)Rho;pUJeOlQ) zGg|G)5mXzM2@CDmcrIEPEuj4s8hwA`xrvK{PhAatv?QDx&d3oQ0FLB|YRWQkAHV-& zW%mm3AIp4Wttk;Y*QPYaJ3MXNS)_9;v|U0#(E((s5(d+f_&jPUI3fV8uyF424Q)P zV3HY1;nUrY!{~&pZH{z0QKyL%l$6~HTV=)A)U#oUNP-wMVRRc!p1q*IIk2gfRZ47% z6JTmBB#VrBHQygXSk!jQeJufzff(JkRF3xabHqXr1}T^ttJMlqVbn_B_uk+Ka_-UA zpc>tJg@`cj8WJOtGcOS?W8gADw1KLTpAU_HdGn0_&&|mH`ft6 zJAQIdo~@qn@zZzt;QgN6weezrZr5}8_(0hiIb}B6HPhvqT#fSL77hou`t2emfp&>a z^}de8Kih+!6PCWH%BeuwJh@L}A$7vET1l#msuu({&wH z3$<2ioscM`;A6MW*3mkX?FOwF%AoGFA&c7p1`_A7b|MG(cXe8eMFmk`H!aG?MKy}K zb^9{r>Y2s+ab>Z@p1rchJ%V(h9znYKKiv*~X49C-(H*AEK;;pDG-I>6fXl|d6z;Bf ztdbKOAz(qcnJU}9L+YBLjO7eSiw=p>xM^Lo-z4&x}$?DN#N*}2E z162ZHy&_(03G1y#Zp_xg1asgSFbgNpNgUuipAGJ*d{s`w(s_Iy-3iWrhDEvQ_`UYU2~>}MB{?@cZS$2rTEm;ld)HI{wA=L2Ih+x{-SQU}83BR7u&d3DU4zn@$B zzWzC-E|*tn8ymC#CV`|we&g(+v_cJkC2*fUvFRw@!kIDOM?r!(4 zT%L(=PRw1%bxtN)4nl)^cJ-Z+ zF{Be=z{32QZQhSYpx(c)-n7O&Ter*~GlTk{9U%3WA)enOgPlI^_~!*6KE7{sHM@pW zpZQIMG7)(IfFJ6i9_pd~O_sI>tvNWjJj@@!;NSRKK>x*3&RTnILH zq}$!$s0_Zj+VZ0hzQ&Kg^**;3n_uf(ek_^)15fxr$`k&Fw&y?QmOrw?7pn69GWF{! zbpNV}HllLOiEIYi1f&BZwT&d^jq|KzUFQ3f(p8R%Sm0z8x!5SrwwI?(TbymV0ye8V z765jpJs&rNi$$g@I^

aCz?-X5|?Ua>;o!`ISujr9soo6>nh<%{}H{g@840o&0nnb+`dsHA18MS^6=!dMHcjhGxT<%{md#a7#KV^^{mVbWAnzGB$3lV5^?`D3Q(RTVp*c+hTOH72X?M^sE}VQf;wit=-LFL-mK_w&ly z2Gx$S!BA&%N=Sr!#j0OXr&~sKP>WR~$4JTrjRR&AOpoX6Qdm%r3Z&VNTV#b%soF@< zNSj3JGLeo=m}t*O+SCX&pi^O*CSnP!x;0rMA-lrXOlE*^InPEDArWX6AS5RNHE)hu zZJ2gUvjc?Dh($OY8l{YYvfdQ(l^&lZIST7_PuE3q7FO$wh8;mhYK`1J>)79|*xz>E zEDn2gOvFBtQ|DRUhsrd#U8<%)P2CLi3qIQdqG%9QgXhA+oJ|_$ob^)#fs2L}QAjaT zXIoBi{Bf~z6e1RUoQ2teq6t`4|4y_~)Q(MT0g?&TlY=pJ2aeW?yK~HAsY`A_98+?u z*aehT!$nz24v{u1bwf^AYgB|Lf!wX=`%KO!&`Lx+*He`=gE?juZJ^EX%@6`9MLcNw zY`mTUZlCvWOR0L42qx5K7@q6;a%x;pjmx~EONlH7bwG5_TmMHaiUElt6A+FV|JzS(K0+>oT+qcfmvHO^S<1jz=SFe zmRQ39z%$UxY_Z`#WyHz}V>!kq1cb_IzV%$=69)1o!0jGb0Jb zj_c%{^K0LcR9}CI&PvpU3@Y!F63VlMA@VpP1p z$2)({pZ~r@L!1-M?kO{u^I3>wuYk#KBER|}xtiLrdv@kx{`YzqkNP{xTAeJxi?p-zQ1HC7_5Qk;ny9vz^}`xVidm~g*ptv(loOx1Q;7um9p za*~J5Ywr+(uOrM!Ms6p5T)Ox*X-*J6UdOX*bX@BAi|-xFQFS`+v6jr~&#PumwTNd5 zXORf8WAc=WqoQ?jdAbjH`o0V^6wfi2+_8G}gw^9GtRMBfwb{~3wN(Q%;aX~J^T!QyA^aix;cE-F+Tvn5A{$F^-%vd%G@4U7Zzm*ZXNvVHoYI} zuXimA66ngeW$NuX*3%}@5`o&= z)J^~|vl>HGXIrj#{1!uSr7X>m02T$&HmjL}H+pNMmP(ufA4#*?Er#QHE~;Ty7red+ zK5ynM3g6|Lpq{toV4f1pbJdm%yYu(aW4rX!_-Ql1{-)+7GeChD5-P^O35)YDdggyV zfP1lzyc`C`SP3DKYGoUt%R;rr7nyt=ZNkI>70+B2dKJ15=%aF18>N`55xbsUDclZs z+#L$K%HG_q3f7R|#5U7P3Pz39Z80r?uBhV*EsdO^PK9xIz?zbCPq)exJRevT)>j$1 z6bF8mrf)Nnc{5bQQHS)|WeHHs+L1Vc<+%wYyu`?FbvzZLtnRq^v@q>fh&G}c>wZT_ z8$=ULh1!5H609M?$GM_}l(6KA{E#Ctd&ZyDLW&9~O&S^^N<<~mQb&iYEUYOhL_!LL z==YWdVVsQA&7kix7qmo~JWuWJ)50_wAFE z?$1lpoYUJ0v}F#mhBA@5Oj-%C%h;n#Jyc}M)SJdo2d3KzYtY3+8(po-OjL<+QP_Ew zpJ_wYNWpVDV+us`?D!NLhcI7J4XB8#^kfC19HzkaM-36bo)MwzCvtL!gY8;rVMofs zDrah$n1)E#^`y?wX`-1DVv6g}W{%?V2Kjhz%G}@Ph-@G z(&$&&vwy|VTA=DN*Eb2I7zlF|LX44ay&;r=Ds!xZtjIZHAyU+4P%TiKViBCI<@a-2 zn)TWclY0&!p9l1Q*0@(ypHI}uXGM&=vGQ`77-Gj|S`ng9t-8f>h!jQy)AD&y@1luV&moNhMPXXIOu>0_FfTD$&h-0q64d4pvaC@xz)5XfD%H<`z^=Qi>8`ouzh%4NS zO_Zv>zQ%#5`G96hh=XIJ%wV}0wJ8x{Z_QTiB*%S&gSIDi>-pHb2O^&RyS%bT zSbksjKoQ6x5^^TgjuM@;RqJ#-PA5VHEP}Xn9!Vgz(y9}7J?6VIynI3G*Pb1|e5TFr z3IwXwSuO6Q$z?BhQrf!hvvP_uFyutat!Mi>@%@~IK(luL9+lZW>U_Vg_n$Y5!u9wa zhBf&t$9_&M)={G5OA&;B(({@{K7?7QFO z+0#eA)_HtP;y;ro{9oiT|6|+pPq^g|?Jsv+=k-^u0RE!)|3Y|J1e23u!Sm7P3}2jO z>={z0%r#fn&TQ(l&07pYoK><@tF+n>iT9c-1h-IIjytB4g_Ww(=8URHIJt}5yBud0 zt4G%J{BOaVO6P#E;i2)X1l(a6Cy&bm9dl~SR6v2m2xka z?pPtXP1kwDYG!ULGb`F=1)1<#7~P^Ie)Zp$YcMA@d4oy>>|7n){1=74?px%`L*&Ja zkvrWHRx4H!wwJw&!Atu>0kF*1PZx9ri01a4o(Eh|OK1wLA3b9AC{k|^T)#X}HA6Mp z+|UZMWv|vsz(`$!R5=V4yA@KmA=rjsN*MyfZUjj*EgbF+bcaF?kt{-*U{fHkCQ=IY z0oDaJO-KfXM)?wLmc>5SXqZ9>9YH!*F#tO*h%%DjyXC#hiT=YaH^1x{@74^{NMN8# zi6j?@CA1B$+i=MOrT4t!J}D^%Y^;P<$uSYMF|OC%G}OX|$Rx&Cm68IX%XCD_G+|Al zgB;^bv{2L;kE zv=t(eBpp!$sInjTlulT!GX2G7ZkVfQN&+z_f+Vaq%1~zKfD_^3)yCny@g*mMOKXkH z+{6rFj?WeDH87WKyR&uhtMB`lSsN$4CWl1sDxoWo8X-1Xj0Ba>rpmQHC9@HKqnS z1n46%iYwzn!b9Ag0F*-j9sL?wot0mB127b7^6`a&)<#excZo31w<$bA+bkF{DEmSU z6)T1nC3SBzwUM?8^j#!`LaiefG7>LIaY8LH7G)fa-5$!Aux>?2y^|_TTD)lJqjF4gJU(Q7oT!hzR{#ZYkjlboJeZyUv8oLL06q%p( zQ`1@5baMGppM4(y8}eNU``YQ|72#T0^2 z8bD-~d#H_K%B~KG4h;J}hr^zgBVvs# zP-|gYZP2)4(hXhL6Ga$@=X70VyM=%Jtmj85^5fj`Hy>v1W)=IgCOluO)mj-v$g35rl*l16rcAxPqZ|gtaUib)NfI%nBMHh?u#0v6 zLKa&7PY`j%yojFSNsb_!%+}m~4;{?&lnt=v`M67NFKTqSgG@7>e{OM3(OH$8UIQTR ztrx{@R~K;4*RcLMS}Q5IBAnTIX1PBWyL8Ekf)bOf@2ef?baBX05<9;3?l+OQF8T4e z2OX(pPn$+`0W)nLe=3*+)Qn=wn#Zl}RTLWrYBS7t*BXRb8CAV$AlTB&V9EE7y=<3LQpw(ludkDyPq7#YnNwYkHCg0%{% zo7d+oQb1RCMvp9D0f;fe9C6`mV<$SwY=M88Ur!d>aGySR4muvc!?ShuIlu=FrrAuS zc@+R&-q*8e;~Yr>VJ0a!fPAJ3KO3j#V~J($Faxw=LPr9>!>WA zmA?zcR%Cugd6(Wt0zde zX4J;vaKNg&jfB`;ONMrzCQVkwfC#wdkBFr@72saZYL0l5-}AHhXV~G#{{!W z$3jwAh!6giIcuaXAn2_0-}XIXO4Wk&nf0Sfw86Nqm?lidqXK<#atT10=ijV)bQM{m zj+XP+Y*O$ zx2(?df*-)(-=dO-yx@m=sNd!?gI|8U=a(Pv`KSNi5BbLX7ku}FM|}OO7jE_UO7&gj z_rLpu-~a9tUfxc8|Hm)+!B4N*AHKXrbgGTt{o$YUyFdJMo;`iUpMLk7{N!8jQ{%6$ z3a$wMm2CO1*z$oC{)yf4AKD$;zhtKB7dQLAXovNe`nWe8z~_910iLI5+B5DhXyb+$ zK+PLI^~FFy!azqG;#|T~A5@ ztplDs=r*@0uZevjv_PGvW8+9>#X?Gn$&6YXrB%An(Zvo0##U$|bm6oKt~7!K`Via# zY;R56D)ye%@$9W7`d^V$Xolg+NE4 zG`O>#Re%;FDJBf)S6k0!oGP2m6|3mVkw)-qq{>DbAv8j$SXdLHFipzP1`Z{%=~l$- zs=mkJ3FD!$zg5QFn(@#mlTybBt>-2r5Jgr-tp_%FO%8#iTZUocGI=Atw1~-y*l%4? z(weK`C6RL`cO4ocgJnp88a-!RR%?nXg3#p^K@!t6(X`B2-GD4jNN>!$&F!2o7Xo^C z!LTc|n*l|rxsq}umq5$7GSpo0s#cL8q#S6?kiG{!5D;`K49`9xje-1h%kz~HUJAvO zG-pCO7N*`QL^!0t6e2MeL_zEV9WtftFnPhGxAX)$$yDpuS>$?`*x#Qjbr3}m}o*ak@49a$720kYu!lQQst8Ju}N~H1pqlngtI8LBK zm#>JIkI~dKDYWr`^ee1Zq-CsCYV$_wFaqmJY)UqPBuoN>`DgVxp;Ms+S8F#MJi>%Q zBUUmsAGk=7u6is{>Jp{@-1M#x7G+PP)9Ix@LjEPsFfHENW@rJC*{Snfi}R^Q{id_ zn^ySYix)iFu0bv+Rhi}t+gch^ZS)dx6}wyc`g2KW)ib{j^K*E1MRlXsS*eVGcF_qn zCZsv57;8jwyCsGY1hNOm}oYDelKjY?5h zjXr+sibw07HjX@L&&Y#f&+lk2?~u}nDU!R4_7SFrm|L0;!$7T-_2nhQG@((r=z9)_ zgOk!iM2nI_N0LY@jZS)`CiaJsHVL^)Wb54O9w^N%YP;N{CP+wZ`t>}A1vVEQ<9J}5 z6Dj($(k)Y0XocI=9p8Ae;k{D$!#$Lk`KT&C`1BWi{NgY8fqav9`pVR-;qG=~UjiZZjOCVAGEz5Kop^c)MQ*tp2M$e1t3;zw zt)i`w6teo9rK`;4q*RQO67}j5-Sp%qSIF%P+VkhMof5S{7Ift}X=l))v0Fzrd!vhy zgp(jF8iYtxLmGGn>dbL7LuV4*LV_q_?$%P>wL`>h=93B=NxV~(Uq0iZBXORQjA4 z?sl}v?WENTNh;I<+pVzahkWDPSG>FqeDb48>I&5k{Bj?-lKvhU(4-wBMa+zpCPEV| zXLP6p3PT^b>mzS#$FSS+_Ub90PKA#?eu-W@Ve|A|!s9LUKBx2QjXN5#@FV)8yZu zyH5M{jfTmoM_>T9#6ZjhWi6-$%py5v#42_FlIif6boDOn>U~z9d`Lg;(JZuOZ(>I6 z+%+TtwLz9hpL(hq)XKI`tb%bj9MIG;mCE5}&om6QWZdS7JVhT@W|;W=Vb%~!tWt)} zB~b=+KluJQ2?ck)N*1Y-QB$%QQQVuo&1;8x+(&}Vu?`ZmtJ;@2<`o9+t7L>_&$WR1 zi?Vn5sp=US?to(WyfBlBBEBcmb7C9{tr8Uy#xy$z9g`+z5}eJ%kp}?yp&sg?9_p`Y z9l_w4m9*r@KGbh^y_y%iD1#sBp&shDqna8&`S~qB`S~q<7x~uLFZu2VkNC95Ob`O8>y9oH3%h!; zV4S82f}qn`wywDK7l2yh?Bji7yEJXi7|!RcacAf^S91-cpS#G>Les*mc0-`Gn%C0 zKqt=}Q*Uw*3$tF@6+?3tEtaUY@nRP#Lj?-jCdOinljnbIyP6ANSGX)cF(^vMU!V3exU<2OY_^4 zphW~?V9|Gn*>ZS1>}O>H19HJ4jWFQpJd7 z1o6gh2#FMf=MJ}q8FZZkuVXn7LtwR9v0~$yeiCU1qm;&r+dZXJ#(kwsN~;l?gCAxQ zP*>AOW`%{)nvr71cDqIw8@t(N8e1~A134w~#iQeW?>XQJ4X&Cl*3fFi=y{u{5yVKd zO=oMb&*85sfy(Z{VXBl-2~`O>kYbwOPxwL$^x*fsi7UhI?(V3QaKRJ05YglP|N3#b zTBXBCXse*jRbU#ZEitu33+p+4#ZW6qY)(qhM&-c%uz>OMZh8Jm)tONf^nLsqe{prqrJA&DI)YQ&LcBPBe*BtBm8oekzor z+=P*_RrbH3l3vt(uRZ%lQ>%}dIotHBH9YZDZ{dzJ?pGA zG@Vqi%kwhAQHArl_qWYp$wHWlk;TO!giN2({5&~V$eg&;%d`Ey?f6MiRu%Fw1Uk^P zQma2hSE~+d%FWF!yQ?kTGr7e(VdNdPb z1+fb1(s@GcD0*NlO3FREVdUfM9ok^t!X~dt7BLbzB|=d;3-g)T{E#)o z8X>?YCSMbol5-#jnbnd@Oa$bdS=8aHb>|Ii6)r9|OrelhLe8#EZKwm9LEVCS8`v{Y zrLo#19(O`ljFl$ZcFn(ddElqdUhor*JXv4yd#f#9iMM>UYjD}~jrS`D6?QH1l|9rd zT(_P-{$=C)9}f%#V!A=f4b$xoZZ7y`X*^0Jt|*!+whtSN`c7Uav#t@Hk+# zAr-o2L`#G&P#y`EGWOz*c6VT^6Jb);spmqWw2Em#CBq!6Apj<{Qr#s6u+UytRpQT2 z5g`SLW^?Xuq^T<+qY60)IYd%)TXU;Q(}pI0CWU>xXD zX1!iB(oSkR_4S))qXsM|u88PZS*4z|UUB`&Gp1U(e00HAE}w80mHl)}w2miNZ}Fjg z!mboL>9O4{yKOrGr04hgypV`tO|wQ7&lq2+ur7(D6Ym`|SI<@q{lq7`19vOo>06gP ze(MSSRqxlKb`C1zAh6GKp8qP*vs(R*Hj)%lbfR3#J=*sKoaj_*b7BY%vdMh!yEXBm zVRZD(9fT^z{fyFk6WiIpFX#PPt^&p>_u19NdR#j%f`sFHFCg)8-deuD6R_pvf{2{O z3VoJ3_p|C;0sN+aKdxEMU6o$>tOcljRrz~VDT@#mb+n%q5HT^|6V2*$3$C=a=%6;@ z&Jx7v*3M}mtyXt2$&nCyVpbA+roB=2PKrz^(RCeTDIDrZ`Sc?mA>_;G#Vk_xBt@{JFJQJ};_%MIicZ~_o6qmG9`G0^e}*k;-{Wgv8GGj-@2i*f{Qu4Flgs7o{#p(<%&&OU_&&NDh({rb z*i3R{R)5PeLc?PMI64%7ATc}uzz_9M5A{%g?Q3DVJ>&)dcGbLai*w`qAusr$9_qKR z#;NhAKYGcZ{^%uF7aiaI)+4_2%`2`hUI(Z|;Ok$#;Ok$#VEX%C;YWXd!}ovul8>Jq zzVzpHQ{iv@=}-7ufBF+XeD5v(^mjkt&%gHG(K_{4sRM!kQZD%~<&xiLs7$TV#2^|K2g}Q9?KXZ**@%$MbKP>tq!?&=a4-|FdAv%1 zRtrs)7dKmOZyT)*S#8b~w9>BHWe5h*0JO@u>X>4b(Xh|S+&gVqHf zA7-rk6&I^5hwI{&paSdQP0l3~8v+DxAo-R3{G4%(bHLWe@O@#BU8u7I4Ju;8HdV#=k~c(!89O}AS6PHhy}Vhl5@hW5@R6c=*OXjoLzmC zOpxeSjDC+ez@0X0+T$y~Ppf*fQ@|uLsWDa~hDZ*HC_=LdbRt_LN~36dt-1PYmED1I zn3$T-DEqZ=e$fntHSZkrR##%boX+=lC%0QV8OeJ6~Fiy%rE7}=@3~V=$ zHp0_Qq%czC1^xC3x6-()5%LB?WU2*gt~`oOU7;cYjo=Mb2b`0*}%Z8g>A*A{9LU84^71kNHIg=wi*<`m^o+i3lN#j7;4Y1$SZth5> zJ3f~~N=S;dumAuGrIKQ#O@$~zcB=`}JkE98kwvI;L!F?rmAc13^j)Boc6?4R8IuwM z&5R}x`ouVnRBf!f*;UeBM)0##)eWLn(zxC$cH)8kovN*2=0F z-+r{_(_1)L;A?NM_WI;ZR#|ru=>p}jV;p+=(9tIcx!o>35W6iG z{fd%TwDq3d^-IR#z_w0oq=T5SapHNHE%}inNo>i04I!XWj@j|m4gZWqw zBow6xr0ipEO|JD=IZpZNa1&7w?)L7>g^74lEi-~yXDF!zyW--lE!#&c=wXmbmVkM_3n6(% ztv^G3{%;cIY*u$==#r88#IV{>x)rSkO7%DZ!+b3u9tY=BkKe!5d~R4QH_YrvEP2y> zb-prP=FK;Ou;&1ASms&PliN-@?ZA%f?|F<>^xk+n(qw{L1pg}J$XCg>udUq|Vi#{- zZ@l{Nug?3g&hv?xTm~@jNpvO&T69}r2RdgEei`3$ZnZ?uyeAkMoS_(VAcllmKp1@w z)C`kM&KF4TXkBGeS8JM1v@#GvBz7wVcZiTTW%TmOcXoFDod9CTU*YWXEFiDg{5{U! z)2l%H0zxjJW2;VJ3iC5y0Y_opYkh%BSZj?CeO_wj1k=>@q<-bZuhoi{Gp#zQ$s{_k zsUG$CHM zyBzqNzw?;C`8$ufzMc5fAHC!UKe^^GetC=NuYB~3uYB~3{d&dszw-^g|J`q}U$1_x zbNJWv{A+oK|Ghlre{OgD6T9K7eEDPgH(j5Z%OiFEKeuf4*C<9sts&|PkKm}ItE0@B z{Q*c__U7^o%o@xnud6MrF3k#YFc}=+txF>tV)F03Ou{r7+FU6lWKws^R9epCTnVwL zra}lV$XhB1A^~Rg7TQoN_QV?>^w620GG$pD7)wKY0u$i$HhC@8=`ua;bm@p#*)4E1=m+* zg|la@MQR94O}Q-F;wmX=#N3fWWEu;@ zFkmKxIWt!qq%5u!ZPTna4{mQ6T;UPeP)1i(PvgX}H};20nf&%~i@oUMJq1F_v(nx@ zV@)e&jcJ-ttMvT^BEn%mP)ea>S5Ie?8E6JIok3+~R3GE5DXq6&`)(fMIPD zTK4F4Ak6u|DM6FZZuE)>sToo{FFcu?tnSQcwup+(6%(&0e#9;J91x7G*K78*P!0o9 zlrDC!y?*&!&8S*vM6g6@#(p?3S*6AvOPR?M4Rh7HDxC;j3PdUirN{xbHME{)N~s4d z8X;z)Y)DbDaLO{&S}`kVaLeB|DJ9GeI?>~P?KB@ZGzT<$vV%6!iX0o#Q4FFJ zFczT6%BgATip6sP>GS8t1t?ZMSt*79DFNh_Qsi>AVv~ey zjms=-k{~+K4Gn6g?Dxnp!v26A26BUomIzs}6lelfnp;!`0adg#x=kb{C%>fF(bU!H zIcKm&%n8ZKpH0n>6sfJ!1kz^1I38#bx0`K^p%uD*O-hNwI5?0ije$xNW3Wo8g)%j^ zIdWaxA~{rZ;!A6E>HxvmK=uhEb6Wy;hdmNUCu%gM?QUp!;u7P@W#XHU?s)uY&qhWP zLfwyiGzl>_&$u2YuAA{}|B`l>d4JXMw`1kvQKCIrbN$}$a5r@924m7nUK^>6)SWtc zXPvlM2i{q4DHW#cYsR1ag7D}O@$qA%U(vekS>8>M7GS$(v)+&{*4%vj33_ut3{r>$ z3ly^%U~%G~13W&lHd9)?uWCOBXBQx?ph)VFzIQOTRu~I)QjaO=dh#X`ED<%hLqssb ztY|zZ=gBM2gU+0YLkPs2=-UNpwdU^TmT{c?UX|b=kLn48M3D$1i7CP%38`Ci@jD+N z+Y4?!{gml$#~&Pow^tpp4zyvU>?b}hBc#A;v*N{zVJ3^Y%Grq-;tFXIy3i17B#R_5 zu0lkEF}6x+f%SAjjft;!mBZzV%T5u!r5vi?3)6r~al%_%kwgj7+?gc?bjgdgN+hsK zLKk~l>eyQ%nlgc_`e#=h&q1FFjA2=ThS?&X8Gz*oNPf{A`B@5JpWo!(G%M<#>j=3X zvzVCyB%8;Uh>#^>GqKMWz&FUfXYiWjd>M+JY6H=NsY4$JrQ>c5=>mP_o(0_?Z8WPAf>K=`X` zuSIQZwP0F3V&bSsUNV5cxbLX5+XEpG@O5jpPKAN)EKqwPsD3qq;)DtC9bvR~@zd9$qN(i`jJ>M{f?h(*<{k`N2L|(?HNO8(J=8-z)W4&3 zo)_#H1o6Ql`nRFvAusr$9_qKfKKx|Qho9{Er~m9jzV-Dh{>HZ+@zr;?Z|n;^y6pIe zfA}tc^zXgHPygbU@BQc{zxZhPr9W$P82H0K{yu-_U;ThT|N49U>36@$FTe8kuXX&_ zMEZ5r4>_q|Wid%@$oAJY;Fij5lcFEPO#OVkY zE>>wGpiNO4!A_Z8%ck(i{+E*#^y^IMrLlf$Cbrf*t11LiN@!}xS;OXZUanRo#QX0x zH-DBUd=m)ae2W@b?5so-5p^(Qwi}#He%&=T1mgVrdBbQ?iyhh9LJ+CUDTDL6c({*(#6K6n+XEdDEor$4I7Q95t&U|RT?S*HJw4GNG1_g zsny&*GD0ot&9WH`>xzTa5kwugizL>#o)|}NJT(zWP zObrf`F$^$WH<%(eIDuoz%`KlzXc7or@8Af9P1q7*q6|hU6_uVuLM>6s$T&D4m6{Nv z+aMD5s0P3lZz=Ye3DYz&O?!0OGL4PHP${KSCZkkl+waa@0Twku5D1D&oh^$EE1r`! zjswU1uzB2;Qpu7*&2wXe69`NVqtQyC4z5g+20<4ULjZ~N!7bvn3|Jcw9S|F!RYC}K zDRVe$Aj&IEK{F!-pWC|F5zDOF4>KSbBK8>y?&ZE)00vcMw1SAR?pI7!Fq@9{@yDN$ zQ{!1;U@ANIBZLgagc<_HlwuRDK_ktUqXJ}_1(F7$_?)}#_S7cmw4!LBPg_Dx#O{(H zYjQ4Vn;U`VmYA&$jMJV{Mxr$*zR2vP5EPAW7plNkpoC0X_aG~5-7!6TPX9deZKeeh!r5e`uaeI~DZl7U!7)F?0S7=}in>>Z?&KyW!{M6U z{+8WtN9cOiS-4s?)-+_?dEWDWV1Kt`d|rqMtrP;D2a6hX3F#9P6QOej?^r8l=I5-2 zwL@ya(&0;cEzJu z>BoVa8>OW+(v&(@4qUMoC23{U3qHDo4{rwgweUaq))O8den{GP^p}@>^BYfLwc?Z8 zJwuCZuij#`JJJ|Pv8Uufh>fiTo;|y!-G0LK$xGU9V7S}UKY7gh(G}9KD5WtpC0L;A zv)he}VC`dueIo^-b(yZ)vg#5tHOAeZG7ZGwO7p1}@_O~!`s(Zk@^w>#wpp=y{D_ny zu@vNXPknhyZ363#{Af#vJ;?$9_&^80mK;Dz4F|{0=Id8gn!)gFSW~|ra>vEvClC_1 z*VhQubH5RP?$C(1QaZGel&)yO7+OJ9Sg%&R{q{TLYCQk+8N9sX^2wSR}1e|<8BxkUOeM26wH*I z62mY-HsWeU*FQ$uh_6IlDZLPW%-lvhbdhM;$A2mG;zYz3=h-m;cu}o1OD#%R&xqNSwoEgn6uc zgpGfaa=Fp|L0YVPFjxQ z*4YhXs){y`wqahEzxw?z->MKXQ&jvr2q_W;%3;rok3OQk_lO)j?(TNHc>auWcT3d? z6~k@UUmtJFdA<7kJ%HCZ-dFO$wpfBz@f9ELBa zz!fvT`R5<<%|HK;o69YK_T6vt!{7NjWB2-Jec3YLzm+xrEo;6eh5yuU_+Qu^>%VFV z=C4ra4dM_Irjb^I1Hk5Hy8izGt&KK}Ow&ZnGYBhl)|R>QEaID0ZF*#k-*0*cm~-@0 znQa1E zjK!T?j5#$CRO{=Y_568i3Ui+8l8vbv+yYfI7Jv2e{NGn~InpGe)i@kr7#i9FZ5$Z( z2jtGxq#;IVv!!+jGYGCEg`7KLT7klJXq2f^s;fSWb|e~ItaL#=qA>-eOIQqa8ER9{ zugv24tzBTcohY}X_YQ*~sV8*-)x*NhIoura~PI4WKd1 znb3)52e%Xs(HpfInHtpWjh8M&Od_%Cu;%JABau=dN>7Lh(*W8rRbd49DK?dLiUW{sxu*EZfGqkm<8 z%brvlK{KhlqPw^xcN@2O%x)>Fssv;v;|$o%3x?q({V^Gm83+bSJ2wBKK@uo-!_X^v z8<2fq+}*MJxuI`E>^nAnMsuJxS2_lS6avwNX!Go9vxR94#FUvNVlffBOx*{xxjJyO z>gd)hHg#fUH^h`V+#NX7M!{86okaT7fsU92Cd=$JA=;6M1kFH)4L4kb$WDzL;)uli22yb8cAoi)C&mli;q4Aop|T%N31s)q<}31GbK=Ybk&14e);D=<2&zN z@Xpf}Z$Djgx2h@|n>dWWt z6?L{McQss`ue$^4haw!NQv)9avw*4t!e&OZJ>hUeFwX)P8o`u{5LtzUT|PxS5Y0?4 zdv;uLkVcU^2CnH;DB^(Jp2SaXD!+X3g7=^9`QRO4{ng0xPbYr<d+^5YBo^&{4~N2Wqmx8)}ai?4F*SI6;u4*o9dq1r}YgXT=wYzbW^ zOe0~cjM4WM5(9J{L?_6QW>*g5sMwX|J(vE&?21sdp&`)JsHz@YkbC-dW4|9rr4ez$ zpjbhw(kG*fg;m?JYMDr3l>)ID>*>Iwn0a@5$tQOQmPa({tv0eOav|s-s~^;j$?$C|y%>2;7B<(4dyWxKnnau#X=9(B(`J2e*=V#&?{7 zq0{5foqI5$A!JEp37)Ck3K}wI^L&DVRx-Zs>qEkVt8AONP4P0%i#f2v5`VBfKNleK zY%cS=^#0$^$AsT6r}=cr17=YJhtu_wQ(nF)U0e_ZHYN2TQFfMK7d z!hCgJzNZq_dhh3#&slyM;Ydcf_wTkq>7GGj0;Xqxo*A+PMK4#+0>lM?oSB`r}MIteezLF z{#oPfNW^-*e}3;C`Vv(2&r$;WIGo2O3!!bkUJFov4$?38VL092i}IINUHxk(#l9i; z?z>mPU*Q1&eyE3fsE7KEDzgWR=-bqP1 z#%vKC#WoZ;>_|Gj<&_;jS7)jk)*!aZ%vQ(&pBth&J}Xg zG%_5<<9mxJNWo(l)pLl?Ho%xUlY0KVMS*su$!$o3n_b3L=v7Gn-oh%%ifSmD_BXQ z+XN21a`$|o0fC0Z4H6ScBOpjK#_H-CVsh1KbD%7UYxgEI>e#ToB6~&FM%rFbI`|8o zvu>GH6f6W1bC&OH>L|f5J|Cp-G%|@%1xA5sYK(_K+X=BmR?<9^H}pu1bF78~Mkz!l zb+9zfd7Vv#W&tHR5E2S1Lde3Z>uJpx4kH>GEd+Xb!Z=Orca_8bz%)9E!-*n^smvMQ zArs=P0t`!|dQsCbH+ekQRhu^w#SD!JkwDHXR1X~XZbNMiXaj^jmD1gA!1lSRoNj<(DaXB%Yw z;`U*v{#~b80kS}gBCasH*RT|5XN_Q2p7iW)jpw_H^@08(vf3mh8ktNemD-Hz=r{yd z=QeRQth9+7m5>xEMwyIQ60tLy3^ZL4gR8w%{WC*a6T6ADs?`1dXrs9Rh|4j@5SRdJ zgZ++L8Zl+MCo9_B$g}Gk(%s1V(IuO=-y&@t%vr3n1HyV%$cU3^iBc=}^pYx>yRlM3hlR}T%?;yzVoFMoLYrmPAq7G(f+|pmL6}IG8PSwp zlxE6khRTZ8ZHQ8w#3SN>hZ>ZIR(Bfk{JPVxr7;^hHLyPqG|;(mAA$qFUDpw!KWUcC z`$YkKZY}y+qx%dbxZey8b4IGrb)CC0q~+M!@#m39r7@Mt^XqF;4qU8OI3lxHVa~Sh zb1v%Xa|2bBpi2(oVn^-vjEN;&K&qyr-?uOgRj$faQEVx@Bi6P z8Qy=wlXoA}Z=YiIKqta94BXugl)FNdMC1bNFSuS;g25O@w0ib%Ek*?>@DiF2|t-~Z^8L9{x6r!L(+`+(%qM4~eZFzP{5XMPqts>%T zrfMg3md`D(tOs~KgVM}xbXAp>12VZjCEYf@(rZLQN|+ zR*)DOhQhv8!dMAY!Vc<-G{-utd_{p>k^_Wfr(`Y7_wdmR>D^63u~ zb%LUa{WQYO4cpNesxSut7gJ*7%VX~ow!&F4c=qYDwu z9kyO!ovYAo)kB#ar^<;;MniYDzI%npXGX3Q)4UEt;xXeFaEs>#aj{G`2o^B)=P|9J zaw3ho>d`WQTz&09>R%^0WWSS65v*oFiM%qjsV_rL!6lf`k zCqPVz&WzpyT@aqnq)-!g_EYgKOEh2OAC;1?0KlKu>pKTgMdi$SNM^tqL>GH~CE#|} z3yyd`SE5TM>M4rM!KyItAMVey$NBXQ;O2QY?~&B;%9?+12s-}TYw<4Jdu`MEpRxS; zwAZK(W*W5lSj8YTLmF7~z0-+?*X)=lwVptKhB4r^91$Wlz z*5pS|SY18F;$uR9bywzNp7)4`M+n`U*Y1PdW_D!79{+x}$6G+f6Y6=gf>u4bO`Z0a zCyU|ZS}w?uj3qO;FUcv(Rhzp2d`>lU!cGY0*Ea>aRgdJJCJ?7-27#RbQLP~%IuI&K zn=`Q&g{^2sYQz-ESb6cwLRsGt4Z<|h8HlzcuzCbl&qylg*K=9Bos%Z+jn`NIF8BYw zI6$2fEROe<$Z^!Xx`z2|VEN7Q7w2l^W!>w2{$+39z?@iXzHH(|in8;^=F#@u%pL&X zhkB@odZ^#jI$A_852XbReyHEkU->*`i$65#6qRI)lvlZxxIUFQG z@QhAXxAT*^0TknGuN>n&i)OKtQsdkX*&7@u^%8h#>}aXV8u&Ci&naa8B#kN_rg6LD5POH-sOL}$;tuG903 zj;!ptaelrFccrf^I6G={ZYgqNMlUK;HKN&TAi_OnJ?hSGwkVxtR&xtY!{TuGx#Qyt zUhxJ0|M?Xntn->ljd-mb#(_p-m3nf#;I6qUB+jpmGRHzRrPjtMBi0fc8btx=S#P#n ztRK^NTW$^Z78uJ!tDa@&$Xp}D3>u*iq;+B_1N-rSpn zYH6s|SsCXl5pV1`*bbgM91%apoUqnNs>p7ln88JWCu>GV#up<|139{aTmVD~qW8z^ zXH=9#urk~H!lX(m4VxmlCRW>ymp6Nc@eYaE)rh97CD8?8n1oIeAqdSoot^_6Cn`eU zso&!b@+y&uG#rRCDLnhsn8wC9C}k2?maD6FRh7^mhcb&-+mZy@)U$Y*?|Z9@)f+(Y z3`opDx!H2sZ*wEYgqe_XhINPZk&+$sH3e-(BY^11{!k(kfds9=*cz)clCly)1qukn z1)m0SE~h%IlkZxr=!JtYxkR%bDjTr)%A!ToY2VJ7#3G0xqT(aJjdl{)qEZ` zGpr`=_9M^6ktxIKka+Sq@%Tbmr`}b`7>!DZiI5DeqE-krLXGsRj?0u8nlKh)m&C<2aI^K4$&slGS?S;D0qHnp?N$h?syhGzJRFz73H2po-LykQ@l8DvZ|AV$X_O zw{46Ot${ifTCKD?K~qA`N0kfn_uEVfM{-r=d=CB0Ms4&gjdxR z&(C?YiUD8!`q%iyFMq-(&p+YfBJkw#hQ9B~2~retyk+N4C9YRDZ2Ju|IoKy=XmbmAh*;XvYIW=Il$fM4 zX@eB7b%0`+7}`LK5yJ`ylzp4W+O40jp0rY}`g$aU1Fbc3cFWT;O_Zj@;F-3iRJW}c zp*0^{PGStFtVPBn$bTZ&1q7k0(d?1{q*;Yo!$ezwT&;+ko}|WwbR-*TdZ4xgMLSlk z3HF2>ZpnE=v&6OrzP-*o*zv9I?&HNmr$!!-4wCkC|Q^DBpaalrpK0Pzs{3 zkwj;K+rvnE%QNjm1dCw?*d1&Sxq}*yiu;9NvCO+*^aKilP9j+XRSju2t3U%;g^oZA z35h+ZU}260Q6u!}IIhou<)a03bSrLG><|J$0;13dVG|)}p|B^Q zv_a|Aqb}G@9QFriQ%r$;xpJ3->3}=UHVT!zjeHWHI%pLmEkMPe9g;mqwDSZPY!f{a zVS;wIN5)2+Ikld+K8ngr7~5cipO@G#je|DIZL{*})5La)xxW=4wlV`P^1I9{u8c5QfltgVd;qcvaO#F*&gijsOCv9;2QvI z0#?3wusQKBI0>v)QjGN78tpPw#T{O>%}Vm+DD?Q*^VaSNT#JZ10)>bXDEo=K+fPXr z=yE2SF^wbICUO^P^Lj9x9qReDxqqErxt?}Eg5pirYWcV0)fbN7udfa6=Wn0?`LpVr zz!BjHP$MUBc)4HQ;Yx`*I|AUuz-D%I_FBg7Lc%<+2LSk?9_pbU>NmY+5O8VO%FIUp zyyneA{f3l0#0|9kK7_x|8* z{`{ABeD6mu`HK(lzVvkQm5-nCm5-lscd_Anzxx3{_|7+&@~^(tFyNocmVe5YZ!__q z+Drbi-O_)CMblsI%|9REv(EvUM1;aiLU@-l&N*Mn`%*$c;zScAm@@4KQoh1+q?(bE z5ay+p%Zw|_A_iPcW69`&sSO~gTnnj?mU5M7*Y_c!1n91&@UtpZ3hBntk+E+o#{4BYYuQnR)H@%`? zHw)fyk%~&gXsmlzS?EDX`^3d`=^*t~v1kyogYx3Qe8b0+cc>b9025dQray|@7%teiiAqp9SA0LY#23CMUhxoKe;34o<}V+ee{Ci z(>+~WBYjUP5EWV}#BAg|TS8K>v?lhMDiy0rDH%De2)$cUTf3&0k@2dhw}e!XqO=&1 zoKYIBRN|baxqPoaMoxbpo1j^UX=2?*wlSmq1s~rDAKo13dUzaHY^3tZejtVoPx2Ky z6b@F{j7DB1rgp=+&x~WHrVFwdPxHhf2qu9LJH|t#?4gbq47)+0EiM1nT%h6B=P`o|lrR;FQeyEiqWR47W@8@)wR-!UOf3DT1- z!|IVYaF>V>^Ls^;u~#Kwv{KO&VAFYHZfc});_aa$rUGJ^7FwvT{7MPSLg)m>$YM)* z%4eSK-$iIdvcXjM)KEz=69+{)fnI3Mi6O@yZhBM-8*nEhmpM~3(#Jrb2G5sO!8Fjs z$Ara%l?oP!;@10F0$DO56H%aRAlJ(7X2LFd%9AVN<6ACQjqNm1b!3t)qpYD;a%hy$ zkOIAqJc*TDckHGE)BZiIe~)B$v^s(mQZPaau6zucxO$852=cfm4+lb>+fwsjd+*UMFS(|%l|-B8x7cRlMjr{6 zYvkQWtbX!yG(}cdTWT##yB(Vp**sbE)(7u1e0a(3lO1_%(l^GD$~M$SDH@Ic>KTX1^L7W9YgVfj$>j75 zGC|9%GG7Jc2sA|MqW+agL+GpW&98r(+v^+d_L(3nB)I*#h_LF{9A3Pjy!ePZykx9_ zk3Uqd_Y;*5$u}SH)?06RUU#|VZmjdOR4HW#b^Ke>q};~ zKVxHb#iOf(+wsq;>Vy?u0iA5I0rv)Z8x4_qjE!j4d`*$;2oC1%G^d;CY`Gh#F}a(B`cuC8_LfZ*ZvK4F)K(1FBR4MxhDq5ZS9KpY z&|>vG=eDCs#<~r*x}+r~PK8zq*Uvv>Gu#m0ej9n~2@{pj!w?Imi7Z#FO9$DgDNtjj z>BvP|lhcaZsnE?9>{Io1T}o-bPkmiBNN~k!6?d}9iIy_aBB@0V-9W?FY9&J`Myw-5 zrLG#Gu8z+)6vU#B=i-hPV>pmW#O7)>f-o{s%0!G%yEQdJwgc-BnWn(=eZjg5Hg7*6 z>|bI*(uw-@YN@6HIZ(5HSLf3wq#1VWtG zkHO<7EC>l?$_`7wl&g)(= z2lNHh0>PS-5JhG(Yn)%^U~UZYq{KX5*Pj-~NBdhdqs4G?@0mf}wvdI)m<%Tl1h?R} zneZ7FyM8;ZzfVA&_m_ zB19p?j%X37jWiX8SUt}dq18RHRALOo!w824y?-}31$TJCsM;9HM2wNiDz2*c{f*4m zt)1IiM^{_xd`-f_15iVg5f=MtbJvZr4A|skyog5;s3;PGlXjc$2cxPJ$QpN$2<+GLV4HHt2qR=12<@zuXHs`Pe*>dt@|d_lO&U1OJP*UzdApCPInn z?95u_pzY}g3)9dB={r~_!)I&YgL;V(&Gvli>j_0i4FS3n! zsNalw$P0d`hx+ZV4?o%S;U|0k>wo?czx%C6{N8t-@c6QO?R6mtAAIeS559KE&E3TJ ze)y6<`|(T0>5Ggzy)N$d{Lw%E6aMbM{4;*|?XUAEzxOR}F1NqdvHw^){x|Y2|7YIf ze`VMFCw9%{zr~zjkvL~;o|x0j07h$V21ew}foabD5rKG803DSXuT<_jR0FLlQ*Ca$ zl@k3b({&w7cI}Dz{$^F`iSc~0AU$WxFSe7+8AL~AK&eNt^}OP&UQ#)J05V%9djlJC z5UkF5yR)^fXCEsT{Wx+;Zo4>VM2g%${!_l+{l6crw$7S6uc`-@*JJnXzs>G4chFUTx?=#4~7KS)1%{gxls0Oz*ixF$W z^@{_aeo`0?0g(=o;PGs#gjqW+h#$*5uG}t7khECzB}7&bdW?XY(zH;jkz&tgeM!Gc zgxDx$%T#Vr^QLjg4GG>bR`c;*>z=9&i+9Aa(C0Oq^#xpZw81EQx1Vk`pv-w+T_Obs zHi{Yt9q4l+$3&72i9#DD!i$MjN?dI_9>>bMRXUxUlIENO#cjm{i6u2tWNGg$<42L$ zXj*7vqmLb%v}Fj1UMkxJc59T-NL|N8?iic!{BTFLJvqTXU4agSP*{bDjz%B6i9Ciz z*>9+0rIv|loEY~;E#6G8Rb8ES_Wg$=roPYcJ8kzTJHTmzxYk= z{O3vu!HJJ~mFc5V5u_=tOxzvzj3|#og3F$?O_al)GThSWU6E)85;;r*THL<0%ZaHq zrs?3MoM@m*1-F~0B2j$K$jbKe37S{baEDFW2tuqIg@7)R#$qPR?65jPIm~E zZu1tK3&rkk*ggB0n@?|udBZxcc(U%9ire-Q7Z(S2F-WoF>65pyn;p+@u6f#ZJi55# zP#Z6Ix7c&#gWvgp%fI_|KKbwk&wufp!~dVXKlzn!yY4)(&sux$b0Xq4zvjJ1kyKAg zBqe4_RhiBLTt-d|lmVlL1=uwy!-ipa=ve`V{|EmMo_Jt*V2`Q*8-|fUCCX(hQ>lic zC@LkT8j5`H{hE7kM4WSWvpiV)M8v)Ck(5%2f|9(O`0@99w~07$&TiMYI~>XH?`T2D z8SV}fM9We}i`!Bx7`0*RAw>!7t?c|||kiv*n>%ump zwX>!5`aI_4*p>HZ(o%gg@InZu-%Ba^eAAsx;zmESW?%M&%dcPV;#%)td0tR_X}erU zh3+7r;v_fRF1pl)H6g};AmqIGTvEMHnR#aM+c$gOzPrP%_*bGbu`(|5u6KFgOWK6SFiH3>zY|RS1=| z+YnMBPnj|YqzK6hL+=wdC?zIJFdp^?_HW)0S|tq1b?d~l7(7~`RkRAB8Cw!T1_xWG zjFpV&6$28LOSRNTFyZHs6Qj zzOJmQv$d6_x<5&A!qy7@TPsK@#4s>uASq-jU~UJkLaCK`_Zle;B@i|PH3T$7+Hs+5 zj=;ldz8Qvr-EN24mMy{K87>G2;bOe2YIhzmOj?hY(2MO{!%W#!VZM9d@cqhu-!0BD zmgKGtM;S?1TT&Q(T#KMVXjZW5GnpDE3vFq3cKk4qjmKDq_utpqV@T^!xAR%svnH@vU^yZ6^-7Gxn-t?Dw!=!|Cg% zxq%*O0i`u!f33^20T(~tnmY;zPC#-?|K<)1-9p}20XBCrF)LV;{_nMpx)2QCKX>cv zVhx*TN~|n-A*Kzgqi3pXWRntR-mlj+6#Vn8*WB6~6>zpQzI;BX&$ND>$4$gRz_#9( zwcgi1n|r@pDEOaj9l4P zgeFQusUB+Wdjc9kF6R5E*VeBiDvW9H=T@>upQ!iAH7Z1&{Ql|u7nGI@)-$lzvovNW z<+wEmq*c!Q_s3*jUssy{6S>%@G`Tn)UaWQNfA^dG=(;Yi51`dm#omcoo!DzFBi4F< zmq)*EdST;#xwle5FBQqp0Pu5rZqMzx{q(k{7SX;jd$x%FiEr|35&hhr+fQ?wm&)&b z=MBI29ajZ^cl?q!_rCby-|5=l6Zk*LYyL0tlK<51_|NP;AMiJ`tNwS{+;-I{ z<_9kk#i|#&nw_f^CvcITvj)!G?n~`jYqpOO#TEzvQuIkZl z2l(`LU{yx;Y^)AW!)Fhjmxb2Q^fO-*5!Q2VBb*M?>tVZ^L4XhisS{Qz1!&UxJvnD2 zJ$+wQc?4Lk#pxf`)*{KJG2Q7}&9F5W$-i;>85KR<2d{4k&D>r$4GB?UJ{~yem)YJ- z#Nks+XIiTyu8ERpR`_u#rcbT6pB5sTh-c8&dMbEG6M~Ke3*;$q_vxqHzny4#OI*QS zbH!Se+Hngnp2%vCE9wQes8j-t5s@7x8wyHg!K@HMBF4xtj-(jSAjFs$hZ|~}F&hZ6 z5|Z0-S`+3nvp>9JSsIIZMx?b!tpQZM_#QL0WugpjNjX4MsM0-qlM+l=f)Pas>R?N4 z3pO`&*>b%b+2uVWN|IHF;Lj@bY-|?J4Ygun}4z4UG>z+VXaP zU~Y|EEB2s-IZ(wjl2dJ18Chf^Y)4`iWM8mFm_&G!GsEEp%PiDtlxi$Xp*BIp3)L!4 zrU)S*-8#8cx5+NGB3W3fK^*)&Qi35Nzkni$%E|Vw_TSh3JoN&2vQr)HN0U~UGJF1NP-2LL1}!Sp z3b_{UzYmE>y4rB{La=vt*#1CfV3tUXLNPDwC5epc#a+pJsujxS#y?ey4*HopKD1Pw zoKh8fW;AhwY&N8;E9$CToO^D(`kYE@u6oUdnvYmW%q62$*lez_QrQ3C9j(FZFMg4% z!TWisr_5V$a>TgXVZZogroZ?eZKM_;<3MB$U~ zz2WYYx7bq9&4|RpVc%S#odPWmnEBdeqMk*3p=Pm*=WgZ}gz?Gq2?&I6QuZVQS&XN} zPr;Spw*Fh>ROnoR=N0hSZIqkc$Zj(bqeluzYtX#7O9yjRwVTpkt~(uoL^12C)#gWF zRV5Hlh2axW*&0>~)fyqi?rPykU7_l6=4)}^sXT%QV;hEA zV{S7sCS)5ZB$isJt#RKL-ju`=0$1Y|<#t1xAlFZ+`9La}WXAoR`Q-f`3GWz3x7%(@ zW*Y)8uWv|lCRaQqNP%Zt0%%&FOE|Cfa#k~~An%%Uy*5_?d$#ThR9up}PV0AnK8?qH zsFZTD*nn5c>4*e$~cZ4Na*uR zC*&QEdxqMxOgEVi-zN4iZ+QK|D~1;@*?eUDO!xxRcw{~*O@zHIRLLwYQ)56jJ3>s9 zwt&qHn}80H8Wkg9%K}Rwi5K}xQqP+mMmBNam>b8pcZ5M0=9x{cn2i*&1C4V<^8!;w zvMc>+1Ihx@$%dWiU3k3LY+4vBp^H)Hg%*XH7v^aultN|XFwH#F${Y?v6Owt3bEc4L zIgvkHspe4}(z7$vMxuB|rPYEq2U;ZHe+-hk>eA|2r5u8ToFQ%rQixPUGtn}^2BbBv z`?D{lP)cxXee?WOA4CoUUhXqh9GqImpwGSz4m%p-D#^7C#n?X_Ifet%lAsEOOiiFM zGLIjU+75ChA1BI^JE2kt0VF$JCiLqH)?dE4da%|^GpME%0?nLwv{Xd;gT?ZcRwI2akJQ?$k=Yw^ut}tygd`}^6THjj3x+_n` z*X0vI3;cdxyjP{sObFerXZ7aw_vmoz#o8|Yd7be#yZF9G#;p5#;{sQ+N`68-`8*P) zNF<7)(e0dDCn~H;%chEiie6+1S3Gvc$Izusbj8Gh@6s|&BU&5F(g>Rk!__tQcpzTw z7_Y8rNl$Z{c0%V0$d{gLe_4rrs+vB{*Ud1!AQtr7mXoTGyOtvtF0eXV0mso0Zl%~BKmXG zXwU7rJ-46CwyJ{1A@H?de!0?| zQBBPF+3$VK&wlS?-n_cy_kZmx{OK=z>F<;id_?)b%1i!l@`C@w?)jhDJARh@Z~c0I z>t=qqJ!QzYu3k}b+so>zu2NcGTis4_1tr5p#_!W67YD|*Xct0c*bWRsbi3fDr)*$V zh)Ex*fG<@xr`No^{3q{wStL?b7)}WGIXVDn(({q}9zi>qsG1kY{XndwaUg3Zbk#|_ zAe)_vxE;8-1gcKgqWZW9@w6y$!P;Iw&tm}iZ2i36M-f4~UzWt+tZ{KBb!{1~c=nh@ zmgSbXe2fl;rh*pFIu?Vd?Z;9Mew+n#lL}&-)T>P#IBbxo!n-%h{$8*;5Mw&2sJ++_ z&%ho=vx-UZzPDOsk4nptW;;x;sEkPKMY$B%3|+A$uHs1&iE%_EKu$E-5<(?tL9}*Y zE+QOgHFTw1q*-8Iycm4F*|5<_IV#KnVx&f6u9>A|M2(bS43T4`TN0WRBXq#FmAx3t zGIK2n8wP3&tu0Z}80TPKIne=sjHl zbqVa8)kgk3Yj*nm(-^VGucM!{ytIp{>~T?def>_daY)&VbwP>2bCAs%`62Ry@9$wd z^0Qyu^76JI%Y$3xrpQzZn>4xwZLUxoJ8h^<%*&A(Ku3a%B%zFd*VFtYTPmo18*Phc=+TkV;tFh@rwZD z=3~=snO8NHV7J%&%$L8+-JgArHdL-&y?)bcLIp3aCzOxo~Fa0Ipm8KR#=S$mw}| z-_x!@daM#vRfaLK+YH=nHw-cKxe!*B`P$Dz2t+-vA7bYmdqI&7`qb*6wtF0L&FHCu% znNS)uaV2RRuGqdxydm&j12*i)A11O1e&nR5;+EsN9MEJ0G19S;3s?v! z6)X4LQ;9mFw_8RUq4C;RQ$kGKjgbd!9JP?m?e?3vi%qr0 z5N=Nj?bgA+_4xrtKF-Q6A1WBnfwLM+kGRDMmn7I4&E%P)HLmOkK*hd1G3@4dd41H{64{~JV|K-ky0YNg-*;nDnYe%}sMH@n!q)91(YoVCJ? zPuu0|eO_C?SC@>$=x3QysnbF&x$p0BwKbdoZ|he6m;;|`4sx$VUXQkEXo?KO23aPC zG%#$h8LwZ_;y_bzrwpsUUi7}Em3 zD#?V>_ek~0-f11fYisy%!pEh!+X#Lh4ACu^ODR}w3~58KM#;zS{^EdmLm(!?uth_1 zHLx`#4d^h!5_%r9N2&k_srU6CULR=l?5F+U<4L>Yj%oxI+LC=-t2psOy>B*i#|X8G zcH*>{E7aG$DkiiG0>gaI3@k8T}k7F;oYxxV&adh~bT@%jJh-)rVKhJ(Mg zbnrKKkl*)4h(PeqjLPX8sI~H#EP2iZhGziyxjnb%_S~M^MKd#MKLoE?8qccWpN@92 zhz{Y|BKo;Kx1X{$FO}c@!#DiyAHLyBU)b@Dued5$KSve(#gBG;@uMC4L*`rGeapB1 z_#I3Bn-ND|zrEw1{`24FAN{L8In-?rw;J|uXC6K+8mdyefi6<5I&Pv=qfEL1ovq}HO>Q-!FZ zr^2fV#33*YgWFfN3gSiUwfGuBFJN{~_hoU{|9%Xhp5E`GsInG<%#4~IzsBkkvA)J2 zzCY0D0I)RAi}T{SVojl{AJEssbN~IEGa>fke7Ax&I~R?>8PKg4emmcsW{xz33qtkz zd7M=Xm*2Vsi_PD}3sd9J-_P^SN~!1qs)-mzY95*9Ko}C6?G{y`<-%e!kqWx~k^ST8 zGrfEkeqF8GrKYZ?P*gTdOXls{_q_T3HOHfXjz~z|R?kifo1EQV&(uyVd!;J^#FaSK zBG?Aekz%+qCMts_f;OU_`$ULBh(cYAX_=Wb45Kk@j2I!M$aT6V#lmhYym^>h6*fc$ z0v3$e6tdgfnPpTG;PzvoIVnPyMzaNGK?krDsKJO=k+>PL&^VULL)oyeN*KL=MGC1E zQfsc3jP>GP@|k~!8ZZkyERDDG#9b*o#D%aMn6EO+&tB8+3Op2aYm|orbrX;m%CbQF z_>ngOO$A&E#2g*lJfP1g&hOB9__L2xZ1(#AHM@xE<}ZP^GdxOi+r?A92H&0M6UB7)n~ zH#3&j7<-}G2}+)g==WK=J#29Wc(bz&!Ut)j6x$rggAx z46e*hJ>H;cUkjUyeL@JNaGr--$*1+LRe`YDqsB8ar!_nq5qC$btpf$_xUtlQT->rY zrhs^L%8G|w;w`C5=Ge4<~Wj>H?bp|=RRjmJQW>~pU zE3ad?yG{6gDo^H@#|8V-_|^_K^cag3^j+;b(bX1Kx?_L?6CwIDp*b)iU0tft0pMuK z_gvPHR)`@Gtg(#)+i~Mo$LjYn(5*e2kwV})ZFzkYdH3!e(=?&gb2l|a-!|4pRb@C`*lwueYj~)QY-j89 zm6V|ud(FHNXo0#E%!H64kxFaEJVb`#Iq^FcS`dQIo|r`%kqr*ug>~;}VD-Gu+IRos zO$zKnWYZitz0a9rS$teuh3+Jy7+9s|Ou$GsQu0s`s^ zZRyvnrX8y~I~~b-cIo`RmDIJ)AeWI9mvhSc`+W`b2+PUruKm*0VyTi8;Y0 z&*XWc&WnGd5GX^UR*#Xf<_<;HL2s$06Ny}f-PC_Bc0f7CK+Az~98V;c)(X>-DR*zV zQUM)K;IH3+zVcR zSnI?v>gPVw%X8|GlvWGYaDtC&cjRh4cEtCKmoY~t@V8Y`%}zEd1+$9wJ;bVdm(S^Y zD@jXm!2dJq^2`2ckFWXjKF6cie$v+YP-=0z@w}jYOu6#76RB5AF7-Nu^?v%9n3TRx zS)cDS0Q}sZ+jDzv&+T*Dvnu$fw8^tY^mBV|Kh5oXKREEc9~{_iBfs|5SA6{|FWGKB zdt|uUCH~28e1ZS)*FWStfBK%^|IQok9+tn+dtB|0{F8t22mHqGeV1>4{g?Rm*M5n4 zNdMN?Y`{O`ntvwO{9_LM=e*-L?f7r~dO!XR-Gr z`85;`Ck2&=vz;$hwqY&YUD!BAiH`~jt4&sub3vz-LMeryFbt1X9Bb2FKw7W;sgiaD zx-akB$+GT;u;woh>aITaaJOb3=+plwkb86ucuL=Lprek_0BDFDCT zqtm~EnuVz-hY3m+f;Oh5@#bA-Iu@*XVZ&_}+ldU`TBBI*p{4lY=`w@2oUKD&#yfO%uo5LFuFprm3>sj$B#-mi0R6k8}uK}#ZDDdUj%<Z6Z$#^IX7uKWtJ!j3L6UHA*>B^NdKu*dX28R9YiSadq1`5c;}i zrJ}VE*TSzOeO^qKMuM#|z z&}^kLpv2&yk98o~$t{7{=PePx$6Tx{XV5be!et(&uWPk|o6S|vzhNRiv?D>j=Ar8RPG5HQuJhsgj8D&M&~D2f z3G`g<{_ItiO)W$*wt`y`)8}V%#}47a0oI=T8rHx2hz{IPTVbehZI$Z^QGg1E(%mOI zK$B30m}qk&A19`VJ@M5oOe5_$GD+$Az$1qV_W2!lJh~I=#oDIk{UG8>*;VB#3Zd^8 zPkjt}#;2#DHXb{*OjOdC(A_m`MhB@RL5Nss%*#Fdw|5TyE`>C>8rNE;R$nJf90;x+ zdP{57iA~nr=Gi=?BjlN}R<3I!Aq)uj7HL(fqBIMqi(U=!2acrVnvCuz1o&eGa^(!{3y)nvA+(DDQ{sF@lRxqV6O<5So3%c`8W zdL|;BF~!dT8(opy`Zhv11K;K^+yT{7x^jPh>wP#MU`#lIDPqY(Rpq^b?sRd z{8QZIiAD5k<@wy6+jIMgZ--;yw|?(qe*0UW@XJ4c%dh|HD?WPtS>( zulV!t-Sd0jdBgX9aQGX&$GBvE^LPJ@SR`z1%Ce&WD-bT!thVky zg~sBH^V|z0!BvdzW@%)st9JXrxPRsq6gU-dPq}pA(e*x3A3p(srGo=c8QQ0xWon7xf;$fP}^#Ni-)u?2023rE# z9pqqm=~anWw`{L&Py)2V5d2vzWhO2M@^YYjx~ILZY=(i&jZvkt6xc72!oVmBI#6n3 zYLQDz(Y3AQhE#?3`N&q-B5kjTw^xMC;1=IFq0);+t%K_U za%DOkC=W-L{Q*^_v_?5j)Pwh%Xo7`^p&U1nVN@*i;=U=JAL7}|pEIvq_Cb;4{+DE= zWkOqsts()c1+KzCl}gT#mqIHJ-buG0jVE>HXPbyntdUzq%yZu=4QmxOS2M5qYL_|Q zPl4osoaPI+@{?21>*=}lsRB4^AZSHu>u#2=(rg%wilvFGu%k>PhqsxxLuDKT8<`pE zkzKrEjsjVzYZjx@JwuJFHdCZgq|sW$LdA58wnSU)ImZpM-BER(Wk{e5r*_iaIO* z+U5FTUT8Ku7kT}?^)z10jJnzkH!zeYdRjZoeBN~BYwusBJAPEZABN|f#}&x#Mfqy5 zltv1|(p-zNLdMSSN{G{H&PzTZ&-W2{szsy~0qe&c3#&F@)@xa`rt}TIYj2 z6FD-p4dW)zbRe5Dm*Q6F>SU#5*l~Sz%l7pRvH`V;gWr8Z5Qf_gbD5D`usTuOL==V6 zP#ejz2i?$2X>}n2LmH_PIhKY8-%2fpZej17_~Y9ukV6?7?xL;?=bF4EljKm|qF4DLKOO$&D)zaj26TUpQWP?fE0QZx zS}(5_tTc{?1MlCxLyik$h;EPH*CUk+w~hX{=cv-h7UWzgxe$V}ZD2aHHKA5xL*sh{ zN)42fDQlLwRDxxqRMJw|Y`09ga6eB>H4}8?T7@AEOzrG^aM}-_9^*>#kh9Wp1*cZ< zu^KIRP${~TPv}ZsGjpPvu9p4cu?AMD0#cgKRO{UC6DDRx0fIPj!GSq-SBDOs(E+Td z1d!7{VFlboe9sdCh(7*&!XriJ<>y}i=t^erOb8Tl3;EhSQ+8fX^O@V~`e*l#Vzjc* zLZ#M1mO!8pgLtOxQn1kTX_q}JLJHOa${kV~Ew&ROR8G$|d6qWw(%kN)q=~neD^tq%p2b~2N23i_uM5+}+3TSKCw5K$W z{y~LSgi<|MSx;xS)*V88H>Tz>M%EhAt+tDu2^-xM<8-zY++hUO6M1m`UO+tmSA&DI zt^bC3Khx;znZen9n+82r#|e2#lXmLsCjPpz_Cpb3e{a3$lQbXurt}DQIRU@WKi}zQ zFOP{07kw0<&U?4gE`IO)=K{4~qh0{@cH#KtR@SQ%80TkA&uH&^n`Z#{xjnc49@0jJ^ z9vS;HE#<;D|KMNqjqm&!fArO#*0B2O|Ob#GlOm^ zcK+<`^tsL4PR*^;+DS2V395!5j|x|(>*n$2u#0QH{C=*5F^&!@nX5O|lvW{IVH1TZ zZ<+T>SqgbMx@GT}ur~AKOv^7nGjx^QvbZX%6!QHw`vbJPrP?)1hC+pqDa{${5*4eN zS{t4-Ye+~8!-f`a(Ev>|#!TgiC}=2dS9dCIm|M?E^TLN2tuzotRS3EPbya#T!jc>F zQW?icNCPQF%&My;idQy_fVGGa9Za)=4uPwyEyIJ*>Oh{}V4DD%AP(4ehuz$wDIo@V zs04(qzzeICyF1=|?=P9&y`|~GFa6?&OjpXAu<($NSjoig6;>PXAMV*tgVIYdu>uA^{#A z9@xKqN8KL?)fIyxUYyUZdfm8G%5UbFGm?#iKwXZsws5$6&$6H0LVg>VB=c^+ zXB6cy&Ah8h*#)FrQ4R~kS8fSuAnyzFrwhlsiTZE^l+>;%(&P8WbQ*U;aDtQhGxwr8 zJwMVx*fpnIdY<5#NqV^esXWg7J@t`wzNeF(=*r$+@NQ;A>55db&-}hyF4wN1dlGSA zo^J|WRjB9hJX*G4?SsfhU>Cdie-{0aj z#iEb{5E`jArd9~jSc0$wSW4}CLx0{eMl`{3K61F582|DwdHKbkniZzQ@w{e;5G6diKP(v=H!uuP zd`}ca*^VP3f!RDiU0Y_5N@$g4fh8|Y4|`G^eNGI46x=aFyX%6rMrlj$vi*GY#KmPj z+c^Gyv5)GX)ng&nwXgrq3JB{D1Ai~ikvPz3;wtIZpw<)dD~>x%1JmN!_QQ50j2U92 z&BX}@J)UM-GP-2OhQ~CxeN|sq`?_K61e#hcSXYogRmraRptMR#osiU>F#-Y&niRt5 zL?snYV7UY*Nyg}ejb`N>!=U!4->l{!>MApXpP2%d6rCLZe^)+Ar%1g%KvtYo7uQvRT|A#-z-NQ%x?jOG4kN))CNwNB)TBwz8 zeCN;j+IRn)Klb*_ zC0BB;q?FL4XgKk!JCnZ`PeSl)C;YS6ykHp+w<2s6f+VbiKa#W;F$GCp#IGrkMW{=o zG#H{FQpxiJ^WmP|?T28M<#W3Tg@E7F{eI&9aD*_B zLQnpzhEkDG5t*R|w*%FYYYpgrp)Lz$xFT&5a$6|#8|E;8M2cIeeE+Zc>%aU9zJK^0FVYQPzS@#wqRqd zoaET1G*irksF_6q)had}3AUjgA-`4H!!7%i$=4%XLkLHv_nB;o5N>G2`1sCf!wvU2 zGfoF?!!5emaNJHDheCawvA-Co-##*b|G=$XA=W7IfLsr#Tww}nOzg%DORb14Y*Hks zalp6^Tf%WBzkP$e|2`a!gmjG#S1h=lbP(8>VYx7eLJkV!$j$XjfL`P;&9Yv0!hA`~)Nge(Oq3uBuZw4&lla!G;B7%BU1(`&B&sRBAiFTNjVLeEKE+#8ah zLM(XkE+kYvm-Cn*CNExxq?FPK3<$Nm12`xcMXA;2mmx-`I#9_Niz^WELR$rzR220w z-_PA{_3WKmFoG5~LtYS(=5WV$bH#SMWyx+st=gz9)A9|ut$Fm35EEvRxlw+VWLLXsAY+u)SXw0vBOwU2%*56_4_gMRHL3}57%{7eHIDlSh7_>j zmWUA)(r#e3iYh$3eap+u6~ixmfz9xOn3U_SQr_=*^Cy4BE-ZZMqlK$4zCyy57Dhxo zi!;VT2scEn6!(5=bHx-IKN>%OPL~c+=jame3*7b^|iclqy(^G*x09xKRjm zBZ**jV9Gw$H)?1bpgP#m#F$mEVM7xr(}cAxgb__3JP_uB=1R?x7(e82`;w*HV~0<9 zahMtB1u=75_9VO`bJYfROC(65sE`5-RAOCRvDnNNb*sW!gepQ+;m|6>Fm?-C2+`-? zQk-zt>OvGD41+7_O2wL!goc=y!~vVot^AV@q;5wl{2)w>VL)o|_>i%Xty1Vt2r8aY zjjt^;0;95JODUE5>B1X(OZ!q{yuGHjLZmo>g6dq504*3MjYtJCqBKg#pd;NC91%SM z!*Ny9w!Z(73ZZB6S|N%Ont;s6GI3Oou)tsmFq%-rkowT~o2$sOL*L@_Z&gm@!~|F? zh(SzBZJBL+$^Q7jL142PT~U||v%;i-FVxI2@5xdr0b)v|IMRwi74Ax7I_{|pgsUxb zv*8%Fe7_dnr9{f5lWRK2D%}gFm+69Z7mn^?;L#BV=2q2|inR(Q(^5c(fg+6<2S|aq zIPs@oAQ`nn%m?h?S-MxE%(bzM5xu=3Y_^o{LKGw-*3O(CU0oLJ1WMMv7mw@pmwF*O zf|Aq?OvDwVrwn@SPDE{0q_3cDb+3v}x;m(`DX=NP;;P@KLg{mI%qz>R`rbok+{U?e zz;F*oMdyLKk4y@+W=tkT8c`xko{0+8U@C!PkybObcZAIj8ItD>o4aI4=%Vy$gf^0M z?olA(`>j%unmd`QNALu>;5ykU!e?k*k-q-VI*{1^XL@9f(Qy_03aodMEpmznQV}#a z$n8Yx)x2lOisi~|1KI+W4Tcg!rL{<^#?a?=YnehO$cBhAg==J(DOE{y)w3#%ibVf= z1;bY$SXUB*DnXKug<$@B=5ZzgzgMxEM?NT6QW)G$U;F1ZgI3*f1)yGl-_X#~PNXvt zKRY%RSV`Bx&(upk$0wY?*48NXY)$=$;JB)Jt@>V8okX?fgi{LA`(Nw$QBzlzuZX@# zaCNYCMfW3ndncByBl=HW$cwNQUl}XKuIk}dTaz{j19h9Ym)hAb%UKBa+v-)1E%jnK3fq=+G z?yk`bXwL3u&Gc&KiY2NauKVleTG5<|(V6tERGO?AkJ=B;(v?=A^unOR7zGumWx+~y z2K{_==t`kkBSFzyI)jSy(9P+Or^p;pfU zt~H#jVXLUK;u#o*Tf%Td4Xz$r@`Tvj6)ef0zg5J9sKQc>qye+aG!?83V$CR}k#qI}T{JW_2bRnz&A@~ZwOfZ8Eha*`A&f7W?17^QW|{5Kh__1l^hhGH z8(|Zbsa58jT`|`hbI8OY&}v~`7D6<(DYCn|;ri+&fAZaXUVcz`^-2iihH06Z=E_nE z)&f1|t7qe`#hRW@VgdzhjMPzSAuvx1`!^HI`$|{_WKcF?>lW84)V8N(V|rLv>Vhpw zjEY2ISqk^%o-_`GT|n5-t_v@J@rG?q+%NCgzuhyWfnm3CRj34-_Az8V-&F!3_!t_1 zw#*#g-*NZJCuper%ts$lWZ?Zn?zwWHr7i)9sS7HGN=1V!(+F;x7$u-hV5#IKvlOsCZkJ{07I{7mjV)YRDBj(qWYWC)2$rIbc$m1vFF7IFc$kr)eVf`&wB17<>Lg`kEk zuGS9YKn&s*tWCOeK*p`ny)TG(!J2N97&Rbaq~!uEr}aS%N;9UMNogdcNK6s!7M(E- z=r|%8Nwp!H#Qboey}g4maeKRCepivh!kZVFlJ>km?m6z?V@FprZibODMZWi!A9FJd z{OYfKk)QpUZ}Rc=9rYt+{3yW>j@)e$Zx4G+jq9C|YzJ*%kw(^vnyVKD+Mn;B#nM$TG1U9w=q;jAA@{Ra%dlXvVvb|B8ouVVgeWOD{j- zo4pjoORVC0C?XQZ_P;I1aRQURP^gu$s{(#IS*2m_?d8A=rWF zg3t@^B7|Wi4I6jtXa+~idKD1I@L-#Fs7?gOauud zG4%aU3*6;BQ^RvKcN-)?AyTVyq>r5-Sj~tj0R!zh%&ik`yrW~au^onvZ}s%ixT?H; z{~41|dJc8a=$W3HXl5L%VJV*Wh^IZ1opUg+8b~dKKKF;_DMU!wAQ_CYi|5{IestqhL`Rw{yowbFO zyRRDPggU^3+g-OHlq94fQb>$r0c%*Sl(ax?6f0zN^5!&LQ{(D((a3#IH!X$M;ILGd zV$8)ThXdj6j@%lD;I1NYwz!oQ?0vGfo&eR0`?=14Mche*)}RSiUDYqS_H5eTukk$7 z(kfL184@W*cMnmw=`FQ-mZ`Z?7d2Y*&lYUGqnz&N`W*D4Z=L$r+7CMTYn_l9>5&1o zQENjrp3Vnrf3Z$haK&&zDp<~tvn%&&#^xDY+%ZSGGed=Lm)=f&%gF;y-mEoK%0lg= zt{B~EV#$RjejbXOEh+Ap8)zCHxik4b4xlTJ@qTpKA8T!toZWi5H8l3uxNv*9RC`}O z=Sx?G%dcPd-@k3k$C)_{RDAzj!~s}PXdMu>3&8lv_=+(?cXpC?(HH4N+|^S3;u4#j z=NkvBANP&V%n5zpw?-G5IoY9DIi0tE7!h1mPvnvFeLOpNUAos?{`tIn{p0Wr>2uZP zXE5#05`*KHoc*ES&`KtN?y)&+SLHGyCHL@O=h)|Bmg4 zfx{PIaJyLKpWDAT&H4ez4=+6{Sf0nrPfPoZMfB(7^F6oc_S}B5S}BchefKSY@W*fY zg)iUm55D%AFMhQ9%+GB%k^jLz`~tuEYajCMKYq*ae)|o_x%}AI54G`Y-}zI%_Q!wD zAO6ZO@O$6D%oDVtJX*o3F3vHQatxk>1t?e&Rp)6Wg0z?HRlW|kcQ!$LB(2x@&kRV zE|~}&cqCWPOKpu-9PGH>U9sS*i4;ey6{cyztq409V3pRSXL(&5!~v1$Ihgi%FZr2! z(9X8g>t|c9w@QGfgr0-fT49+KJ&wrunmIL+{53-vQEqAJh-oHPCE3KgyD#(Zu5o`< zEN)0~WIK!~iIxqc&@5oNofNgiNKn7-l8-n@)G&(m6exrb>w3FKSzh5rU|zZU`I3-3wBv z#Bv3B;b048tcV6=s$`CoVn`L#HiTL^-oJ&1NV#5%KJ+Z{tb6zT2Ru94S9|%4-@0zfm^v|FyYf7 za?Ay@%50T~(Rlyv4fp@z4fe@9{?RwT#+P1yfkQZuQ$=51aXc&(b~JT0$%ue%sX>?{ zM053$G$VxQ?hV$+=4+VFS6x*a2?4jeXVVq@#wf{cvFn;I> z7Fg{cZOvqC(m^QB7VK(Ng({iCL=7`x5DK57BQ#NR2}}xaA13aXJr*lN9%!u+LS?&6 zTx~Z_G$@5q7ViE!a+n^t-&d}zx^i>#A;cZIZV9+U2`Q4o(8)d-nTi6|M4eI^xE!vrl6~-$8jXjBW?cxF>-aa^9;2vpBW$AlpU#xRgjVl8Ysp-vG}4DLxD1DoqBwpSZU6RL%7?+a){ zf)J8$_2Ea9!#&O3v(Z2rm069vG#=WKn_(bGB-6-wg0fJ{83eDg#TB0pEE(thnS|8$ zc@Au=;P)UV2h=3E75i#`P6r~p8q<28kvPzXEAmdeqZ!#?K?$|*)7J7p>-N}qo_CCqDraDQwFH(G#C|fK&wIa1E9f=3#Ixk3 zgGUZ3b^^!6p5gQ6iN}BZ_df6E);%$Oe`Mw)qu9Ye9Y#!z8Y6AoQdG%vA%{o}k;Ob7 z0fVNVHhL%pF(aAMny@U5xmE7x#qVPd-aobjb=*LVog6Bj1JAm)UVy81j$~Q?`}A`c zdt_DhwY!7w6bMw1;(PX`(2~0WoJa<$Xc~~XA&5dN#OiScO%<`?kpMtwjakBJ|G-)g zmNT#xI9pGjK>LgRy!5k!Rl|Zk8cQM``QWNiI_bfcmFwpW!C<4l>3lv2Pd+6rTB zWXTxK9gaGXENZN75n>+EAzEm)Qrm)=5OgHPE!GOL2}^du%gxOdo0}Izf;&e9^?jX* zXX{F!sSpJu259Hlj&+}O8QT*iobuGc_w1LgU36(%BVl@fw|=htVF0ib3j4o#T*kHa zPcDAn(gud$ZXPWXHF(rU)E*^&?u%}ZjFb6dpk0cE)CpIzp4V*cEk<)1mj7D}L{HD5 znVsTz)=%PRSR;y@_eFZPiWU(hrBh$|To6^{)EE6V-SP0;$HM8pJbsP!ym=;;J$mi+ z`K;gT^Q&<{1EfZqMyelM4y| zGuZpzcRO2V%cX$SoDK903jh1l%nU2V*_Enp8TG6R{^@CQVG-TV3|^kc?sI!?Ke5dW z{_HRB`Ln;g=L;Wf`HgRUz%P9H<})0i6qSGY^$+;9UwOqJ{_#70=i8rhnEoa}aOKzk z@K5;KAO9PE|JT04?|da*+5?;iI5`GGJCp5&jEi<(&(6WPMA$Tzhb)2U~QuIu-7)B%vp8aTgx}A!gR4$%u z_QRbh)`Hb~Z=Qlttu?ofY?UUJV3k%I%Nz;whN0XrMNkfy9jI-lg@VM2)CkiJ@9(!9 zvO>CLxVj;YN{mJ_#7i*0kTk*j4n>>kQiOb+=NhT7b2Le zgyn)T(FDhLwU6CZMRB15QFTEP!sX1}R%H<9!sV%8*9u!5(2!_L!%PVp)~EeLoA%dm zp|qUTb=tvz(FAL*JWE$Qu0Q;MRtm@aJKnxsIGAyJExde@xEd20ya2Ar7&Q@xf*DLT zcyUd|)k4-tV`P87V9SxM+;X*xEY)*BHz83b<&*cYE;q6kse9p5V+4(^{OHd%Dm^pW zRo(MEV^$e9BjfdkD$s1T{!{i+X(G&O93xb%kTP#>1GXKw`s9I^Q{sc0TW+^k9A%+R zg}a=&wL^`Rn(evf1tU`Q?EvN-S<|$`EN9DFlKh zOb(~wJJt)Z9dN1`HF$|%s-PKYiljhOqlghLb@I!qw)N>Q^t#NH5^9M%3MD3ns~5y^ zLtzG6F7o1^tane=fwli~0UoV@L+EoaJ=dNNd{yl17~vle5ygV%Vpe+AYnLx|%;_|r zdm&t%@Ia(CSJBP2LTH2-kq{MB43<2+ZbtSHeVG_~ZmKydP=9x`U zHgQBlqin#mVQu5N=Tuah$6{DuPKgD@Boe}!CSCftHP8W4^83=QLj`>O>wU{akPuy| zDX!3sJvXvCB?_sPW{o0^mImVOK$A!v2Xcxen=uK5)<_M48QWIan31$#Av!qQjB36w z6;+zLrDRoWyf8trjdhX(*_Wr|em<7u&4$wM-zkf_5ABWR(<* zAi~lb+A}e`WOwb#`0Wudd-I_nSX%V8Di@WbQVepJ1E?3UCmGgU{HgYDJl0Tn--niB|HHJY~5 z8vc}=t36|0=)@HDzAPpu;Q4agU1n@cC!(1CkhuY$3p{G+^GU(0BKY#_BH^^Z773m3 z`1lNedEYNd$4_7DF(LVhBNska*Pm~}SC)0(VO#>ipWhx`mz`f(tXras&#v;U0Df*i z&20sFMfAk>cy50Wo2&|l^$TZqr2qYFH~aUwwbp#|xU#ClzkR{}x&3?CRz`gvt8QWX zJZ7KUbNfkdKlt>>|MS233trxi{Khvv;H$rId$K-WTMWuKzxJAMeDxK7_$Tl9oj>@L z{W1U8*N&y~o4@-%r?_%WC?E-08Y?^mYuQ{vtE5Uc(^8W2&? z>cFun*1Dp(HP4QtOWc~S~>^YHe-7(ix7W1wY_mMBYOf43k7(#tDC5T=m%wBC`o6SqHe zOME#{tg*8z#;YsRI8f99&d{%?mcqlEcO)4YZ?7rS1Bd;4_IHT|s7s-$5tbu$HV8r~ ziKcGF+^mtMo)ktR@;ECkMYh{5QJX8i+YHUK-MQl z3b_e~eDuuKut5>>GVwP%O7tSJIk*&{_Ycoyq&7-jkT|lvxginQk5@cAJn;U0&+)Ku zcraew4s196*;0xOn~_lNd!D6YEg@Ch=922Q1w0#cJHX8*`t^$tB+_!Gt`So7rKP!L zpMz(LhUkPFahpx?$+h3lKH_9h6kyB%6jr;k) z3*9j6uK8ko!N|g!!+YXVc>l%1);?taC-?lz@BTSQ0-Ku+_w&ep9{J+-J@Nhly?alP zirsFRfi}ZX2bP$T5ZuN!7etge46Y2Sl{&2Xvj)ZcZViH^fW}B!dcSCW>_E@=bFd*> zfa`0*<_f*JrEWKr7O_&e3LDBApTODa0Zwr21+cu1o5yQF=(VBs+^X%;7WVVOB3D#; zVPBf{e&2tdj)nLC6>9`js+B&6SF8vukyayN6TA>^jitDnatH%4jqI*A?CO9SYxA#CI>HrtU2WCToe$z54$^qKDs|@>V%!HMs;OuK<4Fq??a&GOb8xZ zpsM6NGX|xoFlb;KgaOZA4$^1>tyNTn&1TbcY&%J2B@Us8Ixtbi0r=AMj|oahkg5=( zKpik~vWW>;nW-WaiDXHhg<6#;f)*#E1)v01PqtoWcgtHRMK^Q%a5Hm~hd43IN}-m5 zw$g!eA%)D+JYLHLECe)m7lXP$JrFE#)r_HJVw>1nCAJJwXgYLPF3!&&XzzV)Cw$uL ztnmSTuh??tI4iAIB9-egalHv_HcG_6Dz)H*EaSYVl{1h`tfV3NKCxB;jTlFUqR2xb zNJ0Z{4=sw|K$^AgHlt27VgMSn{EI}su;_Pr}u z{OGkl=ie(Z<$HOL(`cpA=8Dag`cSAOj~0m=2WHAS4kmWOz?^5S`98UbBBdwMjw2x^ zWHX|}3tCc2RB9AT^ZkD?x7+q--N&8z8gl~2&Pe~~wiN(w&8=fwYc#7=1Fi1Ps0IT8g5Seh3`!x!4MBv}3#Q?K z|I-tE>p;7j_ie!U_kFzT1^ME0uTfXa=sw@}c&3#EQB5Ar8xFMcc+B+cl4+#3N{Bd*75q> zp4)T#$!zcLX8zfK_gDPZ?|sZa{Mu{2{*{-+`1q(7g7E9V@``VKZi8D5<~p(D2R31ghK=XD zc5ASuG-{ri4oBjs?8Ylpwk*p+8eqE}T#;=NX-4a6?j{N$dQNSOXmp@4*Gh|p8fF$d zGS`__A+&)Z824e~2XRK)k=N~t7mO?=^R5&=j>awu*D29@W^cOMdGYu-lkT7_l{|R{ z@@BK)Y~5#wxXt^LjW(BFl-zi6wh9u?5fjoBG>SA7$h--4Hff3YZjJN*Q>LL8u5b(=aM29W!n3cTnvZZ`xgL}o&1AO*4JMfV^`HIg(Z2uL7Gf(oTUL&-y6 zxZXhw)KWZ)Qxy}V6eAi=7I85QR;pXrnv!b+t|;|f1Z%B$-e&`|f^b&w08Zj*=kZut z<;CrW+t*hdk4NsO2P#Gk1FaQ)90F|S7O9u3jYuyZ_W5tUcVUm^IQMj6)&>2fUjoH5?YM{BF3>e=eS8ro`CfVu^$=cR_zXO?C? zyKY^%grNpV5KJUVp6ibr5J>b5{WPk^t1ifv6zeO1u(n zf10~rh^ssmKeMYjm+O?F7~=^Dln_Wk2-+>pB@hRn$Adwsje^h7+KEXB3?V`&lx4=M zXZ;3i1dKt%E&7Qhb&yr1IjBn|^m*QDBZ)Fb*bD>Xuq8;QWdB(ar3z?prCAVnO1QeY zM$#(^r)m9et0swqvqa9_+9q0ps#g5QuDW;EDVW2}W_+4~cXS&aowu?pHj z-i9m9QNhF*#*uNeq1MWNzxRyyK40&T3pFpaJaMna)gWANA~)NC?Pg@V*+3tg>%8rh z0S8(Z0mcnTkNs$w5S@G!wj)gS1birsD2kekasqPN|DN`x)%yC;PW$L}T%Xmg7yG`> z0Bqv+*6ZXU{cEeG>?HvF`9#Oh)+jFLyi_ae5eOnEwomc%pDAd?am#dLd0S~)z3-RkNeDr_P(f zz=6tA>A`F6;`NK-abssxJFYAH(aqyOOj;{5;%fr!}3{5NW5m@TutU5$U(L z*0ZVCtL`TB7eunh_xI`FPw)Tw??*ppZqA&U$aH@ zQD1llfS=n>WIIhZUE%u-H2tKv{;W@n*{TpeTSq^)zaP!)!X7#VG=%5z`P0@!oc#>v ztl(!=@N;`^Ke26p$o#jz{eAxBw?5$?eEl`w{FT?F^!V_pDtzOsulU+8zvSD0{FdMT zgHJjB4XmMW9uEA|fBxHi<2!%K|L;Hibw2*^<=^RA-w^pf%FpnB=OzDJ`o;d6hk zmO!iG1-rh_^rcMCxn-f-N6Pt-sp8*<^Ir7?LUyIW3ILu6`)0IaWO0DF)=EPiR2t(c zXLNl{+PUDh77EsOVk_geYAblV+EY3Jffo|Gf=clMkQX8yv{t#WP!=z^#9mnS0$o>? z2o6r0(PSapj5K4)nJR*{nWgNpko#M@jhk{$v&mI(A&^U@WTPV3F|!GQy7cTuiH~fw zFAwuS?BDA>Ukmw{2V?-L`NWWK8jvJFgC$d^%5)!D<_%N(kXKiGHu@=TiaZ={cvBOL z2vxdz%_>Pi&6)be9|T+|AibEieoe@EAoR>JBeB#7G|wR{#*`n(bwT0=G=U1S27)v; zThE&w!WGsc)+&M$!a%E)QYuk}QX5SI8d5K$RN@ebQP~aGpqXrYj&aXDcYM6uakmuO zG4U#HD8m9VGqu8B)qCEg9TJ3xu;+NMw3^W*#9+uEEG>J+Z_ZrDfjTYZB{RrKN(mza zl{hMO8Qcmz7gQ4=y5(N2g<30dXq|lFcB5jhGN|H8<#e@0o3WWIvM5t2Otn&5MKy3- zCSpx!2by!vG%++q(zwBOFv#L+b3>jf_J#zE< zns89Un*+x~232DE@$%o*0uU`*6|>?GDkVbn>y`%6BBXQzf31@}*7JNd<7QCy<-qVzs0@gV zaP*M+i!uGWR>Fc39a>fvOOn}NXSGTM5h=mRsY9JuA+~*;Uj|$2s)zJm~ z;(b~=F`#QOTcEbWZ1+rZPti;rj7mUTVxA$1Apm@QcD9{b;a$pf1s9$s9TySRvKCYL_13(HTeCgm4q@VBy$IhfUAe3pWR}N zAcnOm6eWg87GnsJCAlqe z8eExIYk^h?VvH#wEpzwg4e`}AtrWMjx4sVwMlOa;pjxQY!m!!V#JHa)S`dy0gO=E7 zr7aU1ON>KguEvo@wTb0;M@b`Q6|D`idQw(Z8o3Hl1>_tn=k6u=8XF_7J#6P(%6UP| z(56&J*l1{vN$~H*ni;JUD{R^kFfwjCFPHPE88R50A|N;u$^_y#aCLKw4g(e=%l^Q- z?57xdxJTo7M(WE2=ZI zDiaBjo^g6no?8J9<(y@?elFzvUQfZA)9=~^(L+|nUf1e%fE01C)w4A|OA7qlwM14c zd3^tFkN4B3pIKF>9Ryq5IZ7vv9ZIE%5<@_1Iqg3~=t^qn*2{*fP=PAK5&~sNx$Nu0ZH}MCfxoM#7k|Z6i(#vAhF%|5fW5!*<&9sCaI#_V@K`HxReX-rfEj zX|qK)TcjA-DnVAz)uSv<`<=ez`%p2o6TdFo=aCUEK~*?AU97Nl};Y zx2j<;|9f@QSpO7jZr5E4tri02kpLRp4mt#{!FQ^TsuIKCV*)3>@Z?-->tVC!0VAD& zY_7x&r;GCOcp_Bwu^Bj%8TiclYbVS!Ahgerv@V^oo&drUF7B0sv_aydGyD0?d=8L{ ziR~$w#EGuvM3)Xq+v&5cptd_~UCv8tmjsB%5BRfl*ZDKFb)H=T^yduV=k}A*&Va8z zXZJogPJl3aqSven;r0wP{k>_ey1kL~4d!!B@K0Y8RYE^B`JtnJW|RBep4)T#$!POZ z`K{mmnBV)uH+=JJuleS$zG8S%%vTkD{a0V}wO@Y8x4!$9-}&~Z%*&6?dj$CClXv`2 z{~!OHKl#Nk^Dq8`ue0B6|4!HX$Bg`!@^k#hJn+Ba6TT$n5qsBKXMb~{R5~5jT+tcy zY$vxKO!Wy!`SftO7GP3v#(j*@vjV$Hx0z?@m0a0s&)^LKQ_tz5S!XM+1%k&J!{_(B zWG8nu@acdW2t!|&FN$hwF-=un6{L!((t?mwiM<%qN+paudOygtw$R*9mt~#^3uw$} zD1_LrOEPFc(?pq$NEk`umR6M*6Q+S?FpQ}yxQy5>XIrb(>Pp-wXU6*Hfxv6=ZQT>D zYMoPS3lPY?@|cp_nFVb`jOlpKvSf~S#U|czBi|=aiTQZVq(-*r%8qJCEzm6&YXOsl zP+6_(YIRjyt+n?n$O|ANL511|=1jNP-7-ie=|ZVSsmmF}z}RgDZg*RdEv*{Uab}(t z+(WUEb0z3NNZo3;gBuoIxgA!gj;7>XILe;Gu;(rw_(b=7zaCjE@@Bf?%VXf9P+9WA zC-%Ub-H~NbCY#v2+t5ly#(>Gfp&V(^?efMnuq=%bM}{F$CkLiNth7*=azSfyOV414 zG-_9m4-qz-fUzNjNKB&_C(T&e#IiuC#!NxxN<>LIAW4|(6^ub;GetXh^QAGlgoD zWo9`{l>MG@`-1!V9q;z<*$hX<5C{@TL=N{eTb;6EqSZk+wKgXf%AIXg9I zQno4a;^h@Dui;;R?}2%qDMKJi&#c3s7Xa6Ow$3@RJ0VyHB)3QK_q{Zk?Z0 zydMG9#O+|4D<55b2W}jfX!UDESB2S6=ZOFF)i13oM^}%06Yv%Nx>C zDcQ3hhYsfEoH1!=^c?PLMwLbylCM}=A^YbjcD7|alf0cwWM(97>@aGbY4@LUtii3} zZ?CavNI3%ukBC8b?hoyU)C5$OMVbRfdR{-Hs%PbP0>foNx7VpLv!3m1cuYc9OmS9n zIfxNxGBdRY?)aD*3pFWC2BZz-DI&F?#aLQnnUo>!7~=q@W#xMyvw460DJexMDXd zD#kEGVih88JzLV?YOReckH<0fg0n&Mc_;#s0wJj5aHhmDGU|ZTjMT!_IFd}Tyim+j zYP;VsNMpa>(_}-g6^RwC!Vn{MIq-wO{ysm*2WSngz8i`$LK2D?rDdXJmiI8-SDI87 zJ0LNTkBUq?M#dllzU#0Sk?4o=Hrdd>q8aAqy`CC%+)=VoW%^bk^;k=WP>vv~K*^N}l>& z*r^`Y35eogqCBn=KXqAnL8Tp> z|IgmPJjt_d_kGxB?MG%-Rd@e>=XD>rAVBC6BmokHNGT{w3i%PTXoqbLB!?sHfg|)E zc;vamL(lC0zypT|j&Rr`haFN#3Q06UQ6y-AqyP{E0bcOF&iOsMyQ(sC@4c1>YiD)! z@0@!<`;s65^ghvXx_@1rm6e(MwZ5>hI7nGEkR%Z$psch~DO%9z z1plGORXC6rF^si8Um}rsMOrm+aO-*x)k=MKjW74Zu1Kurjuji&zFAy5Vb;gztmkrymDsLw79zYFE#~_Uvw-=W4G?*sk4= zZ(jwf_wV}8*Zcc$0oK22ym)qv`SS0d{hdAsaoq&}>RiH;`%Az9;f)ZttzEuqU;705 zUb&wrSA>8-kQV^>rTrmo7qD041@L`o{{-zxAspZdYwcmI{slPvg>*s#wAM-Qc`96Q=7k-Za`WL@V`w8chzbZHU4G#P-^b7uH@`f=c z)@oSIR9T7Ripm|LJ0c5(g_Vk#Fysj#(yEcNpjuHia?a!-(t6I6h!Rr(GF2)m?l_H= z6e1NbTnqtPX`UHZ8VRMA1++8qF;_hVBP9oA9aLPQc_AmqL~D(*t_TUK<^s8@wCb6| z7Thj2q*q7~FVtwGsc+^jxb3J6nbH)kN@gSv6RMS!3faiZiJT)X!Mo!F^YTcD=4yu^ zjQjag)CeIFu5OcB#TZFDgB_?Ip+(RgNp1)-(CRJ2-2rPWwaqj=`NlR!Oe-3$H{RDO z+rFtbb0vpvdCy9W4xqGFu;41%q>8Q$t42y0O_9^OQXYT66hC7)Da)LB_u0S1Ij+2q zh1zZjF`&8{4Qg!df0_ zp`kgVGy)5Eu~9X1e2naOpR<;U2lj{#OiLoSk&`I%{mlDtB;SmjVnt31uUq7!Fe0lW zP1vQL4Vpm^TCG?SSO$^}SV)LAOk4pNQY54UU z|M1(e6Ifw)TDc+f*>2)Eth`-MwDU*AF>stu)UYzeiSkfcsxpqk{eEUYXE=Lw$@po4 z99Z8k98QsQgmJ%PX^kH|7V;F>4~bl7@^L}*GX|8Xjiz37Y#z|;w$!hL*X?7zIDgEq zf9D-<Z1Jxpd$`BQk zNDhs0nAuG;LsVK7WC^S#(k!sdjdEJ3tI;&WZY1n>#NCeRxhFW9JUZA@x z32917VCG8sH5lt{mqA+qSe z;|YHI_l%G4Muzl?DZk@X7Mdm^!j6oXaSD~i8k0tX!MQe$M5Y+I)yBCQFwjH@s*G*H zEP^&#saPk`1cTO#rAuvC9JsmNQ8rcEd}jLL7f4X18z5)y5v)Zl?O6KQGD_t2u;=d6 zJ^7VE6Lyk_oLSq6SdAzXDI}j0Z0TyT1l{Jk**)4I$PSH0OACa-RajxAgq?%wR-g)+ z2bLUpQy+OVzu_OXh2{82KCisWgU^Fy$G6s7Ufo04XY$?7i{UoYq_B&TJ6>^8<6CbN z<>7=L&s2jt-eAGAqCZQCB;V)#cZ9z?3+tczIsWwB$k$3?e|$r@pQ+=4G(^NAYgyc) zH$;L&Y;Dxo)w2lg?BGm{BQbknId_HJhi(~L;rzYq7(?Z?%pBS~9v{yfZDHlx+e zR3C^#z7&B~1nD`ufkf3xjF}cHYiop77;$S`Yf6&Xt!W{M7xzUJ3r5jGYTaA)^FB@7#Z6!#h24(GewU*x?Et1y*AGL3zR#|1C#f26s=j@iHcIp|1*3k0E z(raH!09z-j-Y`o-Yhx&9LQF7z%%cAgvxT|@S{->UA8|+rEKI!1U!xXbWI!bHzMM${ zlPFdSOE7MU?8e9_N|44rkE|(iiaWGb4ue1#sBJ~H5<(Tsmfk>%=u_+c3 zpMPP5FTRKBN=k_sN7gl<3cG#e=5{2PGpCaf;(-_nH)%&oi7yuAoi)xOF%BcsNl8C^ zARaQZgP)FX`IC9zcZS3l5BGfM`#%G(F#(~0Bp*j1>JoSdl93@kfDpdt{Qgf+&%I86YAvZAI)5L$$4 za9Ru1aF+&cXemf&oM`UCV1c--j4`7funf`3hl=#vXkQD}lt`+?YNT4R9Ed|;DV2os zJ~fu)O7N)_tgP66hZ^ikW67>S3^;Kk$P-~EAXsiJ>q1T-+MpSULSi8sSi0dnxmq>m z#GwiMraWdRfJF_M1Xk@zT!U5$mY`%K9|I>Rx?3jYEzFU!VVa#ARds2+F)>un* z;64N>id4Vfk`iG^SPZnViGG~~5Ig9133ll~nDupi3FWfBj{!pRtkX>u8%dP1(9~lV zLWmyWfcV22-BpPW=C@__wchaodH2ABuEeB-SdnH7+uB(Q#>$yJV@_yWaawGnDoENf zm&ncc|30$2#cn<#?_VQnqV?e00G`F}__32m)WtAO9OTWS?wnF9wfWdU3^WZM1JQ*O z8~Wiy2Pf)jS8lhfNDwwK)Bps=Ox}%fE?tG1+=e*@YEUwXE$6mtmivux75tzXD;0~7 z4?;Y^e11TW_uQy47k8Yny?CFXV#|V&h~r2~15II!iBJkbgwhEN&DsS(-AIS7HowAp zeDT?VO}`HAnq}Uf`&hCmmsLHBIOc@Lgv3p$%Y{T2VEM0u zTcUkG8TxvqUJ*pLU8p^QvQZLFi~f*g;@`*gl>6Ji@z2}$$)g5&mBq$O`-5w)j&WAlMG^cHveaJMAHF8tsw{Lc zSYK4ZFYTrMk!)*Ge)aEu&focsH~iwyf6OoanJ)vuLyr8VKmQrO`12q0xBl+u{5QY# zwr2|d=oVY!FZ|ly=iC3__xKxs=@^u?vkMb%15qJEr_#wZ*dXbY@! z1*;tIPYkyMW7;7txWchCLUM9NN{RFN%z8YLQed~+U7lA}Wt2!Yu$F1Er|801lzlBo z3s@OhH1Q6j6{D8Qj?CS#V>f2*A07x6x%uc7)9X(d%$QQ*TxU+piMREhA^3TR;3|i@ zdK^SCV+b=w!3#{bi>Wz6^EPGj7bTSIzvA=`GLl6H*#~c=S_Ry;q=J;{R8W) zSQK_SVqstmfs-sOYa@uVzw_d0I(vUfPy(!8nQ~^I1RHl`Q|ekc*U%MZPx^@4&=~W`5E`~L=2lUQG|jXYSRT);^FmoFMkMYI z#M>M4?G16a^9;#eH2kuAfMH@6KfK83{caB2|4{kP@`$Xr+~g4(T!GirND_Nts(F9z zs^BK|nX;#~g3Ms8a4H3TJa(JO=HsG*<>)qgwShHiYZNI&i&zRQO^MMufZ=0isY>eB zme0n8;A4Up1g#ejpDRW`Y|A`TNbV3|Fm%O6YmKIr!)Leb4g=$mD65YwtqJR@oaPyk zkzk6Vl)7+UixYjOkzL+lq!dci)6YcdK$Ecj^LJKpu^O>Q{oK9zKtz@ES7AAkTszIp6JiMaq zj5qJ^`L+M%w^)AmBmVTOPx)w<(TBIBQeY5rOau}tuBMV8PV&{Ymu-DcG@$9VYNmC7 zh>LQ|9TR%IQ**^+5TAFV6j)2h}vLW`Iw1Y zDO58ujVOVMN=nA=X5v*2jPsco1A`g5oQO-|CVRbPSQLq#yK9n>W+V)W86AYdBDEP! ztAlQ4NChz=OJd!!I-5}G7NUyhhVrD8Q+vvn-7=du*Nn0lGv>u~O;~G;gE3A6dwE5O z#yF1D2JhB0^Rhw`v!b)L(GI}WG)N$-+#j#8~Nsjaoq9s z&njQL+3}4}_I&YXW_kC9I-O|ogd7G`J|hI{B@CstO6fVaNN~WQ8qES~vD+w%=Y)sG zWApi6M9>b9#}tVBNDhfmZ)vp=Oq{F`y8<^Rq9kr!?@1{!4I{(g)~l+@(zAZcalSnJ zDW%JLRivwIH$d@&aew<>#T^%&gcX@WV2FujDa`9i7)Ekm|H$U_T(JVDE%37hlCgfqN`HdqKI_|9|4tw zGGLm)0=eN&q68Kii*7l+zUB)^xAct!d9pdS2$(Vq1Emyq3ki|D8<|o@ni9orz9o&s zkXTPEt*&SY1RGF^u%F!8Jx`=GpdzjY?~+up=AibKkkCh<=PlTi`cJODe_9(q&4c#A z-${3&C{k$M{#{4}5tpEv=Fe6pefo( zTNZ>dMQU9rRj^@T*d2(w5eaTBFUG}A+evL6ZK2I`%w=N)U#q&s^QA?k1N+t;I(*FP zzE=p{x_cY5B)XdY3O{;wJ+9_*rRN0m{F;5$GSK&-9{|1PgckTfh5x~|zy95|^8Kr# zjK1pLU8}smsy=#s?63O$3jqAm{)KEWfbUEDgKJOfVBkd^{4YS;fMEJ$_>vR+$FzwT zisFkZ_@%wHKhmvKegKx}6#{wF>~;8c$Y~ z;&zjl4PSq~^-Q7-2;P(y^bNn;in(2E&LjK7;6)!ZYT4|lBQYdGQbZb9K$(%Q;8JzQ zb{!{9t4ILGBX4vo3obz=`@5wKJ+K@R}%@7)B&y znl&)RLPbnLhRd?ydUL&Pu(i#-Q15N~ek;1WRW-e!XS%(XD=CPI#&u6jP7 z7S{7j4nk%ii37k9rG`c|r3t7+CR5gRVQGyR_Y6ZO=iGsop5GRP7)BB|q`DI4m9ZK@ z;C{)>!Dyv1*FtQ@ly3NVyyf*_;)^=5q8!p4VN4w7Bad1+n)0qSK0Rbi64^2wOSiH% zAVSPkJ7Pp~+OwZNVz+LMd1RUhg~m}HpC(+I)M0iJ~7lp&LeX#qBI)P5@Nz2BUXjCrkM{Yh(}|2I1;OqT_m`*e={X2s3@lv*bfm|W*)!) zhVR@Qm_Gdoa^#cq3Xd~pk(MG39jIH|>SoutI)C8mxzelaz2O@ES)qGefVlc8HUROA z=_HIK_N`(MUvPT&1*bR>_Iq~w8`3x+W1vZ-)0X?V{Sc zfHu8Qt^y{?^myW@3;cnb9SYg%5 zWQJ5Fql{L0y&uU-p}zeBJs)XiENVnkhFWNKLEpQgDh(MzU|G*J>(8her72aFg3p^F z1d>H4hKZ{Jx8gpyt@{w1Y!G9D_S^!UAWnej@fso%*h&yc;(6I?sSrKqdyI+JR%}(z zE?+$&LyI!sA352P3e3eYg?&=S$<3T=Tin()1tev1N{nK(wzAx>yqO=k{XOOD-}r=| z|M-@l`zE|SHGc0r^SyN>y!xmUP@Ftw_`GW&Akv9}Enwo24{8D?H0i{+VCWDCDFMj| zD=M@gSj^}IWw@i12hzH-@2)Co$c(!^GLGzTC&rN2r-3mhN?Cb$c;Mmjp7T5-=Ff2) zr^^_>xgSUnmaSu4wP$Ly>BfP;Rw<>DJ8AGXC-xZgkPsBnMvx6;g&OEiKF>jo%NT1u z7bL~ie*zVwN$A8nqt(bwoJa;uqXV}+Gt)$9IUvjNY2DYsMZK(>8@FUacH3ajNlqBq zi8+#pb@g-U>ox&$aHo-=h854ez5u8}FE+*=!V)fESj?H-e<$MMGqg1sOAvMkvbt z_k{Mg5fxexibU4K9TpST!TF452}@TV1~s>T7W3=O)!f`i&kI;*Pr1KaH0fq595)b| zr&NVt5XG(FZ6m8{&!<&&t8{S-Xp4c0kyB*4_5D>iOls#aSpyd{#!Z)fY@5`ZFUTbfA8M zs@QqOSpAs`11*mri7n@MoR@xHZgpKvy&s3nZg*hOOc?is-3{c)of)ux-@>y5ix0tH z=>U7|>ys7(bW89HsaXB*+D4<={x)`MMaNDq1h?zH8~nKrJ&)Oy)4qQUp@aYOwEupV z)4lDOg0H!)zs~cym1>Quja^WRLJI?V_YrxzgP2isn|rjNrFIZA;v2oz_a5zHfxLmd z8){3Go^D3(zyve-!w;S%v$rpTD2Tiv{#c`xm5bgVSbH z@X}t|Ker|ys)IY@_$52|55Cz`en*J$1ql9Q++I|{FYTrM(Qj+wo(P{NRi8?|a;De(!Vs-T%jb#;^V2xB0a{_ifrw zm^c5QhFAQTKWqGtzq{~n&f*0-+qPK&C6R(b-(X73M%o=|ax*jt*X^kF8q#w<)+1S+#mL zX!SCM5Q!;MYjw+Ls{|Pl+)~J8pm@N)AUt5Rv|4ci`3RFF#C{4CfOhqkR5aDJk zYViWmzSZ z?^&tTsFVQnVW1L;vm#bqeQAP(3@M|v5JG00UUN8n#xxy>Id@C9dg+V){CL)&m=~~O zjQq^*8ysX0mZ%7C^c~B*(%M3sD|Ybg)v`9`r4U1)R;8_tA^I_H^PU_>0)ZS1i-JXC zI1EID)0_8{T9K5gO*p?f^XeS=T00Ov-7`oc$HDtY1%Q~-jEIl+B7f&rB;HvCA?gNa`r@-a4UE(o*RWRBqGLASLV91a3T#O zjb7+Y4h*5n5QGL@_1}AES5}#MKM4Ys0&2N~oNgJZ3Tsq^hKUlxM2cKg#)}ChxMM=7 zh1|NbM_kgcBHfPNF6vSX0lBC!xTr4KimE(U>X;criWi$bHP3jpRuLL^hl!iJNXo8c zO#wtB%iMT47m6B)Tfw7V03B@f&)*bXD{X3SjV*GqLA<^X#XLuN)kap3Anc}zVK?x} zt2>7J2|svv$HVavY36pYA#&Dx?x(=AH}beL*GIl6!f9U6xA*Y*8|?9cn^MRojC8dk zZdE^o$SwvxlFT?lOe3WxLYR=%0q;o~j0aSewRE?G7?B_sMVEx(0`6^@noZl~8V8aq zf^3tmS+{%dZWW=EpL%8{z|J7nm1$jB|IzQFGq4RzSwCcrl?Fua<(yUukghW^><3lCXnWoA-7^x_!Hg=Bzn>s103U!GLs!XN9 zsqwfzP);+YlaNqjX)7zR%aH?-vaGD4H6T z8ZWov%+G-S+>sgUF>X=B$p*4nzdBeNW4Hhx7xI>Xm4qRPC^=?|8AaSpC4@j(&y=!I zqhOj4tL(B|p*vedC90qpTm5(=LNF9drHLr!8O;xmoaQ518;6vcrc4zhn6Oq?YljdnYCWU^ zPUe9pqQ~}L7~~-SxohiSRG%BF1NPF?0i~QF7^yCd;#RCd6kX33<$P0r|1@M$O5_j- zZ6=CzWi6yQ5Zs%WW(}(aYDKEL+d__r1gsV6!-@Iv0bPm%DIJJXt*-C{wAP;8X%LM# zMs_#1$S^X<2@8>sCZsg#+lh03#_KfD(!@MWY|aE!2Y!PzbQ^QFdDA-iJN zsvVP$BjR&ch+f~>RL7e|_+`x4*5LiLRj&Zw3pvL+;nsZrW#(j>E5c%k1^f- zL4**6FpP|QVO`%L3=SaY9Wmb`x4c|=3# z*X;_d{Sm^pr+XnzHb~L)pz%3H`ZFt?P$70jP76=hcpC?=`|b7qYKu=H1|L{LaGUzg zK}n?VG$Ka3fWV5ssch>W3*?Z9!5w&-2*s3KD@_t%ykXcm_*+WBC?54zR?2!pwfYn* zK!4r>kkx8(_BsfB{TjZCJjs_{^X$HV_pI{$xocI>Zm0(*9T9~|oi0Dfuz+*;@b z{g({im-a7ibCrsd2fe_yse@nIA8fk-!J)HaUx460o=rYb1z&AiU)oE1X@4}@d8z!h zzx93o>tBDvU;M>S`T3uFbpZ^w_VrKq{Ja15pX9fG_nyD;|M>xrr}ATu8CCh^U;9md z?sxt%f9)^-dA|3xPky3vJVoLE^3xN)dN%%p2jerf3*$J5^lTt!po?{NF6udCb<1*f z3)`kfkc{HWE`m5-u{n}JF9`Tf*;S<(s9l}ZH-P$ZlkgH;knyZJKH5Bce+=kiH z7wQUH*OnDTA~6X$MMBiBj)U5=gDIhd%j$Nrr}-`C^CLw)S5A^KrU4NzkeL}8o)jQY z!iBy`?f>tlh@I;07H($Rt6EBtw=^4xHc>Trk1pJ^1dTST_L zH?rXOy!Pw173<85m=d)rYg>sivKvMYx35Vt63o@ywJP)ZObChT=9WAT2$4qPW;c=3 zh~(kw9JLpMEAPWSrNK!Hk9Fm-Jn(1>Rc2yT)B-_Z9~_tyHP$-wj~;%&KYlb89N>}F zSahWXMY3B@?{@=l&nKb;QVZ;oaI@R78%9hMD}gcWh;d}Md&M~15JMu0t0_ZNHnqr; zYNXr8nOi;XL*Nt>;}FRE#4he&8HkSseOO>TFs56UGIRgn%3xiDdM>me+#Ciz`sg#- ztgQ3G$G11s*m!e(=l3`58Sf+UekDv1_9Lyi!tt}+9q&HLpb2XcBoiXonpq>vqLc~p z*Y0?=4@h_e%Nwfoei0)YGR;eBy^!sM4-1AQ&(TW}Cs!mvT5v1G4y2#Q8%oMFG2-hT z`~8_%Rz^|ob_4qH>#k%>ggjs=Vd_McY@34NNdc^z4=zS)iiuv-H^~f15Q7o2A{lg@ zC?Qi&tgGN#SxKhs(vB7zLGo3x?sVmA{5Ci;%dWY z%4#s}4h}kn>OgJmBoq;(8JqOe6+OM^9X2KKb4yGSxq!i2YptOXLdxvY$dEF1EsR6p z(~oYreLa$rt9~RxSu2mnnbYh={FDlK3auD3GpV|*0TkgWh<2<1EkEGq6`6lz*<2~otINmlye~A9@9%-3WVRt-}=b6+R zuWlx?2}6jkUJrl>yO`O<%x7uOV|ak5NFAx7+|CP!Lm{LEafBASeeZTXF9pbyH;xWl z&05+97IquQiwYE1O7a8>#1x!(vPqV#5oqkPGO+L`G~}P-|roNc)c|6)X>= z-41evvy*Y^T6kF2USRLQs)3b4QqcXxtNln$fwfjlJp0*6T9Ai~M1fXGDKLzqD=)1= z43t(0mN8ROzu!5hZqe#D{q-<;=A`<1Cv<97P+zkk{v2%UmRfy%=WB{c2u>{Fia?fg zX4plB-NfBtz-%I=#8QkVXUv2+1;%MdvdU776dNW1ZI$_0Nm{Trb4YF-jua#&v=++w z#BP7bC%3oU?Dnkd%<=TV_rExjA7;uYjVd#z)Au+GPNdViqTTK~r397;mdNFS+zO*C zXezybd-Q_YbYK{%{bhVZ}&`g$Iw>L6^SF{k(Izcj@_xmRkv%3=zbzk z12F|s9G`*e*MPw_i1edf5Ii?MQc1Ua*8BIghkG8^LaJan5yycjfoh%y?aytc%x5I# zi<<4C^t{3_LMK3Ktz>QF5c=nFwdr|1Q^rJ1#!^q{X+aEHU75=Yb#MY=t<)a5;p%el z%ViW85-}$yfn-5sA;iLJD=vm1$pC5yW_jzl+ zUI9ueFf<5;iW7Gn&{cv#kcOyYVziuDr->>N!4OkISIBSGaxt77v=JM(d$nCV+b-tS z+=hdt0Y8W~F8%Av_m=1X9s;V}=^*$TF68XOj9$xUQ;>(ixZkm!Kd{if0;@vs`J{;h zaV|NvZoBUw9#_wuTA#1CbwK~D-4lXlZbNOMJ33k*na7H#X|Er8AJlFB5LdlQj85b+ zqcw=lYrIvAXojd01ucyX`x~@2meZMR9`!>Mhyy7{S~6-#EE>sq-w8s}mDA7Fqt7Oc zt9DU3Z>rr07JGDzJ*~&=>e_+>mSMYx*ZsNwd;wBFxF1Nkkm4L*b*pwH_+Aunb*`~( zki>*Wg*Y+n_T)Ud2T!X$zNbvZu;2i=NuaGB0~AsuT_v`g$>o+OJr}fhHy6LHHjwn3a$3D?Io}QJjYA*or zOZx+B7aM}GSq;3jm-dIL`NATGUdVj`ga5fSRYlkJ$r}16RC2wvKfLXt3O0LD1;4bH z_D8TCPlf;dZ+w?u`;9mJtH1OaKl`oQFTLj5KXb>Q{OMc%>tFwZU;VqEcN^Is-R>Ta z{FVRcSNQdx|5^U#FaH@z{>ipNzqvF1x6_G#|9#}Y`)(_8xRoKXZwy0MXtw6|adV=suY70?2gOr?t&vKMEt3-iBGy)G0TY*|;g zqBd2q0Wl+|jOpqsr6%MYNXZKTO$w$9vI;RpBCgz8%gp@v!0G&srYmuXq%d?41bVuX z7tedP)OGui0ljUcAv`%nisyy_G>)h)tnEx&l~#MkmY5gJc*>H#ObgeKhHPN+^Itt} zrae>j!qo2~3s(aI2_&i)PC^1nZm*3iq*K@-7A{4$hJBE~wiUj;2vI9EtyBZGem@l| zt=mNVnJB&9q2j7wVplK((lGWbW~{2z+9+z|=()e+I5K9x_q*tMWlaLLxVj?5E#J~r z4d-^`&2rECGP5*8hX^uyK3~se0{$(Uq4&4wUj`8_6v@PSrTEQdl7>mVIpyBoP)v zq#!zw#z<3PU1uzMVN+rvYT!2Cu)n$Gt-fWM&wMoAFy+ks(OBOvtRmcc^#w-WDQc*`SIg++_oqGneM8q| zCucyk6$wI`5_!BqmmL~i&X{r{nsIvj1?%HNV5RI_`RN7AcDaAeDoq=j+>X4evZ^@v zT`Nf;r^qV}RE5@*ciMPYtpnJRwHhfVnnaSRgGpXR^E_^~XJaKOBC!t#b^)m_IfjA|f2P|UhdE-?VYEWWUG!?WM z>*~eeEu%B`^EWf^_3{CLW9|^325E(x;T4B$+#io#@xR-_VdQLzjg`0*cBjgXX71vS zeHzKPcTD>OHbtWP=WGI{D`c_>lL?5h3os1HkoKtJL zTrZ!Oo@(GC+q1uo!VdKGI89n}(m|`W;{b-GNR3MFt^lnm2_*$1w8-Av?sy2GRautG zCUuf{;REZPh_cX~Y!!xUQ5^2soHO3LPxL7UPK|m+!ior` z9=j7ngJQG499wu&X2lDG1&NXma?%AhCu8C~3tNB|&%&&6_p4CfejM*Rs z!Zi6>K?De>b$5hqtm!JY6d-LRJTc}{$;lYQ=){TYE@=`X))cYm*IS^b$Pyw9kt`l1 zu&t9fn$I(Z*!5WVp|WiIraP8cNTl06yBt|^VE*DQr{kGJj_hvlXgSk5$QDg$=QF4I z{6vWR;P|1>fh`4UExdd4mb)C;e|$@xCgx@3oD@D9&|Tmmt{mq_9+uT}OG{&^g%m#W zwWbJTj1C^oD@~OKJdB10VF-a7Gx2n$w#u**(oLZ39BdCEkOibP&hH;Nzk5%8_nuIF z?K=bq6MZS-V{{N9#dxt%cH%=I5gw&}pF#T1L+YCLrkL zW?a;n@_dQA{q6!HUH$TMfAvWTX`$!K_xn=2>NWrt0wFrtW7ti!F6SNk%vi|f%g1GnyC_)Cv0i~^Kt)jJ|SMM z2{uslDk4W*tuH_=#mAJMF&#D#SLs&v{yLLzvAYhz!QW>pLe^kusb{Z1ql9Q+~h?S{L)_9ALaJ$e&Ij-FTTS!zqaRJ`{l3m$w$+(-^U>Q z%fIj`f9hvn@hiXjeg5Hhe*b*nKl7Wv!?*tN5BPuo0Ny|$zvW-zyWjZqCpy1H;Q#!( z@n25H|NQshbql1tW$^g=pp`=E;9-(Li4HJUpjc;#cXoXYMv6+P)m5{tVNJ1aD;!cF zga|zc>!JcPSIIhPu&I`yZWg;dVRLGm0CTwQnj+KD-w*DJV&UB(R87$GsVuV z<$>B3Bj%2qt>5Z?mpqZU)hwZ>YELpMGvUS#MtMG}4O{ zZYK?51yauuwS>c;83{jr4zLgMptgIp6$4_osQi+Gx1UQ40m6XAMB|2P2@q6V_2S@euxmBif+>PM%@}xaU0tvMlc24U@E!X-wg#9%e3 zif5^XNQ}WPQD@_3%!kV_b}^15yhT9f;86_MSt`kcBo^ z-n@I@p{?B4dmigs;tB2!cmA1Al{_|<5$ateh>>$+$ijJO{LWC>w}Cwq1Ec2%lZefT z%@_ps(;h8}d+o}J?O9Vpnqs7G8E!ov*KJC3h@>3IcrkyDfm$o;3I$im#8#+_7wT$T zQLC6KBc4k+rIGViZ1V79B$^W*R9%VFGjX{pQa$Ud*830%r#JY|8h5a}fx`h6h&g%Y z^12e{ne*w)0VB^Ekm(e)8F|tqTsko~k(oiiP8;~X}Ma(j-88s(T^=#_(-OBvt3ozqm7#JlW z%gT8@qpHLjJ4lwhb*)>Hx1Fo2Qij-FO@i1ZQ?sh){RTBySJDRR_j_6C#c}mHD~0ZU zVm{YdS$ck>_cQZ^(@xX?XCL_Z6C$p_H0!Et2ShCfVDPbu0f~{dowz@pdNe`-l$->Z zSl3EsWfv29*s)q=vBseaRGf3RsC~L{Tiyc(mY2Y1|_Kw zsN^!EP0^mIEj^byg-8%#DUAhXO_3Ianj%$`=ev?2)Gw`V{D+SDUdH<8oJkN$=jF$N6&1uz?-+bS^bHQRn#n-q$+v z4W?)$7IJP(U*97H9z)|nDyt}2GAWP5A)>`eC#p_R3&E}Ia|q;|SsG}mos`*FPn9zI zTs7VfJm#5UZ~|pgSRYRuzj({?_{hG3rbIF8^I-D~=GgCr8OelbZsk4%VV-Bs@9xQW zx4ha%&P7?P0*Y!S_I!1#fvE+8G%$DCP;vF6h!H!8XrYs)#Px^Q%0CmgKHh$RnXf-k z9d7H{9#rD6azFo&A`%0wx<#*AR~rTgB2x$MT7M=SgcHxV)y5zW`ie&6EbDF- z7eX$Ab%zX3j`%X>^?bj%sfNF-;HR%O;K}6(o*!>pH(ww3*?C`mmh1Q5-tz?jerf+q z+7n~t1(bPdf7IJofWa?H#6PfRs&4Po6~XcX1pl#a*Q#LMfZ&(D_|jh5ABpzeADsBV z|A)WLzw{^W_*ehJ*SOi|XTQJMXa4Pfk))2atatH*8RP(&fw%HuVNE|aE z2gan-wKxDgFWm-HF*QtLw+eh>&Tsjx;90k8TYDkBuv9;e^kRpqLh((eSy%BS&-1;% zzbBmoF)LMrzb^p^4Gjy;9w}|c>OE4jTRm!`ER|($hy~)b2e}8JRxh%NJQY2BTyB?h z->kB(*G(}+w#-HAMK1|P2yQ3cdcnY=xjMN9OcPcUt%2F;$1&>(mOP&g# zPyf4Cc~!6xYyx&@i!{1|mVj!5=+*3P)4gTb+m_?l|J|$Vg@$z-;Mg9USMklC1SA` z(eP)jHKP@!YNMH}Jo4b#)JX!`0;M!!YM3e;zj!NlIrt838hChEc=veZw62&1L?YUh zS_)z(N}aL6O%!WYhUmqcvdlcTN{lP4 zAyj4)qE<3)MOdppFR>~+GCN76*>l}gGRHiSN`R)sB#e1LdM_-o_VSUq@mG zwWPb!8qssuLZUHZ@s2hPtlC^D+&w4HrZn-4#TMxOgFXhfE~0Q%iZ*3Pf|4B64v`#$ zSPD`rBrj;L7_$hALG`z^{b)~J1~5#gxg9B z3pfAxHRWNUt&LjE^YgM1H`R1;g;NsGFs3VGODQbtiKRB)>LZOveYIm<&Wxsv6>bQG zw+n}1WKvkmasg4+rDAI*dvtR1D#j{ah>xoS#`pWgtD2w%W*eAtf;IB~yAPN=vdT!# zZojRq5e$at0F^VHVKlAh2q{RCr7kYf8?Ih}$@;1xzBPDXSd1 zrM6*KSz6_>Rcg)*H+%lntDmEp^2yge;p0zUlXE1;ZgtwpI~$SbM}2MQyjc;;)qEnM z`m?M)Z%M1vx^iwu^t>?Sk119#j4BO6hcAkcYa|C!swul+WXzsbJkK-hJR`eEu!V>a z@<7Xp+2G+=IG)cOvOzS02FkKxwIMl>haJ?&?RZ12mDq_qW6GqE(b5=(5#xxMD}zIT z))oRv4vAV zE$c-Yc+`A34o$ z32kt~QgjuenV}SSf-&n#PIq^y1~hkJD5e;JVJ%pUSTc8784|lBjOtMralYr=DjE`D z7<{eND$8<0YhfOC6oDl|i2_}X8d@M|&spCxL*QeqBH5!w++DPPo_&j7t=Z)a3I7DCT3zrW{)QfT!P(ij+Xph{zH z%`Ihj2lhi|u#v=$nkGg)vYcnEHFwgejpaO}om5GCoqd{2`gwQRW zn^KNv&hH+e6?S=`kg(cl>TCNL`ntZa+q93JLA+1jpC0+{dgA7zkGc7&SH$TSljhm; z$yLLn3ZlYV99(KaY0~=I(;xoO9H4E2_Ydn{I?|QXbg=j8x_%W1`~(2o1pt2LaFG*I zHkER>r)|xNb2T!Cj3m#^F0J+FsoUj?u+D|^*-0kD@RYM&N^!FO>Vzy6KPLxi9q0`R zVHYmX;2*f?rZ*Y z@1xs%vLVUx^f%YJ^BZyX(oZ+S=!eJO?r$dz#~5kiYh&wfL&5Bssu&^`o^pV}!P!!k zc3PY?T1!W9y|33Ggfx&OBg+|GPN-&B7FujjmOkD*f!Z-7j{>kSkNMkcHqbVuM9Kp( ziSIE{zgC?{6R+{7(CG~u$?Q5Sxn8+weLzUNTxWX%YcKy61-g^fc20D_`a`0{SAPE$ z_x`I0$v$^YXzxdbw!cVLQUIYAJzX`v!7XE|B%zjm3HLUg` zMvTNXx`kt1sHG62kaJ>~lIOgM5T_k+G{Uqe%rmFc30+s8>rf=D1ez;>XuLf?u+B%Q zg=Id$F1qDmTPdYpt#62Jpfp#4m_#qGIez5ei&P{e&jD4atzi^$3gjG#nyD;c6(pc7Q);)&%dKav zfoX-TFeO?sY7=srC=YA@tkJ<|>x^pM7}E6_tNWS>?h3VD5J0_1XAKnx(FriHr&^%d zKvmB}Mhb-Dd05hOu>iq8gNdQZ+4f1H6$KNlD(k$mmf~2dC|L&w#DZV2i!zc*h(=Xm znld>@%#hA?t>oYq&%u-y6QLhFDo7C4Xxww+_tHP&zN|d7 zg}Ketc_tPZh8@FxM?5bSYpiQSQzNGl>$%c7PkdZ&cop`%-raC}d*B=j-@X4Fa%Pf9 zX@$dV=#scO48;9`RR(g6$Wn=A@j{sqdUP*02qHvr~v~=eEcxDhq9%t@k;#J|mbrng< zJjQ`VE4T9mL!*Qhi%J~bio6vVWyeAyN@R!wlQ^l|iV*TVb&4LC$KZ8$G3##k=F+=QVvY5LXDMqDvYS-w}*i=2dpk+Dt9sPy6%}o zSwh2xK-%xg&0R7iLA~4YX=}j1mY5N`Glj-L4vi|FVe50F+uWukV1*oo(5fqzqj7AN zTAP!BE^7sGazY3CLi1vN6Ssa}#E4>^3EMVe7?jq0jxJB+zKukuSM?O@R<2de=S&`G z0n#uaaZecb+z^@8)rm5!K;w8kVzwuJ6LxXOd|Eh*@OB@mAu-(USQe1s$m3bbyRQ>= ziHGvQJUGZVghXh!gkp^AN{dHYijkl)rog9db2^mJpe5O1;fC#5)&vLlMhNrbm z!oX^G2-tEa1?~U&I?$Ixs?G0TdWz84R@WEegTWecdtwoq2s4e^!TZ=e^R$?vS{Q04 ztR-O;&xvl`Iz5^aq@u}5d7%kY$gI`L5oyQ_@guU{W5>Tw(24n!(Z?NMTMMuA%IRlb zasTnRs5%kFh(jUhXH4cQTCoDP5RVTW-@fJea75m}V}EmC2}((g6b240P?pNsgvy>! zR&MWqz|QW7sS#tQt;(7QRxOn1>!~5T^8~HAO+P{uV9Dv`Cp zkRr5tiS*dc{0V^D`ek=(>b>jf_x?GmTDM2G9v`#WGAkiP=T7u%5kj~C^uWbdc_Rgj zS|`JZlO{28Z6s617%4O=Modn$Mcmazul7SB9cV#t{G^9{ZRaWa?3$*i?t35ImQVq{2( zgt4BEPTmWK-~=WM0Tt~Y-;tm|bkd?pbkZY2LoR^2Q(HPv-+||g8ri(hvE70z3v=7P z*XLxh?X?#W`ZAY2k(}h}Sqbv|`Ee4&6Ns%B262CxZX}NW^EIR9E7}VH{L+4+wpp5m z=!KP+_R?P3)}-4*_3V+JQTo#U*|uvS_{AFfr6EuD(3?%$OFw*RFYOP1Yt8u8zxO%6 z@ekkemw)-|eEVnap8Y-q;g|l*C;Z%>xZ|(>SKs3wefROl9&dk|`FH-~zs}$LGe5`Q z{N+DGi$B@i@wW%%fAebPKX{w?(~G#>80uMmE3^P1x(X(xNFIlt^$1|pdPGee`thY(N~)Tx`6N0>q}nqLn{TAe zFng{D@uE_sX~jX+2qC%}DJdzq<){}9o;I+mjp&j_%seMB#!QTvAnKo4tJ_!-UA+@C zO$F0{kV!F+lTg-%sTYeaRHC>-5Hqw@hOUaa*xYUBFXkKgD9;$}@SFu6g5aLpp(_Xm zV0f~m3nO9~y6yDF(BC%TTXF09OYovkkc4V+rns8hKI`_}x*|$KKrV&xu7Xf6rkmK4 z;^dL7sI{i zk2YGVgb)#F40k)^Ffi|g5`}5MV^Dj2F9FIrdy!nE|#|Nf7@$v0z-XD)VE^E*E9SEb6qp`?|U3`T^&#}|4DsLuebnDSnGtfcx!I-IJA|Z~%yyI1Fgfx;uAX#OHG7OQn zQ#3yk^-OEc3t|KmW7sEd<(73->hJ}_cnjQ7ixlY6Hy@wHa@}-*}wQym|A6d^j-f6QTiXBdSnR za5yd`hAzR+HiM|Iec{C{L$F)i@1jO@pOj(8)I80swEBx@tnLo_BgtVXLBx(o8WLXE*Q0q|waPM%t~E zTN7%0n%g$3YBi&&TSlMm->@I|tOm#9OsUGppWN|{uYaA-KE7idM{2E?b2F@~>AEGk zL?oCOl@%6s2(gGzaC_Hipv^P6eIzhKaQWBFJt-;@R~CI_)+5DcEP21KZGI{S8`u_E z(1l)B`}S3YRx6c;#fC;BOJrvQAtu&fJg${sl^6r#F1vkcs7~~WZbLgNB!Q}pWm#D9 z`Jtf{b8VW1cv0fF^_mdn>nV{d0H()JG>lpUr72Y_wS%>1G0$b(a)qN8@i&!e+V4G! zvsLD`U~#iCPQ(~Ec88E{yvN_T#bZdA8h2x$)yBE3L|V^V7j(?D zA(7VtMcE;QAu-ZO%aNgt+)xQaCCdym9QHe2Wf+rN9<1}iyfm^1Qz?DD(})cQ0wpdJhPk^9^brUe)pDi*pa3KVaUjK{Wj3So+f)U^GpRmv@6%ey-K$AL~57C(KD;m zE#GyO%{o_oj8~ih)}N0w3@F~WvIJr?mU(7*d_d>5TdZG!Ub?9wHvnZM$jW{XyPS|X zk;Z_^#9D>r@$7CXF%m*@caRXA*k(oy*2#atvvZrT52rlQK3X|`@xbZfk$|xqN4F3z zPixlsSdda78m$J_#R(xHL~=0Js)W|ZuZlzI+WPqf#Pp)(6mv4mIF4vbEX#sCd_nqX zPu>rVyNNjjs0D^hoCaE79|)C*lMXRMrBS+d_@>78ukMs{y^i%iK|6q@eLNL=0{4GZ zdk$Vb#e?`Y6?Z-8{>>4dRNdVwI8C0Zo=vdB$Qt4Ncq9~$hKYIf`5-z$Q|0Nr4ME~_ zVDvh_7(iO?ZaJIE(a-6!7EDeWODREjCAEv%RG<@FV{i)u*+5it_nEhkM_O=ain43dzLXy&R?i9N!lHg{9`eXj52vs~>vKK%XvuL7d4Qj}gFdm9E?R~Y+0 zI$^=K@gi7{8TiqkL8Y%6p*7@==&%#2oiV%wf2aF-a-h;wsk{Cfsit$&Cd$~b8@o^Zu?Ap2GsJwo+x|;hIP4?7Wx^0>GOHe zNfl4m@Xe?V=sh7KVRQhKKJd1-%4+g6C*n13%;?Jw=6{h@ECbLBtzYrn^@ z|AV*u>wobZeDrF3_WPTC=CAx)e}doo-FtrJZ+)NhQh&sey#2zj|2E(F{^$H>|Hi+} zyH~eA(Yd{k#{c2d!oNMh|M0C6wV|ezx?B{vF((HR>q6ObyG&WC=Ra<;nPAOLkWpj(R zI5@HCIe>Vjz}W2gt_n2Ifbi{@bh}gQ`JCqWJJ;yy$ZE8uQqPUD1f*6@tx#`;XhI5x z^XH8g+>$wj%3FQl&3dH1R|<{ed_oMG8VlXpw;8o9oWsg_n0YS)!!%NI9-(^K>P&($*ECXUT=_-u0ZnbuH{?H|DWZYxCjqv;B{Uc78cXsn1RLpHY+O%=1`MYP}q3W*63b)^uARtwEMZ?dhe zA3Slcl|*%QCeW-As$1Cw6(Yt^&5QCWFx^gQ%Vd&gI9uT3VP?D)YD=_g?1zOUP}ES~ z^YwhoeK``+NE|25)|fL$PFRh6k-p*irWVmuNzE96qu4Bn@jF%AQ#wNcg+weF}xq}l3L`@t1!x3BJaSRPo`f=rN$u%2hu_m8kB z@zt&Or4)M}qM&6(SZOSbt&&Qk=}L+)91`_Lc%P3vhDX+&@jf2er^4563RVNlKJj>y zu>||vh$*m}ptizkUOBHqr~`Qs#1{0pQi}1Ap-k}pYXjk12l)EL?RU;p0*h29&uGJ1 zV+;u$511s98S`?_vOGA5`}$+d_RR5-yB`>~6vom>A!0dFlB0wDjVc4QKU zRzKdDecGIt=HpQw8ODj2l9TT|7dLaLgsDOeG^=QYhq?0R{h4(wEbq^($1}T}5rGl|W3em6+S7V&v(s(usec3A z^85x2yl z8J}`1V+$l%*&iy?FfuQd#tsRu+<9bqhlb>!hdOy9cu&Hb((LSOqZoQlErd7_4+Db< z413O^)Z@`>MH>+^M4CZlpstPizR=c3f@Y{n!WGh!46b5TC(wkDJ9v3TsxvMb?Ezso zPLvv0=b3!}IePPTm<9~b8P3hg7;Eg=&I(v_B2UlWZNb;{N&K$3z{K-k1w+iUO@lmH z(MAl#^R+J^F!6G)V_)+>>+6@#@dU)m_PrY9;2>)VXdlx}%^d*DsM;Xlxzy7QLp0W4 zw8bs7HFknx+=z?<@sygAqDT>O;Azq4?&O+kuZ2hI*`-oj(;R_*<)I}ecSd$R9-zMtet`MVuoF4I=Oyw9_KC43oz-OlNH40*b*;o0w@Z(Xm? zy_4Ad?|wW!_W}UFw149EqV|1hFYPC7FBZ{%&`nj*b?pFrd;x-A+J%ro&tufqUI-a4 z?WO%8Z{PjFiT~UG>$mxZKlKrR>Cb=4ke{>Mzx^|J{PZ^t{K~I>pWpn4?|}S z|LFhuSNR)%=@Dt3#Ng#H?F=3L%p7$T($oyNPkkt_YKn$PQto$Qf&e#THsSxlLhkK(3Yq zni=B_yL88p0y&K=;Y6G6Slc6y$G0r?NQ_1dPlX**>FS8>ZiHR{X+R)!^)uThy>I@T z7LVpNw-yzH#J~`52r_vgP1OsSU$L%mm`X0S6}LN8T6LhJsppI~bG2tN^{iBUk5xC& zU+to<@M44Wz@HW0<>|aHitqmV4FtYc;fV;fsRN&YQ|tZNNFk6U^2_sQoTTyA&ir70 z%jtY1hJYNB=i5c0)q*r5r^J59*br$}sk-vR^$m*}$CGF7jV%x@ph3`aplI{rW=f1X zQCsEy_>RbgCKS$+U8FyXv(2QC=t8`DK{?ztbZzKEW0%hCqp@($m~Yq}gnK=c+RBh`z=XoLdhTae1ofP@RzXFW z>VldppejbQNU=Z-fgqV0dpL0x;3J8= zUK@LL1^k;Ecz1|Arp8=m*3q+|#}-}PJvU-C_G;Xcspr5u2|V5f(mo+Kjk;IlR+#s~ ztM3n36I#zIUaKJ*7~()e$(q;=LJDVeZmdC&yeEHjhmD^y>Lcaz_k?vO05i&2JX>-Q zW9ak1rkc4FIAb7(Kx`2UUg%|0@@OMkV-#ab-FZQ~dM7$5CS@T;p-~8}(af_HV|FE# zbqoBx6$-V3G48^EL@fAty!gX$0h&ypsS?zq4>Sx8sx{&8(MNpaTR+8T-};8D@JeNE z!rI3@*9Qd>Zf%LU)oCIS%`=?qT+y=UPW(Du_n6YmW}zu4|!LV`+_51|EX4VBECE&?0LL90{CS zaA3-SbAkIKgEnHo$LLbI2~J!(7GqICc23p^DYIJnQf*?JUwnL;`V7a#?ou`qkqEnN zw6HoUrg}6$-N1Q3*E1oxi%1eUj05}K4uD!KWAifj^_&Jz0Pr~Y`bn)3iDZpL2~H@n z%9~o5(&$bT0&8{JRyHG)#;1oJyAT?Y0`dST)T{aH8 z#xyBqDZG7G7;g?7Uhk1%K}?8}h(ymSZ;kHL+5ymZc|O!U7Zf#;Bv%T*KJYqxll$*| zpYxk{3 z>C0NEkB?aW6eCks(9=qs248O)4B|Gp!Ad9nLG3XnYQdu*Hhu(3vJL3l^2@b@z2TzN z7QzJt4sSkT`^xHNy-Fi-PYZY*;->=SMqL$r0B2PKq(OieGvw8Cy_-fEhOT8 zPnu_}G^{pk9MP`cZqb2ci7wWtm%ea4_E90;&ra=eKsd1{Ckz?7V^notE!#G>1$jGzrRX+Ybu*Y{He8| z3?Wjh6EZ~Hp}|Up6fX+mjUy(y5mEzAK?)rtRTN*_nD`T`(bdZ-XVSPMH{0y#T>4?Yc<_o)OX&!7qLArMipX-x(AC`=7q!fBL=e z@$KUyQAW4W?72pp^`zS|3mUTTK`-i{Z7=INRLLB-i(`T)td9$0NDSkyI~UJS*X3fD z`_v?C%3S|Bgbif&!fWcvC-Cj~h3UNgpM@0MI!#ScSx_^oSyzXwm8vL55t12Oo)5JLJ2_aL9gKez_;<)2>^kR^ndQPl0 zYH1&^xwkpLf2OW{_PxF$jv#n8lM0ffDe@>5gnWXo+)OY1;oJi0810t1!}) z65(>)%$23B`DaphFJ@_t*^ENCScr+?_TOfxIKNv&2qpvxE?7+t-gkW-UM$z1+o%`N z*GUAa+lz;1=R$DhGh5LJkSGi>^DX-tU#v&8G#)LoM!{mCP68<)YeZW?&0I|`LWqH8 zinhvZg(6U*xkaKGQeEMvW|)`FxS0;Tn)W;#A9#HGfbAmtSGVMth|LScs24uHxapRT zVf1?#f@i&%`TZXA#PDil41*V|t8y47UhVIw$9rm3%DR#@dBF|`95!HHM93)-#K>vn z^)#Tt_`&gkaxP#4+EyM?^z7gZ_};D8qbmt-<-o0FFX&tG9P(p99!{>V`)26Zt$$qs z_^J+MO3AM5lt9dpDQ5?~;)oiw8qsP*6{fD}S+!EzOjcnUA}uTkjd6&SwGoRjg#>Yr zNFeA6bwy5RY(0}=04hloY(Qj3$~#1rF&1({kr(r8i0 z24${1wt(b}BFrt&bm(hPf36=>Wf=y_J`-*RQu6y0->h&yv%ZOt_T~gm+ZA#@yk)pk@>7*CKnjx(qS-N$n zE8LOjppv@$nKtgE14CTct_l_SGxyKKqP(xaGJi=k>%)rj$YuVQGe)X0}XTRnJBoVnR@s zb!A=~=O#QZl~OAQ5n7DYt+jH-lMSsLWzs_%Wu1glsSVoZdXImpTs8-?mlEEpjUtRb_IICOh# za<4h03`0VL17kxT+|5Od7F^BULdMLPn~|nQ4aS-VbQ-Z79aOAP*MdsqT#Z(Y6oo;$ zqO&&g7V>&o^*9;B*A@Qnc~j1B@e%!Z+nTSI_N?M-W*49zU|y@+IA&oCEK5?8FrSBM`(F|8n#SFd5WPb7&voC4>gkoS{kZ;vOWM})YI>=l^O z$D1F=GgW z2+ab)mTuebt~I)??Eo?D5hjMBL>wITb-IJV65PRMlXC`p>SF*g4?YHT@YjN&RcYEV z6GCf__r|C7>GiXcv;%xisZ_?0*bO@fXLMev&G5)s165*laPDFoEMtEpu80U%?_>S7 zn|s0r9$tX6E3nSjyKY$?>x#q|Rq#KnwgK&7vrc>gf?paw-$@9Bjg0Y< z6a3O%+8^3>UMm0Tul!?v>v!JsZ~QCY7(R5+s*uN?H)*LW2zvqZ!lHIoxnH~fg*+95HdcQ%tU)kWFQf z{w(zWM+xMfZ5Df+!FF%2l^i)|%-lje*TghUm)Fa){jQ_k8nf-{k!= z^Toph>%4mZD8+4KG1kRFC~Hb2vV?%?%IlPP_4>fLA2`it-pmh(!5DVT4@%k#Vd%xf z*j!Z}1u_VYsF`ddxABH%##$a())O)04*LFo+57h|Tej@36Z_1$){4j8J2THY_faoZ zNeBt45!hg4>;~N3#-@jxcDLO>_y_-O{>6WQ2e$hMkAZ14x(67LF*FYYLP(`jNmX^9 z=j3BQB4VvIr+-+ncjh_w-V#D;4@$~en0&mfgV;r7IXccp$ zE)8G}-oPnJYnpi_keTNrZb!Q9Od3vfeREI2Ci=L&C?2~g^xAW~?Ah(Ep^u#AJxJmD zdP5)J@Gx;5?|Av1QgY$r*Ke5WmKv{{-M97ZcM+x8S9V?yUx;;2keN*=RDVP17KUM< zl!bkMVB7E5Za2Knx4g=cY=Js&DEH2^d4Xuhaq2i83ll;Rp_U`d@e{<}aQ&iZ`!bSr zgHm|)YQte~oKD8L5l&^ny|5X3WPs&lln~IXEjnybadgSZlKHj6iC1?MqQ-aC_{fD1 z55g-8T+KbgLa@l877mMXaG`2sQsEQ=Z*ES+&>Fa>2944kGUI(_^Ln9Z#9~j;1uqke zJ5dr=3%OQuELaVkEHmp$%*hKw7r5$o{4iDSc8>31IA!{!GSt4gCoGv$cUGDxakcAg z=U1D@vL@mXFXvy^mj+a< z_kyM5rc7Js&~VkSnY9JWrCBy>M-^$x*I`xW7Hy;(U#U3KNFZ3EmL}5++VT!n+WQC7 zc8y)H|Kirt239Lu5kvKCq1xv4T$>w+qD?J7Wr}FK-bd(DAaxOFSUmaMn+>~!O0rPDN#ZL z$b$<@t%TIGxw>Xv7N|32n#rdlc6U#ZK=G!4lc$Qpv+c7x%gSE6tQp=SAlX}%yXV|r z*0mDA6e=tQtqt(9;3N&i;z+SeW_Yd@pJse1^lPs6QY(saj>kAFka0tUp~30L0%A;4 z&vHs&g%Bb}rPLWi+PYI{+0nZ8tGy{!YxVVfd|XeT?V_nh%`Fr9`n{KEDg0>uZBEA{ zyKX~rA=^v{wHdGaBbX+kMKBPBVeHoHX(rD`sEWi!8es*O#M?O`ZdhsH(WV~=FJ7Y3 z!LqRJl$T$>=Ee33JaH(_kP0y>#~F$RL=vHmaC`-**IkC5)s-uW@UmW%6$EbHxoZ~c z+W_U$HT~Iw`0V&8sw+C@7jlZ2f;rPP5xPXT0)H1p9nvc%aifi_G60@YxinF1*76*elLjaT~O}JfZTT<){#(Gf$ZLR?B ztA(59=E>2mUQC!;Cbd`%*{pr4X zw0eFU1YUO&XXWo1NcVOl{Mb8w3jBV_KKsi3_+y@XCSt#(0)Fd`t@SM3{qejLzmO%` zb^5V~`K$nbu79gKXO%vyeV^;O{{LMq+aTz(D)@iUa>q(p6)P=+g@)!Qh2mI-ue|foC0!UH$E5G~=zVpo;fA=4L^kcJuuOANl^}qS| z_y>RS&+y%!`PLt3n+*8d?|;DW^c()GAAL&iWd)F$-PQSqSXaBNvo)3A=o40NPR2Y& zPUGBck2BP}$~5g+7U%4MePNpGnh8g13dNvEZ266dVOH_AVJxBLe?C=&h_(Ch%T1(r z>&>!aHK3uV>w3DRI5RoV#Mm+PJ2vALn|{+81?o-Zfwo*oF=9M}se;s==#daUZw(2r z>&-BjXKHok<;1)^P-`Vm274en#S7J%&D&cyXm=vKjeq@8Mk^OgyxhH zJT}lHYs=XZr-sC7eV>4?V5~Mf)Z$HTs?I`&=!~J~<+vloj)!u~Ry#fzueg4(<2%E9 z^JLP`-E2C_mK`exUAwt&qOA2#*wblk^*`DobKX3Zdp7 z(bQg~fpO><6Qn5IpC0(#&p+j~KpaNW+Wa57MAvmIfLPbuUdL`v>-kulq7Ff|AR!V( zkUp)T(5k3i$x})LFJdi>Ld)AM5M|Bfq&5J;AM^TJe(9ry^4S6tnjLlnyDGVy!G=iA z2aJHD&6>D_5SqIIQ>BlYynaA(L8IYg^We#JP&ylV)C;_RCqNFY$F;LBLaYC0!*+?-_&B)dWY)ftA9#)m?`SK_0 z^}DJ5+CN)eA<9bTlF^;EtzBnF zoW&MWfFhY8YMg(z2ScRM7{lzqmv%LF-xHhx*CWkG5LX=C4f%^eQ00g9_~&@Em-+spTqwk`o_^U9L( zG%~)pV!XNHIK6Ji!G&2fcylfge{^^$Wuf{)plikh!7*=%4JjyYnR;4KZ_YSWLkXl1 zpf)nrW*CScydp$L?8NrE@^Uvab{+X1<|**44+n}ze)#6d-O0!{<8DM<=NfHeqSE3- zbe$`7C6QIupU)sLhOcfiO*`1grm$v+K3PYdbBmk0cI|$oLRFiik$|X>3uvjA*JyyyC2}p7Z2MXZLE;4vZWyDt_!fSA zU99jg^V^eqwH3fSD}aAL^)`6<2IMZuU5Pp3cx(W_d9#vN)uzbx+O8l9ZlUFg%j!mQCSRCdTtu3)QD&J= zq`qUbyC$l$9G&26Y|ztvEv)wmdf{3=-K}Sbt*861-EXb#w=2oPMG3NIYd?LxaG4(; zb9vvXcLCog7Ta$fE6(HKN%Yef47OLo#N}Rm-DZ^w2yCJkGQ{N=@;JVp0pRDl)HCq= zT+j9IQOUC^_+`>9{Q z+VX$uJN^&f{~_Y93e_+HS-0Tax)GWesAuon%Pe>74n(Apgs!U5plcH+adc&+=07u`>cv4pDKyP_@mMb+I;z|@)s?&u;&<)}n$`U9J zN+l-8Ctm>!y)-iYNt3EIaL)OTYyNMolwu9+w$>1<)msxp17g-}q$Pm1rdP92ZI;(9 zuUIenzh_17msxz7Sv!`i;<}X9fIWl9Ue_j1lQ6HK@VYLlgnF6x7GL+G4$4Dk8g8|*YU<#9}0?RI?aYu{i#X6ECJ?N7KvT|tZx zJBGd|tf2Ylr^3U$@Pqw5n;v}IlZG9qgK@WCcz@V5E8{v-bVf%ZY?K%R!Id}h0W~8y zjNA}Ks0vwONp)>hwmj2w6Y!~GJvwVVMN>d{h5i1>v>ef8$>yG=%NB}s$D zMWG8@vMq=>>VfP+h&^fOa384o9wef}hBS<16{<>8n?+^EmRj~K<({ZBl5UX%u3L;i zt;*@%NUj8f@>6qu4Vu9`0ldF+W6IUT{b(Pp3KcicY z4C58oWk+5jbJ&{)5Nstc-Re`UOkX!C*_6NDszT>J24+l9BbuIlpE5xLApTQb{v*FrZ=CGHS!II zKlAk~>epUTz8U!Bqt|@*R5%=G^2;5z>DXo%x}GS?>3HOD|3J+J-)`yqf$;v-#imds z;ng@jIFnUOh0_4KP0h}DX(T6!E$q)RLfMk@5v#(`MMCT;hr*k~XMFn6Ew@u(&V@?C zL&ubr!%{d+#&L3%vNl^KQA5Ikf>5kd#fc;~h*?lckU*aahq zqESdhBszh#=I=WFQc;H>iKxvH1FtZ*jL%_iV*fU`mu7=Wy9RUtWE$JLmlaat;42rOz;1(Hw}qf(g&WbYW#K$XB!D=7>Z&3<=NCk~4cyVyV`6GSsh zt(=w_xFYo(Zkf5vq;>q%C9{+x(eso2_Jkz00t7SVa?NS^)oaYcIXYrpF6xt>aCq{w zxeztbsUVWbZXibRwthV;k97s?i#N5Tt;$qYkh8KJ!L2!jgrKCb{dJh$yq$(U8l zHVpj@HQwUlm*|wTDwof|Hfvrk(p3DI;k6O}6WRb;gk@Q9hhev+-XEzC3j+~CBf_aQ z)xEE4-(nS!ObBNnB`^#fFLqmoKCzr84u=D$Q^ji=?}0N}FQY)$byyz=0Y-)EAu`qi z92kb4Z;mhd;08_=K7VML-!2^~2)j*Wn*wi6p#hDy#>d$CE1&Ndnv(Mj0ykQTJSu8M zc<0o91PdLCLs?yG&IGj(^pRW`0~$lK4!1^JJ-yL282?Uri$&_W4~9o=yET@+wi-{fIa7y34XDUE@0>UYR9zQ zkJj20@{gaQ4b!ZT-&3_kz4&@W?MyUkp4HTvndg}yK%PAZw%DS8M2JAo#hS>nE>1dp+@A|E=%wXMgcM{wKfmep5THHTIFe_E&z2fBoHC ze)XSx-10iVqW<)+{T458ANcS7@}Fnv(pNt3-=h6I^hX)~t zf*wY~0BP(Aa*ftkC|hcn$zjhld>PKjvBVH}4Ei2}j%+s@svK}z*xMer$TTf@?O2wIYD6Wn)Y8-$DPUe8-XrvQ8L^V+ z`oJ(I#!X_$g%}em#t?-~4>2`>&RKID5kxy2r({7&%TG)`6DTal9!kJV=H!Lr@;UCG zwPuY7Gbc)IH~LvJS|fez396K0NSZFBe>eka4fqvp4Tr07i`K~ekhx!u#1J^;f`vdD z-=l_(eeCHX^l2uk;1y0;DXJ7AMr;6xw~RIQrg~9tN+{2ev$bZwDQ?Y{8S@tFh~m|# zEQm%t!0egcg(QwhAqQAAV6N04XawmLlZpnX>!21VvogOWBHHXxHO5N=*37{w5v5AA z-t0olR9tFCC89AQb0x%x6=PuFdS9u>$}u{X%C7J5P8d`vbEPhY*mXoz%rg>|$tz)W zmQ)y2*m@v~a0QZPPfG5^jg?j;HAHyoRmo`HNlQbR3rAr zBDW;jlIlb#1z9>$HTF6(uc`*Kh1q(tE1pl};|`6LO;<>MAS??-cI+Pla_Z2Bh3&4X z%!=Q#iOvvurYg-Y)E4IH!1!W|i80%e?e)MgR`PUDxBGz2?gdK*&w*Nuu^XxLM7}?9 zb@LI$otz@M8me0&fv!Yiu6SO^^DQ5K_)Y4(P>v70`rs9(IdhDKPC%n^`22|H$Z$On z!XB>=L^h-nDHTq~!1nqDlLroEVZ44x>=NC*W95$bH-#nNax9Tyyy5jpSq_1F{gV`1 zNP{w$iJ}uj6odmGyb2uN^!WVSeDi}H-+b>IeDsk~mQ24LI8KG#e9QL5p6$y6-E?9r z1JfyTOD28bHW$oj58tuij_-;_HYeHmbz2^22G*zd9Uv z-A9(&iOpT5mx1{-@j6!St|D18uZz%~jNR20Ly4T`i8O2gs3&3Hj~ovZ`#KY1LSnPf zOezfK+`Klj!ah`NRQj7MT!sDNh#nW_;AELNmYG96VPj!FEZiR}AAkQ1Klkvb_?Zu{ z_{DF%;`(O8{Qi!A`P(O6?q1RFUT`~RJUjE}ca&)&*g~E6g%25oB;W95mz`}`89bNN;QJ9MHgU<^8;@|8!9k0mdWSx+dag`N3 zYz_TGa-{#ZRJ|-R(Wv&J3d!|yU>MXUOeWEN2*+R2+jjL-| z4&8|5V?Ce5XX_zArsRTvNW^mGl@V5mAaDwysjCgp^+1gwa=WUy> zf@4;Qv02V8ONV%eMF>)0I1>NoN z_g{b}Bv0H7fx&xDZ=7X0uzeAEadToS@AK)$GxZ_xvoCwPm^i*R(ouNzLix_ujPHGV z&nHKL&>>X%+S~!EL3LR{%i747Dvj?b(z4lU4la#kc+Mx*Mq)8%TuFyT1$PMRy0)k` zh6^A;hDG!&=I)A5T zCEQ{{ysR0obs;wia#OliK^Q^u+aTciy;eXyXl%f_t*Ybr7)fVl7ou;Y2CYO=&P3dm z`{GSa>+NayYF`adXr!gE+H>0)`=Yd1m6`=j2}@w9ksazhQ**nAH(%Q=4p-dPFR z*i!&oo&dsf`95bg_T@XeUu^%M0pLHTC9ArrO%%^y$8$Z`PeO?(A+{R~tM;5z`iER* zhAqqLh7g{C;OBa)o`K-!daj@BGI##zzxs^d{b$J{`bS4|M2xh5hG|ucLlpq z@=Zt3D>ivcu%1&gmad~5Mve~))P&B3!^d}Yeb0;C6}y*T<9!{uJDj*Z22S-12KFQw z$r9OUM=gOmE5w1QSEw&kcVgI3tWe5?NF@!B!sCr=HSpXl5Un;PZM#uzK&w?Js1Rcy zrPS0>PjZMwz{|=)7e}=*sjC}@Ji{y;?4HxKkj>E45kdkFq|niKJ)0!N)Eb-1GI2Z| zSeA*Hlz!-0X1l1gMM6`#gs`fjmCbm~*lm%bXr3s`+WeFW(}1Kz)rf`AtcTZzTE$!5 zq`#|;dYj?xG)t~?YeAn}FIr>H$lg>LNZW_4Nn&p)c7Qe4w%xPE7>IGrouxGqR3fgA zna5^EwWoQB;BFVo(FR(a^Bmt+7@QkaM_{y$7jc94m5+{ZSV~ifYfxhBFahh7vaA`E z-WsN2#*mb#2{orwYnE=JOxch+AtAB7+My{@#nB)vUR#FdW?-Ch0|M$}<4;v_FO=e> z7+OZ{+W0?5UUeGLuIKYlex1A5cc?1gm*3@KcteuF@p$BPoY@RL`{{w{a6(*&s+>+I za?YT_HYBV9C?O8?fM=%8?lrO_@lSSCPj=(i9`B^R2SJoN1C#L|I= z0T;)|0gnS-lrSd3_>w{(=MyTKdb+22CTOMao1VMbfv(N{v;Cc0%V8{)aqJOU748^0 z&-mJ$+g@pFhH6K@Da_@LQ_g4{c=7&-VjPeAi_P#npQyFc_k9CTjtje#2x2Tuj9pJ0 zGiX!5b^aSoL0u|0n;ucaX?D#epD5dopZO0G*YBUWef=3r{(v{PiPPakNQH27#b)Qc z9F3vx*`vIkPn?#_H4%GrB+Q1fu=jhWe4^{%dJ`B_7{B!$u3x-Qonb%SGqdpde8=hb zo)@*_S_eL(aC_Ku^iyl%=1MFl`k`Z~&gnR#Apz$m>6-VtES&O!yAakf?$u}`CR3)& zgkzm@T4qkKC$<|Hb>PMIdlZ>S(~kXd&tX1Ld_f#GLn4L|Uz~sV&;L0;{NNSG)1TzU z5U8>tZAWZOJVekMsMEy$ZclzVvFRh*%{Aq8=GUXtC?aBD1$~u3EYM|YVhVR5JR(xmS+E{4!@)w77TYq6_P5{1PNl_algHykAW8< zaYG~=Gg|{42Bs8wQBP!dvKvX1us9LL=OZFZ%NJZ*WJ#6a)`&YnNCH8c(!Q?WwNHT* z1Pr1!f=;)d=VuV1vc}6Jlb9I_8e;Rcs^Tc_M7I9(E(Pi0S69Il(gn4R&QC`#f1(-HYFi7a;(2L6N1JJyt@a99Xi&^6-D>(7&DQ)=VUU(J*=cL*ms$z6qT06K zyt$?gK}gyZZBmM}D70Yc- zlm>Q*86uIOAQ-hYtN&uwz<3j^mdkM|Pp$#&8n?7_!=364gc(9x?_iaOyL*PKEgh?k zwF@Z)w1SmFUXE-vQm9Quu1Z*yV@&}mgvDD-!zC)jG0)gKXu=Yn5a`Y)Hy62?^?tEU zH*YwHQQNf!XVdMF(AGd<)1%vgvcCgwW1y6R+j(tLfu_WcvDurpc|_j2Za%$M8t*9T z)_Tjr)xRKey*yruA)&3MqBhc8&;%i@D&>M%Z7OyO)w~fT%o(;@w%awobkm`=@agBD zFb*C4a7{mKxO)GF`E=s$_JP?m8-qHXSF5f z?R~#4-%+H^10g)VX8o)SSnE!1i>Idk)ky3ft%g+seG03}xU}=keN_Wrl4{>NUQOA! zW&wZUs6W=@npeM|#yqQE%?vp$RLN8x?U*GtM;Q%@uIp!1n=8y}w=Lf0NDmFLZQ$@z zEo;jS$9PL+`tCLHyd7s9>{A=ywqNU)s{DwXr^G6-OZoDs6XVgTASTsjL&oBbA6#C z1cJ63{bv%!b3NBjUVZ*%;{X2N{1(6bXFueZe*V>44eaY($A9s^`WgPgfBzA`_TAgB ze2<&^J%9ag{e6DrKl%%N_TGy>(DoScH$K=gZQkR*I0R~}+zmfux-#-snM$SX56Jw$ zy&rgEd#VY?V#LrhM&)6D%k8JPjB!hf8$RKl+qmapTX5;{YQ)+RqzCUXi>N7i5{7ZZ zCcV$p!JI37zaxetr{lt0k7(5fwi0k6LLy4S2nZc$PYNADB3_~9mXXz^L`sci@7|iA zq5*X!g|kg^YaA9T3&yE9IcGcx9s^I8E}pG1*M?MN1st3UQ{4TnrozRtnho#A#D})wb$GzV*mfP8u>)H!0JKNN zJ+LebYApvby3m=BQli>SDXr<7g3?u}rO*e&k;8Q0K1M!#|7!#dEGAH4v)NEe zA?JdIC*XuPC18?9hIAZ>vE`2C%2Xz5ZCTDr;B=Vzt-J5>y(!bh4o#5~1Py|hik1e@ z#F!9mwyW;2sWietw;@JlS?;;Jd(E!D;=LCi@QN#rhkK%Bh7jmbN;P^-?1md;*bq(W zYjf`r6HIhH*2YpHV@%83Y$#XtiqwTsU^5(u>ZI7R?siuj!mz;~DzEPjoa}~LV*>~^ zQhh=VswD89;@4yrC=sI|LFr^<@&-#9lyd8P({b6Lo5~>Dtk6oVgq*`M@T2m=@wUHhlQ?210x?&3LVN zQKsoY>=qunZ}WnR*o3o(K?zqd9C`*DIUE)w>?mE&1BKUpv$TJ8eZ`oa|LPjQiM+mjL(T<6$V{Zx$B*mT(5*Y|_L#G0ZVRd@1w$eQU@7zvm=b5Kfj zj++g=R&FFR91GKD_oUNI>_@arbhX7UH0#{ZtX>_qUWpDCXmfExfDv(oN~oDWHg^VB zElKvY1SBu<|Kh*5A-P(o-e*K9(zwjaVuj;gh(p=Jcr2J+4bSpw!l_U7PFR`9#g zGnyjlJTIQr$f_-`y#cmOGp0`(?z)1`=`1!{Wl@TgVgpBuTeDTJMiiwNMZD!I2BZPz zzFOFuQQca!fVAsibw}2DIfZu34enGcq|kuj!U~>SX4F7Z$mZ+kwBwxws;mi!)xo4HCOGH3&AJt}dv!VMwd5?W@puj`2r(AX4t?YPlEW23Dx zOwbrmi9l_3%;p^T4x|GMJfwhB!&icU6~V=D zFSsww-dh#*?ny)h7xLJ7-H?}+AZhgxBwU?b&j6m8VHjb%W&5@F$kU1Wc%bCU5FXuS z+znA*2?T|_I4%o0w_I>HU*j{%8fEe0`&~^TcQMxmSk;{kU~ErXRlz1`6|{Q0uNP?~ z0-aHT7C?cbzh*g{*x%n%N+HIM>CHXe-JYB$(ilj6ByJPCaUiF_ zOrLP~T1e)fvhAD zNliW5*22w(`?8ogm%AYN* zvm_ls9<77d>!+)%>)R*e`N{r$eC^{gd%CYK$6X&uK>p;t&d+bp3uqb;EiF&I09J^p zU-Pyf({$av-6yTva3+_&3ugYf-_LVJ2nE&gb$<1qe9ZTM_`rYk7r)7F^JwQBg7BAr z`5S!r{)WHzk3MQSdtXw+H1nVS?O)~Z{G~s~@BGx){=nPx|Jcra+6n*18adrm_A;?Q zE-*nlBxHe;oH*za-3Jbb%t%k)2NY$QXQul-H+|1Pn|{Q7K0+_-wi^Z$wmBd{NgAoA zW}A$I7bT@D`oWNp>ANk(N4g$-Nh|xhM9EH#f|-zFzwTEfFAfw`yOvYy z3w2qV8f48gOd+r0+i`QH z1nroYBVb%_zJAGw4IvQM8}3r9Wew*-DMp?qrs=o>jfqmdfx0U&8^q~WC6T+6-KhkO z%z0GQvo+h=jB$Acgnj*Q@z(r0r-Nl_N(vWmJvwu&RHA?eU)9Qnxilb-X4}>BVp~qF zR|9K};WHppN@2;FV-AF_0SrL|*V^pvR&@lNn{|(14Lmj*-pgBFF_2H0&yEL3!Z%;M zpi9Ch_f09AF)Spiwtb+qT)-$zOBKIv1`tR}B4z zAi`1$eV^ED2Ie_GQ8D{vTXSt0%1bGP)QDL3_xIf2-f=u0Ih2J&gie4$91>zeaWI2q z&U-K4Cv}nI@yJp#9-2k>oEJ(q1gGmFF?3`mmi)l16WM02`YlW+YHhZ*p;o%;BqA@; zmTY~?lXRifg6Z0f6i3v_4y6>P>BzLqEyEBeh_Q(c085=>zTj$XcZnAtzC=Esczyqd z<8ee|!ZhHEGD;wIhFEE8pU_iJbF(%C)QlLML}kenZUySZ(7`B$8crYuja_RZpK4RO z)0BNlLDexSg!McghJl(h8ij2?VxCDUGHiNkJ>nFG?Z~)EOw&T_g|2s&vT(|UG$cY7 zI2<0xxpFmZu;R?8!u4ikDl;<+!*0N%a@ZdUuJkG4MCPS3YzE4_fK*<*+%j}ZpRUMT z<>B>?*Pjl2{3GRbDhMZr&=ew{l}xmOAzrhICkVH^dX=~uHk5;6vSD`T);ewzd@?Ap zOW5`W?++s%&3o?O969YX=9$ci$qO|puEOEtk0@QoupN2tro&K<_Z?|5L;}T{ZTn$= z!UeKb#+8H+G_hnuldr18f+(c1qmK=&+)qmbA5pG!Xr!6r2^$Jwv!U9;?y95TB~n+Y z`9v=r+Z2ehJ2!h5jM~6C2}tPZ`bVYLr78MO^YP1? zzEA56e9k38TVewc9bYqh zA+5?qUHv%~r`85&#u$;H;L1{rxx%0jB%&IqE`;cqG|+d-mBm^{X|3MoQ5sMwv~2L` z%~Dg>=5;gJZa_(JC##^=+QbduY(PZ_idZ4KH>>K^3DC?5DH21Zx-nZJn6>jf1VXU} z06TOdL|xTc8kv`tH7;uwa*?)QQqooJ>8Kmojb1=-=pv=i+(J@l_PXx4XA;c{I*DMR zfv(F^2~ilZ3usiT5mIX3O(CgJLd%BU2BEo&v||-Rn|Hx+ZI-3AI1(DD-o-?xflR?& zvEWDm38{?(!g^7!xIqYA1HDsXvJ)XG#LyfZG+?FRYXn0hVJYUqQen2h7$a3%#E{aS z17*#fcBW!vak^ndQpCMnGK*QG56*U?CZMS&<%K-Wbmq(mH4M;oco*>)o14aLNOmO3 zs=Ta-Ikn7qoe9>iK{cc=sA(_iJrVkqOou!Y3(lY*fLUn(Th8bZ=w94#H81EVpK*8l zns=>GRlT`5xL_6_G+{#{bA55G{AFsxr)z|_o@@R%U#)6Ji7h{wTvzwEjLo_IEP-kh zeLs?7#A~5Xk#X2k>p~FcaJ(g6ZP{I2!M3N1Ld}K~I2=xV{K;o*w^!WkUJ_zz`PxzF zrNi>VAWr9oO$X*YF+^`htY>eBH)U zpzTZdmeXyuuBygn6RbSug`W4Loymx`%^3kfSE9$eYU+yu_$zv2XA9(3}a*$LX9^eFnaY8?q{eeVqfJDq+2>$FbD6*0SgEbykp{iTh(}_VvNS zWo<4foe8}wp>K0D+Q>E41=cL!3sCO5DofW{cHJN6?R!eD{E`8TN^|yke2=sG`iaW- zNpI<_2tK>WtiH@|f#vTiZolgDqbeE$RT??8NWrDxA%Q4!$#^Mvwafd8tOPHbUHDtu z#TU=TFZ=!Jzo%rer_Z@KA!tDAO00FGa>ljWcj~&1-EP-nIp&%Devg?o7a7m6=3o1I zd{~LEUp8dl1yY}$8}99%P*xSNNcgt`ThFh33IIPP%f0oycXi3~`1+^H`pawIdHNTW z!Scn&p4Kw}{71Z=f#2tPu0I}iv4?hVwjN*6uzs%JU%44&SsK`<`jv~_=lWw>(pdan zE47s0`}xoHT+j9IRsHCbBY)#>ewV-e7rw!t{Lb}TkNy15-0=R(fnWK1zsv2z@};kj zwep|*-G9vg=g=}nGGYh&@wowUlL~>v%1zQeCm$=^S2-}E-!b$d|8jv~RHRAzd=q}8C^BvnUF!Vc| z83{_?ZRye#qNyo$;-e}iMr(V{??dILQ0X;MXtuLaWys|bQm@*XSY`B((E5&j3k8`12tEg z^`)?6~|)Xc<_v z#;~tVD9%k*jRf(v*}tC5O58vV)$t z9FHgZV4rf&v+G<)6ABDNFt2`s4&$N8yScwK@w3SNtLQ=KIY=hRR#AQ|BJT|_-sMV-t z!K{*LIhP9UNQ@ob&~ftuUcR^Cv){hMIz^K*MCa8;NH#OiQ#(Hs?CUL? z)S(zA&UV~UtnzR=(We2=Gh+zt{I>!UG2O5bu;tLk3t=6vO;IRjNN|!i1;+k(B*sYJ zC-O2AX(FC!j&#GsI2y~WoQ}r!3cA6VW+-K09D9~Lb37jDx&cu34->UIJ}UdXU@_1Q zTb5F(7^xeHA#r%P$9$l8N4AXiLbus6Y&LBAEuY+0e(+m?*B_5)NDP}hLbq?3uak3k zc*BoA@2T>VpZ;*e%lLgZ;SP@rcb*CRp8Nft&u3--V#nuEInEQGzq#k-P}$poH^&oI zA~$2t;DJ2N+)gvMGBM73JO?x+QfGva7*oW=xtoq0A0F+-MTFRQYd&gIh>YVv-*s)? zq*;}A-9R4%uQPeWBV3% zyyoH4*Mzcg43%D#DBjMg^X->_t?GV_E#nX~Tq9W%)6g*u8zc#vL5XGJboZL2WWq3@ zN$C`dY6H0e_lk$62pv*KjF9R|YVnrSivTH7tX@=__-dcp^q~!?cbbK{7&R9PAgQ}F zfs56qT$fcLS(=S88mR7=D@)E)wbc%IRjztdx9K`>H*@F)Fsmpoj;#tQ^_3)q5ouZR zL+Hpk6SUf^$kRnX({vyDu%ct6jY5~lu;d#ifhZt?0`<&yi5>6g_zcC#0aH0 zE=C^`QH8pSostP-444;?)Bta0hNKXLxbg{1V8mCDxj9En6}k{mwFa_!Ach9q_G3?} z4Xn>qkPzutQkI5xJ?ers%V;ZrQnjPfq6u7~lcoR`bJB{foWY1kHES#8ES3KH;YWnkN(^g;m+O zW>*4lDK10ln%(o7y`Z8fXE=&BZ+9Ig!fBcyCdL=nh*jo!hQhjb)V7954FqnCxj^3w z)r2_8}YPwR!4fE111B z_Y;NW3I&$aL^t&8UT&Mz8fUW$eE8zJfq*7V(}YwbE=qK`a%ZViQ_Rl`^)ykEl2Sml zkxZ8Ri8LQsmLs5y!v-09mZ@-id*ptZn3hWLj&2x<3dNkNN|y#~nP}?%mLeO@V;VzN z3web#=X9NuSA6Pe_wYR4&rkcYpyqi$KLK1>=R>2p>(yEtLB?4vmRBqL)wzJ739KZnb@{XEjXikR^9?+xT!t@ynue;?f%zI-3IH9MDuTc2J3j^9e_Xu_e7E`RZ3XdDQr(xHZ}QH0aIslAf5syj;H~esj)i9c z_>X8k1HaGpTz^bU1P!q<37>O<|Io@x!9|{Jp`YtZOG3*LsyY9jH%HI)T+j9ISLJN{ zxBuV=eDukI|M{Q)Iw3sX#J#-f`7i(4pWyHO!yoZmzjObkuNQazr~mk0GEOu9_<#Hh zf8g!;*B016yy8DQ-ePwJ-y3tum=(G#q{SG92r-arQ!}SNa#}L`HwPXLcl>mB#Y++& z?Qhx72lQI#w}~2@dppvNLYEUmjpWJ6vr_{NWXy%2Te_}8bW7u28!-$>2)G48u*aKq zwN>%a6ia5%C7Ru%HcR3LV6F|0Rk0eAwg!GsYFS#du|Unvv{d#FN4g;~?l$xhYF@CC z5$8$XpfOE_oFjeT6Jt|y*W7M`OL3^RS%Lvxn@YCK1-k%WwW)5Cph;1UAOVrqY)t}@ z)|e{QnXTC!Hj7BP+Z4BB_9*7CK?z|Pl)2J)W4Sn~$FU`4k0pN3&PgU8TlpoCxyx#BWhQ!Np!*o3H z>Fpclyfmdi1*(y>Wiz)OU&-#2t~KjoX{z94N}V!g$%r{q&6pVDiyP9-*lgQMp=NEW zT6JPl%mVYAvDJn!XluB6H10mT=QqCpJ*K=6QslTlFdvTO6ss%?qNAq)6;Gq`1K>V%8LUeFsB?RE$U< zW4H;WdFQSF&T5bb@V9Yt2KNJA!L8sWqu%mH&6I44d!>{GB~h0JQsU;-OH#k3l$MeE z?QeY@efWgp1##tSlepRz%KjdgBg44Er4WaiO$VNvnrf8DA{B`XF*Jo%j2-*=to-Py zo*F124cy0^S_;9nDb~#>#n^;IT`HwCo6KC#O)Vu)GpCdB@?~V`0{8oZWnItviWO(v z4rmmP)9Iq*n2(t}Eo`@2_Lj+_#56Kb&i+F|cUh#7r!eZ5NP3=5RPLbscH5CC>|zGxNMqvyr-v zal64oV2B;Vre76j(D!{)9QUThOLj>~=`M<<)lJIu!J{=k%~AS4X=!Mv$+>k3d}P8S=HYu3n8xjG?r_&Ud7P8SRf zic}-vI7S}=YQ6$BkIiB|tKioC9zx(G%`i1eLsW+-OvOkcupn%3IyFSr99T65p*aY+ z1)S8=O&jJRdzN71612!EjwyfUZ?U+ST7Au5RsY+>s zummAHD@ah$@OH+mTg5Tdl_qpu?L@UHgG+rv=&Bi|Lu&()x-?KEVv=xa3c|F0PSmE> zEj2UecI>m|)dI949*I$yP|C#;+~}i{LLhhpY)|vCsUrIxHdjnBP#vrUq#E_b2gukH z$L5~k?L=(Z%nnmL;x4E~f&;j`v`D0u+@2?qt{>6Vq4r3q6g}s^R%(S(13j$nEl{a%k?0z*_~qcp8618(16?d$ zpFF2}AqJ&ar7kD(>4?>Zz7x7JU`SIh6HrY}eOioh7t&i*se4SOGeDO1yBDk*h)a&E+bc5G_envwd z|JL%3l}v8Guj}68MlFSG#yros_r$)VO9LUT`Q|D}T^09s2B6>0@MQ&LF9ziA0ECw@ z>b|<>tO{3c>%A(4OaB5kb2Vk6i$Uoe$M)&>`>My`N$&Jz zXMS-%y}OO?{NYOn?v!QTeO?;kWoFH$DIOUwq0}T}uDV zzx+*7F8t~*|I#0LTYgXn{;%@W{73V@Ar@oIg3T3{iWg(Dj=U;qm-|BA!oEyA91Jw@ z?XMdpwcNMf5?de9S(!rSD1~L~40U0rkVMI)vGjum1Sj-hR$B%rLX7>|2r!(A5D4mo z;HU~YJ8re9pS&@~&#K^3N_&j%5v&X}!kQ|0v#FKhl&LVCoZ@g=PK2p}#KYCt6mp_O zg=x*zd$b%hmSwr*AhI^26+o330^*QY+ub@r%>}QSXF?EfNPiwrXuDPdc z)269iAKB<%7!E7Qt*n`iD+sLSxH-|!Jo3g;F9;?EK^vgs74>FCcy8RCZ|GYi_t9SN z^1pY~4la+)vj#ku*6rbQXGXNZvxcCYAO1@bbHx5 z2x(PSHQ+IXaQU7|+IiWfKyUvFBUg{%MZ4cYN>He}mKEfp7lI zPjU7BOFsJH$9(+B$9($vXS{m(g6f6CbigBQhMuAwLAE4zO)=$(A@#f%6W7~;`Jt)B z#K2Q)k`<|~cNYRi!KAJ#DQkI`oSScg=b18{keb`~GAJ|v#JySWx)?)0a`WO9{jgz~ z3sqWE>c!2#=l2UL9VvD!^8;m>n{8u-lRz4G1W7E*jF_@afqgE-Zi|;aOKE5FY)VLD zQ=->}Pz)Us;!0gAo(&|l+%^$vo$304Tnj@#()ArqrSC?@F1GD(2z4M&0wptcJ!*l| z{)C3YZg<79G;njfy&{CbJnvWA_Kv${LbRikp5y(Aa+(R_z-&jV8&_k%$xO>kKV0$h z)fLBm<@?`1^8N2Va6Gjv)teh<+%+5YQ?9sGx(FYpBX?Js-}>lde)|VP_6^^7@c|!h zPjq@9+$3Jnb0atK>OFR$a5_z7Suj&dmZp*`hRrj_URZLaBXZ?E^?pWaHifZQYS#d- z&?$XCp!ChQ*`3&R#I6xniZ_5`dYD+|g=uc;Lrj>DGeRLq%fR!{k%o>%l{beYnw;yM za207-aRq8%-_rpDJe)pDqKa(`k_1d!H4U)7RT1BW<*0}|$ zM%0bIv<$~ZBe{!sHxTTIZH88->h@n{M)kRLkQGT5otu6P6Mpgtk5if!>S1G zV!|ZQ$3X02yRLf0tFsA$xe-^OVhz|qO!+{-bz4KD4t0{ zkrdeU0jlBVgwT|z8&%YeB9#96*MNVEoX?C_mx;6jS-RQLKi=m5n zohc^75UAR+hs_GQX4KaT!)l?LYb8iTq|)_DUQdS_6tl{TCSlZ;^GG9Rfwp_Gb-#)P zf;0ubin3H=skP+{uPW=hj?oZ8BTUi2b*nAc(*w=kASpIC5Ie5tK~!z?WUizj>{k~C zje#;95wAoI4g61$T=KfzZ4GDI0Eegzq#{Jnh=hm$z(7C0qbsqXxvf~q>~ANQ(?sa5 zu?_LtcR)3lQC!dt-a zQ?T-@>Izks8x8Xa;&Afq^;oYQ@qx!zNLtCcS=fa-F>;f=$ilDl$hrz6<@de za%|84yteIKof6LfSziRYD*i>NR7lPB=Td_ZSDW_`V~c|^p{Dg(mJ4o8xr;aAj<450 z+$r+7J&t2;myZ_&p7 zMyePdBHE2@^K(IhKq)ln)GpU{Q3rq9{`t##%TKre%fM*2vr1K;9GCWc3=xSV9(o7{ z+JRIEU9)hn?f5UHa5$Yf%`?@E)c1sxn5Kz3=gV&Uonk_gfsnN2@d0}7I#icZTb#2;7X)5V$?5PUb7fNlw!!Gq~yyF|YS6pv)eD?V# z+#PPoHj#VfxMX6P_|d}~Qv&v7yO*nr;`{S~`d8O)jMn!&7*Zs>_)!pZ}SSF%@-dTII?ljcEf7^m z1avN>Qi)bs>V&39QYVC->+5Tza}M`2AOGmcZ~f~7`SgnSzkQ1>f$gp%1>f+@U5N;kaEi66}$p|T_D73C0_%87h{z(^bhj`=`m z!c`mzA#>tH84`Ur5^})j!fG5#96N^HhHAOZLzY36c|H+iWEgkN2ESIKDD#}T*>neS&8ms zYx%H!RE9pWECwzF2S@0{$>I#E6r52T=}6s3q1hJihJ@!fubDzT1Gi=bGy2d}oymoz z%mkc12Ev;8Yb6uAL`+JG&9>ZY##oicG&|ac{`d;;G)xt5`#(tAF(C-G+N#2?AVvty z3e;S10-jrLdajk?)<7=WwN_JTQ3)#md?t&X?Uph)6DAoU}|uptnT7$9h~7PX9c10HRCpY57~oz2^r)<&eF zpD`(vcICchp&!BHWTHJ$kIcM~p_2m~7oc_44&khjhtXB2)-oRSkH0ykI zvGn$~4Ht#6IawOHL!&@w+pMZ9k!}^q`sG6}+j4efI0MX2Es&r7(@Jw5q7gudO6U?H z#`b+`S&5X*s@z;I8N~oeA|{XOc-Q8}bKV|%G77&8oYQwzrRROS0^#XVpv~F(_)%5* z2m-(B6#Z4l==`_yd3-sqRN9(O+igLWW}}?_ZMPwz-KUthc!OrG{O>M;`7*`q`Dax{ zQ-_C$hYmtSJ++MW3@#P3x3iwl+gfX7S(diF=Z{!}mDOoq((DV?(_giHZ9aMDyFR(U zeY)*$@9*Dx-+bBrdsjL9#rOT{zde2ID_`T!0Pr7~3h@m5KC985>$#rmt4mgf&uZZ3daj?)%GvmpzyAaN^k*mjXMgU)3(FngJKwzGKmV&g z&ENVvzsup2zx4G#_nW^1@P`5dza9pD4^RM$~G{fvoaqHySD$2XavsTS!reS}}*Lkx&-03a6UcghX^9T2ppp ztMt|ByF~1@p%y-%lHRhV7HQzpS!LtyNDZhfsVZZ?flxTg%=eaCUZ={8Fc|bx$2`w0 z3Wo&q>7Fq~w%vd~WJaIqs_^Q?hY%|toj&Ka9Qj;N+#YY~@{X|vGMVrB=lo{;6q!%F zZ^|$BU*|ghDX5jCiKH!ixdx%a+DLbX*zvPp{{~{tr=Psx^@E|uj#sa~h3_7k)-qaKl4jJPbr00AHE__C*B+mXm>@w?HR7$!+fC}?y0`eJB(Gh-QUr76)zLZ(lLd= zZqwst%wJMww8ml=dHM1ez;2tWvWM~23qpcv|3jiGQLo76Je(#r;|?Qmm`=E+malC_ z(LmZH?#hAOE5r8vW{q2pj4`l#d5;wsHy`l%=gzPHqmMY8CU!R++wT;Hn251~FJ2Y3 zfpKGWUB@&{EafFv3;fh|=Blf_E;F6NA&%Uk+}-~yx1WAa)B`0Sd3~HXq(B)28y=`S zvpc}m5?MAqvb&;>&Rk}yAMq%Z`vp4{Bv(o}68gY+y=6!ps=#)nnsGSoagk;X8bZr+ zJe^Rl1fh{F6lBvL*BGeT>9um57Cg+{9*@+6@@5GX3pn>&-CRR0Je+1uZY+y%|7K>h z*^#)TSO7Xg-BITgSu*oBa4W`~6-lqS|8!6M?t$SU5k;}ykRg#f=t?03CsZI8PQf`u z;pc5&u@l96N`-1p)P!55)J8<`(?-W`#ZZlYq zcy+3Q`P59p)rphgZAiIJf;JK+$7!{Nvn0!5rY38hX%S+hzl z5OzJYSBe_u3%wgEEsu4uNSD0_+bHPk4-! zkO?Idld^<`uz`S4@=PBhu{wt(GYp#sIIFUFrAvWs2+ZZcwnT=pLu(|2E6|Q_T(#Ysy<tFGftI^#NTP_%D&l(yW_l<0P6vZ4m-xbsc~v z%1mbGM3F|w(7?*;#Leh)rC7zHqC+Ev)RQ-`T-%znSxJMtffxl}Ns!I*Uc!imuFaM1 z)YZS;$*Ae7>^`qyy}gH2z)2q70*I|va(;}W@g%6nN3hL91C7_Xj9?3A<-BNZ*7G&v ztM#;veFFluDe19<>d@k2G&GXw3LaAnX(g;$S&6Y>T*1z!(ha_*$)7i;)@JGNjWAPd zb5{y0)|0G}@Y?rrB!(6<0?krA_Bh(y3%sdpO=w_mh!j)mabi(u`MLqsKn*=5RJy~b zV({_WQR7kphXJ=UEMzH9HVn4@thUO zXL66=#mG8cl<2A*ZY|=$#V*f>M(9;(_nVGWgEZ2xgZNo^Wsd+nVciqDKF1rA`0Uyg z+PsT22aQLNdEMzN0Iz3az!Sy3h%oEa=2~wA7QGx6UsqAj^%GlXd)H^+_qm?yxqd$- zqJ-EM7Ijs#KG(lnJ*$DA>nlqhGo$TU4g6fs^%GbB^54AX_HO2{{-tlxcaN0p_g)PA zm;dXZ;cxz(-{JM`^rf%;x!?R9N(lVF|H7aC18>JC+YP_+^$+<^e&cru)tRRZ5{W4i z`fyQsx)to;%=$MC#@QSrN{>iF)*D|B z-k9#%R5>9CQCeo@vMl6zA?HlVE&Df@rZACdVd-a_h2t`lf;79x*sKGqfT&PcMWKmc zAyR`fOGdQWRh3f6b8Fn>Jk$3*p-WuvhGtLaj_R7-_e2$iI_?b&wwejVrton{5?Ia| zgL;-8v_@FcNa!L#S4HxgyXW?phiB>t9mNFm1)~x}w<;^v8~xZklASeUvDm7Re#-EE z+e+<{TgD@+y)|E&I&fMRtSVzaaMeYkIF;H|5p``6toz_xO<|#}d2?1PxLquuze*{v zU<7xdaw-dR67=N`dpIy33uRhbws3{zc;ZCnn3T=c4#vcEoEUcns zv9K%)8XF0wo|Pg&IUFjlt{RZl^?_k?1;MGzXf)y&cyoKA4?AKQS(b`=B*uhQAiywm zOw$pkHP+|p#B`k5j7m3bfcLrI&wTpH=iJ^IWiISCTQ-|Or$QIHrf|}8Hg=oGyg2Gg zNGCirmD1+=3XSjM!!-o(WhN{$y&OmZ3c_v!XkaOU`4}lf$9<^mrZ>UpbyB+Bz zpmU-h0-g%Txw1c;C}pAB_JqyAHg@DZlVVR4IL;Ht;{g$2x7#s}Bm4aW$J4}q%1B5I zDWV2~lY&r7#l*3qq?mYd{SqYLB$lNx7srZ|%fvjleD!m~Gv{XTYI8vs!I#XO7pBgc zRER2QJrV;XD)A=Jr-*7Ig`OCUh~lS-$qe;CJs#O2grGbe4}>2D4tGv5+E`n`_^?{| z-mx4$_?(ftf)swX z&Tk4%T`fqznNf&bt`UaQ$9TEMjPM99CevMmghk5YFGRjfuKC5?mC7>$o^y?^G3A!Co^X z=b52vdE2^PS7U9@O*F@auF-Cq-LgBr#xI;jQy$u5&BR;Q?XY&N*W6pYyKVdSWgG$8xHectiu`#-~n`U9?C4SZxB z-#Zmbx8s}J9Vr*8opb0}L8UhSO?(9?o~$`mOJMx$&a&Ft>f>7AqPBbjm<+DXx_EV! zOQBw&9>QVvwII+VpJt+6A9FuskVYa<%Fa_ zqNC;ouT6z78Yzoop)em$1gl6=LQ6`)t*OO5(k#M7kw`-XQ>GVX?lTV$U0b7g1J_KT zmP!pqN(o_E0mk6cx(-iFPwfXY5GoBUZqs3>ez8e}Z^Y?kow#b5YJzZw} ztQPk+ms(YfrhuJlUSCsiS}aHVer@iVZEB7@8i4>B32~w8N0N3_PZzLHG}2;Qngw@T z=GS)YR_7nPfQ9Ql%<78Nyoc9o!>TfF+r{Odh@!#+JC-eoV@ikjX(oZ5m}vm+AGDS*{VwgjHs;h=Nc*G zAUw|fW=2_Erhv!1_b1iH0IN$!!_I!ZvNoKzX5C-fNCIoNu*;+SRKwkCv&TMHZJ>JF z=5PUM&->2xblKk*98bX4gILRQ0j|NHJWs(N?aI$lLaJvVy1i$otAmmW>T(&wa-q>Z z*H2tM1HaGpT+j7~QX(zeVr9qKGZ6gmRBx$)o&wdlnGo&6J2f88QWMmQiRI#bD%rj+M*=+;bDPb_WIB?}#c5gb$n?m~b%=C5P z^@|1Wj1QKc;dDcArCMd4XR7PU3>Q+0^j#oDL8RF&h7c%Enu3>np&03cuApxscFi(a zf|9f~0X6lg7%gYcLA5o|;%bY$GWA0Um^JqP!$anDI<0wXJNmw-9}+30)e^cndo|^l zTx^#wz=3%K1?tMEM=_dxq}7(^Dq&@-*On>RgfWke+Y6hVo?K=M3zbR|MZIs9zDwnx z8TFPQ*NKv}HFxkemw5gE_9sCstU!DFi1xjWob9qUGc%@X;o;$dtM^`#Qfk@3xi#~@ zkmvi<#_UY^^QQUE2(?v`QSmC}*Og*HR*VH_-|NIV_A%(DZt((1NHK*qP zAA5h=Y|ECN=V8y7U1qMec5}|{ss{=MKq5iVCM_B?L5d7h3Yw0fet^IFkNC&f5&lkD z4$JBsqD_gENWwHkf`z6E)!utgvzygq=4^&PjJej{w+aL$7AY2_JtNM&`|Pv#YI0@H zIdi<@ecl=Mj(}nACJZUNQBPf!nk%Q)7^abVQ7D;V6}~!L^VRED)UtAaci`RQAF{oD z1s_5d!+ws#02y>XF-%)4_?AYljbXdttH1a)8p?6GrLe z5E!NjN~YyKQ3|ci)ZDC5qgIZR*^ZuJ>sU*sR7Y@u#u2}5xUJ{#;8|>Y^CrsS3KONcM9oawbnbH-~2Ij+&!}~j&-;uLi3SpKfC)8Sa-0#VI%f5|Cnb(;Q zK8Rdj-4esf<9y_>FI-<=)2eVhoDg-y7%0*mLQ^D{LK-|VMDFGz>Q*+_A9C~2EAAd< zj>pFSp|H%#W}4XSB54qiOvHD0j5ma1t%P96UvYsfkEo9{JQ4?7+A=GYupU;H)6Dv~aD9D^I_Y`0LWm|jYObheb9EG(J5LXpl04%$5PW3Gc8zJr za<93Pv$^@4TEk7Pm6j47A!ScI31b$PwNVh(B9I!}W_aAPgX$~8p~31%LZ8%giivu)W4xN!xWe{$q&yyBEkqT|J;w6zT9=atAE?CyY3-s#Zk1MY7xCOh zG&mDiO&cyaO3#-ay&eCdd^Mqe8fc|imUOLXX-M)| zyN$;;%lLFo2r3+#;?&#qR2Ao)o#$O7RcEmfttu%5I6tlm!8^odoNu(Y0tJzT^X5i# zy{W_zI?_AXI?xnVM=6yUZg}l)kvLFwHT>#Y`0o8Z|J7%o@*BVW5g$g+|6&k)4*bsI zxm!I$XpFl;%%h1{tx>B99~YOJxMzDKJO9p`5k;(-y$fF2o6=eryro|aV~gf&L(t#} z3KB<<6V!!DCI$@k-x|&Z6V!7hC6lGx*vM|reua|;{Knxnuzd~pZzkqrWgnDrTey84 zQ5g+4u1E5E;uIn$9Vo4WnrqdG$Gg$onZXliv{p<+(#*2ovwwIXmpAyDkm86E4L@BK zSIoKRoEmMXoCR3JafjfE!R8MUMI6@1fLze#(ts$0VSoV>#hRMu&k0&8>XbAlSRMI@ zWy)g6cddppuFFcTl{iM5LtC|EYF{A?{rt{g-bt)ONExGYkZY1_SXzrUIh3-}D)?xh zVi0KO=7VO^WRu4m7CrbF zLu)vBLV%y0wnp)>ro%ih)b126wOtx1Y8QZ0?)lVR5K}|jbg@*aUDSTQ|2^+hoO7Tn z$`i(2yu-=)STxpWYmGH$KJBk_T~WaMhEt>RwB{&!1UG>sn%-QVS9;?}x5Jv?=_(Qg z@%`SZKCN%&3(Zf>JoT9f*w;a8*y-+HIX}L;G{rQ@7tFEc3->sg-i(8sn{f<1e|A~7 zpJ*V}XP>FcQxkxD)->=_IB@#`)2{zHBCv`_UB%%*43q>ya~^TNWAZD`8AAOmptsud zgImK(z;z0)3EJme>pxl{J4aAhBY^*@fBWJ$>~(3sH$)ZJ8-*|DDp=FOS-NiL|A6Y! z#q{v(Ir_0uhj`mJJRR$&d~-XGv&|`&#;`6Z_v00Q;`Kk*o>i4e0@k@=4Wq4#{8ckb zeG!2FBn{^rE_hyq--y7dPvvgCD|o?=iXQ^O2TF@bYxw5zEg_|`YGsMAYz$jiE&Ph590=Nw zS_s)OmTN*8C^d7)cN`uMG(SO{h~6`dj%kQi$ku#u{)7Eoxp{|!~v~#QyoHJ7!o0Pa~Zcv&Xrn~`};>Wn+j|ghT#(FB+jr{ z=612YjK>gIwG_%)X}O(EQucGwXyVP;)4Tp_twe<}DB26j7dMPkV4`Uu)2Ond^$4}# zo5x9He|kVgNG^hmL^tBpnaie{gUI~7^h`)|i3uKYR>(F1IFoZGr9?`Jk{hSfi8*hH zaWpZ!L34URz|~sKwR{#ZsvWahZEJEymBEux{8O$D&4@I_3(K0>>%vhzIj;)Z-hTd$k3M+CG;a9nw|Ij$BAdvy->@zfZ53^ScNUG>y~-b*+?U#noI31aG+T=ti`~5dG(tz-p2{O} zXr$2*C~S6)X?M%8OYD~e?++(d%uReX_?`iGqOP^0JRRDE7==<+YE@E7-Pu`@*pLue zb7DV7_NSF&t3bh#8J8o@HA;@m1=iBgtXvI=>kqED4VB_6Hyg)Idd-{TmT$kmWSg?j&aJLCj-r*jyUYAc~`{O53m0Wi{bH zbYabzIHsx>2hzo7bDrP(_k3#AGAuv}96ysUZZ;v8;v9;sR;ZH$q*RM1AtW&=AH{%c<|^ehCZ;r>f0 zOm2hJ)e6u}X*DyXiP8)!?VP8!j2CCl&GuB37H=d85o;_cy`f8+qTXF{&YxUwz0sgq zkB~O8%;{{$)VaPMIiYEJ$_@2m>%D{KtoaOSc;_hEI{LezrO;5;TCAXdK0fDc%eLS< zhEr$^F0l3{sisQNg2O~j6~|ICrGXc7!j{r-PAO|fQGz(c2dY*p%sbm-wAKhQptZ3q z3sOLuAg&Uk#Z&k|M|qnNlTu_k_UErk=#-A8t&4@idzmS9A+!^LhRZ9juOeUjV9VFv zHvZnnYP_-ui)*9L@vsur=ygbh% zH8-W`+4X0l)7b(1bS*mDJ0*`g0WE}DkQk}X;e9mmL!`S*J+(Ay6}%sqroedXNmS%m zS@s!yTu8AoT?ICWiM$3L9#(S8#1t5&EfR(3kA%^&1mT!Ep13udG@2?|3^RRknQA3# zCNC?8hkFk94+Lk#1zkKj7t&_ndOP4^Wj!p&5Lj1h{zyp}BP6GYR$7J8Z|oqsevQ@) zwc0%5{G}e`&X`zn5F$K6a?Hc|)c4 zISFWDPT~uv!H~nzC$cM43Q|_IRa`C9T+o`SvV39xX>(1z%sDITlbC!K)i6gW0?nHn z((WHjm^_m{oVSzodCu+jFaI^CH~ zW6dkIS)2}7#7mHXlW^Yc;|PfB4Hnwn`u(+PcRSOb1mH8dfR2Q2T5zK^3bZPg?|t6S z6A%~70q@Sa<6R)_mw4;P!^t@dICW}6qd8~v17|<)&Tiq}V03l|+llies>1m^|6;cB z<@-M|Dt1jY?K-sxf+6v721qujLc1JuZPvUO(!gd+Y`0r{j|0e^&_uP*QuQo!bNT(} zuj09Q{XE0>301w=+UC^WCpIan^lMP<^R}i5YrN3zu0ttvh%DbbAr> z zzw}SPPdy$vxlGhVZOW1}sC7_>>{wW7S<%fvx%K?`;g0NQbmK^;$VcxYH~Yx;eqwt! zu^uY>e9v9^jC=~XG2p|1^ALL;np4A8=E|k$?3|;uOeuwm6%|w(`~4nTMq9!AjvsB= zy3q5=`5qlrq&j?QMzYh!qFu;@ixc?lb~@X1 z8+lo2WkuDYu9*WedVCylA=w=5l(kqvq4wvm7#7jcdy1DpbHV;krMB8LJ3V9Y)LPIA zxi)GDs8qx`E81X1ejEM&PAsbzF86z`yU=PcCT^z5^03a%kp6qEy92bV;OD>Fq18(f z3G99{L{DAwQ&H@XYDlUDqQh?!!6nLLq0N;E&&OA<_{dMB+biDGh0pf)lvdgKz$fDk z*M8vr{K$OV^HJLJdUHisGVb;ja=jt$-?2a4@k!k9_3dkJEGYXVEVXegmSO1ClU31qGRL_(niE7LwP5a;wLqK@ z38)Ccd&{-V3osMP9v=(QHD*rKqKMmAVJ}2-Otfar4nvHT(@c|s8z<(+1uY(eusbERq^IIfwI?cH3ZO-=r^&Yg)L@#cn@@#)>F2wUvVe?sO zl@cRM8mZeY!!$5xBb*+Q$9pvQW|Xu0SLm+CKE2gy2y^c(yVLv2oO{VWZ4G}e`qH|~ z)MHpxd+f8|==*Uk+6dzCru+BeZg)UZ42@g?Onmd+BQ#1aCZPz7F`{indNUQ67+Xr| zIisE+fm%#ZahQ9}$3V_2;7GpL4xPCM4T0-v>I@ZKGrlxJweBm|ak45NU!T^GQpy)x zULs=4RO@a=GoDeKUS6wHx&VB}s9J=CbB>%BR3S^Fw2TW0Et%$orOW+Jpj3JKT?Ilv zcb$MHDupIc%1Y^?wN?}S?WHzzb)t+Z5QC!@LyWhkl+^IabE1x^r`tmyNF`@At<6|l=Fs}jme{frz8h0 zk*lL+XyTFL$W3TXh;fUHkro7kXT0`|r82K~JRAxsIl^$n>4v-}){|1I;q2qI5@Y7( zOCJz@U>zgbJIi&it2yAcF|^#zS2fpgE3mFe&TK;<`B${+nM*~p;#(z2VF;BJSDFi? z!9J^LjEu>yn^rR{nNzW~%0)*Q%xQNd{aXe$?bj$P|O zJ?FhPYR)vL_~dckQ)rOH_PIV0aFl#LzRI#F8Xg!`xbYQVEvGhkVHClOate-8TF>=W zYn13BEUn@sbd0@r^ty?>Ce%rHp7yL>bu_2F;idnZdXiZFaLY63o>~`bT@kJ1pD2%6 z?yp(|gX)Fapw67#HYG>SDCUB>gU_x=X;3>(xQP<vSJQFCrt))`I8bIbQmCb?XZP@zYQD9ZeTGrIT&NjtNvm8?9xVS6xJcBMk#ramy!H z6Mh(J>UccO?2iZ5we(oNdU10rPr~n+u5lJd|JdOcJ73QCQeurtwKoELE!F^n6K;vaq)FXLsrjDKb0MF{?xhQ1)7U&bFZL~t=8=gg89 zH}K1N8Gj;%D*V0Q`i%V{^B4czmo9yoPK3Yu8((2ap5OlVyPx_!QRO%P?r(9}jJ)~a z_Gf+_zw@Vlfe()h*FX9(WnM0hDOYXH@!m5ZPtY=ZS|!i3 zhhj!9cl6$ zEB4dloEfR*DfZ)e=ll8p&IylgVa}CDXAa~oiui$Df~bPlOj{Sc!W2h78E^Rd^qOmz z*qs`y_k3l#WfuecvJ$3&Pr{Z~3jb90$PgGeiOsa-ewq3H-H+LAHe7G6@xSyn*5Cg_ zPVWws_j^)ExD>db7k+engfAzyVPaSW<_g6MCoXw5yA4;{k^MMuoM%LY-R_zof#d$b z_ujEpgXV2a7#N(W)ZerAdT+Dqwje@#BlSGlgVF~0q z((vTkI363NG;%AnCd_l7W`_^3IL9fBR38!Nam}$VCyqzUId^^nEjV3C?Z~(s@pqrn z+%>U{6p6f@pC*YT<)L($Bt&F(#%Im}9K2!`%=t_wG%;MYv?N^#0za*%{} zmGIRQgF`lsHb(ShPGh$j2ww{5QQ%$?FBeCY(C|SJ4=R~eXG%9LHCGUXDwW#clvfV> z6HzAWdA{vMeJkag1F=5KBs`-tpEs%$^(@0cxxOM^Z`leA$35|QB8g-1R`_fJwN-Qf z_PMc38CKLi=lrUPtPzK+N^O;s-qXFCH3~+*DJ693e%jn#&j`UvT7}zxFZo zwaeB%5rJkn=ykPh(;yD-g*kUrvNIQVrI|w&XX{EYViz^6_Sq$NaeRB|9VIkvL~p9? znPh?L1v9O!;@p5Xa~K<wVH z)~rNtbA+LRg*9h8UlFQ;t4e8>VQt_;6S>WmYsluNjnJL!=V4A@HHW_!LiCU;yJ5sB zPi{;n_%RZqx9dZE7pX%hEy55ZF$Ajjq+||lCk}Phgl$n`NR(oks_VSiXWVnl$K-Jy z`yLeD!tQRd8MNXW1w z-wHKH=CSZTBt95^z}h@Z3Dh>y*2?L)$Db-`1eXS8XL-!^cx2h1IOWEY3#BQe&Uo*M z(G$G0&%YF+!04mlwu>;jz-E`YogmZ`>dqIXOlq5`F$$A!9P#3!mKMP7&4aB=iGB>i z<$XwN=EA03)~l+*+MZfAOk`ABe_Ewf4{Er7FXq%Y2dtsL9Y!nH1~q50DwU^u26I6_ zbCfz;r{pq!^!2Ax0nX%y^P2icRkVImEcWNQPx`uaar%bdgaDOHsn#^*MDaednYQe% zw(Lf0>U~%imSrJ#B7~~N2&mJadd@GtmM`A#T!h}I>9D`f-grzWL#dq$(h=RZzc^ih6ci(fI3xDl5zG|4kKK|mL`-Bi2zx7Yv{M7G+TKQ{#=O6GN{ri83 z90kAWQ80F z3}Il30arJM*-L_~4Oh*X)Ufgzr9k+b2 z`+(QO6*qn$RLEgqRV&=Rm6;y|%Us>m!2Riw&xaL175q5!IG!k)`O(8W4xj%BbwVCT zWNhqiCfvT#$^wIDFAMJvcO2g*DC^-wRDqqR&V{xbHZu6Y#yO^#nA|`)73#X8+R&1Tp>UHL z8(A2g@(>;KTyUc>xrwDjT2WRO-X2fXIB;`y#o`LH6Q*>{oFj$GFeV077&mOE9hy(f zN5h`xgXj2O*}Pi0y1L|B7*i@?K65#1bi^0p{kP7Kyb?b zVMX%;^KvwYu6SZ>)a=MPFbr0-5_K$xN(v?fJv^*@cE7NyFkEd}j>_qzh%`1EYsSc{ z%~Q*=l16jWuIoxEkx~kG$6^@h;#p5KS@tkFy6XA_d_!t>=<#amWhk$d%noUHhwUAeH2%5-e%>ZeLc!jl? z1Gajh(AdgoXjm60&+vX(8>K0^R(xyL9OKV9t_~kP!<6uDV4i1M&MZp?j!$k1 zOOetV^_jTZL@2plC=Jdz^7`x=c}{+$5u`s46;l*Y2V>QL}%S5nNl$Zjj;xwSu^|jp-1iUta3Tvr2pA2Oy)^Ju@ z?ZRv5g0nN{bg;R(`mF*xl=E!>dOXl8YpDeI8R>H5Xd+?$WI5oU*oz z`hbs))-2idj0z7vkz2(%Yw#_(krL1HkR3S}np4YOrxLu7o8oE%DyofN3j;@m&+3T} zWks^`{nN~EKOFe(o#Su)%EZ@h1Ai-w{F&Pgzr8>4hu{7_|1ADK!$$+J#%~Z~#HYv* z2PAn^JZs71JQImM$5XmMYodsp1tVH-Y&ttWxrlq-+qs!SZEfxKuR<<`ss&d)qXe##=XwBNBc)Wl1R`RhQ?2B~ zYWVhC(WO$?Lb^>hZz$GGR~#+|M1`gm0Omj$zg@C5__YRWrY=UKQD?*fKa6;1O@kGo z(#%~f9$d4}p*L2EIvi@vLY(!)X3kVrTvS?}4JRIilmh6z2}0?Lt4-kTNjc7i(K&8X z5$J7bD#Zv?gL{rp*K&z@EF=Aae2;3c#mxZrSZv`p+FQk^wz zs3@9}NoF>HxpAf*j143?uU0$upiRxj(tnR;=_ z{{@`dbA}MCAyWKhj|@=!7F8vZ88ox5N0#+O&NFBsrrpz?y`7z}Pr0l$zX!FPV<*w5 zJbeu_noy^9V7a!T4kT4;Sa2S3!Sc_$zV8I>-qQKNxb}`z$<-CeE#>J6op;S6L**U z$YwDWG@P|D^m$01J-)fVU5Kpn5edQWb9(mr`5sYQcdE-w zF2;)x{4YCRkkBvVj~ycT7%ijmocHxIUdGG#xgX#8{v-eK`aS-=zx*{~c$(Y)onQZm zS{whrfA-T(;LUO7ul=2Wz<>PLe}m%vPyPG&#Lf2~oHnZg`vz$PhWL zcf9-l_qn=>+KJfl@WV-r@HLGFzyg;#Y zz`I197k>PBVtln_&Ii_32ofpTlL>~{tPV})j6Lj+9PSHEwi`$J*lN6W-@%6!r;athOwI35deHPK~Vm6RrGt?UmA zLo#ux63@s9PlXS=)N_0=swx3GWUzGY6eayKb&hrm2I zuA^`znQdv@F9EzcNMcOp9IA!Wen#_(zqzG0#rcScqqa;DrFd)LIoz)dQ=&=fF6t-o zGlal48YbI0XLDIAs1t^9VA}4G<}b}MWzFn!#(S|Qg&1Iajh2GUE3OKug7n;1YGpvl zD}=@44~^n-c|@0s@|{0u4JwXx1K@_NfOCB(0|y`xD%X{0d_nrB%vItwue z_Ja}xsDiH*IT!F%Xis(i%e>v`s+YN3hKVvna`H^kGp>y^uatRab<(^yKa#?fFc2|lj(qPHo zDd4??I0IG1#Xwoti{lR`q!_8Q2^{A&Bs#<0i#pVs z027nPd!g3WajGkcM3O{p72iM##K8pMs+FK7Ump5MQb zN4SXns>-^q-Ps+w0OdOdJ0syNI+#n^DO9aELZ1(hd~G}NN??qSjPDy`*pZ3+_L~#` z=f?wo>Kj-5ag<7&rkeVHvB<-&8PQ{-~GYw;L|`F2Zm|OX18Ut-QnZFFhnLM zySA`w@e8=LBWDTS`N{c@KDj$Z@TJ)~8yw5Lu)lv~Eek0@a>B`FT#O_MG=afKrtKA* z-Iirpm<}geZ3F~Y3Zg5aEy$WUofN(HY_^fLRNlW``drrtIwAD~wEckQdQ(PignoSm z^=K2OU1A&tT=1+*L36QY7VYzBXn3bks>NX>!vV*5Wf=59Q7zPbGLp=)5Q-9t!xebE z-!p9zX&cSu?M!Gx1doG|jLv`%l4B50@!4|I)ts4Tjco+yDYbB1PN*2>)@h*RjMPTz z*R)DU%?3|hL43uJ4iXF%q-1aZ%)?>%06 zW<2KZch7!Cf8yM@+_yYCZ}ca={sO*Of7*?!YSbc?-uxxjSnI_yi(~XOiZwk|Tia@_ ztfgJlPD!qjx9;m+Qri zttuc9=ORuLULtrkEVw%pr^==I7Oi-CJVL)IJjX$_W_xYwlLHueRvYZ^%iQQ)P3DP~ z;yi@lj2@&8r`E(Aq>Ja`5vTb7;Fo^k|HL0N{`{|f^o76w!{7etuJ)JlvyU?x=9~}k zGG4~Zco{!`!)_j(cVFoGeHs7aq1~zUA_BjRKWfNXfavalm+>-Q#?SwFJY;_O>5*Uj z+7-b+&Fx?N(vEqqym>$W)bDIgGrRqXKm1pa2b@FT{chyL?|q+AD!EjSr&=0bWCp>WeG413}awi3)7NP$iod@lB0DV;&xOcm2rQ-CIt>J8*llo_OmD zKb~N83pbLuDif#DII-Z#q?)0eaCls+Pk$(Q6px`W%gNBcPQal^Yd!n0(AEWM#RP6Y zAz>nfL~z!r?J#PGLkZ0gsO!>L)<$g+=QcC~(T@y7v^GjP0hP%|CO<%`+&?~WI6N>o zVTu6=tj#f3E24_?NQhK%l%_ZpqJWdel~>lPtkt^Xcavir8o8}3()b_^hFDc-xgi!- z%#q6bdLmXw43QyB3}G~fwKjYR#BpSlMxjx>gJ5}N&In}G&`4#&m)nkC^|#!d9C~+R zERGM;hMPDcDe#reYreJlDj)HhNj4Ayb6aUqIiB9~+2M|NQebz@<8ft~3lDYS4^MY! zQPMD?BD{I`hKIZNj6U%yUbAZnIWBzcH+<{%Lq55=WjP(We{)YbD7VYNtMUn7u8oi6 zo>#-36lOxqY{twWdt$i5%L!MHY$UU7C&)*Z)|j1VOXbzojwMxozrN#*+q2Y#w|VAA zgTfH`ae3hFx<}*4!~MeH-JW0k@B_ZG@szkCC9@rOtScN&jcI#B1KvH{A(P^rBONLd z2KGaw&6Q2{yo(hH8``NMDRB(S?rO&;>iJM2WAY?_utta*&vpI*yL94C;jRTrbnM$m z)`8pxmKw>;u@)!`xHfS(M#?d>_Xoa^fS~O8=YaEX!a;_|OMO($Y?wBkEe89(q8xreoq>7`}ifc*|Ok8pBFhAn_ zmi;L+XCR+c%_ zigG$G)ZA!AnNKtGX{Oc2x~#0r%Cdmuf<(c;z9IXF&yGm~hj~x@{0(jYh#pQ14VL4~ zyZZ+omdbsJe1GHl@pj}>Z-vQ}gt8H`kGKOoluC%nveRw0GV!Q7YV*ik@jfyOJk~-E zo>G)H7lsx%KJ1y7g^xb|GEO|l!x2Hr%hAq{DUe1-NDwArx*C`^i4YyZL*)@#VOdVJ ztONpsL`Dg)W@2kNFDz}PXknZNqW3I0vuLC0NDxKc!V-@7C|oh&9xHe6A4qS7=SW!sc@>sgs7@IX6EDw;SyJ5h$hEo%}oi|+Qb~8X;*u+3vkBn#1scVGj zsI3s45Q3vgWAPO)5K|-#Bc(LNMdmpZ(}1dDrQlNFw48_`m`L1A1SzfH)|IPiqO64w z2ctF23o!<~D9u$sIUbIT!+_R?^N|9a=7r<}b*%&+!Ff)3A&!YsyK~wnBLw6EPC4Zx z!!%NXITuPwR2)7IsPj}jS%p;`O9SW4mF2`yo3KC5q&Oks$!ozS;c!|>(}tqTs*N~p zs3IJeg(*1Nx-tzTf}ys93j`miIWujpS

Yj~gBXIA8eHjqq#wz<;x5e&@Sy`N6zl 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

-u9#e$P&JLzdB)O0nP*H_=UrN$R6O8Bv0CXQ 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 JPDHLkV1obYoyGtF literal 0 HcmV?d00001 diff --git a/resources/zzz/stats/background/mondstadt.png b/resources/zzz/stats/background/mondstadt.png new file mode 100644 index 0000000000000000000000000000000000000000..d36b7dfd60ff1891ffac816ffe3e9d40e4393228 GIT binary patch literal 350631 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

(}PJ(E9 zEk&-3;>oGeCB+L+U=(bEzwF!X_en{k!_7_fX5+J4tC7dV%0#9XK+pcnj-^jC5hq4T z{+TIB6~q!WT-@mi5NIF#t7V8GIR+DH&`7b6#Gf5Gmm|Dc#OMleb~`2YtM71UHlo>I z-fJpFg>n|yWdmCZ;9#(h`1tpAy?8DU=JnCC#oOWW0|FxQUn)GeL(t0cY8$)HR@_{t zrZj;0T}Iw5#$0?hW{^Yi2$aW1v^jkv*D z!~o>`;cCibH@>G+Aj6on;h)@&n#>5HL3XX83L7npV7l9meg-#I3?QwP@>lz36bOo_ zxR_EyR0IP^KN9f;7fD@}+@zd_D+gy_W{v~p)>~Ev27Ed(G=!;+;4WI5HCb9r^jU># zwS~sIUz2_FwI9#xvNbTJ*8eRB^t2rbrnTJXWplKg$mX=E%T#AvO&f?x~ft+>msTkAQdki4SOQOx0YtE5#Zq>mnWvNM?7 zKKgQ-xoD`UsSuu4X;?S$f|v} z+;@pGt+CRMsXD>Y?lM5}f;Nd?U6}8N$2w7-TpD?#qgpE8iEW{-0H$S^Kyfe`ASP5t@W9kp&FC> zZ{sFtk77(`P`(eHIUx!`!6jsL)u)&L`6Q_>sFCDj|twizmldRYva}VKlqxyIh0u-tP$Q=aCQ7{s|szs z_7xs>`MQKS`?u7jLg1!e7kaq`_FTQQjAv*9(s*=0Pz6FG_oIL^@(k46qDv+(4y||e zaB&<4FG+*=X)uknShHDJocEk%m7BYR|Ghf*KE!x+c?Yh&y;#>>n*?OZKRz(@?Q;dc zx9o@JjGdFU-aftH{2w96OZNYSAZx)4@69Q$?-QnbUy100q>H0>UX)W^XMqGyG}&Qcvq%rMM^}Nqah??-dX+TFNw^=q$t1BlGFQ#7uwO! z&8dVBfx7jJIFOda3&pQp zJ-`S?(+tWaO&2cm%H;V!Y^$^FBHQ?R zDLRNXB`lNjKU}K}Iy6!i%HHv4^gx=9 zyKHyjucBjFW_gE3Q;lVch%3qqB3nG09S@&{HLTRHz1&Bie1`YX@^?#i-@D+w_;chH zar6k_|7iRwtMt0$0RVbmRQMVzD{X^TH-6S;?SyPq-pk1pa96-g@}2Y%X&#Ba$AbrA z2KLIUqFdNpToT#H0o9jnfo_A4uQCBQ92(9*B0zvgQp{>C9f&o>=Mt{eTHOgn zOw4$qVz{14-Z$_pD0=1%e%EJa#`Ndi^?aYD`|+Tf!S6Nif}a8Dy=v?J>Q0i414br; zZVZ8A;VrfoU{>>jlEqLN_Euc;a#4HrV*1R@O8|(lBKPjSQejM<6dH!LJuB!UTLToIM|X|LF6x%2 zmASUO*oKWx+!Hao>W!vLu%)aXtT)PdbkmeCy)&K}skHghR7|{S5X$$EP?;KxFqI(f zSd&VIE}4i_!tet5Qn6H~=W1JbmUZ){pFe?k56xh>rKh9xIN3o}H3=a^u=Oga)h-7F zROe^?JcUD04A5Q_*()^A4r_uK0ekq$GMGxZln849tw~Rl_}%-Zsorv- zXQ6g75T`6WHw^(B&5C|)PFLsU^y0t|pGO0=iB8V>vV&S`z{c{$IAf_JWl~Q@%jWwF z?ZR;<_=M~4yHAcFqz`U-H$whr;Nsim|5lZ{6WVfL-#n)^|8vm|yfHlh1jo7{lBk!5 zsW6G<#fN<*2{s>+{u;e&S`rU)!p2@!-uJ7qzc8+^85k!VcNY3{fEv!SZClEHJmuE% zwb(J>XMpjPt|X`WMN;YJXAXI|(O)xq2P8Z-qwUPXVnSC&B2yxAVFky`nvrt!i%DXm z)K^PtOf^^>1b?h-fyju#Xi$bc&jF(6GDg2K#d9SQ?4E-z8fd5gA6s7))Ki@UqKyBBvT?rz1QSShZ7;_mS0z53^yd2Y^SCb`HyYwacbv>1_SC5)Uy z-su3Rkn-JTVs{}gO|21~=gKUIeq7DA!w|a1hXHZI3M}rb{mO72thAZ4TS32NtCot1 z83rb#A)2US+m$)y!STWxMw-x3Nkst6e}5f0i!ELS0wNZa=Fia+3#vJ)<-Y0u%`Jt- zPyO?~RVW2R&28BxVhN|d{?~iu2oLwdO4PoR(J)#I)h zP$qX`VWDx~-t4CDv?a3@Ehvky*+Z%Q0wd63R8YrN69~@9jNn&Q+pJ%t{cbgLn#B+Y z)>F?U$s2sD2p^gA=$12EwfQZtYQd>%#}9%}V8%F*ilDV(SMD5 z?l*RGmr{QUzokA$IIC3=Wsx(P+8cx~amJqJv7)vdTpNA(4>OPK6ki}ktPqo(2)Nkv z-O}%FA#xfIjwu24`FMi!V?e7fuJ3{7^NP1`Ht;C%9V4gO@|b7Z3XX|TIR?sJXvNz> z_pgrg+#UR2cQ z9kcOqRu= z!22}8yKUkOojI2|(lUnJbqqF*?hjMqjypOPP|yn;ZIN@V6rv2-t<1M^-rdDns@S+g zgW$KW7^I{a!>>^4(fJWbqC>>Q#sXFNjmK)4gjZX6(hM8WL z3}tHS^|*a{%u(A+m&|6wvHy!%Wf}2o^V)6Coa%|~^3Su4dj`QlX5yg1fO4@+4f5V@ zIj%55E8HmF#R#1qdRn9B&sp`66$idcxrZrXqMiXJEv>M0Aq?hhP@}yJ> ztF`(dLLcIj9duYgBvWpRxd)c$4HYrds0q?8T}ZpyCHKD^{8)?r8b}teuRrLaW>6(Q zyN64K3ywhc{W{sH!bML9kz{V4hF9L}FFMcZvIe?aiI4IaO`Rk+PPHhfa?!AB{Mm8u zaUmI!(9$l|q*#+F48<{O1@<=`B_?Z`zGIRfh)c7Ju*x?DUH6BbBT%N$m(k@^^xVFR z_4T8+<3d{{J-4gEfu?->gwF;qXa8K$e=Y>*0+Xx*t|DC9sQ)-p-b@l-#Xztu3dg=I z+kcZ%Sj%l((2YP{Jk$f%|>a#ySPoB zdW=2ZZ`-+4R}}_$+sbD&QGPj)Pi+rx9Xej00b~E+-h2%Mw>W;TkLCoPALNPL;9sCd zJT|qCAi?2{L5&e{4f%jHa@=JD79ZxS{BR@s44Mx|yiti;Jx`KZt79OCB_45F^b$O?x+0z^E`F)!vvA1tBI9<^{Xyqk{F%6yVKWe`0O4 znEZTBJz`V93OFQ=Lk^use-K_ z*+f?txcd1ih=6^dEw?a6pGUquw?{;I`G!|p?IK5vj-$f^g2hGZW*vEhRbrCu!|VNV{rU_+zo(>eGXH73EuUOg5qvMu zg1<1p;Cgc$Pf*0DQQy!sM~931;t5};_v^`k(Mu~DLC$AdVc=_2;pdIO+sYNL&kacm zjrb<`Ckl~@1jzB2@z~1sp05B&OWf2HPmx+EPzhpd8dKFJ@S=l?>04;{h!+KS=o4hC&@DwimXy8 z-LIBN{a`PDU=9kb{cW+d^3t-C>P0|^8PdYXIg8e`oCe4I?X`X-eubPMUsKmA7$XKZ z(6}oW5`zpVYATT0NLITMP_YOw#e1pI%58Uaha$HTGHkQ+<&3+~Nr5=^FilgfJZnQn zYld66Zyy21Hm@uvjWv+56j6laL`nmGvJ_3u^>x!RA%Emdm1d=X$MOEs=~N(SOb8zN zo&Ksr0vS7Iwk1~C=1*isoEnaqAp=v^kBHKpjEvO5th0515=u|V0IT>N^=TfrtngM_ zsZj9vvMzEgfDi%3n{VM}U-Bcs=qiSAN-Epn+u9~oL^N_i)P0_Nk0U-sw*|&f7FWhv zky3k%v1^lJLAP5tZNE~NF(3z#eUrkADTZ2Ko$&w&E;RMnsUytvQB$rld4-@Ld~ z;H)%%QkTF0N zHh{TeftZS)D|}eD8U+ErTxO_r+UNSBK8-{D7wd-lAM3uvv;BCR;1l`O_R5kIlA*0n zQU@@QIT;cZ|4_Sw%E6+iRf*iG1g{zf_aef1kH8?&0=dfSI0K*i$aql(_FQ%kzNCp7 z5cQs7(Kq5fzB|+`XX``3ZplDgjWB~ii;{uth$?oSlFePvu~hukS*ngOmE&&yaV!ZL zk8m1jj>8{Y3eAqfg?i+!cxb{oQrwr5HYbZg3y$#WL0k3}$H=vro?Gh-Leh|)3WVGe zGZT^u@gICoo~I+`!7<1hK1!K1J|YIfbETUtEKUE5sIKmaV{DmwLQa2t+UXq8mO)oj z9gW)2$FGaJ#lO0i3bu)84#UctvBb~r+uq^Y8{PLC=teAEBJ$ArRYhC9TO+PfiQu57 znwS^gA%3H|RfOA^hNwe4kT^K^wT;?m2Cw^cZ2{u_1ZJz04wk!!&osvq64*xVXW@fp zmZsx5R&88`u0pQyRV~b^YN zNbgT1D2mAI`Yl9|*y)mdX>hSlOJjC%mT+(K_%(O{r!(D^w2rV<`%6XG<3~C~5B`*M z?orKfh-&<;>_*EYBfAxh5v0HLP<-1@|LuKoV`r~{L!aR!tWZSF)fV!3D{2Enjs}LV z8PVl|p|t1PB2>~DA?U=%5cn2*#YGK$ef@cN5_ghsIbwoqY2>IQSp=q*Dx+4~VR5>a ztruQ*FQKIPvn|c00>q=z zrUF4;88r#ngnNRXms|UxXu><^yxV*4mjOhQ*&z9$T_`YaOR4e-@EPi<%UWdy(bA5{ zMdRUI`kj!H8Rp%te(dIKKOc>^!1c?yKcd~HI+8iaPOsUG+41aOFIoZcz~B!`2=uYJ z3ZAYIA4Mg4BD-6SPHf#%|Lzb(ZX^3dZKJK+_dbRrN6L@h$LA`UoV@?u-anGwe(WQW ziky1;@HjpFEbH|wv?2ZT9gd@9wYavPoxxGV&`C**_+N~>b))}G)LI+v&*#V*`4%0_M9_T+VZemeZ+DqX+qUk$JnhAtN9DV z?kskBsu^Eiud!80RXpl(|LiDkA=%Vy!i8*lv)fTSv0AXUi0SP9;>}c{ialznb+Fx1 z`1ev5kaB3Cu{tGmkk?*D>OlE4`JQ$Dh}GHS zKeik5gHiIf0xPBa@%?lv4WwtK_EPb)XMKbt&n_Q|W^ZE}G26i+U`G9BEz1vlb)4_- z#Bv7#=*jw%S9X*PxS^r8O$83Gf1PS|_q1itycFq0YXiNFJvi8Ig9dA`2UykZKKtZ< zJ+qJg2VQjjpCf6zpJ{TNHPC9OK*LMxn-r@w@v_XU1dezWl;9*p42~ND7c6KntrSBM z%2BXqJl81T8=z}Aa*mi5Pl%5JaU>02ZG=!uyHLZAw`LO0qF#PF5ftVT-k@JKdP+EL zp@B8a8xD^R0lH?G&dD+P_U$Ul)ts?-HLngGPBX+zu8}*ApovZu=X$6I1yCWiX{UKs z21Fot`g}qikCZ`XvWBHDV2y2=MX)TYOrF7-4rQ1{aNqyMpJXaSIdr`j)D|)c2YzGJ zmXcHW%fw(f7x1J(re;7FbKF4*$r1A;Vbxd7+kxW*1Fsst5J3bH3RkI^aHzP72&QGE zgI7xPViWFTBfA^lw&ZBAobhdNstHnE^!0|M<=Ljaom6A@W-KHHP1QoiP!%eCJj8!b z_pm@%HJiHT-&eO;!tY{1v}?hf5<_mOFLP^fFO2z&8h)=HD0cR;V$xN{LUnSN;LLTM zN4OpK<$C5T%5VHvNPaJ*IZV9=D^ACgYp?;Xd8i!7PWc`5O%Vu0wk>n8kiS#97n6_w zQ~Wpg7hyMb5+b_UMm0hHuU4O;20F4%YD5jJr(*Hn&Sy&Nq)j((cmK1i6O<@NFWz!) zoUy2_*0Qb=Z;P0_H!>g~4-A4)y>^4|((?M3;>U39Ejyk&e`SN!Jg`g1=pQkw77>dk z<8<5(Q65@tw<~JG#m_COE#J%ap68?7JVF04F@ch7lADj$OIN2$)Z)>hF6)1)CKplu zGMg;Nw?QRKH!T0QxmB$yLmC)oGiw?HoPVs>@`;Fmz)fwXX<0A;K5sey{_;9vv7OCA zugukpZII)~~({(m~RLIcJZ|F1;m0kUBHfU>;_o@A(E-=$k=!3?{A0*%7;Wq69WLg(_ zd!k26*gA52Yi$4*@{1UIyb+!cQlc_(2z14YWTi^XvE7x%OH4ObO4q1PmE1cuHhXfc z6u0g1tJHHzbD3I!sQUjxQy`P!Lnl-zbYZYwD5I0duUbg-zn zG)y z``?W^1E6EsaQuP9I=>|qDJ+R)|EwfR3xknl>Ffz`p7x(X;3kOd065XZ7V(kLjQIwv_NFx^RE`OYt^0~nfv-|lCoELpXH!T^=Ds(;6D)GT=4%W@%Ukm z$md?(kpN>$B%T-_A`aZv{&bcJ0FzuQ#MPXm^|p3q*C}g>EAC0gOoM-9cfV7iMMBTX z3e|QKPm#mdx=fApkWsrqA>jiD=BM%^8Gv3zF&8PZw$vdpashGtk7xo>iw^#;tsrsi z;l(yr8^x%pGR+!EC&p0<>xz7W&u+ z7DqB_{!U{RlP%~7#mE|~+P^W5;Qws6YsbD>^&$?O`;_zdN@ryHrfDb!Hd`Vdf*$eH z@cl7YO@x}PXo{yXvz2-1!9$emn_6^`P3ip46YvM6(10W79;h?ogf=&0S)DMU4)COY zUoNq-74UGBG{t$S)n zrnbV<^$rWnm3wF~0)7(s8=|9Ol`~3`ux}S3kdTQ8Sd;{hS41y=Ie&woN!WNKCY|+u zI3svWNJQ6iy)m88+VWPhE6XKp4$kut-()MC@d|L6te)eF6{zhBenyTkw=><_PgRG# z)tJe=fv&HXWtv(-fHICze9vN zrsq!2?Q*5Ypq?pYEQ+t?{_flwt@F)Q=fufcZWT#-JBa>kpUEq^KKIglez zvUhazTFj@i)T!uc@i3BuvOyEFs>Cmr2_USH-kbO}%@Hz(H@Dk&&CxzzqQ9yzT3ZIp z{pq)z&Z^2CG->_xWCyNT*p{Q!I;B*i_?=XB-=Qa_)xOYUFVNt3-XI%Z2YgZG+4C}y zX2hvO%c7wW5+hcEOw8bxkJbN1K4d!+1!#f~juD#_i$!3;2^mzBJGf4|mwW4c->{`Y z6`D&RG}NLjVAgTOyk8*FW?2pw@Pu{XVMvKBXtHZcdZrM^F{&@Z?&gOGcVdcXTU;P* zT}qN_p@LHwX^n?|DFtqD038(k=qJ@^8>`Mh{ zVDe}EsxVb#O7oQt_Y1M$!TEhK#7?g9aglp3%}(5V}`UvhA5Id z=83cc!wSNwbpE#`b@qauD$4pd1z0Q%7*_$#0e~=p{YJ2w^g(KVoB!$yBa$9yZ{XES^E z8FTrifAw=FmaCsHIp$EIsCuS4iw872>?Fn-Q#I*U@SwLW6$HL>^kXf7;AHI#5?`NE z{lGTP_KdLBy{{@p^7UplchY031z1r#z1W^m@fy%zKSH0J29#JU6^T!_fqIUTeRhFS zPq#~W$G_s5Ih}gNokC)S3!IS;MwYoePuYzshgVdHYU|ezo?P<^fyoCF3cvM4hX@;K zJHG@@DQ1%lguNh@6x_TtK6lRoZpK3!hqcGH#2eZvw6iuxUIKH^P5bEZ{7VPjc;&ez z@Ts7W(!xvSkl$!14U>CsasO5C#^NmS{7M#g;0Sg@#m2id>XR!@*gv>fGNS~rVBCL9yD zCJ>>DF!{3M)KLl!$7|nKLxX@%pUsa}b1CL}K4cGizD|!(05eNX3*crID7y4Z$QSte zub5O+p=Ox;_PS2lorPz~v`uXS~a;mreC?&$Nh=XS^ z^EG`+exzEFQ#YFbQfOFbJR3QWh2PSI>XFFw&aLjJK8p6@%9#S04QVbx-}$^?@$fhL zXlcqdElej#0y&c;aWQo3iL#$cP!?|Hb$ny9FnNTA<-~kIzqlO|>*)hEn+2mP=rPGA z!~iX0W@^Rh{ovy9&S9e2?FaJA6ry8Ci3(L-gG9HwDzS2kMUdMKttw-?0~+Pa)yuU@V1zw@!%AWq-#t@u?xuNHRQ%`-3)is zoTWXKe|U3IM1?-RsWOA{SOt~46Q-noWMPO)tS^Z>%2iqRB_K456H!#rna+=jx{>td zvnNniXXEeBvfSR?r8yJx@$v0GJY=-l6PVUA?8M5;(IcO7v-ib<&9~NnkSS;R92^~K zbI*TSHk%M5F`&}KDuIaUt$zC$q^oX$mkVl$=e5*Lt+T)}=aE;eEpHIX$65b9&UDKtE*QTHx~0;qMe|oQo6or+FEHu?;eq*ukrLe7ySnYbGro4( z6r0qT;@Mq=Ux-k;4F(!R6?5U_qHX!v_Vy1>q!kL9TX2QEGtVxfFMtPXmj!zkiYX0HdSDk2#uJ^&9*St%{7^CMVwl!JhM{00I zhJ8b#J^bQ^v%sq@7B91juIo>gAEE+?VzFaW3I)_C@%P5I)v@E#2abX?`L!_c=@tt0jobH0exO@u(0Vb_aaiDYNy z;BvcX{i;9EdH4*DGEu%X+kJW+OZPHMKpB0oBvo$VSLZxBLMwl?NnS+I$dC%Q6h2~{ zXM3C$FY>I}(RE5RyEFfz-~%c+o{6APGo&d)OaO`}hf$#fXmR?Fj|lR_ofaG&gr$-E z`vSC6bD(0*il5elxGbko8swdv7LZeoD6*o9rXr|-L32~ejvUZgbpGqsqPSyj-c%m% z){F}h<=zhk?-1LFqtz2k>BDQI*%OyP+5tJ15lQpNQb_xNz3;Xj7i?b@r`RmvncuTI zX2Q*-St80Lk(1Aer}D`0c>L$2abijJ2bS26LJ|m=#T#WwG(}y@Z3X!)UUx|h{ru}z zAYa@1H1&bHFqcvBlyP8Lu=juHW z!-gRbRtOt;a5iWIFMBKgrNwC@tRjDB$rI7N`Vde~`jD{Pgpn|U2ODQc)jtl%E}sJ5 z@;}i&=RS`LZ&p7-`{jmFicaujFuMr$d;$)0w?neg*9nk_03rhWC#ey_VqvTt2A=| zhzXU|U$j<*$h!L&YrVYOLmh}k?4j}WRl*!+BrOgLDrTK|*b;}h>V+t->5VJxYn)!= z0;fYcOAeBAXE`B52?(S{$;<61?QvlX$1ZJv>HO$p~s&~iZN`v#@q+xw9 z!4ad`P)U7+)Z#x*n)ZRJ5-s&Of5*13uWJ$8Iq1)g=ddOdvR%f^eH~MMzqQV-L_>cJ zCk(?vdX;q|T&Yo_Fbp0&^duj7)H_3YpDaT($W4I*B}#tLSZzsEuQS&dShs98+-H^;dx1AA_{heS*qFO8`vVjLf`7ht-`3_*sFW z`pyK|liow3?RkZ3*sShCPQS~is13bBG+L2~sUdrgcwsrj1B+s?Juk~S;I|9o zP*&Pm8tAkDR8z2pWTx7q^<9t%akx@@vb3101{4X&fg3}}Q}s42ppc$|bRb@s>19-x zp@@wqI4YXA11`l^Xl0b*R@SLbMh{DCVF2g@uQk�oUp9?QxVn($JUEe>K>cu^Npn z)AHz9cKl|X6Mm|Hff7KHZ40mC#b)*#T~-@-&i~hjJDpZZnrjOuB?SOaM@T8gakra`oTH4SkCEb_K2T=DPti?FN-<+c@LG1bz{ zd_|o+PTCXNN`PvL?|MI&EE=kf>NLGBJ9~Q%ZAIR=g`dv|hS|`~sKVIdBjp0@Wv}W_ zgCe@SO=Q^8)V_B`2qHsgb4(iiuqIq#HEPnYM@UrqRc1T^7XREf4KZ5Q>^im-??7t%tF|N9LT7cQ*+A&b3r>s%jt)DwM``-P_6vLSV zG#rmXL#;y3hE44wLZ6EWpp0_)%cDP$5}+NLtBQF1Z**sJb zuJRP)Q_4x(V5N2PXCj-c(K$?f!RX9vCPq7&$YA>O_kbVtQ)QEkMSsV3Go)!2`;>km zS-j|;gopb+EoIP#GYz4#$6@>BMa=tkaaNIFIhEU<+HYzkR^w$M8%#d2`Mw6%3|)Ep zw0#)wm>?}d?VVpOSSLtbFDI

=PW(`kJkcQ@!yBe*%YoP1BA3oM7lgKy?h)nQR&U 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 IKTXpA0f_EbzyJUM literal 0 HcmV?d00001 diff --git a/resources/zzz/stats/example/liyue.css b/resources/zzz/stats/example/liyue.css new file mode 100644 index 0000000..4cca478 --- /dev/null +++ b/resources/zzz/stats/example/liyue.css @@ -0,0 +1,62 @@ +:root { + --primary: #ffeabd; +} + +body { + background-color: #f5f6fb; +} + +.header { + background-image: url(../background/liyue.png); + box-shadow: 0 0 16px rgb(255 233 144 / 50%); +} + +.box { + background-color: #9c433d; + box-shadow: 0 0 16px rgb(255 233 144 / 50%); +} + +.box-title { + background-color: rgb(255, 200, 122, 0.1); + --tw-ring-color: #ff9966; +} + +.pointer-bar { + width: 95%; + height: 8px; + display: inline-block; + background-color: rgb(0, 0, 0, 0.1); + border-radius: 0.25rem; +} + +.pointer-progress-bar { + border-radius: 0.25rem; + height: 100%; + background: linear-gradient(to bottom, #f5efcd, #f8eabd, #ffdf90); +} + +.name { + background: linear-gradient(to bottom, #ffffff, #ffeabd, #ffdf90); + background-clip: text; + -webkit-background-clip: text; + color: transparent; +} + +.uid { + color: var(--primary); + background: linear-gradient(to right, rgb(0, 0, 0, 0), #cc6666, rgb(0, 0, 0, 0)); +} + +.about { + background-color: #e0dad3; + color: #8a4d30; +} + +.box-stats { + color: var(--primary); +} + +.box-stats-label { + color: var(--primary) !important; + opacity: 0.65; +} diff --git a/resources/zzz/stats/example/liyue.html b/resources/zzz/stats/example/liyue.html new file mode 100644 index 0000000..1abd585 --- /dev/null +++ b/resources/zzz/stats/example/liyue.html @@ -0,0 +1,256 @@ + + + + Title + + + + + + +

+ + diff --git a/resources/zzz/stats/example/mondstadt.css b/resources/zzz/stats/example/mondstadt.css new file mode 100644 index 0000000..17979cd --- /dev/null +++ b/resources/zzz/stats/example/mondstadt.css @@ -0,0 +1,49 @@ +body { + background-color: #f5f6fb; +} + +.header { + background-image: url(../background/mondstadt.png); + box-shadow: 0 0 8px rgb(123 242 248 / 50%); +} + +.box { + background-color: #fdfdf3; + box-shadow: 0 0 8px rgb(123 242 248 / 50%); +} + +.box-title { + background-color: #43849abb; + --tw-ring-color: #43849a; +} + +.pointer-bar { + width: 95%; + height: 8px; + display: inline-block; + background-color: rgb(0, 0, 0, 0.2); + border-radius: 0.25rem; +} + +.pointer-progress-bar { + border-radius: 0.25rem; + height: 100%; + background: #fff6e2; +} + +.name { + background: linear-gradient(to bottom, #66bbee, #5ddddd, #55dddd); + background-clip: text; + -webkit-background-clip: text; + color: transparent; +} + +.uid { + color: #fff; + background: linear-gradient(to right, rgb(0, 0, 0, 0), #5ddddd, rgb(0, 0, 0, 0)); +} + +.about { + background-color: #e0dad3; + color: #8a4d30; +} \ No newline at end of file diff --git a/resources/zzz/stats/example/mondstadt.html b/resources/zzz/stats/example/mondstadt.html new file mode 100644 index 0000000..1d9c14e --- /dev/null +++ b/resources/zzz/stats/example/mondstadt.html @@ -0,0 +1,261 @@ + + + + + Title + + + + + + +
+
+
+

+ 小何 + lv.58 +

+

UID - 125324176

+
+
+
+
+

+ 数据总览 +

+
+ +
+
491
+
活跃天数
+
+ +
+
536
+
成就达成数
+
+ +
+
38
+
获取角色数
+
+ +
+
12-3
+
深境螺旋
+
+ +
+
227
+
解锁传送点
+
+ +
+
41
+
解锁秘境
+
+ +
+
58
+
奇馈宝箱数
+
+ +
+
127
+
华丽宝箱数
+
+ +
+
316
+
珍贵宝箱数
+
+ +
+
1180
+
精致宝箱数
+
+ +
+
1591
+
普通宝箱数
+
+ +
+
65
+
风神瞳
+
+ +
+
131
+
岩神瞳
+
+ +
+
180
+
雷神瞳
+
+ +
+
79
+
草神瞳
+
+ +
+
+ +
+

+ 世界探索 +

+
+ +
+ +
须弥
+
26.0%
+
+
+
+
+ +
+ +
层岩巨渊·地下矿区
+
98.7%
+
+
+
+
+ +
+ +
层岩巨渊
+
92.9%
+
+
+
+
+ +
+ +
渊下宫
+
98.3%
+
+
+
+
+ +
+ +
稻妻
+
100.0%
+
+
+
+
+ +
+ +
龙脊雪山
+
83.6%
+
+
+
+
+ +
+ +
璃月
+
95.9%
+
+
+
+
+ +
+ +
蒙德
+
100.0%
+
+
+
+
+ +
+
+ +
+ 所有数据会有一小时延迟 以游戏内为准 此处仅供参考 +
+
+
+ + \ No newline at end of file diff --git a/resources/zzz/stats/liyue.css b/resources/zzz/stats/liyue.css new file mode 100644 index 0000000..5e73809 --- /dev/null +++ b/resources/zzz/stats/liyue.css @@ -0,0 +1,62 @@ +:root { + --primary: #ffeabd; +} + +body { + background-color: #f5f6fb; +} + +.header { + background-image: url(./background/liyue.png); + box-shadow: 0 0 16px rgb(255 233 144 / 50%); +} + +.box { + background-color: #9c433d; + box-shadow: 0 0 16px rgb(255 233 144 / 50%); +} + +.box-title { + background-color: rgb(255, 200, 122, 0.1); + --tw-ring-color: #ff9966; +} + +.pointer-bar { + width: 95%; + height: 8px; + display: inline-block; + background-color: rgb(0, 0, 0, 0.1); + border-radius: 0.25rem; +} + +.pointer-progress-bar { + border-radius: 0.25rem; + height: 100%; + background: linear-gradient(to bottom, #f5efcd, #f8eabd, #ffdf90); +} + +.name { + background: linear-gradient(to bottom, #ffffff, #ffeabd, #ffdf90); + background-clip: text; + -webkit-background-clip: text; + color: transparent; +} + +.uid { + color: var(--primary); + background: linear-gradient(to right, rgb(0, 0, 0, 0), #cc6666, rgb(0, 0, 0, 0)); +} + +.about { + background-color: #e0dad3; + color: #8a4d30; +} + +.box-stats { + color: var(--primary); +} + +.box-stats-label { + color: var(--primary) !important; + opacity: 0.65; +} diff --git a/resources/zzz/stats/mondstadt.css b/resources/zzz/stats/mondstadt.css new file mode 100644 index 0000000..4122e18 --- /dev/null +++ b/resources/zzz/stats/mondstadt.css @@ -0,0 +1,49 @@ +body { + background-color: #f5f6fb; +} + +.header { + background-image: url(background/mondstadt.png); + box-shadow: 0 0 8px rgb(123 242 248 / 50%); +} + +.box { + background-color: #fdfdf3; + box-shadow: 0 0 8px rgb(123 242 248 / 50%); +} + +.box-title { + background-color: #43849abb; + --tw-ring-color: #43849a; +} + +.pointer-bar { + width: 95%; + height: 8px; + display: inline-block; + background-color: rgb(0, 0, 0, 0.2); + border-radius: 0.25rem; +} + +.pointer-progress-bar { + border-radius: 0.25rem; + height: 100%; + background: #fff6e2; +} + +.name { + background: linear-gradient(to bottom, #66bbee, #5ddddd, #55dddd); + background-clip: text; + -webkit-background-clip: text; + color: transparent; +} + +.uid { + color: #fff; + background: linear-gradient(to right, rgb(0, 0, 0, 0), #5ddddd, rgb(0, 0, 0, 0)); +} + +.about { + background-color: #e0dad3; + color: #8a4d30; +} \ No newline at end of file diff --git a/resources/zzz/stats/old/info.css b/resources/zzz/stats/old/info.css new file mode 100644 index 0000000..2b88125 --- /dev/null +++ b/resources/zzz/stats/old/info.css @@ -0,0 +1,92 @@ +body { + background-repeat: no-repeat; + background-size: cover; + background-position: center; + background-attachment: fixed; +} + + +#container { + +} + +.account-center-header { + padding: 10px 8px; + background-color: rgba(225, 225, 225, 0.5); + /*background-image: url("./0.jpg"); + background-size: cover;*/ +} + +.user-avatar { + width: 100%; + height: 100%; +} + +.user-info-1 { + padding: 10px 8px; + background-color: rgba(225, 225, 225, 0.5); +} + +.world-exploration { + padding: 10px 8px; + background-color: rgba(225, 225, 225, 0.5); +} + +.teapot { + padding: 10px 8px; + background-color: rgba(225, 225, 225, 0.5); +} + +.account-center-header-avatar { + width: 120px; + height: 120px; +} + +.teapot-info-icon { + height: 96px; + overflow: hidden; +} + +.teapot-info-img { + width: 100%; +} + +.world-exploration-info { + border: 2px solid rgb(0, 0, 0, 0.2); +} + +.world-exploration-info-icon { + height: 96px; + overflow: hidden; +} + +.world-exploration-info-img { + filter: brightness(0); + height: 100%; +} + +.world-exploration-info-hr-1 { + width: 95%; +} + +.world-exploration-info-pointer-bar-body { + width: 95%; + height: 4px; + display: inline-block; + border-radius: 2px; + background-color: rgb(0, 0, 0, 0.3); +} + +.world-exploration-info-pointer-progress-bar { + height: 100%; + background-color: #000000; + border-radius: 2px; +} + +.background-color { + background-color: rgb(225, 225, 225, 0.75); +} + +.teapot-info-name { + background-color: rgba(225, 225, 225, 0.5); +} \ No newline at end of file diff --git a/resources/zzz/stats/old/info.html b/resources/zzz/stats/old/info.html new file mode 100644 index 0000000..ca027e5 --- /dev/null +++ b/resources/zzz/stats/old/info.html @@ -0,0 +1,183 @@ + + + + + Title + + + + + + +
+
+ + + +
+
+ + \ No newline at end of file diff --git a/resources/zzz/stats/stats.jinja2 b/resources/zzz/stats/stats.jinja2 new file mode 100644 index 0000000..5e688ac --- /dev/null +++ b/resources/zzz/stats/stats.jinja2 @@ -0,0 +1,45 @@ + + + + + Title + + + + + + +
+
+
+

+ {{ nickname }} +

+

UID - {{ uid }}

+
+
+
+
+

+ 数据总览 +

+
+ {% for label, key in stats_labels %} +
+
{{ stats[key] }}
+
{{ label }}
+
+ {% endfor %} +
+
+ +
+ 所有数据会有一小时延迟 以游戏内为准 此处仅供参考 +
+
+
+ + diff --git a/utils/uid.py b/utils/uid.py index 2ae6563..90f040d 100644 --- a/utils/uid.py +++ b/utils/uid.py @@ -4,6 +4,8 @@ import re def mask_number(number): number_str = str(number) masked_number = None + if len(number_str) == 8: + masked_number = re.sub(r"(\d{2})(\d{3})(\d{3})", r"\1***\3", number_str) if len(number_str) == 9: masked_number = re.sub(r"(\d{2})(\d{4})(\d{3})", r"\1****\3", number_str) if len(number_str) == 10: