├── .github ├── FUNDING.yml └── workflows │ └── pypi-publish.yml ├── .gitignore ├── .pre-commit-config.yaml ├── LICENSE ├── README.md ├── fonts └── YurukaFangTang.ttf ├── nonebot_plugin_pjsk ├── __init__.py ├── __main__.py ├── config.py ├── render.py ├── resource.py ├── templates │ ├── help.html.jinja │ ├── sticker.svg.jinja │ └── sticker_grid.html.jinja └── utils.py ├── pdm.lock └── pyproject.toml /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | custom: 2 | - https://afdian.net/a/agnes_digital 3 | - https://afdian.net/a/lgc2333/ 4 | - https://blog.lgc2333.top/donate 5 | -------------------------------------------------------------------------------- /.github/workflows/pypi-publish.yml: -------------------------------------------------------------------------------- 1 | name: Publish Python 🐍 distributions 📦 to PyPI 2 | 3 | on: 4 | release: 5 | types: [published] 6 | workflow_dispatch: 7 | 8 | jobs: 9 | build-n-publish: 10 | name: Use PDM to Build and publish Python 🐍 distributions 📦 to PyPI 11 | runs-on: ubuntu-latest 12 | 13 | permissions: 14 | # IMPORTANT: this permission is mandatory for trusted publishing 15 | id-token: write 16 | 17 | steps: 18 | - name: Checkout 19 | uses: actions/checkout@master 20 | with: 21 | submodules: true 22 | 23 | - name: Setup PDM 24 | uses: pdm-project/setup-pdm@v3 25 | 26 | - name: Build and Publish distribution 📦 to PyPI 27 | run: pdm publish 28 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Created by https://www.toptal.com/developers/gitignore/api/python 2 | # Edit at https://www.toptal.com/developers/gitignore?templates=python 3 | 4 | ### Python ### 5 | # Byte-compiled / optimized / DLL files 6 | __pycache__/ 7 | *.py[cod] 8 | *$py.class 9 | 10 | # C extensions 11 | *.so 12 | 13 | # Distribution / packaging 14 | .Python 15 | build/ 16 | develop-eggs/ 17 | dist/ 18 | downloads/ 19 | eggs/ 20 | .eggs/ 21 | lib/ 22 | lib64/ 23 | parts/ 24 | sdist/ 25 | var/ 26 | wheels/ 27 | share/python-wheels/ 28 | *.egg-info/ 29 | .installed.cfg 30 | *.egg 31 | MANIFEST 32 | 33 | # PyInstaller 34 | # Usually these files are written by a python script from a template 35 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 36 | *.manifest 37 | *.spec 38 | 39 | # Installer logs 40 | pip-log.txt 41 | pip-delete-this-directory.txt 42 | 43 | # Unit test / coverage reports 44 | htmlcov/ 45 | .tox/ 46 | .nox/ 47 | .coverage 48 | .coverage.* 49 | .cache 50 | nosetests.xml 51 | coverage.xml 52 | *.cover 53 | *.py,cover 54 | .hypothesis/ 55 | .pytest_cache/ 56 | cover/ 57 | 58 | # Translations 59 | *.mo 60 | *.pot 61 | 62 | # Django stuff: 63 | *.log 64 | local_settings.py 65 | db.sqlite3 66 | db.sqlite3-journal 67 | 68 | # Flask stuff: 69 | instance/ 70 | .webassets-cache 71 | 72 | # Scrapy stuff: 73 | .scrapy 74 | 75 | # Sphinx documentation 76 | docs/_build/ 77 | 78 | # PyBuilder 79 | .pybuilder/ 80 | target/ 81 | 82 | # Jupyter Notebook 83 | .ipynb_checkpoints 84 | 85 | # IPython 86 | profile_default/ 87 | ipython_config.py 88 | 89 | # pyenv 90 | # For a library or package, you might want to ignore these files since the code is 91 | # intended to run in multiple environments; otherwise, check them in: 92 | # .python-version 93 | 94 | # pipenv 95 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 96 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 97 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 98 | # install all needed dependencies. 99 | #Pipfile.lock 100 | 101 | # poetry 102 | # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. 103 | # This is especially recommended for binary packages to ensure reproducibility, and is more 104 | # commonly ignored for libraries. 105 | # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control 106 | poetry.lock 107 | 108 | # pdm 109 | # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. 110 | # pdm.lock 111 | # pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it 112 | # in version control. 113 | # https://pdm.fming.dev/#use-with-ide 114 | .pdm.toml 115 | .pdm-python 116 | 117 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm 118 | __pypackages__/ 119 | 120 | # Celery stuff 121 | celerybeat-schedule 122 | celerybeat.pid 123 | 124 | # SageMath parsed files 125 | *.sage.py 126 | 127 | # Environments 128 | .env 129 | .venv 130 | env/ 131 | venv/ 132 | ENV/ 133 | env.bak/ 134 | venv.bak/ 135 | 136 | # Spyder project settings 137 | .spyderproject 138 | .spyproject 139 | 140 | # Rope project settings 141 | .ropeproject 142 | 143 | # mkdocs documentation 144 | /site 145 | 146 | # mypy 147 | .mypy_cache/ 148 | .dmypy.json 149 | dmypy.json 150 | 151 | # Pyre type checker 152 | .pyre/ 153 | 154 | # pytype static type analyzer 155 | .pytype/ 156 | 157 | # Cython debug symbols 158 | cython_debug/ 159 | 160 | # PyCharm 161 | # JetBrains specific template is maintained in a separate JetBrains.gitignore that can 162 | # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore 163 | # and can be added to the global gitignore or merged into this file. For a more nuclear 164 | # option (not recommended) you can uncomment the following to ignore the entire idea folder. 165 | #.idea/ 166 | 167 | ### Python Patch ### 168 | # Poetry local configuration file - https://python-poetry.org/docs/configuration/#local-configuration 169 | # poetry.toml 170 | 171 | # End of https://www.toptal.com/developers/gitignore/api/python 172 | 173 | .vscode 174 | -------------------------------------------------------------------------------- /.pre-commit-config.yaml: -------------------------------------------------------------------------------- 1 | default_install_hook_types: [pre-commit, prepare-commit-msg] 2 | ci: 3 | autofix_commit_msg: ':rotating_light: auto fix by pre-commit hooks' 4 | autofix_prs: true 5 | autoupdate_branch: main 6 | autoupdate_schedule: monthly 7 | autoupdate_commit_msg: ':arrow_up: auto update by pre-commit hooks' 8 | 9 | repos: 10 | - repo: https://github.com/astral-sh/ruff-pre-commit 11 | rev: v0.0.287 12 | hooks: 13 | - id: ruff 14 | args: [--fix, --exit-non-zero-on-fix] 15 | 16 | # - repo: https://github.com/RobertCraigie/pyright-python 17 | # rev: v1.1.318 18 | # hooks: 19 | # - id: pyright 20 | 21 | - repo: https://github.com/psf/black 22 | rev: 23.7.0 23 | hooks: 24 | - id: black 25 | stages: [commit] 26 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 Agnes Digital 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | **本项目停止维护,请迁移到新项目 [nonebot-plugin-meme-stickers](https://github.com/lgc-NB2Dev/nonebot-plugin-meme-stickers)** 4 | 5 |
6 | 7 | 8 | NoneBotPluginLogo 9 | 10 | 11 |

12 | NoneBotPluginText 13 |

14 | 15 | # NoneBot-Plugin-PJSK 16 | 17 | _✨ Project Sekai 表情包制作 ✨_ 18 | 19 | python 20 | 21 | pdm-managed 22 | 23 | 24 | QQ Chat Group 25 | 26 | 27 |
28 | 29 | 30 | Pydantic Version 1 Or 2 31 | 32 | 33 | license 34 | 35 | 36 | pypi 37 | 38 | 39 | pypi download 40 | 41 | 42 |
43 | 44 | 45 | NoneBot Registry 46 | 47 | 48 | Supported Adapters 49 | 50 | 51 |
52 | 53 | ## 💬 前言 54 | 55 | - ~~由于本人没玩过啤酒烧烤,~~ 可能出现一些小问题,可以提 issue 或者 [加群](https://jq.qq.com/?_wv=1027&k=l82tMuPG)反馈 ~~或者单纯进来玩~~ 56 | - 本项目仅供学习使用,请勿用于商业用途,喜欢该项目可以 Star 或者提供 PR,如果构成侵权将在 24 小时内删除 57 | 58 | 59 | 60 | 61 | ## 📖 介绍 62 | 63 | ### Wonderhoy! 64 | 65 | ![Wonderhoy](https://raw.githubusercontent.com/lgc-NB2Dev/readme/main/pjsk/wonderhoy.png) 66 | 67 | ## 💿 安装 68 | 69 | 以下提到的方法 任选**其一** 即可 70 | 71 |
72 | [推荐] 使用 nb-cli 安装 73 | 在 nonebot2 项目的根目录下打开命令行, 输入以下指令即可安装 74 | 75 | ```bash 76 | nb plugin install nonebot-plugin-pjsk 77 | ``` 78 | 79 |
80 | 81 |
82 | 使用包管理器安装 83 | 在 nonebot2 项目的插件目录下, 打开命令行, 根据你使用的包管理器, 输入相应的安装命令 84 | 85 |
86 | pip 87 | 88 | ```bash 89 | pip install nonebot-plugin-pjsk 90 | ``` 91 | 92 |
93 |
94 | pdm 95 | 96 | ```bash 97 | pdm add nonebot-plugin-pjsk 98 | ``` 99 | 100 |
101 |
102 | poetry 103 | 104 | ```bash 105 | poetry add nonebot-plugin-pjsk 106 | ``` 107 | 108 |
109 |
110 | conda 111 | 112 | ```bash 113 | conda install nonebot-plugin-pjsk 114 | ``` 115 | 116 |
117 | 118 | 打开 nonebot2 项目根目录下的 `pyproject.toml` 文件, 在 `[tool.nonebot]` 部分的 `plugins` 项里追加写入 119 | 120 | ```toml 121 | [tool.nonebot] 122 | plugins = [ 123 | # ... 124 | "nonebot_plugin_pjsk" 125 | ] 126 | ``` 127 | 128 |
129 | 130 | ## ⚙️ 配置 131 | 132 | 插件开箱即用,所有配置项皆为可选。请**按需添加**下面的配置项到 `.env` 文件中 133 | 134 | | 配置项 | 必填 | 默认值 | 说明 | 135 | | :------------------: | :--: | :-----: | :--------------------------------------------------------------: | 136 | | `PJSK_ASSETS_PREFIX` | 否 | ... | TheOriginalAyaka/sekai-stickers 仓库 GitHubUserContent 地址列表 | 137 | | `PJSK_REPO_PREFIX` | 否 | ... | 本仓库 GitHubUserContent 地址列表 | 138 | | `PJSK_HELP_AS_IMAGE` | 否 | `True` | 是否将帮助信息渲染为图片发送 | 139 | | `PJSK_REPLY` | 否 | `True` | 是否回复消息发送者 | 140 | | `PJSK_REQ_RETRY` | 否 | `1` | 插件请求 URL 时的重试次数 | 141 | | `PJSK_REQ_PROXY` | 否 | `None` | 插件下载资源时使用的代理 | 142 | | `PJSK_USE_CACHE` | 否 | `True` | 是否缓存插件生成的所有图片 | 143 | | `PJSK_CLEAR_CACHE` | 否 | `False` | 是否在插件启动时清空缓存文件夹,禁用时只会清理非表情包的图片缓存 | 144 | 145 | ## 🎉 使用 146 | 147 | 直接使用指令 `pjsk` 进入交互创建模式; 148 | 使用指令 `pjsk -h` 了解使用 Shell-Like 指令创建表情的帮助 149 | 150 | ### 效果图 151 | 152 |
153 | 使用交互创建模式 154 | 155 | ![example](https://raw.githubusercontent.com/lgc-NB2Dev/readme/main/pjsk/example-interact.png) 156 | 157 |
158 | 159 |
160 | 使用 Shell-Like 指令 161 | 162 | ![example](https://raw.githubusercontent.com/lgc-NB2Dev/readme/main/pjsk/example.png) 163 | 164 |
165 | 166 | ## 📞 联系 167 | 168 | ### Agnes Digital 169 | 170 | QQ 群: [424506063](https://jq.qq.com/?_wv=1027&k=l82tMuPG) 171 | 172 | ### LgCookie 173 | 174 | QQ:3076823485 175 | Telegram:[@lgc2333](https://t.me/lgc2333) 176 | 吹水群:[1105946125](https://jq.qq.com/?_wv=1027&k=Z3n1MpEp) 177 | 邮箱: 178 | 179 | ## 💡 鸣谢 180 | 181 | ### [TheOriginalAyaka/sekai-stickers](https://github.com/TheOriginalAyaka/sekai-stickers) 182 | 183 | - 原项目 & 素材来源 184 | 185 | ## 💰 赞助 186 | 187 | 感谢大家的赞助!你们的赞助将是我继续创作的动力! 188 | 189 | ### Agnes Digital 190 | 191 | - [爱发电](https://afdian.net/a/agnes_digital) 192 | 193 | ### LgCookie 194 | 195 | - [点这里](https://blog.lgc2333.top/donate) 196 | 197 | ## 📝 更新日志 198 | 199 | ### 0.4.0 200 | 201 | - 适配 Pydantic V1 & V2 202 | 203 | ### 0.3.1 204 | 205 | - 修复无法生成图片的 Bug 206 | 207 | ### 0.3.0 208 | 209 | - 重构插件: 210 | - 弃用 `imagetext-py` 与 `Pillow`,改用 `htmlrender` 渲染 `svg`(表情) 与 `html`(总览、帮助) 211 | - 弃用 `saa`,换用 `alconna` 212 | - 配置项更改: 213 | - 添加 `PJSK_USE_CACHE`、`PJSK_CLEAR_CACHE` 214 | - 移除 `PJSK_EMOJI_SOURCE`、`PJSK_STICKER_FORMAT` 215 | - `PJSK_REQ_RETRY` 默认值 从 `2` 改为 `1` 216 | - `PJSK_ASSETS_PERFIX`、`PJSK_REPO_PREFIX` 默认值 删除 `ghproxy` 源 217 | 218 | ### 0.2.10 219 | 220 | - 修复指定保存格式无效的 Bug 221 | - 添加指令参数 `--auto-adjust`(`-A`) 222 | - 其他小修改 223 | 224 | ### 0.2.9 225 | 226 | - 指令参数增加与变更: 227 | - 修改 `--line-spacing` 参数简写为 `-S` 228 | - 增加 `--stroke-color`(`-C`)参数 229 | - 增加 `--font-color`(`-c`)参数 230 | - 增加 `--format`(`-f`)参数 231 | - 配置项增加与变更: 232 | - 增加 `PJSK_REQ_RETRY`、`PJSK_REQ_PROXY`、`PJSK_STICKER_FORMAT` 233 | - 修改 `PJSK_ASSETS_PREFIX`、`PJSK_REPO_PREFIX` 类型为 `List[str]` 234 | - 其他小修复,小优化 235 | 236 | ### 0.2.8 237 | 238 | - 修复无法自定义表情源的 bug 239 | 240 | ### 0.2.7 241 | 242 | - 修复参数为 `0` 时不生效的 Bug 243 | - 现在可以关闭回复消息发送者的特性了 244 | - 命令参数调整: 245 | - 删除 `--weight` 参数,因为没有实际意义 246 | - `--rotate` 参数可以接受小数了 247 | - `--stroke-width` 参数添加简写 `-W` 248 | - `--line-spacing` 参数添加简写 `-C` 249 | 250 | ### 0.2.6 251 | 252 | - 插件会按角色名重新排序表情列表与表情 ID,以防数据源表情 ID 冲突 253 | - 角色列表名称展示优化 254 | 255 | ### 0.2.5 256 | 257 | - 使用自己合并的字体文件避免某些字不显示的问题 258 | 259 | ### 0.2.4 260 | 261 | - 在交互模式中提供的参数会去掉指令前缀,以防 Adapter 删掉参数开头的 Bot 昵称,导致参数不对的情况 262 | - 重写帮助图片的渲染(个人感觉效果还不是很好……) 263 | 264 | ### 0.2.3 265 | 266 | - 限制了贴纸文本大小,以免 Bot 瞬间爆炸 267 | - 未提供字体大小时适应性调节 ([#14](https://github.com/Agnes4m/nonebot_plugin_pjsk/issues/14)) 268 | - 参数 `--rotate` 改为提供角度值,正数为顺时针旋转 269 | - 将指令帮助渲染为图片发送(可以关) 270 | - 丢掉了 `pil-utils` 依赖 271 | 272 | ### 0.2.2 273 | 274 | - 修改了 0.2.1 版的交互创建模式的触发方式 275 | - 试验性地支持了 Emoji 276 | 277 | ### 0.2.1 278 | 279 | - 更改指令 `pjsk列表` 的交互方式 280 | 281 | ### 0.2.0 282 | 283 | - 重构插件 284 | -------------------------------------------------------------------------------- /fonts/YurukaFangTang.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgc-NB2Dev/nonebot-plugin-pjsk/9d310136c199e156efc27dfbebebc1f7e72f16bc/fonts/YurukaFangTang.ttf -------------------------------------------------------------------------------- /nonebot_plugin_pjsk/__init__.py: -------------------------------------------------------------------------------- 1 | from nonebot import require 2 | from nonebot.plugin import PluginMetadata, inherit_supported_adapters 3 | 4 | require("nonebot_plugin_alconna") 5 | require("nonebot_plugin_htmlrender") 6 | 7 | from . import __main__ as __main__ # noqa: E402 8 | from .config import ConfigModel # noqa: E402 9 | 10 | __version__ = "0.4.1" 11 | __plugin_meta__ = PluginMetadata( 12 | name="Sekai Stickers", 13 | description="基于 NoneBot2 的 Project Sekai 表情包制作插件", 14 | usage="使用指令 `pjsk -h` 查看帮助", 15 | type="application", 16 | homepage="https://github.com/Agnes4m/nonebot_plugin_pjsk", 17 | config=ConfigModel, 18 | supported_adapters=inherit_supported_adapters("nonebot_plugin_alconna"), 19 | extra={ 20 | "version": __version__, 21 | "author": ["Agnes4m ", "LgCookie "], 22 | }, 23 | ) 24 | -------------------------------------------------------------------------------- /nonebot_plugin_pjsk/__main__.py: -------------------------------------------------------------------------------- 1 | import math 2 | from typing import List, Optional 3 | 4 | from nonebot import logger, on_command, on_shell_command 5 | from nonebot.adapters import Message 6 | from nonebot.exception import ParserExit 7 | from nonebot.matcher import Matcher 8 | from nonebot.params import Arg, ArgPlainText, CommandArg, ShellCommandArgs 9 | from nonebot.rule import ArgumentParser, Namespace 10 | from nonebot.typing import T_State 11 | from nonebot_plugin_alconna.uniseg import UniMessage 12 | 13 | from .config import config 14 | from .render import ( 15 | DEFAULT_LINE_SPACING, 16 | DEFAULT_STROKE_COLOR, 17 | DEFAULT_STROKE_WIDTH, 18 | get_all_characters_grid, 19 | get_character_stickers_grid, 20 | get_help, 21 | get_sticker, 22 | make_sticker_render_kwargs, 23 | ) 24 | from .resource import select_or_get_random 25 | from .utils import ResolveValueError, resolve_value 26 | 27 | cmd_sticker_list = on_command( 28 | "pjsk列表", 29 | aliases={"啤酒烧烤列表", "pjsk表情列表", "啤酒烧烤表情列表"}, 30 | state={"interact": False}, 31 | ) 32 | 33 | cmd_generate_parser = ArgumentParser("pjsk") 34 | cmd_generate_parser.add_argument("text", nargs="*", help="添加的文字,为空时使用默认值") 35 | cmd_generate_parser.add_argument( 36 | "-i", 37 | "--id", 38 | help="表情 ID,可以通过指令 `pjsk列表` 查询,不提供时则随机选择", 39 | ) 40 | cmd_generate_parser.add_argument("-x", help="文字的中心 x 坐标") 41 | cmd_generate_parser.add_argument("-y", help="文字的中心 y 坐标") 42 | cmd_generate_parser.add_argument("-r", "--rotate", help="文字旋转的角度") 43 | cmd_generate_parser.add_argument( 44 | "-s", 45 | "--size", 46 | help="文字的大小,不指定时会以默认大小为最大值自动调整", 47 | ) 48 | cmd_generate_parser.add_argument( 49 | "-c", 50 | "--font-color", 51 | help="文字颜色,使用 16 进制格式", 52 | ) 53 | # cmd_generate_parser.add_argument("-w", "--weight", help="文本粗细") 54 | cmd_generate_parser.add_argument("-W", "--stroke-width", help="文本描边宽度") 55 | cmd_generate_parser.add_argument( 56 | "-C", 57 | "--stroke-color", 58 | help="文本描边颜色,使用 16 进制格式", 59 | ) 60 | cmd_generate_parser.add_argument("-S", "--line-spacing", help="文本行间距") 61 | cmd_generate_parser.add_argument( 62 | "-A", 63 | "--auto-adjust", 64 | action="store_true", 65 | help="启用字号自动调整", 66 | ) 67 | 68 | cmd_generate = on_shell_command( 69 | "pjsk", 70 | parser=cmd_generate_parser, 71 | aliases={"啤酒烧烤"}, 72 | priority=2, 73 | ) 74 | 75 | 76 | HELP = ( 77 | "Project Sekai 表情生成\n" 78 | "\n" 79 | f"{cmd_generate_parser.format_help().strip()}\n" 80 | "\n" 81 | "Tips:\n" 82 | "- 大部分有默认值的数值参数都可以用 ^ 开头指定相对于默认值的偏移量\n" 83 | "- 不提供任何指令参数时会进入交互创建模式" 84 | ) 85 | 86 | 87 | def remove_cmd_prefix(s: str) -> str: 88 | pfx = next((x for x in config.command_start if x and s.startswith(x)), None) 89 | return s[len(pfx) :] if pfx else s 90 | 91 | 92 | async def handle_exit(matcher: Matcher, arg: str): 93 | if arg in ("0", "q", "e", "quit", "exit", "退出"): 94 | await matcher.finish("已退出交互创建模式") 95 | 96 | 97 | def format_draw_error(error: Exception) -> str: 98 | if isinstance(error, ResolveValueError): 99 | return f"提供的参数值 `{error.args[0]}` 解析出错" 100 | logger.opt(exception=error).error("Error occurred while drawing sticker") 101 | return "生成表情时出错,请检查后台日志" 102 | 103 | 104 | # failed to parse args 105 | @cmd_generate.handle() 106 | async def _(matcher: Matcher, foo: ParserExit = ShellCommandArgs()): 107 | if not foo.message: 108 | return 109 | 110 | if foo.status == 0: 111 | if not config.pjsk_help_as_image: 112 | await matcher.finish(HELP) 113 | 114 | try: 115 | img = await get_help(HELP) 116 | except Exception: 117 | logger.exception("Error occurred while rendering help image") 118 | await matcher.finish("生成帮助图片时出错,请检查后台日志") 119 | await UniMessage.image(raw=img).send(reply_to=config.pjsk_reply) 120 | await matcher.finish() 121 | 122 | await matcher.finish(f"参数解析出错:{foo.message}") 123 | 124 | 125 | # command or enter interact mode handler 126 | @cmd_generate.handle() 127 | async def _(matcher: Matcher, args: Namespace = ShellCommandArgs()): 128 | if not any(vars(args).values()): # 没有任何参数 129 | matcher.skip() # 跳过该 handler 进入交互模式 130 | 131 | texts: List[str] = args.text 132 | if not all(isinstance(x, str) for x in texts): 133 | await matcher.finish("只接受字符串参数") 134 | 135 | sticker_id: Optional[str] = args.id 136 | selected_sticker = select_or_get_random(sticker_id) 137 | if not selected_sticker: 138 | await matcher.finish("没有找到对应 ID 的表情") 139 | 140 | default_text = selected_sticker.default_text 141 | try: 142 | kw = make_sticker_render_kwargs( 143 | selected_sticker, 144 | text=" ".join(texts) or default_text.text, 145 | x=resolve_value(args.x, default_text.x), 146 | y=resolve_value(args.y, default_text.y), 147 | rotate=resolve_value( 148 | args.rotate, 149 | lambda: math.degrees(default_text.r / 10), 150 | float, 151 | ), 152 | font_size=resolve_value(args.size, default_text.s), 153 | font_color=args.font_color or selected_sticker.color, 154 | stroke_width=resolve_value(args.stroke_width, DEFAULT_STROKE_WIDTH), 155 | stroke_color=args.stroke_color or DEFAULT_STROKE_COLOR, 156 | line_spacing=resolve_value(args.line_spacing, DEFAULT_LINE_SPACING, float), 157 | auto_adjust=args.auto_adjust or (args.size is None), 158 | ) 159 | image = await get_sticker(**kw) 160 | except Exception as e: 161 | await matcher.finish(format_draw_error(e)) 162 | 163 | await UniMessage.image(raw=image).send(reply_to=config.pjsk_reply) 164 | await matcher.finish() 165 | 166 | 167 | # interact mode or sticker list 168 | @cmd_sticker_list.handle() 169 | async def _(matcher: Matcher, arg: Message = CommandArg()): 170 | if remove_cmd_prefix(arg.extract_plain_text()).strip(): 171 | matcher.set_arg("character", arg) 172 | 173 | 174 | # character list 175 | @cmd_generate.handle() 176 | @cmd_sticker_list.handle() 177 | async def _(matcher: Matcher, state: T_State): 178 | if "character" in state: 179 | matcher.skip() 180 | 181 | interact = state.get("interact", True) 182 | tip_text = ( 183 | "请发送你要生成表情的角色名称,或者直接发送表情 ID,或者发送 `随机` 使用一张随机表情\nTip:你可以随时发送 `0` 退出交互模式" 184 | if interact 185 | else "Tip:发送指令 `pjsk列表 <角色名>` 查看角色下所有表情的 ID" 186 | ) 187 | 188 | try: 189 | image = await get_all_characters_grid() 190 | except Exception: 191 | logger.exception("Error occurred while getting character list") 192 | await matcher.finish("获取角色列表图片出错,请检查后台日志") 193 | 194 | msg = UniMessage.image(raw=image) + tip_text 195 | await msg.send(reply_to=config.pjsk_reply) 196 | if not interact: 197 | await matcher.finish() 198 | 199 | 200 | # sticker id list 201 | @cmd_generate.got("character") 202 | @cmd_sticker_list.got("character") 203 | async def _(matcher: Matcher, state: T_State, arg_msg: Message = Arg("character")): 204 | character = remove_cmd_prefix(arg_msg.extract_plain_text()).strip() 205 | await handle_exit(matcher, character) 206 | 207 | interact = state.get("interact", True) 208 | 209 | # 交互模式 210 | if interact: 211 | if character == "随机": 212 | matcher.set_arg("sticker_id", type(arg_msg)()) 213 | matcher.skip() 214 | 215 | elif character.isdigit(): # 直接发送了表情 ID 216 | if not select_or_get_random(character): 217 | await matcher.reject("没有找到对应 ID 的表情,请重新输入") 218 | matcher.set_arg("sticker_id", arg_msg) 219 | matcher.skip() 220 | 221 | try: 222 | image = await get_character_stickers_grid(character) 223 | except Exception: 224 | logger.exception("Error occurred while getting sticker list") 225 | await matcher.finish("获取表情列表图片出错,请检查后台日志") 226 | 227 | if not image: 228 | if interact: 229 | await matcher.reject("没有找到对应名称的角色,请重新输入") 230 | await matcher.finish("没有找到对应名称的角色") 231 | 232 | msg = UniMessage.image(raw=image) 233 | if interact: 234 | msg += "请发送你要生成表情的 ID" 235 | await msg.send(reply_to=config.pjsk_reply) 236 | if not interact: 237 | await matcher.finish() 238 | 239 | 240 | # below are interact mode handlers 241 | @cmd_generate.got("sticker_id") 242 | async def _(matcher: Matcher, arg: str = ArgPlainText("sticker_id")): 243 | arg = remove_cmd_prefix(arg).strip() 244 | await handle_exit(matcher, arg) 245 | 246 | if not select_or_get_random(arg or None): # 上面传过来的空消息转 None 获取随机表情 247 | await matcher.reject("没有找到对应 ID 的表情,请重新输入") 248 | await matcher.send("请发送你想要写在表情上的的文字") 249 | 250 | 251 | @cmd_generate.got("text") 252 | async def _( 253 | matcher: Matcher, 254 | sticker_id: str = ArgPlainText(), 255 | text: str = ArgPlainText(), 256 | ): 257 | sticker_id = remove_cmd_prefix(sticker_id).strip() 258 | text = remove_cmd_prefix(text).strip() 259 | 260 | sticker_info = select_or_get_random(sticker_id) 261 | assert sticker_info is not None 262 | 263 | try: 264 | kw = make_sticker_render_kwargs( 265 | sticker_info, 266 | text=text, 267 | auto_adjust=True, 268 | ) 269 | image = await get_sticker(**kw) 270 | except Exception as e: 271 | await matcher.finish(format_draw_error(e)) 272 | 273 | await UniMessage.image(raw=image).send(reply_to=config.pjsk_reply) 274 | -------------------------------------------------------------------------------- /nonebot_plugin_pjsk/config.py: -------------------------------------------------------------------------------- 1 | from typing import Any, List, Optional, Set 2 | from typing_extensions import Annotated 3 | 4 | from nonebot import get_plugin_config 5 | from pydantic import BaseModel, Field, HttpUrl, validator 6 | 7 | 8 | class ConfigModel(BaseModel): 9 | command_start: Set[str] 10 | 11 | pjsk_req_retry: int = 1 12 | pjsk_req_proxy: Optional[str] = None 13 | pjsk_req_timeout: int = 10 14 | pjsk_assets_prefix: List[Annotated[str, HttpUrl]] = Field( 15 | [ 16 | "https://raw.gitmirror.com/TheOriginalAyaka/sekai-stickers/main/", 17 | "https://raw.githubusercontent.com/TheOriginalAyaka/sekai-stickers/main/", 18 | ], 19 | ) 20 | pjsk_repo_prefix: List[Annotated[str, HttpUrl]] = Field( 21 | [ 22 | "https://raw.gitmirror.com/Agnes4m/nonebot_plugin_pjsk/main/", 23 | "https://raw.githubusercontent.com/Agnes4m/nonebot_plugin_pjsk/main/", 24 | ], 25 | ) 26 | 27 | pjsk_help_as_image: bool = True 28 | pjsk_reply: bool = True 29 | pjsk_use_cache: bool = True 30 | pjsk_clear_cache: bool = False 31 | 32 | @validator("pjsk_assets_prefix", "pjsk_repo_prefix", pre=True) 33 | def str_to_list(cls, v: Any): # noqa: N805 34 | if isinstance(v, str): 35 | v = [v] 36 | if not (hasattr(v, "__iter__") and all(isinstance(x, str) for x in v)): 37 | raise ValueError("value should be a iterable of strings") 38 | return v 39 | 40 | @validator("pjsk_assets_prefix", "pjsk_repo_prefix") 41 | def append_slash(cls, v: List[str]) -> List[str]: # noqa: N805 42 | return [v if v.endswith("/") else f"{v}/" for v in v] 43 | 44 | 45 | config = get_plugin_config(ConfigModel) 46 | -------------------------------------------------------------------------------- /nonebot_plugin_pjsk/render.py: -------------------------------------------------------------------------------- 1 | import asyncio 2 | import math 3 | from contextlib import asynccontextmanager 4 | from pathlib import Path 5 | from typing import Awaitable, Callable, Dict, List, Literal, Optional, TypedDict, Union 6 | from typing_extensions import Concatenate, ParamSpec, Unpack 7 | 8 | import anyio 9 | from nonebot import logger 10 | from nonebot_plugin_htmlrender import get_new_page 11 | from playwright.async_api import Page, Request, Route 12 | from yarl import URL 13 | 14 | from .config import config 15 | from .resource import ( 16 | DATA_FOLDER, 17 | FONT_PATH, 18 | JINJA_ENV, 19 | LOADED_STICKER_INFO, 20 | RESOURCE_FOLDER, 21 | StickerInfo, 22 | get_cache, 23 | make_cache_key, 24 | write_cache, 25 | ) 26 | from .utils import is_full_width, qor 27 | 28 | P = ParamSpec("P") 29 | 30 | DEFAULT_WIDTH = 296 31 | DEFAULT_HEIGHT = 256 32 | DEFAULT_STROKE_WIDTH = 9 33 | DEFAULT_LINE_SPACING = 1.3 34 | DEFAULT_STROKE_COLOR = "#ffffff" 35 | 36 | ROUTER_BASE_URL = "https://pjsk.nonebot/" 37 | 38 | 39 | def calc_approximate_text_width(text: str, size: int, rotate_deg: float) -> float: 40 | rotate_rad = math.radians(rotate_deg) 41 | width = sum((size if is_full_width(x) else size / 2) for x in text) 42 | return abs(width * math.cos(rotate_rad)) + abs(size * math.sin(rotate_rad)) 43 | 44 | 45 | def auto_adjust_font_size( 46 | text: str, 47 | size: int, 48 | rotate_deg: float, 49 | width: int = DEFAULT_WIDTH, 50 | min_size: int = 8, 51 | multiplier: float = 1.2, 52 | ) -> int: 53 | while size > min_size: 54 | if (calc_approximate_text_width(text, size, rotate_deg) * multiplier) <= width: 55 | break 56 | size -= 1 57 | return size 58 | 59 | 60 | async def root_router(route: Route): 61 | return await route.fulfill(body="") 62 | 63 | 64 | async def file_router(route: Route, request: Request): 65 | url = URL(request.url) 66 | path = anyio.Path(DATA_FOLDER / url.path[1:]) 67 | logger.debug(f"Requested `{url}`, resolved to `{path}`") 68 | try: 69 | data = await path.read_bytes() 70 | except Exception: 71 | logger.exception("Error while reading file") 72 | return await route.abort() 73 | return await route.fulfill(body=data) 74 | 75 | 76 | def to_router_url(path: Union[str, Path]) -> str: 77 | if not isinstance(path, Path): 78 | path = Path(path) 79 | url = f"{ROUTER_BASE_URL}{path.relative_to(DATA_FOLDER)}".replace("\\", "/") 80 | logger.debug(f"to_router_url: {path} -> {url}") 81 | return url 82 | 83 | 84 | @asynccontextmanager 85 | async def get_routed_page(initial_html: Optional[str] = None): 86 | async with get_new_page(device_scale_factor=1) as page: 87 | await page.route(f"{ROUTER_BASE_URL}**/*", file_router) 88 | await page.route(f"{ROUTER_BASE_URL}", root_router) 89 | await page.goto(ROUTER_BASE_URL) 90 | if initial_html: 91 | await page.set_content(initial_html) 92 | yield page 93 | 94 | 95 | async def capture_element( 96 | page: Page, 97 | selector: str, 98 | image_type: Literal["png", "jpeg"] = "jpeg", 99 | omit_background: bool = False, 100 | cache_key: Optional[str] = None, 101 | ) -> bytes: 102 | element = await page.wait_for_selector(selector) 103 | assert element 104 | img = await element.screenshot(type=image_type, omit_background=omit_background) 105 | if config.pjsk_use_cache and cache_key: 106 | await write_cache(f"{cache_key}.{image_type}", img) 107 | return img 108 | 109 | 110 | async def capture_sticker(html: str, cache_key: Optional[str] = None) -> bytes: 111 | async with get_routed_page(html) as page: 112 | return await capture_element( 113 | page, 114 | "svg", 115 | image_type="png", 116 | omit_background=True, 117 | cache_key=cache_key, 118 | ) 119 | 120 | 121 | async def capture_template(html: str, cache_key: Optional[str] = None) -> bytes: 122 | async with get_routed_page(html) as page: 123 | return await capture_element(page, ".main-wrapper", cache_key=cache_key) 124 | 125 | 126 | class StickerRenderKwargs(TypedDict): 127 | image: str 128 | x: int 129 | y: int 130 | text: str 131 | font_color: str 132 | font_size: int 133 | rotate: float 134 | stroke_color: str 135 | stroke_width: int 136 | line_spacing: float 137 | font: str 138 | width: int 139 | height: int 140 | 141 | 142 | def make_sticker_render_kwargs( 143 | info: StickerInfo, 144 | text: Optional[str] = None, 145 | x: Optional[int] = None, 146 | y: Optional[int] = None, 147 | rotate: Optional[float] = None, 148 | font_size: Optional[int] = None, 149 | font_color: Optional[str] = None, 150 | stroke_width: Optional[int] = None, 151 | stroke_color: Optional[str] = None, 152 | line_spacing: Optional[float] = None, 153 | auto_adjust: bool = False, 154 | ) -> StickerRenderKwargs: 155 | default_text = info.default_text 156 | text = qor(text, default_text.text) 157 | rotate = qor(rotate, lambda: math.degrees(default_text.r / 10)) 158 | font_size = ( 159 | auto_adjust_font_size(text, default_text.s, rotate) 160 | if auto_adjust 161 | else qor(font_size, default_text.s) 162 | ) 163 | params: StickerRenderKwargs = { 164 | "image": to_router_url(RESOURCE_FOLDER / info.img), 165 | "x": qor(x, default_text.x), 166 | "y": qor(y, default_text.y), 167 | "text": text, 168 | "font_color": qor(font_color, info.color), 169 | "font_size": font_size, 170 | "rotate": rotate, 171 | "stroke_color": qor(stroke_color, DEFAULT_STROKE_COLOR), 172 | "stroke_width": qor(stroke_width, DEFAULT_STROKE_WIDTH), 173 | "line_spacing": qor(line_spacing, DEFAULT_LINE_SPACING), 174 | "font": to_router_url(FONT_PATH), 175 | "width": DEFAULT_WIDTH, 176 | "height": DEFAULT_HEIGHT, 177 | } 178 | return params 179 | 180 | 181 | async def render_sticker_html(**kwargs: Unpack[StickerRenderKwargs]) -> str: 182 | template = JINJA_ENV.get_template("sticker.svg.jinja") 183 | return await template.render_async(id=hash(kwargs["image"]), **kwargs) 184 | 185 | 186 | async def render_sticker_grid_html(items: List[str]) -> str: 187 | template = JINJA_ENV.get_template("sticker_grid.html.jinja") 188 | return await template.render_async(items=items) 189 | 190 | 191 | async def render_help_html(text: str) -> str: 192 | template = JINJA_ENV.get_template("help.html.jinja") 193 | return await template.render_async(text=text) 194 | 195 | 196 | def use_cache(cache_key: Union[str, Callable[P, str]], ext: Literal["png", "jpeg"]): 197 | def decorator(func: Callable[Concatenate[str, P], Awaitable[bytes]]): 198 | async def wrapper(*args: P.args, **kwargs: P.kwargs): 199 | key = cache_key(*args, **kwargs) if callable(cache_key) else cache_key 200 | if (config.pjsk_use_cache) and (c := await get_cache(f"{key}.{ext}")): 201 | logger.debug(f"Cache hit for `{key}.{ext}`") 202 | return c 203 | return await func(key, *args, **kwargs) 204 | 205 | return wrapper 206 | 207 | return decorator 208 | 209 | 210 | def get_sticker_cache_key_maker(**params: Unpack[StickerRenderKwargs]) -> str: 211 | return make_cache_key(params) 212 | 213 | 214 | @use_cache(get_sticker_cache_key_maker, "png") 215 | async def get_sticker(key: str, **params: Unpack[StickerRenderKwargs]) -> bytes: 216 | return await capture_sticker(await render_sticker_html(**params), cache_key=key) 217 | 218 | 219 | @use_cache("help", "jpeg") 220 | async def get_help(key: str, text: str) -> bytes: 221 | return await capture_template(await render_help_html(text), cache_key=key) 222 | 223 | 224 | @use_cache("all_characters", "jpeg") 225 | async def get_all_characters_grid(key: str) -> bytes: 226 | character_dict: Dict[str, StickerInfo] = {} 227 | for info in LOADED_STICKER_INFO: 228 | character = info.character 229 | if character not in character_dict: 230 | character = ( 231 | character 232 | if character[0].isupper() 233 | else character[0].upper() + character[1:] 234 | ) 235 | character_dict[character] = info 236 | 237 | sticker_templates = await asyncio.gather( 238 | *( 239 | render_sticker_html(**make_sticker_render_kwargs(info, char)) 240 | for char, info in character_dict.items() 241 | ), 242 | ) 243 | return await capture_template( 244 | await render_sticker_grid_html(sticker_templates), 245 | cache_key=key, 246 | ) 247 | 248 | 249 | def get_character_stickers_grid_cache_key_maker(character: str) -> str: 250 | return character 251 | 252 | 253 | @use_cache(get_character_stickers_grid_cache_key_maker, "jpeg") 254 | async def get_character_stickers_grid(key: str, character: str) -> bytes: 255 | character = character.lower() 256 | sticker_templates = await asyncio.gather( 257 | *( 258 | render_sticker_html(**make_sticker_render_kwargs(info, info.sticker_id)) 259 | for info in LOADED_STICKER_INFO 260 | if info.character.lower() == character 261 | ), 262 | ) 263 | return await capture_template( 264 | await render_sticker_grid_html(sticker_templates), 265 | cache_key=key, 266 | ) 267 | -------------------------------------------------------------------------------- /nonebot_plugin_pjsk/resource.py: -------------------------------------------------------------------------------- 1 | import asyncio 2 | import json 3 | import random 4 | from contextlib import suppress 5 | from pathlib import Path 6 | from typing import Any, Coroutine, List, Optional, overload 7 | 8 | import anyio 9 | import jinja2 10 | from nonebot import get_driver, logger 11 | from nonebot.compat import type_validate_json 12 | from pydantic import BaseModel, Field 13 | 14 | from .config import config 15 | from .utils import ResponseType, append_prefix, async_request, with_semaphore 16 | 17 | DATA_FOLDER = Path.cwd() / "data" / "pjsk" 18 | FONT_FOLDER = DATA_FOLDER / "fonts" 19 | RESOURCE_FOLDER = DATA_FOLDER / "resource" 20 | STICKER_INFO_CACHE = DATA_FOLDER / "characters.json" 21 | 22 | CACHE_FOLDER = DATA_FOLDER / "cache" 23 | if not CACHE_FOLDER.exists(): 24 | CACHE_FOLDER.mkdir(parents=True) 25 | else: 26 | [ 27 | x.unlink() 28 | for x in ( 29 | CACHE_FOLDER.iterdir() 30 | if config.pjsk_clear_cache 31 | else CACHE_FOLDER.glob("*.jpeg") 32 | ) 33 | ] 34 | 35 | FONT_PATH = FONT_FOLDER / "YurukaFangTang.ttf" 36 | 37 | for _folder in (DATA_FOLDER, FONT_FOLDER, RESOURCE_FOLDER): 38 | if not _folder.exists(): 39 | _folder.mkdir(parents=True) 40 | 41 | TEMPLATES_FOLDER = Path(__file__).parent / "templates" 42 | JINJA_ENV = jinja2.Environment( 43 | loader=jinja2.FileSystemLoader(TEMPLATES_FOLDER), 44 | autoescape=jinja2.select_autoescape(["html", "xml"]), 45 | enable_async=True, 46 | ) 47 | 48 | 49 | def make_cache_key(obj: Any) -> str: 50 | with suppress(Exception): 51 | return str(hash(obj)) 52 | return str(hash(json.dumps(obj))) 53 | 54 | 55 | async def get_cache(filename: str) -> Optional[bytes]: 56 | path = anyio.Path(CACHE_FOLDER / filename) 57 | if await path.exists(): 58 | try: 59 | return await path.read_bytes() 60 | except Exception: 61 | logger.exception("Error while reading cache") 62 | return None 63 | 64 | 65 | async def write_cache(filename: str, data: bytes): 66 | path = anyio.Path(CACHE_FOLDER / filename) 67 | try: 68 | await path.write_bytes(data) 69 | except Exception: 70 | logger.exception("Error while writing cache") 71 | 72 | 73 | class StickerText(BaseModel): 74 | text: str 75 | x: int 76 | y: int 77 | r: int # rotate 78 | s: int # font size 79 | 80 | 81 | class StickerInfo(BaseModel): 82 | sticker_id: str = Field(..., alias="id") 83 | name: str 84 | character: str 85 | img: str 86 | color: str 87 | default_text: StickerText = Field(..., alias="defaultText") 88 | 89 | 90 | LOADED_STICKER_INFO: List[StickerInfo] = [] 91 | 92 | 93 | def sort_stickers(): 94 | LOADED_STICKER_INFO.sort(key=lambda x: x.character.lower()) 95 | for i, x in enumerate(LOADED_STICKER_INFO, 1): 96 | x.sticker_id = str(i) 97 | 98 | 99 | @overload 100 | def select_or_get_random(sticker_id: None = None) -> StickerInfo: 101 | ... 102 | 103 | 104 | @overload 105 | def select_or_get_random(sticker_id: str) -> Optional[StickerInfo]: 106 | ... 107 | 108 | 109 | def select_or_get_random(sticker_id: Optional[str] = None) -> Optional[StickerInfo]: 110 | return ( 111 | next((x for x in LOADED_STICKER_INFO if sticker_id == x.sticker_id), None) 112 | if sticker_id 113 | else random.choice(LOADED_STICKER_INFO) 114 | ) 115 | 116 | 117 | async def check_and_download_font(): 118 | async def download(font_name: str): 119 | logger.opt(colors=True).info(f"Downloading font {font_name}") 120 | 121 | path = anyio.Path(FONT_FOLDER) / font_name 122 | urls = append_prefix(f"fonts/{font_name}", config.pjsk_repo_prefix) 123 | await path.write_bytes(await async_request(*urls)) 124 | 125 | logger.opt(colors=True).info(f"Successfully downloaded font {font_name}") 126 | 127 | # tasks: List[Coroutine] = [ 128 | # download(path.name) for path in FONT_PATHS if not path.exists() 129 | # ] 130 | # await asyncio.gather(*tasks) 131 | if not FONT_PATH.exists(): 132 | await download(FONT_PATH.name) 133 | 134 | 135 | async def load_sticker_info(): 136 | logger.debug("Updating sticker information") 137 | 138 | path = anyio.Path(STICKER_INFO_CACHE) 139 | urls = append_prefix("src/characters.json", config.pjsk_assets_prefix) 140 | try: 141 | loaded_text = await async_request(*urls, response_type=ResponseType.TEXT) 142 | await path.write_text(loaded_text, encoding="u8") 143 | except Exception as e: 144 | if not (await path.exists()): 145 | raise 146 | logger.warning( 147 | f"Failed to download sticker information, using cached data: {e!r}", 148 | ) 149 | loaded_text = await path.read_text(encoding="u8") 150 | 151 | LOADED_STICKER_INFO.clear() 152 | LOADED_STICKER_INFO.extend(type_validate_json(List[StickerInfo], loaded_text)) 153 | sort_stickers() 154 | 155 | 156 | async def check_and_download_stickers(): 157 | semaphore = asyncio.Semaphore(10) 158 | 159 | @with_semaphore(semaphore) 160 | async def download(path_str: str): 161 | path = anyio.Path(RESOURCE_FOLDER) / path_str 162 | if not (await (dir_name := path.parent).exists()): 163 | await dir_name.mkdir(parents=True, exist_ok=True) 164 | 165 | logger.opt(colors=True).info(f"Downloading sticker {path.name}") 166 | urls = append_prefix(f"public/img/{path_str}", config.pjsk_assets_prefix) 167 | await path.write_bytes(await async_request(*urls)) 168 | 169 | logger.debug("Checking and downloading sticker assets") 170 | tasks: List[Coroutine] = [ 171 | download(sticker_info.img) 172 | for sticker_info in LOADED_STICKER_INFO 173 | if not (RESOURCE_FOLDER / sticker_info.img).exists() 174 | ] 175 | await asyncio.gather(*tasks) 176 | 177 | 178 | async def check_and_download_resource(): 179 | await load_sticker_info() 180 | await check_and_download_stickers() 181 | 182 | 183 | async def prepare_resource(): 184 | logger.debug("Checking and downloading resources") 185 | await asyncio.gather( 186 | check_and_download_resource(), 187 | check_and_download_font(), 188 | ) 189 | logger.success("Successfully checked resources") 190 | 191 | 192 | driver = get_driver() 193 | driver.on_startup(prepare_resource) 194 | -------------------------------------------------------------------------------- /nonebot_plugin_pjsk/templates/help.html.jinja: -------------------------------------------------------------------------------- 1 | {#- 2 | Args: 3 | - text: rext you want to display 4 | -#} 5 | 6 | 7 | 8 | 9 | 10 | 21 | 22 | 23 |
24 |
{{ text.replace(' ', ' ').replace('\n', '
') }}
25 |
26 | 27 | 28 | -------------------------------------------------------------------------------- /nonebot_plugin_pjsk/templates/sticker.svg.jinja: -------------------------------------------------------------------------------- 1 | {#- 2 | Args: 3 | - id: image pattern id 4 | - image: image url 5 | - x: first line baseline center x pos in pixel 6 | - y: meaning like x 7 | - font_color: font color, use web color 8 | - font_size: font size in pixel 9 | - stroke_color: stroke color, use web color 10 | - stroke_width: stroke width in pixel 11 | - rotate: rotate in degrees 12 | - line_spacing: line spacing, 1.0 means no spacing 13 | - font: font url 14 | - width: image width in pixel 15 | - height: image height in pixel 16 | -#} 17 | 19 | 20 | 21 | 22 | 23 | 33 | 34 | 35 | 38 | {% for line in text.splitlines() -%} 39 | {{ line }} 40 | {%- endfor %} 41 | 42 | 43 | -------------------------------------------------------------------------------- /nonebot_plugin_pjsk/templates/sticker_grid.html.jinja: -------------------------------------------------------------------------------- 1 | {#- 2 | Args: 3 | - items: a list of sticker svgs will be display 4 | -#} 5 | 6 | 7 | 8 | 9 | 10 | 23 | 24 | 25 |
26 |
27 | {% for it in items %}{{ it | safe }}{% endfor %} 28 |
29 |
30 | 31 | 32 | -------------------------------------------------------------------------------- /nonebot_plugin_pjsk/utils.py: -------------------------------------------------------------------------------- 1 | import unicodedata 2 | from asyncio import Semaphore 3 | from enum import Enum, auto 4 | from functools import lru_cache 5 | from typing import ( 6 | Any, 7 | Awaitable, 8 | Callable, 9 | Iterable, 10 | List, 11 | Literal, 12 | Optional, 13 | Sequence, 14 | Type, 15 | TypeVar, 16 | Union, 17 | overload, 18 | ) 19 | from typing_extensions import ParamSpec 20 | 21 | from httpx import AsyncClient 22 | from nonebot import logger 23 | 24 | from .config import config 25 | 26 | T = TypeVar("T") 27 | TN = TypeVar("TN", int, float) 28 | TA = TypeVar("TA") 29 | TB = TypeVar("TB") 30 | R = TypeVar("R") 31 | P = ParamSpec("P") 32 | 33 | 34 | class ResponseType(Enum): 35 | JSON = auto() 36 | TEXT = auto() 37 | BYTES = auto() 38 | 39 | 40 | @overload 41 | async def async_request( 42 | *urls: str, 43 | response_type: Literal[ResponseType.JSON], 44 | retries: int = config.pjsk_req_retry, 45 | ) -> Any: 46 | ... 47 | 48 | 49 | @overload 50 | async def async_request( 51 | *urls: str, 52 | response_type: Literal[ResponseType.TEXT], 53 | retries: int = config.pjsk_req_retry, 54 | ) -> str: 55 | ... 56 | 57 | 58 | @overload 59 | async def async_request( 60 | *urls: str, 61 | response_type: ResponseType = ResponseType.BYTES, 62 | retries: int = config.pjsk_req_retry, 63 | ) -> bytes: 64 | ... 65 | 66 | 67 | async def async_request( 68 | *urls: str, 69 | response_type: ResponseType = ResponseType.BYTES, 70 | retries: int = config.pjsk_req_retry, 71 | ) -> Any: 72 | if not urls: 73 | raise ValueError("No URL specified") 74 | 75 | url, rest = urls[0], urls[1:] 76 | try: 77 | async with AsyncClient( 78 | proxy=config.pjsk_req_proxy, 79 | timeout=config.pjsk_req_timeout, 80 | ) as client: 81 | response = await client.get(url) 82 | response.raise_for_status() 83 | if response_type == ResponseType.JSON: 84 | return await response.json() 85 | if response_type == ResponseType.TEXT: 86 | return response.text 87 | return response.read() 88 | 89 | except Exception as e: 90 | err_suffix = f"because error occurred while requesting {url}: {e.__class__.__name__}: {e}" 91 | if retries <= 0: 92 | if not rest: 93 | raise 94 | logger.error(f"Requesting next url {err_suffix}") 95 | logger.debug(repr(e)) 96 | return await async_request(*rest, response_type=response_type) 97 | 98 | retries -= 1 99 | logger.error(f"Retrying ({retries} left) {err_suffix}") 100 | logger.debug(repr(e)) 101 | return await async_request(*urls, response_type=response_type, retries=retries) 102 | 103 | 104 | def append_prefix(suffix: str, prefixes: Sequence[str]) -> List[str]: 105 | return [prefix + suffix for prefix in prefixes] 106 | 107 | 108 | def with_semaphore(semaphore: Semaphore): 109 | def decorator(func: Callable[P, Awaitable[R]]): 110 | async def wrapper(*args: P.args, **kwargs: P.kwargs) -> R: 111 | async with semaphore: 112 | return await func(*args, **kwargs) 113 | 114 | return wrapper 115 | 116 | return decorator 117 | 118 | 119 | def chunks(iterable: Sequence[T], size: int) -> Iterable[Sequence[T]]: 120 | for i in range(0, len(iterable), size): 121 | yield iterable[i : i + size] 122 | 123 | 124 | class ResolveValueError(ValueError): 125 | pass 126 | 127 | 128 | def resolve_value( 129 | value: Optional[str], 130 | default: Union[TN, Callable[[], TN]], 131 | expected_type: Type[TN] = int, 132 | ) -> TN: 133 | def get_default() -> TN: 134 | return default() if isinstance(default, Callable) else default 135 | 136 | if not value: 137 | return get_default() 138 | try: 139 | if value.startswith("^"): 140 | return get_default() + expected_type(value[1:]) 141 | return expected_type(value) # type: ignore pylance 抽风 142 | except Exception as e: 143 | raise ResolveValueError(value) from e 144 | 145 | 146 | def qor(a: Optional[TA], b: Union[TB, Callable[[], TB]]) -> Union[TA, TB]: 147 | return a if (a is not None) else (b() if isinstance(b, Callable) else b) 148 | 149 | 150 | @lru_cache() 151 | def is_full_width(char: str) -> bool: 152 | return unicodedata.east_asian_width(char) in ("A", "F", "W") 153 | -------------------------------------------------------------------------------- /pdm.lock: -------------------------------------------------------------------------------- 1 | # This file is @generated by PDM. 2 | # It is not intended for manual editing. 3 | 4 | [metadata] 5 | groups = ["default"] 6 | strategy = ["cross_platform", "inherit_metadata"] 7 | lock_version = "4.4.2" 8 | content_hash = "sha256:3b7cdde9b0d594d1305838733a283fc29477b9bac112a4f66548c4d05262cbc3" 9 | 10 | [[package]] 11 | name = "aiofiles" 12 | version = "24.1.0" 13 | requires_python = ">=3.8" 14 | summary = "File support for asyncio." 15 | groups = ["default"] 16 | files = [ 17 | {file = "aiofiles-24.1.0-py3-none-any.whl", hash = "sha256:b4ec55f4195e3eb5d7abd1bf7e061763e864dd4954231fb8539a0ef8bb8260e5"}, 18 | {file = "aiofiles-24.1.0.tar.gz", hash = "sha256:22a075c9e5a3810f0c2e48f3008c94d68c65d763b9b03857924c99e57355166c"}, 19 | ] 20 | 21 | [[package]] 22 | name = "annotated-types" 23 | version = "0.7.0" 24 | requires_python = ">=3.8" 25 | summary = "Reusable constraint types to use with typing.Annotated" 26 | groups = ["default"] 27 | files = [ 28 | {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"}, 29 | {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, 30 | ] 31 | 32 | [[package]] 33 | name = "anyio" 34 | version = "4.4.0" 35 | requires_python = ">=3.8" 36 | summary = "High level compatibility layer for multiple asynchronous event loop implementations" 37 | groups = ["default"] 38 | dependencies = [ 39 | "exceptiongroup>=1.0.2; python_version < \"3.11\"", 40 | "idna>=2.8", 41 | "sniffio>=1.1", 42 | "typing-extensions>=4.1; python_version < \"3.11\"", 43 | ] 44 | files = [ 45 | {file = "anyio-4.4.0-py3-none-any.whl", hash = "sha256:c1b2d8f46a8a812513012e1107cb0e68c17159a7a594208005a57dc776e1bdc7"}, 46 | {file = "anyio-4.4.0.tar.gz", hash = "sha256:5aadc6a1bbb7cdb0bede386cac5e2940f5e2ff3aa20277e991cf028e0585ce94"}, 47 | ] 48 | 49 | [[package]] 50 | name = "arclet-alconna" 51 | version = "1.8.16" 52 | requires_python = ">=3.8" 53 | summary = "A High-performance, Generality, Humane Command Line Arguments Parser Library." 54 | groups = ["default"] 55 | dependencies = [ 56 | "nepattern<1.0.0,>=0.7.3", 57 | "tarina>=0.5.0", 58 | "typing-extensions>=4.5.0", 59 | ] 60 | files = [ 61 | {file = "arclet_alconna-1.8.16-py3-none-any.whl", hash = "sha256:b04241904d3f3a9d3eae30c5d1af7e264528b5a87b729fee5f408b2d93cef035"}, 62 | {file = "arclet_alconna-1.8.16.tar.gz", hash = "sha256:57bdc42c8626846ad536c19a24804790005554db4ad3300b7d4607c684cd25f3"}, 63 | ] 64 | 65 | [[package]] 66 | name = "arclet-alconna-tools" 67 | version = "0.7.6" 68 | requires_python = ">=3.8" 69 | summary = "Builtin Tools for Alconna" 70 | groups = ["default"] 71 | dependencies = [ 72 | "arclet-alconna>=1.8.15", 73 | "nepattern<1.0.0,>=0.7.3", 74 | ] 75 | files = [ 76 | {file = "arclet_alconna_tools-0.7.6-py3-none-any.whl", hash = "sha256:fdd1cb900603ce6bb00295bf7bf7f60dfdb764f0614abe248cdcb754e5149edd"}, 77 | {file = "arclet_alconna_tools-0.7.6.tar.gz", hash = "sha256:7cb7dc54c1c2198529c63227739423401051b8489374f1a7a3efa0c4e70b2a22"}, 78 | ] 79 | 80 | [[package]] 81 | name = "certifi" 82 | version = "2024.6.2" 83 | requires_python = ">=3.6" 84 | summary = "Python package for providing Mozilla's CA Bundle." 85 | groups = ["default"] 86 | files = [ 87 | {file = "certifi-2024.6.2-py3-none-any.whl", hash = "sha256:ddc6c8ce995e6987e7faf5e3f1b02b302836a0e5d98ece18392cb1a36c72ad56"}, 88 | {file = "certifi-2024.6.2.tar.gz", hash = "sha256:3cd43f1c6fa7dedc5899d69d3ad0398fd018ad1a17fba83ddaf78aa46c747516"}, 89 | ] 90 | 91 | [[package]] 92 | name = "click" 93 | version = "8.1.7" 94 | requires_python = ">=3.7" 95 | summary = "Composable command line interface toolkit" 96 | groups = ["default"] 97 | dependencies = [ 98 | "colorama; platform_system == \"Windows\"", 99 | ] 100 | files = [ 101 | {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, 102 | {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, 103 | ] 104 | 105 | [[package]] 106 | name = "colorama" 107 | version = "0.4.6" 108 | requires_python = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" 109 | summary = "Cross-platform colored terminal text." 110 | groups = ["default"] 111 | marker = "sys_platform == \"win32\" or platform_system == \"Windows\"" 112 | files = [ 113 | {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, 114 | {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, 115 | ] 116 | 117 | [[package]] 118 | name = "dnspython" 119 | version = "2.6.1" 120 | requires_python = ">=3.8" 121 | summary = "DNS toolkit" 122 | groups = ["default"] 123 | files = [ 124 | {file = "dnspython-2.6.1-py3-none-any.whl", hash = "sha256:5ef3b9680161f6fa89daf8ad451b5f1a33b18ae8a1c6778cdf4b43f08c0a6e50"}, 125 | {file = "dnspython-2.6.1.tar.gz", hash = "sha256:e8f0f9c23a7b7cb99ded64e6c3a6f3e701d78f50c55e002b839dea7225cff7cc"}, 126 | ] 127 | 128 | [[package]] 129 | name = "email-validator" 130 | version = "2.2.0" 131 | requires_python = ">=3.8" 132 | summary = "A robust email address syntax and deliverability validation library." 133 | groups = ["default"] 134 | dependencies = [ 135 | "dnspython>=2.0.0", 136 | "idna>=2.0.0", 137 | ] 138 | files = [ 139 | {file = "email_validator-2.2.0-py3-none-any.whl", hash = "sha256:561977c2d73ce3611850a06fa56b414621e0c8faa9d66f2611407d87465da631"}, 140 | {file = "email_validator-2.2.0.tar.gz", hash = "sha256:cb690f344c617a714f22e66ae771445a1ceb46821152df8e165c5f9a364582b7"}, 141 | ] 142 | 143 | [[package]] 144 | name = "exceptiongroup" 145 | version = "1.2.1" 146 | requires_python = ">=3.7" 147 | summary = "Backport of PEP 654 (exception groups)" 148 | groups = ["default"] 149 | marker = "python_version < \"3.11\"" 150 | files = [ 151 | {file = "exceptiongroup-1.2.1-py3-none-any.whl", hash = "sha256:5258b9ed329c5bbdd31a309f53cbfb0b155341807f6ff7606a1e801a891b29ad"}, 152 | {file = "exceptiongroup-1.2.1.tar.gz", hash = "sha256:a4785e48b045528f5bfe627b6ad554ff32def154f42372786903b7abcfe1aa16"}, 153 | ] 154 | 155 | [[package]] 156 | name = "fastapi" 157 | version = "0.111.0" 158 | requires_python = ">=3.8" 159 | summary = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" 160 | groups = ["default"] 161 | dependencies = [ 162 | "email-validator>=2.0.0", 163 | "fastapi-cli>=0.0.2", 164 | "httpx>=0.23.0", 165 | "jinja2>=2.11.2", 166 | "orjson>=3.2.1", 167 | "pydantic!=1.8,!=1.8.1,!=2.0.0,!=2.0.1,!=2.1.0,<3.0.0,>=1.7.4", 168 | "python-multipart>=0.0.7", 169 | "starlette<0.38.0,>=0.37.2", 170 | "typing-extensions>=4.8.0", 171 | "ujson!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0,>=4.0.1", 172 | "uvicorn[standard]>=0.12.0", 173 | ] 174 | files = [ 175 | {file = "fastapi-0.111.0-py3-none-any.whl", hash = "sha256:97ecbf994be0bcbdadedf88c3150252bed7b2087075ac99735403b1b76cc8fc0"}, 176 | {file = "fastapi-0.111.0.tar.gz", hash = "sha256:b9db9dd147c91cb8b769f7183535773d8741dd46f9dc6676cd82eab510228cd7"}, 177 | ] 178 | 179 | [[package]] 180 | name = "fastapi-cli" 181 | version = "0.0.4" 182 | requires_python = ">=3.8" 183 | summary = "Run and manage FastAPI apps from the command line with FastAPI CLI. 🚀" 184 | groups = ["default"] 185 | dependencies = [ 186 | "typer>=0.12.3", 187 | ] 188 | files = [ 189 | {file = "fastapi_cli-0.0.4-py3-none-any.whl", hash = "sha256:a2552f3a7ae64058cdbb530be6fa6dbfc975dc165e4fa66d224c3d396e25e809"}, 190 | {file = "fastapi_cli-0.0.4.tar.gz", hash = "sha256:e2e9ffaffc1f7767f488d6da34b6f5a377751c996f397902eb6abb99a67bde32"}, 191 | ] 192 | 193 | [[package]] 194 | name = "greenlet" 195 | version = "3.0.3" 196 | requires_python = ">=3.7" 197 | summary = "Lightweight in-process concurrent programming" 198 | groups = ["default"] 199 | files = [ 200 | {file = "greenlet-3.0.3-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:9da2bd29ed9e4f15955dd1595ad7bc9320308a3b766ef7f837e23ad4b4aac31a"}, 201 | {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d353cadd6083fdb056bb46ed07e4340b0869c305c8ca54ef9da3421acbdf6881"}, 202 | {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dca1e2f3ca00b84a396bc1bce13dd21f680f035314d2379c4160c98153b2059b"}, 203 | {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3ed7fb269f15dc662787f4119ec300ad0702fa1b19d2135a37c2c4de6fadfd4a"}, 204 | {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd4f49ae60e10adbc94b45c0b5e6a179acc1736cf7a90160b404076ee283cf83"}, 205 | {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:73a411ef564e0e097dbe7e866bb2dda0f027e072b04da387282b02c308807405"}, 206 | {file = "greenlet-3.0.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7f362975f2d179f9e26928c5b517524e89dd48530a0202570d55ad6ca5d8a56f"}, 207 | {file = "greenlet-3.0.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:649dde7de1a5eceb258f9cb00bdf50e978c9db1b996964cd80703614c86495eb"}, 208 | {file = "greenlet-3.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:68834da854554926fbedd38c76e60c4a2e3198c6fbed520b106a8986445caaf9"}, 209 | {file = "greenlet-3.0.3-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:b1b5667cced97081bf57b8fa1d6bfca67814b0afd38208d52538316e9422fc61"}, 210 | {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:52f59dd9c96ad2fc0d5724107444f76eb20aaccb675bf825df6435acb7703559"}, 211 | {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:afaff6cf5200befd5cec055b07d1c0a5a06c040fe5ad148abcd11ba6ab9b114e"}, 212 | {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fe754d231288e1e64323cfad462fcee8f0288654c10bdf4f603a39ed923bef33"}, 213 | {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2797aa5aedac23af156bbb5a6aa2cd3427ada2972c828244eb7d1b9255846379"}, 214 | {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b7f009caad047246ed379e1c4dbcb8b020f0a390667ea74d2387be2998f58a22"}, 215 | {file = "greenlet-3.0.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c5e1536de2aad7bf62e27baf79225d0d64360d4168cf2e6becb91baf1ed074f3"}, 216 | {file = "greenlet-3.0.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:894393ce10ceac937e56ec00bb71c4c2f8209ad516e96033e4b3b1de270e200d"}, 217 | {file = "greenlet-3.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:1ea188d4f49089fc6fb283845ab18a2518d279c7cd9da1065d7a84e991748728"}, 218 | {file = "greenlet-3.0.3-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:70fb482fdf2c707765ab5f0b6655e9cfcf3780d8d87355a063547b41177599be"}, 219 | {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4d1ac74f5c0c0524e4a24335350edad7e5f03b9532da7ea4d3c54d527784f2e"}, 220 | {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:149e94a2dd82d19838fe4b2259f1b6b9957d5ba1b25640d2380bea9c5df37676"}, 221 | {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:15d79dd26056573940fcb8c7413d84118086f2ec1a8acdfa854631084393efcc"}, 222 | {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:881b7db1ebff4ba09aaaeae6aa491daeb226c8150fc20e836ad00041bcb11230"}, 223 | {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fcd2469d6a2cf298f198f0487e0a5b1a47a42ca0fa4dfd1b6862c999f018ebbf"}, 224 | {file = "greenlet-3.0.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:1f672519db1796ca0d8753f9e78ec02355e862d0998193038c7073045899f305"}, 225 | {file = "greenlet-3.0.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2516a9957eed41dd8f1ec0c604f1cdc86758b587d964668b5b196a9db5bfcde6"}, 226 | {file = "greenlet-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:bba5387a6975598857d86de9eac14210a49d554a77eb8261cc68b7d082f78ce2"}, 227 | {file = "greenlet-3.0.3-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:da70d4d51c8b306bb7a031d5cff6cc25ad253affe89b70352af5f1cb68e74b53"}, 228 | {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:086152f8fbc5955df88382e8a75984e2bb1c892ad2e3c80a2508954e52295257"}, 229 | {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d73a9fe764d77f87f8ec26a0c85144d6a951a6c438dfe50487df5595c6373eac"}, 230 | {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7dcbe92cc99f08c8dd11f930de4d99ef756c3591a5377d1d9cd7dd5e896da71"}, 231 | {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1551a8195c0d4a68fac7a4325efac0d541b48def35feb49d803674ac32582f61"}, 232 | {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:64d7675ad83578e3fc149b617a444fab8efdafc9385471f868eb5ff83e446b8b"}, 233 | {file = "greenlet-3.0.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b37eef18ea55f2ffd8f00ff8fe7c8d3818abd3e25fb73fae2ca3b672e333a7a6"}, 234 | {file = "greenlet-3.0.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:77457465d89b8263bca14759d7c1684df840b6811b2499838cc5b040a8b5b113"}, 235 | {file = "greenlet-3.0.3-cp39-cp39-win32.whl", hash = "sha256:57e8974f23e47dac22b83436bdcf23080ade568ce77df33159e019d161ce1d1e"}, 236 | {file = "greenlet-3.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:c5ee858cfe08f34712f548c3c363e807e7186f03ad7a5039ebadb29e8c6be067"}, 237 | {file = "greenlet-3.0.3.tar.gz", hash = "sha256:43374442353259554ce33599da8b692d5aa96f8976d567d4badf263371fbe491"}, 238 | ] 239 | 240 | [[package]] 241 | name = "h11" 242 | version = "0.14.0" 243 | requires_python = ">=3.7" 244 | summary = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" 245 | groups = ["default"] 246 | files = [ 247 | {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, 248 | {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, 249 | ] 250 | 251 | [[package]] 252 | name = "httpcore" 253 | version = "1.0.5" 254 | requires_python = ">=3.8" 255 | summary = "A minimal low-level HTTP client." 256 | groups = ["default"] 257 | dependencies = [ 258 | "certifi", 259 | "h11<0.15,>=0.13", 260 | ] 261 | files = [ 262 | {file = "httpcore-1.0.5-py3-none-any.whl", hash = "sha256:421f18bac248b25d310f3cacd198d55b8e6125c107797b609ff9b7a6ba7991b5"}, 263 | {file = "httpcore-1.0.5.tar.gz", hash = "sha256:34a38e2f9291467ee3b44e89dd52615370e152954ba21721378a87b2960f7a61"}, 264 | ] 265 | 266 | [[package]] 267 | name = "httptools" 268 | version = "0.6.1" 269 | requires_python = ">=3.8.0" 270 | summary = "A collection of framework independent HTTP protocol utils." 271 | groups = ["default"] 272 | files = [ 273 | {file = "httptools-0.6.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d2f6c3c4cb1948d912538217838f6e9960bc4a521d7f9b323b3da579cd14532f"}, 274 | {file = "httptools-0.6.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:00d5d4b68a717765b1fabfd9ca755bd12bf44105eeb806c03d1962acd9b8e563"}, 275 | {file = "httptools-0.6.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:639dc4f381a870c9ec860ce5c45921db50205a37cc3334e756269736ff0aac58"}, 276 | {file = "httptools-0.6.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e57997ac7fb7ee43140cc03664de5f268813a481dff6245e0075925adc6aa185"}, 277 | {file = "httptools-0.6.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0ac5a0ae3d9f4fe004318d64b8a854edd85ab76cffbf7ef5e32920faef62f142"}, 278 | {file = "httptools-0.6.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:3f30d3ce413088a98b9db71c60a6ada2001a08945cb42dd65a9a9fe228627658"}, 279 | {file = "httptools-0.6.1-cp310-cp310-win_amd64.whl", hash = "sha256:1ed99a373e327f0107cb513b61820102ee4f3675656a37a50083eda05dc9541b"}, 280 | {file = "httptools-0.6.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7a7ea483c1a4485c71cb5f38be9db078f8b0e8b4c4dc0210f531cdd2ddac1ef1"}, 281 | {file = "httptools-0.6.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:85ed077c995e942b6f1b07583e4eb0a8d324d418954fc6af913d36db7c05a5a0"}, 282 | {file = "httptools-0.6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b0bb634338334385351a1600a73e558ce619af390c2b38386206ac6a27fecfc"}, 283 | {file = "httptools-0.6.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7d9ceb2c957320def533671fc9c715a80c47025139c8d1f3797477decbc6edd2"}, 284 | {file = "httptools-0.6.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:4f0f8271c0a4db459f9dc807acd0eadd4839934a4b9b892f6f160e94da309837"}, 285 | {file = "httptools-0.6.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6a4f5ccead6d18ec072ac0b84420e95d27c1cdf5c9f1bc8fbd8daf86bd94f43d"}, 286 | {file = "httptools-0.6.1-cp311-cp311-win_amd64.whl", hash = "sha256:5cceac09f164bcba55c0500a18fe3c47df29b62353198e4f37bbcc5d591172c3"}, 287 | {file = "httptools-0.6.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:75c8022dca7935cba14741a42744eee13ba05db00b27a4b940f0d646bd4d56d0"}, 288 | {file = "httptools-0.6.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:48ed8129cd9a0d62cf4d1575fcf90fb37e3ff7d5654d3a5814eb3d55f36478c2"}, 289 | {file = "httptools-0.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f58e335a1402fb5a650e271e8c2d03cfa7cea46ae124649346d17bd30d59c90"}, 290 | {file = "httptools-0.6.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93ad80d7176aa5788902f207a4e79885f0576134695dfb0fefc15b7a4648d503"}, 291 | {file = "httptools-0.6.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9bb68d3a085c2174c2477eb3ffe84ae9fb4fde8792edb7bcd09a1d8467e30a84"}, 292 | {file = "httptools-0.6.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:b512aa728bc02354e5ac086ce76c3ce635b62f5fbc32ab7082b5e582d27867bb"}, 293 | {file = "httptools-0.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:97662ce7fb196c785344d00d638fc9ad69e18ee4bfb4000b35a52efe5adcc949"}, 294 | {file = "httptools-0.6.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:95fb92dd3649f9cb139e9c56604cc2d7c7bf0fc2e7c8d7fbd58f96e35eddd2a3"}, 295 | {file = "httptools-0.6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:dcbab042cc3ef272adc11220517278519adf8f53fd3056d0e68f0a6f891ba94e"}, 296 | {file = "httptools-0.6.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cf2372e98406efb42e93bfe10f2948e467edfd792b015f1b4ecd897903d3e8d"}, 297 | {file = "httptools-0.6.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:678fcbae74477a17d103b7cae78b74800d795d702083867ce160fc202104d0da"}, 298 | {file = "httptools-0.6.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:e0b281cf5a125c35f7f6722b65d8542d2e57331be573e9e88bc8b0115c4a7a81"}, 299 | {file = "httptools-0.6.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:95658c342529bba4e1d3d2b1a874db16c7cca435e8827422154c9da76ac4e13a"}, 300 | {file = "httptools-0.6.1-cp39-cp39-win_amd64.whl", hash = "sha256:7ebaec1bf683e4bf5e9fbb49b8cc36da482033596a415b3e4ebab5a4c0d7ec5e"}, 301 | {file = "httptools-0.6.1.tar.gz", hash = "sha256:c6e26c30455600b95d94b1b836085138e82f177351454ee841c148f93a9bad5a"}, 302 | ] 303 | 304 | [[package]] 305 | name = "httpx" 306 | version = "0.27.0" 307 | requires_python = ">=3.8" 308 | summary = "The next generation HTTP client." 309 | groups = ["default"] 310 | dependencies = [ 311 | "anyio", 312 | "certifi", 313 | "httpcore==1.*", 314 | "idna", 315 | "sniffio", 316 | ] 317 | files = [ 318 | {file = "httpx-0.27.0-py3-none-any.whl", hash = "sha256:71d5465162c13681bff01ad59b2cc68dd838ea1f10e51574bac27103f00c91a5"}, 319 | {file = "httpx-0.27.0.tar.gz", hash = "sha256:a0cb88a46f32dc874e04ee956e4c2764aba2aa228f650b06788ba6bda2962ab5"}, 320 | ] 321 | 322 | [[package]] 323 | name = "idna" 324 | version = "3.7" 325 | requires_python = ">=3.5" 326 | summary = "Internationalized Domain Names in Applications (IDNA)" 327 | groups = ["default"] 328 | files = [ 329 | {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"}, 330 | {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, 331 | ] 332 | 333 | [[package]] 334 | name = "importlib-metadata" 335 | version = "8.0.0" 336 | requires_python = ">=3.8" 337 | summary = "Read metadata from Python packages" 338 | groups = ["default"] 339 | dependencies = [ 340 | "zipp>=0.5", 341 | ] 342 | files = [ 343 | {file = "importlib_metadata-8.0.0-py3-none-any.whl", hash = "sha256:15584cf2b1bf449d98ff8a6ff1abef57bf20f3ac6454f431736cd3e660921b2f"}, 344 | {file = "importlib_metadata-8.0.0.tar.gz", hash = "sha256:188bd24e4c346d3f0a933f275c2fec67050326a856b9a359881d7c2a697e8812"}, 345 | ] 346 | 347 | [[package]] 348 | name = "jinja2" 349 | version = "3.1.4" 350 | requires_python = ">=3.7" 351 | summary = "A very fast and expressive template engine." 352 | groups = ["default"] 353 | dependencies = [ 354 | "MarkupSafe>=2.0", 355 | ] 356 | files = [ 357 | {file = "jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d"}, 358 | {file = "jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369"}, 359 | ] 360 | 361 | [[package]] 362 | name = "loguru" 363 | version = "0.7.2" 364 | requires_python = ">=3.5" 365 | summary = "Python logging made (stupidly) simple" 366 | groups = ["default"] 367 | dependencies = [ 368 | "colorama>=0.3.4; sys_platform == \"win32\"", 369 | "win32-setctime>=1.0.0; sys_platform == \"win32\"", 370 | ] 371 | files = [ 372 | {file = "loguru-0.7.2-py3-none-any.whl", hash = "sha256:003d71e3d3ed35f0f8984898359d65b79e5b21943f78af86aa5491210429b8eb"}, 373 | {file = "loguru-0.7.2.tar.gz", hash = "sha256:e671a53522515f34fd406340ee968cb9ecafbc4b36c679da03c18fd8d0bd51ac"}, 374 | ] 375 | 376 | [[package]] 377 | name = "markdown" 378 | version = "3.6" 379 | requires_python = ">=3.8" 380 | summary = "Python implementation of John Gruber's Markdown." 381 | groups = ["default"] 382 | dependencies = [ 383 | "importlib-metadata>=4.4; python_version < \"3.10\"", 384 | ] 385 | files = [ 386 | {file = "Markdown-3.6-py3-none-any.whl", hash = "sha256:48f276f4d8cfb8ce6527c8f79e2ee29708508bf4d40aa410fbc3b4ee832c850f"}, 387 | {file = "Markdown-3.6.tar.gz", hash = "sha256:ed4f41f6daecbeeb96e576ce414c41d2d876daa9a16cb35fa8ed8c2ddfad0224"}, 388 | ] 389 | 390 | [[package]] 391 | name = "markdown-it-py" 392 | version = "3.0.0" 393 | requires_python = ">=3.8" 394 | summary = "Python port of markdown-it. Markdown parsing, done right!" 395 | groups = ["default"] 396 | dependencies = [ 397 | "mdurl~=0.1", 398 | ] 399 | files = [ 400 | {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"}, 401 | {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"}, 402 | ] 403 | 404 | [[package]] 405 | name = "markupsafe" 406 | version = "2.1.5" 407 | requires_python = ">=3.7" 408 | summary = "Safely add untrusted strings to HTML/XML markup." 409 | groups = ["default"] 410 | files = [ 411 | {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc"}, 412 | {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5"}, 413 | {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46"}, 414 | {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f"}, 415 | {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900"}, 416 | {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff"}, 417 | {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad"}, 418 | {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd"}, 419 | {file = "MarkupSafe-2.1.5-cp310-cp310-win32.whl", hash = "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4"}, 420 | {file = "MarkupSafe-2.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5"}, 421 | {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f"}, 422 | {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2"}, 423 | {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced"}, 424 | {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5"}, 425 | {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c"}, 426 | {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f"}, 427 | {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a"}, 428 | {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f"}, 429 | {file = "MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906"}, 430 | {file = "MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617"}, 431 | {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1"}, 432 | {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4"}, 433 | {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee"}, 434 | {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5"}, 435 | {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b"}, 436 | {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a"}, 437 | {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f"}, 438 | {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169"}, 439 | {file = "MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad"}, 440 | {file = "MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb"}, 441 | {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf"}, 442 | {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2"}, 443 | {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8"}, 444 | {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3"}, 445 | {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465"}, 446 | {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e"}, 447 | {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea"}, 448 | {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6"}, 449 | {file = "MarkupSafe-2.1.5-cp39-cp39-win32.whl", hash = "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf"}, 450 | {file = "MarkupSafe-2.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5"}, 451 | {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"}, 452 | ] 453 | 454 | [[package]] 455 | name = "mdurl" 456 | version = "0.1.2" 457 | requires_python = ">=3.7" 458 | summary = "Markdown URL utilities" 459 | groups = ["default"] 460 | files = [ 461 | {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, 462 | {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, 463 | ] 464 | 465 | [[package]] 466 | name = "multidict" 467 | version = "6.0.5" 468 | requires_python = ">=3.7" 469 | summary = "multidict implementation" 470 | groups = ["default"] 471 | files = [ 472 | {file = "multidict-6.0.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:228b644ae063c10e7f324ab1ab6b548bdf6f8b47f3ec234fef1093bc2735e5f9"}, 473 | {file = "multidict-6.0.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:896ebdcf62683551312c30e20614305f53125750803b614e9e6ce74a96232604"}, 474 | {file = "multidict-6.0.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:411bf8515f3be9813d06004cac41ccf7d1cd46dfe233705933dd163b60e37600"}, 475 | {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d147090048129ce3c453f0292e7697d333db95e52616b3793922945804a433c"}, 476 | {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:215ed703caf15f578dca76ee6f6b21b7603791ae090fbf1ef9d865571039ade5"}, 477 | {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c6390cf87ff6234643428991b7359b5f59cc15155695deb4eda5c777d2b880f"}, 478 | {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21fd81c4ebdb4f214161be351eb5bcf385426bf023041da2fd9e60681f3cebae"}, 479 | {file = "multidict-6.0.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3cc2ad10255f903656017363cd59436f2111443a76f996584d1077e43ee51182"}, 480 | {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6939c95381e003f54cd4c5516740faba40cf5ad3eeff460c3ad1d3e0ea2549bf"}, 481 | {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:220dd781e3f7af2c2c1053da9fa96d9cf3072ca58f057f4c5adaaa1cab8fc442"}, 482 | {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:766c8f7511df26d9f11cd3a8be623e59cca73d44643abab3f8c8c07620524e4a"}, 483 | {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:fe5d7785250541f7f5019ab9cba2c71169dc7d74d0f45253f8313f436458a4ef"}, 484 | {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c1c1496e73051918fcd4f58ff2e0f2f3066d1c76a0c6aeffd9b45d53243702cc"}, 485 | {file = "multidict-6.0.5-cp310-cp310-win32.whl", hash = "sha256:7afcdd1fc07befad18ec4523a782cde4e93e0a2bf71239894b8d61ee578c1319"}, 486 | {file = "multidict-6.0.5-cp310-cp310-win_amd64.whl", hash = "sha256:99f60d34c048c5c2fabc766108c103612344c46e35d4ed9ae0673d33c8fb26e8"}, 487 | {file = "multidict-6.0.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f285e862d2f153a70586579c15c44656f888806ed0e5b56b64489afe4a2dbfba"}, 488 | {file = "multidict-6.0.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:53689bb4e102200a4fafa9de9c7c3c212ab40a7ab2c8e474491914d2305f187e"}, 489 | {file = "multidict-6.0.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:612d1156111ae11d14afaf3a0669ebf6c170dbb735e510a7438ffe2369a847fd"}, 490 | {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7be7047bd08accdb7487737631d25735c9a04327911de89ff1b26b81745bd4e3"}, 491 | {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de170c7b4fe6859beb8926e84f7d7d6c693dfe8e27372ce3b76f01c46e489fcf"}, 492 | {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:04bde7a7b3de05732a4eb39c94574db1ec99abb56162d6c520ad26f83267de29"}, 493 | {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85f67aed7bb647f93e7520633d8f51d3cbc6ab96957c71272b286b2f30dc70ed"}, 494 | {file = "multidict-6.0.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:425bf820055005bfc8aa9a0b99ccb52cc2f4070153e34b701acc98d201693733"}, 495 | {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d3eb1ceec286eba8220c26f3b0096cf189aea7057b6e7b7a2e60ed36b373b77f"}, 496 | {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7901c05ead4b3fb75113fb1dd33eb1253c6d3ee37ce93305acd9d38e0b5f21a4"}, 497 | {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e0e79d91e71b9867c73323a3444724d496c037e578a0e1755ae159ba14f4f3d1"}, 498 | {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:29bfeb0dff5cb5fdab2023a7a9947b3b4af63e9c47cae2a10ad58394b517fddc"}, 499 | {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e030047e85cbcedbfc073f71836d62dd5dadfbe7531cae27789ff66bc551bd5e"}, 500 | {file = "multidict-6.0.5-cp311-cp311-win32.whl", hash = "sha256:2f4848aa3baa109e6ab81fe2006c77ed4d3cd1e0ac2c1fbddb7b1277c168788c"}, 501 | {file = "multidict-6.0.5-cp311-cp311-win_amd64.whl", hash = "sha256:2faa5ae9376faba05f630d7e5e6be05be22913782b927b19d12b8145968a85ea"}, 502 | {file = "multidict-6.0.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:51d035609b86722963404f711db441cf7134f1889107fb171a970c9701f92e1e"}, 503 | {file = "multidict-6.0.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:cbebcd5bcaf1eaf302617c114aa67569dd3f090dd0ce8ba9e35e9985b41ac35b"}, 504 | {file = "multidict-6.0.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2ffc42c922dbfddb4a4c3b438eb056828719f07608af27d163191cb3e3aa6cc5"}, 505 | {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ceb3b7e6a0135e092de86110c5a74e46bda4bd4fbfeeb3a3bcec79c0f861e450"}, 506 | {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:79660376075cfd4b2c80f295528aa6beb2058fd289f4c9252f986751a4cd0496"}, 507 | {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e4428b29611e989719874670fd152b6625500ad6c686d464e99f5aaeeaca175a"}, 508 | {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d84a5c3a5f7ce6db1f999fb9438f686bc2e09d38143f2d93d8406ed2dd6b9226"}, 509 | {file = "multidict-6.0.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:76c0de87358b192de7ea9649beb392f107dcad9ad27276324c24c91774ca5271"}, 510 | {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:79a6d2ba910adb2cbafc95dad936f8b9386e77c84c35bc0add315b856d7c3abb"}, 511 | {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:92d16a3e275e38293623ebf639c471d3e03bb20b8ebb845237e0d3664914caef"}, 512 | {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:fb616be3538599e797a2017cccca78e354c767165e8858ab5116813146041a24"}, 513 | {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:14c2976aa9038c2629efa2c148022ed5eb4cb939e15ec7aace7ca932f48f9ba6"}, 514 | {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:435a0984199d81ca178b9ae2c26ec3d49692d20ee29bc4c11a2a8d4514c67eda"}, 515 | {file = "multidict-6.0.5-cp312-cp312-win32.whl", hash = "sha256:9fe7b0653ba3d9d65cbe7698cca585bf0f8c83dbbcc710db9c90f478e175f2d5"}, 516 | {file = "multidict-6.0.5-cp312-cp312-win_amd64.whl", hash = "sha256:01265f5e40f5a17f8241d52656ed27192be03bfa8764d88e8220141d1e4b3556"}, 517 | {file = "multidict-6.0.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e7be68734bd8c9a513f2b0cfd508802d6609da068f40dc57d4e3494cefc92929"}, 518 | {file = "multidict-6.0.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1d9ea7a7e779d7a3561aade7d596649fbecfa5c08a7674b11b423783217933f9"}, 519 | {file = "multidict-6.0.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ea1456df2a27c73ce51120fa2f519f1bea2f4a03a917f4a43c8707cf4cbbae1a"}, 520 | {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf590b134eb70629e350691ecca88eac3e3b8b3c86992042fb82e3cb1830d5e1"}, 521 | {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5c0631926c4f58e9a5ccce555ad7747d9a9f8b10619621f22f9635f069f6233e"}, 522 | {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dce1c6912ab9ff5f179eaf6efe7365c1f425ed690b03341911bf4939ef2f3046"}, 523 | {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0868d64af83169e4d4152ec612637a543f7a336e4a307b119e98042e852ad9c"}, 524 | {file = "multidict-6.0.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:141b43360bfd3bdd75f15ed811850763555a251e38b2405967f8e25fb43f7d40"}, 525 | {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7df704ca8cf4a073334e0427ae2345323613e4df18cc224f647f251e5e75a527"}, 526 | {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:6214c5a5571802c33f80e6c84713b2c79e024995b9c5897f794b43e714daeec9"}, 527 | {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:cd6c8fca38178e12c00418de737aef1261576bd1b6e8c6134d3e729a4e858b38"}, 528 | {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:e02021f87a5b6932fa6ce916ca004c4d441509d33bbdbeca70d05dff5e9d2479"}, 529 | {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ebd8d160f91a764652d3e51ce0d2956b38efe37c9231cd82cfc0bed2e40b581c"}, 530 | {file = "multidict-6.0.5-cp39-cp39-win32.whl", hash = "sha256:04da1bb8c8dbadf2a18a452639771951c662c5ad03aefe4884775454be322c9b"}, 531 | {file = "multidict-6.0.5-cp39-cp39-win_amd64.whl", hash = "sha256:d6f6d4f185481c9669b9447bf9d9cf3b95a0e9df9d169bbc17e363b7d5487755"}, 532 | {file = "multidict-6.0.5-py3-none-any.whl", hash = "sha256:0d63c74e3d7ab26de115c49bffc92cc77ed23395303d496eae515d4204a625e7"}, 533 | {file = "multidict-6.0.5.tar.gz", hash = "sha256:f7e301075edaf50500f0b341543c41194d8df3ae5caf4702f2095f3ca73dd8da"}, 534 | ] 535 | 536 | [[package]] 537 | name = "nepattern" 538 | version = "0.7.4" 539 | requires_python = ">=3.8" 540 | summary = "a complex pattern, support typing" 541 | groups = ["default"] 542 | dependencies = [ 543 | "tarina>=0.5.1", 544 | "typing-extensions>=4.5.0", 545 | ] 546 | files = [ 547 | {file = "nepattern-0.7.4-py3-none-any.whl", hash = "sha256:ad7287ee2ff46f010b8c758bf9ed8fd8141aa1afce29c5d5a4f94cc85d277e6e"}, 548 | {file = "nepattern-0.7.4.tar.gz", hash = "sha256:255a042b45e9d2b04f3c2d73b81912c6b856fae1a10a6e4df30b08ed892d2f9c"}, 549 | ] 550 | 551 | [[package]] 552 | name = "nonebot-plugin-alconna" 553 | version = "0.48.0" 554 | requires_python = ">=3.9" 555 | summary = "Alconna Adapter for Nonebot" 556 | groups = ["default"] 557 | dependencies = [ 558 | "arclet-alconna-tools>=0.7.6", 559 | "arclet-alconna>=1.8.16", 560 | "importlib-metadata>=4.13.0", 561 | "nepattern>=0.7.4", 562 | "nonebot-plugin-waiter>=0.6.0", 563 | "nonebot2>=2.3.0", 564 | "tarina>=0.5.4", 565 | ] 566 | files = [ 567 | {file = "nonebot_plugin_alconna-0.48.0-py3-none-any.whl", hash = "sha256:02dcdca744934368246d48373393bcd475d7e4c7182a56a777b0bc45586d557a"}, 568 | {file = "nonebot_plugin_alconna-0.48.0.tar.gz", hash = "sha256:f5a8a3b9da42f3a6ef2b387d9b5194023178c135d03381b1aa60eead9363d6cc"}, 569 | ] 570 | 571 | [[package]] 572 | name = "nonebot-plugin-htmlrender" 573 | version = "0.3.2" 574 | requires_python = "<4.0,>=3.9" 575 | summary = "通过浏览器渲染图片" 576 | groups = ["default"] 577 | dependencies = [ 578 | "Pygments>=2.10.0", 579 | "aiofiles>=0.8.0", 580 | "jinja2>=3.0.3", 581 | "markdown>=3.3.6", 582 | "nonebot2[fastapi]>=2.2.0", 583 | "playwright>=1.17.2", 584 | "pymdown-extensions>=9.1", 585 | "python-markdown-math>=0.8", 586 | ] 587 | files = [ 588 | {file = "nonebot_plugin_htmlrender-0.3.2-py3-none-any.whl", hash = "sha256:6de89ce6427faa1c5096de9b64565c66293e319813da04267954dd362707c0ed"}, 589 | {file = "nonebot_plugin_htmlrender-0.3.2.tar.gz", hash = "sha256:acddfe12a2a82784e32e1d2b00d22de2ad75da5452fa1290fb8aa89f0d415e7d"}, 590 | ] 591 | 592 | [[package]] 593 | name = "nonebot-plugin-waiter" 594 | version = "0.6.2" 595 | requires_python = ">=3.9" 596 | summary = "An alternative for got-and-reject in Nonebot" 597 | groups = ["default"] 598 | dependencies = [ 599 | "nonebot2>=2.3.0", 600 | ] 601 | files = [ 602 | {file = "nonebot_plugin_waiter-0.6.2-py3-none-any.whl", hash = "sha256:599251f02d074ab7142e2144f68d63f41104bddcd359051f63979a8163538eac"}, 603 | {file = "nonebot_plugin_waiter-0.6.2.tar.gz", hash = "sha256:02017a1613d1273be3535b28a4d8e823f2dbaba26fab524bc8207f50a25ec8e4"}, 604 | ] 605 | 606 | [[package]] 607 | name = "nonebot2" 608 | version = "2.3.1" 609 | requires_python = "<4.0,>=3.9" 610 | summary = "An asynchronous python bot framework." 611 | groups = ["default"] 612 | dependencies = [ 613 | "loguru<1.0.0,>=0.6.0", 614 | "pydantic!=2.5.0,!=2.5.1,<3.0.0,>=1.10.0", 615 | "pygtrie<3.0.0,>=2.4.1", 616 | "python-dotenv<2.0.0,>=0.21.0", 617 | "tomli<3.0.0,>=2.0.1; python_version < \"3.11\"", 618 | "typing-extensions<5.0.0,>=4.4.0", 619 | "yarl<2.0.0,>=1.7.2", 620 | ] 621 | files = [ 622 | {file = "nonebot2-2.3.1-py3-none-any.whl", hash = "sha256:91ac0abebe6c403c2443b11a49e065b79e6199460bdd61a32148366b35f81c4d"}, 623 | {file = "nonebot2-2.3.1.tar.gz", hash = "sha256:ac5a1a1759f15310e9183b606ce6bdbe52a90287bf36a69201be548e23d41e6c"}, 624 | ] 625 | 626 | [[package]] 627 | name = "nonebot2" 628 | version = "2.3.1" 629 | extras = ["fastapi"] 630 | requires_python = "<4.0,>=3.9" 631 | summary = "An asynchronous python bot framework." 632 | groups = ["default"] 633 | dependencies = [ 634 | "fastapi<1.0.0,>=0.93.0", 635 | "nonebot2==2.3.1", 636 | "uvicorn[standard]<1.0.0,>=0.20.0", 637 | ] 638 | files = [ 639 | {file = "nonebot2-2.3.1-py3-none-any.whl", hash = "sha256:91ac0abebe6c403c2443b11a49e065b79e6199460bdd61a32148366b35f81c4d"}, 640 | {file = "nonebot2-2.3.1.tar.gz", hash = "sha256:ac5a1a1759f15310e9183b606ce6bdbe52a90287bf36a69201be548e23d41e6c"}, 641 | ] 642 | 643 | [[package]] 644 | name = "orjson" 645 | version = "3.10.5" 646 | requires_python = ">=3.8" 647 | summary = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" 648 | groups = ["default"] 649 | files = [ 650 | {file = "orjson-3.10.5-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:545d493c1f560d5ccfc134803ceb8955a14c3fcb47bbb4b2fee0232646d0b932"}, 651 | {file = "orjson-3.10.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f4324929c2dd917598212bfd554757feca3e5e0fa60da08be11b4aa8b90013c1"}, 652 | {file = "orjson-3.10.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8c13ca5e2ddded0ce6a927ea5a9f27cae77eee4c75547b4297252cb20c4d30e6"}, 653 | {file = "orjson-3.10.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b6c8e30adfa52c025f042a87f450a6b9ea29649d828e0fec4858ed5e6caecf63"}, 654 | {file = "orjson-3.10.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:338fd4f071b242f26e9ca802f443edc588fa4ab60bfa81f38beaedf42eda226c"}, 655 | {file = "orjson-3.10.5-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:6970ed7a3126cfed873c5d21ece1cd5d6f83ca6c9afb71bbae21a0b034588d96"}, 656 | {file = "orjson-3.10.5-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:235dadefb793ad12f7fa11e98a480db1f7c6469ff9e3da5e73c7809c700d746b"}, 657 | {file = "orjson-3.10.5-cp310-none-win32.whl", hash = "sha256:be79e2393679eda6a590638abda16d167754393f5d0850dcbca2d0c3735cebe2"}, 658 | {file = "orjson-3.10.5-cp310-none-win_amd64.whl", hash = "sha256:c4a65310ccb5c9910c47b078ba78e2787cb3878cdded1702ac3d0da71ddc5228"}, 659 | {file = "orjson-3.10.5-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:cdf7365063e80899ae3a697def1277c17a7df7ccfc979990a403dfe77bb54d40"}, 660 | {file = "orjson-3.10.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b68742c469745d0e6ca5724506858f75e2f1e5b59a4315861f9e2b1df77775a"}, 661 | {file = "orjson-3.10.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7d10cc1b594951522e35a3463da19e899abe6ca95f3c84c69e9e901e0bd93d38"}, 662 | {file = "orjson-3.10.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dcbe82b35d1ac43b0d84072408330fd3295c2896973112d495e7234f7e3da2e1"}, 663 | {file = "orjson-3.10.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10c0eb7e0c75e1e486c7563fe231b40fdd658a035ae125c6ba651ca3b07936f5"}, 664 | {file = "orjson-3.10.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:53ed1c879b10de56f35daf06dbc4a0d9a5db98f6ee853c2dbd3ee9d13e6f302f"}, 665 | {file = "orjson-3.10.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:099e81a5975237fda3100f918839af95f42f981447ba8f47adb7b6a3cdb078fa"}, 666 | {file = "orjson-3.10.5-cp311-none-win32.whl", hash = "sha256:1146bf85ea37ac421594107195db8bc77104f74bc83e8ee21a2e58596bfb2f04"}, 667 | {file = "orjson-3.10.5-cp311-none-win_amd64.whl", hash = "sha256:36a10f43c5f3a55c2f680efe07aa93ef4a342d2960dd2b1b7ea2dd764fe4a37c"}, 668 | {file = "orjson-3.10.5-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:68f85ecae7af14a585a563ac741b0547a3f291de81cd1e20903e79f25170458f"}, 669 | {file = "orjson-3.10.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28afa96f496474ce60d3340fe8d9a263aa93ea01201cd2bad844c45cd21f5268"}, 670 | {file = "orjson-3.10.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9cd684927af3e11b6e754df80b9ffafd9fb6adcaa9d3e8fdd5891be5a5cad51e"}, 671 | {file = "orjson-3.10.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d21b9983da032505f7050795e98b5d9eee0df903258951566ecc358f6696969"}, 672 | {file = "orjson-3.10.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ad1de7fef79736dde8c3554e75361ec351158a906d747bd901a52a5c9c8d24b"}, 673 | {file = "orjson-3.10.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2d97531cdfe9bdd76d492e69800afd97e5930cb0da6a825646667b2c6c6c0211"}, 674 | {file = "orjson-3.10.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d69858c32f09c3e1ce44b617b3ebba1aba030e777000ebdf72b0d8e365d0b2b3"}, 675 | {file = "orjson-3.10.5-cp312-none-win32.whl", hash = "sha256:64c9cc089f127e5875901ac05e5c25aa13cfa5dbbbd9602bda51e5c611d6e3e2"}, 676 | {file = "orjson-3.10.5-cp312-none-win_amd64.whl", hash = "sha256:b2efbd67feff8c1f7728937c0d7f6ca8c25ec81373dc8db4ef394c1d93d13dc5"}, 677 | {file = "orjson-3.10.5-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:85c89131d7b3218db1b24c4abecea92fd6c7f9fab87441cfc342d3acc725d807"}, 678 | {file = "orjson-3.10.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb66215277a230c456f9038d5e2d84778141643207f85336ef8d2a9da26bd7ca"}, 679 | {file = "orjson-3.10.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:51bbcdea96cdefa4a9b4461e690c75ad4e33796530d182bdd5c38980202c134a"}, 680 | {file = "orjson-3.10.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbead71dbe65f959b7bd8cf91e0e11d5338033eba34c114f69078d59827ee139"}, 681 | {file = "orjson-3.10.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5df58d206e78c40da118a8c14fc189207fffdcb1f21b3b4c9c0c18e839b5a214"}, 682 | {file = "orjson-3.10.5-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:c4057c3b511bb8aef605616bd3f1f002a697c7e4da6adf095ca5b84c0fd43595"}, 683 | {file = "orjson-3.10.5-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:b39e006b00c57125ab974362e740c14a0c6a66ff695bff44615dcf4a70ce2b86"}, 684 | {file = "orjson-3.10.5-cp39-none-win32.whl", hash = "sha256:eded5138cc565a9d618e111c6d5c2547bbdd951114eb822f7f6309e04db0fb47"}, 685 | {file = "orjson-3.10.5-cp39-none-win_amd64.whl", hash = "sha256:cc28e90a7cae7fcba2493953cff61da5a52950e78dc2dacfe931a317ee3d8de7"}, 686 | {file = "orjson-3.10.5.tar.gz", hash = "sha256:7a5baef8a4284405d96c90c7c62b755e9ef1ada84c2406c24a9ebec86b89f46d"}, 687 | ] 688 | 689 | [[package]] 690 | name = "playwright" 691 | version = "1.44.0" 692 | requires_python = ">=3.8" 693 | summary = "A high-level API to automate web browsers" 694 | groups = ["default"] 695 | dependencies = [ 696 | "greenlet==3.0.3", 697 | "pyee==11.1.0", 698 | ] 699 | files = [ 700 | {file = "playwright-1.44.0-py3-none-macosx_10_13_x86_64.whl", hash = "sha256:c2317a80896796fdeb03d60f06cc229e775ff2e19b80c64b1bb9b29c8a59d992"}, 701 | {file = "playwright-1.44.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:54d44fb634d870839301c2326e1e12a178a1be0de76d0caaec230ab075c2e077"}, 702 | {file = "playwright-1.44.0-py3-none-macosx_11_0_universal2.whl", hash = "sha256:64b67194e73b47ae72acf25f1a9cfacfef38ca2b52e4bb8b0abd385c5deeaadf"}, 703 | {file = "playwright-1.44.0-py3-none-manylinux1_x86_64.whl", hash = "sha256:29161b1fae71f7c402df5b15f0bd3deaeecd8b3d1ecd9ff01271700c66210e7b"}, 704 | {file = "playwright-1.44.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8c8a3bfea17576d3f94a2363eee195cbda8dbba86975588c7eaac7792b25eee"}, 705 | {file = "playwright-1.44.0-py3-none-win32.whl", hash = "sha256:235e37832deaa9af8a629d09955396259ab757533cc1922f9b0308b4ee0d9cdf"}, 706 | {file = "playwright-1.44.0-py3-none-win_amd64.whl", hash = "sha256:5b8a4a1d4d50f4ff99b47965576322a8c4e34631854b862a25c1feb824be22a8"}, 707 | ] 708 | 709 | [[package]] 710 | name = "pydantic" 711 | version = "2.7.4" 712 | requires_python = ">=3.8" 713 | summary = "Data validation using Python type hints" 714 | groups = ["default"] 715 | dependencies = [ 716 | "annotated-types>=0.4.0", 717 | "pydantic-core==2.18.4", 718 | "typing-extensions>=4.6.1", 719 | ] 720 | files = [ 721 | {file = "pydantic-2.7.4-py3-none-any.whl", hash = "sha256:ee8538d41ccb9c0a9ad3e0e5f07bf15ed8015b481ced539a1759d8cc89ae90d0"}, 722 | {file = "pydantic-2.7.4.tar.gz", hash = "sha256:0c84efd9548d545f63ac0060c1e4d39bb9b14db8b3c0652338aecc07b5adec52"}, 723 | ] 724 | 725 | [[package]] 726 | name = "pydantic-core" 727 | version = "2.18.4" 728 | requires_python = ">=3.8" 729 | summary = "Core functionality for Pydantic validation and serialization" 730 | groups = ["default"] 731 | dependencies = [ 732 | "typing-extensions!=4.7.0,>=4.6.0", 733 | ] 734 | files = [ 735 | {file = "pydantic_core-2.18.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:f76d0ad001edd426b92233d45c746fd08f467d56100fd8f30e9ace4b005266e4"}, 736 | {file = "pydantic_core-2.18.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:59ff3e89f4eaf14050c8022011862df275b552caef8082e37b542b066ce1ff26"}, 737 | {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a55b5b16c839df1070bc113c1f7f94a0af4433fcfa1b41799ce7606e5c79ce0a"}, 738 | {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4d0dcc59664fcb8974b356fe0a18a672d6d7cf9f54746c05f43275fc48636851"}, 739 | {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8951eee36c57cd128f779e641e21eb40bc5073eb28b2d23f33eb0ef14ffb3f5d"}, 740 | {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4701b19f7e3a06ea655513f7938de6f108123bf7c86bbebb1196eb9bd35cf724"}, 741 | {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e00a3f196329e08e43d99b79b286d60ce46bed10f2280d25a1718399457e06be"}, 742 | {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:97736815b9cc893b2b7f663628e63f436018b75f44854c8027040e05230eeddb"}, 743 | {file = "pydantic_core-2.18.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6891a2ae0e8692679c07728819b6e2b822fb30ca7445f67bbf6509b25a96332c"}, 744 | {file = "pydantic_core-2.18.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bc4ff9805858bd54d1a20efff925ccd89c9d2e7cf4986144b30802bf78091c3e"}, 745 | {file = "pydantic_core-2.18.4-cp310-none-win32.whl", hash = "sha256:1b4de2e51bbcb61fdebd0ab86ef28062704f62c82bbf4addc4e37fa4b00b7cbc"}, 746 | {file = "pydantic_core-2.18.4-cp310-none-win_amd64.whl", hash = "sha256:6a750aec7bf431517a9fd78cb93c97b9b0c496090fee84a47a0d23668976b4b0"}, 747 | {file = "pydantic_core-2.18.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:942ba11e7dfb66dc70f9ae66b33452f51ac7bb90676da39a7345e99ffb55402d"}, 748 | {file = "pydantic_core-2.18.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b2ebef0e0b4454320274f5e83a41844c63438fdc874ea40a8b5b4ecb7693f1c4"}, 749 | {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a642295cd0c8df1b86fc3dced1d067874c353a188dc8e0f744626d49e9aa51c4"}, 750 | {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f09baa656c904807e832cf9cce799c6460c450c4ad80803517032da0cd062e2"}, 751 | {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:98906207f29bc2c459ff64fa007afd10a8c8ac080f7e4d5beff4c97086a3dabd"}, 752 | {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:19894b95aacfa98e7cb093cd7881a0c76f55731efad31073db4521e2b6ff5b7d"}, 753 | {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0fbbdc827fe5e42e4d196c746b890b3d72876bdbf160b0eafe9f0334525119c8"}, 754 | {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f85d05aa0918283cf29a30b547b4df2fbb56b45b135f9e35b6807cb28bc47951"}, 755 | {file = "pydantic_core-2.18.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e85637bc8fe81ddb73fda9e56bab24560bdddfa98aa64f87aaa4e4b6730c23d2"}, 756 | {file = "pydantic_core-2.18.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:2f5966897e5461f818e136b8451d0551a2e77259eb0f73a837027b47dc95dab9"}, 757 | {file = "pydantic_core-2.18.4-cp311-none-win32.whl", hash = "sha256:44c7486a4228413c317952e9d89598bcdfb06399735e49e0f8df643e1ccd0558"}, 758 | {file = "pydantic_core-2.18.4-cp311-none-win_amd64.whl", hash = "sha256:8a7164fe2005d03c64fd3b85649891cd4953a8de53107940bf272500ba8a788b"}, 759 | {file = "pydantic_core-2.18.4-cp311-none-win_arm64.whl", hash = "sha256:4e99bc050fe65c450344421017f98298a97cefc18c53bb2f7b3531eb39bc7805"}, 760 | {file = "pydantic_core-2.18.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:6f5c4d41b2771c730ea1c34e458e781b18cc668d194958e0112455fff4e402b2"}, 761 | {file = "pydantic_core-2.18.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2fdf2156aa3d017fddf8aea5adfba9f777db1d6022d392b682d2a8329e087cef"}, 762 | {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4748321b5078216070b151d5271ef3e7cc905ab170bbfd27d5c83ee3ec436695"}, 763 | {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:847a35c4d58721c5dc3dba599878ebbdfd96784f3fb8bb2c356e123bdcd73f34"}, 764 | {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3c40d4eaad41f78e3bbda31b89edc46a3f3dc6e171bf0ecf097ff7a0ffff7cb1"}, 765 | {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:21a5e440dbe315ab9825fcd459b8814bb92b27c974cbc23c3e8baa2b76890077"}, 766 | {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:01dd777215e2aa86dfd664daed5957704b769e726626393438f9c87690ce78c3"}, 767 | {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4b06beb3b3f1479d32befd1f3079cc47b34fa2da62457cdf6c963393340b56e9"}, 768 | {file = "pydantic_core-2.18.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:564d7922e4b13a16b98772441879fcdcbe82ff50daa622d681dd682175ea918c"}, 769 | {file = "pydantic_core-2.18.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:0eb2a4f660fcd8e2b1c90ad566db2b98d7f3f4717c64fe0a83e0adb39766d5b8"}, 770 | {file = "pydantic_core-2.18.4-cp312-none-win32.whl", hash = "sha256:8b8bab4c97248095ae0c4455b5a1cd1cdd96e4e4769306ab19dda135ea4cdb07"}, 771 | {file = "pydantic_core-2.18.4-cp312-none-win_amd64.whl", hash = "sha256:14601cdb733d741b8958224030e2bfe21a4a881fb3dd6fbb21f071cabd48fa0a"}, 772 | {file = "pydantic_core-2.18.4-cp312-none-win_arm64.whl", hash = "sha256:c1322d7dd74713dcc157a2b7898a564ab091ca6c58302d5c7b4c07296e3fd00f"}, 773 | {file = "pydantic_core-2.18.4-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:44a688331d4a4e2129140a8118479443bd6f1905231138971372fcde37e43528"}, 774 | {file = "pydantic_core-2.18.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a2fdd81edd64342c85ac7cf2753ccae0b79bf2dfa063785503cb85a7d3593223"}, 775 | {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:86110d7e1907ab36691f80b33eb2da87d780f4739ae773e5fc83fb272f88825f"}, 776 | {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:46387e38bd641b3ee5ce247563b60c5ca098da9c56c75c157a05eaa0933ed154"}, 777 | {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:123c3cec203e3f5ac7b000bd82235f1a3eced8665b63d18be751f115588fea30"}, 778 | {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dc1803ac5c32ec324c5261c7209e8f8ce88e83254c4e1aebdc8b0a39f9ddb443"}, 779 | {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:53db086f9f6ab2b4061958d9c276d1dbe3690e8dd727d6abf2321d6cce37fa94"}, 780 | {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:abc267fa9837245cc28ea6929f19fa335f3dc330a35d2e45509b6566dc18be23"}, 781 | {file = "pydantic_core-2.18.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a0d829524aaefdebccb869eed855e2d04c21d2d7479b6cada7ace5448416597b"}, 782 | {file = "pydantic_core-2.18.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:509daade3b8649f80d4e5ff21aa5673e4ebe58590b25fe42fac5f0f52c6f034a"}, 783 | {file = "pydantic_core-2.18.4-cp39-none-win32.whl", hash = "sha256:ca26a1e73c48cfc54c4a76ff78df3727b9d9f4ccc8dbee4ae3f73306a591676d"}, 784 | {file = "pydantic_core-2.18.4-cp39-none-win_amd64.whl", hash = "sha256:c67598100338d5d985db1b3d21f3619ef392e185e71b8d52bceacc4a7771ea7e"}, 785 | {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:574d92eac874f7f4db0ca653514d823a0d22e2354359d0759e3f6a406db5d55d"}, 786 | {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:1f4d26ceb5eb9eed4af91bebeae4b06c3fb28966ca3a8fb765208cf6b51102ab"}, 787 | {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77450e6d20016ec41f43ca4a6c63e9fdde03f0ae3fe90e7c27bdbeaece8b1ed4"}, 788 | {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d323a01da91851a4f17bf592faf46149c9169d68430b3146dcba2bb5e5719abc"}, 789 | {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:43d447dd2ae072a0065389092a231283f62d960030ecd27565672bd40746c507"}, 790 | {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:578e24f761f3b425834f297b9935e1ce2e30f51400964ce4801002435a1b41ef"}, 791 | {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:81b5efb2f126454586d0f40c4d834010979cb80785173d1586df845a632e4e6d"}, 792 | {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ab86ce7c8f9bea87b9d12c7f0af71102acbf5ecbc66c17796cff45dae54ef9a5"}, 793 | {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:90afc12421df2b1b4dcc975f814e21bc1754640d502a2fbcc6d41e77af5ec312"}, 794 | {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:51991a89639a912c17bef4b45c87bd83593aee0437d8102556af4885811d59f5"}, 795 | {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:293afe532740370aba8c060882f7d26cfd00c94cae32fd2e212a3a6e3b7bc15e"}, 796 | {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b48ece5bde2e768197a2d0f6e925f9d7e3e826f0ad2271120f8144a9db18d5c8"}, 797 | {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:eae237477a873ab46e8dd748e515c72c0c804fb380fbe6c85533c7de51f23a8f"}, 798 | {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:834b5230b5dfc0c1ec37b2fda433b271cbbc0e507560b5d1588e2cc1148cf1ce"}, 799 | {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:e858ac0a25074ba4bce653f9b5d0a85b7456eaddadc0ce82d3878c22489fa4ee"}, 800 | {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2fd41f6eff4c20778d717af1cc50eca52f5afe7805ee530a4fbd0bae284f16e9"}, 801 | {file = "pydantic_core-2.18.4.tar.gz", hash = "sha256:ec3beeada09ff865c344ff3bc2f427f5e6c26401cc6113d77e372c3fdac73864"}, 802 | ] 803 | 804 | [[package]] 805 | name = "pyee" 806 | version = "11.1.0" 807 | requires_python = ">=3.8" 808 | summary = "A rough port of Node.js's EventEmitter to Python with a few tricks of its own" 809 | groups = ["default"] 810 | dependencies = [ 811 | "typing-extensions", 812 | ] 813 | files = [ 814 | {file = "pyee-11.1.0-py3-none-any.whl", hash = "sha256:5d346a7d0f861a4b2e6c47960295bd895f816725b27d656181947346be98d7c1"}, 815 | {file = "pyee-11.1.0.tar.gz", hash = "sha256:b53af98f6990c810edd9b56b87791021a8f54fd13db4edd1142438d44ba2263f"}, 816 | ] 817 | 818 | [[package]] 819 | name = "pygments" 820 | version = "2.18.0" 821 | requires_python = ">=3.8" 822 | summary = "Pygments is a syntax highlighting package written in Python." 823 | groups = ["default"] 824 | files = [ 825 | {file = "pygments-2.18.0-py3-none-any.whl", hash = "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a"}, 826 | {file = "pygments-2.18.0.tar.gz", hash = "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199"}, 827 | ] 828 | 829 | [[package]] 830 | name = "pygtrie" 831 | version = "2.5.0" 832 | summary = "A pure Python trie data structure implementation." 833 | groups = ["default"] 834 | files = [ 835 | {file = "pygtrie-2.5.0-py3-none-any.whl", hash = "sha256:8795cda8105493d5ae159a5bef313ff13156c5d4d72feddefacaad59f8c8ce16"}, 836 | {file = "pygtrie-2.5.0.tar.gz", hash = "sha256:203514ad826eb403dab1d2e2ddd034e0d1534bbe4dbe0213bb0593f66beba4e2"}, 837 | ] 838 | 839 | [[package]] 840 | name = "pymdown-extensions" 841 | version = "10.8.1" 842 | requires_python = ">=3.8" 843 | summary = "Extension pack for Python Markdown." 844 | groups = ["default"] 845 | dependencies = [ 846 | "markdown>=3.6", 847 | "pyyaml", 848 | ] 849 | files = [ 850 | {file = "pymdown_extensions-10.8.1-py3-none-any.whl", hash = "sha256:f938326115884f48c6059c67377c46cf631c733ef3629b6eed1349989d1b30cb"}, 851 | {file = "pymdown_extensions-10.8.1.tar.gz", hash = "sha256:3ab1db5c9e21728dabf75192d71471f8e50f216627e9a1fa9535ecb0231b9940"}, 852 | ] 853 | 854 | [[package]] 855 | name = "python-dotenv" 856 | version = "1.0.1" 857 | requires_python = ">=3.8" 858 | summary = "Read key-value pairs from a .env file and set them as environment variables" 859 | groups = ["default"] 860 | files = [ 861 | {file = "python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca"}, 862 | {file = "python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a"}, 863 | ] 864 | 865 | [[package]] 866 | name = "python-markdown-math" 867 | version = "0.8" 868 | requires_python = ">=3.6" 869 | summary = "Math extension for Python-Markdown" 870 | groups = ["default"] 871 | dependencies = [ 872 | "Markdown>=3.0", 873 | ] 874 | files = [ 875 | {file = "python-markdown-math-0.8.tar.gz", hash = "sha256:8564212af679fc18d53f38681f16080fcd3d186073f23825c7ce86fadd3e3635"}, 876 | {file = "python_markdown_math-0.8-py3-none-any.whl", hash = "sha256:c685249d84b5b697e9114d7beb352bd8ca2e07fd268fd4057ffca888c14641e5"}, 877 | ] 878 | 879 | [[package]] 880 | name = "python-multipart" 881 | version = "0.0.9" 882 | requires_python = ">=3.8" 883 | summary = "A streaming multipart parser for Python" 884 | groups = ["default"] 885 | files = [ 886 | {file = "python_multipart-0.0.9-py3-none-any.whl", hash = "sha256:97ca7b8ea7b05f977dc3849c3ba99d51689822fab725c3703af7c866a0c2b215"}, 887 | {file = "python_multipart-0.0.9.tar.gz", hash = "sha256:03f54688c663f1b7977105f021043b0793151e4cb1c1a9d4a11fc13d622c4026"}, 888 | ] 889 | 890 | [[package]] 891 | name = "pyyaml" 892 | version = "6.0.1" 893 | requires_python = ">=3.6" 894 | summary = "YAML parser and emitter for Python" 895 | groups = ["default"] 896 | files = [ 897 | {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"}, 898 | {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"}, 899 | {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, 900 | {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, 901 | {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, 902 | {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, 903 | {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, 904 | {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, 905 | {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, 906 | {file = "PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"}, 907 | {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, 908 | {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, 909 | {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, 910 | {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, 911 | {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, 912 | {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, 913 | {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, 914 | {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, 915 | {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"}, 916 | {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, 917 | {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, 918 | {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, 919 | {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, 920 | {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, 921 | {file = "PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859"}, 922 | {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, 923 | {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, 924 | {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, 925 | {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, 926 | {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, 927 | {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, 928 | {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, 929 | ] 930 | 931 | [[package]] 932 | name = "rich" 933 | version = "13.7.1" 934 | requires_python = ">=3.7.0" 935 | summary = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" 936 | groups = ["default"] 937 | dependencies = [ 938 | "markdown-it-py>=2.2.0", 939 | "pygments<3.0.0,>=2.13.0", 940 | ] 941 | files = [ 942 | {file = "rich-13.7.1-py3-none-any.whl", hash = "sha256:4edbae314f59eb482f54e9e30bf00d33350aaa94f4bfcd4e9e3110e64d0d7222"}, 943 | {file = "rich-13.7.1.tar.gz", hash = "sha256:9be308cb1fe2f1f57d67ce99e95af38a1e2bc71ad9813b0e247cf7ffbcc3a432"}, 944 | ] 945 | 946 | [[package]] 947 | name = "shellingham" 948 | version = "1.5.4" 949 | requires_python = ">=3.7" 950 | summary = "Tool to Detect Surrounding Shell" 951 | groups = ["default"] 952 | files = [ 953 | {file = "shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686"}, 954 | {file = "shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de"}, 955 | ] 956 | 957 | [[package]] 958 | name = "sniffio" 959 | version = "1.3.1" 960 | requires_python = ">=3.7" 961 | summary = "Sniff out which async library your code is running under" 962 | groups = ["default"] 963 | files = [ 964 | {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, 965 | {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, 966 | ] 967 | 968 | [[package]] 969 | name = "starlette" 970 | version = "0.37.2" 971 | requires_python = ">=3.8" 972 | summary = "The little ASGI library that shines." 973 | groups = ["default"] 974 | dependencies = [ 975 | "anyio<5,>=3.4.0", 976 | "typing-extensions>=3.10.0; python_version < \"3.10\"", 977 | ] 978 | files = [ 979 | {file = "starlette-0.37.2-py3-none-any.whl", hash = "sha256:6fe59f29268538e5d0d182f2791a479a0c64638e6935d1c6989e63fb2699c6ee"}, 980 | {file = "starlette-0.37.2.tar.gz", hash = "sha256:9af890290133b79fc3db55474ade20f6220a364a0402e0b556e7cd5e1e093823"}, 981 | ] 982 | 983 | [[package]] 984 | name = "tarina" 985 | version = "0.5.4" 986 | requires_python = ">=3.8" 987 | summary = "A collection of common utils for Arclet" 988 | groups = ["default"] 989 | dependencies = [ 990 | "typing-extensions>=4.4.0", 991 | ] 992 | files = [ 993 | {file = "tarina-0.5.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:49f20a447866ecc831acc82f09dec01f77a0ca1f89b12fa27268bccd29378449"}, 994 | {file = "tarina-0.5.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5b24b5c07dc02c006d80930028e1c5f46945bf55effbeeaa426d5ac8f46eff88"}, 995 | {file = "tarina-0.5.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ed8fe5a1df3b32e69f99f5ae6615dc8c2e34459c7e7f828bbeadefb4ecd4fe4f"}, 996 | {file = "tarina-0.5.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ab6fac674c408bff3161a27473951df8994b54fff406680814079c9c0b82f804"}, 997 | {file = "tarina-0.5.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dfabcce37425aaf5db604ad916c9b69350174afcdb98192c6dbf1fc0cda2183f"}, 998 | {file = "tarina-0.5.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:18900dc94388da4d322c56292cdab6a62da46d27ab5db30ed8809caab57c3502"}, 999 | {file = "tarina-0.5.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7b3f8b69949c85bb3cf5b27985961ba0c26e4359a42352f7d5870f6d455f4890"}, 1000 | {file = "tarina-0.5.4-cp310-cp310-win32.whl", hash = "sha256:8e4389a6147460b6ea6a795f21a6348190ca2fe0eb95faafb3120bb0d4de7033"}, 1001 | {file = "tarina-0.5.4-cp310-cp310-win_amd64.whl", hash = "sha256:042bdbaac389334ab9c0851a5f1972dc9ed5c0387b4bcdee3ba1b2223aadb39f"}, 1002 | {file = "tarina-0.5.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:08964a6daa02d992be4b4bf2ace99c94549350195a749198f2d422221e93cc9f"}, 1003 | {file = "tarina-0.5.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f81635455a307d65440c20645923041c8815c50dfeac046b64b64fd7840b7c30"}, 1004 | {file = "tarina-0.5.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f20ce1ecc06362bbfd7ca30b1dc19c3a049f69b7dc6061df95a0bf93ce627055"}, 1005 | {file = "tarina-0.5.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:539d239b35af0052be9cc7eeb3675c84b02a4b98c3d8ec51dbe7db2e9e5da92a"}, 1006 | {file = "tarina-0.5.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:810d8e9da2d450cdd93ac9a11af1ff02b6c9a305aa477cbada0d397c5b0b64e3"}, 1007 | {file = "tarina-0.5.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:15a2ac416e972b0318c53f20c3478d77fb770dfa9ab25ab43aa8975886ecb160"}, 1008 | {file = "tarina-0.5.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:af522dc1ad30d7bcbbf9384f4f3aede3bebd7cecfc7127148ae0d12bd69b65d9"}, 1009 | {file = "tarina-0.5.4-cp311-cp311-win32.whl", hash = "sha256:781b1df4250e8f8f0b7902f3b7952135cbf43284e2cf490f57b738160d74b56f"}, 1010 | {file = "tarina-0.5.4-cp311-cp311-win_amd64.whl", hash = "sha256:9d32bab544e7c74e56958b0ebcd430a80194492ca6e98ed2f6217708fabc4027"}, 1011 | {file = "tarina-0.5.4-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:95b1504e4241a28fe75fa0995ebfed1dad140381ad72541e5b69428c84d16735"}, 1012 | {file = "tarina-0.5.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:9bbaefb3a627fcefc868d455cdc5d42297ba48369651821b04d8c8836307c39f"}, 1013 | {file = "tarina-0.5.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7cfec7c6a725bebb46b4e4a8ed64523c6deeae94dba1d3102b866c0247a32cdb"}, 1014 | {file = "tarina-0.5.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fccfd98ca925ec3597ca88f359f608f7762ad13a14dffcb17742b1e78e071306"}, 1015 | {file = "tarina-0.5.4-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bef0dfa5007f5138f48cbb9c2ef9564579def00b75caf47ebf53d32db7bf4044"}, 1016 | {file = "tarina-0.5.4-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8e6e2f0580d8dd956f92313ff51760df6893cd16fc009cdc2607130463d08bbb"}, 1017 | {file = "tarina-0.5.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:82f09edcf58b2e02622b173822c31c0ad5685f3e36667bd9de751f8c16b5305f"}, 1018 | {file = "tarina-0.5.4-cp312-cp312-win32.whl", hash = "sha256:b56956862d70f0383973d8413ed0fca9623e930acea0d7bf11a67c79714b869f"}, 1019 | {file = "tarina-0.5.4-cp312-cp312-win_amd64.whl", hash = "sha256:3ee6dafc31cceae46634314db0b547052790015abaec433ff39fef5bf5b3f0f6"}, 1020 | {file = "tarina-0.5.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:aa01c6032226f996286d60bd7b3bfb95565e9288e89b64208649b584386cfd9e"}, 1021 | {file = "tarina-0.5.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4c93781dfcf0c95c7e12c29fa788a32898aa090ba26bef9b1c970412b8cb7f59"}, 1022 | {file = "tarina-0.5.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b61ab72169c2289001a047694dbf6e0e73ed0b1c5405f65651b2500190928d43"}, 1023 | {file = "tarina-0.5.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e3b9ee386d0a8558c9270ae2f4fd33ff2394482705a2849646aad3df870cf754"}, 1024 | {file = "tarina-0.5.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17d6937a4911e5b7bf1f5a4bcc466e2cce3b1576eb6462459e568668f63a073f"}, 1025 | {file = "tarina-0.5.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:d4d332b30374b2d8fec2852d6af77f121c0fb026c48593cebdfbed6d49c2b260"}, 1026 | {file = "tarina-0.5.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:077b99101ee19699c8791f2630ed7c40c592e5d75ab309a042f5303d89f382c6"}, 1027 | {file = "tarina-0.5.4-cp39-cp39-win32.whl", hash = "sha256:a553a8790215ecd6f1af2616769012f16e28eaae0b805ddc780fe543ec2a6a4b"}, 1028 | {file = "tarina-0.5.4-cp39-cp39-win_amd64.whl", hash = "sha256:5c75b66d011cb7dd78149bf3911a78eaa96885dab4477fd4a96613349411f378"}, 1029 | {file = "tarina-0.5.4-py3-none-any.whl", hash = "sha256:1aa7d5c00e4bb6a35c5fd21bcbc536670df755922cd49bd9076a024fea191ade"}, 1030 | {file = "tarina-0.5.4.tar.gz", hash = "sha256:5d192a50d47b22ae8ca79e50ee760f171e563135eb04dc834a9b254211dbf32e"}, 1031 | ] 1032 | 1033 | [[package]] 1034 | name = "tomli" 1035 | version = "2.0.1" 1036 | requires_python = ">=3.7" 1037 | summary = "A lil' TOML parser" 1038 | groups = ["default"] 1039 | marker = "python_version < \"3.11\"" 1040 | files = [ 1041 | {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, 1042 | {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, 1043 | ] 1044 | 1045 | [[package]] 1046 | name = "typer" 1047 | version = "0.12.3" 1048 | requires_python = ">=3.7" 1049 | summary = "Typer, build great CLIs. Easy to code. Based on Python type hints." 1050 | groups = ["default"] 1051 | dependencies = [ 1052 | "click>=8.0.0", 1053 | "rich>=10.11.0", 1054 | "shellingham>=1.3.0", 1055 | "typing-extensions>=3.7.4.3", 1056 | ] 1057 | files = [ 1058 | {file = "typer-0.12.3-py3-none-any.whl", hash = "sha256:070d7ca53f785acbccba8e7d28b08dcd88f79f1fbda035ade0aecec71ca5c914"}, 1059 | {file = "typer-0.12.3.tar.gz", hash = "sha256:49e73131481d804288ef62598d97a1ceef3058905aa536a1134f90891ba35482"}, 1060 | ] 1061 | 1062 | [[package]] 1063 | name = "typing-extensions" 1064 | version = "4.12.2" 1065 | requires_python = ">=3.8" 1066 | summary = "Backported and Experimental Type Hints for Python 3.8+" 1067 | groups = ["default"] 1068 | files = [ 1069 | {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, 1070 | {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, 1071 | ] 1072 | 1073 | [[package]] 1074 | name = "ujson" 1075 | version = "5.10.0" 1076 | requires_python = ">=3.8" 1077 | summary = "Ultra fast JSON encoder and decoder for Python" 1078 | groups = ["default"] 1079 | files = [ 1080 | {file = "ujson-5.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2601aa9ecdbee1118a1c2065323bda35e2c5a2cf0797ef4522d485f9d3ef65bd"}, 1081 | {file = "ujson-5.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:348898dd702fc1c4f1051bc3aacbf894caa0927fe2c53e68679c073375f732cf"}, 1082 | {file = "ujson-5.10.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22cffecf73391e8abd65ef5f4e4dd523162a3399d5e84faa6aebbf9583df86d6"}, 1083 | {file = "ujson-5.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26b0e2d2366543c1bb4fbd457446f00b0187a2bddf93148ac2da07a53fe51569"}, 1084 | {file = "ujson-5.10.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:caf270c6dba1be7a41125cd1e4fc7ba384bf564650beef0df2dd21a00b7f5770"}, 1085 | {file = "ujson-5.10.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a245d59f2ffe750446292b0094244df163c3dc96b3ce152a2c837a44e7cda9d1"}, 1086 | {file = "ujson-5.10.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:94a87f6e151c5f483d7d54ceef83b45d3a9cca7a9cb453dbdbb3f5a6f64033f5"}, 1087 | {file = "ujson-5.10.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:29b443c4c0a113bcbb792c88bea67b675c7ca3ca80c3474784e08bba01c18d51"}, 1088 | {file = "ujson-5.10.0-cp310-cp310-win32.whl", hash = "sha256:c18610b9ccd2874950faf474692deee4223a994251bc0a083c114671b64e6518"}, 1089 | {file = "ujson-5.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:924f7318c31874d6bb44d9ee1900167ca32aa9b69389b98ecbde34c1698a250f"}, 1090 | {file = "ujson-5.10.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a5b366812c90e69d0f379a53648be10a5db38f9d4ad212b60af00bd4048d0f00"}, 1091 | {file = "ujson-5.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:502bf475781e8167f0f9d0e41cd32879d120a524b22358e7f205294224c71126"}, 1092 | {file = "ujson-5.10.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b91b5d0d9d283e085e821651184a647699430705b15bf274c7896f23fe9c9d8"}, 1093 | {file = "ujson-5.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:129e39af3a6d85b9c26d5577169c21d53821d8cf68e079060602e861c6e5da1b"}, 1094 | {file = "ujson-5.10.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f77b74475c462cb8b88680471193064d3e715c7c6074b1c8c412cb526466efe9"}, 1095 | {file = "ujson-5.10.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7ec0ca8c415e81aa4123501fee7f761abf4b7f386aad348501a26940beb1860f"}, 1096 | {file = "ujson-5.10.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ab13a2a9e0b2865a6c6db9271f4b46af1c7476bfd51af1f64585e919b7c07fd4"}, 1097 | {file = "ujson-5.10.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:57aaf98b92d72fc70886b5a0e1a1ca52c2320377360341715dd3933a18e827b1"}, 1098 | {file = "ujson-5.10.0-cp311-cp311-win32.whl", hash = "sha256:2987713a490ceb27edff77fb184ed09acdc565db700ee852823c3dc3cffe455f"}, 1099 | {file = "ujson-5.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:f00ea7e00447918ee0eff2422c4add4c5752b1b60e88fcb3c067d4a21049a720"}, 1100 | {file = "ujson-5.10.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:98ba15d8cbc481ce55695beee9f063189dce91a4b08bc1d03e7f0152cd4bbdd5"}, 1101 | {file = "ujson-5.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a9d2edbf1556e4f56e50fab7d8ff993dbad7f54bac68eacdd27a8f55f433578e"}, 1102 | {file = "ujson-5.10.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6627029ae4f52d0e1a2451768c2c37c0c814ffc04f796eb36244cf16b8e57043"}, 1103 | {file = "ujson-5.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8ccb77b3e40b151e20519c6ae6d89bfe3f4c14e8e210d910287f778368bb3d1"}, 1104 | {file = "ujson-5.10.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3caf9cd64abfeb11a3b661329085c5e167abbe15256b3b68cb5d914ba7396f3"}, 1105 | {file = "ujson-5.10.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6e32abdce572e3a8c3d02c886c704a38a1b015a1fb858004e03d20ca7cecbb21"}, 1106 | {file = "ujson-5.10.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a65b6af4d903103ee7b6f4f5b85f1bfd0c90ba4eeac6421aae436c9988aa64a2"}, 1107 | {file = "ujson-5.10.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:604a046d966457b6cdcacc5aa2ec5314f0e8c42bae52842c1e6fa02ea4bda42e"}, 1108 | {file = "ujson-5.10.0-cp312-cp312-win32.whl", hash = "sha256:6dea1c8b4fc921bf78a8ff00bbd2bfe166345f5536c510671bccececb187c80e"}, 1109 | {file = "ujson-5.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:38665e7d8290188b1e0d57d584eb8110951a9591363316dd41cf8686ab1d0abc"}, 1110 | {file = "ujson-5.10.0-cp313-cp313-macosx_10_9_x86_64.whl", hash = "sha256:618efd84dc1acbd6bff8eaa736bb6c074bfa8b8a98f55b61c38d4ca2c1f7f287"}, 1111 | {file = "ujson-5.10.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:38d5d36b4aedfe81dfe251f76c0467399d575d1395a1755de391e58985ab1c2e"}, 1112 | {file = "ujson-5.10.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:67079b1f9fb29ed9a2914acf4ef6c02844b3153913eb735d4bf287ee1db6e557"}, 1113 | {file = "ujson-5.10.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7d0e0ceeb8fe2468c70ec0c37b439dd554e2aa539a8a56365fd761edb418988"}, 1114 | {file = "ujson-5.10.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:59e02cd37bc7c44d587a0ba45347cc815fb7a5fe48de16bf05caa5f7d0d2e816"}, 1115 | {file = "ujson-5.10.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:2a890b706b64e0065f02577bf6d8ca3b66c11a5e81fb75d757233a38c07a1f20"}, 1116 | {file = "ujson-5.10.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:621e34b4632c740ecb491efc7f1fcb4f74b48ddb55e65221995e74e2d00bbff0"}, 1117 | {file = "ujson-5.10.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b9500e61fce0cfc86168b248104e954fead61f9be213087153d272e817ec7b4f"}, 1118 | {file = "ujson-5.10.0-cp313-cp313-win32.whl", hash = "sha256:4c4fc16f11ac1612f05b6f5781b384716719547e142cfd67b65d035bd85af165"}, 1119 | {file = "ujson-5.10.0-cp313-cp313-win_amd64.whl", hash = "sha256:4573fd1695932d4f619928fd09d5d03d917274381649ade4328091ceca175539"}, 1120 | {file = "ujson-5.10.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:dfef2814c6b3291c3c5f10065f745a1307d86019dbd7ea50e83504950136ed5b"}, 1121 | {file = "ujson-5.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4734ee0745d5928d0ba3a213647f1c4a74a2a28edc6d27b2d6d5bd9fa4319e27"}, 1122 | {file = "ujson-5.10.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d47ebb01bd865fdea43da56254a3930a413f0c5590372a1241514abae8aa7c76"}, 1123 | {file = "ujson-5.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dee5e97c2496874acbf1d3e37b521dd1f307349ed955e62d1d2f05382bc36dd5"}, 1124 | {file = "ujson-5.10.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7490655a2272a2d0b072ef16b0b58ee462f4973a8f6bbe64917ce5e0a256f9c0"}, 1125 | {file = "ujson-5.10.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:ba17799fcddaddf5c1f75a4ba3fd6441f6a4f1e9173f8a786b42450851bd74f1"}, 1126 | {file = "ujson-5.10.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:2aff2985cef314f21d0fecc56027505804bc78802c0121343874741650a4d3d1"}, 1127 | {file = "ujson-5.10.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:ad88ac75c432674d05b61184178635d44901eb749786c8eb08c102330e6e8996"}, 1128 | {file = "ujson-5.10.0-cp39-cp39-win32.whl", hash = "sha256:2544912a71da4ff8c4f7ab5606f947d7299971bdd25a45e008e467ca638d13c9"}, 1129 | {file = "ujson-5.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:3ff201d62b1b177a46f113bb43ad300b424b7847f9c5d38b1b4ad8f75d4a282a"}, 1130 | {file = "ujson-5.10.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5b6fee72fa77dc172a28f21693f64d93166534c263adb3f96c413ccc85ef6e64"}, 1131 | {file = "ujson-5.10.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:61d0af13a9af01d9f26d2331ce49bb5ac1fb9c814964018ac8df605b5422dcb3"}, 1132 | {file = "ujson-5.10.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ecb24f0bdd899d368b715c9e6664166cf694d1e57be73f17759573a6986dd95a"}, 1133 | {file = "ujson-5.10.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fbd8fd427f57a03cff3ad6574b5e299131585d9727c8c366da4624a9069ed746"}, 1134 | {file = "ujson-5.10.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:beeaf1c48e32f07d8820c705ff8e645f8afa690cca1544adba4ebfa067efdc88"}, 1135 | {file = "ujson-5.10.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:baed37ea46d756aca2955e99525cc02d9181de67f25515c468856c38d52b5f3b"}, 1136 | {file = "ujson-5.10.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:7663960f08cd5a2bb152f5ee3992e1af7690a64c0e26d31ba7b3ff5b2ee66337"}, 1137 | {file = "ujson-5.10.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:d8640fb4072d36b08e95a3a380ba65779d356b2fee8696afeb7794cf0902d0a1"}, 1138 | {file = "ujson-5.10.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78778a3aa7aafb11e7ddca4e29f46bc5139131037ad628cc10936764282d6753"}, 1139 | {file = "ujson-5.10.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b0111b27f2d5c820e7f2dbad7d48e3338c824e7ac4d2a12da3dc6061cc39c8e6"}, 1140 | {file = "ujson-5.10.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:c66962ca7565605b355a9ed478292da628b8f18c0f2793021ca4425abf8b01e5"}, 1141 | {file = "ujson-5.10.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ba43cc34cce49cf2d4bc76401a754a81202d8aa926d0e2b79f0ee258cb15d3a4"}, 1142 | {file = "ujson-5.10.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:ac56eb983edce27e7f51d05bc8dd820586c6e6be1c5216a6809b0c668bb312b8"}, 1143 | {file = "ujson-5.10.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f44bd4b23a0e723bf8b10628288c2c7c335161d6840013d4d5de20e48551773b"}, 1144 | {file = "ujson-5.10.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c10f4654e5326ec14a46bcdeb2b685d4ada6911050aa8baaf3501e57024b804"}, 1145 | {file = "ujson-5.10.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0de4971a89a762398006e844ae394bd46991f7c385d7a6a3b93ba229e6dac17e"}, 1146 | {file = "ujson-5.10.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:e1402f0564a97d2a52310ae10a64d25bcef94f8dd643fcf5d310219d915484f7"}, 1147 | {file = "ujson-5.10.0.tar.gz", hash = "sha256:b3cd8f3c5d8c7738257f1018880444f7b7d9b66232c64649f562d7ba86ad4bc1"}, 1148 | ] 1149 | 1150 | [[package]] 1151 | name = "uvicorn" 1152 | version = "0.30.1" 1153 | requires_python = ">=3.8" 1154 | summary = "The lightning-fast ASGI server." 1155 | groups = ["default"] 1156 | dependencies = [ 1157 | "click>=7.0", 1158 | "h11>=0.8", 1159 | "typing-extensions>=4.0; python_version < \"3.11\"", 1160 | ] 1161 | files = [ 1162 | {file = "uvicorn-0.30.1-py3-none-any.whl", hash = "sha256:cd17daa7f3b9d7a24de3617820e634d0933b69eed8e33a516071174427238c81"}, 1163 | {file = "uvicorn-0.30.1.tar.gz", hash = "sha256:d46cd8e0fd80240baffbcd9ec1012a712938754afcf81bce56c024c1656aece8"}, 1164 | ] 1165 | 1166 | [[package]] 1167 | name = "uvicorn" 1168 | version = "0.30.1" 1169 | extras = ["standard"] 1170 | requires_python = ">=3.8" 1171 | summary = "The lightning-fast ASGI server." 1172 | groups = ["default"] 1173 | dependencies = [ 1174 | "colorama>=0.4; sys_platform == \"win32\"", 1175 | "httptools>=0.5.0", 1176 | "python-dotenv>=0.13", 1177 | "pyyaml>=5.1", 1178 | "uvicorn==0.30.1", 1179 | "uvloop!=0.15.0,!=0.15.1,>=0.14.0; (sys_platform != \"cygwin\" and sys_platform != \"win32\") and platform_python_implementation != \"PyPy\"", 1180 | "watchfiles>=0.13", 1181 | "websockets>=10.4", 1182 | ] 1183 | files = [ 1184 | {file = "uvicorn-0.30.1-py3-none-any.whl", hash = "sha256:cd17daa7f3b9d7a24de3617820e634d0933b69eed8e33a516071174427238c81"}, 1185 | {file = "uvicorn-0.30.1.tar.gz", hash = "sha256:d46cd8e0fd80240baffbcd9ec1012a712938754afcf81bce56c024c1656aece8"}, 1186 | ] 1187 | 1188 | [[package]] 1189 | name = "uvloop" 1190 | version = "0.19.0" 1191 | requires_python = ">=3.8.0" 1192 | summary = "Fast implementation of asyncio event loop on top of libuv" 1193 | groups = ["default"] 1194 | marker = "(sys_platform != \"cygwin\" and sys_platform != \"win32\") and platform_python_implementation != \"PyPy\"" 1195 | files = [ 1196 | {file = "uvloop-0.19.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:de4313d7f575474c8f5a12e163f6d89c0a878bc49219641d49e6f1444369a90e"}, 1197 | {file = "uvloop-0.19.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5588bd21cf1fcf06bded085f37e43ce0e00424197e7c10e77afd4bbefffef428"}, 1198 | {file = "uvloop-0.19.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b1fd71c3843327f3bbc3237bedcdb6504fd50368ab3e04d0410e52ec293f5b8"}, 1199 | {file = "uvloop-0.19.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a05128d315e2912791de6088c34136bfcdd0c7cbc1cf85fd6fd1bb321b7c849"}, 1200 | {file = "uvloop-0.19.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:cd81bdc2b8219cb4b2556eea39d2e36bfa375a2dd021404f90a62e44efaaf957"}, 1201 | {file = "uvloop-0.19.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:5f17766fb6da94135526273080f3455a112f82570b2ee5daa64d682387fe0dcd"}, 1202 | {file = "uvloop-0.19.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4ce6b0af8f2729a02a5d1575feacb2a94fc7b2e983868b009d51c9a9d2149bef"}, 1203 | {file = "uvloop-0.19.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:31e672bb38b45abc4f26e273be83b72a0d28d074d5b370fc4dcf4c4eb15417d2"}, 1204 | {file = "uvloop-0.19.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:570fc0ed613883d8d30ee40397b79207eedd2624891692471808a95069a007c1"}, 1205 | {file = "uvloop-0.19.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5138821e40b0c3e6c9478643b4660bd44372ae1e16a322b8fc07478f92684e24"}, 1206 | {file = "uvloop-0.19.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:91ab01c6cd00e39cde50173ba4ec68a1e578fee9279ba64f5221810a9e786533"}, 1207 | {file = "uvloop-0.19.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:47bf3e9312f63684efe283f7342afb414eea4d3011542155c7e625cd799c3b12"}, 1208 | {file = "uvloop-0.19.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:da8435a3bd498419ee8c13c34b89b5005130a476bda1d6ca8cfdde3de35cd650"}, 1209 | {file = "uvloop-0.19.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:02506dc23a5d90e04d4f65c7791e65cf44bd91b37f24cfc3ef6cf2aff05dc7ec"}, 1210 | {file = "uvloop-0.19.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2693049be9d36fef81741fddb3f441673ba12a34a704e7b4361efb75cf30befc"}, 1211 | {file = "uvloop-0.19.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7010271303961c6f0fe37731004335401eb9075a12680738731e9c92ddd96ad6"}, 1212 | {file = "uvloop-0.19.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:5daa304d2161d2918fa9a17d5635099a2f78ae5b5960e742b2fcfbb7aefaa593"}, 1213 | {file = "uvloop-0.19.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:7207272c9520203fea9b93843bb775d03e1cf88a80a936ce760f60bb5add92f3"}, 1214 | {file = "uvloop-0.19.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:13dfdf492af0aa0a0edf66807d2b465607d11c4fa48f4a1fd41cbea5b18e8e8b"}, 1215 | {file = "uvloop-0.19.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6e3d4e85ac060e2342ff85e90d0c04157acb210b9ce508e784a944f852a40e67"}, 1216 | {file = "uvloop-0.19.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8ca4956c9ab567d87d59d49fa3704cf29e37109ad348f2d5223c9bf761a332e7"}, 1217 | {file = "uvloop-0.19.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f467a5fd23b4fc43ed86342641f3936a68ded707f4627622fa3f82a120e18256"}, 1218 | {file = "uvloop-0.19.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:492e2c32c2af3f971473bc22f086513cedfc66a130756145a931a90c3958cb17"}, 1219 | {file = "uvloop-0.19.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:2df95fca285a9f5bfe730e51945ffe2fa71ccbfdde3b0da5772b4ee4f2e770d5"}, 1220 | {file = "uvloop-0.19.0.tar.gz", hash = "sha256:0246f4fd1bf2bf702e06b0d45ee91677ee5c31242f39aab4ea6fe0c51aedd0fd"}, 1221 | ] 1222 | 1223 | [[package]] 1224 | name = "watchfiles" 1225 | version = "0.22.0" 1226 | requires_python = ">=3.8" 1227 | summary = "Simple, modern and high performance file watching and code reload in python." 1228 | groups = ["default"] 1229 | dependencies = [ 1230 | "anyio>=3.0.0", 1231 | ] 1232 | files = [ 1233 | {file = "watchfiles-0.22.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:da1e0a8caebf17976e2ffd00fa15f258e14749db5e014660f53114b676e68538"}, 1234 | {file = "watchfiles-0.22.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:61af9efa0733dc4ca462347becb82e8ef4945aba5135b1638bfc20fad64d4f0e"}, 1235 | {file = "watchfiles-0.22.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d9188979a58a096b6f8090e816ccc3f255f137a009dd4bbec628e27696d67c1"}, 1236 | {file = "watchfiles-0.22.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2bdadf6b90c099ca079d468f976fd50062905d61fae183f769637cb0f68ba59a"}, 1237 | {file = "watchfiles-0.22.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:067dea90c43bf837d41e72e546196e674f68c23702d3ef80e4e816937b0a3ffd"}, 1238 | {file = "watchfiles-0.22.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bbf8a20266136507abf88b0df2328e6a9a7c7309e8daff124dda3803306a9fdb"}, 1239 | {file = "watchfiles-0.22.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1235c11510ea557fe21be5d0e354bae2c655a8ee6519c94617fe63e05bca4171"}, 1240 | {file = "watchfiles-0.22.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c2444dc7cb9d8cc5ab88ebe792a8d75709d96eeef47f4c8fccb6df7c7bc5be71"}, 1241 | {file = "watchfiles-0.22.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:c5af2347d17ab0bd59366db8752d9e037982e259cacb2ba06f2c41c08af02c39"}, 1242 | {file = "watchfiles-0.22.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:9624a68b96c878c10437199d9a8b7d7e542feddda8d5ecff58fdc8e67b460848"}, 1243 | {file = "watchfiles-0.22.0-cp310-none-win32.whl", hash = "sha256:4b9f2a128a32a2c273d63eb1fdbf49ad64852fc38d15b34eaa3f7ca2f0d2b797"}, 1244 | {file = "watchfiles-0.22.0-cp310-none-win_amd64.whl", hash = "sha256:2627a91e8110b8de2406d8b2474427c86f5a62bf7d9ab3654f541f319ef22bcb"}, 1245 | {file = "watchfiles-0.22.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:8c39987a1397a877217be1ac0fb1d8b9f662c6077b90ff3de2c05f235e6a8f96"}, 1246 | {file = "watchfiles-0.22.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a927b3034d0672f62fb2ef7ea3c9fc76d063c4b15ea852d1db2dc75fe2c09696"}, 1247 | {file = "watchfiles-0.22.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:052d668a167e9fc345c24203b104c313c86654dd6c0feb4b8a6dfc2462239249"}, 1248 | {file = "watchfiles-0.22.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5e45fb0d70dda1623a7045bd00c9e036e6f1f6a85e4ef2c8ae602b1dfadf7550"}, 1249 | {file = "watchfiles-0.22.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c49b76a78c156979759d759339fb62eb0549515acfe4fd18bb151cc07366629c"}, 1250 | {file = "watchfiles-0.22.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4a65474fd2b4c63e2c18ac67a0c6c66b82f4e73e2e4d940f837ed3d2fd9d4da"}, 1251 | {file = "watchfiles-0.22.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1cc0cba54f47c660d9fa3218158b8963c517ed23bd9f45fe463f08262a4adae1"}, 1252 | {file = "watchfiles-0.22.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94ebe84a035993bb7668f58a0ebf998174fb723a39e4ef9fce95baabb42b787f"}, 1253 | {file = "watchfiles-0.22.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e0f0a874231e2839abbf473256efffe577d6ee2e3bfa5b540479e892e47c172d"}, 1254 | {file = "watchfiles-0.22.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:213792c2cd3150b903e6e7884d40660e0bcec4465e00563a5fc03f30ea9c166c"}, 1255 | {file = "watchfiles-0.22.0-cp311-none-win32.whl", hash = "sha256:b44b70850f0073b5fcc0b31ede8b4e736860d70e2dbf55701e05d3227a154a67"}, 1256 | {file = "watchfiles-0.22.0-cp311-none-win_amd64.whl", hash = "sha256:00f39592cdd124b4ec5ed0b1edfae091567c72c7da1487ae645426d1b0ffcad1"}, 1257 | {file = "watchfiles-0.22.0-cp311-none-win_arm64.whl", hash = "sha256:3218a6f908f6a276941422b035b511b6d0d8328edd89a53ae8c65be139073f84"}, 1258 | {file = "watchfiles-0.22.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:c7b978c384e29d6c7372209cbf421d82286a807bbcdeb315427687f8371c340a"}, 1259 | {file = "watchfiles-0.22.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bd4c06100bce70a20c4b81e599e5886cf504c9532951df65ad1133e508bf20be"}, 1260 | {file = "watchfiles-0.22.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:425440e55cd735386ec7925f64d5dde392e69979d4c8459f6bb4e920210407f2"}, 1261 | {file = "watchfiles-0.22.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:68fe0c4d22332d7ce53ad094622b27e67440dacefbaedd29e0794d26e247280c"}, 1262 | {file = "watchfiles-0.22.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a8a31bfd98f846c3c284ba694c6365620b637debdd36e46e1859c897123aa232"}, 1263 | {file = "watchfiles-0.22.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dc2e8fe41f3cac0660197d95216c42910c2b7e9c70d48e6d84e22f577d106fc1"}, 1264 | {file = "watchfiles-0.22.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55b7cc10261c2786c41d9207193a85c1db1b725cf87936df40972aab466179b6"}, 1265 | {file = "watchfiles-0.22.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28585744c931576e535860eaf3f2c0ec7deb68e3b9c5a85ca566d69d36d8dd27"}, 1266 | {file = "watchfiles-0.22.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:00095dd368f73f8f1c3a7982a9801190cc88a2f3582dd395b289294f8975172b"}, 1267 | {file = "watchfiles-0.22.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:52fc9b0dbf54d43301a19b236b4a4614e610605f95e8c3f0f65c3a456ffd7d35"}, 1268 | {file = "watchfiles-0.22.0-cp312-none-win32.whl", hash = "sha256:581f0a051ba7bafd03e17127735d92f4d286af941dacf94bcf823b101366249e"}, 1269 | {file = "watchfiles-0.22.0-cp312-none-win_amd64.whl", hash = "sha256:aec83c3ba24c723eac14225194b862af176d52292d271c98820199110e31141e"}, 1270 | {file = "watchfiles-0.22.0-cp312-none-win_arm64.whl", hash = "sha256:c668228833c5619f6618699a2c12be057711b0ea6396aeaece4ded94184304ea"}, 1271 | {file = "watchfiles-0.22.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:3973145235a38f73c61474d56ad6199124e7488822f3a4fc97c72009751ae3b0"}, 1272 | {file = "watchfiles-0.22.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:280a4afbc607cdfc9571b9904b03a478fc9f08bbeec382d648181c695648202f"}, 1273 | {file = "watchfiles-0.22.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a0d883351a34c01bd53cfa75cd0292e3f7e268bacf2f9e33af4ecede7e21d1d"}, 1274 | {file = "watchfiles-0.22.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9165bcab15f2b6d90eedc5c20a7f8a03156b3773e5fb06a790b54ccecdb73385"}, 1275 | {file = "watchfiles-0.22.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc1b9b56f051209be458b87edb6856a449ad3f803315d87b2da4c93b43a6fe72"}, 1276 | {file = "watchfiles-0.22.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8dc1fc25a1dedf2dd952909c8e5cb210791e5f2d9bc5e0e8ebc28dd42fed7562"}, 1277 | {file = "watchfiles-0.22.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dc92d2d2706d2b862ce0568b24987eba51e17e14b79a1abcd2edc39e48e743c8"}, 1278 | {file = "watchfiles-0.22.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97b94e14b88409c58cdf4a8eaf0e67dfd3ece7e9ce7140ea6ff48b0407a593ec"}, 1279 | {file = "watchfiles-0.22.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:96eec15e5ea7c0b6eb5bfffe990fc7c6bd833acf7e26704eb18387fb2f5fd087"}, 1280 | {file = "watchfiles-0.22.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:28324d6b28bcb8d7c1041648d7b63be07a16db5510bea923fc80b91a2a6cbed6"}, 1281 | {file = "watchfiles-0.22.0-cp39-none-win32.whl", hash = "sha256:8c3e3675e6e39dc59b8fe5c914a19d30029e36e9f99468dddffd432d8a7b1c93"}, 1282 | {file = "watchfiles-0.22.0-cp39-none-win_amd64.whl", hash = "sha256:25c817ff2a86bc3de3ed2df1703e3d24ce03479b27bb4527c57e722f8554d971"}, 1283 | {file = "watchfiles-0.22.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b810a2c7878cbdecca12feae2c2ae8af59bea016a78bc353c184fa1e09f76b68"}, 1284 | {file = "watchfiles-0.22.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:f7e1f9c5d1160d03b93fc4b68a0aeb82fe25563e12fbcdc8507f8434ab6f823c"}, 1285 | {file = "watchfiles-0.22.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:030bc4e68d14bcad2294ff68c1ed87215fbd9a10d9dea74e7cfe8a17869785ab"}, 1286 | {file = "watchfiles-0.22.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ace7d060432acde5532e26863e897ee684780337afb775107c0a90ae8dbccfd2"}, 1287 | {file = "watchfiles-0.22.0-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5834e1f8b71476a26df97d121c0c0ed3549d869124ed2433e02491553cb468c2"}, 1288 | {file = "watchfiles-0.22.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:0bc3b2f93a140df6806c8467c7f51ed5e55a931b031b5c2d7ff6132292e803d6"}, 1289 | {file = "watchfiles-0.22.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8fdebb655bb1ba0122402352b0a4254812717a017d2dc49372a1d47e24073795"}, 1290 | {file = "watchfiles-0.22.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c8e0aa0e8cc2a43561e0184c0513e291ca891db13a269d8d47cb9841ced7c71"}, 1291 | {file = "watchfiles-0.22.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:2f350cbaa4bb812314af5dab0eb8d538481e2e2279472890864547f3fe2281ed"}, 1292 | {file = "watchfiles-0.22.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:7a74436c415843af2a769b36bf043b6ccbc0f8d784814ba3d42fc961cdb0a9dc"}, 1293 | {file = "watchfiles-0.22.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:00ad0bcd399503a84cc688590cdffbe7a991691314dde5b57b3ed50a41319a31"}, 1294 | {file = "watchfiles-0.22.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72a44e9481afc7a5ee3291b09c419abab93b7e9c306c9ef9108cb76728ca58d2"}, 1295 | {file = "watchfiles-0.22.0.tar.gz", hash = "sha256:988e981aaab4f3955209e7e28c7794acdb690be1efa7f16f8ea5aba7ffdadacb"}, 1296 | ] 1297 | 1298 | [[package]] 1299 | name = "websockets" 1300 | version = "12.0" 1301 | requires_python = ">=3.8" 1302 | summary = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" 1303 | groups = ["default"] 1304 | files = [ 1305 | {file = "websockets-12.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d554236b2a2006e0ce16315c16eaa0d628dab009c33b63ea03f41c6107958374"}, 1306 | {file = "websockets-12.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2d225bb6886591b1746b17c0573e29804619c8f755b5598d875bb4235ea639be"}, 1307 | {file = "websockets-12.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:eb809e816916a3b210bed3c82fb88eaf16e8afcf9c115ebb2bacede1797d2547"}, 1308 | {file = "websockets-12.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c588f6abc13f78a67044c6b1273a99e1cf31038ad51815b3b016ce699f0d75c2"}, 1309 | {file = "websockets-12.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5aa9348186d79a5f232115ed3fa9020eab66d6c3437d72f9d2c8ac0c6858c558"}, 1310 | {file = "websockets-12.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6350b14a40c95ddd53e775dbdbbbc59b124a5c8ecd6fbb09c2e52029f7a9f480"}, 1311 | {file = "websockets-12.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:70ec754cc2a769bcd218ed8d7209055667b30860ffecb8633a834dde27d6307c"}, 1312 | {file = "websockets-12.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6e96f5ed1b83a8ddb07909b45bd94833b0710f738115751cdaa9da1fb0cb66e8"}, 1313 | {file = "websockets-12.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4d87be612cbef86f994178d5186add3d94e9f31cc3cb499a0482b866ec477603"}, 1314 | {file = "websockets-12.0-cp310-cp310-win32.whl", hash = "sha256:befe90632d66caaf72e8b2ed4d7f02b348913813c8b0a32fae1cc5fe3730902f"}, 1315 | {file = "websockets-12.0-cp310-cp310-win_amd64.whl", hash = "sha256:363f57ca8bc8576195d0540c648aa58ac18cf85b76ad5202b9f976918f4219cf"}, 1316 | {file = "websockets-12.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5d873c7de42dea355d73f170be0f23788cf3fa9f7bed718fd2830eefedce01b4"}, 1317 | {file = "websockets-12.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3f61726cae9f65b872502ff3c1496abc93ffbe31b278455c418492016e2afc8f"}, 1318 | {file = "websockets-12.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ed2fcf7a07334c77fc8a230755c2209223a7cc44fc27597729b8ef5425aa61a3"}, 1319 | {file = "websockets-12.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e332c210b14b57904869ca9f9bf4ca32f5427a03eeb625da9b616c85a3a506c"}, 1320 | {file = "websockets-12.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5693ef74233122f8ebab026817b1b37fe25c411ecfca084b29bc7d6efc548f45"}, 1321 | {file = "websockets-12.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e9e7db18b4539a29cc5ad8c8b252738a30e2b13f033c2d6e9d0549b45841c04"}, 1322 | {file = "websockets-12.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6e2df67b8014767d0f785baa98393725739287684b9f8d8a1001eb2839031447"}, 1323 | {file = "websockets-12.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:bea88d71630c5900690fcb03161ab18f8f244805c59e2e0dc4ffadae0a7ee0ca"}, 1324 | {file = "websockets-12.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:dff6cdf35e31d1315790149fee351f9e52978130cef6c87c4b6c9b3baf78bc53"}, 1325 | {file = "websockets-12.0-cp311-cp311-win32.whl", hash = "sha256:3e3aa8c468af01d70332a382350ee95f6986db479ce7af14d5e81ec52aa2b402"}, 1326 | {file = "websockets-12.0-cp311-cp311-win_amd64.whl", hash = "sha256:25eb766c8ad27da0f79420b2af4b85d29914ba0edf69f547cc4f06ca6f1d403b"}, 1327 | {file = "websockets-12.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0e6e2711d5a8e6e482cacb927a49a3d432345dfe7dea8ace7b5790df5932e4df"}, 1328 | {file = "websockets-12.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:dbcf72a37f0b3316e993e13ecf32f10c0e1259c28ffd0a85cee26e8549595fbc"}, 1329 | {file = "websockets-12.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:12743ab88ab2af1d17dd4acb4645677cb7063ef4db93abffbf164218a5d54c6b"}, 1330 | {file = "websockets-12.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b645f491f3c48d3f8a00d1fce07445fab7347fec54a3e65f0725d730d5b99cb"}, 1331 | {file = "websockets-12.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9893d1aa45a7f8b3bc4510f6ccf8db8c3b62120917af15e3de247f0780294b92"}, 1332 | {file = "websockets-12.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f38a7b376117ef7aff996e737583172bdf535932c9ca021746573bce40165ed"}, 1333 | {file = "websockets-12.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:f764ba54e33daf20e167915edc443b6f88956f37fb606449b4a5b10ba42235a5"}, 1334 | {file = "websockets-12.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:1e4b3f8ea6a9cfa8be8484c9221ec0257508e3a1ec43c36acdefb2a9c3b00aa2"}, 1335 | {file = "websockets-12.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9fdf06fd06c32205a07e47328ab49c40fc1407cdec801d698a7c41167ea45113"}, 1336 | {file = "websockets-12.0-cp312-cp312-win32.whl", hash = "sha256:baa386875b70cbd81798fa9f71be689c1bf484f65fd6fb08d051a0ee4e79924d"}, 1337 | {file = "websockets-12.0-cp312-cp312-win_amd64.whl", hash = "sha256:ae0a5da8f35a5be197f328d4727dbcfafa53d1824fac3d96cdd3a642fe09394f"}, 1338 | {file = "websockets-12.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:ab3d732ad50a4fbd04a4490ef08acd0517b6ae6b77eb967251f4c263011a990d"}, 1339 | {file = "websockets-12.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a1d9697f3337a89691e3bd8dc56dea45a6f6d975f92e7d5f773bc715c15dde28"}, 1340 | {file = "websockets-12.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1df2fbd2c8a98d38a66f5238484405b8d1d16f929bb7a33ed73e4801222a6f53"}, 1341 | {file = "websockets-12.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23509452b3bc38e3a057382c2e941d5ac2e01e251acce7adc74011d7d8de434c"}, 1342 | {file = "websockets-12.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e5fc14ec6ea568200ea4ef46545073da81900a2b67b3e666f04adf53ad452ec"}, 1343 | {file = "websockets-12.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46e71dbbd12850224243f5d2aeec90f0aaa0f2dde5aeeb8fc8df21e04d99eff9"}, 1344 | {file = "websockets-12.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b81f90dcc6c85a9b7f29873beb56c94c85d6f0dac2ea8b60d995bd18bf3e2aae"}, 1345 | {file = "websockets-12.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:a02413bc474feda2849c59ed2dfb2cddb4cd3d2f03a2fedec51d6e959d9b608b"}, 1346 | {file = "websockets-12.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:bbe6013f9f791944ed31ca08b077e26249309639313fff132bfbf3ba105673b9"}, 1347 | {file = "websockets-12.0-cp39-cp39-win32.whl", hash = "sha256:cbe83a6bbdf207ff0541de01e11904827540aa069293696dd528a6640bd6a5f6"}, 1348 | {file = "websockets-12.0-cp39-cp39-win_amd64.whl", hash = "sha256:fc4e7fa5414512b481a2483775a8e8be7803a35b30ca805afa4998a84f9fd9e8"}, 1349 | {file = "websockets-12.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:248d8e2446e13c1d4326e0a6a4e9629cb13a11195051a73acf414812700badbd"}, 1350 | {file = "websockets-12.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f44069528d45a933997a6fef143030d8ca8042f0dfaad753e2906398290e2870"}, 1351 | {file = "websockets-12.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c4e37d36f0d19f0a4413d3e18c0d03d0c268ada2061868c1e6f5ab1a6d575077"}, 1352 | {file = "websockets-12.0-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d829f975fc2e527a3ef2f9c8f25e553eb7bc779c6665e8e1d52aa22800bb38b"}, 1353 | {file = "websockets-12.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:2c71bd45a777433dd9113847af751aae36e448bc6b8c361a566cb043eda6ec30"}, 1354 | {file = "websockets-12.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0bee75f400895aef54157b36ed6d3b308fcab62e5260703add87f44cee9c82a6"}, 1355 | {file = "websockets-12.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:423fc1ed29f7512fceb727e2d2aecb952c46aa34895e9ed96071821309951123"}, 1356 | {file = "websockets-12.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:27a5e9964ef509016759f2ef3f2c1e13f403725a5e6a1775555994966a66e931"}, 1357 | {file = "websockets-12.0-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3181df4583c4d3994d31fb235dc681d2aaad744fbdbf94c4802485ececdecf2"}, 1358 | {file = "websockets-12.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:b067cb952ce8bf40115f6c19f478dc71c5e719b7fbaa511359795dfd9d1a6468"}, 1359 | {file = "websockets-12.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:00700340c6c7ab788f176d118775202aadea7602c5cc6be6ae127761c16d6b0b"}, 1360 | {file = "websockets-12.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e469d01137942849cff40517c97a30a93ae79917752b34029f0ec72df6b46399"}, 1361 | {file = "websockets-12.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffefa1374cd508d633646d51a8e9277763a9b78ae71324183693959cf94635a7"}, 1362 | {file = "websockets-12.0-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba0cab91b3956dfa9f512147860783a1829a8d905ee218a9837c18f683239611"}, 1363 | {file = "websockets-12.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2cb388a5bfb56df4d9a406783b7f9dbefb888c09b71629351cc6b036e9259370"}, 1364 | {file = "websockets-12.0-py3-none-any.whl", hash = "sha256:dc284bbc8d7c78a6c69e0c7325ab46ee5e40bb4d50e494d8131a07ef47500e9e"}, 1365 | {file = "websockets-12.0.tar.gz", hash = "sha256:81df9cbcbb6c260de1e007e58c011bfebe2dafc8435107b0537f393dd38c8b1b"}, 1366 | ] 1367 | 1368 | [[package]] 1369 | name = "win32-setctime" 1370 | version = "1.1.0" 1371 | requires_python = ">=3.5" 1372 | summary = "A small Python utility to set file creation time on Windows" 1373 | groups = ["default"] 1374 | marker = "sys_platform == \"win32\"" 1375 | files = [ 1376 | {file = "win32_setctime-1.1.0-py3-none-any.whl", hash = "sha256:231db239e959c2fe7eb1d7dc129f11172354f98361c4fa2d6d2d7e278baa8aad"}, 1377 | {file = "win32_setctime-1.1.0.tar.gz", hash = "sha256:15cf5750465118d6929ae4de4eb46e8edae9a5634350c01ba582df868e932cb2"}, 1378 | ] 1379 | 1380 | [[package]] 1381 | name = "yarl" 1382 | version = "1.9.4" 1383 | requires_python = ">=3.7" 1384 | summary = "Yet another URL library" 1385 | groups = ["default"] 1386 | dependencies = [ 1387 | "idna>=2.0", 1388 | "multidict>=4.0", 1389 | ] 1390 | files = [ 1391 | {file = "yarl-1.9.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a8c1df72eb746f4136fe9a2e72b0c9dc1da1cbd23b5372f94b5820ff8ae30e0e"}, 1392 | {file = "yarl-1.9.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a3a6ed1d525bfb91b3fc9b690c5a21bb52de28c018530ad85093cc488bee2dd2"}, 1393 | {file = "yarl-1.9.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c38c9ddb6103ceae4e4498f9c08fac9b590c5c71b0370f98714768e22ac6fa66"}, 1394 | {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d9e09c9d74f4566e905a0b8fa668c58109f7624db96a2171f21747abc7524234"}, 1395 | {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8477c1ee4bd47c57d49621a062121c3023609f7a13b8a46953eb6c9716ca392"}, 1396 | {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5ff2c858f5f6a42c2a8e751100f237c5e869cbde669a724f2062d4c4ef93551"}, 1397 | {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:357495293086c5b6d34ca9616a43d329317feab7917518bc97a08f9e55648455"}, 1398 | {file = "yarl-1.9.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54525ae423d7b7a8ee81ba189f131054defdb122cde31ff17477951464c1691c"}, 1399 | {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:801e9264d19643548651b9db361ce3287176671fb0117f96b5ac0ee1c3530d53"}, 1400 | {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e516dc8baf7b380e6c1c26792610230f37147bb754d6426462ab115a02944385"}, 1401 | {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:7d5aaac37d19b2904bb9dfe12cdb08c8443e7ba7d2852894ad448d4b8f442863"}, 1402 | {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:54beabb809ffcacbd9d28ac57b0db46e42a6e341a030293fb3185c409e626b8b"}, 1403 | {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bac8d525a8dbc2a1507ec731d2867025d11ceadcb4dd421423a5d42c56818541"}, 1404 | {file = "yarl-1.9.4-cp310-cp310-win32.whl", hash = "sha256:7855426dfbddac81896b6e533ebefc0af2f132d4a47340cee6d22cac7190022d"}, 1405 | {file = "yarl-1.9.4-cp310-cp310-win_amd64.whl", hash = "sha256:848cd2a1df56ddbffeb375535fb62c9d1645dde33ca4d51341378b3f5954429b"}, 1406 | {file = "yarl-1.9.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:35a2b9396879ce32754bd457d31a51ff0a9d426fd9e0e3c33394bf4b9036b099"}, 1407 | {file = "yarl-1.9.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c7d56b293cc071e82532f70adcbd8b61909eec973ae9d2d1f9b233f3d943f2c"}, 1408 | {file = "yarl-1.9.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d8a1c6c0be645c745a081c192e747c5de06e944a0d21245f4cf7c05e457c36e0"}, 1409 | {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b3c1ffe10069f655ea2d731808e76e0f452fc6c749bea04781daf18e6039525"}, 1410 | {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:549d19c84c55d11687ddbd47eeb348a89df9cb30e1993f1b128f4685cd0ebbf8"}, 1411 | {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7409f968456111140c1c95301cadf071bd30a81cbd7ab829169fb9e3d72eae9"}, 1412 | {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e23a6d84d9d1738dbc6e38167776107e63307dfc8ad108e580548d1f2c587f42"}, 1413 | {file = "yarl-1.9.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d8b889777de69897406c9fb0b76cdf2fd0f31267861ae7501d93003d55f54fbe"}, 1414 | {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:03caa9507d3d3c83bca08650678e25364e1843b484f19986a527630ca376ecce"}, 1415 | {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4e9035df8d0880b2f1c7f5031f33f69e071dfe72ee9310cfc76f7b605958ceb9"}, 1416 | {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:c0ec0ed476f77db9fb29bca17f0a8fcc7bc97ad4c6c1d8959c507decb22e8572"}, 1417 | {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:ee04010f26d5102399bd17f8df8bc38dc7ccd7701dc77f4a68c5b8d733406958"}, 1418 | {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:49a180c2e0743d5d6e0b4d1a9e5f633c62eca3f8a86ba5dd3c471060e352ca98"}, 1419 | {file = "yarl-1.9.4-cp311-cp311-win32.whl", hash = "sha256:81eb57278deb6098a5b62e88ad8281b2ba09f2f1147c4767522353eaa6260b31"}, 1420 | {file = "yarl-1.9.4-cp311-cp311-win_amd64.whl", hash = "sha256:d1d2532b340b692880261c15aee4dc94dd22ca5d61b9db9a8a361953d36410b1"}, 1421 | {file = "yarl-1.9.4-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0d2454f0aef65ea81037759be5ca9947539667eecebca092733b2eb43c965a81"}, 1422 | {file = "yarl-1.9.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:44d8ffbb9c06e5a7f529f38f53eda23e50d1ed33c6c869e01481d3fafa6b8142"}, 1423 | {file = "yarl-1.9.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:aaaea1e536f98754a6e5c56091baa1b6ce2f2700cc4a00b0d49eca8dea471074"}, 1424 | {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3777ce5536d17989c91696db1d459574e9a9bd37660ea7ee4d3344579bb6f129"}, 1425 | {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fc5fc1eeb029757349ad26bbc5880557389a03fa6ada41703db5e068881e5f2"}, 1426 | {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ea65804b5dc88dacd4a40279af0cdadcfe74b3e5b4c897aa0d81cf86927fee78"}, 1427 | {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa102d6d280a5455ad6a0f9e6d769989638718e938a6a0a2ff3f4a7ff8c62cc4"}, 1428 | {file = "yarl-1.9.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09efe4615ada057ba2d30df871d2f668af661e971dfeedf0c159927d48bbeff0"}, 1429 | {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:008d3e808d03ef28542372d01057fd09168419cdc8f848efe2804f894ae03e51"}, 1430 | {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:6f5cb257bc2ec58f437da2b37a8cd48f666db96d47b8a3115c29f316313654ff"}, 1431 | {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:992f18e0ea248ee03b5a6e8b3b4738850ae7dbb172cc41c966462801cbf62cf7"}, 1432 | {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:0e9d124c191d5b881060a9e5060627694c3bdd1fe24c5eecc8d5d7d0eb6faabc"}, 1433 | {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3986b6f41ad22988e53d5778f91855dc0399b043fc8946d4f2e68af22ee9ff10"}, 1434 | {file = "yarl-1.9.4-cp312-cp312-win32.whl", hash = "sha256:4b21516d181cd77ebd06ce160ef8cc2a5e9ad35fb1c5930882baff5ac865eee7"}, 1435 | {file = "yarl-1.9.4-cp312-cp312-win_amd64.whl", hash = "sha256:a9bd00dc3bc395a662900f33f74feb3e757429e545d831eef5bb280252631984"}, 1436 | {file = "yarl-1.9.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:604f31d97fa493083ea21bd9b92c419012531c4e17ea6da0f65cacdcf5d0bd27"}, 1437 | {file = "yarl-1.9.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8a854227cf581330ffa2c4824d96e52ee621dd571078a252c25e3a3b3d94a1b1"}, 1438 | {file = "yarl-1.9.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ba6f52cbc7809cd8d74604cce9c14868306ae4aa0282016b641c661f981a6e91"}, 1439 | {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a6327976c7c2f4ee6816eff196e25385ccc02cb81427952414a64811037bbc8b"}, 1440 | {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8397a3817d7dcdd14bb266283cd1d6fc7264a48c186b986f32e86d86d35fbac5"}, 1441 | {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e0381b4ce23ff92f8170080c97678040fc5b08da85e9e292292aba67fdac6c34"}, 1442 | {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23d32a2594cb5d565d358a92e151315d1b2268bc10f4610d098f96b147370136"}, 1443 | {file = "yarl-1.9.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ddb2a5c08a4eaaba605340fdee8fc08e406c56617566d9643ad8bf6852778fc7"}, 1444 | {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:26a1dc6285e03f3cc9e839a2da83bcbf31dcb0d004c72d0730e755b33466c30e"}, 1445 | {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:18580f672e44ce1238b82f7fb87d727c4a131f3a9d33a5e0e82b793362bf18b4"}, 1446 | {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:29e0f83f37610f173eb7e7b5562dd71467993495e568e708d99e9d1944f561ec"}, 1447 | {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:1f23e4fe1e8794f74b6027d7cf19dc25f8b63af1483d91d595d4a07eca1fb26c"}, 1448 | {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:db8e58b9d79200c76956cefd14d5c90af54416ff5353c5bfd7cbe58818e26ef0"}, 1449 | {file = "yarl-1.9.4-cp39-cp39-win32.whl", hash = "sha256:c7224cab95645c7ab53791022ae77a4509472613e839dab722a72abe5a684575"}, 1450 | {file = "yarl-1.9.4-cp39-cp39-win_amd64.whl", hash = "sha256:824d6c50492add5da9374875ce72db7a0733b29c2394890aef23d533106e2b15"}, 1451 | {file = "yarl-1.9.4-py3-none-any.whl", hash = "sha256:928cecb0ef9d5a7946eb6ff58417ad2fe9375762382f1bf5c55e61645f2c43ad"}, 1452 | {file = "yarl-1.9.4.tar.gz", hash = "sha256:566db86717cf8080b99b58b083b773a908ae40f06681e87e589a976faf8246bf"}, 1453 | ] 1454 | 1455 | [[package]] 1456 | name = "zipp" 1457 | version = "3.19.2" 1458 | requires_python = ">=3.8" 1459 | summary = "Backport of pathlib-compatible object wrapper for zip files" 1460 | groups = ["default"] 1461 | files = [ 1462 | {file = "zipp-3.19.2-py3-none-any.whl", hash = "sha256:f091755f667055f2d02b32c53771a7a6c8b47e1fdbc4b72a8b9072b3eef8015c"}, 1463 | {file = "zipp-3.19.2.tar.gz", hash = "sha256:bf1dcf6450f873a13e952a29504887c89e6de7506209e5b1bcc3460135d4de19"}, 1464 | ] 1465 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [project] 2 | name = "nonebot-plugin-pjsk" 3 | dynamic = ["version"] 4 | description = "Project Sekai Sticker Creator for NoneBot2." 5 | authors = [ 6 | { name = "Agnes_Digital", email = "Z735803792@163.com" }, 7 | { name = "LgCookie", email = "lgc2333@126.com" }, 8 | ] 9 | dependencies = [ 10 | "nonebot2>=2.3.1", 11 | "httpx>=0.27.0", 12 | "anyio>=4.4.0", 13 | "nonebot-plugin-alconna>=0.48.0", 14 | "nonebot-plugin-htmlrender>=0.3.2", 15 | "jinja2>=3.1.4", 16 | "yarl>=1.9.4", 17 | ] 18 | requires-python = ">=3.9,<=4" 19 | keywords = ["pjsk", "nonebot2", "plugin"] 20 | classifiers = [ 21 | "License :: OSI Approved :: MIT License", 22 | "Programming Language :: Python", 23 | "Programming Language :: Python :: 3", 24 | "Programming Language :: Python :: 3.9", 25 | "Programming Language :: Python :: 3.10", 26 | "Programming Language :: Python :: 3.11", 27 | "Operating System :: OS Independent", 28 | ] 29 | readme = "README.md" 30 | license = { text = "MIT" } 31 | 32 | [project.urls] 33 | homepage = "https://github.com/lgc-NB2Dev/nonebot-plugin-pjsk" 34 | 35 | [tool.pdm.build] 36 | includes = [] 37 | 38 | [tool.pdm.version] 39 | source = "file" 40 | path = "nonebot_plugin_pjsk/__init__.py" 41 | 42 | [build-system] 43 | requires = ["pdm-backend"] 44 | build-backend = "pdm.backend" 45 | --------------------------------------------------------------------------------