diff --git a/.docs/aurora/configuration.md b/.docs/aurora/configuration.md index 6845d5b..6fe29ed 100644 --- a/.docs/aurora/configuration.md +++ b/.docs/aurora/configuration.md @@ -80,23 +80,9 @@ Manage the immunity whitelist. - Usage: `[p]aurora timedelta ` - Aliases: `tdc, td, and timedeltaconvert` -This command converts a duration to a [`timedelta`](https://docs.python.org/3/library/datetime.html#datetime.timedelta) Python object.You cannot convert years or months as they are not fixed units. Use `[p]aurora relativedelta` for that. +This command converts a duration to a [`timedelta`](https://docs.python.org/3/library/datetime.html#datetime.timedelta) Python object. **Example usage** -`[p]aurora timedelta 1 day 15hr 82 minutes 52s` - +`[p]timedelta 1 day 15hr 82 minutes 52s` **Output** `1 day, 16:22:52` - -### aurora relativedelta - -- Usage: `[p]aurora relativedelta ` -- Aliases: `rdc, rd, and relativedeltaconvert` - -This command converts a duration to a [`relativedelta`](https://dateutil.readthedocs.io/en/stable/relativedelta.html) Python object. - -**Example usage** -`[p]aurora relativedelta 3 years 1 day 15hr 82 minutes 52s` - -**Output** -`relativedelta(years=+3, days=+1, hours=+15, minutes=+82, seconds=+52)` diff --git a/.docs/aurora/index.md b/.docs/aurora/index.md index 0191f85..f6e5527 100644 --- a/.docs/aurora/index.md +++ b/.docs/aurora/index.md @@ -10,7 +10,7 @@ Aurora is a fully-featured moderation system. It is heavily inspired by Galactic ## Installation ```bash -[p]repo add seacogs https://www.coastalcommits.com/cswimr/SeaCogs +[p]repo add seacogs https://www.coastalcommits.com/SeaswimmerTheFsh/SeaCogs [p]cog install seacogs aurora -[p]load aurora +[p]cog load aurora ``` diff --git a/.docs/aurora/moderation-commands.md b/.docs/aurora/moderation-commands.md index 68d3a7f..93e5a06 100644 --- a/.docs/aurora/moderation-commands.md +++ b/.docs/aurora/moderation-commands.md @@ -23,27 +23,19 @@ Add a note to a user. Warn a user. -## addrole +## blacklist -- Usage: `/addrole [duration] [silent]` -- `target:` (Required) Who are you adding a role to? -- `role:` (Required) What role are you adding to the target? -- `reason:` (Required) Why are you adding a role to this user? -- `duration:` (Optional) How long are you adding this role for? +/// admonition | This command is unfinished, and doesn't currently work. + type: warning +/// + +- Usage: `/blacklist [silent]` +- `target:` (Required) Who are you blacklisting? +- `role:` (Required) What blacklist type are you applying to the target? +- `reason:` (Required) Why are you blacklisting this user? - `silent:` (Optional) Should the user be messaged? -Add a role to a user. - -## removerole - -- Usage: `/removerole [duration] [silent]` -- `target:` (Required) Who are you removing a role from? -- `role:` (Required) What role are you removing from the target? -- `reason:` (Required) Why are you removing a role from this user? -- `duration:` (Optional) How long are you removing this role for? -- `silent:` (Optional) Should the user be messaged? - -Remove a role from a user. +Add a blacklist role to a user. ## mute diff --git a/.docs/backup.md b/.docs/backup.md index 26c949d..f324e72 100644 --- a/.docs/backup.md +++ b/.docs/backup.md @@ -1,18 +1,18 @@ # Backup -Backup allows you to export a JSON list of all of your installed repositories and cogs, then reimport them and automatically reinstall the cogs. +Backup allows you to export a JSON list of all of your installed repositories and cogs, then reimport them and automatically reinstall/reload the cogs. ## Installation ```bash -[p]repo add seacogs https://www.coastalcommits.com/cswimr/SeaCogs +[p]repo add seacogs https://www.coastalcommits.com/SeaswimmerTheFsh/SeaCogs [p]cog install seacogs backup -[p]load backup +[p]cog load backup ``` ## Version Compatibility -As of commit [1edb08a](https://www.coastalcommits.com/cswimr/SeaCogs/commit/1edb08a1271f12098ca0bed11a735f7162cedd14), the Backup cog no longer supports Red versions older than 3.5.6. If you want to use the cog on an earlier version (3.5.0 - 3.5.5), install the cog pinned to this commit: `43464db6a7c51bc69282b1ae3dc507a4aae851de`. +As of commit [1edb08a](https://www.coastalcommits.com/SeaswimmerTheFsh/SeaCogs/commit/1edb08a1271f12098ca0bed11a735f7162cedd14), the Backup cog no longer supports Red versions older than 3.5.6. If you want to use the cog on an earlier version (3.5.0 - 3.5.5), install the cog pinned to this commit: `43464db6a7c51bc69282b1ae3dc507a4aae851de`. ```bash [p]cog installversion sea-cogs 43464db6a7c51bc69282b1ae3dc507a4aae851de backup diff --git a/.docs/bible.md b/.docs/bible.md index 0db826b..b748de2 100644 --- a/.docs/bible.md +++ b/.docs/bible.md @@ -6,9 +6,9 @@ This cog does require an api key to work. ## Installation ```bash -[p]repo add seacogs https://www.coastalcommits.com/cswimr/SeaCogs +[p]repo add seacogs https://www.coastalcommits.com/SeaswimmerTheFsh/SeaCogs [p]cog install seacogs bible -[p]load bible +[p]cog load bible ``` ## Setup @@ -21,9 +21,8 @@ Then, you can use `[p]set api` to set the API key. Make sure your formatting mat ## Commands ### bible passage - -- Usage: `[p]bible passage ` -- Aliases: `verse` + - Usage: `[p]bible passage ` + - Aliases: `verse` Get a Bible passage. @@ -32,7 +31,6 @@ Example usage: `[p]bible passage John 3:16-3:17` ### bible random - -- Usage: `[p]bible random` + - Usage: `[p]bible random` Get a random Bible verse. diff --git a/.docs/emojiinfo.md b/.docs/emojiinfo.md deleted file mode 100644 index fc010a5..0000000 --- a/.docs/emojiinfo.md +++ /dev/null @@ -1,19 +0,0 @@ -# EmojiInfo - -EmojiInfo allows you to retrieve information about an emoji. - -## Installation - -```bash -[p]repo add seacogs https://www.coastalcommits.com/cswimr/SeaCogs -[p]cog install seacogs emojiinfo -[p]load emojiinfo -``` - -## Commands - -### emoji - -- Usage: `[p]emoji [ephemeral]` - -Retrieve information about the provided emoji. If `ephemeral` is provided and the command is used as a slash command, the response will be sent as an ephemeral message. diff --git a/.docs/hotreload.md b/.docs/hotreload.md deleted file mode 100644 index 0144e5d..0000000 --- a/.docs/hotreload.md +++ /dev/null @@ -1,26 +0,0 @@ -# HotReload - -HotReload automatically reloads cogs in local cog paths on file change. -This is useful for development, as it allows you to make changes to your cogs and see the changes reflected in Discord immediately, without having to manually `[p]reload` the cog. - -## Installation - -```bash -[p]repo add seacogs https://www.coastalcommits.com/cswimr/SeaCogs -[p]cog install seacogs hotreload -[p]load hotreload -``` - -## Commands - -### hotreload compile - -Determines if the cog should try to compile a modified Python file before reloading the associated cog. Useful for catching syntax errors. Disabled by default. - -### hotreload notifychannel - -Set the channel where hotreload will send notifications when a cog is reloaded. - -### hotreload list - -Debugging command that shows the list of currently active observers. May be expanded in the future to show watched file paths. diff --git a/.docs/nerdify.md b/.docs/nerdify.md index ceef1af..c1c50a9 100644 --- a/.docs/nerdify.md +++ b/.docs/nerdify.md @@ -5,9 +5,9 @@ Nerdify allows you to nerdify other people's text. ## Installation ```bash -[p]repo add seacogs https://www.coastalcommits.com/cswimr/SeaCogs +[p]repo add seacogs https://www.coastalcommits.com/SeaswimmerTheFsh/SeaCogs [p]cog install seacogs nerdify -[p]load nerdify +[p]cog load nerdify ``` ## Commands diff --git a/.docs/pterodactyl/configuration.md b/.docs/pterodactyl/configuration.md index 0a6e319..9fd4e26 100644 --- a/.docs/pterodactyl/configuration.md +++ b/.docs/pterodactyl/configuration.md @@ -69,10 +69,10 @@ Default value: `None` /// admonition | This has no effect on the `[p]pterodactyl command` text command, or the matching slash command. type: danger -If you want to disable the ability to execute commands on the server through Discord, use the following commands: -`[p]pterodactyl config console commands False` - this command -`[p]command disable pterodactyl command` - disables the text command that lets you execute commands on the server -`[p]slash disable pterodactyl` - due to how slash commands are laid out, this is the only way to disable the ability to execute commands on the server +If you want to disable the ability to execute commands on the server through Discord, use the following commands: +`[p]pterodactyl config console commands False` - this command +`[p]command disable pterodactyl command` - disables the text command that lets you execute commands on the server +`[p]slash disable pterodactyl` - due to how slash commands are laid out, this is the only way to disable the ability to execute commands on the server `[p]slash sync` - apply above slash command change /// diff --git a/.docs/pterodactyl/getting-started.md b/.docs/pterodactyl/getting-started.md index ce9ef31..9b4f75e 100644 --- a/.docs/pterodactyl/getting-started.md +++ b/.docs/pterodactyl/getting-started.md @@ -28,7 +28,7 @@ The Downloader cog allows you to add Git repositories to your bot in order to do Now, use Downloader to add my repository to your bot: ``` -[p]repo add sea-cogs https://www.coastalcommits.com/cswimr/SeaCogs +[p]repo add sea-cogs https://www.coastalcommits.com/SeaswimmerTheFsh/SeaCogs ``` Now, install the Pterodactyl cog: diff --git a/.docs/pterodactyl/index.md b/.docs/pterodactyl/index.md index 732b505..bd3455e 100644 --- a/.docs/pterodactyl/index.md +++ b/.docs/pterodactyl/index.md @@ -10,7 +10,7 @@ Pterodactyl allows for connecting to a Pterodactyl server through websockets. It ## Installation ```bash -[p]repo add seacogs https://www.coastalcommits.com/cswimr/SeaCogs +[p]repo add seacogs https://www.coastalcommits.com/SeaswimmerTheFsh/SeaCogs [p]cog install seacogs pterodactyl -[p]load pterodactyl +[p]cog load aurora ``` diff --git a/.docs/pterodactyl/installing-red.md b/.docs/pterodactyl/installing-red.md index 8567e0e..93ed9f6 100644 --- a/.docs/pterodactyl/installing-red.md +++ b/.docs/pterodactyl/installing-red.md @@ -10,7 +10,7 @@ There are a few caveats to running an instance of Red on Pterodactyl. - You will not receive any support from the Red developers. - The built-in Audio cog will not work. -- Depending on your host, you might have to request a [`tmpfs` size increase](https://github.com/pelican-eggs/eggs/tree/master/bots/discord/redbot#additional-requirements). +- Depending on your host, you might have to request a [`tmpfs` size increase](https://github.com/ign-gg/Pterodactyl-Eggs/tree/master/bots/discord/redbot#additional-requirements). If these are unacceptable to you, you should [install Red normally](https://docs.discord.red/en/stable/install_guides/index.html). /// @@ -64,7 +64,7 @@ Red is quite a large bot, so I'll focus on the specifics of getting the bot work ``` 2. Add my repository to the bot ```bash -[p]repo add sea-cogs https://www.coastalcommits.com/cswimr/SeaCogs +[p]repo add sea-cogs https://www.coastalcommits.com/SeaswimmerTheFsh/SeaCogs ``` 3. Install and load the Pterodactyl cog ```bash diff --git a/.editorconfig b/.editorconfig deleted file mode 100644 index 892e515..0000000 --- a/.editorconfig +++ /dev/null @@ -1,15 +0,0 @@ -root = true - -[*] -indent_style = space -indent_size = 2 -end_of_line = lf -charset = utf-8 -trim_trailing_whitespace = true -insert_final_newline = true - -[*.py] -indent_size = 4 - -[*.md] -trim_trailing_whitespace = false diff --git a/.envrc b/.envrc deleted file mode 100644 index 3550a30..0000000 --- a/.envrc +++ /dev/null @@ -1 +0,0 @@ -use flake diff --git a/.forgejo/ISSUE_TEMPLATE/bug-report.md b/.forgejo/ISSUE_TEMPLATE/bug-report.md new file mode 100644 index 0000000..92c144c --- /dev/null +++ b/.forgejo/ISSUE_TEMPLATE/bug-report.md @@ -0,0 +1,23 @@ +--- +name: Bug Report +about: Got an issue with a cog from SeaCogs? Use this. +title: "[BUG]" +labels: bug +assignees: '' + +--- + +**Describe the bug** +A clear and concise description of what the bug is. + +**To Reproduce** +What caused the error? + +**Expected behavior** +A clear and concise description of what you expected to happen. + +**Screenshots** +If applicable, add screenshots to help explain your problem. + +**Additional context** +Add any other context about the problem here. diff --git a/.forgejo/ISSUE_TEMPLATE/bug_report.yaml b/.forgejo/ISSUE_TEMPLATE/bug_report.yaml deleted file mode 100644 index 86bb98c..0000000 --- a/.forgejo/ISSUE_TEMPLATE/bug_report.yaml +++ /dev/null @@ -1,53 +0,0 @@ -name: Bug Report -about: File a bug report -labels: [bug] -body: - - type: markdown - attributes: - value: | - Thank you for taking the time to fill out this bug report! - - type: checkboxes - id: confirmation - attributes: - label: Please confirm that; - options: - - label: I have checked that this bug does not already have an opened/closed [issue](https://www.coastalcommits.com/cswimr/SeaCogs/issues) or [pull request](https://www.coastalcommits.com/cswimr/SeaCogs/pulls) associated with it. - required: true - - label: I have checked that I am on the latest version of [Red-DiscordBot](https://github.com/CogCreators/Red-DiscordBot), and SeaCogs. - required: true - - type: input - id: hosting - attributes: - label: Hosting - description: How is your bot hosted? - placeholder: Local, Docker, etc. - validations: - required: true - - type: textarea - id: what-happened - attributes: - label: What happened? - description: Also, what did you expect to happen? - placeholder: A bug happened! - validations: - required: true - - type: textarea - id: reproduction - attributes: - label: Reproduction steps - description: Please provide detailed steps to reproduce the bug. - placeholder: | - 1. Do this - 2. Do that - 3. Do this other thing - 4. Bug happens! - validations: - required: false - - type: textarea - id: logs - attributes: - label: Relevant traceback or logs - description: Please copy and paste any relevant tracebacks or log output. This will be automatically formatted into code, so no need for backticks. - render: py - validations: - required: false diff --git a/.forgejo/ISSUE_TEMPLATE/config.yaml b/.forgejo/ISSUE_TEMPLATE/config.yaml deleted file mode 100644 index 2d0a481..0000000 --- a/.forgejo/ISSUE_TEMPLATE/config.yaml +++ /dev/null @@ -1,5 +0,0 @@ -blank_issues_enabled: true -contact_links: - - name: Other Concerns? - url: https://discord.gg/eMUMe77Yb8 - about: Ask in our Discord server! diff --git a/.forgejo/ISSUE_TEMPLATE/suggestion.md b/.forgejo/ISSUE_TEMPLATE/suggestion.md new file mode 100644 index 0000000..b63159a --- /dev/null +++ b/.forgejo/ISSUE_TEMPLATE/suggestion.md @@ -0,0 +1,26 @@ +--- +name: Suggestion +about: Trying to suggest something for SeaCogs? Use this. +title: "[SUGGESTION]" +labels: enhancement +assignees: '' + +--- + +**What cog is your feature request for?** +A cog in this repository. + +**Is your feature request related to a problem? Please describe.** +A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + +**Describe the solution you'd like** +A clear and concise description of what you want to happen. + +**Describe alternatives you've considered** +A clear and concise description of any alternative solutions or features you've considered. + +**Screenshots** +If applicable, add screenshots to help explain your problem. + +**Additional context** +Add any other context about the problem here. diff --git a/.forgejo/ISSUE_TEMPLATE/suggestion.yaml b/.forgejo/ISSUE_TEMPLATE/suggestion.yaml deleted file mode 100644 index f6c1fb8..0000000 --- a/.forgejo/ISSUE_TEMPLATE/suggestion.yaml +++ /dev/null @@ -1,53 +0,0 @@ -name: Suggestion -about: Trying to suggest something for SeaCogs? Use this. -labels: [enhancement] -body: - - type: markdown - attributes: - value: | - Thank you for taking the time to suggest an enhancement! - - type: input - id: cog - attributes: - label: What cog is your feature request for? - description: Specify the cog within the repository. - placeholder: E.g., Pterodactyl - validations: - required: true - - type: textarea - id: problem-description - attributes: - label: Is your feature request related to a problem? Please describe. - placeholder: A clear and concise description of what the problem is. - validations: - required: true - - type: textarea - id: solution-description - attributes: - label: Describe the solution you'd like - placeholder: A clear and concise description of what you want to happen. - validations: - required: true - - type: textarea - id: alternatives - attributes: - label: Describe alternatives you've considered - placeholder: A clear and concise description of any alternative solutions or features you've considered. - validations: - required: false - - type: textarea - id: screenshots - attributes: - label: Screenshots - description: If applicable, add screenshots to help explain your problem. - placeholder: Paste image links here. - validations: - required: false - - type: textarea - id: additional-context - attributes: - label: Additional context - description: Add any other context about the problem here. - placeholder: Any extra information you think might be useful. - validations: - required: false diff --git a/.forgejo/pull_request_template.md b/.forgejo/pull_request_template.md deleted file mode 100644 index 33f957c..0000000 --- a/.forgejo/pull_request_template.md +++ /dev/null @@ -1,6 +0,0 @@ -# Describe what your pull request does and which issue you're targeting - - - -- [ ] By submitting this pull request, I permit [cswimr](https://www.coastalcommits.com/cswimr) to license my work under - the [Mozilla Public License Version 2.0](https://www.coastalcommits.com/cswimr/SeaCogs/src/branch/main/LICENSE). diff --git a/.forgejo/workflows/config/.pylintrc b/.forgejo/workflows/config/.pylintrc index 4874462..2dd59c9 100644 --- a/.forgejo/workflows/config/.pylintrc +++ b/.forgejo/workflows/config/.pylintrc @@ -12,12 +12,10 @@ too-many-locals, too-many-public-methods, too-many-statements, - too-many-positional-arguments, arguments-differ, too-many-return-statements, import-outside-toplevel, import-self, relative-beyond-top-level, too-many-instance-attributes, - duplicate-code, - too-many-nested-blocks + duplicate-code diff --git a/.forgejo/workflows/workflow.yaml b/.forgejo/workflows/workflow.yaml index 1dedbb1..f88c687 100644 --- a/.forgejo/workflows/workflow.yaml +++ b/.forgejo/workflows/workflow.yaml @@ -2,65 +2,47 @@ name: Actions on: push: branches: - - main + - 'main' pull_request: jobs: - lint: - name: Lint Code (Ruff & Pylint) + Lint Code (Ruff & Pylint): runs-on: docker - container: catthehacker/ubuntu:act-latest@sha256:cd837565ef74f3d0f94e89ff6723292caa415306bddabfe566932ae892ca9334 + container: www.coastalcommits.com/seaswimmerthefsh/actionscontainers-seacogs:latest steps: - name: Checkout - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 + uses: actions/checkout@v3 - - name: "Setup uv" - uses: actions/setup-uv@d4b2f3b6ecc6e67c4457f6d3e41ec42d3d0fcb86 # v5 - with: - version: "latest" - enable-cache: true - prune-cache: false - github-token: ${{ secrets.GITHUBTOKEN }} - - - name: "Install dependencies" - run: uv sync + - name: Install dependencies + run: poetry install --with dev --no-root - name: Analysing code with Ruff - run: uv run ruff check $(git ls-files '*.py') + run: ./.venv/bin/ruff check $(git ls-files '*.py') continue-on-error: true - name: Analysing code with Pylint - run: uv run pylint --rcfile=.forgejo/workflows/config/.pylintrc $(git ls-files '*.py') + run: ./.venv/bin/pylint --rcfile=.forgejo/workflows/config/.pylintrc $(git ls-files '*.py') - docs: - name: Build Documentation (MkDocs) + Build Documentation (MkDocs): runs-on: docker - container: catthehacker/ubuntu:act-latest@sha256:cd837565ef74f3d0f94e89ff6723292caa415306bddabfe566932ae892ca9334 + container: www.coastalcommits.com/seaswimmerthefsh/actionscontainers-seacogs:latest steps: - name: Checkout - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 + uses: actions/checkout@v3 with: fetch-depth: 0 - - name: "Setup uv" - uses: actions/setup-uv@d4b2f3b6ecc6e67c4457f6d3e41ec42d3d0fcb86 # v5 - with: - version: "latest" - enable-cache: true - prune-cache: false - github-token: ${{ secrets.GITHUBTOKEN }} - - name: Install dependencies - run: uv sync --no-dev --group=documentation + run: poetry install --with docs --no-root - name: Set environment variables - uses: actions/env@1791216cd180e6578dd1d67fb8d2852b883a5f53 # v2 + uses: actions/env@v2 - name: Build documentation run: | export SITE_URL="https://$CI_ACTION_REF_NAME_SLUG.seacogs.coastalcommits.com" export EDIT_URI="src/branch/$CI_ACTION_REF_NAME/.docs" - uv run mkdocs build -v + ./.venv/bin/mkdocs build -v - name: Deploy documentation run: | @@ -74,13 +56,13 @@ jobs: echo "${YELLOW}Deploying to ${BLUE}Meli ${YELLOW}on branch ${GREEN}$CI_ACTION_REF_NAME_SLUG${YELLOW}...\n" npx -p "@getmeli/cli" meli upload ./site \ - --url "https://meli.csw.im" \ + --url "https://pages.coastalcommits.com" \ --site "${{ vars.MELI_SITE_ID }}" \ - --token "${{ secrets.MELI_TOKEN }}" \ + --token "${{ secrets.MELI_SITE_SECRET }}" \ --release "$CI_ACTION_REF_NAME_SLUG/${{ env.GITHUB_SHA }}" \ --branch "$CI_ACTION_REF_NAME_SLUG" echo "\n${YELLOW}Deployed to ${BLUE}Meli ${YELLOW}on branch ${GREEN}$CI_ACTION_REF_NAME_SLUG${YELLOW}!" - echo "${GREEN}https://$CI_ACTION_REF_NAME_SLUG.seacogs.csw.im/" + echo "${GREEN}https://$CI_ACTION_REF_NAME_SLUG.seacogs.coastalcommits.com/" env: GITEA_TOKEN: ${{ secrets.COASTALCOMMITSTOKEN }} diff --git a/.gitignore b/.gitignore index 3902499..429d31f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,8 +1,4 @@ .cache +.vscode site .venv -.data -__pycache__ -.mypy_cache/ -.ruff_cache/ -.direnv/ diff --git a/.vscode/launch.json b/.vscode/launch.json deleted file mode 100644 index 2a3559f..0000000 --- a/.vscode/launch.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "version": "0.2.0", - "configurations": [ - { - "name": "Python: Red-DiscordBot", - "type": "debugpy", - "request": "launch", - "module": "redbot", - "args": ["local", "--dev", "-vvv", "--load-cogs=hotreload"] - } - ] -} diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index 68a52a5..0000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "[python]": { - "editor.codeActionsOnSave": { - "source.fixAll": "explicit" - }, - "editor.defaultFormatter": "charliermarsh.ruff" - }, - "[json]": { - "editor.defaultFormatter": "vscode.json-language-features" - }, - "[jsonc]": { - "editor.defaultFormatter": "vscode.json-language-features" - }, - "files.exclude": { - "**/.git": true, - "**/__pycache__": true, - "**/.ruff_cache": true, - "**/.mypy_cache": true - }, - "python.analysis.diagnosticSeverityOverrides": { - "reportAttributeAccessIssue": false, // disabled because `commands.group.command` is listed as Any / Unknown for some reason - "reportCallIssue": "information" - }, - "python.analysis.diagnosticMode": "workspace", - "python.analysis.supportDocstringTemplate": true, - "python.analysis.typeCheckingMode": "basic", - "python.analysis.typeEvaluation.enableReachabilityAnalysis": true, - "python.analysis.typeEvaluation.strictDictionaryInference": true, - "python.analysis.typeEvaluation.strictListInference": true, - "python.analysis.typeEvaluation.strictSetInference": true, - "editor.formatOnSave": true, -} diff --git a/README.md b/README.md index 90818be..3524dda 100644 --- a/README.md +++ b/README.md @@ -1,56 +1,27 @@ # SeaCogs [![Discord](https://img.shields.io/discord/1070058354925383681?logo=discord&color=%235661f6)](https://discord.gg/eMUMe77Yb8) -[![Documentation](https://img.shields.io/badge/docs-CoastalCommits%20Pages-3e83fd?logo=materialformkdocs)](https://seacogs.csw.im) +[![Documentation](https://img.shields.io/badge/docs-CoastalCommits%20Pages-3e83fd?logo=materialformkdocs)](https://seacogs.coastalcommits.com) ![Python Versions](https://img.shields.io/badge/python-3.10%20%7C%203.11-%233776ab?logo=python) My assorted cogs for Red-DiscordBot. -## Developing +## Development -You'll need some prerequisites before you can start working on my cogs. -[git](https://git-scm.com) - [uv](https://docs.astral.sh/uv) -Additionally, I recommend a code editor of some variety. [Visual Studio Code](https://code.visualstudio.com) is a good, beginner-friendly option. +To get started with a development environment, first clone this repository. -### Installing Prerequisites - -_This section of the guide only applies to Windows systems. -If you're on Linux, refer to the documentation of the projects listed above. I also offer a [Nix Flake](./flake.nix) that contains all of the required prerequisites, if you're a Nix user._ - -#### [`git`](https://git-scm.com) - -You can download git from the [git download page](https://git-scm.com/downloads/win). - -Alternatively, you can use `winget`: - -```ps1 -winget install --id=Git.Git -e --source=winget +```sh +git clone https://coastalcommits.com/SeaswimmerTheFsh/SeaCogs.git ``` -#### [`uv`](https://docs.astral.sh/uv) +Then, install Poetry. -You can install uv with the following Powershell command: - -```ps1 -powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex" +```sh +pip install poetry ``` -Alternatively, you can use `winget`: +Finally, use Poetry to create a virtual environment with all of the dependencies required by my cogs. -```ps1 -winget install --id=astral-sh.uv -e -``` - -### Getting the Source Code - -Once you have [`git`](https://git-scm.com) installed, you can use the `git clone` command to get a copy of the repository on your system. - -```bash -git clone https://c.csw.im/cswimr/SeaCogs.git -``` - -Then, you can use `uv` to install the Python dependencies required for development. - -```bash -uv sync --frozen +```sh +poetry install ``` diff --git a/antipolls/antipolls.py b/antipolls/antipolls.py index 6f6dac6..810e88b 100644 --- a/antipolls/antipolls.py +++ b/antipolls/antipolls.py @@ -9,15 +9,14 @@ import discord from red_commons.logging import getLogger from redbot.core import commands from redbot.core.bot import Config, Red -from redbot.core.utils.chat_formatting import bold, humanize_list +from redbot.core.utils.chat_formatting import humanize_list class AntiPolls(commands.Cog): """AntiPolls deletes messages that contain polls, with a configurable per-guild role and channel whitelist and support for default Discord permissions (Manage Messages).""" - __author__ = ["[cswimr](https://www.coastalcommits.com/cswimr)"] - __git__ = "https://www.coastalcommits.com/cswimr/SeaCogs" - __version__ = "1.0.3" + __author__ = ["SeaswimmerTheFsh"] + __version__ = "1.0.0" __documentation__ = "https://seacogs.coastalcommits.com/antipolls/" def __init__(self, bot: Red): @@ -39,17 +38,17 @@ class AntiPolls(commands.Cog): n = "\n" if "\n\n" not in pre_processed else "" text = [ f"{pre_processed}{n}", - f"{bold('Cog Version:')} [{self.__version__}]({self.__git__})", - f"{bold('Author:')} {humanize_list(self.__author__)}", - f"{bold('Documentation:')} {self.__documentation__}", + f"Cog Version: **{self.__version__}**", + f"Author: {humanize_list(self.__author__)}", + f"Documentation: {self.__documentation__}", ] return "\n".join(text) - async def red_delete_data_for_user(self, **kwargs): # pylint: disable=unused-argument + async def red_delete_data_for_user(self, **kwargs): # pylint: disable=unused-argument """Nothing to delete.""" return - @commands.Cog.listener("on_message") + @commands.Cog.listener('on_message') async def polls_listener(self, message: discord.Message) -> None: if message.guild is None: return self.logger.verbose("Message in direct messages ignored") @@ -62,13 +61,13 @@ class AntiPolls(commands.Cog): guild_config = await self.config.guild(message.guild).all() - if guild_config["manage_messages"] is True and message.author.guild_permissions.manage_messages: + if guild_config['manage_messages'] is True and message.author.guild_permissions.manage_messages: return self.logger.verbose("Message from user with Manage Messages permission ignored") - if message.channel.id in guild_config["channel_whitelist"]: + if message.channel.id in guild_config['channel_whitelist']: return self.logger.verbose("Message in whitelisted channel %s ignored", message.channel.id) - if any(role.id in guild_config["role_whitelist"] for role in message.author.roles): + if any(role.id in guild_config['role_whitelist'] for role in message.author.roles): return self.logger.verbose("Message from whitelisted role %s ignored", message.author.roles) if not message.content and not message.embeds and not message.attachments and not message.stickers: @@ -80,9 +79,9 @@ class AntiPolls(commands.Cog): return self.logger.error("Failed to delete message: %s", e) return self.logger.trace("Deleted poll message %s", message.id) - return self.logger.verbose("Message %s is not a poll, ignoring", message.id) + self.logger.verbose("Message %s is not a poll, ignoring", message.id) - @commands.group(name="antipolls", aliases=["ap"]) # type: ignore + @commands.group(name="antipolls", aliases=["ap"]) @commands.guild_only() @commands.admin_or_permissions(manage_guild=True) async def antipolls(self, ctx: commands.Context) -> None: @@ -95,8 +94,6 @@ class AntiPolls(commands.Cog): @antipolls_roles.command(name="add") async def antipolls_roles_add(self, ctx: commands.Context, *roles: discord.Role) -> None: """Add roles to the whitelist.""" - assert ctx.guild is not None # using `assert` here and in the rest of this file to satisfy typecheckers - # this is safe because the commands are part of a guild-only command group async with self.config.guild(ctx.guild).role_whitelist() as role_whitelist: role_whitelist: list failed: list[discord.Role] = [] @@ -112,7 +109,6 @@ class AntiPolls(commands.Cog): @antipolls_roles.command(name="remove") async def antipolls_roles_remove(self, ctx: commands.Context, *roles: discord.Role) -> None: """Remove roles from the whitelist.""" - assert ctx.guild is not None async with self.config.guild(ctx.guild).role_whitelist() as role_whitelist: role_whitelist: list failed: list[discord.Role] = [] @@ -126,14 +122,13 @@ class AntiPolls(commands.Cog): await ctx.send(f"The following roles were not in the whitelist: {humanize_list([role.mention for role in failed])}", delete_after=10) @antipolls_roles.command(name="list") - async def antipolls_roles_list(self, ctx: commands.Context) -> discord.Message: + async def antipolls_roles_list(self, ctx: commands.Context) -> None: """List roles in the whitelist.""" - assert ctx.guild is not None role_whitelist = await self.config.guild(ctx.guild).role_whitelist() if not role_whitelist: return await ctx.send("No roles in the whitelist.") - roles = [role for role in (ctx.guild.get_role(role) for role in role_whitelist) if role is not None] - return await ctx.send(humanize_list([role.mention for role in roles])) + roles = [ctx.guild.get_role(role) for role in role_whitelist] + await ctx.send(humanize_list([role.mention for role in roles])) @antipolls.group(name="channels") async def antipolls_channels(self, ctx: commands.Context) -> None: @@ -142,7 +137,6 @@ class AntiPolls(commands.Cog): @antipolls_channels.command(name="add") async def antipolls_channels_add(self, ctx: commands.Context, *channels: discord.TextChannel) -> None: """Add channels to the whitelist.""" - assert ctx.guild is not None async with self.config.guild(ctx.guild).channel_whitelist() as channel_whitelist: channel_whitelist: list failed: list[discord.TextChannel] = [] @@ -158,7 +152,6 @@ class AntiPolls(commands.Cog): @antipolls_channels.command(name="remove") async def antipolls_channels_remove(self, ctx: commands.Context, *channels: discord.TextChannel) -> None: """Remove channels from the whitelist.""" - assert ctx.guild is not None async with self.config.guild(ctx.guild).channel_whitelist() as channel_whitelist: channel_whitelist: list failed: list[discord.TextChannel] = [] @@ -172,21 +165,16 @@ class AntiPolls(commands.Cog): await ctx.send(f"The following channels were not in the whitelist: {humanize_list([channel.mention for channel in failed])}", delete_after=10) @antipolls_channels.command(name="list") - async def antipolls_channels_list(self, ctx: commands.Context) -> discord.Message: + async def antipolls_channels_list(self, ctx: commands.Context) -> None: """List channels in the whitelist.""" - assert ctx.guild is not None channel_whitelist = await self.config.guild(ctx.guild).channel_whitelist() if not channel_whitelist: return await ctx.send("No channels in the whitelist.") - channels = [channel for channel in (ctx.guild.get_channel(channel) for channel in channel_whitelist) if channel is not None] - for c in channels: - if not c: - channels.remove(c) - return await ctx.send(humanize_list([channel.mention for channel in channels])) + channels = [ctx.guild.get_channel(channel) for channel in channel_whitelist] + await ctx.send(humanize_list([channel.mention for channel in channels])) @antipolls.command(name="managemessages") async def antipolls_managemessages(self, ctx: commands.Context, enabled: bool) -> None: """Toggle Manage Messages permission check.""" - assert ctx.guild is not None await self.config.guild(ctx.guild).manage_messages.set(enabled) await ctx.tick() diff --git a/antipolls/info.json b/antipolls/info.json index 24bc0bb..569fa0c 100644 --- a/antipolls/info.json +++ b/antipolls/info.json @@ -1,14 +1,17 @@ { - "$schema": "https://raw.githubusercontent.com/Cog-Creators/Red-DiscordBot/refs/heads/V3/develop/schema/red_cog_repo.schema.json", - "author": ["cswimr"], - "install_msg": "Thank you for installing AntiPolls!\nYou can find the source code of this cog [here](https://coastalcommits.com/cswimr/SeaCogs).", - "name": "AntiPolls", - "short": "AntiPolls deletes messages that contain polls.", - "description": "AntiPolls deletes messages that contain polls, with a configurable per-guild role and channel whitelist and support for default Discord permissions (Manage Messages).", - "end_user_data_statement": "This cog does not store any user data.", - "hidden": true, + "author" : ["SeaswimmerTheFsh (seasw.)"], + "install_msg" : "Thank you for installing AntiPolls!\nYou can find the source code of this cog [here](https://coastalcommits.com/SeaswimmerTheFsh/SeaCogs).", + "name" : "AntiPolls", + "short" : "AntiPolls deletes messages that contain polls.", + "description" : "AntiPolls deletes messages that contain polls, with a configurable per-guild role and channel whitelist and support for default Discord permissions (Manage Messages).", + "end_user_data_statement" : "This cog does not store any user data.", + "hidden": false, "disabled": false, "min_bot_version": "3.5.0", "min_python_version": [3, 10, 0], - "tags": ["automod", "automoderation", "polls"] + "tags": [ + "automod", + "automoderation", + "polls" + ] } diff --git a/aurora/aurora.py b/aurora/aurora.py index 955b5cc..5d8ead0 100644 --- a/aurora/aurora.py +++ b/aurora/aurora.py @@ -13,7 +13,6 @@ from datetime import datetime, timedelta, timezone from math import ceil import discord -from discord import Object from discord.ext import tasks from redbot.core import app_commands, commands, data_manager from redbot.core.app_commands import Choice @@ -31,7 +30,7 @@ from aurora.utilities.config import config, register_config from aurora.utilities.database import connect, create_guild_table, fetch_case, mysql_log from aurora.utilities.factory import addrole_embed, case_factory, changes_factory, evidenceformat_factory, guild_embed, immune_embed, message_factory, overrides_embed from aurora.utilities.logger import logger -from aurora.utilities.utils import check_moddable, check_permissions, convert_timedelta_to_str, fetch_channel_dict, fetch_user_dict, generate_dict, get_footer_image, log, send_evidenceformat, timedelta_from_relativedelta +from aurora.utilities.utils import check_moddable, check_permissions, convert_timedelta_to_str, fetch_channel_dict, fetch_user_dict, generate_dict, log, send_evidenceformat, timedelta_from_relativedelta class Aurora(commands.Cog): @@ -39,8 +38,8 @@ class Aurora(commands.Cog): It is heavily inspired by GalacticBot, and is designed to be a more user-friendly alternative to Red's core Mod cogs. This cog stores all of its data in an SQLite database.""" - __author__ = ["cswimr"] - __version__ = "2.1.5" + __author__ = ["SeaswimmerTheFsh"] + __version__ = "2.1.2" __documentation__ = "https://seacogs.coastalcommits.com/aurora/" async def red_delete_data_for_user(self, *, requester, user_id: int): @@ -70,8 +69,7 @@ class Aurora(commands.Cog): await config.user_from_id(user_id).clear() else: logger.warning( - "Invalid requester passed to red_delete_data_for_user: %s", - requester, + "Invalid requester passed to red_delete_data_for_user: %s", requester ) def __init__(self, bot: Red): @@ -115,20 +113,6 @@ class Aurora(commands.Cog): except ConnectionRefusedError: return - @commands.Cog.listener("on_member_join") - async def addrole_on_member_join(self, member: discord.Member): - """This method automatically adds roles to users when they join the server.""" - if not await self.bot.cog_disabled_in_guild(self, member.guild): - query = f"""SELECT moderation_id, role_id, reason FROM moderation_{member.guild.id} WHERE target_id = ? AND moderation_type = 'ADDROLE' AND expired = 0 AND resolved = 0;""" - database = connect() - cursor = database.cursor() - cursor.execute(query, (member.id,)) - results = cursor.fetchall() - for result in results: - role = member.guild.get_role(result[1]) - reason = result[2] - await member.add_roles(role, reason=f"Role automatically added on member rejoin for: {reason} (Case #{result[0]:,})") - @commands.Cog.listener("on_audit_log_entry_create") async def autologger(self, entry: discord.AuditLogEntry): """This method automatically logs moderations done by users manually ("right clicks").""" @@ -136,8 +120,9 @@ class Aurora(commands.Cog): if await config.guild(entry.guild).ignore_other_bots() is True: if entry.user.bot or entry.target.bot: return - elif entry.user.id == self.bot.user.id: - return + else: + if entry.user.id == self.bot.user.id: + return duration = "NULL" @@ -159,10 +144,10 @@ class Aurora(commands.Cog): elif entry.action == discord.AuditLogAction.member_update: if entry.after.timed_out_until is not None: timed_out_until_aware = entry.after.timed_out_until.replace( - tzinfo=timezone.utc, + tzinfo=timezone.utc ) duration_datetime = timed_out_until_aware - datetime.now( - tz=timezone.utc, + tz=timezone.utc ) minutes = round(duration_datetime.total_seconds() / 60) duration = timedelta(minutes=minutes) @@ -209,7 +194,7 @@ class Aurora(commands.Cog): return await interaction.response.send_message( - content=f"{target.mention} has recieved a note!\n**Reason** - `{reason}`", + content=f"{target.mention} has recieved a note!\n**Reason** - `{reason}`" ) if silent is None: @@ -224,7 +209,7 @@ class Aurora(commands.Cog): moderation_type="note", response=await interaction.original_response(), ) - await target.send(embed=embed, file=get_footer_image(self)) + await target.send(embed=embed) except discord.errors.HTTPException: pass @@ -239,7 +224,7 @@ class Aurora(commands.Cog): reason, ) await interaction.edit_original_response( - content=f"{target.mention} has received a note! (Case `#{moderation_id:,}`)\n**Reason** - `{reason}`", + content=f"{target.mention} has received a note! (Case `#{moderation_id:,}`)\n**Reason** - `{reason}`" ) await log(interaction, moderation_id) @@ -268,7 +253,7 @@ class Aurora(commands.Cog): return await interaction.response.send_message( - content=f"{target.mention} has been warned!\n**Reason** - `{reason}`", + content=f"{target.mention} has been warned!\n**Reason** - `{reason}`" ) if silent is None: @@ -283,7 +268,7 @@ class Aurora(commands.Cog): moderation_type="warned", response=await interaction.original_response(), ) - await target.send(embed=embed, file=get_footer_image(self)) + await target.send(embed=embed) except discord.errors.HTTPException: pass @@ -298,7 +283,7 @@ class Aurora(commands.Cog): reason, ) await interaction.edit_original_response( - content=f"{target.mention} has been warned! (Case `#{moderation_id:,}`)\n**Reason** - `{reason}`", + content=f"{target.mention} has been warned! (Case `#{moderation_id:,}`)\n**Reason** - `{reason}`" ) await log(interaction, moderation_id) @@ -342,8 +327,7 @@ class Aurora(commands.Cog): parsed_time = parse_timedelta(duration) if parsed_time is None: await interaction.response.send_message( - content=error("Please provide a valid duration!"), - ephemeral=True, + content=error("Please provide a valid duration!"), ephemeral=True ) return else: @@ -351,15 +335,12 @@ class Aurora(commands.Cog): if role.id not in addrole_whitelist: await interaction.response.send_message( - content=error("That role isn't whitelisted!"), - ephemeral=True, + content=error("That role isn't whitelisted!"), ephemeral=True ) return if not await check_moddable( - target, - interaction, - ["moderate_members", "manage_roles"], + target, interaction, ["moderate_members", "manage_roles"] ): return @@ -385,16 +366,16 @@ class Aurora(commands.Cog): duration=parsed_time, role=role, ) - await target.send(embed=embed, file=get_footer_image(self)) + await target.send(embed=embed) except discord.errors.HTTPException: pass await target.add_roles( role, - reason=f"Role added by {interaction.user.id}{' for ' + humanize_timedelta(timedelta=parsed_time) if parsed_time != 'NULL' else ''} for: {reason}", + reason=f"Role added by {interaction.user.id}{(' for ' + {humanize_timedelta(timedelta=parsed_time)} if parsed_time != 'NULL' else '')} for: {reason}", ) response: discord.WebhookMessage = await interaction.followup.send( - content=f"{target.mention} has been given the {role.mention} role{' for ' + humanize_timedelta(timedelta=parsed_time) if parsed_time != 'NULL' else ''}!\n**Reason** - `{reason}`", + content=f"{target.mention} has been given the {role.mention} role{(' for ' + {humanize_timedelta(timedelta=parsed_time)} if parsed_time != 'NULL' else '')}!\n**Reason** - `{reason}`" ) moderation_id = await mysql_log( @@ -408,117 +389,7 @@ class Aurora(commands.Cog): reason, ) await response.edit( - content=f"{target.mention} has been given the {role.mention} role{' for ' + humanize_timedelta(timedelta=parsed_time) if parsed_time != 'NULL' else ''}! (Case `#{moderation_id:,}`)\n**Reason** - `{reason}`", - ) - await log(interaction, moderation_id) - - case = await fetch_case(moderation_id, interaction.guild.id) - await send_evidenceformat(interaction, case) - - @app_commands.command(name="removerole") - async def removerole( - self, - interaction: discord.Interaction, - target: discord.Member, - role: discord.Role, - reason: str, - duration: str = None, - silent: bool = None, - ): - """Remove a role from a user. - - Parameters - ----------- - target: discord.Member - Who are you removing a role from? - role: discord.Role - What role are you removing from the target? - reason: str - Why are you removing a role from this user? - duration: str - How long are you removing this role for? - silent: bool - Should the user be messaged?""" - addrole_whitelist = await config.guild(interaction.guild).addrole_whitelist() - - if not addrole_whitelist: - await interaction.response.send_message( - content=error("There are no whitelisted roles set for this server!"), - ephemeral=True, - ) - return - - if duration is not None: - parsed_time = parse_timedelta(duration) - if parsed_time is None: - await interaction.response.send_message( - content=error("Please provide a valid duration!"), - ephemeral=True, - ) - return - else: - parsed_time = "NULL" - - if role.id not in addrole_whitelist: - await interaction.response.send_message( - content=error("That role isn't whitelisted!"), - ephemeral=True, - ) - return - - if not await check_moddable( - target, - interaction, - ["moderate_members", "manage_roles"], - ): - return - - if role.id not in [user_role.id for user_role in target.roles]: - await interaction.response.send_message( - content=error(f"{target.mention} does not have this role!"), - ephemeral=True, - ) - return - - await interaction.response.defer() - if silent is None: - silent = not await config.guild(interaction.guild).dm_users() - if silent is False: - try: - embed = await message_factory( - await self.bot.get_embed_color(interaction.channel), - guild=interaction.guild, - moderator=interaction.user, - reason=reason, - moderation_type="removerole", - response=await interaction.original_response(), - duration=parsed_time, - role=role, - ) - await target.send(embed=embed, file=get_footer_image(self)) - except discord.errors.HTTPException: - pass - - await target.remove_roles( - role, - reason=f"Role removed by {interaction.user.id}{' for ' + humanize_timedelta(timedelta=parsed_time) if parsed_time != 'NULL' else ''} for: {reason}", - ) - response: discord.WebhookMessage = await interaction.followup.send( - content=f"{target.mention} has had the {role.mention} role removed{' for ' + humanize_timedelta(timedelta=parsed_time) if parsed_time != 'NULL' else ''}!\n**Reason** - `{reason}`", - ) - - moderation_id = await mysql_log( - interaction.guild.id, - interaction.user.id, - "REMOVEROLE", - "USER", - target.id, - role.id, - parsed_time, - reason, - ) - await response.edit( - content=f"{target.mention} has had the {role.mention} role removed{' for ' + humanize_timedelta(timedelta=parsed_time) if parsed_time != 'NULL' else ''}! (Case `#{moderation_id:,}`)\n**Reason** - `{reason}`", + content=f"{target.mention} has been given the {role.mention} role{(' for ' + {humanize_timedelta(timedelta=parsed_time)} if parsed_time != 'NULL' else '')}! (Case `#{moderation_id:,}`)\n**Reason** - `{reason}`", ) await log(interaction, moderation_id) @@ -561,24 +432,21 @@ class Aurora(commands.Cog): parsed_time = parse_timedelta(duration, maximum=timedelta(days=28)) if parsed_time is None: await interaction.response.send_message( - error("Please provide a valid duration!"), - ephemeral=True, + error("Please provide a valid duration!"), ephemeral=True ) return except commands.BadArgument: await interaction.response.send_message( - error("Please provide a duration that is less than 28 days."), - ephemeral=True, + error("Please provide a duration that is less than 28 days."), ephemeral=True ) return await target.timeout( - parsed_time, - reason=f"Muted by {interaction.user.id} for: {reason}", + parsed_time, reason=f"Muted by {interaction.user.id} for: {reason}" ) await interaction.response.send_message( - content=f"{target.mention} has been muted for {humanize_timedelta(timedelta=parsed_time)}!\n**Reason** - `{reason}`", + content=f"{target.mention} has been muted for {humanize_timedelta(timedelta=parsed_time)}!\n**Reason** - `{reason}`" ) if silent is None: @@ -594,7 +462,7 @@ class Aurora(commands.Cog): response=await interaction.original_response(), duration=parsed_time, ) - await target.send(embed=embed, file=get_footer_image(self)) + await target.send(embed=embed) except discord.errors.HTTPException: pass @@ -609,7 +477,7 @@ class Aurora(commands.Cog): reason, ) await interaction.edit_original_response( - content=f"{target.mention} has been muted for {humanize_timedelta(timedelta=parsed_time)}! (Case `#{moderation_id:,}`)\n**Reason** - `{reason}`", + content=f"{target.mention} has been muted for {humanize_timedelta(timedelta=parsed_time)}! (Case `#{moderation_id:,}`)\n**Reason** - `{reason}`" ) await log(interaction, moderation_id) @@ -647,15 +515,14 @@ class Aurora(commands.Cog): if reason: await target.timeout( - None, - reason=f"Unmuted by {interaction.user.id} for: {reason}", + None, reason=f"Unmuted by {interaction.user.id} for: {reason}" ) else: await target.timeout(None, reason=f"Unbanned by {interaction.user.id}") reason = "No reason given." await interaction.response.send_message( - content=f"{target.mention} has been unmuted!\n**Reason** - `{reason}`", + content=f"{target.mention} has been unmuted!\n**Reason** - `{reason}`" ) if silent is None: @@ -670,7 +537,7 @@ class Aurora(commands.Cog): moderation_type="unmuted", response=await interaction.original_response(), ) - await target.send(embed=embed, file=get_footer_image(self)) + await target.send(embed=embed) except discord.errors.HTTPException: pass @@ -685,7 +552,7 @@ class Aurora(commands.Cog): reason, ) await interaction.edit_original_response( - content=f"{target.mention} has been unmuted! (Case `#{moderation_id:,}`)\n**Reason** - `{reason}`", + content=f"{target.mention} has been unmuted! (Case `#{moderation_id:,}`)\n**Reason** - `{reason}`" ) await log(interaction, moderation_id) @@ -714,7 +581,7 @@ class Aurora(commands.Cog): return await interaction.response.send_message( - content=f"{target.mention} has been kicked!\n**Reason** - `{reason}`", + content=f"{target.mention} has been kicked!\n**Reason** - `{reason}`" ) if silent is None: @@ -729,7 +596,7 @@ class Aurora(commands.Cog): moderation_type="kicked", response=await interaction.original_response(), ) - await target.send(embed=embed, file=get_footer_image(self)) + await target.send(embed=embed) except discord.errors.HTTPException: pass @@ -746,7 +613,7 @@ class Aurora(commands.Cog): reason, ) await interaction.edit_original_response( - content=f"{target.mention} has been kicked! (Case `#{moderation_id:,}`)\n**Reason** - `{reason}`", + content=f"{target.mention} has been kicked! (Case `#{moderation_id:,}`)\n**Reason** - `{reason}`" ) await log(interaction, moderation_id) @@ -762,7 +629,7 @@ class Aurora(commands.Cog): Choice(name="1 Day", value=86400), Choice(name="3 Days", value=259200), Choice(name="7 Days", value=604800), - ], + ] ) async def ban( self, @@ -798,8 +665,7 @@ class Aurora(commands.Cog): try: await interaction.guild.fetch_ban(target) await interaction.response.send_message( - content=error(f"{target.mention} is already banned!"), - ephemeral=True, + content=error(f"{target.mention} is already banned!"), ephemeral=True ) return except discord.errors.NotFound: @@ -809,21 +675,19 @@ class Aurora(commands.Cog): parsed_time = parse_relativedelta(duration) if parsed_time is None: await interaction.response.send_message( - content=error("Please provide a valid duration!"), - ephemeral=True, + content=error("Please provide a valid duration!"), ephemeral=True ) return try: parsed_time = timedelta_from_relativedelta(parsed_time) except ValueError: await interaction.response.send_message( - content=error("Please provide a valid duration!"), - ephemeral=True, + content=error("Please provide a valid duration!"), ephemeral=True ) return await interaction.response.send_message( - content=f"{target.mention} has been banned for {humanize_timedelta(timedelta=parsed_time)}!\n**Reason** - `{reason}`", + content=f"{target.mention} has been banned for {humanize_timedelta(timedelta=parsed_time)}!\n**Reason** - `{reason}`" ) try: @@ -836,7 +700,7 @@ class Aurora(commands.Cog): response=await interaction.original_response(), duration=parsed_time, ) - await target.send(embed=embed, file=get_footer_image(self)) + await target.send(embed=embed) except discord.errors.HTTPException: pass @@ -857,7 +721,7 @@ class Aurora(commands.Cog): reason, ) await interaction.edit_original_response( - content=f"{target.mention} has been banned for {humanize_timedelta(timedelta=parsed_time)}! (Case `#{moderation_id}`)\n**Reason** - `{reason}`", + content=f"{target.mention} has been banned for {humanize_timedelta(timedelta=parsed_time)}! (Case `#{moderation_id}`)\n**Reason** - `{reason}`" ) await log(interaction, moderation_id) @@ -865,14 +729,14 @@ class Aurora(commands.Cog): await send_evidenceformat(interaction, case) else: await interaction.response.send_message( - content=f"{target.mention} has been banned!\n**Reason** - `{reason}`", + content=f"{target.mention} has been banned!\n**Reason** - `{reason}`" ) if silent is None: silent = not await config.guild(interaction.guild).dm_users() if silent is False: try: - embed = await message_factory( + embed = embed = await message_factory( await self.bot.get_embed_color(interaction.channel), guild=interaction.guild, moderator=interaction.user, @@ -880,7 +744,7 @@ class Aurora(commands.Cog): moderation_type="banned", response=await interaction.original_response(), ) - await target.send(embed=embed, file=get_footer_image(self)) + await target.send(embed=embed) except discord.errors.HTTPException: pass @@ -901,7 +765,7 @@ class Aurora(commands.Cog): reason, ) await interaction.edit_original_response( - content=f"{target.mention} has been banned! (Case `#{moderation_id:,}`)\n**Reason** - `{reason}`", + content=f"{target.mention} has been banned! (Case `#{moderation_id:,}`)\n**Reason** - `{reason}`" ) await log(interaction, moderation_id) @@ -933,25 +797,22 @@ class Aurora(commands.Cog): await interaction.guild.fetch_ban(target) except discord.errors.NotFound: await interaction.response.send_message( - content=error(f"{target.mention} is not banned!"), - ephemeral=True, + content=error(f"{target.mention} is not banned!"), ephemeral=True ) return if reason: await interaction.guild.unban( - target, - reason=f"Unbanned by {interaction.user.id} for: {reason}", + target, reason=f"Unbanned by {interaction.user.id} for: {reason}" ) else: await interaction.guild.unban( - target, - reason=f"Unbanned by {interaction.user.id}", + target, reason=f"Unbanned by {interaction.user.id}" ) reason = "No reason given." await interaction.response.send_message( - content=f"{target.mention} has been unbanned!\n**Reason** - `{reason}`", + content=f"{target.mention} has been unbanned!\n**Reason** - `{reason}`" ) if silent is None: @@ -966,7 +827,7 @@ class Aurora(commands.Cog): moderation_type="unbanned", response=await interaction.original_response(), ) - await target.send(embed=embed, file=get_footer_image(self)) + await target.send(embed=embed) except discord.errors.HTTPException: pass @@ -981,7 +842,7 @@ class Aurora(commands.Cog): reason, ) await interaction.edit_original_response( - content=f"{target.mention} has been unbanned! (Case `#{moderation_id:,}`)\n**Reason** - `{reason}`", + content=f"{target.mention} has been unbanned! (Case `#{moderation_id:,}`)\n**Reason** - `{reason}`" ) await log(interaction, moderation_id) @@ -1019,28 +880,42 @@ class Aurora(commands.Cog): export: bool Exports the server's entire moderation history to a JSON file""" if ephemeral is None: - ephemeral = await config.user(interaction.user).history_ephemeral() or await config.guild(interaction.guild).history_ephemeral() or False + ephemeral = ( + await config.user(interaction.user).history_ephemeral() + or await config.guild(interaction.guild).history_ephemeral() + or False + ) if inline is None: - inline = await config.user(interaction.user).history_inline() or await config.guild(interaction.guild).history_inline() or False + inline = ( + await config.user(interaction.user).history_inline() + or await config.guild(interaction.guild).history_inline() + or False + ) if pagesize is None: if inline is True: - pagesize = await config.user(interaction.user).history_inline_pagesize() or await config.guild(interaction.guild).history_inline_pagesize() or 6 + pagesize = ( + await config.user(interaction.user).history_inline_pagesize() + or await config.guild(interaction.guild).history_inline_pagesize() + or 6 + ) else: - pagesize = await config.user(interaction.user).history_pagesize() or await config.guild(interaction.guild).history_pagesize() or 5 + pagesize = ( + await config.user(interaction.user).history_pagesize() + or await config.guild(interaction.guild).history_pagesize() + or 5 + ) await interaction.response.defer(ephemeral=ephemeral) permissions = check_permissions( - interaction.client.user, - ["embed_links"], - interaction, + interaction.client.user, ["embed_links"], interaction ) if permissions: await interaction.followup.send( error( - f"I do not have the `{permissions}` permission, required for this action.", + f"I do not have the `{permissions}` permission, required for this action." ), ephemeral=True, ) @@ -1065,15 +940,18 @@ class Aurora(commands.Cog): cases.append(case) try: - filename = str(data_manager.cog_data_path(cog_instance=self)) + str(os.sep) + f"moderation_{interaction.guild.id}.json" + filename = ( + str(data_manager.cog_data_path(cog_instance=self)) + + str(os.sep) + + f"moderation_{interaction.guild.id}.json" + ) with open(filename, "w", encoding="utf-8") as f: json.dump(cases, f, indent=2) await interaction.followup.send( file=discord.File( - filename, - f"moderation_{interaction.guild.id}.json", + filename, f"moderation_{interaction.guild.id}.json" ), ephemeral=ephemeral, ) @@ -1082,7 +960,7 @@ class Aurora(commands.Cog): except json.JSONDecodeError as e: await interaction.followup.send( content=error( - "An error occured while exporting the moderation history.\nError:\n", + "An error occured while exporting the moderation history.\nError:\n" ) + box(e, "py"), ephemeral=ephemeral, @@ -1128,7 +1006,7 @@ class Aurora(commands.Cog): embed = discord.Embed(color=await self.bot.get_embed_color(interaction.channel)) embed.set_author(icon_url=interaction.guild.icon.url, name="Infraction History") embed.set_footer( - text=f"Page {page:,}/{page_quantity:,} | {case_quantity:,} Results", + text=f"Page {page:,}/{page_quantity:,} | {case_quantity:,} Results" ) memory_dict = {} @@ -1137,30 +1015,33 @@ class Aurora(commands.Cog): if case["target_id"] not in memory_dict: if case["target_type"] == "USER": memory_dict[str(case["target_id"])] = await fetch_user_dict( - interaction.client, - case["target_id"], + interaction.client, case["target_id"] ) elif case["target_type"] == "CHANNEL": memory_dict[str(case["target_id"])] = await fetch_channel_dict( - interaction.guild, - case["target_id"], + interaction.guild, case["target_id"] ) target_user = memory_dict[str(case["target_id"])] if case["target_type"] == "USER": - target_name = f"`{target_user['name']}`" if target_user["discriminator"] == "0" else f"`{target_user['name']}#{target_user['discriminator']}`" + target_name = ( + f"`{target_user['name']}`" + if target_user["discriminator"] == "0" + else f"`{target_user['name']}#{target_user['discriminator']}`" + ) elif case["target_type"] == "CHANNEL": target_name = f"`{target_user['mention']}`" - else: - target_name = "" if case["moderator_id"] not in memory_dict: memory_dict[str(case["moderator_id"])] = await fetch_user_dict( - interaction.client, - case["moderator_id"], + interaction.client, case["moderator_id"] ) moderator_user = memory_dict[str(case["moderator_id"])] - moderator_name = f"`{moderator_user['name']}`" if moderator_user["discriminator"] == "0" else f"`{moderator_user['name']}#{moderator_user['discriminator']}`" + moderator_name = ( + f"`{moderator_user['name']}`" + if moderator_user["discriminator"] == "0" + else f"`{moderator_user['name']}#{moderator_user['discriminator']}`" + ) field_name = f"Case #{case['moderation_id']:,} ({str.title(case['moderation_type'])})" field_value = f"**Target:** {target_name} ({target_user['id']})\n**Moderator:** {moderator_name} ({moderator_user['id']})" @@ -1175,15 +1056,20 @@ class Aurora(commands.Cog): **{ unit: int(val) for unit, val in zip( - ["hours", "minutes", "seconds"], - case["duration"].split(":"), + ["hours", "minutes", "seconds"], case["duration"].split(":") ) - }, + } + ) + duration_embed = ( + f"{humanize_timedelta(timedelta=td)} | " + if bool(case["expired"]) is False + else f"{humanize_timedelta(timedelta=td)} | Expired" ) - duration_embed = f"{humanize_timedelta(timedelta=td)} | " if bool(case["expired"]) is False else f"{humanize_timedelta(timedelta=td)} | Expired" field_value += f"\n**Duration:** {duration_embed}" - field_value += f"\n**Timestamp:** | " + field_value += ( + f"\n**Timestamp:** | " + ) if case["role_id"] != "0": role = interaction.guild.get_role(int(case["role_id"])) @@ -1201,10 +1087,7 @@ class Aurora(commands.Cog): @app_commands.command(name="resolve") async def resolve( - self, - interaction: discord.Interaction, - case: int, - reason: str = None, + self, interaction: discord.Interaction, case: int, reason: str = None ): """Resolve a specific case. @@ -1222,7 +1105,7 @@ class Aurora(commands.Cog): if permissions: await interaction.response.send_message( error( - f"I do not have the `{permissions}` permission, required for this action.", + f"I do not have the `{permissions}` permission, required for this action." ), ephemeral=True, ) @@ -1231,7 +1114,9 @@ class Aurora(commands.Cog): database = connect() cursor = database.cursor() - query_1 = f"SELECT * FROM moderation_{interaction.guild.id} WHERE moderation_id = ?;" + query_1 = ( + f"SELECT * FROM moderation_{interaction.guild.id} WHERE moderation_id = ?;" + ) cursor.execute(query_1, (case,)) result_1 = cursor.fetchone() if result_1 is None or case == 0: @@ -1247,7 +1132,7 @@ class Aurora(commands.Cog): if result_2 is None: await interaction.response.send_message( content=error( - f"This moderation has already been resolved!\nUse `/case {case}` for more information.", + f"This moderation has already been resolved!\nUse `/case {case}` for more information." ), ephemeral=True, ) @@ -1261,7 +1146,7 @@ class Aurora(commands.Cog): if len(changes) > 25: await interaction.response.send_message( content=error( - "Due to limitations with Discord's embed system, you cannot edit a case more than 25 times.", + "Due to limitations with Discord's embed system, you cannot edit a case more than 25 times." ), ephemeral=True, ) @@ -1273,7 +1158,7 @@ class Aurora(commands.Cog): "timestamp": case_dict["timestamp"], "reason": case_dict["reason"], "user_id": case_dict["moderator_id"], - }, + } ) changes.append( { @@ -1281,7 +1166,7 @@ class Aurora(commands.Cog): "timestamp": int(time.time()), "reason": reason, "user_id": interaction.user.id, - }, + } ) if case_dict["moderation_type"] in ["UNMUTE", "UNBAN"]: @@ -1295,12 +1180,11 @@ class Aurora(commands.Cog): if case_dict["moderation_type"] == "MUTE": try: member = await interaction.guild.fetch_member( - case_dict["target_id"], + case_dict["target_id"] ) await member.timeout( - None, - reason=f"Case #{case:,} resolved by {interaction.user.id}", + None, reason=f"Case #{case:,} resolved by {interaction.user.id}" ) except discord.NotFound: pass @@ -1310,8 +1194,7 @@ class Aurora(commands.Cog): user = await interaction.client.fetch_user(case_dict["target_id"]) await interaction.guild.unban( - user, - reason=f"Case #{case} resolved by {interaction.user.id}", + user, reason=f"Case #{case} resolved by {interaction.user.id}" ) except discord.NotFound: pass @@ -1336,8 +1219,7 @@ class Aurora(commands.Cog): case_dict=await fetch_case(case, interaction.guild.id), ) await interaction.response.send_message( - content=f"✅ Moderation #{case:,} resolved!", - embed=embed, + content=f"✅ Moderation #{case:,} resolved!", embed=embed ) await log(interaction, case, resolved=True) @@ -1349,7 +1231,7 @@ class Aurora(commands.Cog): export=[ Choice(name="Export as File", value="file"), Choice(name="Export as Codeblock", value="codeblock"), - ], + ] ) async def case( self, @@ -1373,35 +1255,41 @@ class Aurora(commands.Cog): export: bool Export the case to a JSON file or codeblock""" permissions = check_permissions( - interaction.client.user, - ["embed_links"], - interaction, + interaction.client.user, ["embed_links"], interaction ) if permissions: await interaction.response.send_message( error( - f"I do not have the `{permissions}` permission, required for this action.", + f"I do not have the `{permissions}` permission, required for this action." ), ephemeral=True, ) return if ephemeral is None: - ephemeral = await config.user(interaction.user).history_ephemeral() or await config.guild(interaction.guild).history_ephemeral() or False + ephemeral = ( + await config.user(interaction.user).history_ephemeral() + or await config.guild(interaction.guild).history_ephemeral() + or False + ) if case != 0: case_dict = await fetch_case(case, interaction.guild.id) if case_dict: if export: if export.value == "file" or len(str(case_dict)) > 1800: - filename = str(data_manager.cog_data_path(cog_instance=self)) + str(os.sep) + f"moderation_{interaction.guild.id}_case_{case}.json" + filename = ( + str(data_manager.cog_data_path(cog_instance=self)) + + str(os.sep) + + f"moderation_{interaction.guild.id}_case_{case}.json" + ) with open(filename, "w", encoding="utf-8") as f: json.dump(case_dict, f, indent=2) if export.value == "codeblock": content = f"Case #{case:,} exported.\n" + warning( - "Case was too large to export as codeblock, so it has been uploaded as a `.json` file.", + "Case was too large to export as codeblock, so it has been uploaded as a `.json` file." ) else: content = f"Case #{case:,} exported." @@ -1418,41 +1306,34 @@ class Aurora(commands.Cog): os.remove(filename) return await interaction.response.send_message( - content=box(json.dumps(case_dict, indent=2), "json"), + content=box({json.dumps(case_dict, indent=2)}), ephemeral=ephemeral, ) return if changes: embed = await changes_factory( - interaction=interaction, - case_dict=case_dict, + interaction=interaction, case_dict=case_dict ) await interaction.response.send_message( - embed=embed, - ephemeral=ephemeral, + embed=embed, ephemeral=ephemeral ) elif evidenceformat: content = await evidenceformat_factory( - interaction=interaction, - case_dict=case_dict, + interaction=interaction, case_dict=case_dict ) await interaction.response.send_message( - content=content, - ephemeral=ephemeral, + content=content, ephemeral=ephemeral ) else: embed = await case_factory( - interaction=interaction, - case_dict=case_dict, + interaction=interaction, case_dict=case_dict ) await interaction.response.send_message( - embed=embed, - ephemeral=ephemeral, + embed=embed, ephemeral=ephemeral ) return await interaction.response.send_message( - content=f"No case with case number `{case}` found.", - ephemeral=True, + content=f"No case with case number `{case}` found.", ephemeral=True ) @app_commands.command(name="edit") @@ -1474,16 +1355,13 @@ class Aurora(commands.Cog): duration: str What is the new duration? Does not reapply the moderation if it has already expired. """ - end_timestamp = None permissions = check_permissions( - interaction.client.user, - ["embed_links"], - interaction, + interaction.client.user, ["embed_links"], interaction ) if permissions: await interaction.response.send_message( error( - f"I do not have the `{permissions}` permission, required for this action.", + f"I do not have the `{permissions}` permission, required for this action." ), ephemeral=True, ) @@ -1497,25 +1375,26 @@ class Aurora(commands.Cog): parsed_time = parse_timedelta(duration) if parsed_time is None: await interaction.response.send_message( - error("Please provide a valid duration!"), - ephemeral=True, + error("Please provide a valid duration!"), ephemeral=True ) return end_timestamp = case_dict["timestamp"] + parsed_time.total_seconds() if case_dict["moderation_type"] == "MUTE": - if (time.time() - case_dict["timestamp"]) + parsed_time.total_seconds() > 2419200: + if ( + time.time() - case_dict["timestamp"] + ) + parsed_time.total_seconds() > 2419200: await interaction.response.send_message( error( - "Please provide a duration that is less than 28 days from the initial moderation.", - ), + "Please provide a duration that is less than 28 days from the initial moderation." + ) ) return try: member = await interaction.guild.fetch_member( - case_dict["target_id"], + case_dict["target_id"] ) await member.timeout( @@ -1529,7 +1408,7 @@ class Aurora(commands.Cog): if len(changes) > 25: await interaction.response.send_message( content=error( - "Due to limitations with Discord's embed system, you cannot edit a case more than 25 times.", + "Due to limitations with Discord's embed system, you cannot edit a case more than 25 times." ), ephemeral=True, ) @@ -1543,10 +1422,9 @@ class Aurora(commands.Cog): "user_id": case_dict["moderator_id"], "duration": case_dict["duration"], "end_timestamp": case_dict["end_timestamp"], - }, + } ) if parsed_time: - assert end_timestamp is not None changes.append( { "type": "EDIT", @@ -1555,7 +1433,7 @@ class Aurora(commands.Cog): "user_id": interaction.user.id, "duration": convert_timedelta_to_str(parsed_time), "end_timestamp": end_timestamp, - }, + } ) else: changes.append( @@ -1566,7 +1444,7 @@ class Aurora(commands.Cog): "user_id": interaction.user.id, "duration": case_dict["duration"], "end_timestamp": case_dict["end_timestamp"], - }, + } ) database = connect() @@ -1603,8 +1481,7 @@ class Aurora(commands.Cog): database.close() return await interaction.response.send_message( - content=error(f"No case with case number `{case}` found."), - ephemeral=True, + content=error(f"No case with case number `{case}` found."), ephemeral=True ) @tasks.loop(minutes=1) @@ -1613,9 +1490,7 @@ class Aurora(commands.Cog): current_time = time.time() database = connect() cursor = database.cursor() - global_unban_num = 0 - global_addrole_num = 0 - global_removerole_num = 0 + global_num = 0 guilds: list[discord.Guild] = self.bot.guilds for guild in guilds: @@ -1633,14 +1508,17 @@ class Aurora(commands.Cog): target_ids = [row[0] for row in result] moderation_ids = [row[1] for row in result] - unban_num = 0 + num = 0 for target_id, moderation_id in zip(target_ids, moderation_ids): user: discord.User = await self.bot.fetch_user(target_id) - name = f"{user.name}#{user.discriminator}" if user.discriminator != "0" else user.name + name = ( + f"{user.name}#{user.discriminator}" + if user.discriminator != "0" + else user.name + ) try: await guild.unban( - user, - reason=f"Automatic unban from case #{moderation_id}", + user, reason=f"Automatic unban from case #{moderation_id}" ) embed = await message_factory( @@ -1651,7 +1529,7 @@ class Aurora(commands.Cog): ) try: - await user.send(embed=embed, file=get_footer_image(self)) + await user.send(embed=embed) except discord.errors.HTTPException: pass @@ -1662,7 +1540,7 @@ class Aurora(commands.Cog): guild.name, guild.id, ) - unban_num = unban_num + 1 + num = num + 1 except ( discord.errors.NotFound, discord.errors.Forbidden, @@ -1677,93 +1555,44 @@ class Aurora(commands.Cog): e, ) - removerole_num = 0 - addrole_query = f"SELECT target_id, moderation_id, role_id FROM moderation_{guild.id} WHERE end_timestamp != 0 AND end_timestamp <= ? AND moderation_type = 'ADDROLE' AND expired = 0" - try: - cursor.execute(addrole_query, (time.time(),)) - result = cursor.fetchall() - except sqlite3.OperationalError: - continue - target_ids = [row[0] for row in result] - moderation_ids = [row[1] for row in result] - role_ids = [row[2] for row in result] - - for target_id, moderation_id, role_id in zip( - target_ids, - moderation_ids, - role_ids, - ): - try: - member = await guild.fetch_member(target_id) - - await member.remove_roles( - Object(role_id), - reason=f"Automatic role removal from case #{moderation_id}", - ) - - removerole_num = removerole_num + 1 - except ( - discord.errors.NotFound, - discord.errors.Forbidden, - discord.errors.HTTPException, - ) as e: - logger.error( - "Removing the role %s from user %s failed due to: \n%s", - role_id, - target_id, - e, - ) - continue - - addrole_num = 0 - removerole_query = f"SELECT target_id, moderation_id, role_id FROM moderation_{guild.id} WHERE end_timestamp != 0 AND end_timestamp <= ? AND moderation_type = 'REMOVEROLE' AND expired = 0" - try: - cursor.execute(removerole_query, (time.time(),)) - result = cursor.fetchall() - except sqlite3.OperationalError: - continue - target_ids = [row[0] for row in result] - moderation_ids = [row[1] for row in result] - role_ids = [row[2] for row in result] - - for target_id, moderation_id, role_id in zip( - target_ids, - moderation_ids, - role_ids, - ): - try: - member = await guild.fetch_member(target_id) - - await member.add_roles( - Object(role_id), - reason=f"Automatic role addition from case #{moderation_id}", - ) - - addrole_num = addrole_num + 1 - except ( - discord.errors.NotFound, - discord.errors.Forbidden, - discord.errors.HTTPException, - ) as e: - logger.error("Adding the role %s to user %s failed due to: \n%s", role_id, target_id, e) - continue - - expiry_query = f"UPDATE `moderation_{guild.id}` SET expired = 1 WHERE (end_timestamp != 0 AND end_timestamp <= ? AND expired = 0) OR (expired = 0 AND resolved = 1);" + expiry_query = f"UPDATE `moderation_{guild.id}` SET expired = 1 WHERE (end_timestamp != 0 AND end_timestamp <= ? AND expired = 0 AND moderation_type != 'BLACKLIST') OR (expired = 0 AND resolved = 1 AND moderation_type != 'BLACKLIST')" cursor.execute(expiry_query, (time.time(),)) + blacklist_query = f"SELECT target_id, moderation_id, role_id FROM moderation_{guild.id} WHERE end_timestamp != 0 AND end_timestamp <= ? AND moderation_type = 'BLACKLIST' AND expired = 0" + try: + cursor.execute(blacklist_query, (time.time(),)) + result = cursor.fetchall() + except sqlite3.OperationalError: + continue + target_ids = [row[0] for row in result] + moderation_ids = [row[1] for row in result] + role_ids = [row[2] for row in result] + + for target_id, moderation_id, role_id in zip( + target_ids, moderation_ids, role_ids + ): + try: + # member: discord.Member = await guild.fetch_member(target_id) + + role: discord.Role = guild.get_role(role_id) + if role is None: + raise discord.errors.NotFound + except ( + discord.errors.NotFound, + discord.errors.Forbidden, + discord.errors.HTTPException, + ): + continue + per_guild_completion_time = (time.time() - time_per_guild) * 1000 logger.debug( - "Completed expiry loop for %s (%s) in %sms with %s users unbanned, %s roles added, and %s roles removed", + "Completed expiry loop for %s (%s) in %sms with %s users unbanned", guild.name, guild.id, f"{per_guild_completion_time:.6f}", - unban_num, - addrole_num, - removerole_num, + num, ) - global_unban_num = global_unban_num + unban_num - global_addrole_num = global_addrole_num + addrole_num - global_removerole_num = global_removerole_num + removerole_num + global_num = global_num + num database.commit() cursor.close() @@ -1771,11 +1600,9 @@ class Aurora(commands.Cog): completion_time = (time.time() - current_time) * 1000 logger.debug( - "Completed expiry loop in %sms with %s users unbanned, %s roles added, and %s roles removed", + "Completed expiry loop in %sms with %s users unbanned", f"{completion_time:.6f}", - global_unban_num, - global_addrole_num, - global_removerole_num, + global_num, ) ######################################################################################################################## @@ -1793,16 +1620,14 @@ class Aurora(commands.Cog): @aurora_settings.command(name="overrides", aliases=["override", "user"]) async def aurora_settings_overrides(self, ctx: commands.Context): """Manage Aurora's user overriddable settings.""" - msg = await ctx.send(embed=await overrides_embed(ctx)) - await msg.edit(view=Overrides(ctx, msg, 60)) + await ctx.send(embed=await overrides_embed(ctx), view=Overrides(ctx)) @aurora_settings.command(name="guild", aliases=["server"]) @commands.admin_or_permissions(manage_guild=True) @commands.guild_only() async def aurora_settings_guild(self, ctx: commands.Context): """Manage Aurora's guild settings.""" - msg = await ctx.send(embed=await guild_embed(ctx)) - await msg.edit(view=Guild(ctx, msg, 60)) + await ctx.send(embed=await guild_embed(ctx), view=Guild(ctx)) @aurora_settings.command(name="addrole", aliases=["removerole"]) @commands.admin_or_permissions(manage_guild=True) @@ -1811,16 +1636,14 @@ class Aurora(commands.Cog): """Manage the addrole whitelist. Roles added to this list are also applied to `/removerole`.""" - msg = await ctx.send(embed=await addrole_embed(ctx)) - await msg.edit(view=Addrole(ctx, msg, 60)) + await ctx.send(embed=await addrole_embed(ctx), view=Addrole(ctx)) @aurora_settings.command(name="immunity") @commands.admin_or_permissions(manage_guild=True) @commands.guild_only() async def aurora_settings_immunity(self, ctx: commands.Context): """Manage the immunity whitelist.""" - msg = await ctx.send(embed=await immune_embed(ctx)) - await msg.edit(view=Immune(ctx, msg, 60)) + await ctx.send(embed=await immune_embed(ctx), view=Immune(ctx)) @aurora.group(autohelp=True, name="import") @commands.admin() @@ -1832,11 +1655,15 @@ class Aurora(commands.Cog): @commands.admin() async def aurora_import_aurora(self, ctx: commands.Context): """Import moderation history from another bot using Aurora.""" - if ctx.message.attachments and ctx.message.attachments[0].content_type == "application/json; charset=utf-8": + if ( + ctx.message.attachments + and ctx.message.attachments[0].content_type + == "application/json; charset=utf-8" + ): message = await ctx.send( warning( - "Are you sure you want to import moderations from another bot?\n**This will overwrite any moderations that already exist in this guild's moderation table.**\n*The import process will block the rest of your bot until it is complete.*", - ), + "Are you sure you want to import moderations from another bot?\n**This will overwrite any moderations that already exist in this guild's moderation table.**\n*The import process will block the rest of your bot until it is complete.*" + ) ) await message.edit(view=ImportAuroraView(60, ctx, message)) else: @@ -1846,16 +1673,20 @@ class Aurora(commands.Cog): @commands.admin() async def aurora_import_galacticbot(self, ctx: commands.Context): """Import moderation history from GalacticBot.""" - if ctx.message.attachments and ctx.message.attachments[0].content_type == "application/json; charset=utf-8": + if ( + ctx.message.attachments + and ctx.message.attachments[0].content_type + == "application/json; charset=utf-8" + ): message = await ctx.send( warning( - "Are you sure you want to import GalacticBot moderations?\n**This will overwrite any moderations that already exist in this guild's moderation table.**\n*The import process will block the rest of your bot until it is complete.*", - ), + "Are you sure you want to import GalacticBot moderations?\n**This will overwrite any moderations that already exist in this guild's moderation table.**\n*The import process will block the rest of your bot until it is complete.*" + ) ) await message.edit(view=ImportGalacticBotView(60, ctx, message)) else: await ctx.send( - error("Please provide a valid GalacticBot moderation export file."), + error("Please provide a valid GalacticBot moderation export file.") ) @aurora.command(aliases=["tdc", "td", "timedeltaconvert"]) diff --git a/aurora/data/arrow.png b/aurora/data/arrow.png deleted file mode 100644 index aedf12e..0000000 Binary files a/aurora/data/arrow.png and /dev/null differ diff --git a/aurora/importers/aurora.py b/aurora/importers/aurora.py index af0b639..a4857aa 100644 --- a/aurora/importers/aurora.py +++ b/aurora/importers/aurora.py @@ -17,9 +17,13 @@ class ImportAuroraView(ui.View): self.message: Message = message @ui.button(label="Yes", style=ButtonStyle.success) - async def import_button_y(self, interaction: Interaction, button: ui.Button): # pylint: disable=unused-argument + async def import_button_y( + self, interaction: Interaction, button: ui.Button + ): # pylint: disable=unused-argument await self.message.delete() - await interaction.response.send_message("Deleting original table...", ephemeral=True) + await interaction.response.send_message( + "Deleting original table...", ephemeral=True + ) database = connect() cursor = database.cursor() @@ -39,7 +43,7 @@ class ImportAuroraView(ui.View): file = await self.ctx.message.attachments[0].read() data: list[dict] = sorted(json.loads(file), key=lambda x: x["moderation_id"]) - user_mod_types = ["NOTE", "WARN", "ADDROLE", "REMOVEROLE", "MUTE", "UNMUTE", "KICK", "TEMPBAN", "BAN", "UNBAN"] + user_mod_types = ["NOTE", "WARN", "MUTE", "UNMUTE", "KICK", "BAN", "UNBAN"] channel_mod_types = ["SLOWMODE", "LOCKDOWN"] @@ -54,8 +58,6 @@ class ImportAuroraView(ui.View): case["target_type"] = "USER" elif case["moderation_type"] in channel_mod_types: case["target_type"] = "CHANNEL" - else: - case["target_type"] = "USER" if "role_id" not in case or not case["role_id"]: case["role_id"] = 0 @@ -97,10 +99,16 @@ class ImportAuroraView(ui.View): await interaction.edit_original_response(content="Import complete.") if failed_cases: - await interaction.edit_original_response(content="Import complete.\n" + warning("Failed to import the following cases:\n") + box(failed_cases)) + await interaction.edit_original_response( + content="Import complete.\n" + + warning("Failed to import the following cases:\n") + + box(failed_cases) + ) @ui.button(label="No", style=ButtonStyle.danger) - async def import_button_n(self, interaction: Interaction, button: ui.Button): # pylint: disable=unused-argument + async def import_button_n( + self, interaction: Interaction, button: ui.Button + ): # pylint: disable=unused-argument await self.message.edit(content="Import cancelled.", view=None) await self.message.delete(10) await self.ctx.message.delete(10) diff --git a/aurora/importers/galacticbot.py b/aurora/importers/galacticbot.py index 39c2c2d..c6e0b99 100644 --- a/aurora/importers/galacticbot.py +++ b/aurora/importers/galacticbot.py @@ -16,9 +16,13 @@ class ImportGalacticBotView(ui.View): self.message: Message = message @ui.button(label="Yes", style=ButtonStyle.success) - async def import_button_y(self, interaction: Interaction, button: ui.Button): # pylint: disable=unused-argument + async def import_button_y( + self, interaction: Interaction, button: ui.Button + ): # pylint: disable=unused-argument await self.message.delete() - await interaction.response.send_message("Deleting original table...", ephemeral=True) + await interaction.response.send_message( + "Deleting original table...", ephemeral=True + ) database = connect() cursor = database.cursor() @@ -88,7 +92,9 @@ class ImportGalacticBotView(ui.View): if resolved_by is None: resolved_by = "?" if resolved_reason is None: - resolved_reason = "Could not get resolve reason during moderation import." + resolved_reason = ( + "Could not get resolve reason during moderation import." + ) if resolved_timestamp is None: resolved_timestamp = timestamp changes = [ @@ -136,10 +142,16 @@ class ImportGalacticBotView(ui.View): await interaction.edit_original_response(content="Import complete.") if failed_cases: - await interaction.edit_original_response(content="Import complete.\n" + warning("Failed to import the following cases:\n") + box(failed_cases)) + await interaction.edit_original_response( + content="Import complete.\n" + + warning("Failed to import the following cases:\n") + + box(failed_cases) + ) @ui.button(label="No", style=ButtonStyle.danger) - async def import_button_n(self, interaction: Interaction, button: ui.Button): # pylint: disable=unused-argument + async def import_button_n( + self, interaction: Interaction, button: ui.Button + ): # pylint: disable=unused-argument await self.message.edit(content="Import cancelled.", view=None) await self.message.delete(10) await self.ctx.message.delete(10) diff --git a/aurora/info.json b/aurora/info.json index de475f2..52a577e 100644 --- a/aurora/info.json +++ b/aurora/info.json @@ -1,6 +1,6 @@ { - "author" : ["cswimr"], - "install_msg" : "Thank you for installing Aurora!\nMost of this cog's functionality requires enabling slash commands.\nYou can find the source code of this cog [here](https://coastalcommits.com/cswimr/SeaCogs).", + "author" : ["SeaswimmerTheFsh (seasw.)"], + "install_msg" : "Thank you for installing Aurora!\nMost of this cog's functionality requires enabling slash commands.\nYou can find the source code of this cog [here](https://coastalcommits.com/SeaswimmerTheFsh/SeaCogs).", "name" : "Aurora", "short" : "A full replacement for Red's core Mod cogs.", "description" : "Aurora is a fully-featured moderation system. It is heavily inspired by GalacticBot, and is designed to be a more user-friendly alternative to Red's core Mod cogs. This cog stores all of its data in an SQLite database.", diff --git a/aurora/menus/addrole.py b/aurora/menus/addrole.py index fa45b87..69f9574 100644 --- a/aurora/menus/addrole.py +++ b/aurora/menus/addrole.py @@ -1,4 +1,4 @@ -from discord import ButtonStyle, Interaction, Message, ui +from discord import ButtonStyle, Interaction, ui from redbot.core import commands from redbot.core.utils.chat_formatting import error @@ -7,14 +7,9 @@ from aurora.utilities.factory import addrole_embed class Addrole(ui.View): - def __init__(self, ctx: commands.Context, message: Message, timeout: int = None): + def __init__(self, ctx: commands.Context): super().__init__() self.ctx = ctx - self.message = message - self.timeout = timeout - - async def on_timeout(self): - await self.message.edit(view=None) @ui.select(cls=ui.RoleSelect, placeholder="Select a role", min_values=0, max_values=25) async def addrole_select(self, interaction: Interaction, select: ui.RoleSelect): @@ -23,7 +18,7 @@ class Addrole(ui.View): return await interaction.response.defer() async with config.guild(self.ctx.guild).addrole_whitelist() as addrole_whitelist: - addrole_whitelist: list # type hint + addrole_whitelist: list # type hint for value in select.values: if value.id in addrole_whitelist: addrole_whitelist.remove(value.id) @@ -32,7 +27,7 @@ class Addrole(ui.View): await interaction.message.edit(embed=await addrole_embed(self.ctx)) @ui.button(label="Clear", style=ButtonStyle.red, row=1) - async def clear(self, interaction: Interaction, button: ui.Button): # pylint: disable=unused-argument + async def clear(self, interaction: Interaction, button: ui.Button): # pylint: disable=unused-argument if not interaction.user.guild_permissions.manage_guild and not interaction.user.guild_permissions.administrator: await interaction.response.send_message(error("You must have the manage guild permission to clear the guild's addrole whitelist."), ephemeral=True) return @@ -41,7 +36,7 @@ class Addrole(ui.View): await interaction.message.edit(embed=await addrole_embed(self.ctx)) @ui.button(label="Close", style=ButtonStyle.gray) - async def close(self, interaction: Interaction, button: ui.Button): # pylint: disable=unused-argument + async def close(self, interaction: Interaction, button: ui.Button): # pylint: disable=unused-argument if not interaction.user.guild_permissions.manage_guild and not interaction.user.guild_permissions.administrator: await interaction.response.send_message(error("You can't do that!"), ephemeral=True) return diff --git a/aurora/menus/guild.py b/aurora/menus/guild.py index dbc26e0..4f5544d 100644 --- a/aurora/menus/guild.py +++ b/aurora/menus/guild.py @@ -1,4 +1,4 @@ -from discord import ButtonStyle, Interaction, Message, ui +from discord import ButtonStyle, Interaction, ui from redbot.core import commands from aurora.utilities.config import config @@ -7,27 +7,22 @@ from aurora.utilities.utils import create_pagesize_options class Guild(ui.View): - def __init__(self, ctx: commands.Context, message: Message, timeout: int = None): + def __init__(self, ctx: commands.Context): super().__init__() self.ctx = ctx - self.message = message - self.timeout = timeout - - async def on_timeout(self): - await self.message.edit(view=None) @ui.button(label="Show Moderator", style=ButtonStyle.green, row=0) - async def show_moderator(self, interaction: Interaction, button: ui.Button): # pylint: disable=unused-argument + async def show_moderator(self, interaction: Interaction, button: ui.Button): # pylint: disable=unused-argument if not interaction.user.guild_permissions.manage_guild and not interaction.user.guild_permissions.administrator: await interaction.response.send_message("You must have the manage guild permission to change this setting.", ephemeral=True) return await interaction.response.defer() - current_setting = await config.guild(interaction.guild).show_moderator() + current_setting = await config.guild(interaction.guild).show_moderator await config.guild(interaction.guild).show_moderator.set(not current_setting) await interaction.message.edit(embed=await guild_embed(self.ctx)) @ui.button(label="Use Discord Permissions", style=ButtonStyle.green, row=0) - async def use_discord_permissions(self, interaction: Interaction, button: ui.Button): # pylint: disable=unused-argument + async def use_discord_permissions(self, interaction: Interaction, button: ui.Button): # pylint: disable=unused-argument if not interaction.user.guild_permissions.manage_guild and not interaction.user.guild_permissions.administrator: await interaction.response.send_message("You must have the manage guild permission to change this setting.", ephemeral=True) return @@ -37,7 +32,7 @@ class Guild(ui.View): await interaction.message.edit(embed=await guild_embed(self.ctx)) @ui.button(label="Respect Hierarchy", style=ButtonStyle.green, row=0) - async def respect_heirarchy(self, interaction: Interaction, button: ui.Button): # pylint: disable=unused-argument + async def respect_heirarchy(self, interaction: Interaction, button: ui.Button): # pylint: disable=unused-argument if not interaction.user.guild_permissions.manage_guild and not interaction.user.guild_permissions.administrator: await interaction.response.send_message("You must have the manage guild permission to change this setting.", ephemeral=True) return @@ -47,7 +42,7 @@ class Guild(ui.View): await interaction.message.edit(embed=await guild_embed(self.ctx)) @ui.button(label="Ignore Modlog", style=ButtonStyle.green, row=0) - async def ignore_modlog(self, interaction: Interaction, button: ui.Button): # pylint: disable=unused-argument + async def ignore_modlog(self, interaction: Interaction, button: ui.Button): # pylint: disable=unused-argument if not interaction.user.guild_permissions.manage_guild and not interaction.user.guild_permissions.administrator: await interaction.response.send_message("You must have the manage guild permission to change this setting.", ephemeral=True) return @@ -57,7 +52,7 @@ class Guild(ui.View): await interaction.message.edit(embed=await guild_embed(self.ctx)) @ui.button(label="Ignore Other Bots", style=ButtonStyle.green, row=0) - async def ignore_other_bots(self, interaction: Interaction, button: ui.Button): # pylint: disable=unused-argument + async def ignore_other_bots(self, interaction: Interaction, button: ui.Button): # pylint: disable=unused-argument if not interaction.user.guild_permissions.manage_guild and not interaction.user.guild_permissions.administrator: await interaction.response.send_message("You must have the manage guild permission to change this setting.", ephemeral=True) return @@ -67,7 +62,7 @@ class Guild(ui.View): await interaction.message.edit(embed=await guild_embed(self.ctx)) @ui.button(label="DM Users", style=ButtonStyle.green, row=1) - async def dm_users(self, interaction: Interaction, button: ui.Button): # pylint: disable=unused-argument + async def dm_users(self, interaction: Interaction, button: ui.Button): # pylint: disable=unused-argument if not interaction.user.guild_permissions.manage_guild and not interaction.user.guild_permissions.administrator: await interaction.response.send_message("You must have the manage guild permission to change this setting.", ephemeral=True) return @@ -77,7 +72,7 @@ class Guild(ui.View): await interaction.message.edit(embed=await guild_embed(self.ctx)) @ui.button(label="Auto Evidence Format", style=ButtonStyle.green, row=1) - async def auto_evidenceformat(self, interaction: Interaction, button: ui.Button): # pylint: disable=unused-argument + async def auto_evidenceformat(self, interaction: Interaction, button: ui.Button): # pylint: disable=unused-argument if not interaction.user.guild_permissions.manage_guild and not interaction.user.guild_permissions.administrator: await interaction.response.send_message("You must have the manage guild permission to change this setting.", ephemeral=True) return @@ -87,7 +82,7 @@ class Guild(ui.View): await interaction.message.edit(embed=await guild_embed(self.ctx)) @ui.button(label="Ephemeral", style=ButtonStyle.green, row=1) - async def ephemeral(self, interaction: Interaction, button: ui.Button): # pylint: disable=unused-argument + async def ephemeral(self, interaction: Interaction, button: ui.Button): # pylint: disable=unused-argument if not interaction.user.guild_permissions.manage_guild and not interaction.user.guild_permissions.administrator: await interaction.response.send_message("You must have the manage guild permission to change this setting.", ephemeral=True) return @@ -97,7 +92,7 @@ class Guild(ui.View): await interaction.message.edit(embed=await guild_embed(self.ctx)) @ui.button(label="History Inline", style=ButtonStyle.green, row=1) - async def inline(self, interaction: Interaction, button: ui.Button): # pylint: disable=unused-argument + async def inline(self, interaction: Interaction, button: ui.Button): # pylint: disable=unused-argument if not interaction.user.guild_permissions.manage_guild and not interaction.user.guild_permissions.administrator: await interaction.response.send_message("You must have the manage guild permission to change this setting.", ephemeral=True) return @@ -107,11 +102,7 @@ class Guild(ui.View): await interaction.message.edit(embed=await guild_embed(self.ctx)) @ui.select(placeholder="History Pagesize", options=create_pagesize_options(), row=2) - async def pagesize( - self, - interaction: Interaction, - select: ui.Select, - ): + async def pagesize(self, interaction: Interaction, select: ui.Select,): if not interaction.user.guild_permissions.manage_guild and not interaction.user.guild_permissions.administrator: await interaction.response.send_message("You must have the manage guild permission to change this setting.", ephemeral=True) return @@ -123,11 +114,7 @@ class Guild(ui.View): await interaction.message.edit(embed=await guild_embed(self.ctx)) @ui.select(placeholder="History Inline Pagesize", options=create_pagesize_options(), row=3) - async def inline_pagesize( - self, - interaction: Interaction, - select: ui.Select, - ): + async def inline_pagesize(self, interaction: Interaction, select: ui.Select,): if not interaction.user.guild_permissions.manage_guild and not interaction.user.guild_permissions.administrator: await interaction.response.send_message("You must have the manage guild permission to change this setting.", ephemeral=True) return diff --git a/aurora/menus/immune.py b/aurora/menus/immune.py index 891b1b5..15bf0c7 100644 --- a/aurora/menus/immune.py +++ b/aurora/menus/immune.py @@ -1,4 +1,4 @@ -from discord import ButtonStyle, Interaction, Message, ui +from discord import ButtonStyle, Interaction, ui from redbot.core import commands from redbot.core.utils.chat_formatting import error @@ -7,14 +7,9 @@ from aurora.utilities.factory import immune_embed class Immune(ui.View): - def __init__(self, ctx: commands.Context, message: Message, timeout: int = None): + def __init__(self, ctx: commands.Context): super().__init__() self.ctx = ctx - self.message = message - self.timeout = timeout - - async def on_timeout(self): - await self.message.edit(view=None) @ui.select(cls=ui.RoleSelect, placeholder="Select a role", min_values=0, max_values=25) async def immune_select(self, interaction: Interaction, select: ui.RoleSelect): @@ -23,7 +18,7 @@ class Immune(ui.View): return await interaction.response.defer() async with config.guild(self.ctx.guild).immune_roles() as immune_roles: - immune_roles: list # type hint + immune_roles: list # type hint for value in select.values: if value.id in immune_roles: immune_roles.remove(value.id) @@ -32,7 +27,7 @@ class Immune(ui.View): await interaction.message.edit(embed=await immune_embed(self.ctx)) @ui.button(label="Clear", style=ButtonStyle.red, row=1) - async def clear(self, interaction: Interaction, button: ui.Button): # pylint: disable=unused-argument + async def clear(self, interaction: Interaction, button: ui.Button): # pylint: disable=unused-argument if not interaction.user.guild_permissions.manage_guild and not interaction.user.guild_permissions.administrator: await interaction.response.send_message(error("You must have the manage guild permission to clear the guild's immune roles."), ephemeral=True) return @@ -41,7 +36,7 @@ class Immune(ui.View): await interaction.message.edit(embed=await immune_embed(self.ctx)) @ui.button(label="Close", style=ButtonStyle.gray) - async def close(self, interaction: Interaction, button: ui.Button): # pylint: disable=unused-argument + async def close(self, interaction: Interaction, button: ui.Button): # pylint: disable=unused-argument if not interaction.user.guild_permissions.manage_guild and not interaction.user.guild_permissions.administrator: await interaction.response.send_message(error("You can't do that!"), ephemeral=True) return diff --git a/aurora/menus/overrides.py b/aurora/menus/overrides.py index 1c270f5..d98a208 100644 --- a/aurora/menus/overrides.py +++ b/aurora/menus/overrides.py @@ -1,4 +1,4 @@ -from discord import ButtonStyle, Interaction, Message, ui +from discord import ButtonStyle, Interaction, ui from redbot.core import commands from aurora.utilities.config import config @@ -7,17 +7,12 @@ from aurora.utilities.utils import create_pagesize_options class Overrides(ui.View): - def __init__(self, ctx: commands.Context, message: Message, timeout: int = None): + def __init__(self, ctx: commands.Context): super().__init__() self.ctx = ctx - self.message = message - self.timeout = timeout - - async def on_timeout(self): - await self.message.edit(view=None) @ui.button(label="Auto Evidence Format", style=ButtonStyle.green, row=0) - async def auto_evidenceformat(self, interaction: Interaction, button: ui.Button): # pylint: disable=unused-argument + async def auto_evidenceformat(self, interaction: Interaction, button: ui.Button): # pylint: disable=unused-argument if self.ctx.author != interaction.user: await interaction.response.send_message("You cannot change this setting for other users.", ephemeral=True) return @@ -32,7 +27,7 @@ class Overrides(ui.View): await interaction.message.edit(embed=await overrides_embed(self.ctx)) @ui.button(label="Ephemeral", style=ButtonStyle.green, row=0) - async def ephemeral(self, interaction: Interaction, button: ui.Button): # pylint: disable=unused-argument + async def ephemeral(self, interaction: Interaction, button: ui.Button): # pylint: disable=unused-argument if self.ctx.author != interaction.user: await interaction.response.send_message("You cannot change this setting for other users.", ephemeral=True) return @@ -47,7 +42,7 @@ class Overrides(ui.View): await interaction.message.edit(embed=await overrides_embed(self.ctx)) @ui.button(label="Inline", style=ButtonStyle.green, row=0) - async def inline(self, interaction: Interaction, button: ui.Button): # pylint: disable=unused-argument + async def inline(self, interaction: Interaction, button: ui.Button): # pylint: disable=unused-argument if self.ctx.author != interaction.user: await interaction.response.send_message("You cannot change this setting for other users.", ephemeral=True) return @@ -62,11 +57,7 @@ class Overrides(ui.View): await interaction.message.edit(embed=await overrides_embed(self.ctx)) @ui.select(placeholder="Inline Pagesize", options=create_pagesize_options(), row=1) - async def inline_pagesize( - self, - interaction: Interaction, - select: ui.Select, - ): + async def inline_pagesize(self, interaction: Interaction, select: ui.Select,): if self.ctx.author != interaction.user: await interaction.response.send_message("You cannot change this setting for other users.", ephemeral=True) return @@ -78,11 +69,7 @@ class Overrides(ui.View): await interaction.message.edit(embed=await overrides_embed(self.ctx)) @ui.select(placeholder="Pagesize", options=create_pagesize_options(), row=2) - async def pagesize( - self, - interaction: Interaction, - select: ui.Select, - ): + async def pagesize(self, interaction: Interaction, select: ui.Select,): if self.ctx.author != interaction.user: await interaction.response.send_message("You cannot change this setting for other users.", ephemeral=True) return diff --git a/aurora/utilities/database.py b/aurora/utilities/database.py index aa876e8..a2bcb92 100644 --- a/aurora/utilities/database.py +++ b/aurora/utilities/database.py @@ -8,18 +8,23 @@ from discord import Guild from redbot.core import data_manager from .logger import logger -from .utils import convert_timedelta_to_str, generate_dict, get_next_case_number +from .utils import (convert_timedelta_to_str, generate_dict, + get_next_case_number) def connect() -> sqlite3.Connection: """Connects to the SQLite database, and returns a connection object.""" try: - return sqlite3.connect(database=data_manager.cog_data_path(raw_name="Aurora") / "aurora.db") + connection = sqlite3.connect( + database=data_manager.cog_data_path(raw_name="Aurora") / "aurora.db" + ) + return connection except sqlite3.OperationalError as e: logger.error("Unable to access the SQLite database!\nError:\n%s", e.msg) - msg = f"Unable to access the SQLite Database!\n{e.msg}" - raise ConnectionRefusedError(msg) from e + raise ConnectionRefusedError( + f"Unable to access the SQLite Database!\n{e.msg}" + ) from e async def create_guild_table(guild: Guild): diff --git a/aurora/utilities/factory.py b/aurora/utilities/factory.py index 4c54a1d..3cfaf9e 100644 --- a/aurora/utilities/factory.py +++ b/aurora/utilities/factory.py @@ -2,12 +2,16 @@ from datetime import datetime, timedelta from typing import Union -from discord import Color, Embed, Guild, Interaction, InteractionMessage, Member, Role, User +from discord import (Color, Embed, Guild, Interaction, InteractionMessage, + Member, Role, User) from redbot.core import commands -from redbot.core.utils.chat_formatting import bold, box, error, humanize_timedelta, warning +from redbot.core.utils.chat_formatting import (bold, box, error, + humanize_timedelta, warning) from aurora.utilities.config import config -from aurora.utilities.utils import fetch_channel_dict, fetch_user_dict, get_bool_emoji, get_next_case_number, get_pagesize_str +from aurora.utilities.utils import (fetch_channel_dict, fetch_user_dict, + get_bool_emoji, get_next_case_number, + get_pagesize_str) async def message_factory( @@ -46,8 +50,6 @@ async def message_factory( else: guild_name = guild.name - title = moderation_type - if moderation_type in ["tempbanned", "muted"] and duration: embed_duration = f" for {humanize_timedelta(timedelta=duration)}" else: @@ -57,17 +59,13 @@ async def message_factory( embed_desc = "received a" elif moderation_type == "addrole": embed_desc = f"received the {role.name} role" - title = "Role Added" - moderation_type = "" elif moderation_type == "removerole": embed_desc = f"lost the {role.name} role" - title = "Role Removed" - moderation_type = "" else: embed_desc = "been" embed = Embed( - title=str.title(title), + title=str.title(moderation_type), description=f"You have {embed_desc} {moderation_type}{embed_duration} in {guild_name}.", color=color, timestamp=datetime.now(), @@ -75,9 +73,7 @@ async def message_factory( if await config.guild(guild).show_moderator() and moderator is not None: embed.add_field( - name="Moderator", - value=f"`{moderator.name} ({moderator.id})`", - inline=False, + name="Moderator", value=f"`{moderator.name} ({moderator.id})`", inline=False ) embed.add_field(name="Reason", value=f"`{reason}`", inline=False) @@ -89,16 +85,14 @@ async def message_factory( embed.set_footer( text=f"Case #{await get_next_case_number(guild.id):,}", - icon_url="attachment://arrow.png", + icon_url="https://cdn.discordapp.com/attachments/1070822161389994054/1159469476773904414/arrow-right-circle-icon-512x512-2p1e2aaw.png?ex=65312319&is=651eae19&hm=3cebdd28e805c13a79ec48ef87c32ca532ffa6b9ede2e48d0cf8e5e81f3a6818&", ) return embed async def log_factory( - interaction: Interaction, - case_dict: dict, - resolved: bool = False, + interaction: Interaction, case_dict: dict, resolved: bool = False ) -> Embed: """This function creates a log embed from set parameters, meant for moderation logging. @@ -107,11 +101,14 @@ async def log_factory( case_dict (dict): The case dictionary. resolved (bool, optional): Whether the case is resolved or not. Defaults to False. """ - target_name = "" if resolved: if case_dict["target_type"] == "USER": target_user = await fetch_user_dict(interaction.client, case_dict["target_id"]) - target_name = f"`{target_user['name']}`" if target_user["discriminator"] == "0" else f"`{target_user['name']}#{target_user['discriminator']}`" + target_name = ( + f"`{target_user['name']}`" + if target_user["discriminator"] == "0" + else f"`{target_user['name']}#{target_user['discriminator']}`" + ) elif case_dict["target_type"] == "CHANNEL": target_user = await fetch_channel_dict(interaction.guild, case_dict["target_id"]) if target_user["mention"]: @@ -120,7 +117,11 @@ async def log_factory( target_name = f"`{target_user['name']}`" moderator_user = await fetch_user_dict(interaction.client, case_dict["moderator_id"]) - moderator_name = f"`{moderator_user['name']}`" if moderator_user["discriminator"] == "0" else f"`{moderator_user['name']}#{moderator_user['discriminator']}`" + moderator_name = ( + f"`{moderator_user['name']}`" + if moderator_user["discriminator"] == "0" + else f"`{moderator_user['name']}#{moderator_user['discriminator']}`" + ) embed = Embed( title=f"📕 Case #{case_dict['moderation_id']:,} Resolved", @@ -137,24 +138,40 @@ async def log_factory( ["hours", "minutes", "seconds"], case_dict["duration"].split(":"), ) - }, + } + ) + duration_embed = ( + f"{humanize_timedelta(timedelta=td)} | " + if case_dict["expired"] == "0" + else str(humanize_timedelta(timedelta=td)) + ) + embed.description = ( + embed.description + + f"\n**Duration:** {duration_embed}\n**Expired:** {bool(case_dict['expired'])}" ) - duration_embed = f"{humanize_timedelta(timedelta=td)} | " if case_dict["expired"] == "0" else str(humanize_timedelta(timedelta=td)) - embed.description = embed.description + f"\n**Duration:** {duration_embed}\n**Expired:** {bool(case_dict['expired'])}" embed.add_field(name="Reason", value=box(case_dict["reason"]), inline=False) resolved_user = await fetch_user_dict(interaction.client, case_dict["resolved_by"]) - resolved_name = resolved_user["name"] if resolved_user["discriminator"] == "0" else f"{resolved_user['name']}#{resolved_user['discriminator']}" + resolved_name = ( + resolved_user["name"] + if resolved_user["discriminator"] == "0" + else f"{resolved_user['name']}#{resolved_user['discriminator']}" + ) embed.add_field( name="Resolve Reason", - value=f"Resolved by `{resolved_name}` ({resolved_user['id']}) for:\n" + box(case_dict["resolve_reason"]), + value=f"Resolved by `{resolved_name}` ({resolved_user['id']}) for:\n" + + box(case_dict["resolve_reason"]), inline=False, ) else: if case_dict["target_type"] == "USER": target_user = await fetch_user_dict(interaction.client, case_dict["target_id"]) - target_name = f"`{target_user['name']}`" if target_user["discriminator"] == "0" else f"`{target_user['name']}#{target_user['discriminator']}`" + target_name = ( + f"`{target_user['name']}`" + if target_user["discriminator"] == "0" + else f"`{target_user['name']}#{target_user['discriminator']}`" + ) elif case_dict["target_type"] == "CHANNEL": target_user = await fetch_channel_dict(interaction.guild, case_dict["target_id"]) if target_user["mention"]: @@ -163,7 +180,11 @@ async def log_factory( target_name = f"`{target_user['name']}`" moderator_user = await fetch_user_dict(interaction.client, case_dict["moderator_id"]) - moderator_name = f"`{moderator_user['name']}`" if moderator_user["discriminator"] == "0" else f"`{moderator_user['name']}#{moderator_user['discriminator']}`" + moderator_name = ( + f"`{moderator_user['name']}`" + if moderator_user["discriminator"] == "0" + else f"`{moderator_user['name']}#{moderator_user['discriminator']}`" + ) embed = Embed( title=f"📕 Case #{case_dict['moderation_id']:,}", @@ -179,9 +200,12 @@ async def log_factory( ["hours", "minutes", "seconds"], case_dict["duration"].split(":"), ) - }, + } + ) + embed.description = ( + embed.description + + f"\n**Duration:** {humanize_timedelta(timedelta=td)} | " ) - embed.description = embed.description + f"\n**Duration:** {humanize_timedelta(timedelta=td)} | " embed.add_field(name="Reason", value=box(case_dict["reason"]), inline=False) return embed @@ -194,10 +218,13 @@ async def case_factory(interaction: Interaction, case_dict: dict) -> Embed: interaction (Interaction): The interaction object. case_dict (dict): The case dictionary. """ - target_name = "" if case_dict["target_type"] == "USER": target_user = await fetch_user_dict(interaction.client, case_dict["target_id"]) - target_name = f"`{target_user['name']}`" if target_user["discriminator"] == "0" else f"`{target_user['name']}#{target_user['discriminator']}`" + target_name = ( + f"`{target_user['name']}`" + if target_user["discriminator"] == "0" + else f"`{target_user['name']}#{target_user['discriminator']}`" + ) elif case_dict["target_type"] == "CHANNEL": target_user = await fetch_channel_dict(interaction.guild, case_dict["target_id"]) if target_user["mention"]: @@ -206,7 +233,11 @@ async def case_factory(interaction: Interaction, case_dict: dict) -> Embed: target_name = f"`{target_user['name']}`" moderator_user = await fetch_user_dict(interaction.client, case_dict["moderator_id"]) - moderator_name = f"`{moderator_user['name']}`" if moderator_user["discriminator"] == "0" else f"`{moderator_user['name']}#{moderator_user['discriminator']}`" + moderator_name = ( + f"`{moderator_user['name']}`" + if moderator_user["discriminator"] == "0" + else f"`{moderator_user['name']}#{moderator_user['discriminator']}`" + ) embed = Embed( title=f"📕 Case #{case_dict['moderation_id']:,}", @@ -219,28 +250,38 @@ async def case_factory(interaction: Interaction, case_dict: dict) -> Embed: **{ unit: int(val) for unit, val in zip( - ["hours", "minutes", "seconds"], - case_dict["duration"].split(":"), + ["hours", "minutes", "seconds"], case_dict["duration"].split(":") ) - }, + } + ) + duration_embed = ( + f"{humanize_timedelta(timedelta=td)} | " + if bool(case_dict["expired"]) is False + else str(humanize_timedelta(timedelta=td)) ) - duration_embed = f"{humanize_timedelta(timedelta=td)} | " if bool(case_dict["expired"]) is False else str(humanize_timedelta(timedelta=td)) embed.description += f"\n**Duration:** {duration_embed}\n**Expired:** {bool(case_dict['expired'])}" - embed.description += f"\n**Changes:** {len(case_dict['changes']) - 1}" if case_dict["changes"] else "\n**Changes:** 0" - - if case_dict["role_id"]: - embed.description += f"\n**Role:** <@&{case_dict['role_id']}>" + embed.description += ( + f"\n**Changes:** {len(case_dict['changes']) - 1}" + if case_dict["changes"] + else "\n**Changes:** 0" + ) if case_dict["metadata"]: if case_dict["metadata"]["imported_from"]: - embed.description += f"\n**Imported From:** {case_dict['metadata']['imported_from']}" + embed.description += ( + f"\n**Imported From:** {case_dict['metadata']['imported_from']}" + ) embed.add_field(name="Reason", value=box(case_dict["reason"]), inline=False) if case_dict["resolved"] == 1: resolved_user = await fetch_user_dict(interaction.client, case_dict["resolved_by"]) - resolved_name = f"`{resolved_user['name']}`" if resolved_user["discriminator"] == "0" else f"`{resolved_user['name']}#{resolved_user['discriminator']}`" + resolved_name = ( + f"`{resolved_user['name']}`" + if resolved_user["discriminator"] == "0" + else f"`{resolved_user['name']}#{resolved_user['discriminator']}`" + ) embed.add_field( name="Resolve Reason", value=f"Resolved by {resolved_name} ({resolved_user['id']}) for:\n{box(case_dict['resolve_reason'])}", @@ -268,12 +309,15 @@ async def changes_factory(interaction: Interaction, case_dict: dict) -> Embed: for change in case_dict["changes"]: if change["user_id"] not in memory_dict: memory_dict[str(change["user_id"])] = await fetch_user_dict( - interaction.client, - change["user_id"], + interaction.client, change["user_id"] ) user = memory_dict[str(change["user_id"])] - name = user["name"] if user["discriminator"] == "0" else f"{user['name']}#{user['discriminator']}" + name = ( + user["name"] + if user["discriminator"] == "0" + else f"{user['name']}#{user['discriminator']}" + ) timestamp = f" | " @@ -311,24 +355,27 @@ async def evidenceformat_factory(interaction: Interaction, case_dict: dict) -> s interaction (Interaction): The interaction object. case_dict (dict): The case dictionary. """ - target_name = "" if case_dict["target_type"] == "USER": target_user = await fetch_user_dict(interaction.client, case_dict["target_id"]) - target_name = target_user["name"] if target_user["discriminator"] == "0" else f"{target_user['name']}#{target_user['discriminator']}" + target_name = ( + target_user["name"] + if target_user["discriminator"] == "0" + else f"{target_user['name']}#{target_user['discriminator']}" + ) elif case_dict["target_type"] == "CHANNEL": target_user = await fetch_channel_dict(interaction.guild, case_dict["target_id"]) target_name = target_user["name"] moderator_user = await fetch_user_dict(interaction.client, case_dict["moderator_id"]) - moderator_name = moderator_user["name"] if moderator_user["discriminator"] == "0" else f"{moderator_user['name']}#{moderator_user['discriminator']}" + moderator_name = ( + moderator_user["name"] + if moderator_user["discriminator"] == "0" + else f"{moderator_user['name']}#{moderator_user['discriminator']}" + ) content = f"Case: {case_dict['moderation_id']:,} ({str.title(case_dict['moderation_type'])})\nTarget: {target_name} ({target_user['id']})\nModerator: {moderator_name} ({moderator_user['id']})" - if case_dict["role_id"] != "0": - role = interaction.guild.get_role(int(case_dict["role_id"])) - content += "\nRole: " + (role.name if role is not None else case_dict["role_id"]) - if case_dict["duration"] != "NULL": hours, minutes, seconds = map(int, case_dict["duration"].split(":")) td = timedelta(hours=hours, minutes=minutes, seconds=seconds) @@ -363,11 +410,17 @@ async def overrides_embed(ctx: commands.Context) -> Embed: } override_str = [ - "- " + bold("Auto Evidence Format: ") + get_bool_emoji(override_settings["auto_evidenceformat"]), + "- " + + bold("Auto Evidence Format: ") + + get_bool_emoji(override_settings["auto_evidenceformat"]), "- " + bold("Ephemeral: ") + get_bool_emoji(override_settings["ephemeral"]), "- " + bold("History Inline: ") + get_bool_emoji(override_settings["inline"]), - "- " + bold("History Inline Pagesize: ") + get_pagesize_str(override_settings["inline_pagesize"]), - "- " + bold("History Pagesize: ") + get_pagesize_str(override_settings["pagesize"]), + "- " + + bold("History Inline Pagesize: ") + + get_pagesize_str(override_settings["inline_pagesize"]), + "- " + + bold("History Pagesize: ") + + get_pagesize_str(override_settings["pagesize"]), ] override_str = "\n".join(override_str) @@ -389,7 +442,7 @@ async def guild_embed(ctx: commands.Context) -> Embed: guild_settings = { "show_moderator": await config.guild(ctx.guild).show_moderator(), "use_discord_permissions": await config.guild( - ctx.guild, + ctx.guild ).use_discord_permissions(), "ignore_modlog": await config.guild(ctx.guild).ignore_modlog(), "ignore_other_bots": await config.guild(ctx.guild).ignore_other_bots(), @@ -399,7 +452,7 @@ async def guild_embed(ctx: commands.Context) -> Embed: "history_inline": await config.guild(ctx.guild).history_inline(), "history_pagesize": await config.guild(ctx.guild).history_pagesize(), "history_inline_pagesize": await config.guild( - ctx.guild, + ctx.guild ).history_inline_pagesize(), "auto_evidenceformat": await config.guild(ctx.guild).auto_evidenceformat(), "respect_hierarchy": await config.guild(ctx.guild).respect_hierarchy(), @@ -412,17 +465,37 @@ async def guild_embed(ctx: commands.Context) -> Embed: channel = channel.mention guild_str = [ - "- " + bold("Show Moderator: ") + get_bool_emoji(guild_settings["show_moderator"]), - "- " + bold("Use Discord Permissions: ") + get_bool_emoji(guild_settings["use_discord_permissions"]), - "- " + bold("Respect Hierarchy: ") + get_bool_emoji(guild_settings["respect_hierarchy"]), - "- " + bold("Ignore Modlog: ") + get_bool_emoji(guild_settings["ignore_modlog"]), - "- " + bold("Ignore Other Bots: ") + get_bool_emoji(guild_settings["ignore_other_bots"]), + "- " + + bold("Show Moderator: ") + + get_bool_emoji(guild_settings["show_moderator"]), + "- " + + bold("Use Discord Permissions: ") + + get_bool_emoji(guild_settings["use_discord_permissions"]), + "- " + + bold("Respect Hierarchy: ") + + get_bool_emoji(guild_settings["respect_hierarchy"]), + "- " + + bold("Ignore Modlog: ") + + get_bool_emoji(guild_settings["ignore_modlog"]), + "- " + + bold("Ignore Other Bots: ") + + get_bool_emoji(guild_settings["ignore_other_bots"]), "- " + bold("DM Users: ") + get_bool_emoji(guild_settings["dm_users"]), - "- " + bold("Auto Evidence Format: ") + get_bool_emoji(guild_settings["auto_evidenceformat"]), - "- " + bold("Ephemeral: ") + get_bool_emoji(guild_settings["history_ephemeral"]), - "- " + bold("History Inline: ") + get_bool_emoji(guild_settings["history_inline"]), - "- " + bold("History Pagesize: ") + get_pagesize_str(guild_settings["history_pagesize"]), - "- " + bold("History Inline Pagesize: ") + get_pagesize_str(guild_settings["history_inline_pagesize"]), + "- " + + bold("Auto Evidence Format: ") + + get_bool_emoji(guild_settings["auto_evidenceformat"]), + "- " + + bold("Ephemeral: ") + + get_bool_emoji(guild_settings["history_ephemeral"]), + "- " + + bold("History Inline: ") + + get_bool_emoji(guild_settings["history_inline"]), + "- " + + bold("History Pagesize: ") + + get_pagesize_str(guild_settings["history_pagesize"]), + "- " + + bold("History Inline Pagesize: ") + + get_pagesize_str(guild_settings["history_inline_pagesize"]), "- " + bold("Log Channel: ") + channel, ] guild_str = "\n".join(guild_str) @@ -446,21 +519,17 @@ async def addrole_embed(ctx: commands.Context) -> Embed: for role in whitelist: evalulated_role = ctx.guild.get_role(role) or error(f"`{role}` (Not Found)") if isinstance(evalulated_role, Role): - roles.append( - { - "id": evalulated_role.id, - "mention": evalulated_role.mention, - "position": evalulated_role.position, - }, - ) + roles.append({ + "id": evalulated_role.id, + "mention": evalulated_role.mention, + "position": evalulated_role.position + }) else: - roles.append( - { - "id": role, - "mention": error(f"`{role}` (Not Found)"), - "position": 0, - }, - ) + roles.append({ + "id": role, + "mention": error(f"`{role}` (Not Found)"), + "position": 0 + }) if roles: roles = sorted(roles, key=lambda x: x["position"], reverse=True) @@ -471,7 +540,9 @@ async def addrole_embed(ctx: commands.Context) -> Embed: e = await _config(ctx) e.title += ": Addrole Whitelist" - e.description = "Use the select menu below to manage this guild's addrole whitelist." + e.description = ( + "Use the select menu below to manage this guild's addrole whitelist." + ) if len(whitelist_str) > 4000 and len(whitelist_str) < 5000: lines = whitelist_str.split("\n") @@ -501,21 +572,17 @@ async def immune_embed(ctx: commands.Context) -> Embed: for role in immune_roles: evalulated_role = ctx.guild.get_role(role) or error(f"`{role}` (Not Found)") if isinstance(evalulated_role, Role): - roles.append( - { - "id": evalulated_role.id, - "mention": evalulated_role.mention, - "position": evalulated_role.position, - }, - ) + roles.append({ + "id": evalulated_role.id, + "mention": evalulated_role.mention, + "position": evalulated_role.position + }) else: - roles.append( - { - "id": role, - "mention": error(f"`{role}` (Not Found)"), - "position": 0, - }, - ) + roles.append({ + "id": role, + "mention": error(f"`{role}` (Not Found)"), + "position": 0 + }) if roles: roles = sorted(roles, key=lambda x: x["position"], reverse=True) diff --git a/aurora/utilities/utils.py b/aurora/utilities/utils.py index 049eb0d..616fa78 100644 --- a/aurora/utilities/utils.py +++ b/aurora/utilities/utils.py @@ -5,9 +5,9 @@ from datetime import timedelta as td from typing import Optional, Union from dateutil.relativedelta import relativedelta as rd -from discord import File, Guild, Interaction, Member, SelectOption, User +from discord import Guild, Interaction, Member, SelectOption, User from discord.errors import Forbidden, NotFound -from redbot.core import commands, data_manager +from redbot.core import commands from redbot.core.utils.chat_formatting import error from .config import config @@ -32,17 +32,24 @@ def check_permissions( raise (KeyError) for permission in permissions: - if not getattr(resolved_permissions, permission, False) and resolved_permissions.administrator is not True: + if ( + not getattr(resolved_permissions, permission, False) + and resolved_permissions.administrator is not True + ): return permission return False -async def check_moddable(target: Union[User, Member], interaction: Interaction, permissions: list) -> bool: +async def check_moddable( + target: Union[User, Member], interaction: Interaction, permissions: list +) -> bool: """Checks if a moderator can moderate a target.""" if check_permissions(interaction.client.user, permissions, guild=interaction.guild): await interaction.response.send_message( - error(f"I do not have the `{permissions}` permission, required for this action."), + error( + f"I do not have the `{permissions}` permission, required for this action." + ), ephemeral=True, ) return False @@ -50,30 +57,43 @@ async def check_moddable(target: Union[User, Member], interaction: Interaction, if await config.guild(interaction.guild).use_discord_permissions() is True: if check_permissions(interaction.user, permissions, guild=interaction.guild): await interaction.response.send_message( - error(f"You do not have the `{permissions}` permission, required for this action."), + error( + f"You do not have the `{permissions}` permission, required for this action." + ), ephemeral=True, ) return False if interaction.user.id == target.id: - await interaction.response.send_message(content="You cannot moderate yourself!", ephemeral=True) + await interaction.response.send_message( + content="You cannot moderate yourself!", ephemeral=True + ) return False if target.bot: - await interaction.response.send_message(content="You cannot moderate bots!", ephemeral=True) + await interaction.response.send_message( + content="You cannot moderate bots!", ephemeral=True + ) return False if isinstance(target, Member): if interaction.user.top_role <= target.top_role and await config.guild(interaction.guild).respect_hierarchy() is True: await interaction.response.send_message( - content=error("You cannot moderate members with a higher role than you!"), + content=error( + "You cannot moderate members with a higher role than you!" + ), ephemeral=True, ) return False - if interaction.guild.get_member(interaction.client.user.id).top_role <= target.top_role: + if ( + interaction.guild.get_member(interaction.client.user.id).top_role + <= target.top_role + ): await interaction.response.send_message( - content=error("You cannot moderate members with a role higher than the bot!"), + content=error( + "You cannot moderate members with a role higher than the bot!" + ), ephemeral=True, ) return False @@ -98,13 +118,15 @@ async def get_next_case_number(guild_id: str, cursor=None) -> int: if not cursor: database = connect() cursor = database.cursor() - cursor.execute(f"SELECT moderation_id FROM `moderation_{guild_id}` ORDER BY moderation_id DESC LIMIT 1") + cursor.execute( + f"SELECT moderation_id FROM `moderation_{guild_id}` ORDER BY moderation_id DESC LIMIT 1" + ) result = cursor.fetchone() return (result[0] + 1) if result else 1 def generate_dict(result) -> dict: - return { + case = { "moderation_id": result[0], "timestamp": result[1], "moderation_type": result[2], @@ -122,6 +144,7 @@ def generate_dict(result) -> dict: "changes": json.loads(result[14]), "metadata": json.loads(result[15]), } + return case async def fetch_user_dict(client: commands.Bot, user_id: str) -> dict: @@ -148,6 +171,7 @@ async def fetch_user_dict(client: commands.Bot, user_id: str) -> dict: "discriminator": "0", } + return user_dict @@ -174,9 +198,11 @@ async def fetch_role_dict(guild: Guild, role_id: int) -> dict: """This function returns a dictionary containing either role information or a standard deleted role template.""" role = guild.get_role(int(role_id)) if not role: - pass + role_dict = {"id": role_id, "name": "Deleted Role"} - return {"id": role.id, "name": role.name} + role_dict = {"id": role.id, "name": role.name} + + return role_dict async def log(interaction: Interaction, moderation_id: int, resolved: bool = False) -> None: @@ -190,7 +216,9 @@ async def log(interaction: Interaction, moderation_id: int, resolved: bool = Fal case = await fetch_case(moderation_id, interaction.guild.id) if case: - embed = await log_factory(interaction=interaction, case_dict=case, resolved=resolved) + embed = await log_factory( + interaction=interaction, case_dict=case, resolved=resolved + ) try: await logging_channel.send(embed=embed) except Forbidden: @@ -201,7 +229,11 @@ async def send_evidenceformat(interaction: Interaction, case_dict: dict) -> None """This function sends an ephemeral message to the moderator who took the moderation action, with a pre-made codeblock for use in the mod-evidence channel.""" from .factory import evidenceformat_factory - send_evidence_bool = await config.user(interaction.user).auto_evidenceformat() or await config.guild(interaction.guild).auto_evidenceformat() or False + send_evidence_bool = ( + await config.user(interaction.user).auto_evidenceformat() + or await config.guild(interaction.guild).auto_evidenceformat() + or False + ) if send_evidence_bool is False: return @@ -242,20 +274,20 @@ def create_pagesize_options() -> list[SelectOption]: label="Default", value="default", description="Reset the pagesize to the default value.", - ), + ) ) - options.extend(SelectOption(label=str(i), value=str(i), description=f"Set the pagesize to {i}") for i in range(1, 21)) + for i in range(1, 21): + options.append( + SelectOption( + label=str(i), + value=str(i), + description=f"Set the pagesize to {i}.", + ) + ) return options - def timedelta_from_relativedelta(relativedelta: rd) -> td: """Converts a relativedelta object to a timedelta object.""" now = datetime.now() then = now - relativedelta return now - then - - -def get_footer_image(coginstance: commands.Cog) -> File: - """Returns the footer image for the embeds.""" - image_path = data_manager.bundled_data_path(coginstance) / "arrow.png" - return File(image_path, filename="arrow.png", description="arrow") diff --git a/backup/backup.py b/backup/backup.py index 5133b43..7fe9b4d 100644 --- a/backup/backup.py +++ b/backup/backup.py @@ -14,19 +14,15 @@ from redbot.cogs.downloader import errors from redbot.cogs.downloader.converters import InstalledCog from redbot.core import commands from redbot.core.bot import Red -from redbot.core.utils.chat_formatting import bold, error, humanize_list, text_to_file +from redbot.core.utils.chat_formatting import error, humanize_list, text_to_file -# Disable Ruff & Pylint complaining about accessing private members -# That's kind of necessary for this cog to function because the Downloader cog has a limited public API -# ruff: noqa: SLF001 # Private member access # pylint: disable=protected-access class Backup(commands.Cog): """A utility to make reinstalling repositories and cogs after migrating the bot far easier.""" - __author__ = ["[cswimr](https://www.coastalcommits.com/cswimr)"] - __git__ = "https://www.coastalcommits.com/cswimr/SeaCogs" - __version__ = "1.1.4" + __author__ = ["SeaswimmerTheFsh"] + __version__ = "1.1.0" __documentation__ = "https://seacogs.coastalcommits.com/backup/" def __init__(self, bot: Red): @@ -39,24 +35,28 @@ class Backup(commands.Cog): n = "\n" if "\n\n" not in pre_processed else "" text = [ f"{pre_processed}{n}", - f"{bold('Cog Version:')} [{self.__version__}]({self.__git__})", - f"{bold('Author:')} {humanize_list(self.__author__)}", - f"{bold('Documentation:')} {self.__documentation__}", + f"Cog Version: **{self.__version__}**", + f"Author: {humanize_list(self.__author__)}", + f"Documentation: {self.__documentation__}", ] return "\n".join(text) - @commands.group(autohelp=True) # type: ignore + @commands.group(autohelp=True) @commands.is_owner() - async def backup(self, ctx: commands.Context) -> None: + async def backup(self, ctx: commands.Context): """Backup your installed cogs.""" @backup.command(name="export") @commands.is_owner() - async def backup_export(self, ctx: commands.Context) -> None: + async def backup_export(self, ctx: commands.Context): """Export your installed repositories and cogs to a file.""" downloader = ctx.bot.get_cog("Downloader") if downloader is None: - await ctx.send(error(f"You do not have the `Downloader` cog loaded. Please run `{ctx.prefix}load downloader` and try again.")) + await ctx.send( + error( + f"You do not have the `Downloader` cog loaded. Please run `{ctx.prefix}load downloader` and try again." + ) + ) return all_repos = list(downloader._repo_manager.repos) @@ -77,7 +77,7 @@ class Backup(commands.Cog): if cog.repo_name == repo.name: cog_dict = { "name": cog.name, - # "loaded": cog.name in ctx.bot.extensions.keys(), # noqa: ERA001 + # "loaded": cog.name in ctx.bot.extensions.keys(), # this functionality was planned but never implemented due to Red limitations # and the possibility of restoration functionality being added to Core "pinned": cog.pinned, @@ -87,24 +87,30 @@ class Backup(commands.Cog): export_data.append(repo_dict) - await ctx.send(file=text_to_file(json.dumps(export_data, indent=4), "backup.json")) + await ctx.send( + file=text_to_file(json.dumps(export_data, indent=4), "backup.json") + ) @backup.command(name="import") @commands.is_owner() - async def backup_import(self, ctx: commands.Context) -> None: + async def backup_import(self, ctx: commands.Context): """Import your installed repositories and cogs from an export file.""" try: export = json.loads(await ctx.message.attachments[0].read()) except (json.JSONDecodeError, IndexError): try: - export = json.loads(await ctx.message.reference.resolved.attachments[0].read()) # type: ignore - this is fine to let error because it gets handled - except (json.JSONDecodeError, IndexError, AttributeError): + export = json.loads(await ctx.message.reference.resolved.attachments[0].read()) + except (json.JSONDecodeError, IndexError): await ctx.send(error("Please provide a valid JSON export file.")) return downloader = ctx.bot.get_cog("Downloader") if downloader is None: - await ctx.send(error(f"You do not have the `Downloader` cog loaded. Please run `{ctx.prefix}load downloader` and try again.")) + await ctx.send( + error( + f"You do not have the `Downloader` cog loaded. Please run `{ctx.prefix}load downloader` and try again." + ) + ) return repo_s = [] @@ -126,20 +132,32 @@ class Backup(commands.Cog): repo_e.append("PyLav cogs are not supported.") continue if name.startswith(".") or name.endswith("."): - repo_e.append(f"Invalid repository name: {name}\nRepository names cannot start or end with a dot.") + repo_e.append( + f"Invalid repository name: {name}\nRepository names cannot start or end with a dot." + ) continue if re.match(r"^[a-zA-Z0-9_\-\.]+$", name) is None: - repo_e.append(f"Invalid repository name: {name}\nRepository names may only contain letters, numbers, underscores, hyphens, and dots.") + repo_e.append( + f"Invalid repository name: {name}\nRepository names may only contain letters, numbers, underscores, hyphens, and dots." + ) continue try: - repository = await downloader._repo_manager.add_repo(url, name, branch) - repo_s.append(f"Added repository {name} from {url} on branch {branch}.") - self.logger.debug("Added repository %s from %s on branch %s", name, url, branch) + repository = await downloader._repo_manager.add_repo( + url, name, branch + ) + repo_s.append( + f"Added repository {name} from {url} on branch {branch}." + ) + self.logger.debug( + "Added repository %s from %s on branch %s", name, url, branch + ) except errors.ExistingGitRepo: repo_e.append(f"Repository {name} already exists.") - repository = downloader._repo_manager.get_repo(name) + repository = downloader._repo_manager.get_repo( + name + ) self.logger.debug("Repository %s already exists", name) except errors.AuthenticationError as err: @@ -153,7 +171,9 @@ class Backup(commands.Cog): continue except errors.CloningError as err: - repo_e.append(f"Cloning error while adding repository {name}. See logs for more information.") + repo_e.append( + f"Cloning error while adding repository {name}. See logs for more information." + ) self.logger.exception( "Something went wrong whilst cloning %s (to revision %s)", url, @@ -163,7 +183,9 @@ class Backup(commands.Cog): continue except OSError: - repo_e.append(f"OS error while adding repository {name}. See logs for more information.") + repo_e.append( + f"OS error while adding repository {name}. See logs for more information." + ) self.logger.exception( "Something went wrong trying to add repo %s under name %s", url, @@ -174,7 +196,7 @@ class Backup(commands.Cog): cog_modules = [] for cog in cogs: # If you're forking this cog, make sure to change these strings! - if cog["name"] == "backup" and "cswimr/SeaCogs" in url: + if cog["name"] == "backup" and "SeaswimmerTheFsh/SeaCogs" in url: continue try: cog_module = await InstalledCog.convert(ctx, cog["name"]) @@ -183,19 +205,23 @@ class Backup(commands.Cog): continue cog_modules.append(cog_module) - for cog in {cog.name for cog in cog_modules}: + for cog in set(cog.name for cog in cog_modules): poss_installed_path = (await downloader.cog_install_path()) / cog if poss_installed_path.exists(): with contextlib.suppress(commands.ExtensionNotLoaded): await ctx.bot.unload_extension(cog) await ctx.bot.remove_loaded_package(cog) - await downloader._delete_cog(poss_installed_path) + await downloader._delete_cog( + poss_installed_path + ) uninstall_s.append(f"Uninstalled {cog}") self.logger.debug("Uninstalled %s", cog) else: uninstall_e.append(f"Failed to uninstall {cog}") self.logger.warning("Failed to uninstall %s", cog) - await downloader._remove_from_installed(cog_modules) + await downloader._remove_from_installed( + cog_modules + ) for cog in cogs: cog_name = cog["name"] @@ -206,18 +232,28 @@ class Backup(commands.Cog): commit = None # If you're forking this cog, make sure to change these strings! - if cog_name == "backup" and "cswimr/SeaCogs" in url: + if cog_name == "backup" and "SeaswimmerTheFsh/SeaCogs" in url: continue - async with repository.checkout(commit, exit_to_rev=repository.branch): - cogs_c, message = await downloader._filter_incorrect_cogs_by_names(repository, [cog_name]) + async with repository.checkout( + commit, exit_to_rev=repository.branch + ): + cogs_c, message = ( + await downloader._filter_incorrect_cogs_by_names( + repository, [cog_name] + ) + ) if not cogs_c: install_e.append(message) self.logger.error(message) continue - failed_reqs = await downloader._install_requirements(cogs_c) + failed_reqs = await downloader._install_requirements( + cogs_c + ) if failed_reqs: - install_e.append(f"Failed to install {cog_name} due to missing requirements: {failed_reqs}") + install_e.append( + f"Failed to install {cog_name} due to missing requirements: {failed_reqs}" + ) self.logger.error( "Failed to install %s due to missing requirements: %s", cog_name, @@ -225,37 +261,51 @@ class Backup(commands.Cog): ) continue - installed_cogs, failed_cogs = await downloader._install_cogs(cogs_c) + installed_cogs, failed_cogs = await downloader._install_cogs( + cogs_c + ) if repository.available_libraries: - installed_libs, failed_libs = await repository.install_libraries( - target_dir=downloader.SHAREDLIB_PATH, - req_target_dir=downloader.LIB_PATH, + installed_libs, failed_libs = ( + await repository.install_libraries( + target_dir=downloader.SHAREDLIB_PATH, + req_target_dir=downloader.LIB_PATH, + ) ) else: installed_libs = None failed_libs = None if cog_pinned: - for cog in installed_cogs: # noqa: PLW2901 + for cog in installed_cogs: cog.pinned = True - await downloader._save_to_installed(installed_cogs + installed_libs if installed_libs else installed_cogs) + await downloader._save_to_installed( + installed_cogs + installed_libs + if installed_libs + else installed_cogs + ) if installed_cogs: installed_cog_name = installed_cogs[0].name install_s.append(f"Installed {installed_cog_name}") self.logger.debug("Installed %s", installed_cog_name) if installed_libs: for lib in installed_libs: - install_s.append(f"Installed {lib.name} required for {cog_name}") - self.logger.debug("Installed %s required for %s", lib.name, cog_name) + install_s.append( + f"Installed {lib.name} required for {cog_name}" + ) + self.logger.debug( + "Installed %s required for %s", lib.name, cog_name + ) if failed_cogs: failed_cog_name = failed_cogs[0].name install_e.append(f"Failed to install {failed_cog_name}") self.logger.error("Failed to install %s", failed_cog_name) if failed_libs: for lib in failed_libs: - install_e.append(f"Failed to install {lib.name} required for {cog_name}") + install_e.append( + f"Failed to install {lib.name} required for {cog_name}" + ) self.logger.error( "Failed to install %s required for %s", lib.name, diff --git a/backup/info.json b/backup/info.json index a5bd8a5..2fb6c6e 100644 --- a/backup/info.json +++ b/backup/info.json @@ -1,22 +1,15 @@ { - "$schema": "https://raw.githubusercontent.com/Cog-Creators/Red-DiscordBot/refs/heads/V3/develop/schema/red_cog_repo.schema.json", - "author": [ - "cswimr" - ], - "install_msg": "Thank you for installing Backup!\nYou can find the source code of this cog [here](https://coastalcommits.com/cswimr/SeaCogs).", - "name": "Backup", - "short": "A utility to make reinstalling repositories and cogs after migrating the bot far easier.", - "description": "A utility to make reinstalling repositories and cogs after migrating the bot far easier.", - "end_user_data_statement": "This cog does not store end user data.", + "author" : ["SeaswimmerTheFsh (seasw.)"], + "install_msg" : "Thank you for installing Backup!\nYou can find the source code of this cog [here](https://coastalcommits.com/SeaswimmerTheFsh/SeaCogs).", + "name" : "Backup", + "short" : "A utility to make reinstalling repositories and cogs after migrating the bot far easier.", + "description" : "A utility to make reinstalling repositories and cogs after migrating the bot far easier.", + "end_user_data_statement" : "This cog does not store end user data.", "hidden": false, "disabled": false, "min_bot_version": "3.5.6", - "max_bot_version": "3.5.17", - "min_python_version": [ - 3, - 9, - 0 - ], + "max_bot_version": "3.5.9", + "min_python_version": [3, 9, 0], "tags": [ "utility", "backup", diff --git a/bible/bible.py b/bible/bible.py index cd95566..10cc953 100644 --- a/bible/bible.py +++ b/bible/bible.py @@ -6,7 +6,6 @@ # |_____/ \___|\__,_|___/ \_/\_/ |_|_| |_| |_|_| |_| |_|\___|_| import random -from asyncio import create_task from io import BytesIO import aiohttp @@ -16,7 +15,7 @@ from PIL import Image from red_commons.logging import getLogger from redbot.core import Config, commands, data_manager from redbot.core.bot import Red -from redbot.core.utils.chat_formatting import bold, error, humanize_list +from redbot.core.utils.chat_formatting import error, humanize_list import bible.errors from bible.models import Version @@ -25,31 +24,29 @@ from bible.models import Version class Bible(commands.Cog): """Retrieve Bible verses from the API.bible API.""" - __author__ = ["[cswimr](https://www.coastalcommits.com/cswimr)"] - __git__ = "https://www.coastalcommits.com/cswimr/SeaCogs" - __version__ = "1.1.4" - __documentation__ = "https://seacogs.coastalcommits.com/pterodactyl/" + __author__ = ["SeaswimmerTheFsh"] + __version__ = "1.1.0" + __documentation__ = "https://seacogs.coastalcommits.com/bible/" def __init__(self, bot: Red): super().__init__() self.bot = bot self.session = aiohttp.ClientSession() - self.config = Config.get_conf(self, identifier=481923957134912, force_registration=True) + self.config = Config.get_conf( + self, identifier=481923957134912, force_registration=True + ) self.logger = getLogger("red.SeaCogs.Bible") self.config.register_global(bible="de4e12af7f28f599-02") self.config.register_user(bible=None) - async def cog_unload(self): - create_task(self.session.close()) - def format_help_for_context(self, ctx: commands.Context) -> str: pre_processed = super().format_help_for_context(ctx) or "" n = "\n" if "\n\n" not in pre_processed else "" text = [ f"{pre_processed}{n}", - f"{bold('Cog Version:')} [{self.__version__}]({self.__git__})", - f"{bold('Author:')} {humanize_list(self.__author__)}", - f"{bold('Documentation:')} {self.__documentation__}", + f"Cog Version: **{self.__version__}**", + f"Author: {humanize_list(self.__author__)}", + f"Documentation: {self.__documentation__}", ] return "\n".join(text) @@ -59,7 +56,7 @@ class Bible(commands.Cog): image = Image.open(image_path) image = image.convert("RGBA") data = np.array(image) - red, green, blue, alpha = data.T # pylint: disable=unused-variable + red, green, blue, alpha = data.T # pylint: disable=unused-variable white_areas = (red == 255) & (blue == 255) & (green == 255) data[..., :-1][white_areas.T] = color.to_rgb() image = Image.fromarray(data) @@ -71,7 +68,9 @@ class Bible(commands.Cog): async def translate_book_name(self, bible_id: str, book_name: str) -> str: """Translate a book name to a book ID.""" - book_name_list = [w.lower() if w.lower() == "of" else w.title() for w in book_name.split()] + book_name_list = [ + w.lower() if w.lower() == "of" else w.title() for w in book_name.split() + ] book_name = " ".join(book_name_list) books = await self._get_books(bible_id) for book in books: @@ -91,20 +90,20 @@ class Bible(commands.Cog): response.status, ) if response.status == 401: - raise bible.errors.UnauthorizedError + raise bible.errors.Unauthorized() if response.status == 403: - raise bible.errors.BibleAccessError + raise bible.errors.BibleAccessError() if response.status == 503: - raise bible.errors.ServiceUnavailableError + raise bible.errors.ServiceUnavailable() return Version( - bible_id=bible_id, - abbreviation=data["data"]["abbreviation"], - language=data["data"]["language"]["name"], - abbreviation_local=data["data"]["abbreviationLocal"], - language_local=data["data"]["language"]["nameLocal"], - description=data["data"]["description"], - description_local=data["data"]["descriptionLocal"], - version_copyright=data["data"]["copyright"], + bible_id, + data["data"]["abbreviation"], + data["data"]["language"]["name"], + data["data"]["abbreviationLocal"], + data["data"]["language"]["nameLocal"], + data["data"]["description"], + data["data"]["descriptionLocal"], + data["data"]["copyright"], ) async def _get_passage( @@ -135,17 +134,16 @@ class Bible(commands.Cog): response.status, ) if response.status == 400: - raise bible.errors.InexplicableError + raise bible.errors.InexplicableError() if response.status == 401: - raise bible.errors.UnauthorizedError + raise bible.errors.Unauthorized() if response.status == 403: - raise bible.errors.BibleAccessError + raise bible.errors.BibleAccessError() if response.status == 404: - raise bible.errors.NotFoundError + raise bible.errors.NotFound() if response.status == 503: - raise bible.errors.ServiceUnavailableError + raise bible.errors.ServiceUnavailable() - assert self.bot.user is not None # bot will always be logged in fums_url = "https://fums.api.bible/f3" fums_params = { "t": data["meta"]["fumsToken"], @@ -177,11 +175,11 @@ class Bible(commands.Cog): response.status, ) if response.status == 401: - raise bible.errors.UnauthorizedError + raise bible.errors.Unauthorized() if response.status == 403: - raise bible.errors.BibleAccessError + raise bible.errors.BibleAccessError() if response.status == 503: - raise bible.errors.ServiceUnavailableError + raise bible.errors.ServiceUnavailable() return data["data"] async def _get_chapters(self, bible_id: str, book_id: str) -> dict: @@ -196,11 +194,11 @@ class Bible(commands.Cog): response.status, ) if response.status == 401: - raise bible.errors.UnauthorizedError + raise bible.errors.Unauthorized() if response.status == 403: - raise bible.errors.BibleAccessError + raise bible.errors.BibleAccessError() if response.status == 503: - raise bible.errors.ServiceUnavailableError + raise bible.errors.ServiceUnavailable() return data["data"] async def _get_verses(self, bible_id: str, book_id: str, chapter: int) -> dict: @@ -215,11 +213,11 @@ class Bible(commands.Cog): response.status, ) if response.status == 401: - raise bible.errors.UnauthorizedError + raise bible.errors.Unauthorized() if response.status == 403: - raise bible.errors.BibleAccessError + raise bible.errors.BibleAccessError() if response.status == 503: - raise bible.errors.ServiceUnavailableError + raise bible.errors.ServiceUnavailable() return data["data"] @commands.group(autohelp=True) @@ -247,34 +245,41 @@ class Bible(commands.Cog): from_verse, to_verse = passage.replace(":", ".").split("-") if "." not in to_verse: to_verse = f"{from_verse.split('.')[0]}.{to_verse}" - retrieved_passage = await self._get_passage(ctx, bible_id, f"{book_id}.{from_verse}-{book_id}.{to_verse}", True) + passage = await self._get_passage( + ctx, bible_id, f"{book_id}.{from_verse}-{book_id}.{to_verse}", True + ) else: - retrieved_passage = await self._get_passage(ctx, bible_id, f"{book_id}.{passage.replace(':', '.')}", False) + passage = await self._get_passage( + ctx, bible_id, f"{book_id}.{passage.replace(':', '.')}", False + ) except ( bible.errors.BibleAccessError, - bible.errors.NotFoundError, + bible.errors.NotFound, bible.errors.InexplicableError, - bible.errors.ServiceUnavailableError, - bible.errors.UnauthorizedError, + bible.errors.ServiceUnavailable, + bible.errors.Unauthorized, ) as e: await ctx.send(e.message) return - if len(retrieved_passage["content"]) > 4096: + if len(passage["content"]) > 4096: await ctx.send("The passage is too long to send.") return if await ctx.embed_requested(): icon = self.get_icon(await ctx.embed_color()) embed = Embed( - title=f"{retrieved_passage['reference']}", - description=retrieved_passage["content"].replace("¶ ", ""), + title=f"{passage['reference']}", + description=passage["content"].replace("¶ ", ""), color=await ctx.embed_color(), ) - embed.set_footer(text=f"{ctx.prefix}bible passage - Powered by API.Bible - {version.abbreviation_local} ({version.language_local}, {version.description_local})", icon_url="attachment://icon.png") + embed.set_footer( + text=f"{ctx.prefix}bible passage - Powered by API.Bible - {version.abbreviationLocal} ({version.languageLocal}, {version.descriptionLocal})", + icon_url="attachment://icon.png" + ) await ctx.send(embed=embed, file=icon) else: - await ctx.send(f"## {retrieved_passage['reference']}\n{retrieved_passage['content']}") + await ctx.send(f"## {passage['reference']}\n{passage['content']}") @bible.command(name="random") async def bible_random(self, ctx: commands.Context): @@ -295,10 +300,10 @@ class Bible(commands.Cog): passage = await self._get_passage(ctx, bible_id, verse, False) except ( bible.errors.BibleAccessError, - bible.errors.NotFoundError, + bible.errors.NotFound, bible.errors.InexplicableError, - bible.errors.ServiceUnavailableError, - bible.errors.UnauthorizedError, + bible.errors.ServiceUnavailable, + bible.errors.Unauthorized, ) as e: await ctx.send(e.message) return @@ -310,7 +315,10 @@ class Bible(commands.Cog): description=passage["content"].replace("¶ ", ""), color=await ctx.embed_color(), ) - embed.set_footer(text=f"{ctx.prefix}bible random - Powered by API.Bible - {version.abbreviation_local} ({version.language_local}, {version.description_local})", icon_url="attachment://icon.png") + embed.set_footer( + text=f"{ctx.prefix}bible random - Powered by API.Bible - {version.abbreviationLocal} ({version.languageLocal}, {version.descriptionLocal})", + icon_url="attachment://icon.png" + ) await ctx.send(embed=embed, file=icon) else: await ctx.send(f"## {passage['reference']}\n{passage['content']}") diff --git a/bible/errors.py b/bible/errors.py index 954e92d..4b6bb1c 100644 --- a/bible/errors.py +++ b/bible/errors.py @@ -4,22 +4,26 @@ from redbot.core.utils.chat_formatting import error class BibleAccessError(Exception): def __init__( self, - message: str = error("The provided API key cannot retrieve sections from the configured Bible. Please report this to the bot owner."), + message: str = error( + "The provided API key cannot retrieve sections from the configured Bible. Please report this to the bot owner." + ), ): super().__init__(message) self.message = message -class UnauthorizedError(Exception): +class Unauthorized(Exception): def __init__( self, - message: str = error("The API key for API.Bible is missing or invalid. Please report this to the bot owner.\nIf you are the bot owner, please check the documentation [here]()."), + message: str = error( + "The API key for API.Bible is missing or invalid. Please report this to the bot owner.\nIf you are the bot owner, please check the documentation [here]()." + ), ): super().__init__(message) self.message = message -class NotFoundError(Exception): +class NotFound(Exception): def __init__( self, message: str = error("The requested passage was not found."), @@ -28,7 +32,7 @@ class NotFoundError(Exception): self.message = message -class ServiceUnavailableError(Exception): +class ServiceUnavailable(Exception): def __init__( self, message: str = error("The API.Bible service is currently unavailable."), @@ -40,7 +44,9 @@ class ServiceUnavailableError(Exception): class InexplicableError(Exception): def __init__( self, - message: str = error("An inexplicable 'Bad Request' error occurred. This error happens occasionally with the API.Bible service. Please try again. If the error persists, please report this to the bot owner."), + message: str = error( + "An inexplicable 'Bad Request' error occurred. This error happens occassionally with the API.Bible service. Please try again. If the error persists, please report this to the bot owner." + ), ): super().__init__(message) self.message = message diff --git a/bible/info.json b/bible/info.json index 79ae088..dc33f92 100644 --- a/bible/info.json +++ b/bible/info.json @@ -1,15 +1,18 @@ { - "$schema": "https://raw.githubusercontent.com/Cog-Creators/Red-DiscordBot/refs/heads/V3/develop/schema/red_cog_repo.schema.json", - "author": ["cswimr"], - "install_msg": "Thank you for installing Bible!\nThis cog requires setting an API key for API.Bible. Please read the [documentation](https://seacogs.coastalcommits.com/bible/#setup) for more information.\nYou can find the source code of this cog [here](https://coastalcommits.com/cswimr/SeaCogs).", - "name": "Bible", - "short": "Retrieve Bible verses from API.Bible.", - "description": "Retrieve Bible verses from the API.Bible API. This cog requires an API.Bible api key.", - "end_user_data_statement": "This cog does not store end user data, however it does send the following data to the API.Bible API:\n- The bot user's ID\n- The timestamp of the invoking message\n- The hashed user id of the invoking user", + "author" : ["SeaswimmerTheFsh (seasw.)"], + "install_msg" : "Thank you for installing Bible!\nThis cog requires setting an API key for API.Bible. Please read the [documentation](https://seacogs.coastalcommits.com/bible/#setup) for more information.\nYou can find the source code of this cog [here](https://coastalcommits.com/SeaswimmerTheFsh/SeaCogs).", + "name" : "Bible", + "short" : "Retrieve Bible verses from API.Bible.", + "description" : "Retrieve Bible verses from the API.Bible API. This cog requires an API.Bible api key.", + "end_user_data_statement" : "This cog does not store end user data, however it does send the following data to the API.Bible API:\n- The bot user's ID\n- The timestamp of the invoking message\n- The hashed user id of the invoking user", "hidden": false, "disabled": false, "min_bot_version": "3.5.0", "min_python_version": [3, 10, 0], "requirements": ["numpy", "pillow"], - "tags": ["fun", "utility", "api"] + "tags": [ + "fun", + "utility", + "api" + ] } diff --git a/bible/models.py b/bible/models.py index b8e3b09..97500be 100644 --- a/bible/models.py +++ b/bible/models.py @@ -4,23 +4,23 @@ class Version: bible_id, abbreviation, language, - abbreviation_local, - language_local, + abbreviationLocal, + languageLocal, description, - description_local, + descriptionLocal, version_copyright, ): self.bible_id = bible_id self.abbreviation = abbreviation self.language = language - self.abbreviation_local = abbreviation_local - self.language_local = language_local + self.abbreviationLocal = abbreviationLocal + self.languageLocal = languageLocal self.description = description - self.description_local = description_local + self.descriptionLocal = descriptionLocal self.copyright = version_copyright def __str__(self): - return self.abbreviation_local + return self.abbreviationLocal def __repr__(self): - return f'bible.models.Version("{self.bible_id}", "{self.abbreviation}", "{self.language}", "{self.abbreviation_local}", "{self.language_local}", "{self.description}", "{self.description_local}", "{self.copyright}")' + return f'bible.models.Version("{self.bible_id}", "{self.abbreviation}", "{self.language}", "{self.abbreviationLocal}", "{self.languageLocal}", "{self.description}", "{self.descriptionLocal}", "{self.copyright}")' diff --git a/emojiinfo/__init__.py b/emojiinfo/__init__.py deleted file mode 100644 index fb9994a..0000000 --- a/emojiinfo/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -from .emojiinfo import EmojiInfo - - -async def setup(bot): - await bot.add_cog(EmojiInfo(bot)) diff --git a/emojiinfo/data/emojis.json b/emojiinfo/data/emojis.json deleted file mode 100644 index dadae4c..0000000 --- a/emojiinfo/data/emojis.json +++ /dev/null @@ -1,5309 +0,0 @@ -{ - "people": { - "grinning": "😀", - "smiley": "😃", - "smile": "😄", - "grin": "😁", - "laughing": "😆", - "satisfied": "😆", - "sweat_smile": "😅", - "joy": "😂", - "rofl": "🤣", - "rolling_on_the_floor_laughing": "🤣", - "relaxed": "☺️", - "blush": "😊", - "innocent": "😇", - "slight_smile": "🙂", - "slightly_smiling_face": "🙂", - "upside_down": "🙃", - "upside_down_face": "🙃", - "wink": "😉", - "relieved": "😌", - "smiling_face_with_tear": "🥲", - "heart_eyes": "😍", - "smiling_face_with_3_hearts": "🥰", - "kissing_heart": "😘", - "kissing": "😗", - "kissing_smiling_eyes": "😙", - "kissing_closed_eyes": "😚", - "yum": "😋", - "stuck_out_tongue": "😛", - "stuck_out_tongue_closed_eyes": "😝", - "stuck_out_tongue_winking_eye": "😜", - "zany_face": "🤪", - "face_with_raised_eyebrow": "🤨", - "face_with_monocle": "🧐", - "nerd": "🤓", - "nerd_face": "🤓", - "sunglasses": "😎", - "star_struck": "🤩", - "partying_face": "🥳", - "smirk": "😏", - "unamused": "😒", - "disappointed": "😞", - "pensive": "😔", - "worried": "😟", - "confused": "😕", - "slight_frown": "🙁", - "slightly_frowning_face": "🙁", - "frowning2": "☹️", - "white_frowning_face": "☹️", - "persevere": "😣", - "confounded": "😖", - "tired_face": "😫", - "weary": "😩", - "pleading_face": "🥺", - "cry": "😢", - "sob": "😭", - "triumph": "😤", - "face_exhaling": "😮‍💨", - "angry": "😠", - "rage": "😡", - "face_with_symbols_over_mouth": "🤬", - "exploding_head": "🤯", - "flushed": "😳", - "face_in_clouds": "😶‍🌫️", - "hot_face": "🥵", - "cold_face": "🥶", - "scream": "😱", - "fearful": "😨", - "cold_sweat": "😰", - "disappointed_relieved": "😥", - "sweat": "😓", - "hugging": "🤗", - "hugging_face": "🤗", - "thinking": "🤔", - "thinking_face": "🤔", - "face_with_hand_over_mouth": "🤭", - "yawning_face": "🥱", - "shushing_face": "🤫", - "lying_face": "🤥", - "liar": "🤥", - "no_mouth": "😶", - "neutral_face": "😐", - "expressionless": "😑", - "grimacing": "😬", - "rolling_eyes": "🙄", - "face_with_rolling_eyes": "🙄", - "hushed": "😯", - "frowning": "😦", - "anguished": "😧", - "open_mouth": "😮", - "astonished": "😲", - "sleeping": "😴", - "drooling_face": "🤤", - "drool": "🤤", - "sleepy": "😪", - "dizzy_face": "😵", - "face_with_spiral_eyes": "😵‍💫", - "zipper_mouth": "🤐", - "zipper_mouth_face": "🤐", - "woozy_face": "🥴", - "nauseated_face": "🤢", - "sick": "🤢", - "face_vomiting": "🤮", - "sneezing_face": "🤧", - "sneeze": "🤧", - "mask": "😷", - "thermometer_face": "🤒", - "face_with_thermometer": "🤒", - "head_bandage": "🤕", - "face_with_head_bandage": "🤕", - "money_mouth": "🤑", - "money_mouth_face": "🤑", - "cowboy": "🤠", - "face_with_cowboy_hat": "🤠", - "disguised_face": "🥸", - "smiling_imp": "😈", - "imp": "👿", - "japanese_ogre": "👹", - "japanese_goblin": "👺", - "clown": "🤡", - "clown_face": "🤡", - "poop": "💩", - "shit": "💩", - "hankey": "💩", - "poo": "💩", - "ghost": "👻", - "skull": "💀", - "skeleton": "💀", - "skull_crossbones": "☠️", - "skull_and_crossbones": "☠️", - "alien": "👽", - "space_invader": "👾", - "robot": "🤖", - "robot_face": "🤖", - "jack_o_lantern": "🎃", - "smiley_cat": "😺", - "smile_cat": "😸", - "joy_cat": "😹", - "heart_eyes_cat": "😻", - "smirk_cat": "😼", - "kissing_cat": "😽", - "scream_cat": "🙀", - "crying_cat_face": "😿", - "pouting_cat": "😾", - "palms_up_together": "🤲", - "palms_up_together_tone1": "🤲🏻", - "palms_up_together_light_skin_tone": "🤲🏻", - "palms_up_together_tone2": "🤲🏼", - "palms_up_together_medium_light_skin_tone": "🤲🏼", - "palms_up_together_tone3": "🤲🏽", - "palms_up_together_medium_skin_tone": "🤲🏽", - "palms_up_together_tone4": "🤲🏾", - "palms_up_together_medium_dark_skin_tone": "🤲🏾", - "palms_up_together_tone5": "🤲🏿", - "palms_up_together_dark_skin_tone": "🤲🏿", - "open_hands": "👐", - "open_hands_tone1": "👐🏻", - "open_hands_tone2": "👐🏼", - "open_hands_tone3": "👐🏽", - "open_hands_tone4": "👐🏾", - "open_hands_tone5": "👐🏿", - "raised_hands": "🙌", - "raised_hands_tone1": "🙌🏻", - "raised_hands_tone2": "🙌🏼", - "raised_hands_tone3": "🙌🏽", - "raised_hands_tone4": "🙌🏾", - "raised_hands_tone5": "🙌🏿", - "clap": "👏", - "clap_tone1": "👏🏻", - "clap_tone2": "👏🏼", - "clap_tone3": "👏🏽", - "clap_tone4": "👏🏾", - "clap_tone5": "👏🏿", - "handshake": "🤝", - "shaking_hands": "🤝", - "thumbsup": "👍", - "+1": "👍", - "thumbup": "👍", - "thumbsup_tone1": "👍🏻", - "+1_tone1": "👍🏻", - "thumbup_tone1": "👍🏻", - "thumbsup_tone2": "👍🏼", - "+1_tone2": "👍🏼", - "thumbup_tone2": "👍🏼", - "thumbsup_tone3": "👍🏽", - "+1_tone3": "👍🏽", - "thumbup_tone3": "👍🏽", - "thumbsup_tone4": "👍🏾", - "+1_tone4": "👍🏾", - "thumbup_tone4": "👍🏾", - "thumbsup_tone5": "👍🏿", - "+1_tone5": "👍🏿", - "thumbup_tone5": "👍🏿", - "thumbsdown": "👎", - "-1": "👎", - "thumbdown": "👎", - "thumbsdown_tone1": "👎🏻", - "_1_tone1": "👎🏻", - "thumbdown_tone1": "👎🏻", - "thumbsdown_tone2": "👎🏼", - "_1_tone2": "👎🏼", - "thumbdown_tone2": "👎🏼", - "thumbsdown_tone3": "👎🏽", - "_1_tone3": "👎🏽", - "thumbdown_tone3": "👎🏽", - "thumbsdown_tone4": "👎🏾", - "_1_tone4": "👎🏾", - "thumbdown_tone4": "👎🏾", - "thumbsdown_tone5": "👎🏿", - "_1_tone5": "👎🏿", - "thumbdown_tone5": "👎🏿", - "punch": "👊", - "punch_tone1": "👊🏻", - "punch_tone2": "👊🏼", - "punch_tone3": "👊🏽", - "punch_tone4": "👊🏾", - "punch_tone5": "👊🏿", - "fist": "✊", - "fist_tone1": "✊🏻", - "fist_tone2": "✊🏼", - "fist_tone3": "✊🏽", - "fist_tone4": "✊🏾", - "fist_tone5": "✊🏿", - "left_facing_fist": "🤛", - "left_fist": "🤛", - "left_facing_fist_tone1": "🤛🏻", - "left_fist_tone1": "🤛🏻", - "left_facing_fist_tone2": "🤛🏼", - "left_fist_tone2": "🤛🏼", - "left_facing_fist_tone3": "🤛🏽", - "left_fist_tone3": "🤛🏽", - "left_facing_fist_tone4": "🤛🏾", - "left_fist_tone4": "🤛🏾", - "left_facing_fist_tone5": "🤛🏿", - "left_fist_tone5": "🤛🏿", - "right_facing_fist": "🤜", - "right_fist": "🤜", - "right_facing_fist_tone1": "🤜🏻", - "right_fist_tone1": "🤜🏻", - "right_facing_fist_tone2": "🤜🏼", - "right_fist_tone2": "🤜🏼", - "right_facing_fist_tone3": "🤜🏽", - "right_fist_tone3": "🤜🏽", - "right_facing_fist_tone4": "🤜🏾", - "right_fist_tone4": "🤜🏾", - "right_facing_fist_tone5": "🤜🏿", - "right_fist_tone5": "🤜🏿", - "fingers_crossed": "🤞", - "hand_with_index_and_middle_finger_crossed": "🤞", - "fingers_crossed_tone1": "🤞🏻", - "hand_with_index_and_middle_fingers_crossed_tone1": "🤞🏻", - "fingers_crossed_tone2": "🤞🏼", - "hand_with_index_and_middle_fingers_crossed_tone2": "🤞🏼", - "fingers_crossed_tone3": "🤞🏽", - "hand_with_index_and_middle_fingers_crossed_tone3": "🤞🏽", - "fingers_crossed_tone4": "🤞🏾", - "hand_with_index_and_middle_fingers_crossed_tone4": "🤞🏾", - "fingers_crossed_tone5": "🤞🏿", - "hand_with_index_and_middle_fingers_crossed_tone5": "🤞🏿", - "v": "✌️", - "v_tone1": "✌🏻", - "v_tone2": "✌🏼", - "v_tone3": "✌🏽", - "v_tone4": "✌🏾", - "v_tone5": "✌🏿", - "love_you_gesture": "🤟", - "love_you_gesture_tone1": "🤟🏻", - "love_you_gesture_light_skin_tone": "🤟🏻", - "love_you_gesture_tone2": "🤟🏼", - "love_you_gesture_medium_light_skin_tone": "🤟🏼", - "love_you_gesture_tone3": "🤟🏽", - "love_you_gesture_medium_skin_tone": "🤟🏽", - "love_you_gesture_tone4": "🤟🏾", - "love_you_gesture_medium_dark_skin_tone": "🤟🏾", - "love_you_gesture_tone5": "🤟🏿", - "love_you_gesture_dark_skin_tone": "🤟🏿", - "metal": "🤘", - "sign_of_the_horns": "🤘", - "metal_tone1": "🤘🏻", - "sign_of_the_horns_tone1": "🤘🏻", - "metal_tone2": "🤘🏼", - "sign_of_the_horns_tone2": "🤘🏼", - "metal_tone3": "🤘🏽", - "sign_of_the_horns_tone3": "🤘🏽", - "metal_tone4": "🤘🏾", - "sign_of_the_horns_tone4": "🤘🏾", - "metal_tone5": "🤘🏿", - "sign_of_the_horns_tone5": "🤘🏿", - "ok_hand": "👌", - "ok_hand_tone1": "👌🏻", - "ok_hand_tone2": "👌🏼", - "ok_hand_tone3": "👌🏽", - "ok_hand_tone4": "👌🏾", - "ok_hand_tone5": "👌🏿", - "pinching_hand": "🤏", - "pinching_hand_tone1": "🤏🏻", - "pinching_hand_light_skin_tone": "🤏🏻", - "pinching_hand_tone2": "🤏🏼", - "pinching_hand_medium_light_skin_tone": "🤏🏼", - "pinching_hand_tone3": "🤏🏽", - "pinching_hand_medium_skin_tone": "🤏🏽", - "pinching_hand_tone4": "🤏🏾", - "pinching_hand_medium_dark_skin_tone": "🤏🏾", - "pinching_hand_tone5": "🤏🏿", - "pinching_hand_dark_skin_tone": "🤏🏿", - "pinched_fingers": "🤌", - "pinched_fingers_tone2": "🤌🏼", - "pinched_fingers_medium_light_skin_tone": "🤌🏼", - "pinched_fingers_tone1": "🤌🏻", - "pinched_fingers_light_skin_tone": "🤌🏻", - "pinched_fingers_tone3": "🤌🏽", - "pinched_fingers_medium_skin_tone": "🤌🏽", - "pinched_fingers_tone4": "🤌🏾", - "pinched_fingers_medium_dark_skin_tone": "🤌🏾", - "pinched_fingers_tone5": "🤌🏿", - "pinched_fingers_dark_skin_tone": "🤌🏿", - "point_left": "👈", - "point_left_tone1": "👈🏻", - "point_left_tone2": "👈🏼", - "point_left_tone3": "👈🏽", - "point_left_tone4": "👈🏾", - "point_left_tone5": "👈🏿", - "point_right": "👉", - "point_right_tone1": "👉🏻", - "point_right_tone2": "👉🏼", - "point_right_tone3": "👉🏽", - "point_right_tone4": "👉🏾", - "point_right_tone5": "👉🏿", - "point_up_2": "👆", - "point_up_2_tone1": "👆🏻", - "point_up_2_tone2": "👆🏼", - "point_up_2_tone3": "👆🏽", - "point_up_2_tone4": "👆🏾", - "point_up_2_tone5": "👆🏿", - "point_down": "👇", - "point_down_tone1": "👇🏻", - "point_down_tone2": "👇🏼", - "point_down_tone3": "👇🏽", - "point_down_tone4": "👇🏾", - "point_down_tone5": "👇🏿", - "point_up": "☝️", - "point_up_tone1": "☝🏻", - "point_up_tone2": "☝🏼", - "point_up_tone3": "☝🏽", - "point_up_tone4": "☝🏾", - "point_up_tone5": "☝🏿", - "raised_hand": "✋", - "raised_hand_tone1": "✋🏻", - "raised_hand_tone2": "✋🏼", - "raised_hand_tone3": "✋🏽", - "raised_hand_tone4": "✋🏾", - "raised_hand_tone5": "✋🏿", - "raised_back_of_hand": "🤚", - "back_of_hand": "🤚", - "raised_back_of_hand_tone1": "🤚🏻", - "back_of_hand_tone1": "🤚🏻", - "raised_back_of_hand_tone2": "🤚🏼", - "back_of_hand_tone2": "🤚🏼", - "raised_back_of_hand_tone3": "🤚🏽", - "back_of_hand_tone3": "🤚🏽", - "raised_back_of_hand_tone4": "🤚🏾", - "back_of_hand_tone4": "🤚🏾", - "raised_back_of_hand_tone5": "🤚🏿", - "back_of_hand_tone5": "🤚🏿", - "hand_splayed": "🖐️", - "raised_hand_with_fingers_splayed": "🖐️", - "hand_splayed_tone1": "🖐🏻", - "raised_hand_with_fingers_splayed_tone1": "🖐🏻", - "hand_splayed_tone2": "🖐🏼", - "raised_hand_with_fingers_splayed_tone2": "🖐🏼", - "hand_splayed_tone3": "🖐🏽", - "raised_hand_with_fingers_splayed_tone3": "🖐🏽", - "hand_splayed_tone4": "🖐🏾", - "raised_hand_with_fingers_splayed_tone4": "🖐🏾", - "hand_splayed_tone5": "🖐🏿", - "raised_hand_with_fingers_splayed_tone5": "🖐🏿", - "vulcan": "🖖", - "raised_hand_with_part_between_middle_and_ring_fingers": "🖖", - "vulcan_tone1": "🖖🏻", - "raised_hand_with_part_between_middle_and_ring_fingers_tone1": "🖖🏻", - "vulcan_tone2": "🖖🏼", - "raised_hand_with_part_between_middle_and_ring_fingers_tone2": "🖖🏼", - "vulcan_tone3": "🖖🏽", - "raised_hand_with_part_between_middle_and_ring_fingers_tone3": "🖖🏽", - "vulcan_tone4": "🖖🏾", - "raised_hand_with_part_between_middle_and_ring_fingers_tone4": "🖖🏾", - "vulcan_tone5": "🖖🏿", - "raised_hand_with_part_between_middle_and_ring_fingers_tone5": "🖖🏿", - "wave": "👋", - "wave_tone1": "👋🏻", - "wave_tone2": "👋🏼", - "wave_tone3": "👋🏽", - "wave_tone4": "👋🏾", - "wave_tone5": "👋🏿", - "call_me": "🤙", - "call_me_hand": "🤙", - "call_me_tone1": "🤙🏻", - "call_me_hand_tone1": "🤙🏻", - "call_me_tone2": "🤙🏼", - "call_me_hand_tone2": "🤙🏼", - "call_me_tone3": "🤙🏽", - "call_me_hand_tone3": "🤙🏽", - "call_me_tone4": "🤙🏾", - "call_me_hand_tone4": "🤙🏾", - "call_me_tone5": "🤙🏿", - "call_me_hand_tone5": "🤙🏿", - "muscle": "💪", - "muscle_tone1": "💪🏻", - "muscle_tone2": "💪🏼", - "muscle_tone3": "💪🏽", - "muscle_tone4": "💪🏾", - "muscle_tone5": "💪🏿", - "mechanical_arm": "🦾", - "middle_finger": "🖕", - "reversed_hand_with_middle_finger_extended": "🖕", - "middle_finger_tone1": "🖕🏻", - "reversed_hand_with_middle_finger_extended_tone1": "🖕🏻", - "middle_finger_tone2": "🖕🏼", - "reversed_hand_with_middle_finger_extended_tone2": "🖕🏼", - "middle_finger_tone3": "🖕🏽", - "reversed_hand_with_middle_finger_extended_tone3": "🖕🏽", - "middle_finger_tone4": "🖕🏾", - "reversed_hand_with_middle_finger_extended_tone4": "🖕🏾", - "middle_finger_tone5": "🖕🏿", - "reversed_hand_with_middle_finger_extended_tone5": "🖕🏿", - "writing_hand": "✍️", - "writing_hand_tone1": "✍🏻", - "writing_hand_tone2": "✍🏼", - "writing_hand_tone3": "✍🏽", - "writing_hand_tone4": "✍🏾", - "writing_hand_tone5": "✍🏿", - "pray": "🙏", - "pray_tone1": "🙏🏻", - "pray_tone2": "🙏🏼", - "pray_tone3": "🙏🏽", - "pray_tone4": "🙏🏾", - "pray_tone5": "🙏🏿", - "foot": "🦶", - "foot_tone1": "🦶🏻", - "foot_light_skin_tone": "🦶🏻", - "foot_tone2": "🦶🏼", - "foot_medium_light_skin_tone": "🦶🏼", - "foot_tone3": "🦶🏽", - "foot_medium_skin_tone": "🦶🏽", - "foot_tone4": "🦶🏾", - "foot_medium_dark_skin_tone": "🦶🏾", - "foot_tone5": "🦶🏿", - "foot_dark_skin_tone": "🦶🏿", - "leg": "🦵", - "leg_tone1": "🦵🏻", - "leg_light_skin_tone": "🦵🏻", - "leg_tone2": "🦵🏼", - "leg_medium_light_skin_tone": "🦵🏼", - "leg_tone3": "🦵🏽", - "leg_medium_skin_tone": "🦵🏽", - "leg_tone4": "🦵🏾", - "leg_medium_dark_skin_tone": "🦵🏾", - "leg_tone5": "🦵🏿", - "leg_dark_skin_tone": "🦵🏿", - "mechanical_leg": "🦿", - "lipstick": "💄", - "kiss": "💋", - "lips": "👄", - "tooth": "🦷", - "tongue": "👅", - "ear": "👂", - "ear_tone1": "👂🏻", - "ear_tone2": "👂🏼", - "ear_tone3": "👂🏽", - "ear_tone4": "👂🏾", - "ear_tone5": "👂🏿", - "ear_with_hearing_aid": "🦻", - "ear_with_hearing_aid_tone1": "🦻🏻", - "ear_with_hearing_aid_light_skin_tone": "🦻🏻", - "ear_with_hearing_aid_tone2": "🦻🏼", - "ear_with_hearing_aid_medium_light_skin_tone": "🦻🏼", - "ear_with_hearing_aid_tone3": "🦻🏽", - "ear_with_hearing_aid_medium_skin_tone": "🦻🏽", - "ear_with_hearing_aid_tone4": "🦻🏾", - "ear_with_hearing_aid_medium_dark_skin_tone": "🦻🏾", - "ear_with_hearing_aid_tone5": "🦻🏿", - "ear_with_hearing_aid_dark_skin_tone": "🦻🏿", - "nose": "👃", - "nose_tone1": "👃🏻", - "nose_tone2": "👃🏼", - "nose_tone3": "👃🏽", - "nose_tone4": "👃🏾", - "nose_tone5": "👃🏿", - "footprints": "👣", - "eye": "👁️", - "eyes": "👀", - "brain": "🧠", - "anatomical_heart": "🫀", - "lungs": "🫁", - "bone": "🦴", - "speaking_head": "🗣️", - "speaking_head_in_silhouette": "🗣️", - "bust_in_silhouette": "👤", - "busts_in_silhouette": "👥", - "people_hugging": "🫂", - "baby": "👶", - "baby_tone1": "👶🏻", - "baby_tone2": "👶🏼", - "baby_tone3": "👶🏽", - "baby_tone4": "👶🏾", - "baby_tone5": "👶🏿", - "girl": "👧", - "girl_tone1": "👧🏻", - "girl_tone2": "👧🏼", - "girl_tone3": "👧🏽", - "girl_tone4": "👧🏾", - "girl_tone5": "👧🏿", - "child": "🧒", - "child_tone1": "🧒🏻", - "child_light_skin_tone": "🧒🏻", - "child_tone2": "🧒🏼", - "child_medium_light_skin_tone": "🧒🏼", - "child_tone3": "🧒🏽", - "child_medium_skin_tone": "🧒🏽", - "child_tone4": "🧒🏾", - "child_medium_dark_skin_tone": "🧒🏾", - "child_tone5": "🧒🏿", - "child_dark_skin_tone": "🧒🏿", - "boy": "👦", - "boy_tone1": "👦🏻", - "boy_tone2": "👦🏼", - "boy_tone3": "👦🏽", - "boy_tone4": "👦🏾", - "boy_tone5": "👦🏿", - "woman": "👩", - "woman_tone1": "👩🏻", - "woman_tone2": "👩🏼", - "woman_tone3": "👩🏽", - "woman_tone4": "👩🏾", - "woman_tone5": "👩🏿", - "adult": "🧑", - "adult_tone1": "🧑🏻", - "adult_light_skin_tone": "🧑🏻", - "adult_tone2": "🧑🏼", - "adult_medium_light_skin_tone": "🧑🏼", - "adult_tone3": "🧑🏽", - "adult_medium_skin_tone": "🧑🏽", - "adult_tone4": "🧑🏾", - "adult_medium_dark_skin_tone": "🧑🏾", - "adult_tone5": "🧑🏿", - "adult_dark_skin_tone": "🧑🏿", - "man": "👨", - "man_tone1": "👨🏻", - "man_tone2": "👨🏼", - "man_tone3": "👨🏽", - "man_tone4": "👨🏾", - "man_tone5": "👨🏿", - "person_curly_hair": "🧑‍🦱", - "person_tone1_curly_hair": "🧑🏻‍🦱", - "person_light_skin_tone_curly_hair": "🧑🏻‍🦱", - "person_tone2_curly_hair": "🧑🏼‍🦱", - "person_medium_light_skin_tone_curly_hair": "🧑🏼‍🦱", - "person_tone3_curly_hair": "🧑🏽‍🦱", - "person_medium_skin_tone_curly_hair": "🧑🏽‍🦱", - "person_tone4_curly_hair": "🧑🏾‍🦱", - "person_medium_dark_skin_tone_curly_hair": "🧑🏾‍🦱", - "person_tone5_curly_hair": "🧑🏿‍🦱", - "person_dark_skin_tone_curly_hair": "🧑🏿‍🦱", - "woman_curly_haired": "👩‍🦱", - "woman_curly_haired_tone1": "👩🏻‍🦱", - "woman_curly_haired_light_skin_tone": "👩🏻‍🦱", - "woman_curly_haired_tone2": "👩🏼‍🦱", - "woman_curly_haired_medium_light_skin_tone": "👩🏼‍🦱", - "woman_curly_haired_tone3": "👩🏽‍🦱", - "woman_curly_haired_medium_skin_tone": "👩🏽‍🦱", - "woman_curly_haired_tone4": "👩🏾‍🦱", - "woman_curly_haired_medium_dark_skin_tone": "👩🏾‍🦱", - "woman_curly_haired_tone5": "👩🏿‍🦱", - "woman_curly_haired_dark_skin_tone": "👩🏿‍🦱", - "man_curly_haired": "👨‍🦱", - "man_curly_haired_tone1": "👨🏻‍🦱", - "man_curly_haired_light_skin_tone": "👨🏻‍🦱", - "man_curly_haired_tone2": "👨🏼‍🦱", - "man_curly_haired_medium_light_skin_tone": "👨🏼‍🦱", - "man_curly_haired_tone3": "👨🏽‍🦱", - "man_curly_haired_medium_skin_tone": "👨🏽‍🦱", - "man_curly_haired_tone4": "👨🏾‍🦱", - "man_curly_haired_medium_dark_skin_tone": "👨🏾‍🦱", - "man_curly_haired_tone5": "👨🏿‍🦱", - "man_curly_haired_dark_skin_tone": "👨🏿‍🦱", - "person_red_hair": "🧑‍🦰", - "person_tone1_red_hair": "🧑🏻‍🦰", - "person_light_skin_tone_red_hair": "🧑🏻‍🦰", - "person_tone2_red_hair": "🧑🏼‍🦰", - "person_medium_light_skin_tone_red_hair": "🧑🏼‍🦰", - "person_tone3_red_hair": "🧑🏽‍🦰", - "person_medium_skin_tone_red_hair": "🧑🏽‍🦰", - "person_tone4_red_hair": "🧑🏾‍🦰", - "person_medium_dark_skin_tone_red_hair": "🧑🏾‍🦰", - "person_tone5_red_hair": "🧑🏿‍🦰", - "person_dark_skin_tone_red_hair": "🧑🏿‍🦰", - "woman_red_haired": "👩‍🦰", - "woman_red_haired_tone1": "👩🏻‍🦰", - "woman_red_haired_light_skin_tone": "👩🏻‍🦰", - "woman_red_haired_tone2": "👩🏼‍🦰", - "woman_red_haired_medium_light_skin_tone": "👩🏼‍🦰", - "woman_red_haired_tone3": "👩🏽‍🦰", - "woman_red_haired_medium_skin_tone": "👩🏽‍🦰", - "woman_red_haired_tone4": "👩🏾‍🦰", - "woman_red_haired_medium_dark_skin_tone": "👩🏾‍🦰", - "woman_red_haired_tone5": "👩🏿‍🦰", - "woman_red_haired_dark_skin_tone": "👩🏿‍🦰", - "man_red_haired": "👨‍🦰", - "man_red_haired_tone1": "👨🏻‍🦰", - "man_red_haired_light_skin_tone": "👨🏻‍🦰", - "man_red_haired_tone2": "👨🏼‍🦰", - "man_red_haired_medium_light_skin_tone": "👨🏼‍🦰", - "man_red_haired_tone3": "👨🏽‍🦰", - "man_red_haired_medium_skin_tone": "👨🏽‍🦰", - "man_red_haired_tone4": "👨🏾‍🦰", - "man_red_haired_medium_dark_skin_tone": "👨🏾‍🦰", - "man_red_haired_tone5": "👨🏿‍🦰", - "man_red_haired_dark_skin_tone": "👨🏿‍🦰", - "blond_haired_woman": "👱‍♀️", - "blond_haired_woman_tone1": "👱🏻‍♀️", - "blond_haired_woman_light_skin_tone": "👱🏻‍♀️", - "blond_haired_woman_tone2": "👱🏼‍♀️", - "blond_haired_woman_medium_light_skin_tone": "👱🏼‍♀️", - "blond_haired_woman_tone3": "👱🏽‍♀️", - "blond_haired_woman_medium_skin_tone": "👱🏽‍♀️", - "blond_haired_woman_tone4": "👱🏾‍♀️", - "blond_haired_woman_medium_dark_skin_tone": "👱🏾‍♀️", - "blond_haired_woman_tone5": "👱🏿‍♀️", - "blond_haired_woman_dark_skin_tone": "👱🏿‍♀️", - "blond_haired_person": "👱", - "person_with_blond_hair": "👱", - "blond_haired_person_tone1": "👱🏻", - "person_with_blond_hair_tone1": "👱🏻", - "blond_haired_person_tone2": "👱🏼", - "person_with_blond_hair_tone2": "👱🏼", - "blond_haired_person_tone3": "👱🏽", - "person_with_blond_hair_tone3": "👱🏽", - "blond_haired_person_tone4": "👱🏾", - "person_with_blond_hair_tone4": "👱🏾", - "blond_haired_person_tone5": "👱🏿", - "person_with_blond_hair_tone5": "👱🏿", - "blond_haired_man": "👱‍♂️", - "blond_haired_man_tone1": "👱🏻‍♂️", - "blond_haired_man_light_skin_tone": "👱🏻‍♂️", - "blond_haired_man_tone2": "👱🏼‍♂️", - "blond_haired_man_medium_light_skin_tone": "👱🏼‍♂️", - "blond_haired_man_tone3": "👱🏽‍♂️", - "blond_haired_man_medium_skin_tone": "👱🏽‍♂️", - "blond_haired_man_tone4": "👱🏾‍♂️", - "blond_haired_man_medium_dark_skin_tone": "👱🏾‍♂️", - "blond_haired_man_tone5": "👱🏿‍♂️", - "blond_haired_man_dark_skin_tone": "👱🏿‍♂️", - "person_white_hair": "🧑‍🦳", - "person_tone1_white_hair": "🧑🏻‍🦳", - "person_light_skin_tone_white_hair": "🧑🏻‍🦳", - "person_tone2_white_hair": "🧑🏼‍🦳", - "person_medium_light_skin_tone_white_hair": "🧑🏼‍🦳", - "person_tone3_white_hair": "🧑🏽‍🦳", - "person_medium_skin_tone_white_hair": "🧑🏽‍🦳", - "person_tone4_white_hair": "🧑🏾‍🦳", - "person_medium_dark_skin_tone_white_hair": "🧑🏾‍🦳", - "person_tone5_white_hair": "🧑🏿‍🦳", - "person_dark_skin_tone_white_hair": "🧑🏿‍🦳", - "woman_white_haired": "👩‍🦳", - "woman_white_haired_tone1": "👩🏻‍🦳", - "woman_white_haired_light_skin_tone": "👩🏻‍🦳", - "woman_white_haired_tone2": "👩🏼‍🦳", - "woman_white_haired_medium_light_skin_tone": "👩🏼‍🦳", - "woman_white_haired_tone3": "👩🏽‍🦳", - "woman_white_haired_medium_skin_tone": "👩🏽‍🦳", - "woman_white_haired_tone4": "👩🏾‍🦳", - "woman_white_haired_medium_dark_skin_tone": "👩🏾‍🦳", - "woman_white_haired_tone5": "👩🏿‍🦳", - "woman_white_haired_dark_skin_tone": "👩🏿‍🦳", - "man_white_haired": "👨‍🦳", - "man_white_haired_tone1": "👨🏻‍🦳", - "man_white_haired_light_skin_tone": "👨🏻‍🦳", - "man_white_haired_tone2": "👨🏼‍🦳", - "man_white_haired_medium_light_skin_tone": "👨🏼‍🦳", - "man_white_haired_tone3": "👨🏽‍🦳", - "man_white_haired_medium_skin_tone": "👨🏽‍🦳", - "man_white_haired_tone4": "👨🏾‍🦳", - "man_white_haired_medium_dark_skin_tone": "👨🏾‍🦳", - "man_white_haired_tone5": "👨🏿‍🦳", - "man_white_haired_dark_skin_tone": "👨🏿‍🦳", - "person_bald": "🧑‍🦲", - "person_tone1_bald": "🧑🏻‍🦲", - "person_light_skin_tone_bald": "🧑🏻‍🦲", - "person_tone2_bald": "🧑🏼‍🦲", - "person_medium_light_skin_tone_bald": "🧑🏼‍🦲", - "person_tone3_bald": "🧑🏽‍🦲", - "person_medium_skin_tone_bald": "🧑🏽‍🦲", - "person_tone4_bald": "🧑🏾‍🦲", - "person_medium_dark_skin_tone_bald": "🧑🏾‍🦲", - "person_tone5_bald": "🧑🏿‍🦲", - "person_dark_skin_tone_bald": "🧑🏿‍🦲", - "woman_bald": "👩‍🦲", - "woman_bald_tone1": "👩🏻‍🦲", - "woman_bald_light_skin_tone": "👩🏻‍🦲", - "woman_bald_tone2": "👩🏼‍🦲", - "woman_bald_medium_light_skin_tone": "👩🏼‍🦲", - "woman_bald_tone3": "👩🏽‍🦲", - "woman_bald_medium_skin_tone": "👩🏽‍🦲", - "woman_bald_tone4": "👩🏾‍🦲", - "woman_bald_medium_dark_skin_tone": "👩🏾‍🦲", - "woman_bald_tone5": "👩🏿‍🦲", - "woman_bald_dark_skin_tone": "👩🏿‍🦲", - "man_bald": "👨‍🦲", - "man_bald_tone1": "👨🏻‍🦲", - "man_bald_light_skin_tone": "👨🏻‍🦲", - "man_bald_tone2": "👨🏼‍🦲", - "man_bald_medium_light_skin_tone": "👨🏼‍🦲", - "man_bald_tone3": "👨🏽‍🦲", - "man_bald_medium_skin_tone": "👨🏽‍🦲", - "man_bald_tone4": "👨🏾‍🦲", - "man_bald_medium_dark_skin_tone": "👨🏾‍🦲", - "man_bald_tone5": "👨🏿‍🦲", - "man_bald_dark_skin_tone": "👨🏿‍🦲", - "bearded_person": "🧔", - "bearded_person_tone1": "🧔🏻", - "bearded_person_light_skin_tone": "🧔🏻", - "bearded_person_tone2": "🧔🏼", - "bearded_person_medium_light_skin_tone": "🧔🏼", - "bearded_person_tone3": "🧔🏽", - "bearded_person_medium_skin_tone": "🧔🏽", - "bearded_person_tone4": "🧔🏾", - "bearded_person_medium_dark_skin_tone": "🧔🏾", - "bearded_person_tone5": "🧔🏿", - "bearded_person_dark_skin_tone": "🧔🏿", - "man_beard": "🧔‍♂️", - "man_tone1_beard": "🧔🏻‍♂️", - "man_light_skin_tone_beard": "🧔🏻‍♂️", - "man_tone2_beard": "🧔🏼‍♂️", - "man_medium_light_skin_tone_beard": "🧔🏼‍♂️", - "man_tone3_beard": "🧔🏽‍♂️", - "man_medium_skin_tone_beard": "🧔🏽‍♂️", - "man_tone4_beard": "🧔🏾‍♂️", - "man_medium_dark_skin_tone_beard": "🧔🏾‍♂️", - "man_tone5_beard": "🧔🏿‍♂️", - "man_dark_skin_tone_beard": "🧔🏿‍♂️", - "woman_beard": "🧔‍♀️", - "woman_tone1_beard": "🧔🏻‍♀️", - "woman_light_skin_tone_beard": "🧔🏻‍♀️", - "woman_tone2_beard": "🧔🏼‍♀️", - "woman_medium_light_skin_tone_beard": "🧔🏼‍♀️", - "woman_tone3_beard": "🧔🏽‍♀️", - "woman_medium_skin_tone_beard": "🧔🏽‍♀️", - "woman_tone4_beard": "🧔🏾‍♀️", - "woman_medium_dark_skin_tone_beard": "🧔🏾‍♀️", - "woman_tone5_beard": "🧔🏿‍♀️", - "woman_dark_skin_tone_beard": "🧔🏿‍♀️", - "older_woman": "👵", - "grandma": "👵", - "older_woman_tone1": "👵🏻", - "grandma_tone1": "👵🏻", - "older_woman_tone2": "👵🏼", - "grandma_tone2": "👵🏼", - "older_woman_tone3": "👵🏽", - "grandma_tone3": "👵🏽", - "older_woman_tone4": "👵🏾", - "grandma_tone4": "👵🏾", - "older_woman_tone5": "👵🏿", - "grandma_tone5": "👵🏿", - "older_adult": "🧓", - "older_adult_tone1": "🧓🏻", - "older_adult_light_skin_tone": "🧓🏻", - "older_adult_tone2": "🧓🏼", - "older_adult_medium_light_skin_tone": "🧓🏼", - "older_adult_tone3": "🧓🏽", - "older_adult_medium_skin_tone": "🧓🏽", - "older_adult_tone4": "🧓🏾", - "older_adult_medium_dark_skin_tone": "🧓🏾", - "older_adult_tone5": "🧓🏿", - "older_adult_dark_skin_tone": "🧓🏿", - "older_man": "👴", - "older_man_tone1": "👴🏻", - "older_man_tone2": "👴🏼", - "older_man_tone3": "👴🏽", - "older_man_tone4": "👴🏾", - "older_man_tone5": "👴🏿", - "man_with_chinese_cap": "👲", - "man_with_gua_pi_mao": "👲", - "man_with_chinese_cap_tone1": "👲🏻", - "man_with_gua_pi_mao_tone1": "👲🏻", - "man_with_chinese_cap_tone2": "👲🏼", - "man_with_gua_pi_mao_tone2": "👲🏼", - "man_with_chinese_cap_tone3": "👲🏽", - "man_with_gua_pi_mao_tone3": "👲🏽", - "man_with_chinese_cap_tone4": "👲🏾", - "man_with_gua_pi_mao_tone4": "👲🏾", - "man_with_chinese_cap_tone5": "👲🏿", - "man_with_gua_pi_mao_tone5": "👲🏿", - "person_wearing_turban": "👳", - "man_with_turban": "👳", - "person_wearing_turban_tone1": "👳🏻", - "man_with_turban_tone1": "👳🏻", - "person_wearing_turban_tone2": "👳🏼", - "man_with_turban_tone2": "👳🏼", - "person_wearing_turban_tone3": "👳🏽", - "man_with_turban_tone3": "👳🏽", - "person_wearing_turban_tone4": "👳🏾", - "man_with_turban_tone4": "👳🏾", - "person_wearing_turban_tone5": "👳🏿", - "man_with_turban_tone5": "👳🏿", - "woman_wearing_turban": "👳‍♀️", - "woman_wearing_turban_tone1": "👳🏻‍♀️", - "woman_wearing_turban_light_skin_tone": "👳🏻‍♀️", - "woman_wearing_turban_tone2": "👳🏼‍♀️", - "woman_wearing_turban_medium_light_skin_tone": "👳🏼‍♀️", - "woman_wearing_turban_tone3": "👳🏽‍♀️", - "woman_wearing_turban_medium_skin_tone": "👳🏽‍♀️", - "woman_wearing_turban_tone4": "👳🏾‍♀️", - "woman_wearing_turban_medium_dark_skin_tone": "👳🏾‍♀️", - "woman_wearing_turban_tone5": "👳🏿‍♀️", - "woman_wearing_turban_dark_skin_tone": "👳🏿‍♀️", - "man_wearing_turban": "👳‍♂️", - "man_wearing_turban_tone1": "👳🏻‍♂️", - "man_wearing_turban_light_skin_tone": "👳🏻‍♂️", - "man_wearing_turban_tone2": "👳🏼‍♂️", - "man_wearing_turban_medium_light_skin_tone": "👳🏼‍♂️", - "man_wearing_turban_tone3": "👳🏽‍♂️", - "man_wearing_turban_medium_skin_tone": "👳🏽‍♂️", - "man_wearing_turban_tone4": "👳🏾‍♂️", - "man_wearing_turban_medium_dark_skin_tone": "👳🏾‍♂️", - "man_wearing_turban_tone5": "👳🏿‍♂️", - "man_wearing_turban_dark_skin_tone": "👳🏿‍♂️", - "woman_with_headscarf": "🧕", - "woman_with_headscarf_tone1": "🧕🏻", - "woman_with_headscarf_light_skin_tone": "🧕🏻", - "woman_with_headscarf_tone2": "🧕🏼", - "woman_with_headscarf_medium_light_skin_tone": "🧕🏼", - "woman_with_headscarf_tone3": "🧕🏽", - "woman_with_headscarf_medium_skin_tone": "🧕🏽", - "woman_with_headscarf_tone4": "🧕🏾", - "woman_with_headscarf_medium_dark_skin_tone": "🧕🏾", - "woman_with_headscarf_tone5": "🧕🏿", - "woman_with_headscarf_dark_skin_tone": "🧕🏿", - "police_officer": "👮", - "cop": "👮", - "police_officer_tone1": "👮🏻", - "cop_tone1": "👮🏻", - "police_officer_tone2": "👮🏼", - "cop_tone2": "👮🏼", - "police_officer_tone3": "👮🏽", - "cop_tone3": "👮🏽", - "police_officer_tone4": "👮🏾", - "cop_tone4": "👮🏾", - "police_officer_tone5": "👮🏿", - "cop_tone5": "👮🏿", - "woman_police_officer": "👮‍♀️", - "woman_police_officer_tone1": "👮🏻‍♀️", - "woman_police_officer_light_skin_tone": "👮🏻‍♀️", - "woman_police_officer_tone2": "👮🏼‍♀️", - "woman_police_officer_medium_light_skin_tone": "👮🏼‍♀️", - "woman_police_officer_tone3": "👮🏽‍♀️", - "woman_police_officer_medium_skin_tone": "👮🏽‍♀️", - "woman_police_officer_tone4": "👮🏾‍♀️", - "woman_police_officer_medium_dark_skin_tone": "👮🏾‍♀️", - "woman_police_officer_tone5": "👮🏿‍♀️", - "woman_police_officer_dark_skin_tone": "👮🏿‍♀️", - "man_police_officer": "👮‍♂️", - "man_police_officer_tone1": "👮🏻‍♂️", - "man_police_officer_light_skin_tone": "👮🏻‍♂️", - "man_police_officer_tone2": "👮🏼‍♂️", - "man_police_officer_medium_light_skin_tone": "👮🏼‍♂️", - "man_police_officer_tone3": "👮🏽‍♂️", - "man_police_officer_medium_skin_tone": "👮🏽‍♂️", - "man_police_officer_tone4": "👮🏾‍♂️", - "man_police_officer_medium_dark_skin_tone": "👮🏾‍♂️", - "man_police_officer_tone5": "👮🏿‍♂️", - "man_police_officer_dark_skin_tone": "👮🏿‍♂️", - "construction_worker": "👷", - "construction_worker_tone1": "👷🏻", - "construction_worker_tone2": "👷🏼", - "construction_worker_tone3": "👷🏽", - "construction_worker_tone4": "👷🏾", - "construction_worker_tone5": "👷🏿", - "woman_construction_worker": "👷‍♀️", - "woman_construction_worker_tone1": "👷🏻‍♀️", - "woman_construction_worker_light_skin_tone": "👷🏻‍♀️", - "woman_construction_worker_tone2": "👷🏼‍♀️", - "woman_construction_worker_medium_light_skin_tone": "👷🏼‍♀️", - "woman_construction_worker_tone3": "👷🏽‍♀️", - "woman_construction_worker_medium_skin_tone": "👷🏽‍♀️", - "woman_construction_worker_tone4": "👷🏾‍♀️", - "woman_construction_worker_medium_dark_skin_tone": "👷🏾‍♀️", - "woman_construction_worker_tone5": "👷🏿‍♀️", - "woman_construction_worker_dark_skin_tone": "👷🏿‍♀️", - "man_construction_worker": "👷‍♂️", - "man_construction_worker_tone1": "👷🏻‍♂️", - "man_construction_worker_light_skin_tone": "👷🏻‍♂️", - "man_construction_worker_tone2": "👷🏼‍♂️", - "man_construction_worker_medium_light_skin_tone": "👷🏼‍♂️", - "man_construction_worker_tone3": "👷🏽‍♂️", - "man_construction_worker_medium_skin_tone": "👷🏽‍♂️", - "man_construction_worker_tone4": "👷🏾‍♂️", - "man_construction_worker_medium_dark_skin_tone": "👷🏾‍♂️", - "man_construction_worker_tone5": "👷🏿‍♂️", - "man_construction_worker_dark_skin_tone": "👷🏿‍♂️", - "guard": "💂", - "guardsman": "💂", - "guard_tone1": "💂🏻", - "guardsman_tone1": "💂🏻", - "guard_tone2": "💂🏼", - "guardsman_tone2": "💂🏼", - "guard_tone3": "💂🏽", - "guardsman_tone3": "💂🏽", - "guard_tone4": "💂🏾", - "guardsman_tone4": "💂🏾", - "guard_tone5": "💂🏿", - "guardsman_tone5": "💂🏿", - "woman_guard": "💂‍♀️", - "woman_guard_tone1": "💂🏻‍♀️", - "woman_guard_light_skin_tone": "💂🏻‍♀️", - "woman_guard_tone2": "💂🏼‍♀️", - "woman_guard_medium_light_skin_tone": "💂🏼‍♀️", - "woman_guard_tone3": "💂🏽‍♀️", - "woman_guard_medium_skin_tone": "💂🏽‍♀️", - "woman_guard_tone4": "💂🏾‍♀️", - "woman_guard_medium_dark_skin_tone": "💂🏾‍♀️", - "woman_guard_tone5": "💂🏿‍♀️", - "woman_guard_dark_skin_tone": "💂🏿‍♀️", - "man_guard": "💂‍♂️", - "man_guard_tone1": "💂🏻‍♂️", - "man_guard_light_skin_tone": "💂🏻‍♂️", - "man_guard_tone2": "💂🏼‍♂️", - "man_guard_medium_light_skin_tone": "💂🏼‍♂️", - "man_guard_tone3": "💂🏽‍♂️", - "man_guard_medium_skin_tone": "💂🏽‍♂️", - "man_guard_tone4": "💂🏾‍♂️", - "man_guard_medium_dark_skin_tone": "💂🏾‍♂️", - "man_guard_tone5": "💂🏿‍♂️", - "man_guard_dark_skin_tone": "💂🏿‍♂️", - "detective": "🕵️", - "spy": "🕵️", - "sleuth_or_spy": "🕵️", - "detective_tone1": "🕵🏻", - "spy_tone1": "🕵🏻", - "sleuth_or_spy_tone1": "🕵🏻", - "detective_tone2": "🕵🏼", - "spy_tone2": "🕵🏼", - "sleuth_or_spy_tone2": "🕵🏼", - "detective_tone3": "🕵🏽", - "spy_tone3": "🕵🏽", - "sleuth_or_spy_tone3": "🕵🏽", - "detective_tone4": "🕵🏾", - "spy_tone4": "🕵🏾", - "sleuth_or_spy_tone4": "🕵🏾", - "detective_tone5": "🕵🏿", - "spy_tone5": "🕵🏿", - "sleuth_or_spy_tone5": "🕵🏿", - "woman_detective": "🕵️‍♀️", - "woman_detective_tone1": "🕵🏻‍♀️", - "woman_detective_light_skin_tone": "🕵🏻‍♀️", - "woman_detective_tone2": "🕵🏼‍♀️", - "woman_detective_medium_light_skin_tone": "🕵🏼‍♀️", - "woman_detective_tone3": "🕵🏽‍♀️", - "woman_detective_medium_skin_tone": "🕵🏽‍♀️", - "woman_detective_tone4": "🕵🏾‍♀️", - "woman_detective_medium_dark_skin_tone": "🕵🏾‍♀️", - "woman_detective_tone5": "🕵🏿‍♀️", - "woman_detective_dark_skin_tone": "🕵🏿‍♀️", - "man_detective": "🕵️‍♂️", - "man_detective_tone1": "🕵🏻‍♂️", - "man_detective_light_skin_tone": "🕵🏻‍♂️", - "man_detective_tone2": "🕵🏼‍♂️", - "man_detective_medium_light_skin_tone": "🕵🏼‍♂️", - "man_detective_tone3": "🕵🏽‍♂️", - "man_detective_medium_skin_tone": "🕵🏽‍♂️", - "man_detective_tone4": "🕵🏾‍♂️", - "man_detective_medium_dark_skin_tone": "🕵🏾‍♂️", - "man_detective_tone5": "🕵🏿‍♂️", - "man_detective_dark_skin_tone": "🕵🏿‍♂️", - "health_worker": "🧑‍⚕️", - "health_worker_tone1": "🧑🏻‍⚕️", - "health_worker_light_skin_tone": "🧑🏻‍⚕️", - "health_worker_tone2": "🧑🏼‍⚕️", - "health_worker_medium_light_skin_tone": "🧑🏼‍⚕️", - "health_worker_tone3": "🧑🏽‍⚕️", - "health_worker_medium_skin_tone": "🧑🏽‍⚕️", - "health_worker_tone4": "🧑🏾‍⚕️", - "health_worker_medium_dark_skin_tone": "🧑🏾‍⚕️", - "health_worker_tone5": "🧑🏿‍⚕️", - "health_worker_dark_skin_tone": "🧑🏿‍⚕️", - "woman_health_worker": "👩‍⚕️", - "woman_health_worker_tone1": "👩🏻‍⚕️", - "woman_health_worker_light_skin_tone": "👩🏻‍⚕️", - "woman_health_worker_tone2": "👩🏼‍⚕️", - "woman_health_worker_medium_light_skin_tone": "👩🏼‍⚕️", - "woman_health_worker_tone3": "👩🏽‍⚕️", - "woman_health_worker_medium_skin_tone": "👩🏽‍⚕️", - "woman_health_worker_tone4": "👩🏾‍⚕️", - "woman_health_worker_medium_dark_skin_tone": "👩🏾‍⚕️", - "woman_health_worker_tone5": "👩🏿‍⚕️", - "woman_health_worker_dark_skin_tone": "👩🏿‍⚕️", - "man_health_worker": "👨‍⚕️", - "man_health_worker_tone1": "👨🏻‍⚕️", - "man_health_worker_light_skin_tone": "👨🏻‍⚕️", - "man_health_worker_tone2": "👨🏼‍⚕️", - "man_health_worker_medium_light_skin_tone": "👨🏼‍⚕️", - "man_health_worker_tone3": "👨🏽‍⚕️", - "man_health_worker_medium_skin_tone": "👨🏽‍⚕️", - "man_health_worker_tone4": "👨🏾‍⚕️", - "man_health_worker_medium_dark_skin_tone": "👨🏾‍⚕️", - "man_health_worker_tone5": "👨🏿‍⚕️", - "man_health_worker_dark_skin_tone": "👨🏿‍⚕️", - "farmer": "🧑‍🌾", - "farmer_tone1": "🧑🏻‍🌾", - "farmer_light_skin_tone": "🧑🏻‍🌾", - "farmer_tone2": "🧑🏼‍🌾", - "farmer_medium_light_skin_tone": "🧑🏼‍🌾", - "farmer_tone3": "🧑🏽‍🌾", - "farmer_medium_skin_tone": "🧑🏽‍🌾", - "farmer_tone4": "🧑🏾‍🌾", - "farmer_medium_dark_skin_tone": "🧑🏾‍🌾", - "farmer_tone5": "🧑🏿‍🌾", - "farmer_dark_skin_tone": "🧑🏿‍🌾", - "woman_farmer": "👩‍🌾", - "woman_farmer_tone1": "👩🏻‍🌾", - "woman_farmer_light_skin_tone": "👩🏻‍🌾", - "woman_farmer_tone2": "👩🏼‍🌾", - "woman_farmer_medium_light_skin_tone": "👩🏼‍🌾", - "woman_farmer_tone3": "👩🏽‍🌾", - "woman_farmer_medium_skin_tone": "👩🏽‍🌾", - "woman_farmer_tone4": "👩🏾‍🌾", - "woman_farmer_medium_dark_skin_tone": "👩🏾‍🌾", - "woman_farmer_tone5": "👩🏿‍🌾", - "woman_farmer_dark_skin_tone": "👩🏿‍🌾", - "man_farmer": "👨‍🌾", - "man_farmer_tone1": "👨🏻‍🌾", - "man_farmer_light_skin_tone": "👨🏻‍🌾", - "man_farmer_tone2": "👨🏼‍🌾", - "man_farmer_medium_light_skin_tone": "👨🏼‍🌾", - "man_farmer_tone3": "👨🏽‍🌾", - "man_farmer_medium_skin_tone": "👨🏽‍🌾", - "man_farmer_tone4": "👨🏾‍🌾", - "man_farmer_medium_dark_skin_tone": "👨🏾‍🌾", - "man_farmer_tone5": "👨🏿‍🌾", - "man_farmer_dark_skin_tone": "👨🏿‍🌾", - "cook": "🧑‍🍳", - "cook_tone1": "🧑🏻‍🍳", - "cook_light_skin_tone": "🧑🏻‍🍳", - "cook_tone2": "🧑🏼‍🍳", - "cook_medium_light_skin_tone": "🧑🏼‍🍳", - "cook_tone3": "🧑🏽‍🍳", - "cook_medium_skin_tone": "🧑🏽‍🍳", - "cook_tone4": "🧑🏾‍🍳", - "cook_medium_dark_skin_tone": "🧑🏾‍🍳", - "cook_tone5": "🧑🏿‍🍳", - "cook_dark_skin_tone": "🧑🏿‍🍳", - "woman_cook": "👩‍🍳", - "woman_cook_tone1": "👩🏻‍🍳", - "woman_cook_light_skin_tone": "👩🏻‍🍳", - "woman_cook_tone2": "👩🏼‍🍳", - "woman_cook_medium_light_skin_tone": "👩🏼‍🍳", - "woman_cook_tone3": "👩🏽‍🍳", - "woman_cook_medium_skin_tone": "👩🏽‍🍳", - "woman_cook_tone4": "👩🏾‍🍳", - "woman_cook_medium_dark_skin_tone": "👩🏾‍🍳", - "woman_cook_tone5": "👩🏿‍🍳", - "woman_cook_dark_skin_tone": "👩🏿‍🍳", - "man_cook": "👨‍🍳", - "man_cook_tone1": "👨🏻‍🍳", - "man_cook_light_skin_tone": "👨🏻‍🍳", - "man_cook_tone2": "👨🏼‍🍳", - "man_cook_medium_light_skin_tone": "👨🏼‍🍳", - "man_cook_tone3": "👨🏽‍🍳", - "man_cook_medium_skin_tone": "👨🏽‍🍳", - "man_cook_tone4": "👨🏾‍🍳", - "man_cook_medium_dark_skin_tone": "👨🏾‍🍳", - "man_cook_tone5": "👨🏿‍🍳", - "man_cook_dark_skin_tone": "👨🏿‍🍳", - "student": "🧑‍🎓", - "student_tone1": "🧑🏻‍🎓", - "student_light_skin_tone": "🧑🏻‍🎓", - "student_tone2": "🧑🏼‍🎓", - "student_medium_light_skin_tone": "🧑🏼‍🎓", - "student_tone3": "🧑🏽‍🎓", - "student_medium_skin_tone": "🧑🏽‍🎓", - "student_tone4": "🧑🏾‍🎓", - "student_medium_dark_skin_tone": "🧑🏾‍🎓", - "student_tone5": "🧑🏿‍🎓", - "student_dark_skin_tone": "🧑🏿‍🎓", - "woman_student": "👩‍🎓", - "woman_student_tone1": "👩🏻‍🎓", - "woman_student_light_skin_tone": "👩🏻‍🎓", - "woman_student_tone2": "👩🏼‍🎓", - "woman_student_medium_light_skin_tone": "👩🏼‍🎓", - "woman_student_tone3": "👩🏽‍🎓", - "woman_student_medium_skin_tone": "👩🏽‍🎓", - "woman_student_tone4": "👩🏾‍🎓", - "woman_student_medium_dark_skin_tone": "👩🏾‍🎓", - "woman_student_tone5": "👩🏿‍🎓", - "woman_student_dark_skin_tone": "👩🏿‍🎓", - "man_student": "👨‍🎓", - "man_student_tone1": "👨🏻‍🎓", - "man_student_light_skin_tone": "👨🏻‍🎓", - "man_student_tone2": "👨🏼‍🎓", - "man_student_medium_light_skin_tone": "👨🏼‍🎓", - "man_student_tone3": "👨🏽‍🎓", - "man_student_medium_skin_tone": "👨🏽‍🎓", - "man_student_tone4": "👨🏾‍🎓", - "man_student_medium_dark_skin_tone": "👨🏾‍🎓", - "man_student_tone5": "👨🏿‍🎓", - "man_student_dark_skin_tone": "👨🏿‍🎓", - "singer": "🧑‍🎤", - "singer_tone1": "🧑🏻‍🎤", - "singer_light_skin_tone": "🧑🏻‍🎤", - "singer_tone2": "🧑🏼‍🎤", - "singer_medium_light_skin_tone": "🧑🏼‍🎤", - "singer_tone3": "🧑🏽‍🎤", - "singer_medium_skin_tone": "🧑🏽‍🎤", - "singer_tone4": "🧑🏾‍🎤", - "singer_medium_dark_skin_tone": "🧑🏾‍🎤", - "singer_tone5": "🧑🏿‍🎤", - "singer_dark_skin_tone": "🧑🏿‍🎤", - "woman_singer": "👩‍🎤", - "woman_singer_tone1": "👩🏻‍🎤", - "woman_singer_light_skin_tone": "👩🏻‍🎤", - "woman_singer_tone2": "👩🏼‍🎤", - "woman_singer_medium_light_skin_tone": "👩🏼‍🎤", - "woman_singer_tone3": "👩🏽‍🎤", - "woman_singer_medium_skin_tone": "👩🏽‍🎤", - "woman_singer_tone4": "👩🏾‍🎤", - "woman_singer_medium_dark_skin_tone": "👩🏾‍🎤", - "woman_singer_tone5": "👩🏿‍🎤", - "woman_singer_dark_skin_tone": "👩🏿‍🎤", - "man_singer": "👨‍🎤", - "man_singer_tone1": "👨🏻‍🎤", - "man_singer_light_skin_tone": "👨🏻‍🎤", - "man_singer_tone2": "👨🏼‍🎤", - "man_singer_medium_light_skin_tone": "👨🏼‍🎤", - "man_singer_tone3": "👨🏽‍🎤", - "man_singer_medium_skin_tone": "👨🏽‍🎤", - "man_singer_tone4": "👨🏾‍🎤", - "man_singer_medium_dark_skin_tone": "👨🏾‍🎤", - "man_singer_tone5": "👨🏿‍🎤", - "man_singer_dark_skin_tone": "👨🏿‍🎤", - "teacher": "🧑‍🏫", - "teacher_tone1": "🧑🏻‍🏫", - "teacher_light_skin_tone": "🧑🏻‍🏫", - "teacher_tone2": "🧑🏼‍🏫", - "teacher_medium_light_skin_tone": "🧑🏼‍🏫", - "teacher_tone3": "🧑🏽‍🏫", - "teacher_medium_skin_tone": "🧑🏽‍🏫", - "teacher_tone4": "🧑🏾‍🏫", - "teacher_medium_dark_skin_tone": "🧑🏾‍🏫", - "teacher_tone5": "🧑🏿‍🏫", - "teacher_dark_skin_tone": "🧑🏿‍🏫", - "woman_teacher": "👩‍🏫", - "woman_teacher_tone1": "👩🏻‍🏫", - "woman_teacher_light_skin_tone": "👩🏻‍🏫", - "woman_teacher_tone2": "👩🏼‍🏫", - "woman_teacher_medium_light_skin_tone": "👩🏼‍🏫", - "woman_teacher_tone3": "👩🏽‍🏫", - "woman_teacher_medium_skin_tone": "👩🏽‍🏫", - "woman_teacher_tone4": "👩🏾‍🏫", - "woman_teacher_medium_dark_skin_tone": "👩🏾‍🏫", - "woman_teacher_tone5": "👩🏿‍🏫", - "woman_teacher_dark_skin_tone": "👩🏿‍🏫", - "man_teacher": "👨‍🏫", - "man_teacher_tone1": "👨🏻‍🏫", - "man_teacher_light_skin_tone": "👨🏻‍🏫", - "man_teacher_tone2": "👨🏼‍🏫", - "man_teacher_medium_light_skin_tone": "👨🏼‍🏫", - "man_teacher_tone3": "👨🏽‍🏫", - "man_teacher_medium_skin_tone": "👨🏽‍🏫", - "man_teacher_tone4": "👨🏾‍🏫", - "man_teacher_medium_dark_skin_tone": "👨🏾‍🏫", - "man_teacher_tone5": "👨🏿‍🏫", - "man_teacher_dark_skin_tone": "👨🏿‍🏫", - "factory_worker": "🧑‍🏭", - "factory_worker_tone1": "🧑🏻‍🏭", - "factory_worker_light_skin_tone": "🧑🏻‍🏭", - "factory_worker_tone2": "🧑🏼‍🏭", - "factory_worker_medium_light_skin_tone": "🧑🏼‍🏭", - "factory_worker_tone3": "🧑🏽‍🏭", - "factory_worker_medium_skin_tone": "🧑🏽‍🏭", - "factory_worker_tone4": "🧑🏾‍🏭", - "factory_worker_medium_dark_skin_tone": "🧑🏾‍🏭", - "factory_worker_tone5": "🧑🏿‍🏭", - "factory_worker_dark_skin_tone": "🧑🏿‍🏭", - "woman_factory_worker": "👩‍🏭", - "woman_factory_worker_tone1": "👩🏻‍🏭", - "woman_factory_worker_light_skin_tone": "👩🏻‍🏭", - "woman_factory_worker_tone2": "👩🏼‍🏭", - "woman_factory_worker_medium_light_skin_tone": "👩🏼‍🏭", - "woman_factory_worker_tone3": "👩🏽‍🏭", - "woman_factory_worker_medium_skin_tone": "👩🏽‍🏭", - "woman_factory_worker_tone4": "👩🏾‍🏭", - "woman_factory_worker_medium_dark_skin_tone": "👩🏾‍🏭", - "woman_factory_worker_tone5": "👩🏿‍🏭", - "woman_factory_worker_dark_skin_tone": "👩🏿‍🏭", - "man_factory_worker": "👨‍🏭", - "man_factory_worker_tone1": "👨🏻‍🏭", - "man_factory_worker_light_skin_tone": "👨🏻‍🏭", - "man_factory_worker_tone2": "👨🏼‍🏭", - "man_factory_worker_medium_light_skin_tone": "👨🏼‍🏭", - "man_factory_worker_tone3": "👨🏽‍🏭", - "man_factory_worker_medium_skin_tone": "👨🏽‍🏭", - "man_factory_worker_tone4": "👨🏾‍🏭", - "man_factory_worker_medium_dark_skin_tone": "👨🏾‍🏭", - "man_factory_worker_tone5": "👨🏿‍🏭", - "man_factory_worker_dark_skin_tone": "👨🏿‍🏭", - "technologist": "🧑‍💻", - "technologist_tone1": "🧑🏻‍💻", - "technologist_light_skin_tone": "🧑🏻‍💻", - "technologist_tone2": "🧑🏼‍💻", - "technologist_medium_light_skin_tone": "🧑🏼‍💻", - "technologist_tone3": "🧑🏽‍💻", - "technologist_medium_skin_tone": "🧑🏽‍💻", - "technologist_tone4": "🧑🏾‍💻", - "technologist_medium_dark_skin_tone": "🧑🏾‍💻", - "technologist_tone5": "🧑🏿‍💻", - "technologist_dark_skin_tone": "🧑🏿‍💻", - "woman_technologist": "👩‍💻", - "woman_technologist_tone1": "👩🏻‍💻", - "woman_technologist_light_skin_tone": "👩🏻‍💻", - "woman_technologist_tone2": "👩🏼‍💻", - "woman_technologist_medium_light_skin_tone": "👩🏼‍💻", - "woman_technologist_tone3": "👩🏽‍💻", - "woman_technologist_medium_skin_tone": "👩🏽‍💻", - "woman_technologist_tone4": "👩🏾‍💻", - "woman_technologist_medium_dark_skin_tone": "👩🏾‍💻", - "woman_technologist_tone5": "👩🏿‍💻", - "woman_technologist_dark_skin_tone": "👩🏿‍💻", - "man_technologist": "👨‍💻", - "man_technologist_tone1": "👨🏻‍💻", - "man_technologist_light_skin_tone": "👨🏻‍💻", - "man_technologist_tone2": "👨🏼‍💻", - "man_technologist_medium_light_skin_tone": "👨🏼‍💻", - "man_technologist_tone3": "👨🏽‍💻", - "man_technologist_medium_skin_tone": "👨🏽‍💻", - "man_technologist_tone4": "👨🏾‍💻", - "man_technologist_medium_dark_skin_tone": "👨🏾‍💻", - "man_technologist_tone5": "👨🏿‍💻", - "man_technologist_dark_skin_tone": "👨🏿‍💻", - "office_worker": "🧑‍💼", - "office_worker_tone1": "🧑🏻‍💼", - "office_worker_light_skin_tone": "🧑🏻‍💼", - "office_worker_tone2": "🧑🏼‍💼", - "office_worker_medium_light_skin_tone": "🧑🏼‍💼", - "office_worker_tone3": "🧑🏽‍💼", - "office_worker_medium_skin_tone": "🧑🏽‍💼", - "office_worker_tone4": "🧑🏾‍💼", - "office_worker_medium_dark_skin_tone": "🧑🏾‍💼", - "office_worker_tone5": "🧑🏿‍💼", - "office_worker_dark_skin_tone": "🧑🏿‍💼", - "woman_office_worker": "👩‍💼", - "woman_office_worker_tone1": "👩🏻‍💼", - "woman_office_worker_light_skin_tone": "👩🏻‍💼", - "woman_office_worker_tone2": "👩🏼‍💼", - "woman_office_worker_medium_light_skin_tone": "👩🏼‍💼", - "woman_office_worker_tone3": "👩🏽‍💼", - "woman_office_worker_medium_skin_tone": "👩🏽‍💼", - "woman_office_worker_tone4": "👩🏾‍💼", - "woman_office_worker_medium_dark_skin_tone": "👩🏾‍💼", - "woman_office_worker_tone5": "👩🏿‍💼", - "woman_office_worker_dark_skin_tone": "👩🏿‍💼", - "man_office_worker": "👨‍💼", - "man_office_worker_tone1": "👨🏻‍💼", - "man_office_worker_light_skin_tone": "👨🏻‍💼", - "man_office_worker_tone2": "👨🏼‍💼", - "man_office_worker_medium_light_skin_tone": "👨🏼‍💼", - "man_office_worker_tone3": "👨🏽‍💼", - "man_office_worker_medium_skin_tone": "👨🏽‍💼", - "man_office_worker_tone4": "👨🏾‍💼", - "man_office_worker_medium_dark_skin_tone": "👨🏾‍💼", - "man_office_worker_tone5": "👨🏿‍💼", - "man_office_worker_dark_skin_tone": "👨🏿‍💼", - "mechanic": "🧑‍🔧", - "mechanic_tone1": "🧑🏻‍🔧", - "mechanic_light_skin_tone": "🧑🏻‍🔧", - "mechanic_tone2": "🧑🏼‍🔧", - "mechanic_medium_light_skin_tone": "🧑🏼‍🔧", - "mechanic_tone3": "🧑🏽‍🔧", - "mechanic_medium_skin_tone": "🧑🏽‍🔧", - "mechanic_tone4": "🧑🏾‍🔧", - "mechanic_medium_dark_skin_tone": "🧑🏾‍🔧", - "mechanic_tone5": "🧑🏿‍🔧", - "mechanic_dark_skin_tone": "🧑🏿‍🔧", - "woman_mechanic": "👩‍🔧", - "woman_mechanic_tone1": "👩🏻‍🔧", - "woman_mechanic_light_skin_tone": "👩🏻‍🔧", - "woman_mechanic_tone2": "👩🏼‍🔧", - "woman_mechanic_medium_light_skin_tone": "👩🏼‍🔧", - "woman_mechanic_tone3": "👩🏽‍🔧", - "woman_mechanic_medium_skin_tone": "👩🏽‍🔧", - "woman_mechanic_tone4": "👩🏾‍🔧", - "woman_mechanic_medium_dark_skin_tone": "👩🏾‍🔧", - "woman_mechanic_tone5": "👩🏿‍🔧", - "woman_mechanic_dark_skin_tone": "👩🏿‍🔧", - "man_mechanic": "👨‍🔧", - "man_mechanic_tone1": "👨🏻‍🔧", - "man_mechanic_light_skin_tone": "👨🏻‍🔧", - "man_mechanic_tone2": "👨🏼‍🔧", - "man_mechanic_medium_light_skin_tone": "👨🏼‍🔧", - "man_mechanic_tone3": "👨🏽‍🔧", - "man_mechanic_medium_skin_tone": "👨🏽‍🔧", - "man_mechanic_tone4": "👨🏾‍🔧", - "man_mechanic_medium_dark_skin_tone": "👨🏾‍🔧", - "man_mechanic_tone5": "👨🏿‍🔧", - "man_mechanic_dark_skin_tone": "👨🏿‍🔧", - "scientist": "🧑‍🔬", - "scientist_tone1": "🧑🏻‍🔬", - "scientist_light_skin_tone": "🧑🏻‍🔬", - "scientist_tone2": "🧑🏼‍🔬", - "scientist_medium_light_skin_tone": "🧑🏼‍🔬", - "scientist_tone3": "🧑🏽‍🔬", - "scientist_medium_skin_tone": "🧑🏽‍🔬", - "scientist_tone4": "🧑🏾‍🔬", - "scientist_medium_dark_skin_tone": "🧑🏾‍🔬", - "scientist_tone5": "🧑🏿‍🔬", - "scientist_dark_skin_tone": "🧑🏿‍🔬", - "woman_scientist": "👩‍🔬", - "woman_scientist_tone1": "👩🏻‍🔬", - "woman_scientist_light_skin_tone": "👩🏻‍🔬", - "woman_scientist_tone2": "👩🏼‍🔬", - "woman_scientist_medium_light_skin_tone": "👩🏼‍🔬", - "woman_scientist_tone3": "👩🏽‍🔬", - "woman_scientist_medium_skin_tone": "👩🏽‍🔬", - "woman_scientist_tone4": "👩🏾‍🔬", - "woman_scientist_medium_dark_skin_tone": "👩🏾‍🔬", - "woman_scientist_tone5": "👩🏿‍🔬", - "woman_scientist_dark_skin_tone": "👩🏿‍🔬", - "man_scientist": "👨‍🔬", - "man_scientist_tone1": "👨🏻‍🔬", - "man_scientist_light_skin_tone": "👨🏻‍🔬", - "man_scientist_tone2": "👨🏼‍🔬", - "man_scientist_medium_light_skin_tone": "👨🏼‍🔬", - "man_scientist_tone3": "👨🏽‍🔬", - "man_scientist_medium_skin_tone": "👨🏽‍🔬", - "man_scientist_tone4": "👨🏾‍🔬", - "man_scientist_medium_dark_skin_tone": "👨🏾‍🔬", - "man_scientist_tone5": "👨🏿‍🔬", - "man_scientist_dark_skin_tone": "👨🏿‍🔬", - "artist": "🧑‍🎨", - "artist_tone1": "🧑🏻‍🎨", - "artist_light_skin_tone": "🧑🏻‍🎨", - "artist_tone2": "🧑🏼‍🎨", - "artist_medium_light_skin_tone": "🧑🏼‍🎨", - "artist_tone3": "🧑🏽‍🎨", - "artist_medium_skin_tone": "🧑🏽‍🎨", - "artist_tone4": "🧑🏾‍🎨", - "artist_medium_dark_skin_tone": "🧑🏾‍🎨", - "artist_tone5": "🧑🏿‍🎨", - "artist_dark_skin_tone": "🧑🏿‍🎨", - "woman_artist": "👩‍🎨", - "woman_artist_tone1": "👩🏻‍🎨", - "woman_artist_light_skin_tone": "👩🏻‍🎨", - "woman_artist_tone2": "👩🏼‍🎨", - "woman_artist_medium_light_skin_tone": "👩🏼‍🎨", - "woman_artist_tone3": "👩🏽‍🎨", - "woman_artist_medium_skin_tone": "👩🏽‍🎨", - "woman_artist_tone4": "👩🏾‍🎨", - "woman_artist_medium_dark_skin_tone": "👩🏾‍🎨", - "woman_artist_tone5": "👩🏿‍🎨", - "woman_artist_dark_skin_tone": "👩🏿‍🎨", - "man_artist": "👨‍🎨", - "man_artist_tone1": "👨🏻‍🎨", - "man_artist_light_skin_tone": "👨🏻‍🎨", - "man_artist_tone2": "👨🏼‍🎨", - "man_artist_medium_light_skin_tone": "👨🏼‍🎨", - "man_artist_tone3": "👨🏽‍🎨", - "man_artist_medium_skin_tone": "👨🏽‍🎨", - "man_artist_tone4": "👨🏾‍🎨", - "man_artist_medium_dark_skin_tone": "👨🏾‍🎨", - "man_artist_tone5": "👨🏿‍🎨", - "man_artist_dark_skin_tone": "👨🏿‍🎨", - "firefighter": "🧑‍🚒", - "firefighter_tone1": "🧑🏻‍🚒", - "firefighter_light_skin_tone": "🧑🏻‍🚒", - "firefighter_tone2": "🧑🏼‍🚒", - "firefighter_medium_light_skin_tone": "🧑🏼‍🚒", - "firefighter_tone3": "🧑🏽‍🚒", - "firefighter_medium_skin_tone": "🧑🏽‍🚒", - "firefighter_tone4": "🧑🏾‍🚒", - "firefighter_medium_dark_skin_tone": "🧑🏾‍🚒", - "firefighter_tone5": "🧑🏿‍🚒", - "firefighter_dark_skin_tone": "🧑🏿‍🚒", - "woman_firefighter": "👩‍🚒", - "woman_firefighter_tone1": "👩🏻‍🚒", - "woman_firefighter_light_skin_tone": "👩🏻‍🚒", - "woman_firefighter_tone2": "👩🏼‍🚒", - "woman_firefighter_medium_light_skin_tone": "👩🏼‍🚒", - "woman_firefighter_tone3": "👩🏽‍🚒", - "woman_firefighter_medium_skin_tone": "👩🏽‍🚒", - "woman_firefighter_tone4": "👩🏾‍🚒", - "woman_firefighter_medium_dark_skin_tone": "👩🏾‍🚒", - "woman_firefighter_tone5": "👩🏿‍🚒", - "woman_firefighter_dark_skin_tone": "👩🏿‍🚒", - "man_firefighter": "👨‍🚒", - "man_firefighter_tone1": "👨🏻‍🚒", - "man_firefighter_light_skin_tone": "👨🏻‍🚒", - "man_firefighter_tone2": "👨🏼‍🚒", - "man_firefighter_medium_light_skin_tone": "👨🏼‍🚒", - "man_firefighter_tone3": "👨🏽‍🚒", - "man_firefighter_medium_skin_tone": "👨🏽‍🚒", - "man_firefighter_tone4": "👨🏾‍🚒", - "man_firefighter_medium_dark_skin_tone": "👨🏾‍🚒", - "man_firefighter_tone5": "👨🏿‍🚒", - "man_firefighter_dark_skin_tone": "👨🏿‍🚒", - "pilot": "🧑‍✈️", - "pilot_tone1": "🧑🏻‍✈️", - "pilot_light_skin_tone": "🧑🏻‍✈️", - "pilot_tone2": "🧑🏼‍✈️", - "pilot_medium_light_skin_tone": "🧑🏼‍✈️", - "pilot_tone3": "🧑🏽‍✈️", - "pilot_medium_skin_tone": "🧑🏽‍✈️", - "pilot_tone4": "🧑🏾‍✈️", - "pilot_medium_dark_skin_tone": "🧑🏾‍✈️", - "pilot_tone5": "🧑🏿‍✈️", - "pilot_dark_skin_tone": "🧑🏿‍✈️", - "woman_pilot": "👩‍✈️", - "woman_pilot_tone1": "👩🏻‍✈️", - "woman_pilot_light_skin_tone": "👩🏻‍✈️", - "woman_pilot_tone2": "👩🏼‍✈️", - "woman_pilot_medium_light_skin_tone": "👩🏼‍✈️", - "woman_pilot_tone3": "👩🏽‍✈️", - "woman_pilot_medium_skin_tone": "👩🏽‍✈️", - "woman_pilot_tone4": "👩🏾‍✈️", - "woman_pilot_medium_dark_skin_tone": "👩🏾‍✈️", - "woman_pilot_tone5": "👩🏿‍✈️", - "woman_pilot_dark_skin_tone": "👩🏿‍✈️", - "man_pilot": "👨‍✈️", - "man_pilot_tone1": "👨🏻‍✈️", - "man_pilot_light_skin_tone": "👨🏻‍✈️", - "man_pilot_tone2": "👨🏼‍✈️", - "man_pilot_medium_light_skin_tone": "👨🏼‍✈️", - "man_pilot_tone3": "👨🏽‍✈️", - "man_pilot_medium_skin_tone": "👨🏽‍✈️", - "man_pilot_tone4": "👨🏾‍✈️", - "man_pilot_medium_dark_skin_tone": "👨🏾‍✈️", - "man_pilot_tone5": "👨🏿‍✈️", - "man_pilot_dark_skin_tone": "👨🏿‍✈️", - "astronaut": "🧑‍🚀", - "astronaut_tone1": "🧑🏻‍🚀", - "astronaut_light_skin_tone": "🧑🏻‍🚀", - "astronaut_tone2": "🧑🏼‍🚀", - "astronaut_medium_light_skin_tone": "🧑🏼‍🚀", - "astronaut_tone3": "🧑🏽‍🚀", - "astronaut_medium_skin_tone": "🧑🏽‍🚀", - "astronaut_tone4": "🧑🏾‍🚀", - "astronaut_medium_dark_skin_tone": "🧑🏾‍🚀", - "astronaut_tone5": "🧑🏿‍🚀", - "astronaut_dark_skin_tone": "🧑🏿‍🚀", - "woman_astronaut": "👩‍🚀", - "woman_astronaut_tone1": "👩🏻‍🚀", - "woman_astronaut_light_skin_tone": "👩🏻‍🚀", - "woman_astronaut_tone2": "👩🏼‍🚀", - "woman_astronaut_medium_light_skin_tone": "👩🏼‍🚀", - "woman_astronaut_tone3": "👩🏽‍🚀", - "woman_astronaut_medium_skin_tone": "👩🏽‍🚀", - "woman_astronaut_tone4": "👩🏾‍🚀", - "woman_astronaut_medium_dark_skin_tone": "👩🏾‍🚀", - "woman_astronaut_tone5": "👩🏿‍🚀", - "woman_astronaut_dark_skin_tone": "👩🏿‍🚀", - "man_astronaut": "👨‍🚀", - "man_astronaut_tone1": "👨🏻‍🚀", - "man_astronaut_light_skin_tone": "👨🏻‍🚀", - "man_astronaut_tone2": "👨🏼‍🚀", - "man_astronaut_medium_light_skin_tone": "👨🏼‍🚀", - "man_astronaut_tone3": "👨🏽‍🚀", - "man_astronaut_medium_skin_tone": "👨🏽‍🚀", - "man_astronaut_tone4": "👨🏾‍🚀", - "man_astronaut_medium_dark_skin_tone": "👨🏾‍🚀", - "man_astronaut_tone5": "👨🏿‍🚀", - "man_astronaut_dark_skin_tone": "👨🏿‍🚀", - "judge": "🧑‍⚖️", - "judge_tone1": "🧑🏻‍⚖️", - "judge_light_skin_tone": "🧑🏻‍⚖️", - "judge_tone2": "🧑🏼‍⚖️", - "judge_medium_light_skin_tone": "🧑🏼‍⚖️", - "judge_tone3": "🧑🏽‍⚖️", - "judge_medium_skin_tone": "🧑🏽‍⚖️", - "judge_tone4": "🧑🏾‍⚖️", - "judge_medium_dark_skin_tone": "🧑🏾‍⚖️", - "judge_tone5": "🧑🏿‍⚖️", - "judge_dark_skin_tone": "🧑🏿‍⚖️", - "woman_judge": "👩‍⚖️", - "woman_judge_tone1": "👩🏻‍⚖️", - "woman_judge_light_skin_tone": "👩🏻‍⚖️", - "woman_judge_tone2": "👩🏼‍⚖️", - "woman_judge_medium_light_skin_tone": "👩🏼‍⚖️", - "woman_judge_tone3": "👩🏽‍⚖️", - "woman_judge_medium_skin_tone": "👩🏽‍⚖️", - "woman_judge_tone4": "👩🏾‍⚖️", - "woman_judge_medium_dark_skin_tone": "👩🏾‍⚖️", - "woman_judge_tone5": "👩🏿‍⚖️", - "woman_judge_dark_skin_tone": "👩🏿‍⚖️", - "man_judge": "👨‍⚖️", - "man_judge_tone1": "👨🏻‍⚖️", - "man_judge_light_skin_tone": "👨🏻‍⚖️", - "man_judge_tone2": "👨🏼‍⚖️", - "man_judge_medium_light_skin_tone": "👨🏼‍⚖️", - "man_judge_tone3": "👨🏽‍⚖️", - "man_judge_medium_skin_tone": "👨🏽‍⚖️", - "man_judge_tone4": "👨🏾‍⚖️", - "man_judge_medium_dark_skin_tone": "👨🏾‍⚖️", - "man_judge_tone5": "👨🏿‍⚖️", - "man_judge_dark_skin_tone": "👨🏿‍⚖️", - "person_with_veil": "👰", - "person_with_veil_tone1": "👰🏻", - "person_with_veil_tone2": "👰🏼", - "person_with_veil_tone3": "👰🏽", - "person_with_veil_tone4": "👰🏾", - "person_with_veil_tone5": "👰🏿", - "woman_with_veil": "👰‍♀️", - "bride_with_veil": "👰‍♀️", - "woman_with_veil_tone1": "👰🏻‍♀️", - "woman_with_veil_light_skin_tone": "👰🏻‍♀️", - "woman_with_veil_tone2": "👰🏼‍♀️", - "woman_with_veil_medium_light_skin_tone": "👰🏼‍♀️", - "woman_with_veil_tone3": "👰🏽‍♀️", - "woman_with_veil_medium_skin_tone": "👰🏽‍♀️", - "woman_with_veil_tone4": "👰🏾‍♀️", - "woman_with_veil_medium_dark_skin_tone": "👰🏾‍♀️", - "woman_with_veil_tone5": "👰🏿‍♀️", - "woman_with_veil_dark_skin_tone": "👰🏿‍♀️", - "man_with_veil": "👰‍♂️", - "man_with_veil_tone1": "👰🏻‍♂️", - "man_with_veil_light_skin_tone": "👰🏻‍♂️", - "man_with_veil_tone2": "👰🏼‍♂️", - "man_with_veil_medium_light_skin_tone": "👰🏼‍♂️", - "man_with_veil_tone3": "👰🏽‍♂️", - "man_with_veil_medium_skin_tone": "👰🏽‍♂️", - "man_with_veil_tone4": "👰🏾‍♂️", - "man_with_veil_medium_dark_skin_tone": "👰🏾‍♂️", - "man_with_veil_tone5": "👰🏿‍♂️", - "man_with_veil_dark_skin_tone": "👰🏿‍♂️", - "person_in_tuxedo": "🤵", - "person_in_tuxedo_tone1": "🤵🏻", - "tuxedo_tone1": "🤵🏻", - "person_in_tuxedo_tone2": "🤵🏼", - "tuxedo_tone2": "🤵🏼", - "person_in_tuxedo_tone3": "🤵🏽", - "tuxedo_tone3": "🤵🏽", - "person_in_tuxedo_tone4": "🤵🏾", - "tuxedo_tone4": "🤵🏾", - "person_in_tuxedo_tone5": "🤵🏿", - "tuxedo_tone5": "🤵🏿", - "woman_in_tuxedo": "🤵‍♀️", - "woman_in_tuxedo_tone1": "🤵🏻‍♀️", - "woman_in_tuxedo_light_skin_tone": "🤵🏻‍♀️", - "woman_in_tuxedo_tone2": "🤵🏼‍♀️", - "woman_in_tuxedo_medium_light_skin_tone": "🤵🏼‍♀️", - "woman_in_tuxedo_tone3": "🤵🏽‍♀️", - "woman_in_tuxedo_medium_skin_tone": "🤵🏽‍♀️", - "woman_in_tuxedo_tone4": "🤵🏾‍♀️", - "woman_in_tuxedo_medium_dark_skin_tone": "🤵🏾‍♀️", - "woman_in_tuxedo_tone5": "🤵🏿‍♀️", - "woman_in_tuxedo_dark_skin_tone": "🤵🏿‍♀️", - "man_in_tuxedo": "🤵‍♂️", - "man_in_tuxedo_tone1": "🤵🏻‍♂️", - "man_in_tuxedo_light_skin_tone": "🤵🏻‍♂️", - "man_in_tuxedo_tone2": "🤵🏼‍♂️", - "man_in_tuxedo_medium_light_skin_tone": "🤵🏼‍♂️", - "man_in_tuxedo_tone3": "🤵🏽‍♂️", - "man_in_tuxedo_medium_skin_tone": "🤵🏽‍♂️", - "man_in_tuxedo_tone4": "🤵🏾‍♂️", - "man_in_tuxedo_medium_dark_skin_tone": "🤵🏾‍♂️", - "man_in_tuxedo_tone5": "🤵🏿‍♂️", - "man_in_tuxedo_dark_skin_tone": "🤵🏿‍♂️", - "princess": "👸", - "princess_tone1": "👸🏻", - "princess_tone2": "👸🏼", - "princess_tone3": "👸🏽", - "princess_tone4": "👸🏾", - "princess_tone5": "👸🏿", - "prince": "🤴", - "prince_tone1": "🤴🏻", - "prince_tone2": "🤴🏼", - "prince_tone3": "🤴🏽", - "prince_tone4": "🤴🏾", - "prince_tone5": "🤴🏿", - "superhero": "🦸", - "superhero_tone1": "🦸🏻", - "superhero_light_skin_tone": "🦸🏻", - "superhero_tone2": "🦸🏼", - "superhero_medium_light_skin_tone": "🦸🏼", - "superhero_tone3": "🦸🏽", - "superhero_medium_skin_tone": "🦸🏽", - "superhero_tone4": "🦸🏾", - "superhero_medium_dark_skin_tone": "🦸🏾", - "superhero_tone5": "🦸🏿", - "superhero_dark_skin_tone": "🦸🏿", - "woman_superhero": "🦸‍♀️", - "woman_superhero_tone1": "🦸🏻‍♀️", - "woman_superhero_light_skin_tone": "🦸🏻‍♀️", - "woman_superhero_tone2": "🦸🏼‍♀️", - "woman_superhero_medium_light_skin_tone": "🦸🏼‍♀️", - "woman_superhero_tone3": "🦸🏽‍♀️", - "woman_superhero_medium_skin_tone": "🦸🏽‍♀️", - "woman_superhero_tone4": "🦸🏾‍♀️", - "woman_superhero_medium_dark_skin_tone": "🦸🏾‍♀️", - "woman_superhero_tone5": "🦸🏿‍♀️", - "woman_superhero_dark_skin_tone": "🦸🏿‍♀️", - "man_superhero": "🦸‍♂️", - "man_superhero_tone1": "🦸🏻‍♂️", - "man_superhero_light_skin_tone": "🦸🏻‍♂️", - "man_superhero_tone2": "🦸🏼‍♂️", - "man_superhero_medium_light_skin_tone": "🦸🏼‍♂️", - "man_superhero_tone3": "🦸🏽‍♂️", - "man_superhero_medium_skin_tone": "🦸🏽‍♂️", - "man_superhero_tone4": "🦸🏾‍♂️", - "man_superhero_medium_dark_skin_tone": "🦸🏾‍♂️", - "man_superhero_tone5": "🦸🏿‍♂️", - "man_superhero_dark_skin_tone": "🦸🏿‍♂️", - "supervillain": "🦹", - "supervillain_tone1": "🦹🏻", - "supervillain_light_skin_tone": "🦹🏻", - "supervillain_tone2": "🦹🏼", - "supervillain_medium_light_skin_tone": "🦹🏼", - "supervillain_tone3": "🦹🏽", - "supervillain_medium_skin_tone": "🦹🏽", - "supervillain_tone4": "🦹🏾", - "supervillain_medium_dark_skin_tone": "🦹🏾", - "supervillain_tone5": "🦹🏿", - "supervillain_dark_skin_tone": "🦹🏿", - "woman_supervillain": "🦹‍♀️", - "woman_supervillain_tone1": "🦹🏻‍♀️", - "woman_supervillain_light_skin_tone": "🦹🏻‍♀️", - "woman_supervillain_tone2": "🦹🏼‍♀️", - "woman_supervillain_medium_light_skin_tone": "🦹🏼‍♀️", - "woman_supervillain_tone3": "🦹🏽‍♀️", - "woman_supervillain_medium_skin_tone": "🦹🏽‍♀️", - "woman_supervillain_tone4": "🦹🏾‍♀️", - "woman_supervillain_medium_dark_skin_tone": "🦹🏾‍♀️", - "woman_supervillain_tone5": "🦹🏿‍♀️", - "woman_supervillain_dark_skin_tone": "🦹🏿‍♀️", - "man_supervillain": "🦹‍♂️", - "man_supervillain_tone1": "🦹🏻‍♂️", - "man_supervillain_light_skin_tone": "🦹🏻‍♂️", - "man_supervillain_tone2": "🦹🏼‍♂️", - "man_supervillain_medium_light_skin_tone": "🦹🏼‍♂️", - "man_supervillain_tone3": "🦹🏽‍♂️", - "man_supervillain_medium_skin_tone": "🦹🏽‍♂️", - "man_supervillain_tone4": "🦹🏾‍♂️", - "man_supervillain_medium_dark_skin_tone": "🦹🏾‍♂️", - "man_supervillain_tone5": "🦹🏿‍♂️", - "man_supervillain_dark_skin_tone": "🦹🏿‍♂️", - "ninja": "🥷", - "ninja_tone1": "🥷🏻", - "ninja_light_skin_tone": "🥷🏻", - "ninja_tone2": "🥷🏼", - "ninja_medium_light_skin_tone": "🥷🏼", - "ninja_tone3": "🥷🏽", - "ninja_medium_skin_tone": "🥷🏽", - "ninja_tone4": "🥷🏾", - "ninja_medium_dark_skin_tone": "🥷🏾", - "ninja_tone5": "🥷🏿", - "ninja_dark_skin_tone": "🥷🏿", - "mx_claus": "🧑‍🎄", - "mx_claus_tone1": "🧑🏻‍🎄", - "mx_claus_light_skin_tone": "🧑🏻‍🎄", - "mx_claus_tone2": "🧑🏼‍🎄", - "mx_claus_medium_light_skin_tone": "🧑🏼‍🎄", - "mx_claus_tone3": "🧑🏽‍🎄", - "mx_claus_medium_skin_tone": "🧑🏽‍🎄", - "mx_claus_tone4": "🧑🏾‍🎄", - "mx_claus_medium_dark_skin_tone": "🧑🏾‍🎄", - "mx_claus_tone5": "🧑🏿‍🎄", - "mx_claus_dark_skin_tone": "🧑🏿‍🎄", - "mrs_claus": "🤶", - "mother_christmas": "🤶", - "mrs_claus_tone1": "🤶🏻", - "mother_christmas_tone1": "🤶🏻", - "mrs_claus_tone2": "🤶🏼", - "mother_christmas_tone2": "🤶🏼", - "mrs_claus_tone3": "🤶🏽", - "mother_christmas_tone3": "🤶🏽", - "mrs_claus_tone4": "🤶🏾", - "mother_christmas_tone4": "🤶🏾", - "mrs_claus_tone5": "🤶🏿", - "mother_christmas_tone5": "🤶🏿", - "santa": "🎅", - "santa_tone1": "🎅🏻", - "santa_tone2": "🎅🏼", - "santa_tone3": "🎅🏽", - "santa_tone4": "🎅🏾", - "santa_tone5": "🎅🏿", - "mage": "🧙", - "mage_tone1": "🧙🏻", - "mage_light_skin_tone": "🧙🏻", - "mage_tone2": "🧙🏼", - "mage_medium_light_skin_tone": "🧙🏼", - "mage_tone3": "🧙🏽", - "mage_medium_skin_tone": "🧙🏽", - "mage_tone4": "🧙🏾", - "mage_medium_dark_skin_tone": "🧙🏾", - "mage_tone5": "🧙🏿", - "mage_dark_skin_tone": "🧙🏿", - "woman_mage": "🧙‍♀️", - "woman_mage_tone1": "🧙🏻‍♀️", - "woman_mage_light_skin_tone": "🧙🏻‍♀️", - "woman_mage_tone2": "🧙🏼‍♀️", - "woman_mage_medium_light_skin_tone": "🧙🏼‍♀️", - "woman_mage_tone3": "🧙🏽‍♀️", - "woman_mage_medium_skin_tone": "🧙🏽‍♀️", - "woman_mage_tone4": "🧙🏾‍♀️", - "woman_mage_medium_dark_skin_tone": "🧙🏾‍♀️", - "woman_mage_tone5": "🧙🏿‍♀️", - "woman_mage_dark_skin_tone": "🧙🏿‍♀️", - "man_mage": "🧙‍♂️", - "man_mage_tone1": "🧙🏻‍♂️", - "man_mage_light_skin_tone": "🧙🏻‍♂️", - "man_mage_tone2": "🧙🏼‍♂️", - "man_mage_medium_light_skin_tone": "🧙🏼‍♂️", - "man_mage_tone3": "🧙🏽‍♂️", - "man_mage_medium_skin_tone": "🧙🏽‍♂️", - "man_mage_tone4": "🧙🏾‍♂️", - "man_mage_medium_dark_skin_tone": "🧙🏾‍♂️", - "man_mage_tone5": "🧙🏿‍♂️", - "man_mage_dark_skin_tone": "🧙🏿‍♂️", - "elf": "🧝", - "elf_tone1": "🧝🏻", - "elf_light_skin_tone": "🧝🏻", - "elf_tone2": "🧝🏼", - "elf_medium_light_skin_tone": "🧝🏼", - "elf_tone3": "🧝🏽", - "elf_medium_skin_tone": "🧝🏽", - "elf_tone4": "🧝🏾", - "elf_medium_dark_skin_tone": "🧝🏾", - "elf_tone5": "🧝🏿", - "elf_dark_skin_tone": "🧝🏿", - "woman_elf": "🧝‍♀️", - "woman_elf_tone1": "🧝🏻‍♀️", - "woman_elf_light_skin_tone": "🧝🏻‍♀️", - "woman_elf_tone2": "🧝🏼‍♀️", - "woman_elf_medium_light_skin_tone": "🧝🏼‍♀️", - "woman_elf_tone3": "🧝🏽‍♀️", - "woman_elf_medium_skin_tone": "🧝🏽‍♀️", - "woman_elf_tone4": "🧝🏾‍♀️", - "woman_elf_medium_dark_skin_tone": "🧝🏾‍♀️", - "woman_elf_tone5": "🧝🏿‍♀️", - "woman_elf_dark_skin_tone": "🧝🏿‍♀️", - "man_elf": "🧝‍♂️", - "man_elf_tone1": "🧝🏻‍♂️", - "man_elf_light_skin_tone": "🧝🏻‍♂️", - "man_elf_tone2": "🧝🏼‍♂️", - "man_elf_medium_light_skin_tone": "🧝🏼‍♂️", - "man_elf_tone3": "🧝🏽‍♂️", - "man_elf_medium_skin_tone": "🧝🏽‍♂️", - "man_elf_tone4": "🧝🏾‍♂️", - "man_elf_medium_dark_skin_tone": "🧝🏾‍♂️", - "man_elf_tone5": "🧝🏿‍♂️", - "man_elf_dark_skin_tone": "🧝🏿‍♂️", - "vampire": "🧛", - "vampire_tone1": "🧛🏻", - "vampire_light_skin_tone": "🧛🏻", - "vampire_tone2": "🧛🏼", - "vampire_medium_light_skin_tone": "🧛🏼", - "vampire_tone3": "🧛🏽", - "vampire_medium_skin_tone": "🧛🏽", - "vampire_tone4": "🧛🏾", - "vampire_medium_dark_skin_tone": "🧛🏾", - "vampire_tone5": "🧛🏿", - "vampire_dark_skin_tone": "🧛🏿", - "woman_vampire": "🧛‍♀️", - "woman_vampire_tone1": "🧛🏻‍♀️", - "woman_vampire_light_skin_tone": "🧛🏻‍♀️", - "woman_vampire_tone2": "🧛🏼‍♀️", - "woman_vampire_medium_light_skin_tone": "🧛🏼‍♀️", - "woman_vampire_tone3": "🧛🏽‍♀️", - "woman_vampire_medium_skin_tone": "🧛🏽‍♀️", - "woman_vampire_tone4": "🧛🏾‍♀️", - "woman_vampire_medium_dark_skin_tone": "🧛🏾‍♀️", - "woman_vampire_tone5": "🧛🏿‍♀️", - "woman_vampire_dark_skin_tone": "🧛🏿‍♀️", - "man_vampire": "🧛‍♂️", - "man_vampire_tone1": "🧛🏻‍♂️", - "man_vampire_light_skin_tone": "🧛🏻‍♂️", - "man_vampire_tone2": "🧛🏼‍♂️", - "man_vampire_medium_light_skin_tone": "🧛🏼‍♂️", - "man_vampire_tone3": "🧛🏽‍♂️", - "man_vampire_medium_skin_tone": "🧛🏽‍♂️", - "man_vampire_tone4": "🧛🏾‍♂️", - "man_vampire_medium_dark_skin_tone": "🧛🏾‍♂️", - "man_vampire_tone5": "🧛🏿‍♂️", - "man_vampire_dark_skin_tone": "🧛🏿‍♂️", - "zombie": "🧟", - "woman_zombie": "🧟‍♀️", - "man_zombie": "🧟‍♂️", - "genie": "🧞", - "woman_genie": "🧞‍♀️", - "man_genie": "🧞‍♂️", - "merperson": "🧜", - "merperson_tone1": "🧜🏻", - "merperson_light_skin_tone": "🧜🏻", - "merperson_tone2": "🧜🏼", - "merperson_medium_light_skin_tone": "🧜🏼", - "merperson_tone3": "🧜🏽", - "merperson_medium_skin_tone": "🧜🏽", - "merperson_tone4": "🧜🏾", - "merperson_medium_dark_skin_tone": "🧜🏾", - "merperson_tone5": "🧜🏿", - "merperson_dark_skin_tone": "🧜🏿", - "mermaid": "🧜‍♀️", - "mermaid_tone1": "🧜🏻‍♀️", - "mermaid_light_skin_tone": "🧜🏻‍♀️", - "mermaid_tone2": "🧜🏼‍♀️", - "mermaid_medium_light_skin_tone": "🧜🏼‍♀️", - "mermaid_tone3": "🧜🏽‍♀️", - "mermaid_medium_skin_tone": "🧜🏽‍♀️", - "mermaid_tone4": "🧜🏾‍♀️", - "mermaid_medium_dark_skin_tone": "🧜🏾‍♀️", - "mermaid_tone5": "🧜🏿‍♀️", - "mermaid_dark_skin_tone": "🧜🏿‍♀️", - "merman": "🧜‍♂️", - "merman_tone1": "🧜🏻‍♂️", - "merman_light_skin_tone": "🧜🏻‍♂️", - "merman_tone2": "🧜🏼‍♂️", - "merman_medium_light_skin_tone": "🧜🏼‍♂️", - "merman_tone3": "🧜🏽‍♂️", - "merman_medium_skin_tone": "🧜🏽‍♂️", - "merman_tone4": "🧜🏾‍♂️", - "merman_medium_dark_skin_tone": "🧜🏾‍♂️", - "merman_tone5": "🧜🏿‍♂️", - "merman_dark_skin_tone": "🧜🏿‍♂️", - "fairy": "🧚", - "fairy_tone1": "🧚🏻", - "fairy_light_skin_tone": "🧚🏻", - "fairy_tone2": "🧚🏼", - "fairy_medium_light_skin_tone": "🧚🏼", - "fairy_tone3": "🧚🏽", - "fairy_medium_skin_tone": "🧚🏽", - "fairy_tone4": "🧚🏾", - "fairy_medium_dark_skin_tone": "🧚🏾", - "fairy_tone5": "🧚🏿", - "fairy_dark_skin_tone": "🧚🏿", - "woman_fairy": "🧚‍♀️", - "woman_fairy_tone1": "🧚🏻‍♀️", - "woman_fairy_light_skin_tone": "🧚🏻‍♀️", - "woman_fairy_tone2": "🧚🏼‍♀️", - "woman_fairy_medium_light_skin_tone": "🧚🏼‍♀️", - "woman_fairy_tone3": "🧚🏽‍♀️", - "woman_fairy_medium_skin_tone": "🧚🏽‍♀️", - "woman_fairy_tone4": "🧚🏾‍♀️", - "woman_fairy_medium_dark_skin_tone": "🧚🏾‍♀️", - "woman_fairy_tone5": "🧚🏿‍♀️", - "woman_fairy_dark_skin_tone": "🧚🏿‍♀️", - "man_fairy": "🧚‍♂️", - "man_fairy_tone1": "🧚🏻‍♂️", - "man_fairy_light_skin_tone": "🧚🏻‍♂️", - "man_fairy_tone2": "🧚🏼‍♂️", - "man_fairy_medium_light_skin_tone": "🧚🏼‍♂️", - "man_fairy_tone3": "🧚🏽‍♂️", - "man_fairy_medium_skin_tone": "🧚🏽‍♂️", - "man_fairy_tone4": "🧚🏾‍♂️", - "man_fairy_medium_dark_skin_tone": "🧚🏾‍♂️", - "man_fairy_tone5": "🧚🏿‍♂️", - "man_fairy_dark_skin_tone": "🧚🏿‍♂️", - "angel": "👼", - "angel_tone1": "👼🏻", - "angel_tone2": "👼🏼", - "angel_tone3": "👼🏽", - "angel_tone4": "👼🏾", - "angel_tone5": "👼🏿", - "pregnant_woman": "🤰", - "expecting_woman": "🤰", - "pregnant_woman_tone1": "🤰🏻", - "expecting_woman_tone1": "🤰🏻", - "pregnant_woman_tone2": "🤰🏼", - "expecting_woman_tone2": "🤰🏼", - "pregnant_woman_tone3": "🤰🏽", - "expecting_woman_tone3": "🤰🏽", - "pregnant_woman_tone4": "🤰🏾", - "expecting_woman_tone4": "🤰🏾", - "pregnant_woman_tone5": "🤰🏿", - "expecting_woman_tone5": "🤰🏿", - "breast_feeding": "🤱", - "breast_feeding_tone1": "🤱🏻", - "breast_feeding_light_skin_tone": "🤱🏻", - "breast_feeding_tone2": "🤱🏼", - "breast_feeding_medium_light_skin_tone": "🤱🏼", - "breast_feeding_tone3": "🤱🏽", - "breast_feeding_medium_skin_tone": "🤱🏽", - "breast_feeding_tone4": "🤱🏾", - "breast_feeding_medium_dark_skin_tone": "🤱🏾", - "breast_feeding_tone5": "🤱🏿", - "breast_feeding_dark_skin_tone": "🤱🏿", - "person_feeding_baby": "🧑‍🍼", - "person_feeding_baby_tone1": "🧑🏻‍🍼", - "person_feeding_baby_light_skin_tone": "🧑🏻‍🍼", - "person_feeding_baby_tone2": "🧑🏼‍🍼", - "person_feeding_baby_medium_light_skin_tone": "🧑🏼‍🍼", - "person_feeding_baby_tone3": "🧑🏽‍🍼", - "person_feeding_baby_medium_skin_tone": "🧑🏽‍🍼", - "person_feeding_baby_tone4": "🧑🏾‍🍼", - "person_feeding_baby_medium_dark_skin_tone": "🧑🏾‍🍼", - "person_feeding_baby_tone5": "🧑🏿‍🍼", - "person_feeding_baby_dark_skin_tone": "🧑🏿‍🍼", - "woman_feeding_baby": "👩‍🍼", - "woman_feeding_baby_tone1": "👩🏻‍🍼", - "woman_feeding_baby_light_skin_tone": "👩🏻‍🍼", - "woman_feeding_baby_tone2": "👩🏼‍🍼", - "woman_feeding_baby_medium_light_skin_tone": "👩🏼‍🍼", - "woman_feeding_baby_tone3": "👩🏽‍🍼", - "woman_feeding_baby_medium_skin_tone": "👩🏽‍🍼", - "woman_feeding_baby_tone4": "👩🏾‍🍼", - "woman_feeding_baby_medium_dark_skin_tone": "👩🏾‍🍼", - "woman_feeding_baby_tone5": "👩🏿‍🍼", - "woman_feeding_baby_dark_skin_tone": "👩🏿‍🍼", - "man_feeding_baby": "👨‍🍼", - "man_feeding_baby_tone1": "👨🏻‍🍼", - "man_feeding_baby_light_skin_tone": "👨🏻‍🍼", - "man_feeding_baby_tone2": "👨🏼‍🍼", - "man_feeding_baby_medium_light_skin_tone": "👨🏼‍🍼", - "man_feeding_baby_tone3": "👨🏽‍🍼", - "man_feeding_baby_medium_skin_tone": "👨🏽‍🍼", - "man_feeding_baby_tone4": "👨🏾‍🍼", - "man_feeding_baby_medium_dark_skin_tone": "👨🏾‍🍼", - "man_feeding_baby_tone5": "👨🏿‍🍼", - "man_feeding_baby_dark_skin_tone": "👨🏿‍🍼", - "person_bowing": "🙇", - "bow": "🙇", - "person_bowing_tone1": "🙇🏻", - "bow_tone1": "🙇🏻", - "person_bowing_tone2": "🙇🏼", - "bow_tone2": "🙇🏼", - "person_bowing_tone3": "🙇🏽", - "bow_tone3": "🙇🏽", - "person_bowing_tone4": "🙇🏾", - "bow_tone4": "🙇🏾", - "person_bowing_tone5": "🙇🏿", - "bow_tone5": "🙇🏿", - "woman_bowing": "🙇‍♀️", - "woman_bowing_tone1": "🙇🏻‍♀️", - "woman_bowing_light_skin_tone": "🙇🏻‍♀️", - "woman_bowing_tone2": "🙇🏼‍♀️", - "woman_bowing_medium_light_skin_tone": "🙇🏼‍♀️", - "woman_bowing_tone3": "🙇🏽‍♀️", - "woman_bowing_medium_skin_tone": "🙇🏽‍♀️", - "woman_bowing_tone4": "🙇🏾‍♀️", - "woman_bowing_medium_dark_skin_tone": "🙇🏾‍♀️", - "woman_bowing_tone5": "🙇🏿‍♀️", - "woman_bowing_dark_skin_tone": "🙇🏿‍♀️", - "man_bowing": "🙇‍♂️", - "man_bowing_tone1": "🙇🏻‍♂️", - "man_bowing_light_skin_tone": "🙇🏻‍♂️", - "man_bowing_tone2": "🙇🏼‍♂️", - "man_bowing_medium_light_skin_tone": "🙇🏼‍♂️", - "man_bowing_tone3": "🙇🏽‍♂️", - "man_bowing_medium_skin_tone": "🙇🏽‍♂️", - "man_bowing_tone4": "🙇🏾‍♂️", - "man_bowing_medium_dark_skin_tone": "🙇🏾‍♂️", - "man_bowing_tone5": "🙇🏿‍♂️", - "man_bowing_dark_skin_tone": "🙇🏿‍♂️", - "person_tipping_hand": "💁", - "information_desk_person": "💁", - "person_tipping_hand_tone1": "💁🏻", - "information_desk_person_tone1": "💁🏻", - "person_tipping_hand_tone2": "💁🏼", - "information_desk_person_tone2": "💁🏼", - "person_tipping_hand_tone3": "💁🏽", - "information_desk_person_tone3": "💁🏽", - "person_tipping_hand_tone4": "💁🏾", - "information_desk_person_tone4": "💁🏾", - "person_tipping_hand_tone5": "💁🏿", - "information_desk_person_tone5": "💁🏿", - "woman_tipping_hand": "💁‍♀️", - "woman_tipping_hand_tone1": "💁🏻‍♀️", - "woman_tipping_hand_light_skin_tone": "💁🏻‍♀️", - "woman_tipping_hand_tone2": "💁🏼‍♀️", - "woman_tipping_hand_medium_light_skin_tone": "💁🏼‍♀️", - "woman_tipping_hand_tone3": "💁🏽‍♀️", - "woman_tipping_hand_medium_skin_tone": "💁🏽‍♀️", - "woman_tipping_hand_tone4": "💁🏾‍♀️", - "woman_tipping_hand_medium_dark_skin_tone": "💁🏾‍♀️", - "woman_tipping_hand_tone5": "💁🏿‍♀️", - "woman_tipping_hand_dark_skin_tone": "💁🏿‍♀️", - "man_tipping_hand": "💁‍♂️", - "man_tipping_hand_tone1": "💁🏻‍♂️", - "man_tipping_hand_light_skin_tone": "💁🏻‍♂️", - "man_tipping_hand_tone2": "💁🏼‍♂️", - "man_tipping_hand_medium_light_skin_tone": "💁🏼‍♂️", - "man_tipping_hand_tone3": "💁🏽‍♂️", - "man_tipping_hand_medium_skin_tone": "💁🏽‍♂️", - "man_tipping_hand_tone4": "💁🏾‍♂️", - "man_tipping_hand_medium_dark_skin_tone": "💁🏾‍♂️", - "man_tipping_hand_tone5": "💁🏿‍♂️", - "man_tipping_hand_dark_skin_tone": "💁🏿‍♂️", - "person_gesturing_no": "🙅", - "no_good": "🙅", - "person_gesturing_no_tone1": "🙅🏻", - "no_good_tone1": "🙅🏻", - "person_gesturing_no_tone2": "🙅🏼", - "no_good_tone2": "🙅🏼", - "person_gesturing_no_tone3": "🙅🏽", - "no_good_tone3": "🙅🏽", - "person_gesturing_no_tone4": "🙅🏾", - "no_good_tone4": "🙅🏾", - "person_gesturing_no_tone5": "🙅🏿", - "no_good_tone5": "🙅🏿", - "woman_gesturing_no": "🙅‍♀️", - "woman_gesturing_no_tone1": "🙅🏻‍♀️", - "woman_gesturing_no_light_skin_tone": "🙅🏻‍♀️", - "woman_gesturing_no_tone2": "🙅🏼‍♀️", - "woman_gesturing_no_medium_light_skin_tone": "🙅🏼‍♀️", - "woman_gesturing_no_tone3": "🙅🏽‍♀️", - "woman_gesturing_no_medium_skin_tone": "🙅🏽‍♀️", - "woman_gesturing_no_tone4": "🙅🏾‍♀️", - "woman_gesturing_no_medium_dark_skin_tone": "🙅🏾‍♀️", - "woman_gesturing_no_tone5": "🙅🏿‍♀️", - "woman_gesturing_no_dark_skin_tone": "🙅🏿‍♀️", - "man_gesturing_no": "🙅‍♂️", - "man_gesturing_no_tone1": "🙅🏻‍♂️", - "man_gesturing_no_light_skin_tone": "🙅🏻‍♂️", - "man_gesturing_no_tone2": "🙅🏼‍♂️", - "man_gesturing_no_medium_light_skin_tone": "🙅🏼‍♂️", - "man_gesturing_no_tone3": "🙅🏽‍♂️", - "man_gesturing_no_medium_skin_tone": "🙅🏽‍♂️", - "man_gesturing_no_tone4": "🙅🏾‍♂️", - "man_gesturing_no_medium_dark_skin_tone": "🙅🏾‍♂️", - "man_gesturing_no_tone5": "🙅🏿‍♂️", - "man_gesturing_no_dark_skin_tone": "🙅🏿‍♂️", - "person_gesturing_ok": "🙆", - "ok_woman": "🙆", - "person_gesturing_ok_tone1": "🙆🏻", - "ok_woman_tone1": "🙆🏻", - "person_gesturing_ok_tone2": "🙆🏼", - "ok_woman_tone2": "🙆🏼", - "person_gesturing_ok_tone3": "🙆🏽", - "ok_woman_tone3": "🙆🏽", - "person_gesturing_ok_tone4": "🙆🏾", - "ok_woman_tone4": "🙆🏾", - "person_gesturing_ok_tone5": "🙆🏿", - "ok_woman_tone5": "🙆🏿", - "woman_gesturing_ok": "🙆‍♀️", - "woman_gesturing_ok_tone1": "🙆🏻‍♀️", - "woman_gesturing_ok_light_skin_tone": "🙆🏻‍♀️", - "woman_gesturing_ok_tone2": "🙆🏼‍♀️", - "woman_gesturing_ok_medium_light_skin_tone": "🙆🏼‍♀️", - "woman_gesturing_ok_tone3": "🙆🏽‍♀️", - "woman_gesturing_ok_medium_skin_tone": "🙆🏽‍♀️", - "woman_gesturing_ok_tone4": "🙆🏾‍♀️", - "woman_gesturing_ok_medium_dark_skin_tone": "🙆🏾‍♀️", - "woman_gesturing_ok_tone5": "🙆🏿‍♀️", - "woman_gesturing_ok_dark_skin_tone": "🙆🏿‍♀️", - "man_gesturing_ok": "🙆‍♂️", - "man_gesturing_ok_tone1": "🙆🏻‍♂️", - "man_gesturing_ok_light_skin_tone": "🙆🏻‍♂️", - "man_gesturing_ok_tone2": "🙆🏼‍♂️", - "man_gesturing_ok_medium_light_skin_tone": "🙆🏼‍♂️", - "man_gesturing_ok_tone3": "🙆🏽‍♂️", - "man_gesturing_ok_medium_skin_tone": "🙆🏽‍♂️", - "man_gesturing_ok_tone4": "🙆🏾‍♂️", - "man_gesturing_ok_medium_dark_skin_tone": "🙆🏾‍♂️", - "man_gesturing_ok_tone5": "🙆🏿‍♂️", - "man_gesturing_ok_dark_skin_tone": "🙆🏿‍♂️", - "person_raising_hand": "🙋", - "raising_hand": "🙋", - "person_raising_hand_tone1": "🙋🏻", - "raising_hand_tone1": "🙋🏻", - "person_raising_hand_tone2": "🙋🏼", - "raising_hand_tone2": "🙋🏼", - "person_raising_hand_tone3": "🙋🏽", - "raising_hand_tone3": "🙋🏽", - "person_raising_hand_tone4": "🙋🏾", - "raising_hand_tone4": "🙋🏾", - "person_raising_hand_tone5": "🙋🏿", - "raising_hand_tone5": "🙋🏿", - "woman_raising_hand": "🙋‍♀️", - "woman_raising_hand_tone1": "🙋🏻‍♀️", - "woman_raising_hand_light_skin_tone": "🙋🏻‍♀️", - "woman_raising_hand_tone2": "🙋🏼‍♀️", - "woman_raising_hand_medium_light_skin_tone": "🙋🏼‍♀️", - "woman_raising_hand_tone3": "🙋🏽‍♀️", - "woman_raising_hand_medium_skin_tone": "🙋🏽‍♀️", - "woman_raising_hand_tone4": "🙋🏾‍♀️", - "woman_raising_hand_medium_dark_skin_tone": "🙋🏾‍♀️", - "woman_raising_hand_tone5": "🙋🏿‍♀️", - "woman_raising_hand_dark_skin_tone": "🙋🏿‍♀️", - "man_raising_hand": "🙋‍♂️", - "man_raising_hand_tone1": "🙋🏻‍♂️", - "man_raising_hand_light_skin_tone": "🙋🏻‍♂️", - "man_raising_hand_tone2": "🙋🏼‍♂️", - "man_raising_hand_medium_light_skin_tone": "🙋🏼‍♂️", - "man_raising_hand_tone3": "🙋🏽‍♂️", - "man_raising_hand_medium_skin_tone": "🙋🏽‍♂️", - "man_raising_hand_tone4": "🙋🏾‍♂️", - "man_raising_hand_medium_dark_skin_tone": "🙋🏾‍♂️", - "man_raising_hand_tone5": "🙋🏿‍♂️", - "man_raising_hand_dark_skin_tone": "🙋🏿‍♂️", - "deaf_person": "🧏", - "deaf_person_tone1": "🧏🏻", - "deaf_person_light_skin_tone": "🧏🏻", - "deaf_person_tone2": "🧏🏼", - "deaf_person_medium_light_skin_tone": "🧏🏼", - "deaf_person_tone3": "🧏🏽", - "deaf_person_medium_skin_tone": "🧏🏽", - "deaf_person_tone4": "🧏🏾", - "deaf_person_medium_dark_skin_tone": "🧏🏾", - "deaf_person_tone5": "🧏🏿", - "deaf_person_dark_skin_tone": "🧏🏿", - "deaf_woman": "🧏‍♀️", - "deaf_woman_tone1": "🧏🏻‍♀️", - "deaf_woman_light_skin_tone": "🧏🏻‍♀️", - "deaf_woman_tone2": "🧏🏼‍♀️", - "deaf_woman_medium_light_skin_tone": "🧏🏼‍♀️", - "deaf_woman_tone3": "🧏🏽‍♀️", - "deaf_woman_medium_skin_tone": "🧏🏽‍♀️", - "deaf_woman_tone4": "🧏🏾‍♀️", - "deaf_woman_medium_dark_skin_tone": "🧏🏾‍♀️", - "deaf_woman_tone5": "🧏🏿‍♀️", - "deaf_woman_dark_skin_tone": "🧏🏿‍♀️", - "deaf_man": "🧏‍♂️", - "deaf_man_tone1": "🧏🏻‍♂️", - "deaf_man_light_skin_tone": "🧏🏻‍♂️", - "deaf_man_tone2": "🧏🏼‍♂️", - "deaf_man_medium_light_skin_tone": "🧏🏼‍♂️", - "deaf_man_tone3": "🧏🏽‍♂️", - "deaf_man_medium_skin_tone": "🧏🏽‍♂️", - "deaf_man_tone4": "🧏🏾‍♂️", - "deaf_man_medium_dark_skin_tone": "🧏🏾‍♂️", - "deaf_man_tone5": "🧏🏿‍♂️", - "deaf_man_dark_skin_tone": "🧏🏿‍♂️", - "person_facepalming": "🤦", - "face_palm": "🤦", - "facepalm": "🤦", - "person_facepalming_tone1": "🤦🏻", - "face_palm_tone1": "🤦🏻", - "facepalm_tone1": "🤦🏻", - "person_facepalming_tone2": "🤦🏼", - "face_palm_tone2": "🤦🏼", - "facepalm_tone2": "🤦🏼", - "person_facepalming_tone3": "🤦🏽", - "face_palm_tone3": "🤦🏽", - "facepalm_tone3": "🤦🏽", - "person_facepalming_tone4": "🤦🏾", - "face_palm_tone4": "🤦🏾", - "facepalm_tone4": "🤦🏾", - "person_facepalming_tone5": "🤦🏿", - "face_palm_tone5": "🤦🏿", - "facepalm_tone5": "🤦🏿", - "woman_facepalming": "🤦‍♀️", - "woman_facepalming_tone1": "🤦🏻‍♀️", - "woman_facepalming_light_skin_tone": "🤦🏻‍♀️", - "woman_facepalming_tone2": "🤦🏼‍♀️", - "woman_facepalming_medium_light_skin_tone": "🤦🏼‍♀️", - "woman_facepalming_tone3": "🤦🏽‍♀️", - "woman_facepalming_medium_skin_tone": "🤦🏽‍♀️", - "woman_facepalming_tone4": "🤦🏾‍♀️", - "woman_facepalming_medium_dark_skin_tone": "🤦🏾‍♀️", - "woman_facepalming_tone5": "🤦🏿‍♀️", - "woman_facepalming_dark_skin_tone": "🤦🏿‍♀️", - "man_facepalming": "🤦‍♂️", - "man_facepalming_tone1": "🤦🏻‍♂️", - "man_facepalming_light_skin_tone": "🤦🏻‍♂️", - "man_facepalming_tone2": "🤦🏼‍♂️", - "man_facepalming_medium_light_skin_tone": "🤦🏼‍♂️", - "man_facepalming_tone3": "🤦🏽‍♂️", - "man_facepalming_medium_skin_tone": "🤦🏽‍♂️", - "man_facepalming_tone4": "🤦🏾‍♂️", - "man_facepalming_medium_dark_skin_tone": "🤦🏾‍♂️", - "man_facepalming_tone5": "🤦🏿‍♂️", - "man_facepalming_dark_skin_tone": "🤦🏿‍♂️", - "person_shrugging": "🤷", - "shrug": "🤷", - "person_shrugging_tone1": "🤷🏻", - "shrug_tone1": "🤷🏻", - "person_shrugging_tone2": "🤷🏼", - "shrug_tone2": "🤷🏼", - "person_shrugging_tone3": "🤷🏽", - "shrug_tone3": "🤷🏽", - "person_shrugging_tone4": "🤷🏾", - "shrug_tone4": "🤷🏾", - "person_shrugging_tone5": "🤷🏿", - "shrug_tone5": "🤷🏿", - "woman_shrugging": "🤷‍♀️", - "woman_shrugging_tone1": "🤷🏻‍♀️", - "woman_shrugging_light_skin_tone": "🤷🏻‍♀️", - "woman_shrugging_tone2": "🤷🏼‍♀️", - "woman_shrugging_medium_light_skin_tone": "🤷🏼‍♀️", - "woman_shrugging_tone3": "🤷🏽‍♀️", - "woman_shrugging_medium_skin_tone": "🤷🏽‍♀️", - "woman_shrugging_tone4": "🤷🏾‍♀️", - "woman_shrugging_medium_dark_skin_tone": "🤷🏾‍♀️", - "woman_shrugging_tone5": "🤷🏿‍♀️", - "woman_shrugging_dark_skin_tone": "🤷🏿‍♀️", - "man_shrugging": "🤷‍♂️", - "man_shrugging_tone1": "🤷🏻‍♂️", - "man_shrugging_light_skin_tone": "🤷🏻‍♂️", - "man_shrugging_tone2": "🤷🏼‍♂️", - "man_shrugging_medium_light_skin_tone": "🤷🏼‍♂️", - "man_shrugging_tone3": "🤷🏽‍♂️", - "man_shrugging_medium_skin_tone": "🤷🏽‍♂️", - "man_shrugging_tone4": "🤷🏾‍♂️", - "man_shrugging_medium_dark_skin_tone": "🤷🏾‍♂️", - "man_shrugging_tone5": "🤷🏿‍♂️", - "man_shrugging_dark_skin_tone": "🤷🏿‍♂️", - "person_pouting": "🙎", - "person_with_pouting_face": "🙎", - "person_pouting_tone1": "🙎🏻", - "person_with_pouting_face_tone1": "🙎🏻", - "person_pouting_tone2": "🙎🏼", - "person_with_pouting_face_tone2": "🙎🏼", - "person_pouting_tone3": "🙎🏽", - "person_with_pouting_face_tone3": "🙎🏽", - "person_pouting_tone4": "🙎🏾", - "person_with_pouting_face_tone4": "🙎🏾", - "person_pouting_tone5": "🙎🏿", - "person_with_pouting_face_tone5": "🙎🏿", - "woman_pouting": "🙎‍♀️", - "woman_pouting_tone1": "🙎🏻‍♀️", - "woman_pouting_light_skin_tone": "🙎🏻‍♀️", - "woman_pouting_tone2": "🙎🏼‍♀️", - "woman_pouting_medium_light_skin_tone": "🙎🏼‍♀️", - "woman_pouting_tone3": "🙎🏽‍♀️", - "woman_pouting_medium_skin_tone": "🙎🏽‍♀️", - "woman_pouting_tone4": "🙎🏾‍♀️", - "woman_pouting_medium_dark_skin_tone": "🙎🏾‍♀️", - "woman_pouting_tone5": "🙎🏿‍♀️", - "woman_pouting_dark_skin_tone": "🙎🏿‍♀️", - "man_pouting": "🙎‍♂️", - "man_pouting_tone1": "🙎🏻‍♂️", - "man_pouting_light_skin_tone": "🙎🏻‍♂️", - "man_pouting_tone2": "🙎🏼‍♂️", - "man_pouting_medium_light_skin_tone": "🙎🏼‍♂️", - "man_pouting_tone3": "🙎🏽‍♂️", - "man_pouting_medium_skin_tone": "🙎🏽‍♂️", - "man_pouting_tone4": "🙎🏾‍♂️", - "man_pouting_medium_dark_skin_tone": "🙎🏾‍♂️", - "man_pouting_tone5": "🙎🏿‍♂️", - "man_pouting_dark_skin_tone": "🙎🏿‍♂️", - "person_frowning": "🙍", - "person_frowning_tone1": "🙍🏻", - "person_frowning_tone2": "🙍🏼", - "person_frowning_tone3": "🙍🏽", - "person_frowning_tone4": "🙍🏾", - "person_frowning_tone5": "🙍🏿", - "woman_frowning": "🙍‍♀️", - "woman_frowning_tone1": "🙍🏻‍♀️", - "woman_frowning_light_skin_tone": "🙍🏻‍♀️", - "woman_frowning_tone2": "🙍🏼‍♀️", - "woman_frowning_medium_light_skin_tone": "🙍🏼‍♀️", - "woman_frowning_tone3": "🙍🏽‍♀️", - "woman_frowning_medium_skin_tone": "🙍🏽‍♀️", - "woman_frowning_tone4": "🙍🏾‍♀️", - "woman_frowning_medium_dark_skin_tone": "🙍🏾‍♀️", - "woman_frowning_tone5": "🙍🏿‍♀️", - "woman_frowning_dark_skin_tone": "🙍🏿‍♀️", - "man_frowning": "🙍‍♂️", - "man_frowning_tone1": "🙍🏻‍♂️", - "man_frowning_light_skin_tone": "🙍🏻‍♂️", - "man_frowning_tone2": "🙍🏼‍♂️", - "man_frowning_medium_light_skin_tone": "🙍🏼‍♂️", - "man_frowning_tone3": "🙍🏽‍♂️", - "man_frowning_medium_skin_tone": "🙍🏽‍♂️", - "man_frowning_tone4": "🙍🏾‍♂️", - "man_frowning_medium_dark_skin_tone": "🙍🏾‍♂️", - "man_frowning_tone5": "🙍🏿‍♂️", - "man_frowning_dark_skin_tone": "🙍🏿‍♂️", - "person_getting_haircut": "💇", - "haircut": "💇", - "person_getting_haircut_tone1": "💇🏻", - "haircut_tone1": "💇🏻", - "person_getting_haircut_tone2": "💇🏼", - "haircut_tone2": "💇🏼", - "person_getting_haircut_tone3": "💇🏽", - "haircut_tone3": "💇🏽", - "person_getting_haircut_tone4": "💇🏾", - "haircut_tone4": "💇🏾", - "person_getting_haircut_tone5": "💇🏿", - "haircut_tone5": "💇🏿", - "woman_getting_haircut": "💇‍♀️", - "woman_getting_haircut_tone1": "💇🏻‍♀️", - "woman_getting_haircut_light_skin_tone": "💇🏻‍♀️", - "woman_getting_haircut_tone2": "💇🏼‍♀️", - "woman_getting_haircut_medium_light_skin_tone": "💇🏼‍♀️", - "woman_getting_haircut_tone3": "💇🏽‍♀️", - "woman_getting_haircut_medium_skin_tone": "💇🏽‍♀️", - "woman_getting_haircut_tone4": "💇🏾‍♀️", - "woman_getting_haircut_medium_dark_skin_tone": "💇🏾‍♀️", - "woman_getting_haircut_tone5": "💇🏿‍♀️", - "woman_getting_haircut_dark_skin_tone": "💇🏿‍♀️", - "man_getting_haircut": "💇‍♂️", - "man_getting_haircut_tone1": "💇🏻‍♂️", - "man_getting_haircut_light_skin_tone": "💇🏻‍♂️", - "man_getting_haircut_tone2": "💇🏼‍♂️", - "man_getting_haircut_medium_light_skin_tone": "💇🏼‍♂️", - "man_getting_haircut_tone3": "💇🏽‍♂️", - "man_getting_haircut_medium_skin_tone": "💇🏽‍♂️", - "man_getting_haircut_tone4": "💇🏾‍♂️", - "man_getting_haircut_medium_dark_skin_tone": "💇🏾‍♂️", - "man_getting_haircut_tone5": "💇🏿‍♂️", - "man_getting_haircut_dark_skin_tone": "💇🏿‍♂️", - "person_getting_massage": "💆", - "massage": "💆", - "person_getting_massage_tone1": "💆🏻", - "massage_tone1": "💆🏻", - "person_getting_massage_tone2": "💆🏼", - "massage_tone2": "💆🏼", - "person_getting_massage_tone3": "💆🏽", - "massage_tone3": "💆🏽", - "person_getting_massage_tone4": "💆🏾", - "massage_tone4": "💆🏾", - "person_getting_massage_tone5": "💆🏿", - "massage_tone5": "💆🏿", - "woman_getting_face_massage": "💆‍♀️", - "woman_getting_face_massage_tone1": "💆🏻‍♀️", - "woman_getting_face_massage_light_skin_tone": "💆🏻‍♀️", - "woman_getting_face_massage_tone2": "💆🏼‍♀️", - "woman_getting_face_massage_medium_light_skin_tone": "💆🏼‍♀️", - "woman_getting_face_massage_tone3": "💆🏽‍♀️", - "woman_getting_face_massage_medium_skin_tone": "💆🏽‍♀️", - "woman_getting_face_massage_tone4": "💆🏾‍♀️", - "woman_getting_face_massage_medium_dark_skin_tone": "💆🏾‍♀️", - "woman_getting_face_massage_tone5": "💆🏿‍♀️", - "woman_getting_face_massage_dark_skin_tone": "💆🏿‍♀️", - "man_getting_face_massage": "💆‍♂️", - "man_getting_face_massage_tone1": "💆🏻‍♂️", - "man_getting_face_massage_light_skin_tone": "💆🏻‍♂️", - "man_getting_face_massage_tone2": "💆🏼‍♂️", - "man_getting_face_massage_medium_light_skin_tone": "💆🏼‍♂️", - "man_getting_face_massage_tone3": "💆🏽‍♂️", - "man_getting_face_massage_medium_skin_tone": "💆🏽‍♂️", - "man_getting_face_massage_tone4": "💆🏾‍♂️", - "man_getting_face_massage_medium_dark_skin_tone": "💆🏾‍♂️", - "man_getting_face_massage_tone5": "💆🏿‍♂️", - "man_getting_face_massage_dark_skin_tone": "💆🏿‍♂️", - "person_in_steamy_room": "🧖", - "person_in_steamy_room_tone1": "🧖🏻", - "person_in_steamy_room_light_skin_tone": "🧖🏻", - "person_in_steamy_room_tone2": "🧖🏼", - "person_in_steamy_room_medium_light_skin_tone": "🧖🏼", - "person_in_steamy_room_tone3": "🧖🏽", - "person_in_steamy_room_medium_skin_tone": "🧖🏽", - "person_in_steamy_room_tone4": "🧖🏾", - "person_in_steamy_room_medium_dark_skin_tone": "🧖🏾", - "person_in_steamy_room_tone5": "🧖🏿", - "person_in_steamy_room_dark_skin_tone": "🧖🏿", - "woman_in_steamy_room": "🧖‍♀️", - "woman_in_steamy_room_tone1": "🧖🏻‍♀️", - "woman_in_steamy_room_light_skin_tone": "🧖🏻‍♀️", - "woman_in_steamy_room_tone2": "🧖🏼‍♀️", - "woman_in_steamy_room_medium_light_skin_tone": "🧖🏼‍♀️", - "woman_in_steamy_room_tone3": "🧖🏽‍♀️", - "woman_in_steamy_room_medium_skin_tone": "🧖🏽‍♀️", - "woman_in_steamy_room_tone4": "🧖🏾‍♀️", - "woman_in_steamy_room_medium_dark_skin_tone": "🧖🏾‍♀️", - "woman_in_steamy_room_tone5": "🧖🏿‍♀️", - "woman_in_steamy_room_dark_skin_tone": "🧖🏿‍♀️", - "man_in_steamy_room": "🧖‍♂️", - "man_in_steamy_room_tone1": "🧖🏻‍♂️", - "man_in_steamy_room_light_skin_tone": "🧖🏻‍♂️", - "man_in_steamy_room_tone2": "🧖🏼‍♂️", - "man_in_steamy_room_medium_light_skin_tone": "🧖🏼‍♂️", - "man_in_steamy_room_tone3": "🧖🏽‍♂️", - "man_in_steamy_room_medium_skin_tone": "🧖🏽‍♂️", - "man_in_steamy_room_tone4": "🧖🏾‍♂️", - "man_in_steamy_room_medium_dark_skin_tone": "🧖🏾‍♂️", - "man_in_steamy_room_tone5": "🧖🏿‍♂️", - "man_in_steamy_room_dark_skin_tone": "🧖🏿‍♂️", - "nail_care": "💅", - "nail_care_tone1": "💅🏻", - "nail_care_tone2": "💅🏼", - "nail_care_tone3": "💅🏽", - "nail_care_tone4": "💅🏾", - "nail_care_tone5": "💅🏿", - "selfie": "🤳", - "selfie_tone1": "🤳🏻", - "selfie_tone2": "🤳🏼", - "selfie_tone3": "🤳🏽", - "selfie_tone4": "🤳🏾", - "selfie_tone5": "🤳🏿", - "dancer": "💃", - "dancer_tone1": "💃🏻", - "dancer_tone2": "💃🏼", - "dancer_tone3": "💃🏽", - "dancer_tone4": "💃🏾", - "dancer_tone5": "💃🏿", - "man_dancing": "🕺", - "male_dancer": "🕺", - "man_dancing_tone1": "🕺🏻", - "male_dancer_tone1": "🕺🏻", - "man_dancing_tone2": "🕺🏼", - "male_dancer_tone2": "🕺🏼", - "man_dancing_tone3": "🕺🏽", - "male_dancer_tone3": "🕺🏽", - "man_dancing_tone5": "🕺🏿", - "male_dancer_tone5": "🕺🏿", - "man_dancing_tone4": "🕺🏾", - "male_dancer_tone4": "🕺🏾", - "people_with_bunny_ears_partying": "👯", - "dancers": "👯", - "women_with_bunny_ears_partying": "👯‍♀️", - "men_with_bunny_ears_partying": "👯‍♂️", - "levitate": "🕴️", - "man_in_business_suit_levitating": "🕴️", - "levitate_tone1": "🕴🏻", - "man_in_business_suit_levitating_tone1": "🕴🏻", - "man_in_business_suit_levitating_light_skin_tone": "🕴🏻", - "levitate_tone2": "🕴🏼", - "man_in_business_suit_levitating_tone2": "🕴🏼", - "man_in_business_suit_levitating_medium_light_skin_tone": "🕴🏼", - "levitate_tone3": "🕴🏽", - "man_in_business_suit_levitating_tone3": "🕴🏽", - "man_in_business_suit_levitating_medium_skin_tone": "🕴🏽", - "levitate_tone4": "🕴🏾", - "man_in_business_suit_levitating_tone4": "🕴🏾", - "man_in_business_suit_levitating_medium_dark_skin_tone": "🕴🏾", - "levitate_tone5": "🕴🏿", - "man_in_business_suit_levitating_tone5": "🕴🏿", - "man_in_business_suit_levitating_dark_skin_tone": "🕴🏿", - "person_in_manual_wheelchair": "🧑‍🦽", - "person_in_manual_wheelchair_tone1": "🧑🏻‍🦽", - "person_in_manual_wheelchair_light_skin_tone": "🧑🏻‍🦽", - "person_in_manual_wheelchair_tone2": "🧑🏼‍🦽", - "person_in_manual_wheelchair_medium_light_skin_tone": "🧑🏼‍🦽", - "person_in_manual_wheelchair_tone3": "🧑🏽‍🦽", - "person_in_manual_wheelchair_medium_skin_tone": "🧑🏽‍🦽", - "person_in_manual_wheelchair_tone4": "🧑🏾‍🦽", - "person_in_manual_wheelchair_medium_dark_skin_tone": "🧑🏾‍🦽", - "person_in_manual_wheelchair_tone5": "🧑🏿‍🦽", - "person_in_manual_wheelchair_dark_skin_tone": "🧑🏿‍🦽", - "woman_in_manual_wheelchair": "👩‍🦽", - "woman_in_manual_wheelchair_tone1": "👩🏻‍🦽", - "woman_in_manual_wheelchair_light_skin_tone": "👩🏻‍🦽", - "woman_in_manual_wheelchair_tone2": "👩🏼‍🦽", - "woman_in_manual_wheelchair_medium_light_skin_tone": "👩🏼‍🦽", - "woman_in_manual_wheelchair_tone3": "👩🏽‍🦽", - "woman_in_manual_wheelchair_medium_skin_tone": "👩🏽‍🦽", - "woman_in_manual_wheelchair_tone4": "👩🏾‍🦽", - "woman_in_manual_wheelchair_medium_dark_skin_tone": "👩🏾‍🦽", - "woman_in_manual_wheelchair_tone5": "👩🏿‍🦽", - "woman_in_manual_wheelchair_dark_skin_tone": "👩🏿‍🦽", - "man_in_manual_wheelchair": "👨‍🦽", - "man_in_manual_wheelchair_tone1": "👨🏻‍🦽", - "man_in_manual_wheelchair_light_skin_tone": "👨🏻‍🦽", - "man_in_manual_wheelchair_tone2": "👨🏼‍🦽", - "man_in_manual_wheelchair_medium_light_skin_tone": "👨🏼‍🦽", - "man_in_manual_wheelchair_tone3": "👨🏽‍🦽", - "man_in_manual_wheelchair_medium_skin_tone": "👨🏽‍🦽", - "man_in_manual_wheelchair_tone4": "👨🏾‍🦽", - "man_in_manual_wheelchair_medium_dark_skin_tone": "👨🏾‍🦽", - "man_in_manual_wheelchair_tone5": "👨🏿‍🦽", - "man_in_manual_wheelchair_dark_skin_tone": "👨🏿‍🦽", - "person_in_motorized_wheelchair": "🧑‍🦼", - "person_in_motorized_wheelchair_tone1": "🧑🏻‍🦼", - "person_in_motorized_wheelchair_light_skin_tone": "🧑🏻‍🦼", - "person_in_motorized_wheelchair_tone2": "🧑🏼‍🦼", - "person_in_motorized_wheelchair_medium_light_skin_tone": "🧑🏼‍🦼", - "person_in_motorized_wheelchair_tone3": "🧑🏽‍🦼", - "person_in_motorized_wheelchair_medium_skin_tone": "🧑🏽‍🦼", - "person_in_motorized_wheelchair_tone4": "🧑🏾‍🦼", - "person_in_motorized_wheelchair_medium_dark_skin_tone": "🧑🏾‍🦼", - "person_in_motorized_wheelchair_tone5": "🧑🏿‍🦼", - "person_in_motorized_wheelchair_dark_skin_tone": "🧑🏿‍🦼", - "woman_in_motorized_wheelchair": "👩‍🦼", - "woman_in_motorized_wheelchair_tone1": "👩🏻‍🦼", - "woman_in_motorized_wheelchair_light_skin_tone": "👩🏻‍🦼", - "woman_in_motorized_wheelchair_tone2": "👩🏼‍🦼", - "woman_in_motorized_wheelchair_medium_light_skin_tone": "👩🏼‍🦼", - "woman_in_motorized_wheelchair_tone3": "👩🏽‍🦼", - "woman_in_motorized_wheelchair_medium_skin_tone": "👩🏽‍🦼", - "woman_in_motorized_wheelchair_tone4": "👩🏾‍🦼", - "woman_in_motorized_wheelchair_medium_dark_skin_tone": "👩🏾‍🦼", - "woman_in_motorized_wheelchair_tone5": "👩🏿‍🦼", - "woman_in_motorized_wheelchair_dark_skin_tone": "👩🏿‍🦼", - "man_in_motorized_wheelchair": "👨‍🦼", - "man_in_motorized_wheelchair_tone1": "👨🏻‍🦼", - "man_in_motorized_wheelchair_light_skin_tone": "👨🏻‍🦼", - "man_in_motorized_wheelchair_tone2": "👨🏼‍🦼", - "man_in_motorized_wheelchair_medium_light_skin_tone": "👨🏼‍🦼", - "man_in_motorized_wheelchair_tone3": "👨🏽‍🦼", - "man_in_motorized_wheelchair_medium_skin_tone": "👨🏽‍🦼", - "man_in_motorized_wheelchair_tone4": "👨🏾‍🦼", - "man_in_motorized_wheelchair_medium_dark_skin_tone": "👨🏾‍🦼", - "man_in_motorized_wheelchair_tone5": "👨🏿‍🦼", - "man_in_motorized_wheelchair_dark_skin_tone": "👨🏿‍🦼", - "person_walking": "🚶", - "walking": "🚶", - "person_walking_tone1": "🚶🏻", - "walking_tone1": "🚶🏻", - "person_walking_tone2": "🚶🏼", - "walking_tone2": "🚶🏼", - "person_walking_tone3": "🚶🏽", - "walking_tone3": "🚶🏽", - "person_walking_tone4": "🚶🏾", - "walking_tone4": "🚶🏾", - "person_walking_tone5": "🚶🏿", - "walking_tone5": "🚶🏿", - "woman_walking": "🚶‍♀️", - "woman_walking_tone1": "🚶🏻‍♀️", - "woman_walking_light_skin_tone": "🚶🏻‍♀️", - "woman_walking_tone2": "🚶🏼‍♀️", - "woman_walking_medium_light_skin_tone": "🚶🏼‍♀️", - "woman_walking_tone3": "🚶🏽‍♀️", - "woman_walking_medium_skin_tone": "🚶🏽‍♀️", - "woman_walking_tone4": "🚶🏾‍♀️", - "woman_walking_medium_dark_skin_tone": "🚶🏾‍♀️", - "woman_walking_tone5": "🚶🏿‍♀️", - "woman_walking_dark_skin_tone": "🚶🏿‍♀️", - "man_walking": "🚶‍♂️", - "man_walking_tone1": "🚶🏻‍♂️", - "man_walking_light_skin_tone": "🚶🏻‍♂️", - "man_walking_tone2": "🚶🏼‍♂️", - "man_walking_medium_light_skin_tone": "🚶🏼‍♂️", - "man_walking_tone3": "🚶🏽‍♂️", - "man_walking_medium_skin_tone": "🚶🏽‍♂️", - "man_walking_tone4": "🚶🏾‍♂️", - "man_walking_medium_dark_skin_tone": "🚶🏾‍♂️", - "man_walking_tone5": "🚶🏿‍♂️", - "man_walking_dark_skin_tone": "🚶🏿‍♂️", - "person_with_probing_cane": "🧑‍🦯", - "person_with_probing_cane_tone1": "🧑🏻‍🦯", - "person_with_probing_cane_light_skin_tone": "🧑🏻‍🦯", - "person_with_probing_cane_tone2": "🧑🏼‍🦯", - "person_with_probing_cane_medium_light_skin_tone": "🧑🏼‍🦯", - "person_with_probing_cane_tone3": "🧑🏽‍🦯", - "person_with_probing_cane_medium_skin_tone": "🧑🏽‍🦯", - "person_with_probing_cane_tone4": "🧑🏾‍🦯", - "person_with_probing_cane_medium_dark_skin_tone": "🧑🏾‍🦯", - "person_with_probing_cane_tone5": "🧑🏿‍🦯", - "person_with_probing_cane_dark_skin_tone": "🧑🏿‍🦯", - "woman_with_probing_cane": "👩‍🦯", - "woman_with_probing_cane_tone1": "👩🏻‍🦯", - "woman_with_probing_cane_light_skin_tone": "👩🏻‍🦯", - "woman_with_probing_cane_tone2": "👩🏼‍🦯", - "woman_with_probing_cane_medium_light_skin_tone": "👩🏼‍🦯", - "woman_with_probing_cane_tone3": "👩🏽‍🦯", - "woman_with_probing_cane_medium_skin_tone": "👩🏽‍🦯", - "woman_with_probing_cane_tone4": "👩🏾‍🦯", - "woman_with_probing_cane_medium_dark_skin_tone": "👩🏾‍🦯", - "woman_with_probing_cane_tone5": "👩🏿‍🦯", - "woman_with_probing_cane_dark_skin_tone": "👩🏿‍🦯", - "man_with_probing_cane": "👨‍🦯", - "man_with_probing_cane_tone1": "👨🏻‍🦯", - "man_with_probing_cane_light_skin_tone": "👨🏻‍🦯", - "man_with_probing_cane_tone3": "👨🏽‍🦯", - "man_with_probing_cane_medium_skin_tone": "👨🏽‍🦯", - "man_with_probing_cane_tone2": "👨🏼‍🦯", - "man_with_probing_cane_medium_light_skin_tone": "👨🏼‍🦯", - "man_with_probing_cane_tone4": "👨🏾‍🦯", - "man_with_probing_cane_medium_dark_skin_tone": "👨🏾‍🦯", - "man_with_probing_cane_tone5": "👨🏿‍🦯", - "man_with_probing_cane_dark_skin_tone": "👨🏿‍🦯", - "person_kneeling": "🧎", - "person_kneeling_tone1": "🧎🏻", - "person_kneeling_light_skin_tone": "🧎🏻", - "person_kneeling_tone2": "🧎🏼", - "person_kneeling_medium_light_skin_tone": "🧎🏼", - "person_kneeling_tone3": "🧎🏽", - "person_kneeling_medium_skin_tone": "🧎🏽", - "person_kneeling_tone4": "🧎🏾", - "person_kneeling_medium_dark_skin_tone": "🧎🏾", - "person_kneeling_tone5": "🧎🏿", - "person_kneeling_dark_skin_tone": "🧎🏿", - "woman_kneeling": "🧎‍♀️", - "woman_kneeling_tone1": "🧎🏻‍♀️", - "woman_kneeling_light_skin_tone": "🧎🏻‍♀️", - "woman_kneeling_tone2": "🧎🏼‍♀️", - "woman_kneeling_medium_light_skin_tone": "🧎🏼‍♀️", - "woman_kneeling_tone3": "🧎🏽‍♀️", - "woman_kneeling_medium_skin_tone": "🧎🏽‍♀️", - "woman_kneeling_tone4": "🧎🏾‍♀️", - "woman_kneeling_medium_dark_skin_tone": "🧎🏾‍♀️", - "woman_kneeling_tone5": "🧎🏿‍♀️", - "woman_kneeling_dark_skin_tone": "🧎🏿‍♀️", - "man_kneeling": "🧎‍♂️", - "man_kneeling_tone1": "🧎🏻‍♂️", - "man_kneeling_light_skin_tone": "🧎🏻‍♂️", - "man_kneeling_tone2": "🧎🏼‍♂️", - "man_kneeling_medium_light_skin_tone": "🧎🏼‍♂️", - "man_kneeling_tone3": "🧎🏽‍♂️", - "man_kneeling_medium_skin_tone": "🧎🏽‍♂️", - "man_kneeling_tone4": "🧎🏾‍♂️", - "man_kneeling_medium_dark_skin_tone": "🧎🏾‍♂️", - "man_kneeling_tone5": "🧎🏿‍♂️", - "man_kneeling_dark_skin_tone": "🧎🏿‍♂️", - "person_running": "🏃", - "runner": "🏃", - "person_running_tone1": "🏃🏻", - "runner_tone1": "🏃🏻", - "person_running_tone2": "🏃🏼", - "runner_tone2": "🏃🏼", - "person_running_tone3": "🏃🏽", - "runner_tone3": "🏃🏽", - "person_running_tone4": "🏃🏾", - "runner_tone4": "🏃🏾", - "person_running_tone5": "🏃🏿", - "runner_tone5": "🏃🏿", - "woman_running": "🏃‍♀️", - "woman_running_tone1": "🏃🏻‍♀️", - "woman_running_light_skin_tone": "🏃🏻‍♀️", - "woman_running_tone2": "🏃🏼‍♀️", - "woman_running_medium_light_skin_tone": "🏃🏼‍♀️", - "woman_running_tone3": "🏃🏽‍♀️", - "woman_running_medium_skin_tone": "🏃🏽‍♀️", - "woman_running_tone4": "🏃🏾‍♀️", - "woman_running_medium_dark_skin_tone": "🏃🏾‍♀️", - "woman_running_tone5": "🏃🏿‍♀️", - "woman_running_dark_skin_tone": "🏃🏿‍♀️", - "man_running": "🏃‍♂️", - "man_running_tone1": "🏃🏻‍♂️", - "man_running_light_skin_tone": "🏃🏻‍♂️", - "man_running_tone2": "🏃🏼‍♂️", - "man_running_medium_light_skin_tone": "🏃🏼‍♂️", - "man_running_tone3": "🏃🏽‍♂️", - "man_running_medium_skin_tone": "🏃🏽‍♂️", - "man_running_tone4": "🏃🏾‍♂️", - "man_running_medium_dark_skin_tone": "🏃🏾‍♂️", - "man_running_tone5": "🏃🏿‍♂️", - "man_running_dark_skin_tone": "🏃🏿‍♂️", - "person_standing": "🧍", - "person_standing_tone1": "🧍🏻", - "person_standing_light_skin_tone": "🧍🏻", - "person_standing_tone2": "🧍🏼", - "person_standing_medium_light_skin_tone": "🧍🏼", - "person_standing_tone3": "🧍🏽", - "person_standing_medium_skin_tone": "🧍🏽", - "person_standing_tone4": "🧍🏾", - "person_standing_medium_dark_skin_tone": "🧍🏾", - "person_standing_tone5": "🧍🏿", - "person_standing_dark_skin_tone": "🧍🏿", - "woman_standing": "🧍‍♀️", - "woman_standing_tone1": "🧍🏻‍♀️", - "woman_standing_light_skin_tone": "🧍🏻‍♀️", - "woman_standing_tone2": "🧍🏼‍♀️", - "woman_standing_medium_light_skin_tone": "🧍🏼‍♀️", - "woman_standing_tone3": "🧍🏽‍♀️", - "woman_standing_medium_skin_tone": "🧍🏽‍♀️", - "woman_standing_tone4": "🧍🏾‍♀️", - "woman_standing_medium_dark_skin_tone": "🧍🏾‍♀️", - "woman_standing_tone5": "🧍🏿‍♀️", - "woman_standing_dark_skin_tone": "🧍🏿‍♀️", - "man_standing": "🧍‍♂️", - "man_standing_tone1": "🧍🏻‍♂️", - "man_standing_light_skin_tone": "🧍🏻‍♂️", - "man_standing_tone2": "🧍🏼‍♂️", - "man_standing_medium_light_skin_tone": "🧍🏼‍♂️", - "man_standing_tone3": "🧍🏽‍♂️", - "man_standing_medium_skin_tone": "🧍🏽‍♂️", - "man_standing_tone4": "🧍🏾‍♂️", - "man_standing_medium_dark_skin_tone": "🧍🏾‍♂️", - "man_standing_tone5": "🧍🏿‍♂️", - "man_standing_dark_skin_tone": "🧍🏿‍♂️", - "people_holding_hands": "🧑‍🤝‍🧑", - "people_holding_hands_tone1": "🧑🏻‍🤝‍🧑🏻", - "people_holding_hands_light_skin_tone": "🧑🏻‍🤝‍🧑🏻", - "people_holding_hands_tone1_tone2": "🧑🏻‍🤝‍🧑🏼", - "people_holding_hands_light_skin_tone_medium_light_skin_tone": "🧑🏻‍🤝‍🧑🏼", - "people_holding_hands_tone1_tone3": "🧑🏻‍🤝‍🧑🏽", - "people_holding_hands_light_skin_tone_medium_skin_tone": "🧑🏻‍🤝‍🧑🏽", - "people_holding_hands_tone1_tone4": "🧑🏻‍🤝‍🧑🏾", - "people_holding_hands_light_skin_tone_medium_dark_skin_tone": "🧑🏻‍🤝‍🧑🏾", - "people_holding_hands_tone1_tone5": "🧑🏻‍🤝‍🧑🏿", - "people_holding_hands_light_skin_tone_dark_skin_tone": "🧑🏻‍🤝‍🧑🏿", - "people_holding_hands_tone2_tone1": "🧑🏼‍🤝‍🧑🏻", - "people_holding_hands_medium_light_skin_tone_light_skin_tone": "🧑🏼‍🤝‍🧑🏻", - "people_holding_hands_tone2": "🧑🏼‍🤝‍🧑🏼", - "people_holding_hands_medium_light_skin_tone": "🧑🏼‍🤝‍🧑🏼", - "people_holding_hands_tone2_tone3": "🧑🏼‍🤝‍🧑🏽", - "people_holding_hands_medium_light_skin_tone_medium_skin_tone": "🧑🏼‍🤝‍🧑🏽", - "people_holding_hands_tone2_tone4": "🧑🏼‍🤝‍🧑🏾", - "people_holding_hands_medium_light_skin_tone_medium_dark_skin_tone": "🧑🏼‍🤝‍🧑🏾", - "people_holding_hands_tone2_tone5": "🧑🏼‍🤝‍🧑🏿", - "people_holding_hands_medium_light_skin_tone_dark_skin_tone": "🧑🏼‍🤝‍🧑🏿", - "people_holding_hands_tone3_tone1": "🧑🏽‍🤝‍🧑🏻", - "people_holding_hands_medium_skin_tone_light_skin_tone": "🧑🏽‍🤝‍🧑🏻", - "people_holding_hands_tone3_tone2": "🧑🏽‍🤝‍🧑🏼", - "people_holding_hands_medium_skin_tone_medium_light_skin_tone": "🧑🏽‍🤝‍🧑🏼", - "people_holding_hands_tone3": "🧑🏽‍🤝‍🧑🏽", - "people_holding_hands_medium_skin_tone": "🧑🏽‍🤝‍🧑🏽", - "people_holding_hands_tone3_tone4": "🧑🏽‍🤝‍🧑🏾", - "people_holding_hands_medium_skin_tone_medium_dark_skin_tone": "🧑🏽‍🤝‍🧑🏾", - "people_holding_hands_tone3_tone5": "🧑🏽‍🤝‍🧑🏿", - "people_holding_hands_medium_skin_tone_dark_skin_tone": "🧑🏽‍🤝‍🧑🏿", - "people_holding_hands_tone4_tone1": "🧑🏾‍🤝‍🧑🏻", - "people_holding_hands_medium_dark_skin_tone_light_skin_tone": "🧑🏾‍🤝‍🧑🏻", - "people_holding_hands_tone4_tone2": "🧑🏾‍🤝‍🧑🏼", - "people_holding_hands_medium_dark_skin_tone_medium_light_skin_tone": "🧑🏾‍🤝‍🧑🏼", - "people_holding_hands_tone4_tone3": "🧑🏾‍🤝‍🧑🏽", - "people_holding_hands_medium_dark_skin_tone_medium_skin_tone": "🧑🏾‍🤝‍🧑🏽", - "people_holding_hands_tone4": "🧑🏾‍🤝‍🧑🏾", - "people_holding_hands_medium_dark_skin_tone": "🧑🏾‍🤝‍🧑🏾", - "people_holding_hands_tone4_tone5": "🧑🏾‍🤝‍🧑🏿", - "people_holding_hands_medium_dark_skin_tone_dark_skin_tone": "🧑🏾‍🤝‍🧑🏿", - "people_holding_hands_tone5_tone1": "🧑🏿‍🤝‍🧑🏻", - "people_holding_hands_dark_skin_tone_light_skin_tone": "🧑🏿‍🤝‍🧑🏻", - "people_holding_hands_tone5_tone2": "🧑🏿‍🤝‍🧑🏼", - "people_holding_hands_dark_skin_tone_medium_light_skin_tone": "🧑🏿‍🤝‍🧑🏼", - "people_holding_hands_tone5_tone3": "🧑🏿‍🤝‍🧑🏽", - "people_holding_hands_dark_skin_tone_medium_skin_tone": "🧑🏿‍🤝‍🧑🏽", - "people_holding_hands_tone5_tone4": "🧑🏿‍🤝‍🧑🏾", - "people_holding_hands_dark_skin_tone_medium_dark_skin_tone": "🧑🏿‍🤝‍🧑🏾", - "people_holding_hands_tone5": "🧑🏿‍🤝‍🧑🏿", - "people_holding_hands_dark_skin_tone": "🧑🏿‍🤝‍🧑🏿", - "couple": "👫", - "woman_and_man_holding_hands_tone1": "👫🏻", - "woman_and_man_holding_hands_light_skin_tone": "👫🏻", - "woman_and_man_holding_hands_tone1_tone2": "👩🏻‍🤝‍👨🏼", - "woman_and_man_holding_hands_light_skin_tone_medium_light_skin_tone": "👩🏻‍🤝‍👨🏼", - "woman_and_man_holding_hands_tone1_tone3": "👩🏻‍🤝‍👨🏽", - "woman_and_man_holding_hands_light_skin_tone_medium_skin_tone": "👩🏻‍🤝‍👨🏽", - "woman_and_man_holding_hands_tone1_tone4": "👩🏻‍🤝‍👨🏾", - "woman_and_man_holding_hands_light_skin_tone_medium_dark_skin_tone": "👩🏻‍🤝‍👨🏾", - "woman_and_man_holding_hands_tone1_tone5": "👩🏻‍🤝‍👨🏿", - "woman_and_man_holding_hands_light_skin_tone_dark_skin_tone": "👩🏻‍🤝‍👨🏿", - "woman_and_man_holding_hands_tone2_tone1": "👩🏼‍🤝‍👨🏻", - "woman_and_man_holding_hands_medium_light_skin_tone_light_skin_tone": "👩🏼‍🤝‍👨🏻", - "woman_and_man_holding_hands_tone2": "👫🏼", - "woman_and_man_holding_hands_medium_light_skin_tone": "👫🏼", - "woman_and_man_holding_hands_tone2_tone3": "👩🏼‍🤝‍👨🏽", - "woman_and_man_holding_hands_medium_light_skin_tone_medium_skin_tone": "👩🏼‍🤝‍👨🏽", - "woman_and_man_holding_hands_tone2_tone4": "👩🏼‍🤝‍👨🏾", - "woman_and_man_holding_hands_medium_light_skin_tone_medium_dark_skin_tone": "👩🏼‍🤝‍👨🏾", - "woman_and_man_holding_hands_tone2_tone5": "👩🏼‍🤝‍👨🏿", - "woman_and_man_holding_hands_medium_light_skin_tone_dark_skin_tone": "👩🏼‍🤝‍👨🏿", - "woman_and_man_holding_hands_tone3_tone1": "👩🏽‍🤝‍👨🏻", - "woman_and_man_holding_hands_medium_skin_tone_light_skin_tone": "👩🏽‍🤝‍👨🏻", - "woman_and_man_holding_hands_tone3_tone2": "👩🏽‍🤝‍👨🏼", - "woman_and_man_holding_hands_medium_skin_tone_medium_light_skin_tone": "👩🏽‍🤝‍👨🏼", - "woman_and_man_holding_hands_tone3": "👫🏽", - "woman_and_man_holding_hands_medium_skin_tone": "👫🏽", - "woman_and_man_holding_hands_tone3_tone4": "👩🏽‍🤝‍👨🏾", - "woman_and_man_holding_hands_medium_skin_tone_medium_dark_skin_tone": "👩🏽‍🤝‍👨🏾", - "woman_and_man_holding_hands_tone3_tone5": "👩🏽‍🤝‍👨🏿", - "woman_and_man_holding_hands_medium_skin_tone_dark_skin_tone": "👩🏽‍🤝‍👨🏿", - "woman_and_man_holding_hands_tone4_tone1": "👩🏾‍🤝‍👨🏻", - "woman_and_man_holding_hands_medium_dark_skin_tone_light_skin_tone": "👩🏾‍🤝‍👨🏻", - "woman_and_man_holding_hands_tone4_tone2": "👩🏾‍🤝‍👨🏼", - "woman_and_man_holding_hands_medium_dark_skin_tone_medium_light_skin_tone": "👩🏾‍🤝‍👨🏼", - "woman_and_man_holding_hands_tone4_tone3": "👩🏾‍🤝‍👨🏽", - "woman_and_man_holding_hands_medium_dark_skin_tone_medium_skin_tone": "👩🏾‍🤝‍👨🏽", - "woman_and_man_holding_hands_tone4": "👫🏾", - "woman_and_man_holding_hands_medium_dark_skin_tone": "👫🏾", - "woman_and_man_holding_hands_tone4_tone5": "👩🏾‍🤝‍👨🏿", - "woman_and_man_holding_hands_medium_dark_skin_tone_dark_skin_tone": "👩🏾‍🤝‍👨🏿", - "woman_and_man_holding_hands_tone5_tone1": "👩🏿‍🤝‍👨🏻", - "woman_and_man_holding_hands_dark_skin_tone_light_skin_tone": "👩🏿‍🤝‍👨🏻", - "woman_and_man_holding_hands_tone5_tone2": "👩🏿‍🤝‍👨🏼", - "woman_and_man_holding_hands_dark_skin_tone_medium_light_skin_tone": "👩🏿‍🤝‍👨🏼", - "woman_and_man_holding_hands_tone5_tone3": "👩🏿‍🤝‍👨🏽", - "woman_and_man_holding_hands_dark_skin_tone_medium_skin_tone": "👩🏿‍🤝‍👨🏽", - "woman_and_man_holding_hands_tone5_tone4": "👩🏿‍🤝‍👨🏾", - "woman_and_man_holding_hands_dark_skin_tone_medium_dark_skin_tone": "👩🏿‍🤝‍👨🏾", - "woman_and_man_holding_hands_tone5": "👫🏿", - "woman_and_man_holding_hands_dark_skin_tone": "👫🏿", - "two_women_holding_hands": "👭", - "women_holding_hands_tone1": "👭🏻", - "women_holding_hands_light_skin_tone": "👭🏻", - "women_holding_hands_tone1_tone2": "👩🏻‍🤝‍👩🏼", - "women_holding_hands_light_skin_tone_medium_light_skin_tone": "👩🏻‍🤝‍👩🏼", - "women_holding_hands_tone1_tone3": "👩🏻‍🤝‍👩🏽", - "women_holding_hands_light_skin_tone_medium_skin_tone": "👩🏻‍🤝‍👩🏽", - "women_holding_hands_tone1_tone4": "👩🏻‍🤝‍👩🏾", - "women_holding_hands_light_skin_tone_medium_dark_skin_tone": "👩🏻‍🤝‍👩🏾", - "women_holding_hands_tone1_tone5": "👩🏻‍🤝‍👩🏿", - "women_holding_hands_light_skin_tone_dark_skin_tone": "👩🏻‍🤝‍👩🏿", - "women_holding_hands_tone2_tone1": "👩🏼‍🤝‍👩🏻", - "women_holding_hands_medium_light_skin_tone_light_skin_tone": "👩🏼‍🤝‍👩🏻", - "women_holding_hands_tone2": "👭🏼", - "women_holding_hands_medium_light_skin_tone": "👭🏼", - "women_holding_hands_tone2_tone3": "👩🏼‍🤝‍👩🏽", - "women_holding_hands_medium_light_skin_tone_medium_skin_tone": "👩🏼‍🤝‍👩🏽", - "women_holding_hands_tone2_tone4": "👩🏼‍🤝‍👩🏾", - "women_holding_hands_medium_light_skin_tone_medium_dark_skin_tone": "👩🏼‍🤝‍👩🏾", - "women_holding_hands_tone2_tone5": "👩🏼‍🤝‍👩🏿", - "women_holding_hands_medium_light_skin_tone_dark_skin_tone": "👩🏼‍🤝‍👩🏿", - "women_holding_hands_tone3_tone1": "👩🏽‍🤝‍👩🏻", - "women_holding_hands_medium_skin_tone_light_skin_tone": "👩🏽‍🤝‍👩🏻", - "women_holding_hands_tone3_tone2": "👩🏽‍🤝‍👩🏼", - "women_holding_hands_medium_skin_tone_medium_light_skin_tone": "👩🏽‍🤝‍👩🏼", - "women_holding_hands_tone3": "👭🏽", - "women_holding_hands_medium_skin_tone": "👭🏽", - "women_holding_hands_tone3_tone4": "👩🏽‍🤝‍👩🏾", - "women_holding_hands_medium_skin_tone_medium_dark_skin_tone": "👩🏽‍🤝‍👩🏾", - "women_holding_hands_tone3_tone5": "👩🏽‍🤝‍👩🏿", - "women_holding_hands_medium_skin_tone_dark_skin_tone": "👩🏽‍🤝‍👩🏿", - "women_holding_hands_tone4_tone1": "👩🏾‍🤝‍👩🏻", - "women_holding_hands_medium_dark_skin_tone_light_skin_tone": "👩🏾‍🤝‍👩🏻", - "women_holding_hands_tone4_tone2": "👩🏾‍🤝‍👩🏼", - "women_holding_hands_medium_dark_skin_tone_medium_light_skin_tone": "👩🏾‍🤝‍👩🏼", - "women_holding_hands_tone4_tone3": "👩🏾‍🤝‍👩🏽", - "women_holding_hands_medium_dark_skin_tone_medium_skin_tone": "👩🏾‍🤝‍👩🏽", - "women_holding_hands_tone4": "👭🏾", - "women_holding_hands_medium_dark_skin_tone": "👭🏾", - "women_holding_hands_tone4_tone5": "👩🏾‍🤝‍👩🏿", - "women_holding_hands_medium_dark_skin_tone_dark_skin_tone": "👩🏾‍🤝‍👩🏿", - "women_holding_hands_tone5_tone1": "👩🏿‍🤝‍👩🏻", - "women_holding_hands_dark_skin_tone_light_skin_tone": "👩🏿‍🤝‍👩🏻", - "women_holding_hands_tone5_tone2": "👩🏿‍🤝‍👩🏼", - "women_holding_hands_dark_skin_tone_medium_light_skin_tone": "👩🏿‍🤝‍👩🏼", - "women_holding_hands_tone5_tone3": "👩🏿‍🤝‍👩🏽", - "women_holding_hands_dark_skin_tone_medium_skin_tone": "👩🏿‍🤝‍👩🏽", - "women_holding_hands_tone5_tone4": "👩🏿‍🤝‍👩🏾", - "women_holding_hands_dark_skin_tone_medium_dark_skin_tone": "👩🏿‍🤝‍👩🏾", - "women_holding_hands_tone5": "👭🏿", - "women_holding_hands_dark_skin_tone": "👭🏿", - "two_men_holding_hands": "👬", - "men_holding_hands_tone1": "👬🏻", - "men_holding_hands_light_skin_tone": "👬🏻", - "men_holding_hands_tone1_tone2": "👨🏻‍🤝‍👨🏼", - "men_holding_hands_light_skin_tone_medium_light_skin_tone": "👨🏻‍🤝‍👨🏼", - "men_holding_hands_tone1_tone3": "👨🏻‍🤝‍👨🏽", - "men_holding_hands_light_skin_tone_medium_skin_tone": "👨🏻‍🤝‍👨🏽", - "men_holding_hands_tone1_tone4": "👨🏻‍🤝‍👨🏾", - "men_holding_hands_light_skin_tone_medium_dark_skin_tone": "👨🏻‍🤝‍👨🏾", - "men_holding_hands_tone1_tone5": "👨🏻‍🤝‍👨🏿", - "men_holding_hands_light_skin_tone_dark_skin_tone": "👨🏻‍🤝‍👨🏿", - "men_holding_hands_tone2_tone1": "👨🏼‍🤝‍👨🏻", - "men_holding_hands_medium_light_skin_tone_light_skin_tone": "👨🏼‍🤝‍👨🏻", - "men_holding_hands_tone2": "👬🏼", - "men_holding_hands_medium_light_skin_tone": "👬🏼", - "men_holding_hands_tone2_tone3": "👨🏼‍🤝‍👨🏽", - "men_holding_hands_medium_light_skin_tone_medium_skin_tone": "👨🏼‍🤝‍👨🏽", - "men_holding_hands_tone2_tone4": "👨🏼‍🤝‍👨🏾", - "men_holding_hands_medium_light_skin_tone_medium_dark_skin_tone": "👨🏼‍🤝‍👨🏾", - "men_holding_hands_tone2_tone5": "👨🏼‍🤝‍👨🏿", - "men_holding_hands_medium_light_skin_tone_dark_skin_tone": "👨🏼‍🤝‍👨🏿", - "men_holding_hands_tone3_tone1": "👨🏽‍🤝‍👨🏻", - "men_holding_hands_medium_skin_tone_light_skin_tone": "👨🏽‍🤝‍👨🏻", - "men_holding_hands_tone3_tone2": "👨🏽‍🤝‍👨🏼", - "men_holding_hands_medium_skin_tone_medium_light_skin_tone": "👨🏽‍🤝‍👨🏼", - "men_holding_hands_tone3": "👬🏽", - "men_holding_hands_medium_skin_tone": "👬🏽", - "men_holding_hands_tone3_tone4": "👨🏽‍🤝‍👨🏾", - "men_holding_hands_medium_skin_tone_medium_dark_skin_tone": "👨🏽‍🤝‍👨🏾", - "men_holding_hands_tone3_tone5": "👨🏽‍🤝‍👨🏿", - "men_holding_hands_medium_skin_tone_dark_skin_tone": "👨🏽‍🤝‍👨🏿", - "men_holding_hands_tone4_tone1": "👨🏾‍🤝‍👨🏻", - "men_holding_hands_medium_dark_skin_tone_light_skin_tone": "👨🏾‍🤝‍👨🏻", - "men_holding_hands_tone4_tone2": "👨🏾‍🤝‍👨🏼", - "men_holding_hands_medium_dark_skin_tone_medium_light_skin_tone": "👨🏾‍🤝‍👨🏼", - "men_holding_hands_tone4_tone3": "👨🏾‍🤝‍👨🏽", - "men_holding_hands_medium_dark_skin_tone_medium_skin_tone": "👨🏾‍🤝‍👨🏽", - "men_holding_hands_tone4": "👬🏾", - "men_holding_hands_medium_dark_skin_tone": "👬🏾", - "men_holding_hands_tone4_tone5": "👨🏾‍🤝‍👨🏿", - "men_holding_hands_medium_dark_skin_tone_dark_skin_tone": "👨🏾‍🤝‍👨🏿", - "men_holding_hands_tone5_tone1": "👨🏿‍🤝‍👨🏻", - "men_holding_hands_dark_skin_tone_light_skin_tone": "👨🏿‍🤝‍👨🏻", - "men_holding_hands_tone5_tone2": "👨🏿‍🤝‍👨🏼", - "men_holding_hands_dark_skin_tone_medium_light_skin_tone": "👨🏿‍🤝‍👨🏼", - "men_holding_hands_tone5_tone3": "👨🏿‍🤝‍👨🏽", - "men_holding_hands_dark_skin_tone_medium_skin_tone": "👨🏿‍🤝‍👨🏽", - "men_holding_hands_tone5_tone4": "👨🏿‍🤝‍👨🏾", - "men_holding_hands_dark_skin_tone_medium_dark_skin_tone": "👨🏿‍🤝‍👨🏾", - "men_holding_hands_tone5": "👬🏿", - "men_holding_hands_dark_skin_tone": "👬🏿", - "couple_with_heart": "💑", - "couple_with_heart_tone1": "💑🏻", - "couple_with_heart_light_skin_tone": "💑🏻", - "couple_with_heart_person_person_tone1_tone2": "🧑🏻‍❤️‍🧑🏼", - "couple_with_heart_person_person_light_skin_tone_medium_light_skin_tone": "🧑🏻‍❤️‍🧑🏼", - "couple_with_heart_person_person_tone1_tone3": "🧑🏻‍❤️‍🧑🏽", - "couple_with_heart_person_person_light_skin_tone_medium_skin_tone": "🧑🏻‍❤️‍🧑🏽", - "couple_with_heart_person_person_tone1_tone4": "🧑🏻‍❤️‍🧑🏾", - "couple_with_heart_person_person_light_skin_tone_medium_dark_skin_tone": "🧑🏻‍❤️‍🧑🏾", - "couple_with_heart_person_person_tone1_tone5": "🧑🏻‍❤️‍🧑🏿", - "couple_with_heart_person_person_light_skin_tone_dark_skin_tone": "🧑🏻‍❤️‍🧑🏿", - "couple_with_heart_person_person_tone2_tone1": "🧑🏼‍❤️‍🧑🏻", - "couple_with_heart_person_person_medium_light_skin_tone_light_skin_tone": "🧑🏼‍❤️‍🧑🏻", - "couple_with_heart_tone2": "💑🏼", - "couple_with_heart_medium_light_skin_tone": "💑🏼", - "couple_with_heart_person_person_tone2_tone3": "🧑🏼‍❤️‍🧑🏽", - "couple_with_heart_person_person_medium_light_skin_tone_medium_skin_tone": "🧑🏼‍❤️‍🧑🏽", - "couple_with_heart_person_person_tone2_tone4": "🧑🏼‍❤️‍🧑🏾", - "couple_with_heart_person_person_medium_light_skin_tone_medium_dark_skin_tone": "🧑🏼‍❤️‍🧑🏾", - "couple_with_heart_person_person_tone2_tone5": "🧑🏼‍❤️‍🧑🏿", - "couple_with_heart_person_person_medium_light_skin_tone_dark_skin_tone": "🧑🏼‍❤️‍🧑🏿", - "couple_with_heart_person_person_tone3_tone1": "🧑🏽‍❤️‍🧑🏻", - "couple_with_heart_person_person_medium_skin_tone_light_skin_tone": "🧑🏽‍❤️‍🧑🏻", - "couple_with_heart_person_person_tone3_tone2": "🧑🏽‍❤️‍🧑🏼", - "couple_with_heart_person_person_medium_skin_tone_medium_light_skin_tone": "🧑🏽‍❤️‍🧑🏼", - "couple_with_heart_tone3": "💑🏽", - "couple_with_heart_medium_skin_tone": "💑🏽", - "couple_with_heart_person_person_tone3_tone4": "🧑🏽‍❤️‍🧑🏾", - "couple_with_heart_person_person_medium_skin_tone_medium_dark_skin_tone": "🧑🏽‍❤️‍🧑🏾", - "couple_with_heart_person_person_tone3_tone5": "🧑🏽‍❤️‍🧑🏿", - "couple_with_heart_person_person_medium_skin_tone_dark_skin_tone": "🧑🏽‍❤️‍🧑🏿", - "couple_with_heart_person_person_tone4_tone1": "🧑🏾‍❤️‍🧑🏻", - "couple_with_heart_person_person_medium_dark_skin_tone_light_skin_tone": "🧑🏾‍❤️‍🧑🏻", - "couple_with_heart_person_person_tone4_tone2": "🧑🏾‍❤️‍🧑🏼", - "couple_with_heart_person_person_medium_dark_skin_tone_medium_light_skin_tone": "🧑🏾‍❤️‍🧑🏼", - "couple_with_heart_person_person_tone4_tone3": "🧑🏾‍❤️‍🧑🏽", - "couple_with_heart_person_person_medium_dark_skin_tone_medium_skin_tone": "🧑🏾‍❤️‍🧑🏽", - "couple_with_heart_tone4": "💑🏾", - "couple_with_heart_medium_dark_skin_tone": "💑🏾", - "couple_with_heart_person_person_tone4_tone5": "🧑🏾‍❤️‍🧑🏿", - "couple_with_heart_person_person_medium_dark_skin_tone_dark_skin_tone": "🧑🏾‍❤️‍🧑🏿", - "couple_with_heart_person_person_tone5_tone1": "🧑🏿‍❤️‍🧑🏻", - "couple_with_heart_person_person_dark_skin_tone_light_skin_tone": "🧑🏿‍❤️‍🧑🏻", - "couple_with_heart_person_person_tone5_tone2": "🧑🏿‍❤️‍🧑🏼", - "couple_with_heart_person_person_dark_skin_tone_medium_light_skin_tone": "🧑🏿‍❤️‍🧑🏼", - "couple_with_heart_person_person_tone5_tone3": "🧑🏿‍❤️‍🧑🏽", - "couple_with_heart_person_person_dark_skin_tone_medium_skin_tone": "🧑🏿‍❤️‍🧑🏽", - "couple_with_heart_person_person_tone5_tone4": "🧑🏿‍❤️‍🧑🏾", - "couple_with_heart_person_person_dark_skin_tone_medium_dark_skin_tone": "🧑🏿‍❤️‍🧑🏾", - "couple_with_heart_tone5": "💑🏿", - "couple_with_heart_dark_skin_tone": "💑🏿", - "couple_with_heart_woman_man": "👩‍❤️‍👨", - "couple_with_heart_woman_man_tone1": "👩🏻‍❤️‍👨🏻", - "couple_with_heart_woman_man_light_skin_tone": "👩🏻‍❤️‍👨🏻", - "couple_with_heart_woman_man_tone1_tone2": "👩🏻‍❤️‍👨🏼", - "couple_with_heart_woman_man_light_skin_tone_medium_light_skin_tone": "👩🏻‍❤️‍👨🏼", - "couple_with_heart_woman_man_tone1_tone3": "👩🏻‍❤️‍👨🏽", - "couple_with_heart_woman_man_light_skin_tone_medium_skin_tone": "👩🏻‍❤️‍👨🏽", - "couple_with_heart_woman_man_tone1_tone4": "👩🏻‍❤️‍👨🏾", - "couple_with_heart_woman_man_light_skin_tone_medium_dark_skin_tone": "👩🏻‍❤️‍👨🏾", - "couple_with_heart_woman_man_tone1_tone5": "👩🏻‍❤️‍👨🏿", - "couple_with_heart_woman_man_light_skin_tone_dark_skin_tone": "👩🏻‍❤️‍👨🏿", - "couple_with_heart_woman_man_tone2_tone1": "👩🏼‍❤️‍👨🏻", - "couple_with_heart_woman_man_medium_light_skin_tone_light_skin_tone": "👩🏼‍❤️‍👨🏻", - "couple_with_heart_woman_man_tone2": "👩🏼‍❤️‍👨🏼", - "couple_with_heart_woman_man_medium_light_skin_tone": "👩🏼‍❤️‍👨🏼", - "couple_with_heart_woman_man_tone2_tone3": "👩🏼‍❤️‍👨🏽", - "couple_with_heart_woman_man_medium_light_skin_tone_medium_skin_tone": "👩🏼‍❤️‍👨🏽", - "couple_with_heart_woman_man_tone2_tone4": "👩🏼‍❤️‍👨🏾", - "couple_with_heart_woman_man_medium_light_skin_tone_medium_dark_skin_tone": "👩🏼‍❤️‍👨🏾", - "couple_with_heart_woman_man_tone2_tone5": "👩🏼‍❤️‍👨🏿", - "couple_with_heart_woman_man_medium_light_skin_tone_dark_skin_tone": "👩🏼‍❤️‍👨🏿", - "couple_with_heart_woman_man_tone3_tone1": "👩🏽‍❤️‍👨🏻", - "couple_with_heart_woman_man_medium_skin_tone_light_skin_tone": "👩🏽‍❤️‍👨🏻", - "couple_with_heart_woman_man_tone3_tone2": "👩🏽‍❤️‍👨🏼", - "couple_with_heart_woman_man_medium_skin_tone_medium_light_skin_tone": "👩🏽‍❤️‍👨🏼", - "couple_with_heart_woman_man_tone3": "👩🏽‍❤️‍👨🏽", - "couple_with_heart_woman_man_medium_skin_tone": "👩🏽‍❤️‍👨🏽", - "couple_with_heart_woman_man_tone3_tone4": "👩🏽‍❤️‍👨🏾", - "couple_with_heart_woman_man_medium_skin_tone_medium_dark_skin_tone": "👩🏽‍❤️‍👨🏾", - "couple_with_heart_woman_man_tone3_tone5": "👩🏽‍❤️‍👨🏿", - "couple_with_heart_woman_man_medium_skin_tone_dark_skin_tone": "👩🏽‍❤️‍👨🏿", - "couple_with_heart_woman_man_tone4_tone1": "👩🏾‍❤️‍👨🏻", - "couple_with_heart_woman_man_medium_dark_skin_tone_light_skin_tone": "👩🏾‍❤️‍👨🏻", - "couple_with_heart_woman_man_tone4_tone2": "👩🏾‍❤️‍👨🏼", - "couple_with_heart_woman_man_medium_dark_skin_tone_medium_light_skin_tone": "👩🏾‍❤️‍👨🏼", - "couple_with_heart_woman_man_tone4_tone3": "👩🏾‍❤️‍👨🏽", - "couple_with_heart_woman_man_medium_dark_skin_tone_medium_skin_tone": "👩🏾‍❤️‍👨🏽", - "couple_with_heart_woman_man_tone4": "👩🏾‍❤️‍👨🏾", - "couple_with_heart_woman_man_medium_dark_skin_tone": "👩🏾‍❤️‍👨🏾", - "couple_with_heart_woman_man_tone4_tone5": "👩🏾‍❤️‍👨🏿", - "couple_with_heart_woman_man_medium_dark_skin_tone_dark_skin_tone": "👩🏾‍❤️‍👨🏿", - "couple_with_heart_woman_man_tone5_tone1": "👩🏿‍❤️‍👨🏻", - "couple_with_heart_woman_man_dark_skin_tone_light_skin_tone": "👩🏿‍❤️‍👨🏻", - "couple_with_heart_woman_man_tone5_tone2": "👩🏿‍❤️‍👨🏼", - "couple_with_heart_woman_man_dark_skin_tone_medium_light_skin_tone": "👩🏿‍❤️‍👨🏼", - "couple_with_heart_woman_man_tone5_tone3": "👩🏿‍❤️‍👨🏽", - "couple_with_heart_woman_man_dark_skin_tone_medium_skin_tone": "👩🏿‍❤️‍👨🏽", - "couple_with_heart_woman_man_tone5_tone4": "👩🏿‍❤️‍👨🏾", - "couple_with_heart_woman_man_dark_skin_tone_medium_dark_skin_tone": "👩🏿‍❤️‍👨🏾", - "couple_with_heart_woman_man_tone5": "👩🏿‍❤️‍👨🏿", - "couple_with_heart_woman_man_dark_skin_tone": "👩🏿‍❤️‍👨🏿", - "couple_ww": "👩‍❤️‍👩", - "couple_with_heart_ww": "👩‍❤️‍👩", - "couple_with_heart_woman_woman_tone1": "👩🏻‍❤️‍👩🏻", - "couple_with_heart_woman_woman_light_skin_tone": "👩🏻‍❤️‍👩🏻", - "couple_with_heart_woman_woman_tone1_tone2": "👩🏻‍❤️‍👩🏼", - "couple_with_heart_woman_woman_light_skin_tone_medium_light_skin_tone": "👩🏻‍❤️‍👩🏼", - "couple_with_heart_woman_woman_tone1_tone3": "👩🏻‍❤️‍👩🏽", - "couple_with_heart_woman_woman_light_skin_tone_medium_skin_tone": "👩🏻‍❤️‍👩🏽", - "couple_with_heart_woman_woman_tone1_tone4": "👩🏻‍❤️‍👩🏾", - "couple_with_heart_woman_woman_light_skin_tone_medium_dark_skin_tone": "👩🏻‍❤️‍👩🏾", - "couple_with_heart_woman_woman_tone1_tone5": "👩🏻‍❤️‍👩🏿", - "couple_with_heart_woman_woman_light_skin_tone_dark_skin_tone": "👩🏻‍❤️‍👩🏿", - "couple_with_heart_woman_woman_tone2_tone1": "👩🏼‍❤️‍👩🏻", - "couple_with_heart_woman_woman_medium_light_skin_tone_light_skin_tone": "👩🏼‍❤️‍👩🏻", - "couple_with_heart_woman_woman_tone2": "👩🏼‍❤️‍👩🏼", - "couple_with_heart_woman_woman_medium_light_skin_tone": "👩🏼‍❤️‍👩🏼", - "couple_with_heart_woman_woman_tone2_tone3": "👩🏼‍❤️‍👩🏽", - "couple_with_heart_woman_woman_medium_light_skin_tone_medium_skin_tone": "👩🏼‍❤️‍👩🏽", - "couple_with_heart_woman_woman_tone2_tone4": "👩🏼‍❤️‍👩🏾", - "couple_with_heart_woman_woman_medium_light_skin_tone_medium_dark_skin_tone": "👩🏼‍❤️‍👩🏾", - "couple_with_heart_woman_woman_tone2_tone5": "👩🏼‍❤️‍👩🏿", - "couple_with_heart_woman_woman_medium_light_skin_tone_dark_skin_tone": "👩🏼‍❤️‍👩🏿", - "couple_with_heart_woman_woman_tone3_tone1": "👩🏽‍❤️‍👩🏻", - "couple_with_heart_woman_woman_medium_skin_tone_light_skin_tone": "👩🏽‍❤️‍👩🏻", - "couple_with_heart_woman_woman_tone3_tone2": "👩🏽‍❤️‍👩🏼", - "couple_with_heart_woman_woman_medium_skin_tone_medium_light_skin_tone": "👩🏽‍❤️‍👩🏼", - "couple_with_heart_woman_woman_tone3": "👩🏽‍❤️‍👩🏽", - "couple_with_heart_woman_woman_medium_skin_tone": "👩🏽‍❤️‍👩🏽", - "couple_with_heart_woman_woman_tone3_tone4": "👩🏽‍❤️‍👩🏾", - "couple_with_heart_woman_woman_medium_skin_tone_medium_dark_skin_tone": "👩🏽‍❤️‍👩🏾", - "couple_with_heart_woman_woman_tone3_tone5": "👩🏽‍❤️‍👩🏿", - "couple_with_heart_woman_woman_medium_skin_tone_dark_skin_tone": "👩🏽‍❤️‍👩🏿", - "couple_with_heart_woman_woman_tone4_tone1": "👩🏾‍❤️‍👩🏻", - "couple_with_heart_woman_woman_medium_dark_skin_tone_light_skin_tone": "👩🏾‍❤️‍👩🏻", - "couple_with_heart_woman_woman_tone4_tone2": "👩🏾‍❤️‍👩🏼", - "couple_with_heart_woman_woman_medium_dark_skin_tone_medium_light_skin_tone": "👩🏾‍❤️‍👩🏼", - "couple_with_heart_woman_woman_tone4_tone3": "👩🏾‍❤️‍👩🏽", - "couple_with_heart_woman_woman_medium_dark_skin_tone_medium_skin_tone": "👩🏾‍❤️‍👩🏽", - "couple_with_heart_woman_woman_tone4": "👩🏾‍❤️‍👩🏾", - "couple_with_heart_woman_woman_medium_dark_skin_tone": "👩🏾‍❤️‍👩🏾", - "couple_with_heart_woman_woman_tone4_tone5": "👩🏾‍❤️‍👩🏿", - "couple_with_heart_woman_woman_medium_dark_skin_tone_dark_skin_tone": "👩🏾‍❤️‍👩🏿", - "couple_with_heart_woman_woman_tone5_tone1": "👩🏿‍❤️‍👩🏻", - "couple_with_heart_woman_woman_dark_skin_tone_light_skin_tone": "👩🏿‍❤️‍👩🏻", - "couple_with_heart_woman_woman_tone5_tone2": "👩🏿‍❤️‍👩🏼", - "couple_with_heart_woman_woman_dark_skin_tone_medium_light_skin_tone": "👩🏿‍❤️‍👩🏼", - "couple_with_heart_woman_woman_tone5_tone3": "👩🏿‍❤️‍👩🏽", - "couple_with_heart_woman_woman_dark_skin_tone_medium_skin_tone": "👩🏿‍❤️‍👩🏽", - "couple_with_heart_woman_woman_tone5_tone4": "👩🏿‍❤️‍👩🏾", - "couple_with_heart_woman_woman_dark_skin_tone_medium_dark_skin_tone": "👩🏿‍❤️‍👩🏾", - "couple_with_heart_woman_woman_tone5": "👩🏿‍❤️‍👩🏿", - "couple_with_heart_woman_woman_dark_skin_tone": "👩🏿‍❤️‍👩🏿", - "couple_mm": "👨‍❤️‍👨", - "couple_with_heart_mm": "👨‍❤️‍👨", - "couple_with_heart_man_man_tone1": "👨🏻‍❤️‍👨🏻", - "couple_with_heart_man_man_light_skin_tone": "👨🏻‍❤️‍👨🏻", - "couple_with_heart_man_man_tone1_tone2": "👨🏻‍❤️‍👨🏼", - "couple_with_heart_man_man_light_skin_tone_medium_light_skin_tone": "👨🏻‍❤️‍👨🏼", - "couple_with_heart_man_man_tone1_tone3": "👨🏻‍❤️‍👨🏽", - "couple_with_heart_man_man_light_skin_tone_medium_skin_tone": "👨🏻‍❤️‍👨🏽", - "couple_with_heart_man_man_tone1_tone4": "👨🏻‍❤️‍👨🏾", - "couple_with_heart_man_man_light_skin_tone_medium_dark_skin_tone": "👨🏻‍❤️‍👨🏾", - "couple_with_heart_man_man_tone1_tone5": "👨🏻‍❤️‍👨🏿", - "couple_with_heart_man_man_light_skin_tone_dark_skin_tone": "👨🏻‍❤️‍👨🏿", - "couple_with_heart_man_man_tone2_tone1": "👨🏼‍❤️‍👨🏻", - "couple_with_heart_man_man_medium_light_skin_tone_light_skin_tone": "👨🏼‍❤️‍👨🏻", - "couple_with_heart_man_man_tone2": "👨🏼‍❤️‍👨🏼", - "couple_with_heart_man_man_medium_light_skin_tone": "👨🏼‍❤️‍👨🏼", - "couple_with_heart_man_man_tone2_tone3": "👨🏼‍❤️‍👨🏽", - "couple_with_heart_man_man_medium_light_skin_tone_medium_skin_tone": "👨🏼‍❤️‍👨🏽", - "couple_with_heart_man_man_tone2_tone4": "👨🏼‍❤️‍👨🏾", - "couple_with_heart_man_man_medium_light_skin_tone_medium_dark_skin_tone": "👨🏼‍❤️‍👨🏾", - "couple_with_heart_man_man_tone2_tone5": "👨🏼‍❤️‍👨🏿", - "couple_with_heart_man_man_medium_light_skin_tone_dark_skin_tone": "👨🏼‍❤️‍👨🏿", - "couple_with_heart_man_man_tone3_tone1": "👨🏽‍❤️‍👨🏻", - "couple_with_heart_man_man_medium_skin_tone_light_skin_tone": "👨🏽‍❤️‍👨🏻", - "couple_with_heart_man_man_tone3_tone2": "👨🏽‍❤️‍👨🏼", - "couple_with_heart_man_man_medium_skin_tone_medium_light_skin_tone": "👨🏽‍❤️‍👨🏼", - "couple_with_heart_man_man_tone3": "👨🏽‍❤️‍👨🏽", - "couple_with_heart_man_man_medium_skin_tone": "👨🏽‍❤️‍👨🏽", - "couple_with_heart_man_man_tone3_tone4": "👨🏽‍❤️‍👨🏾", - "couple_with_heart_man_man_medium_skin_tone_medium_dark_skin_tone": "👨🏽‍❤️‍👨🏾", - "couple_with_heart_man_man_tone3_tone5": "👨🏽‍❤️‍👨🏿", - "couple_with_heart_man_man_medium_skin_tone_dark_skin_tone": "👨🏽‍❤️‍👨🏿", - "couple_with_heart_man_man_tone4_tone1": "👨🏾‍❤️‍👨🏻", - "couple_with_heart_man_man_medium_dark_skin_tone_light_skin_tone": "👨🏾‍❤️‍👨🏻", - "couple_with_heart_man_man_tone4_tone2": "👨🏾‍❤️‍👨🏼", - "couple_with_heart_man_man_medium_dark_skin_tone_medium_light_skin_tone": "👨🏾‍❤️‍👨🏼", - "couple_with_heart_man_man_tone4_tone3": "👨🏾‍❤️‍👨🏽", - "couple_with_heart_man_man_medium_dark_skin_tone_medium_skin_tone": "👨🏾‍❤️‍👨🏽", - "couple_with_heart_man_man_tone4": "👨🏾‍❤️‍👨🏾", - "couple_with_heart_man_man_medium_dark_skin_tone": "👨🏾‍❤️‍👨🏾", - "couple_with_heart_man_man_tone4_tone5": "👨🏾‍❤️‍👨🏿", - "couple_with_heart_man_man_medium_dark_skin_tone_dark_skin_tone": "👨🏾‍❤️‍👨🏿", - "couple_with_heart_man_man_tone5_tone1": "👨🏿‍❤️‍👨🏻", - "couple_with_heart_man_man_dark_skin_tone_light_skin_tone": "👨🏿‍❤️‍👨🏻", - "couple_with_heart_man_man_tone5_tone2": "👨🏿‍❤️‍👨🏼", - "couple_with_heart_man_man_dark_skin_tone_medium_light_skin_tone": "👨🏿‍❤️‍👨🏼", - "couple_with_heart_man_man_tone5_tone3": "👨🏿‍❤️‍👨🏽", - "couple_with_heart_man_man_dark_skin_tone_medium_skin_tone": "👨🏿‍❤️‍👨🏽", - "couple_with_heart_man_man_tone5_tone4": "👨🏿‍❤️‍👨🏾", - "couple_with_heart_man_man_dark_skin_tone_medium_dark_skin_tone": "👨🏿‍❤️‍👨🏾", - "couple_with_heart_man_man_tone5": "👨🏿‍❤️‍👨🏿", - "couple_with_heart_man_man_dark_skin_tone": "👨🏿‍❤️‍👨🏿", - "couplekiss": "💏", - "kiss_person_person_tone5_tone4": "🧑🏿‍❤️‍💋‍🧑🏾", - "kiss_person_person_dark_skin_tone_medium_dark_skin_tone": "🧑🏿‍❤️‍💋‍🧑🏾", - "kiss_tone1": "💏🏻", - "kiss_light_skin_tone": "💏🏻", - "kiss_person_person_tone1_tone2": "🧑🏻‍❤️‍💋‍🧑🏼", - "kiss_person_person_light_skin_tone_medium_light_skin_tone": "🧑🏻‍❤️‍💋‍🧑🏼", - "kiss_person_person_tone1_tone3": "🧑🏻‍❤️‍💋‍🧑🏽", - "kiss_person_person_light_skin_tone_medium_skin_tone": "🧑🏻‍❤️‍💋‍🧑🏽", - "kiss_person_person_tone1_tone4": "🧑🏻‍❤️‍💋‍🧑🏾", - "kiss_person_person_light_skin_tone_medium_dark_skin_tone": "🧑🏻‍❤️‍💋‍🧑🏾", - "kiss_person_person_tone1_tone5": "🧑🏻‍❤️‍💋‍🧑🏿", - "kiss_person_person_light_skin_tone_dark_skin_tone": "🧑🏻‍❤️‍💋‍🧑🏿", - "kiss_person_person_tone2_tone1": "🧑🏼‍❤️‍💋‍🧑🏻", - "kiss_person_person_medium_light_skin_tone_light_skin_tone": "🧑🏼‍❤️‍💋‍🧑🏻", - "kiss_tone2": "💏🏼", - "kiss_medium_light_skin_tone": "💏🏼", - "kiss_person_person_tone2_tone3": "🧑🏼‍❤️‍💋‍🧑🏽", - "kiss_person_person_medium_light_skin_tone_medium_skin_tone": "🧑🏼‍❤️‍💋‍🧑🏽", - "kiss_person_person_tone2_tone4": "🧑🏼‍❤️‍💋‍🧑🏾", - "kiss_person_person_medium_light_skin_tone_medium_dark_skin_tone": "🧑🏼‍❤️‍💋‍🧑🏾", - "kiss_person_person_tone2_tone5": "🧑🏼‍❤️‍💋‍🧑🏿", - "kiss_person_person_medium_light_skin_tone_dark_skin_tone": "🧑🏼‍❤️‍💋‍🧑🏿", - "kiss_person_person_tone3_tone1": "🧑🏽‍❤️‍💋‍🧑🏻", - "kiss_person_person_medium_skin_tone_light_skin_tone": "🧑🏽‍❤️‍💋‍🧑🏻", - "kiss_person_person_tone3_tone2": "🧑🏽‍❤️‍💋‍🧑🏼", - "kiss_person_person_medium_skin_tone_medium_light_skin_tone": "🧑🏽‍❤️‍💋‍🧑🏼", - "kiss_tone3": "💏🏽", - "kiss_medium_skin_tone": "💏🏽", - "kiss_person_person_tone3_tone4": "🧑🏽‍❤️‍💋‍🧑🏾", - "kiss_person_person_medium_skin_tone_medium_dark_skin_tone": "🧑🏽‍❤️‍💋‍🧑🏾", - "kiss_person_person_tone3_tone5": "🧑🏽‍❤️‍💋‍🧑🏿", - "kiss_person_person_medium_skin_tone_dark_skin_tone": "🧑🏽‍❤️‍💋‍🧑🏿", - "kiss_person_person_tone4_tone1": "🧑🏾‍❤️‍💋‍🧑🏻", - "kiss_person_person_medium_dark_skin_tone_light_skin_tone": "🧑🏾‍❤️‍💋‍🧑🏻", - "kiss_person_person_tone4_tone2": "🧑🏾‍❤️‍💋‍🧑🏼", - "kiss_person_person_medium_dark_skin_tone_medium_light_skin_tone": "🧑🏾‍❤️‍💋‍🧑🏼", - "kiss_person_person_tone4_tone3": "🧑🏾‍❤️‍💋‍🧑🏽", - "kiss_person_person_medium_dark_skin_tone_medium_skin_tone": "🧑🏾‍❤️‍💋‍🧑🏽", - "kiss_tone4": "💏🏾", - "kiss_medium_dark_skin_tone": "💏🏾", - "kiss_person_person_tone4_tone5": "🧑🏾‍❤️‍💋‍🧑🏿", - "kiss_person_person_medium_dark_skin_tone_dark_skin_tone": "🧑🏾‍❤️‍💋‍🧑🏿", - "kiss_person_person_tone5_tone1": "🧑🏿‍❤️‍💋‍🧑🏻", - "kiss_person_person_dark_skin_tone_light_skin_tone": "🧑🏿‍❤️‍💋‍🧑🏻", - "kiss_person_person_tone5_tone2": "🧑🏿‍❤️‍💋‍🧑🏼", - "kiss_person_person_dark_skin_tone_medium_light_skin_tone": "🧑🏿‍❤️‍💋‍🧑🏼", - "kiss_person_person_tone5_tone3": "🧑🏿‍❤️‍💋‍🧑🏽", - "kiss_person_person_dark_skin_tone_medium_skin_tone": "🧑🏿‍❤️‍💋‍🧑🏽", - "kiss_tone5": "💏🏿", - "kiss_dark_skin_tone": "💏🏿", - "kiss_woman_man": "👩‍❤️‍💋‍👨", - "kiss_woman_man_tone1": "👩🏻‍❤️‍💋‍👨🏻", - "kiss_woman_man_light_skin_tone": "👩🏻‍❤️‍💋‍👨🏻", - "kiss_woman_man_tone1_tone2": "👩🏻‍❤️‍💋‍👨🏼", - "kiss_woman_man_light_skin_tone_medium_light_skin_tone": "👩🏻‍❤️‍💋‍👨🏼", - "kiss_woman_man_tone1_tone3": "👩🏻‍❤️‍💋‍👨🏽", - "kiss_woman_man_light_skin_tone_medium_skin_tone": "👩🏻‍❤️‍💋‍👨🏽", - "kiss_woman_man_tone1_tone4": "👩🏻‍❤️‍💋‍👨🏾", - "kiss_woman_man_light_skin_tone_medium_dark_skin_tone": "👩🏻‍❤️‍💋‍👨🏾", - "kiss_woman_man_tone1_tone5": "👩🏻‍❤️‍💋‍👨🏿", - "kiss_woman_man_light_skin_tone_dark_skin_tone": "👩🏻‍❤️‍💋‍👨🏿", - "kiss_woman_man_tone2_tone1": "👩🏼‍❤️‍💋‍👨🏻", - "kiss_woman_man_medium_light_skin_tone_light_skin_tone": "👩🏼‍❤️‍💋‍👨🏻", - "kiss_woman_man_tone2": "👩🏼‍❤️‍💋‍👨🏼", - "kiss_woman_man_medium_light_skin_tone": "👩🏼‍❤️‍💋‍👨🏼", - "kiss_woman_man_tone2_tone3": "👩🏼‍❤️‍💋‍👨🏽", - "kiss_woman_man_medium_light_skin_tone_medium_skin_tone": "👩🏼‍❤️‍💋‍👨🏽", - "kiss_woman_man_tone2_tone4": "👩🏼‍❤️‍💋‍👨🏾", - "kiss_woman_man_medium_light_skin_tone_medium_dark_skin_tone": "👩🏼‍❤️‍💋‍👨🏾", - "kiss_woman_man_tone2_tone5": "👩🏼‍❤️‍💋‍👨🏿", - "kiss_woman_man_medium_light_skin_tone_dark_skin_tone": "👩🏼‍❤️‍💋‍👨🏿", - "kiss_woman_man_tone3_tone1": "👩🏽‍❤️‍💋‍👨🏻", - "kiss_woman_man_medium_skin_tone_light_skin_tone": "👩🏽‍❤️‍💋‍👨🏻", - "kiss_woman_man_tone3_tone2": "👩🏽‍❤️‍💋‍👨🏼", - "kiss_woman_man_medium_skin_tone_medium_light_skin_tone": "👩🏽‍❤️‍💋‍👨🏼", - "kiss_woman_man_tone3": "👩🏽‍❤️‍💋‍👨🏽", - "kiss_woman_man_medium_skin_tone": "👩🏽‍❤️‍💋‍👨🏽", - "kiss_woman_man_tone3_tone4": "👩🏽‍❤️‍💋‍👨🏾", - "kiss_woman_man_medium_skin_tone_medium_dark_skin_tone": "👩🏽‍❤️‍💋‍👨🏾", - "kiss_woman_man_tone3_tone5": "👩🏽‍❤️‍💋‍👨🏿", - "kiss_woman_man_medium_skin_tone_dark_skin_tone": "👩🏽‍❤️‍💋‍👨🏿", - "kiss_woman_man_tone4_tone1": "👩🏾‍❤️‍💋‍👨🏻", - "kiss_woman_man_medium_dark_skin_tone_light_skin_tone": "👩🏾‍❤️‍💋‍👨🏻", - "kiss_woman_man_tone4_tone2": "👩🏾‍❤️‍💋‍👨🏼", - "kiss_woman_man_medium_dark_skin_tone_medium_light_skin_tone": "👩🏾‍❤️‍💋‍👨🏼", - "kiss_woman_man_tone4_tone3": "👩🏾‍❤️‍💋‍👨🏽", - "kiss_woman_man_medium_dark_skin_tone_medium_skin_tone": "👩🏾‍❤️‍💋‍👨🏽", - "kiss_woman_man_tone4": "👩🏾‍❤️‍💋‍👨🏾", - "kiss_woman_man_medium_dark_skin_tone": "👩🏾‍❤️‍💋‍👨🏾", - "kiss_woman_man_tone4_tone5": "👩🏾‍❤️‍💋‍👨🏿", - "kiss_woman_man_medium_dark_skin_tone_dark_skin_tone": "👩🏾‍❤️‍💋‍👨🏿", - "kiss_woman_man_tone5_tone1": "👩🏿‍❤️‍💋‍👨🏻", - "kiss_woman_man_dark_skin_tone_light_skin_tone": "👩🏿‍❤️‍💋‍👨🏻", - "kiss_woman_man_tone5_tone2": "👩🏿‍❤️‍💋‍👨🏼", - "kiss_woman_man_dark_skin_tone_medium_light_skin_tone": "👩🏿‍❤️‍💋‍👨🏼", - "kiss_woman_man_tone5_tone3": "👩🏿‍❤️‍💋‍👨🏽", - "kiss_woman_man_dark_skin_tone_medium_skin_tone": "👩🏿‍❤️‍💋‍👨🏽", - "kiss_woman_man_tone5_tone4": "👩🏿‍❤️‍💋‍👨🏾", - "kiss_woman_man_dark_skin_tone_medium_dark_skin_tone": "👩🏿‍❤️‍💋‍👨🏾", - "kiss_woman_man_tone5": "👩🏿‍❤️‍💋‍👨🏿", - "kiss_woman_man_dark_skin_tone": "👩🏿‍❤️‍💋‍👨🏿", - "kiss_ww": "👩‍❤️‍💋‍👩", - "couplekiss_ww": "👩‍❤️‍💋‍👩", - "kiss_woman_woman_tone1": "👩🏻‍❤️‍💋‍👩🏻", - "kiss_woman_woman_light_skin_tone": "👩🏻‍❤️‍💋‍👩🏻", - "kiss_woman_woman_tone1_tone2": "👩🏻‍❤️‍💋‍👩🏼", - "kiss_woman_woman_light_skin_tone_medium_light_skin_tone": "👩🏻‍❤️‍💋‍👩🏼", - "kiss_woman_woman_tone1_tone3": "👩🏻‍❤️‍💋‍👩🏽", - "kiss_woman_woman_light_skin_tone_medium_skin_tone": "👩🏻‍❤️‍💋‍👩🏽", - "kiss_woman_woman_tone1_tone4": "👩🏻‍❤️‍💋‍👩🏾", - "kiss_woman_woman_light_skin_tone_medium_dark_skin_tone": "👩🏻‍❤️‍💋‍👩🏾", - "kiss_woman_woman_tone1_tone5": "👩🏻‍❤️‍💋‍👩🏿", - "kiss_woman_woman_light_skin_tone_dark_skin_tone": "👩🏻‍❤️‍💋‍👩🏿", - "kiss_woman_woman_tone2_tone1": "👩🏼‍❤️‍💋‍👩🏻", - "kiss_woman_woman_medium_light_skin_tone_light_skin_tone": "👩🏼‍❤️‍💋‍👩🏻", - "kiss_woman_woman_tone2": "👩🏼‍❤️‍💋‍👩🏼", - "kiss_woman_woman_medium_light_skin_tone": "👩🏼‍❤️‍💋‍👩🏼", - "kiss_woman_woman_tone2_tone3": "👩🏼‍❤️‍💋‍👩🏽", - "kiss_woman_woman_medium_light_skin_tone_medium_skin_tone": "👩🏼‍❤️‍💋‍👩🏽", - "kiss_woman_woman_tone2_tone4": "👩🏼‍❤️‍💋‍👩🏾", - "kiss_woman_woman_medium_light_skin_tone_medium_dark_skin_tone": "👩🏼‍❤️‍💋‍👩🏾", - "kiss_woman_woman_tone2_tone5": "👩🏼‍❤️‍💋‍👩🏿", - "kiss_woman_woman_medium_light_skin_tone_dark_skin_tone": "👩🏼‍❤️‍💋‍👩🏿", - "kiss_woman_woman_tone3_tone1": "👩🏽‍❤️‍💋‍👩🏻", - "kiss_woman_woman_medium_skin_tone_light_skin_tone": "👩🏽‍❤️‍💋‍👩🏻", - "kiss_woman_woman_tone3_tone2": "👩🏽‍❤️‍💋‍👩🏼", - "kiss_woman_woman_medium_skin_tone_medium_light_skin_tone": "👩🏽‍❤️‍💋‍👩🏼", - "kiss_woman_woman_tone3": "👩🏽‍❤️‍💋‍👩🏽", - "kiss_woman_woman_medium_skin_tone": "👩🏽‍❤️‍💋‍👩🏽", - "kiss_woman_woman_tone3_tone4": "👩🏽‍❤️‍💋‍👩🏾", - "kiss_woman_woman_medium_skin_tone_medium_dark_skin_tone": "👩🏽‍❤️‍💋‍👩🏾", - "kiss_woman_woman_tone3_tone5": "👩🏽‍❤️‍💋‍👩🏿", - "kiss_woman_woman_medium_skin_tone_dark_skin_tone": "👩🏽‍❤️‍💋‍👩🏿", - "kiss_woman_woman_tone4_tone1": "👩🏾‍❤️‍💋‍👩🏻", - "kiss_woman_woman_medium_dark_skin_tone_light_skin_tone": "👩🏾‍❤️‍💋‍👩🏻", - "kiss_woman_woman_tone4_tone2": "👩🏾‍❤️‍💋‍👩🏼", - "kiss_woman_woman_medium_dark_skin_tone_medium_light_skin_tone": "👩🏾‍❤️‍💋‍👩🏼", - "kiss_woman_woman_tone4_tone3": "👩🏾‍❤️‍💋‍👩🏽", - "kiss_woman_woman_medium_dark_skin_tone_medium_skin_tone": "👩🏾‍❤️‍💋‍👩🏽", - "kiss_woman_woman_tone4": "👩🏾‍❤️‍💋‍👩🏾", - "kiss_woman_woman_medium_dark_skin_tone": "👩🏾‍❤️‍💋‍👩🏾", - "kiss_woman_woman_tone4_tone5": "👩🏾‍❤️‍💋‍👩🏿", - "kiss_woman_woman_medium_dark_skin_tone_dark_skin_tone": "👩🏾‍❤️‍💋‍👩🏿", - "kiss_woman_woman_tone5_tone1": "👩🏿‍❤️‍💋‍👩🏻", - "kiss_woman_woman_dark_skin_tone_light_skin_tone": "👩🏿‍❤️‍💋‍👩🏻", - "kiss_woman_woman_tone5_tone2": "👩🏿‍❤️‍💋‍👩🏼", - "kiss_woman_woman_dark_skin_tone_medium_light_skin_tone": "👩🏿‍❤️‍💋‍👩🏼", - "kiss_woman_woman_tone5_tone3": "👩🏿‍❤️‍💋‍👩🏽", - "kiss_woman_woman_dark_skin_tone_medium_skin_tone": "👩🏿‍❤️‍💋‍👩🏽", - "kiss_woman_woman_tone5_tone4": "👩🏿‍❤️‍💋‍👩🏾", - "kiss_woman_woman_dark_skin_tone_medium_dark_skin_tone": "👩🏿‍❤️‍💋‍👩🏾", - "kiss_woman_woman_tone5": "👩🏿‍❤️‍💋‍👩🏿", - "kiss_woman_woman_dark_skin_tone": "👩🏿‍❤️‍💋‍👩🏿", - "kiss_mm": "👨‍❤️‍💋‍👨", - "couplekiss_mm": "👨‍❤️‍💋‍👨", - "kiss_man_man_tone1": "👨🏻‍❤️‍💋‍👨🏻", - "kiss_man_man_light_skin_tone": "👨🏻‍❤️‍💋‍👨🏻", - "kiss_man_man_tone1_tone2": "👨🏻‍❤️‍💋‍👨🏼", - "kiss_man_man_light_skin_tone_medium_light_skin_tone": "👨🏻‍❤️‍💋‍👨🏼", - "kiss_man_man_tone1_tone3": "👨🏻‍❤️‍💋‍👨🏽", - "kiss_man_man_light_skin_tone_medium_skin_tone": "👨🏻‍❤️‍💋‍👨🏽", - "kiss_man_man_tone1_tone4": "👨🏻‍❤️‍💋‍👨🏾", - "kiss_man_man_light_skin_tone_medium_dark_skin_tone": "👨🏻‍❤️‍💋‍👨🏾", - "kiss_man_man_tone1_tone5": "👨🏻‍❤️‍💋‍👨🏿", - "kiss_man_man_light_skin_tone_dark_skin_tone": "👨🏻‍❤️‍💋‍👨🏿", - "kiss_man_man_tone2_tone1": "👨🏼‍❤️‍💋‍👨🏻", - "kiss_man_man_medium_light_skin_tone_light_skin_tone": "👨🏼‍❤️‍💋‍👨🏻", - "kiss_man_man_tone2": "👨🏼‍❤️‍💋‍👨🏼", - "kiss_man_man_medium_light_skin_tone": "👨🏼‍❤️‍💋‍👨🏼", - "kiss_man_man_tone2_tone3": "👨🏼‍❤️‍💋‍👨🏽", - "kiss_man_man_medium_light_skin_tone_medium_skin_tone": "👨🏼‍❤️‍💋‍👨🏽", - "kiss_man_man_tone2_tone4": "👨🏼‍❤️‍💋‍👨🏾", - "kiss_man_man_medium_light_skin_tone_medium_dark_skin_tone": "👨🏼‍❤️‍💋‍👨🏾", - "kiss_man_man_tone2_tone5": "👨🏼‍❤️‍💋‍👨🏿", - "kiss_man_man_medium_light_skin_tone_dark_skin_tone": "👨🏼‍❤️‍💋‍👨🏿", - "kiss_man_man_tone3_tone1": "👨🏽‍❤️‍💋‍👨🏻", - "kiss_man_man_medium_skin_tone_light_skin_tone": "👨🏽‍❤️‍💋‍👨🏻", - "kiss_man_man_tone3_tone2": "👨🏽‍❤️‍💋‍👨🏼", - "kiss_man_man_medium_skin_tone_medium_light_skin_tone": "👨🏽‍❤️‍💋‍👨🏼", - "kiss_man_man_tone3": "👨🏽‍❤️‍💋‍👨🏽", - "kiss_man_man_medium_skin_tone": "👨🏽‍❤️‍💋‍👨🏽", - "kiss_man_man_tone3_tone4": "👨🏽‍❤️‍💋‍👨🏾", - "kiss_man_man_medium_skin_tone_medium_dark_skin_tone": "👨🏽‍❤️‍💋‍👨🏾", - "kiss_man_man_tone3_tone5": "👨🏽‍❤️‍💋‍👨🏿", - "kiss_man_man_medium_skin_tone_dark_skin_tone": "👨🏽‍❤️‍💋‍👨🏿", - "kiss_man_man_tone4_tone1": "👨🏾‍❤️‍💋‍👨🏻", - "kiss_man_man_medium_dark_skin_tone_light_skin_tone": "👨🏾‍❤️‍💋‍👨🏻", - "kiss_man_man_tone4_tone2": "👨🏾‍❤️‍💋‍👨🏼", - "kiss_man_man_medium_dark_skin_tone_medium_light_skin_tone": "👨🏾‍❤️‍💋‍👨🏼", - "kiss_man_man_tone4_tone3": "👨🏾‍❤️‍💋‍👨🏽", - "kiss_man_man_medium_dark_skin_tone_medium_skin_tone": "👨🏾‍❤️‍💋‍👨🏽", - "kiss_man_man_tone4": "👨🏾‍❤️‍💋‍👨🏾", - "kiss_man_man_medium_dark_skin_tone": "👨🏾‍❤️‍💋‍👨🏾", - "kiss_man_man_tone4_tone5": "👨🏾‍❤️‍💋‍👨🏿", - "kiss_man_man_medium_dark_skin_tone_dark_skin_tone": "👨🏾‍❤️‍💋‍👨🏿", - "kiss_man_man_tone5_tone1": "👨🏿‍❤️‍💋‍👨🏻", - "kiss_man_man_dark_skin_tone_light_skin_tone": "👨🏿‍❤️‍💋‍👨🏻", - "kiss_man_man_tone5_tone2": "👨🏿‍❤️‍💋‍👨🏼", - "kiss_man_man_dark_skin_tone_medium_light_skin_tone": "👨🏿‍❤️‍💋‍👨🏼", - "kiss_man_man_tone5_tone3": "👨🏿‍❤️‍💋‍👨🏽", - "kiss_man_man_dark_skin_tone_medium_skin_tone": "👨🏿‍❤️‍💋‍👨🏽", - "kiss_man_man_tone5_tone4": "👨🏿‍❤️‍💋‍👨🏾", - "kiss_man_man_dark_skin_tone_medium_dark_skin_tone": "👨🏿‍❤️‍💋‍👨🏾", - "kiss_man_man_tone5": "👨🏿‍❤️‍💋‍👨🏿", - "kiss_man_man_dark_skin_tone": "👨🏿‍❤️‍💋‍👨🏿", - "family": "👪", - "family_man_woman_boy": "👨‍👩‍👦", - "family_mwg": "👨‍👩‍👧", - "family_mwgb": "👨‍👩‍👧‍👦", - "family_mwbb": "👨‍👩‍👦‍👦", - "family_mwgg": "👨‍👩‍👧‍👧", - "family_wwb": "👩‍👩‍👦", - "family_wwg": "👩‍👩‍👧", - "family_wwgb": "👩‍👩‍👧‍👦", - "family_wwbb": "👩‍👩‍👦‍👦", - "family_wwgg": "👩‍👩‍👧‍👧", - "family_mmb": "👨‍👨‍👦", - "family_mmg": "👨‍👨‍👧", - "family_mmgb": "👨‍👨‍👧‍👦", - "family_mmbb": "👨‍👨‍👦‍👦", - "family_mmgg": "👨‍👨‍👧‍👧", - "family_woman_boy": "👩‍👦", - "family_woman_girl": "👩‍👧", - "family_woman_girl_boy": "👩‍👧‍👦", - "family_woman_boy_boy": "👩‍👦‍👦", - "family_woman_girl_girl": "👩‍👧‍👧", - "family_man_boy": "👨‍👦", - "family_man_girl": "👨‍👧", - "family_man_girl_boy": "👨‍👧‍👦", - "family_man_boy_boy": "👨‍👦‍👦", - "family_man_girl_girl": "👨‍👧‍👧", - "yarn": "🧶", - "thread": "🧵", - "coat": "🧥", - "lab_coat": "🥼", - "safety_vest": "🦺", - "womans_clothes": "👚", - "shirt": "👕", - "jeans": "👖", - "briefs": "🩲", - "shorts": "🩳", - "necktie": "👔", - "dress": "👗", - "bikini": "👙", - "one_piece_swimsuit": "🩱", - "kimono": "👘", - "sari": "🥻", - "womans_flat_shoe": "🥿", - "high_heel": "👠", - "sandal": "👡", - "boot": "👢", - "mans_shoe": "👞", - "athletic_shoe": "👟", - "hiking_boot": "🥾", - "thong_sandal": "🩴", - "socks": "🧦", - "gloves": "🧤", - "scarf": "🧣", - "tophat": "🎩", - "billed_cap": "🧢", - "womans_hat": "👒", - "mortar_board": "🎓", - "helmet_with_cross": "⛑️", - "helmet_with_white_cross": "⛑️", - "military_helmet": "🪖", - "crown": "👑", - "ring": "💍", - "pouch": "👝", - "purse": "👛", - "handbag": "👜", - "briefcase": "💼", - "school_satchel": "🎒", - "luggage": "🧳", - "eyeglasses": "👓", - "dark_sunglasses": "🕶️", - "goggles": "🥽", - "closed_umbrella": "🌂" - }, - "nature": { - "dog": "🐶", - "cat": "🐱", - "mouse": "🐭", - "hamster": "🐹", - "rabbit": "🐰", - "fox": "🦊", - "fox_face": "🦊", - "bear": "🐻", - "panda_face": "🐼", - "polar_bear": "🐻‍❄️", - "koala": "🐨", - "tiger": "🐯", - "lion_face": "🦁", - "lion": "🦁", - "cow": "🐮", - "pig": "🐷", - "pig_nose": "🐽", - "frog": "🐸", - "monkey_face": "🐵", - "see_no_evil": "🙈", - "hear_no_evil": "🙉", - "speak_no_evil": "🙊", - "monkey": "🐒", - "chicken": "🐔", - "penguin": "🐧", - "bird": "🐦", - "baby_chick": "🐤", - "hatching_chick": "🐣", - "hatched_chick": "🐥", - "duck": "🦆", - "dodo": "🦤", - "eagle": "🦅", - "owl": "🦉", - "bat": "🦇", - "wolf": "🐺", - "boar": "🐗", - "horse": "🐴", - "unicorn": "🦄", - "unicorn_face": "🦄", - "bee": "🐝", - "bug": "🐛", - "butterfly": "🦋", - "snail": "🐌", - "worm": "🪱", - "lady_beetle": "🐞", - "ant": "🐜", - "fly": "🪰", - "mosquito": "🦟", - "cockroach": "🪳", - "beetle": "🪲", - "cricket": "🦗", - "spider": "🕷️", - "spider_web": "🕸️", - "scorpion": "🦂", - "turtle": "🐢", - "snake": "🐍", - "lizard": "🦎", - "t_rex": "🦖", - "sauropod": "🦕", - "octopus": "🐙", - "squid": "🦑", - "shrimp": "🦐", - "lobster": "🦞", - "crab": "🦀", - "blowfish": "🐡", - "tropical_fish": "🐠", - "fish": "🐟", - "seal": "🦭", - "dolphin": "🐬", - "whale": "🐳", - "whale2": "🐋", - "shark": "🦈", - "crocodile": "🐊", - "tiger2": "🐅", - "leopard": "🐆", - "zebra": "🦓", - "gorilla": "🦍", - "orangutan": "🦧", - "elephant": "🐘", - "mammoth": "🦣", - "bison": "🦬", - "hippopotamus": "🦛", - "rhino": "🦏", - "rhinoceros": "🦏", - "dromedary_camel": "🐪", - "camel": "🐫", - "giraffe": "🦒", - "kangaroo": "🦘", - "water_buffalo": "🐃", - "ox": "🐂", - "cow2": "🐄", - "racehorse": "🐎", - "pig2": "🐖", - "ram": "🐏", - "sheep": "🐑", - "llama": "🦙", - "goat": "🐐", - "deer": "🦌", - "dog2": "🐕", - "poodle": "🐩", - "guide_dog": "🦮", - "service_dog": "🐕‍🦺", - "cat2": "🐈", - "black_cat": "🐈‍⬛", - "rooster": "🐓", - "turkey": "🦃", - "peacock": "🦚", - "parrot": "🦜", - "swan": "🦢", - "flamingo": "🦩", - "dove": "🕊️", - "dove_of_peace": "🕊️", - "rabbit2": "🐇", - "raccoon": "🦝", - "skunk": "🦨", - "badger": "🦡", - "beaver": "🦫", - "otter": "🦦", - "sloth": "🦥", - "mouse2": "🐁", - "rat": "🐀", - "chipmunk": "🐿️", - "hedgehog": "🦔", - "feet": "🐾", - "paw_prints": "🐾", - "dragon": "🐉", - "dragon_face": "🐲", - "cactus": "🌵", - "christmas_tree": "🎄", - "evergreen_tree": "🌲", - "deciduous_tree": "🌳", - "palm_tree": "🌴", - "seedling": "🌱", - "herb": "🌿", - "shamrock": "☘️", - "four_leaf_clover": "🍀", - "bamboo": "🎍", - "tanabata_tree": "🎋", - "leaves": "🍃", - "fallen_leaf": "🍂", - "maple_leaf": "🍁", - "feather": "🪶", - "mushroom": "🍄", - "shell": "🐚", - "rock": "🪨", - "wood": "🪵", - "ear_of_rice": "🌾", - "potted_plant": "🪴", - "bouquet": "💐", - "tulip": "🌷", - "rose": "🌹", - "wilted_rose": "🥀", - "wilted_flower": "🥀", - "hibiscus": "🌺", - "cherry_blossom": "🌸", - "blossom": "🌼", - "sunflower": "🌻", - "sun_with_face": "🌞", - "full_moon_with_face": "🌝", - "first_quarter_moon_with_face": "🌛", - "last_quarter_moon_with_face": "🌜", - "new_moon_with_face": "🌚", - "full_moon": "🌕", - "waning_gibbous_moon": "🌖", - "last_quarter_moon": "🌗", - "waning_crescent_moon": "🌘", - "new_moon": "🌑", - "waxing_crescent_moon": "🌒", - "first_quarter_moon": "🌓", - "waxing_gibbous_moon": "🌔", - "crescent_moon": "🌙", - "earth_americas": "🌎", - "earth_africa": "🌍", - "earth_asia": "🌏", - "ringed_planet": "🪐", - "dizzy": "💫", - "star": "⭐", - "star2": "🌟", - "sparkles": "✨", - "zap": "⚡", - "comet": "☄️", - "boom": "💥", - "fire": "🔥", - "flame": "🔥", - "cloud_tornado": "🌪️", - "cloud_with_tornado": "🌪️", - "rainbow": "🌈", - "sunny": "☀️", - "white_sun_small_cloud": "🌤️", - "white_sun_with_small_cloud": "🌤️", - "partly_sunny": "⛅", - "white_sun_cloud": "🌥️", - "white_sun_behind_cloud": "🌥️", - "cloud": "☁️", - "white_sun_rain_cloud": "🌦️", - "white_sun_behind_cloud_with_rain": "🌦️", - "cloud_rain": "🌧️", - "cloud_with_rain": "🌧️", - "thunder_cloud_rain": "⛈️", - "thunder_cloud_and_rain": "⛈️", - "cloud_lightning": "🌩️", - "cloud_with_lightning": "🌩️", - "cloud_snow": "🌨️", - "cloud_with_snow": "🌨️", - "snowflake": "❄️", - "snowman2": "☃️", - "snowman": "⛄", - "wind_blowing_face": "🌬️", - "dash": "💨", - "droplet": "💧", - "sweat_drops": "💦", - "umbrella": "☔", - "umbrella2": "☂️", - "ocean": "🌊", - "fog": "🌫️" - }, - "food": { - "green_apple": "🍏", - "apple": "🍎", - "pear": "🍐", - "tangerine": "🍊", - "lemon": "🍋", - "banana": "🍌", - "watermelon": "🍉", - "grapes": "🍇", - "blueberries": "🫐", - "strawberry": "🍓", - "melon": "🍈", - "cherries": "🍒", - "peach": "🍑", - "mango": "🥭", - "pineapple": "🍍", - "coconut": "🥥", - "kiwi": "🥝", - "kiwifruit": "🥝", - "tomato": "🍅", - "eggplant": "🍆", - "avocado": "🥑", - "olive": "🫒", - "broccoli": "🥦", - "leafy_green": "🥬", - "bell_pepper": "🫑", - "cucumber": "🥒", - "hot_pepper": "🌶️", - "corn": "🌽", - "carrot": "🥕", - "garlic": "🧄", - "onion": "🧅", - "potato": "🥔", - "sweet_potato": "🍠", - "croissant": "🥐", - "bagel": "🥯", - "bread": "🍞", - "french_bread": "🥖", - "baguette_bread": "🥖", - "flatbread": "🫓", - "pretzel": "🥨", - "cheese": "🧀", - "cheese_wedge": "🧀", - "egg": "🥚", - "cooking": "🍳", - "butter": "🧈", - "pancakes": "🥞", - "waffle": "🧇", - "bacon": "🥓", - "cut_of_meat": "🥩", - "poultry_leg": "🍗", - "meat_on_bone": "🍖", - "hotdog": "🌭", - "hot_dog": "🌭", - "hamburger": "🍔", - "fries": "🍟", - "pizza": "🍕", - "sandwich": "🥪", - "stuffed_flatbread": "🥙", - "stuffed_pita": "🥙", - "falafel": "🧆", - "taco": "🌮", - "burrito": "🌯", - "tamale": "🫔", - "salad": "🥗", - "green_salad": "🥗", - "shallow_pan_of_food": "🥘", - "paella": "🥘", - "fondue": "🫕", - "canned_food": "🥫", - "spaghetti": "🍝", - "ramen": "🍜", - "stew": "🍲", - "curry": "🍛", - "sushi": "🍣", - "bento": "🍱", - "dumpling": "🥟", - "oyster": "🦪", - "fried_shrimp": "🍤", - "rice_ball": "🍙", - "rice": "🍚", - "rice_cracker": "🍘", - "fish_cake": "🍥", - "fortune_cookie": "🥠", - "moon_cake": "🥮", - "oden": "🍢", - "dango": "🍡", - "shaved_ice": "🍧", - "ice_cream": "🍨", - "icecream": "🍦", - "pie": "🥧", - "cupcake": "🧁", - "cake": "🍰", - "birthday": "🎂", - "custard": "🍮", - "pudding": "🍮", - "flan": "🍮", - "lollipop": "🍭", - "candy": "🍬", - "chocolate_bar": "🍫", - "popcorn": "🍿", - "doughnut": "🍩", - "cookie": "🍪", - "chestnut": "🌰", - "peanuts": "🥜", - "shelled_peanut": "🥜", - "honey_pot": "🍯", - "milk": "🥛", - "glass_of_milk": "🥛", - "baby_bottle": "🍼", - "coffee": "☕", - "tea": "🍵", - "teapot": "🫖", - "mate": "🧉", - "bubble_tea": "🧋", - "beverage_box": "🧃", - "cup_with_straw": "🥤", - "sake": "🍶", - "beer": "🍺", - "beers": "🍻", - "champagne_glass": "🥂", - "clinking_glass": "🥂", - "wine_glass": "🍷", - "tumbler_glass": "🥃", - "whisky": "🥃", - "cocktail": "🍸", - "tropical_drink": "🍹", - "champagne": "🍾", - "bottle_with_popping_cork": "🍾", - "ice_cube": "🧊", - "spoon": "🥄", - "fork_and_knife": "🍴", - "fork_knife_plate": "🍽️", - "fork_and_knife_with_plate": "🍽️", - "bowl_with_spoon": "🥣", - "takeout_box": "🥡", - "chopsticks": "🥢", - "salt": "🧂" - }, - "activity": { - "soccer": "⚽", - "basketball": "🏀", - "football": "🏈", - "baseball": "⚾", - "softball": "🥎", - "tennis": "🎾", - "volleyball": "🏐", - "rugby_football": "🏉", - "flying_disc": "🥏", - "boomerang": "🪃", - "8ball": "🎱", - "yo_yo": "🪀", - "ping_pong": "🏓", - "table_tennis": "🏓", - "badminton": "🏸", - "hockey": "🏒", - "field_hockey": "🏑", - "lacrosse": "🥍", - "cricket_game": "🏏", - "cricket_bat_ball": "🏏", - "goal": "🥅", - "goal_net": "🥅", - "golf": "⛳", - "kite": "🪁", - "bow_and_arrow": "🏹", - "archery": "🏹", - "fishing_pole_and_fish": "🎣", - "diving_mask": "🤿", - "boxing_glove": "🥊", - "boxing_gloves": "🥊", - "martial_arts_uniform": "🥋", - "karate_uniform": "🥋", - "running_shirt_with_sash": "🎽", - "skateboard": "🛹", - "roller_skate": "🛼", - "sled": "🛷", - "ice_skate": "⛸️", - "curling_stone": "🥌", - "ski": "🎿", - "skier": "⛷️", - "snowboarder": "🏂", - "snowboarder_tone1": "🏂🏻", - "snowboarder_light_skin_tone": "🏂🏻", - "snowboarder_tone2": "🏂🏼", - "snowboarder_medium_light_skin_tone": "🏂🏼", - "snowboarder_tone3": "🏂🏽", - "snowboarder_medium_skin_tone": "🏂🏽", - "snowboarder_tone4": "🏂🏾", - "snowboarder_medium_dark_skin_tone": "🏂🏾", - "snowboarder_tone5": "🏂🏿", - "snowboarder_dark_skin_tone": "🏂🏿", - "parachute": "🪂", - "person_lifting_weights": "🏋️", - "lifter": "🏋️", - "weight_lifter": "🏋️", - "person_lifting_weights_tone1": "🏋🏻", - "lifter_tone1": "🏋🏻", - "weight_lifter_tone1": "🏋🏻", - "person_lifting_weights_tone2": "🏋🏼", - "lifter_tone2": "🏋🏼", - "weight_lifter_tone2": "🏋🏼", - "person_lifting_weights_tone3": "🏋🏽", - "lifter_tone3": "🏋🏽", - "weight_lifter_tone3": "🏋🏽", - "person_lifting_weights_tone4": "🏋🏾", - "lifter_tone4": "🏋🏾", - "weight_lifter_tone4": "🏋🏾", - "person_lifting_weights_tone5": "🏋🏿", - "lifter_tone5": "🏋🏿", - "weight_lifter_tone5": "🏋🏿", - "woman_lifting_weights": "🏋️‍♀️", - "woman_lifting_weights_tone1": "🏋🏻‍♀️", - "woman_lifting_weights_light_skin_tone": "🏋🏻‍♀️", - "woman_lifting_weights_tone2": "🏋🏼‍♀️", - "woman_lifting_weights_medium_light_skin_tone": "🏋🏼‍♀️", - "woman_lifting_weights_tone3": "🏋🏽‍♀️", - "woman_lifting_weights_medium_skin_tone": "🏋🏽‍♀️", - "woman_lifting_weights_tone4": "🏋🏾‍♀️", - "woman_lifting_weights_medium_dark_skin_tone": "🏋🏾‍♀️", - "woman_lifting_weights_tone5": "🏋🏿‍♀️", - "woman_lifting_weights_dark_skin_tone": "🏋🏿‍♀️", - "man_lifting_weights": "🏋️‍♂️", - "man_lifting_weights_tone1": "🏋🏻‍♂️", - "man_lifting_weights_light_skin_tone": "🏋🏻‍♂️", - "man_lifting_weights_tone2": "🏋🏼‍♂️", - "man_lifting_weights_medium_light_skin_tone": "🏋🏼‍♂️", - "man_lifting_weights_tone3": "🏋🏽‍♂️", - "man_lifting_weights_medium_skin_tone": "🏋🏽‍♂️", - "man_lifting_weights_tone4": "🏋🏾‍♂️", - "man_lifting_weights_medium_dark_skin_tone": "🏋🏾‍♂️", - "man_lifting_weights_tone5": "🏋🏿‍♂️", - "man_lifting_weights_dark_skin_tone": "🏋🏿‍♂️", - "people_wrestling": "🤼", - "wrestlers": "🤼", - "wrestling": "🤼", - "women_wrestling": "🤼‍♀️", - "men_wrestling": "🤼‍♂️", - "person_doing_cartwheel": "🤸", - "cartwheel": "🤸", - "person_doing_cartwheel_tone1": "🤸🏻", - "cartwheel_tone1": "🤸🏻", - "person_doing_cartwheel_tone2": "🤸🏼", - "cartwheel_tone2": "🤸🏼", - "person_doing_cartwheel_tone3": "🤸🏽", - "cartwheel_tone3": "🤸🏽", - "person_doing_cartwheel_tone4": "🤸🏾", - "cartwheel_tone4": "🤸🏾", - "person_doing_cartwheel_tone5": "🤸🏿", - "cartwheel_tone5": "🤸🏿", - "woman_cartwheeling": "🤸‍♀️", - "woman_cartwheeling_tone1": "🤸🏻‍♀️", - "woman_cartwheeling_light_skin_tone": "🤸🏻‍♀️", - "woman_cartwheeling_tone2": "🤸🏼‍♀️", - "woman_cartwheeling_medium_light_skin_tone": "🤸🏼‍♀️", - "woman_cartwheeling_tone3": "🤸🏽‍♀️", - "woman_cartwheeling_medium_skin_tone": "🤸🏽‍♀️", - "woman_cartwheeling_tone4": "🤸🏾‍♀️", - "woman_cartwheeling_medium_dark_skin_tone": "🤸🏾‍♀️", - "woman_cartwheeling_tone5": "🤸🏿‍♀️", - "woman_cartwheeling_dark_skin_tone": "🤸🏿‍♀️", - "man_cartwheeling": "🤸‍♂️", - "man_cartwheeling_tone1": "🤸🏻‍♂️", - "man_cartwheeling_light_skin_tone": "🤸🏻‍♂️", - "man_cartwheeling_tone2": "🤸🏼‍♂️", - "man_cartwheeling_medium_light_skin_tone": "🤸🏼‍♂️", - "man_cartwheeling_tone3": "🤸🏽‍♂️", - "man_cartwheeling_medium_skin_tone": "🤸🏽‍♂️", - "man_cartwheeling_tone4": "🤸🏾‍♂️", - "man_cartwheeling_medium_dark_skin_tone": "🤸🏾‍♂️", - "man_cartwheeling_tone5": "🤸🏿‍♂️", - "man_cartwheeling_dark_skin_tone": "🤸🏿‍♂️", - "person_bouncing_ball": "⛹️", - "basketball_player": "⛹️", - "person_with_ball": "⛹️", - "person_bouncing_ball_tone1": "⛹🏻", - "basketball_player_tone1": "⛹🏻", - "person_with_ball_tone1": "⛹🏻", - "person_bouncing_ball_tone2": "⛹🏼", - "basketball_player_tone2": "⛹🏼", - "person_with_ball_tone2": "⛹🏼", - "person_bouncing_ball_tone3": "⛹🏽", - "basketball_player_tone3": "⛹🏽", - "person_with_ball_tone3": "⛹🏽", - "person_bouncing_ball_tone4": "⛹🏾", - "basketball_player_tone4": "⛹🏾", - "person_with_ball_tone4": "⛹🏾", - "person_bouncing_ball_tone5": "⛹🏿", - "basketball_player_tone5": "⛹🏿", - "person_with_ball_tone5": "⛹🏿", - "woman_bouncing_ball": "⛹️‍♀️", - "woman_bouncing_ball_tone1": "⛹🏻‍♀️", - "woman_bouncing_ball_light_skin_tone": "⛹🏻‍♀️", - "woman_bouncing_ball_tone2": "⛹🏼‍♀️", - "woman_bouncing_ball_medium_light_skin_tone": "⛹🏼‍♀️", - "woman_bouncing_ball_tone3": "⛹🏽‍♀️", - "woman_bouncing_ball_medium_skin_tone": "⛹🏽‍♀️", - "woman_bouncing_ball_tone4": "⛹🏾‍♀️", - "woman_bouncing_ball_medium_dark_skin_tone": "⛹🏾‍♀️", - "woman_bouncing_ball_tone5": "⛹🏿‍♀️", - "woman_bouncing_ball_dark_skin_tone": "⛹🏿‍♀️", - "man_bouncing_ball": "⛹️‍♂️", - "man_bouncing_ball_tone1": "⛹🏻‍♂️", - "man_bouncing_ball_light_skin_tone": "⛹🏻‍♂️", - "man_bouncing_ball_tone2": "⛹🏼‍♂️", - "man_bouncing_ball_medium_light_skin_tone": "⛹🏼‍♂️", - "man_bouncing_ball_tone3": "⛹🏽‍♂️", - "man_bouncing_ball_medium_skin_tone": "⛹🏽‍♂️", - "man_bouncing_ball_tone4": "⛹🏾‍♂️", - "man_bouncing_ball_medium_dark_skin_tone": "⛹🏾‍♂️", - "man_bouncing_ball_tone5": "⛹🏿‍♂️", - "man_bouncing_ball_dark_skin_tone": "⛹🏿‍♂️", - "person_fencing": "🤺", - "fencer": "🤺", - "fencing": "🤺", - "person_playing_handball": "🤾", - "handball": "🤾", - "person_playing_handball_tone1": "🤾🏻", - "handball_tone1": "🤾🏻", - "person_playing_handball_tone2": "🤾🏼", - "handball_tone2": "🤾🏼", - "person_playing_handball_tone3": "🤾🏽", - "handball_tone3": "🤾🏽", - "person_playing_handball_tone4": "🤾🏾", - "handball_tone4": "🤾🏾", - "person_playing_handball_tone5": "🤾🏿", - "handball_tone5": "🤾🏿", - "woman_playing_handball": "🤾‍♀️", - "woman_playing_handball_tone1": "🤾🏻‍♀️", - "woman_playing_handball_light_skin_tone": "🤾🏻‍♀️", - "woman_playing_handball_tone2": "🤾🏼‍♀️", - "woman_playing_handball_medium_light_skin_tone": "🤾🏼‍♀️", - "woman_playing_handball_tone3": "🤾🏽‍♀️", - "woman_playing_handball_medium_skin_tone": "🤾🏽‍♀️", - "woman_playing_handball_tone4": "🤾🏾‍♀️", - "woman_playing_handball_medium_dark_skin_tone": "🤾🏾‍♀️", - "woman_playing_handball_tone5": "🤾🏿‍♀️", - "woman_playing_handball_dark_skin_tone": "🤾🏿‍♀️", - "man_playing_handball": "🤾‍♂️", - "man_playing_handball_tone1": "🤾🏻‍♂️", - "man_playing_handball_light_skin_tone": "🤾🏻‍♂️", - "man_playing_handball_tone2": "🤾🏼‍♂️", - "man_playing_handball_medium_light_skin_tone": "🤾🏼‍♂️", - "man_playing_handball_tone3": "🤾🏽‍♂️", - "man_playing_handball_medium_skin_tone": "🤾🏽‍♂️", - "man_playing_handball_tone4": "🤾🏾‍♂️", - "man_playing_handball_medium_dark_skin_tone": "🤾🏾‍♂️", - "man_playing_handball_tone5": "🤾🏿‍♂️", - "man_playing_handball_dark_skin_tone": "🤾🏿‍♂️", - "person_golfing": "🏌️", - "golfer": "🏌️", - "person_golfing_tone1": "🏌🏻", - "person_golfing_light_skin_tone": "🏌🏻", - "person_golfing_tone2": "🏌🏼", - "person_golfing_medium_light_skin_tone": "🏌🏼", - "person_golfing_tone3": "🏌🏽", - "person_golfing_medium_skin_tone": "🏌🏽", - "person_golfing_tone4": "🏌🏾", - "person_golfing_medium_dark_skin_tone": "🏌🏾", - "person_golfing_tone5": "🏌🏿", - "person_golfing_dark_skin_tone": "🏌🏿", - "woman_golfing": "🏌️‍♀️", - "woman_golfing_tone1": "🏌🏻‍♀️", - "woman_golfing_light_skin_tone": "🏌🏻‍♀️", - "woman_golfing_tone2": "🏌🏼‍♀️", - "woman_golfing_medium_light_skin_tone": "🏌🏼‍♀️", - "woman_golfing_tone3": "🏌🏽‍♀️", - "woman_golfing_medium_skin_tone": "🏌🏽‍♀️", - "woman_golfing_tone4": "🏌🏾‍♀️", - "woman_golfing_medium_dark_skin_tone": "🏌🏾‍♀️", - "woman_golfing_tone5": "🏌🏿‍♀️", - "woman_golfing_dark_skin_tone": "🏌🏿‍♀️", - "man_golfing": "🏌️‍♂️", - "man_golfing_tone1": "🏌🏻‍♂️", - "man_golfing_light_skin_tone": "🏌🏻‍♂️", - "man_golfing_tone2": "🏌🏼‍♂️", - "man_golfing_medium_light_skin_tone": "🏌🏼‍♂️", - "man_golfing_tone3": "🏌🏽‍♂️", - "man_golfing_medium_skin_tone": "🏌🏽‍♂️", - "man_golfing_tone4": "🏌🏾‍♂️", - "man_golfing_medium_dark_skin_tone": "🏌🏾‍♂️", - "man_golfing_tone5": "🏌🏿‍♂️", - "man_golfing_dark_skin_tone": "🏌🏿‍♂️", - "horse_racing": "🏇", - "horse_racing_tone1": "🏇🏻", - "horse_racing_tone2": "🏇🏼", - "horse_racing_tone3": "🏇🏽", - "horse_racing_tone4": "🏇🏾", - "horse_racing_tone5": "🏇🏿", - "person_in_lotus_position": "🧘", - "person_in_lotus_position_tone1": "🧘🏻", - "person_in_lotus_position_light_skin_tone": "🧘🏻", - "person_in_lotus_position_tone2": "🧘🏼", - "person_in_lotus_position_medium_light_skin_tone": "🧘🏼", - "person_in_lotus_position_tone3": "🧘🏽", - "person_in_lotus_position_medium_skin_tone": "🧘🏽", - "person_in_lotus_position_tone4": "🧘🏾", - "person_in_lotus_position_medium_dark_skin_tone": "🧘🏾", - "person_in_lotus_position_tone5": "🧘🏿", - "person_in_lotus_position_dark_skin_tone": "🧘🏿", - "woman_in_lotus_position": "🧘‍♀️", - "woman_in_lotus_position_tone1": "🧘🏻‍♀️", - "woman_in_lotus_position_light_skin_tone": "🧘🏻‍♀️", - "woman_in_lotus_position_tone2": "🧘🏼‍♀️", - "woman_in_lotus_position_medium_light_skin_tone": "🧘🏼‍♀️", - "woman_in_lotus_position_tone3": "🧘🏽‍♀️", - "woman_in_lotus_position_medium_skin_tone": "🧘🏽‍♀️", - "woman_in_lotus_position_tone4": "🧘🏾‍♀️", - "woman_in_lotus_position_medium_dark_skin_tone": "🧘🏾‍♀️", - "woman_in_lotus_position_tone5": "🧘🏿‍♀️", - "woman_in_lotus_position_dark_skin_tone": "🧘🏿‍♀️", - "man_in_lotus_position": "🧘‍♂️", - "man_in_lotus_position_tone1": "🧘🏻‍♂️", - "man_in_lotus_position_light_skin_tone": "🧘🏻‍♂️", - "man_in_lotus_position_tone2": "🧘🏼‍♂️", - "man_in_lotus_position_medium_light_skin_tone": "🧘🏼‍♂️", - "man_in_lotus_position_tone3": "🧘🏽‍♂️", - "man_in_lotus_position_medium_skin_tone": "🧘🏽‍♂️", - "man_in_lotus_position_tone4": "🧘🏾‍♂️", - "man_in_lotus_position_medium_dark_skin_tone": "🧘🏾‍♂️", - "man_in_lotus_position_tone5": "🧘🏿‍♂️", - "man_in_lotus_position_dark_skin_tone": "🧘🏿‍♂️", - "person_surfing": "🏄", - "surfer": "🏄", - "person_surfing_tone1": "🏄🏻", - "surfer_tone1": "🏄🏻", - "person_surfing_tone2": "🏄🏼", - "surfer_tone2": "🏄🏼", - "person_surfing_tone3": "🏄🏽", - "surfer_tone3": "🏄🏽", - "person_surfing_tone4": "🏄🏾", - "surfer_tone4": "🏄🏾", - "person_surfing_tone5": "🏄🏿", - "surfer_tone5": "🏄🏿", - "woman_surfing": "🏄‍♀️", - "woman_surfing_tone1": "🏄🏻‍♀️", - "woman_surfing_light_skin_tone": "🏄🏻‍♀️", - "woman_surfing_tone2": "🏄🏼‍♀️", - "woman_surfing_medium_light_skin_tone": "🏄🏼‍♀️", - "woman_surfing_tone3": "🏄🏽‍♀️", - "woman_surfing_medium_skin_tone": "🏄🏽‍♀️", - "woman_surfing_tone4": "🏄🏾‍♀️", - "woman_surfing_medium_dark_skin_tone": "🏄🏾‍♀️", - "woman_surfing_tone5": "🏄🏿‍♀️", - "woman_surfing_dark_skin_tone": "🏄🏿‍♀️", - "man_surfing": "🏄‍♂️", - "man_surfing_tone1": "🏄🏻‍♂️", - "man_surfing_light_skin_tone": "🏄🏻‍♂️", - "man_surfing_tone2": "🏄🏼‍♂️", - "man_surfing_medium_light_skin_tone": "🏄🏼‍♂️", - "man_surfing_tone3": "🏄🏽‍♂️", - "man_surfing_medium_skin_tone": "🏄🏽‍♂️", - "man_surfing_tone4": "🏄🏾‍♂️", - "man_surfing_medium_dark_skin_tone": "🏄🏾‍♂️", - "man_surfing_tone5": "🏄🏿‍♂️", - "man_surfing_dark_skin_tone": "🏄🏿‍♂️", - "person_swimming": "🏊", - "swimmer": "🏊", - "person_swimming_tone1": "🏊🏻", - "swimmer_tone1": "🏊🏻", - "person_swimming_tone2": "🏊🏼", - "swimmer_tone2": "🏊🏼", - "person_swimming_tone3": "🏊🏽", - "swimmer_tone3": "🏊🏽", - "person_swimming_tone4": "🏊🏾", - "swimmer_tone4": "🏊🏾", - "person_swimming_tone5": "🏊🏿", - "swimmer_tone5": "🏊🏿", - "woman_swimming": "🏊‍♀️", - "woman_swimming_tone1": "🏊🏻‍♀️", - "woman_swimming_light_skin_tone": "🏊🏻‍♀️", - "woman_swimming_tone2": "🏊🏼‍♀️", - "woman_swimming_medium_light_skin_tone": "🏊🏼‍♀️", - "woman_swimming_tone3": "🏊🏽‍♀️", - "woman_swimming_medium_skin_tone": "🏊🏽‍♀️", - "woman_swimming_tone4": "🏊🏾‍♀️", - "woman_swimming_medium_dark_skin_tone": "🏊🏾‍♀️", - "woman_swimming_tone5": "🏊🏿‍♀️", - "woman_swimming_dark_skin_tone": "🏊🏿‍♀️", - "man_swimming": "🏊‍♂️", - "man_swimming_tone1": "🏊🏻‍♂️", - "man_swimming_light_skin_tone": "🏊🏻‍♂️", - "man_swimming_tone2": "🏊🏼‍♂️", - "man_swimming_medium_light_skin_tone": "🏊🏼‍♂️", - "man_swimming_tone3": "🏊🏽‍♂️", - "man_swimming_medium_skin_tone": "🏊🏽‍♂️", - "man_swimming_tone4": "🏊🏾‍♂️", - "man_swimming_medium_dark_skin_tone": "🏊🏾‍♂️", - "man_swimming_tone5": "🏊🏿‍♂️", - "man_swimming_dark_skin_tone": "🏊🏿‍♂️", - "person_playing_water_polo": "🤽", - "water_polo": "🤽", - "person_playing_water_polo_tone1": "🤽🏻", - "water_polo_tone1": "🤽🏻", - "person_playing_water_polo_tone2": "🤽🏼", - "water_polo_tone2": "🤽🏼", - "person_playing_water_polo_tone3": "🤽🏽", - "water_polo_tone3": "🤽🏽", - "person_playing_water_polo_tone4": "🤽🏾", - "water_polo_tone4": "🤽🏾", - "person_playing_water_polo_tone5": "🤽🏿", - "water_polo_tone5": "🤽🏿", - "woman_playing_water_polo": "🤽‍♀️", - "woman_playing_water_polo_tone1": "🤽🏻‍♀️", - "woman_playing_water_polo_light_skin_tone": "🤽🏻‍♀️", - "woman_playing_water_polo_tone2": "🤽🏼‍♀️", - "woman_playing_water_polo_medium_light_skin_tone": "🤽🏼‍♀️", - "woman_playing_water_polo_tone3": "🤽🏽‍♀️", - "woman_playing_water_polo_medium_skin_tone": "🤽🏽‍♀️", - "woman_playing_water_polo_tone4": "🤽🏾‍♀️", - "woman_playing_water_polo_medium_dark_skin_tone": "🤽🏾‍♀️", - "woman_playing_water_polo_tone5": "🤽🏿‍♀️", - "woman_playing_water_polo_dark_skin_tone": "🤽🏿‍♀️", - "man_playing_water_polo": "🤽‍♂️", - "man_playing_water_polo_tone1": "🤽🏻‍♂️", - "man_playing_water_polo_light_skin_tone": "🤽🏻‍♂️", - "man_playing_water_polo_tone2": "🤽🏼‍♂️", - "man_playing_water_polo_medium_light_skin_tone": "🤽🏼‍♂️", - "man_playing_water_polo_tone3": "🤽🏽‍♂️", - "man_playing_water_polo_medium_skin_tone": "🤽🏽‍♂️", - "man_playing_water_polo_tone4": "🤽🏾‍♂️", - "man_playing_water_polo_medium_dark_skin_tone": "🤽🏾‍♂️", - "man_playing_water_polo_tone5": "🤽🏿‍♂️", - "man_playing_water_polo_dark_skin_tone": "🤽🏿‍♂️", - "person_rowing_boat": "🚣", - "rowboat": "🚣", - "person_rowing_boat_tone1": "🚣🏻", - "rowboat_tone1": "🚣🏻", - "person_rowing_boat_tone2": "🚣🏼", - "rowboat_tone2": "🚣🏼", - "person_rowing_boat_tone3": "🚣🏽", - "rowboat_tone3": "🚣🏽", - "person_rowing_boat_tone4": "🚣🏾", - "rowboat_tone4": "🚣🏾", - "person_rowing_boat_tone5": "🚣🏿", - "rowboat_tone5": "🚣🏿", - "woman_rowing_boat": "🚣‍♀️", - "woman_rowing_boat_tone1": "🚣🏻‍♀️", - "woman_rowing_boat_light_skin_tone": "🚣🏻‍♀️", - "woman_rowing_boat_tone2": "🚣🏼‍♀️", - "woman_rowing_boat_medium_light_skin_tone": "🚣🏼‍♀️", - "woman_rowing_boat_tone3": "🚣🏽‍♀️", - "woman_rowing_boat_medium_skin_tone": "🚣🏽‍♀️", - "woman_rowing_boat_tone4": "🚣🏾‍♀️", - "woman_rowing_boat_medium_dark_skin_tone": "🚣🏾‍♀️", - "woman_rowing_boat_tone5": "🚣🏿‍♀️", - "woman_rowing_boat_dark_skin_tone": "🚣🏿‍♀️", - "man_rowing_boat": "🚣‍♂️", - "man_rowing_boat_tone1": "🚣🏻‍♂️", - "man_rowing_boat_light_skin_tone": "🚣🏻‍♂️", - "man_rowing_boat_tone2": "🚣🏼‍♂️", - "man_rowing_boat_medium_light_skin_tone": "🚣🏼‍♂️", - "man_rowing_boat_tone3": "🚣🏽‍♂️", - "man_rowing_boat_medium_skin_tone": "🚣🏽‍♂️", - "man_rowing_boat_tone4": "🚣🏾‍♂️", - "man_rowing_boat_medium_dark_skin_tone": "🚣🏾‍♂️", - "man_rowing_boat_tone5": "🚣🏿‍♂️", - "man_rowing_boat_dark_skin_tone": "🚣🏿‍♂️", - "person_climbing": "🧗", - "person_climbing_tone1": "🧗🏻", - "person_climbing_light_skin_tone": "🧗🏻", - "person_climbing_tone2": "🧗🏼", - "person_climbing_medium_light_skin_tone": "🧗🏼", - "person_climbing_tone3": "🧗🏽", - "person_climbing_medium_skin_tone": "🧗🏽", - "person_climbing_tone4": "🧗🏾", - "person_climbing_medium_dark_skin_tone": "🧗🏾", - "person_climbing_tone5": "🧗🏿", - "person_climbing_dark_skin_tone": "🧗🏿", - "woman_climbing": "🧗‍♀️", - "woman_climbing_tone1": "🧗🏻‍♀️", - "woman_climbing_light_skin_tone": "🧗🏻‍♀️", - "woman_climbing_tone2": "🧗🏼‍♀️", - "woman_climbing_medium_light_skin_tone": "🧗🏼‍♀️", - "woman_climbing_tone3": "🧗🏽‍♀️", - "woman_climbing_medium_skin_tone": "🧗🏽‍♀️", - "woman_climbing_tone4": "🧗🏾‍♀️", - "woman_climbing_medium_dark_skin_tone": "🧗🏾‍♀️", - "woman_climbing_tone5": "🧗🏿‍♀️", - "woman_climbing_dark_skin_tone": "🧗🏿‍♀️", - "man_climbing": "🧗‍♂️", - "man_climbing_tone1": "🧗🏻‍♂️", - "man_climbing_light_skin_tone": "🧗🏻‍♂️", - "man_climbing_tone2": "🧗🏼‍♂️", - "man_climbing_medium_light_skin_tone": "🧗🏼‍♂️", - "man_climbing_tone3": "🧗🏽‍♂️", - "man_climbing_medium_skin_tone": "🧗🏽‍♂️", - "man_climbing_tone4": "🧗🏾‍♂️", - "man_climbing_medium_dark_skin_tone": "🧗🏾‍♂️", - "man_climbing_tone5": "🧗🏿‍♂️", - "man_climbing_dark_skin_tone": "🧗🏿‍♂️", - "person_mountain_biking": "🚵", - "mountain_bicyclist": "🚵", - "person_mountain_biking_tone1": "🚵🏻", - "mountain_bicyclist_tone1": "🚵🏻", - "person_mountain_biking_tone2": "🚵🏼", - "mountain_bicyclist_tone2": "🚵🏼", - "person_mountain_biking_tone3": "🚵🏽", - "mountain_bicyclist_tone3": "🚵🏽", - "person_mountain_biking_tone4": "🚵🏾", - "mountain_bicyclist_tone4": "🚵🏾", - "person_mountain_biking_tone5": "🚵🏿", - "mountain_bicyclist_tone5": "🚵🏿", - "woman_mountain_biking": "🚵‍♀️", - "woman_mountain_biking_tone1": "🚵🏻‍♀️", - "woman_mountain_biking_light_skin_tone": "🚵🏻‍♀️", - "woman_mountain_biking_tone2": "🚵🏼‍♀️", - "woman_mountain_biking_medium_light_skin_tone": "🚵🏼‍♀️", - "woman_mountain_biking_tone3": "🚵🏽‍♀️", - "woman_mountain_biking_medium_skin_tone": "🚵🏽‍♀️", - "woman_mountain_biking_tone4": "🚵🏾‍♀️", - "woman_mountain_biking_medium_dark_skin_tone": "🚵🏾‍♀️", - "woman_mountain_biking_tone5": "🚵🏿‍♀️", - "woman_mountain_biking_dark_skin_tone": "🚵🏿‍♀️", - "man_mountain_biking": "🚵‍♂️", - "man_mountain_biking_tone1": "🚵🏻‍♂️", - "man_mountain_biking_light_skin_tone": "🚵🏻‍♂️", - "man_mountain_biking_tone2": "🚵🏼‍♂️", - "man_mountain_biking_medium_light_skin_tone": "🚵🏼‍♂️", - "man_mountain_biking_tone3": "🚵🏽‍♂️", - "man_mountain_biking_medium_skin_tone": "🚵🏽‍♂️", - "man_mountain_biking_tone4": "🚵🏾‍♂️", - "man_mountain_biking_medium_dark_skin_tone": "🚵🏾‍♂️", - "man_mountain_biking_tone5": "🚵🏿‍♂️", - "man_mountain_biking_dark_skin_tone": "🚵🏿‍♂️", - "person_biking": "🚴", - "bicyclist": "🚴", - "person_biking_tone1": "🚴🏻", - "bicyclist_tone1": "🚴🏻", - "person_biking_tone2": "🚴🏼", - "bicyclist_tone2": "🚴🏼", - "person_biking_tone3": "🚴🏽", - "bicyclist_tone3": "🚴🏽", - "person_biking_tone4": "🚴🏾", - "bicyclist_tone4": "🚴🏾", - "person_biking_tone5": "🚴🏿", - "bicyclist_tone5": "🚴🏿", - "woman_biking": "🚴‍♀️", - "woman_biking_tone1": "🚴🏻‍♀️", - "woman_biking_light_skin_tone": "🚴🏻‍♀️", - "woman_biking_tone2": "🚴🏼‍♀️", - "woman_biking_medium_light_skin_tone": "🚴🏼‍♀️", - "woman_biking_tone3": "🚴🏽‍♀️", - "woman_biking_medium_skin_tone": "🚴🏽‍♀️", - "woman_biking_tone4": "🚴🏾‍♀️", - "woman_biking_medium_dark_skin_tone": "🚴🏾‍♀️", - "woman_biking_tone5": "🚴🏿‍♀️", - "woman_biking_dark_skin_tone": "🚴🏿‍♀️", - "man_biking": "🚴‍♂️", - "man_biking_tone1": "🚴🏻‍♂️", - "man_biking_light_skin_tone": "🚴🏻‍♂️", - "man_biking_tone2": "🚴🏼‍♂️", - "man_biking_medium_light_skin_tone": "🚴🏼‍♂️", - "man_biking_tone3": "🚴🏽‍♂️", - "man_biking_medium_skin_tone": "🚴🏽‍♂️", - "man_biking_tone4": "🚴🏾‍♂️", - "man_biking_medium_dark_skin_tone": "🚴🏾‍♂️", - "man_biking_tone5": "🚴🏿‍♂️", - "man_biking_dark_skin_tone": "🚴🏿‍♂️", - "trophy": "🏆", - "first_place": "🥇", - "first_place_medal": "🥇", - "second_place": "🥈", - "second_place_medal": "🥈", - "third_place": "🥉", - "third_place_medal": "🥉", - "medal": "🏅", - "sports_medal": "🏅", - "military_medal": "🎖️", - "rosette": "🏵️", - "reminder_ribbon": "🎗️", - "ticket": "🎫", - "tickets": "🎟️", - "admission_tickets": "🎟️", - "circus_tent": "🎪", - "person_juggling": "🤹", - "juggling": "🤹", - "juggler": "🤹", - "person_juggling_tone1": "🤹🏻", - "juggling_tone1": "🤹🏻", - "juggler_tone1": "🤹🏻", - "person_juggling_tone2": "🤹🏼", - "juggling_tone2": "🤹🏼", - "juggler_tone2": "🤹🏼", - "person_juggling_tone3": "🤹🏽", - "juggling_tone3": "🤹🏽", - "juggler_tone3": "🤹🏽", - "person_juggling_tone4": "🤹🏾", - "juggling_tone4": "🤹🏾", - "juggler_tone4": "🤹🏾", - "person_juggling_tone5": "🤹🏿", - "juggling_tone5": "🤹🏿", - "juggler_tone5": "🤹🏿", - "woman_juggling": "🤹‍♀️", - "woman_juggling_tone1": "🤹🏻‍♀️", - "woman_juggling_light_skin_tone": "🤹🏻‍♀️", - "woman_juggling_tone2": "🤹🏼‍♀️", - "woman_juggling_medium_light_skin_tone": "🤹🏼‍♀️", - "woman_juggling_tone3": "🤹🏽‍♀️", - "woman_juggling_medium_skin_tone": "🤹🏽‍♀️", - "woman_juggling_tone4": "🤹🏾‍♀️", - "woman_juggling_medium_dark_skin_tone": "🤹🏾‍♀️", - "woman_juggling_tone5": "🤹🏿‍♀️", - "woman_juggling_dark_skin_tone": "🤹🏿‍♀️", - "man_juggling": "🤹‍♂️", - "man_juggling_tone1": "🤹🏻‍♂️", - "man_juggling_light_skin_tone": "🤹🏻‍♂️", - "man_juggling_tone2": "🤹🏼‍♂️", - "man_juggling_medium_light_skin_tone": "🤹🏼‍♂️", - "man_juggling_tone3": "🤹🏽‍♂️", - "man_juggling_medium_skin_tone": "🤹🏽‍♂️", - "man_juggling_tone4": "🤹🏾‍♂️", - "man_juggling_medium_dark_skin_tone": "🤹🏾‍♂️", - "man_juggling_tone5": "🤹🏿‍♂️", - "man_juggling_dark_skin_tone": "🤹🏿‍♂️", - "performing_arts": "🎭", - "ballet_shoes": "🩰", - "art": "🎨", - "clapper": "🎬", - "microphone": "🎤", - "headphones": "🎧", - "musical_score": "🎼", - "musical_keyboard": "🎹", - "drum": "🥁", - "drum_with_drumsticks": "🥁", - "long_drum": "🪘", - "saxophone": "🎷", - "trumpet": "🎺", - "guitar": "🎸", - "banjo": "🪕", - "violin": "🎻", - "accordion": "🪗", - "game_die": "🎲", - "chess_pawn": "♟️", - "dart": "🎯", - "bowling": "🎳", - "video_game": "🎮", - "slot_machine": "🎰", - "jigsaw": "🧩" - }, - "travel": { - "red_car": "🚗", - "taxi": "🚕", - "blue_car": "🚙", - "pickup_truck": "🛻", - "bus": "🚌", - "trolleybus": "🚎", - "race_car": "🏎️", - "racing_car": "🏎️", - "police_car": "🚓", - "ambulance": "🚑", - "fire_engine": "🚒", - "minibus": "🚐", - "truck": "🚚", - "articulated_lorry": "🚛", - "tractor": "🚜", - "probing_cane": "🦯", - "manual_wheelchair": "🦽", - "motorized_wheelchair": "🦼", - "scooter": "🛴", - "bike": "🚲", - "motor_scooter": "🛵", - "motorbike": "🛵", - "motorcycle": "🏍️", - "racing_motorcycle": "🏍️", - "auto_rickshaw": "🛺", - "rotating_light": "🚨", - "oncoming_police_car": "🚔", - "oncoming_bus": "🚍", - "oncoming_automobile": "🚘", - "oncoming_taxi": "🚖", - "aerial_tramway": "🚡", - "mountain_cableway": "🚠", - "suspension_railway": "🚟", - "railway_car": "🚃", - "train": "🚋", - "mountain_railway": "🚞", - "monorail": "🚝", - "bullettrain_side": "🚄", - "bullettrain_front": "🚅", - "light_rail": "🚈", - "steam_locomotive": "🚂", - "train2": "🚆", - "metro": "🚇", - "tram": "🚊", - "station": "🚉", - "airplane": "✈️", - "airplane_departure": "🛫", - "airplane_arriving": "🛬", - "airplane_small": "🛩️", - "small_airplane": "🛩️", - "seat": "💺", - "satellite_orbital": "🛰️", - "rocket": "🚀", - "flying_saucer": "🛸", - "helicopter": "🚁", - "canoe": "🛶", - "kayak": "🛶", - "sailboat": "⛵", - "speedboat": "🚤", - "motorboat": "🛥️", - "cruise_ship": "🛳️", - "passenger_ship": "🛳️", - "ferry": "⛴️", - "ship": "🚢", - "anchor": "⚓", - "fuelpump": "⛽", - "construction": "🚧", - "vertical_traffic_light": "🚦", - "traffic_light": "🚥", - "busstop": "🚏", - "map": "🗺️", - "world_map": "🗺️", - "moyai": "🗿", - "statue_of_liberty": "🗽", - "tokyo_tower": "🗼", - "european_castle": "🏰", - "japanese_castle": "🏯", - "stadium": "🏟️", - "ferris_wheel": "🎡", - "roller_coaster": "🎢", - "carousel_horse": "🎠", - "fountain": "⛲", - "beach_umbrella": "⛱️", - "umbrella_on_ground": "⛱️", - "beach": "🏖️", - "beach_with_umbrella": "🏖️", - "island": "🏝️", - "desert_island": "🏝️", - "desert": "🏜️", - "volcano": "🌋", - "mountain": "⛰️", - "mountain_snow": "🏔️", - "snow_capped_mountain": "🏔️", - "mount_fuji": "🗻", - "camping": "🏕️", - "tent": "⛺", - "house": "🏠", - "house_with_garden": "🏡", - "homes": "🏘️", - "house_buildings": "🏘️", - "house_abandoned": "🏚️", - "derelict_house_building": "🏚️", - "hut": "🛖", - "construction_site": "🏗️", - "building_construction": "🏗️", - "factory": "🏭", - "office": "🏢", - "department_store": "🏬", - "post_office": "🏣", - "european_post_office": "🏤", - "hospital": "🏥", - "bank": "🏦", - "hotel": "🏨", - "convenience_store": "🏪", - "school": "🏫", - "love_hotel": "🏩", - "wedding": "💒", - "classical_building": "🏛️", - "church": "⛪", - "mosque": "🕌", - "synagogue": "🕍", - "hindu_temple": "🛕", - "kaaba": "🕋", - "shinto_shrine": "⛩️", - "railway_track": "🛤️", - "railroad_track": "🛤️", - "motorway": "🛣️", - "japan": "🗾", - "rice_scene": "🎑", - "park": "🏞️", - "national_park": "🏞️", - "sunrise": "🌅", - "sunrise_over_mountains": "🌄", - "stars": "🌠", - "sparkler": "🎇", - "fireworks": "🎆", - "city_sunset": "🌇", - "city_sunrise": "🌇", - "city_dusk": "🌆", - "cityscape": "🏙️", - "night_with_stars": "🌃", - "milky_way": "🌌", - "bridge_at_night": "🌉", - "foggy": "🌁" - }, - "objects": { - "watch": "⌚", - "mobile_phone": "📱", - "iphone": "📱", - "calling": "📲", - "computer": "💻", - "keyboard": "⌨️", - "desktop": "🖥️", - "desktop_computer": "🖥️", - "printer": "🖨️", - "mouse_three_button": "🖱️", - "three_button_mouse": "🖱️", - "trackball": "🖲️", - "joystick": "🕹️", - "compression": "🗜️", - "minidisc": "💽", - "floppy_disk": "💾", - "cd": "💿", - "dvd": "📀", - "vhs": "📼", - "camera": "📷", - "camera_with_flash": "📸", - "video_camera": "📹", - "movie_camera": "🎥", - "projector": "📽️", - "film_projector": "📽️", - "film_frames": "🎞️", - "telephone_receiver": "📞", - "telephone": "☎️", - "pager": "📟", - "fax": "📠", - "tv": "📺", - "radio": "📻", - "microphone2": "🎙️", - "studio_microphone": "🎙️", - "level_slider": "🎚️", - "control_knobs": "🎛️", - "compass": "🧭", - "stopwatch": "⏱️", - "timer": "⏲️", - "timer_clock": "⏲️", - "alarm_clock": "⏰", - "clock": "🕰️", - "mantlepiece_clock": "🕰️", - "hourglass": "⌛", - "hourglass_flowing_sand": "⏳", - "satellite": "📡", - "battery": "🔋", - "electric_plug": "🔌", - "bulb": "💡", - "flashlight": "🔦", - "candle": "🕯️", - "diya_lamp": "🪔", - "fire_extinguisher": "🧯", - "oil": "🛢️", - "oil_drum": "🛢️", - "money_with_wings": "💸", - "dollar": "💵", - "yen": "💴", - "euro": "💶", - "pound": "💷", - "coin": "🪙", - "moneybag": "💰", - "credit_card": "💳", - "gem": "💎", - "scales": "⚖️", - "ladder": "🪜", - "toolbox": "🧰", - "screwdriver": "🪛", - "wrench": "🔧", - "hammer": "🔨", - "hammer_pick": "⚒️", - "hammer_and_pick": "⚒️", - "tools": "🛠️", - "hammer_and_wrench": "🛠️", - "pick": "⛏️", - "nut_and_bolt": "🔩", - "gear": "⚙️", - "bricks": "🧱", - "chains": "⛓️", - "hook": "🪝", - "knot": "🪢", - "magnet": "🧲", - "gun": "🔫", - "bomb": "💣", - "firecracker": "🧨", - "axe": "🪓", - "carpentry_saw": "🪚", - "knife": "🔪", - "dagger": "🗡️", - "dagger_knife": "🗡️", - "crossed_swords": "⚔️", - "shield": "🛡️", - "smoking": "🚬", - "coffin": "⚰️", - "headstone": "🪦", - "urn": "⚱️", - "funeral_urn": "⚱️", - "amphora": "🏺", - "magic_wand": "🪄", - "crystal_ball": "🔮", - "prayer_beads": "📿", - "nazar_amulet": "🧿", - "barber": "💈", - "alembic": "⚗️", - "telescope": "🔭", - "microscope": "🔬", - "hole": "🕳️", - "window": "🪟", - "adhesive_bandage": "🩹", - "stethoscope": "🩺", - "pill": "💊", - "syringe": "💉", - "drop_of_blood": "🩸", - "dna": "🧬", - "microbe": "🦠", - "petri_dish": "🧫", - "test_tube": "🧪", - "thermometer": "🌡️", - "mouse_trap": "🪤", - "broom": "🧹", - "basket": "🧺", - "sewing_needle": "🪡", - "roll_of_paper": "🧻", - "toilet": "🚽", - "plunger": "🪠", - "bucket": "🪣", - "potable_water": "🚰", - "shower": "🚿", - "bathtub": "🛁", - "bath": "🛀", - "bath_tone1": "🛀🏻", - "bath_tone2": "🛀🏼", - "bath_tone3": "🛀🏽", - "bath_tone4": "🛀🏾", - "bath_tone5": "🛀🏿", - "toothbrush": "🪥", - "soap": "🧼", - "razor": "🪒", - "sponge": "🧽", - "squeeze_bottle": "🧴", - "bellhop": "🛎️", - "bellhop_bell": "🛎️", - "key": "🔑", - "key2": "🗝️", - "old_key": "🗝️", - "door": "🚪", - "chair": "🪑", - "mirror": "🪞", - "couch": "🛋️", - "couch_and_lamp": "🛋️", - "bed": "🛏️", - "sleeping_accommodation": "🛌", - "person_in_bed_tone1": "🛌🏻", - "person_in_bed_light_skin_tone": "🛌🏻", - "person_in_bed_tone2": "🛌🏼", - "person_in_bed_medium_light_skin_tone": "🛌🏼", - "person_in_bed_tone3": "🛌🏽", - "person_in_bed_medium_skin_tone": "🛌🏽", - "person_in_bed_tone4": "🛌🏾", - "person_in_bed_medium_dark_skin_tone": "🛌🏾", - "person_in_bed_tone5": "🛌🏿", - "person_in_bed_dark_skin_tone": "🛌🏿", - "teddy_bear": "🧸", - "frame_photo": "🖼️", - "frame_with_picture": "🖼️", - "shopping_bags": "🛍️", - "shopping_cart": "🛒", - "shopping_trolley": "🛒", - "gift": "🎁", - "balloon": "🎈", - "flags": "🎏", - "ribbon": "🎀", - "confetti_ball": "🎊", - "tada": "🎉", - "piñata": "🪅", - "nesting_dolls": "🪆", - "dolls": "🎎", - "izakaya_lantern": "🏮", - "wind_chime": "🎐", - "red_envelope": "🧧", - "envelope": "✉️", - "envelope_with_arrow": "📩", - "incoming_envelope": "📨", - "e_mail": "📧", - "email": "📧", - "love_letter": "💌", - "inbox_tray": "📥", - "outbox_tray": "📤", - "package": "📦", - "label": "🏷️", - "mailbox_closed": "📪", - "mailbox": "📫", - "mailbox_with_mail": "📬", - "mailbox_with_no_mail": "📭", - "postbox": "📮", - "postal_horn": "📯", - "placard": "🪧", - "scroll": "📜", - "page_with_curl": "📃", - "page_facing_up": "📄", - "bookmark_tabs": "📑", - "receipt": "🧾", - "bar_chart": "📊", - "chart_with_upwards_trend": "📈", - "chart_with_downwards_trend": "📉", - "notepad_spiral": "🗒️", - "spiral_note_pad": "🗒️", - "calendar_spiral": "🗓️", - "spiral_calendar_pad": "🗓️", - "calendar": "📆", - "date": "📅", - "wastebasket": "🗑️", - "card_index": "📇", - "card_box": "🗃️", - "card_file_box": "🗃️", - "ballot_box": "🗳️", - "ballot_box_with_ballot": "🗳️", - "file_cabinet": "🗄️", - "clipboard": "📋", - "file_folder": "📁", - "open_file_folder": "📂", - "dividers": "🗂️", - "card_index_dividers": "🗂️", - "newspaper2": "🗞️", - "rolled_up_newspaper": "🗞️", - "newspaper": "📰", - "notebook": "📓", - "notebook_with_decorative_cover": "📔", - "ledger": "📒", - "closed_book": "📕", - "green_book": "📗", - "blue_book": "📘", - "orange_book": "📙", - "books": "📚", - "book": "📖", - "bookmark": "🔖", - "safety_pin": "🧷", - "link": "🔗", - "paperclip": "📎", - "paperclips": "🖇️", - "linked_paperclips": "🖇️", - "triangular_ruler": "📐", - "straight_ruler": "📏", - "abacus": "🧮", - "pushpin": "📌", - "round_pushpin": "📍", - "scissors": "✂️", - "pen_ballpoint": "🖊️", - "lower_left_ballpoint_pen": "🖊️", - "pen_fountain": "🖋️", - "lower_left_fountain_pen": "🖋️", - "black_nib": "✒️", - "paintbrush": "🖌️", - "lower_left_paintbrush": "🖌️", - "crayon": "🖍️", - "lower_left_crayon": "🖍️", - "pencil": "📝", - "memo": "📝", - "pencil2": "✏️", - "mag": "🔍", - "mag_right": "🔎", - "lock_with_ink_pen": "🔏", - "closed_lock_with_key": "🔐", - "lock": "🔒", - "unlock": "🔓" - }, - "symbols": { - "100": "💯", - "1234": "🔢", - "heart": "❤️", - "orange_heart": "🧡", - "yellow_heart": "💛", - "green_heart": "💚", - "blue_heart": "💙", - "purple_heart": "💜", - "black_heart": "🖤", - "brown_heart": "🤎", - "white_heart": "🤍", - "broken_heart": "💔", - "heart_exclamation": "❣️", - "heavy_heart_exclamation_mark_ornament": "❣️", - "two_hearts": "💕", - "revolving_hearts": "💞", - "heartbeat": "💓", - "heartpulse": "💗", - "sparkling_heart": "💖", - "cupid": "💘", - "gift_heart": "💝", - "mending_heart": "❤️‍🩹", - "heart_on_fire": "❤️‍🔥", - "heart_decoration": "💟", - "peace": "☮️", - "peace_symbol": "☮️", - "cross": "✝️", - "latin_cross": "✝️", - "star_and_crescent": "☪️", - "om_symbol": "🕉️", - "wheel_of_dharma": "☸️", - "star_of_david": "✡️", - "six_pointed_star": "🔯", - "menorah": "🕎", - "yin_yang": "☯️", - "orthodox_cross": "☦️", - "place_of_worship": "🛐", - "worship_symbol": "🛐", - "ophiuchus": "⛎", - "aries": "♈", - "taurus": "♉", - "gemini": "♊", - "cancer": "♋", - "leo": "♌", - "virgo": "♍", - "libra": "♎", - "scorpius": "♏", - "sagittarius": "♐", - "capricorn": "♑", - "aquarius": "♒", - "pisces": "♓", - "id": "🆔", - "atom": "⚛️", - "atom_symbol": "⚛️", - "accept": "🉑", - "radioactive": "☢️", - "radioactive_sign": "☢️", - "biohazard": "☣️", - "biohazard_sign": "☣️", - "mobile_phone_off": "📴", - "vibration_mode": "📳", - "u6709": "🈶", - "u7121": "🈚", - "u7533": "🈸", - "u55b6": "🈺", - "u6708": "🈷️", - "eight_pointed_black_star": "✴️", - "vs": "🆚", - "white_flower": "💮", - "ideograph_advantage": "🉐", - "secret": "㊙️", - "congratulations": "㊗️", - "u5408": "🈴", - "u6e80": "🈵", - "u5272": "🈹", - "u7981": "🈲", - "a": "🅰️", - "b": "🅱️", - "ab": "🆎", - "cl": "🆑", - "o2": "🅾️", - "sos": "🆘", - "x": "❌", - "o": "⭕", - "octagonal_sign": "🛑", - "stop_sign": "🛑", - "no_entry": "⛔", - "name_badge": "📛", - "no_entry_sign": "🚫", - "anger": "💢", - "hotsprings": "♨️", - "no_pedestrians": "🚷", - "do_not_litter": "🚯", - "no_bicycles": "🚳", - "non_potable_water": "🚱", - "underage": "🔞", - "no_mobile_phones": "📵", - "no_smoking": "🚭", - "exclamation": "❗", - "grey_exclamation": "❕", - "question": "❓", - "grey_question": "❔", - "bangbang": "‼️", - "interrobang": "⁉️", - "low_brightness": "🔅", - "high_brightness": "🔆", - "part_alternation_mark": "〽️", - "warning": "⚠️", - "children_crossing": "🚸", - "trident": "🔱", - "fleur_de_lis": "⚜️", - "beginner": "🔰", - "recycle": "♻️", - "white_check_mark": "✅", - "u6307": "🈯", - "chart": "💹", - "sparkle": "❇️", - "eight_spoked_asterisk": "✳️", - "negative_squared_cross_mark": "❎", - "globe_with_meridians": "🌐", - "diamond_shape_with_a_dot_inside": "💠", - "m": "Ⓜ️", - "cyclone": "🌀", - "zzz": "💤", - "atm": "🏧", - "wc": "🚾", - "wheelchair": "♿", - "parking": "🅿️", - "u7a7a": "🈳", - "sa": "🈂️", - "passport_control": "🛂", - "customs": "🛃", - "baggage_claim": "🛄", - "left_luggage": "🛅", - "elevator": "🛗", - "mens": "🚹", - "womens": "🚺", - "baby_symbol": "🚼", - "restroom": "🚻", - "put_litter_in_its_place": "🚮", - "cinema": "🎦", - "signal_strength": "📶", - "koko": "🈁", - "symbols": "🔣", - "information_source": "ℹ️", - "abc": "🔤", - "abcd": "🔡", - "capital_abcd": "🔠", - "ng": "🆖", - "ok": "🆗", - "up": "🆙", - "cool": "🆒", - "new": "🆕", - "free": "🆓", - "zero": "0️⃣", - "one": "1️⃣", - "two": "2️⃣", - "three": "3️⃣", - "four": "4️⃣", - "five": "5️⃣", - "six": "6️⃣", - "seven": "7️⃣", - "eight": "8️⃣", - "nine": "9️⃣", - "keycap_ten": "🔟", - "hash": "#️⃣", - "asterisk": "*️⃣", - "keycap_asterisk": "*️⃣", - "eject": "⏏️", - "eject_symbol": "⏏️", - "arrow_forward": "▶️", - "pause_button": "⏸️", - "double_vertical_bar": "⏸️", - "play_pause": "⏯️", - "stop_button": "⏹️", - "record_button": "⏺️", - "track_next": "⏭️", - "next_track": "⏭️", - "track_previous": "⏮️", - "previous_track": "⏮️", - "fast_forward": "⏩", - "rewind": "⏪", - "arrow_double_up": "⏫", - "arrow_double_down": "⏬", - "arrow_backward": "◀️", - "arrow_up_small": "🔼", - "arrow_down_small": "🔽", - "arrow_right": "➡️", - "arrow_left": "⬅️", - "arrow_up": "⬆️", - "arrow_down": "⬇️", - "arrow_upper_right": "↗️", - "arrow_lower_right": "↘️", - "arrow_lower_left": "↙️", - "arrow_upper_left": "↖️", - "arrow_up_down": "↕️", - "left_right_arrow": "↔️", - "arrow_right_hook": "↪️", - "leftwards_arrow_with_hook": "↩️", - "arrow_heading_up": "⤴️", - "arrow_heading_down": "⤵️", - "twisted_rightwards_arrows": "🔀", - "repeat": "🔁", - "repeat_one": "🔂", - "arrows_counterclockwise": "🔄", - "arrows_clockwise": "🔃", - "musical_note": "🎵", - "notes": "🎶", - "heavy_plus_sign": "➕", - "heavy_minus_sign": "➖", - "heavy_division_sign": "➗", - "heavy_multiplication_x": "✖️", - "infinity": "♾️", - "heavy_dollar_sign": "💲", - "currency_exchange": "💱", - "tm": "™️", - "copyright": "©️", - "registered": "®️", - "wavy_dash": "〰️", - "curly_loop": "➰", - "loop": "➿", - "end": "🔚", - "back": "🔙", - "on": "🔛", - "top": "🔝", - "soon": "🔜", - "heavy_check_mark": "✔️", - "ballot_box_with_check": "☑️", - "radio_button": "🔘", - "white_circle": "⚪", - "black_circle": "⚫", - "red_circle": "🔴", - "blue_circle": "🔵", - "brown_circle": "🟤", - "purple_circle": "🟣", - "green_circle": "🟢", - "yellow_circle": "🟡", - "orange_circle": "🟠", - "small_red_triangle": "🔺", - "small_red_triangle_down": "🔻", - "small_orange_diamond": "🔸", - "small_blue_diamond": "🔹", - "large_orange_diamond": "🔶", - "large_blue_diamond": "🔷", - "white_square_button": "🔳", - "black_square_button": "🔲", - "black_small_square": "▪️", - "white_small_square": "▫️", - "black_medium_small_square": "◾", - "white_medium_small_square": "◽", - "black_medium_square": "◼️", - "white_medium_square": "◻️", - "black_large_square": "⬛", - "white_large_square": "⬜", - "orange_square": "🟧", - "blue_square": "🟦", - "red_square": "🟥", - "brown_square": "🟫", - "purple_square": "🟪", - "green_square": "🟩", - "yellow_square": "🟨", - "speaker": "🔈", - "mute": "🔇", - "sound": "🔉", - "loud_sound": "🔊", - "bell": "🔔", - "no_bell": "🔕", - "mega": "📣", - "loudspeaker": "📢", - "speech_left": "🗨️", - "left_speech_bubble": "🗨️", - "eye_in_speech_bubble": "👁‍🗨", - "speech_balloon": "💬", - "thought_balloon": "💭", - "anger_right": "🗯️", - "right_anger_bubble": "🗯️", - "spades": "♠️", - "clubs": "♣️", - "hearts": "♥️", - "diamonds": "♦️", - "black_joker": "🃏", - "flower_playing_cards": "🎴", - "mahjong": "🀄", - "clock1": "🕐", - "clock2": "🕑", - "clock3": "🕒", - "clock4": "🕓", - "clock5": "🕔", - "clock6": "🕕", - "clock7": "🕖", - "clock8": "🕗", - "clock9": "🕘", - "clock10": "🕙", - "clock11": "🕚", - "clock12": "🕛", - "clock130": "🕜", - "clock230": "🕝", - "clock330": "🕞", - "clock430": "🕟", - "clock530": "🕠", - "clock630": "🕡", - "clock730": "🕢", - "clock830": "🕣", - "clock930": "🕤", - "clock1030": "🕥", - "clock1130": "🕦", - "clock1230": "🕧", - "female_sign": "♀️", - "male_sign": "♂️", - "transgender_symbol": "⚧", - "medical_symbol": "⚕️", - "regional_indicator_z": "🇿", - "regional_indicator_y": "🇾", - "regional_indicator_x": "🇽", - "regional_indicator_w": "🇼", - "regional_indicator_v": "🇻", - "regional_indicator_u": "🇺", - "regional_indicator_t": "🇹", - "regional_indicator_s": "🇸", - "regional_indicator_r": "🇷", - "regional_indicator_q": "🇶", - "regional_indicator_p": "🇵", - "regional_indicator_o": "🇴", - "regional_indicator_n": "🇳", - "regional_indicator_m": "🇲", - "regional_indicator_l": "🇱", - "regional_indicator_k": "🇰", - "regional_indicator_j": "🇯", - "regional_indicator_i": "🇮", - "regional_indicator_h": "🇭", - "regional_indicator_g": "🇬", - "regional_indicator_f": "🇫", - "regional_indicator_e": "🇪", - "regional_indicator_d": "🇩", - "regional_indicator_c": "🇨", - "regional_indicator_b": "🇧", - "regional_indicator_a": "🇦" - }, - "flags": { - "flag_white": "🏳️", - "flag_black": "🏴", - "checkered_flag": "🏁", - "triangular_flag_on_post": "🚩", - "rainbow_flag": "🏳️‍🌈", - "gay_pride_flag": "🏳️‍🌈", - "transgender_flag": "🏳️‍⚧️", - "pirate_flag": "🏴‍☠️", - "flag_af": "🇦🇫", - "flag_ax": "🇦🇽", - "flag_al": "🇦🇱", - "flag_dz": "🇩🇿", - "flag_as": "🇦🇸", - "flag_ad": "🇦🇩", - "flag_ao": "🇦🇴", - "flag_ai": "🇦🇮", - "flag_aq": "🇦🇶", - "flag_ag": "🇦🇬", - "flag_ar": "🇦🇷", - "flag_am": "🇦🇲", - "flag_aw": "🇦🇼", - "flag_au": "🇦🇺", - "flag_at": "🇦🇹", - "flag_az": "🇦🇿", - "flag_bs": "🇧🇸", - "flag_bh": "🇧🇭", - "flag_bd": "🇧🇩", - "flag_bb": "🇧🇧", - "flag_by": "🇧🇾", - "flag_be": "🇧🇪", - "flag_bz": "🇧🇿", - "flag_bj": "🇧🇯", - "flag_bm": "🇧🇲", - "flag_bt": "🇧🇹", - "flag_bo": "🇧🇴", - "flag_ba": "🇧🇦", - "flag_bw": "🇧🇼", - "flag_br": "🇧🇷", - "flag_io": "🇮🇴", - "flag_vg": "🇻🇬", - "flag_bn": "🇧🇳", - "flag_bg": "🇧🇬", - "flag_bf": "🇧🇫", - "flag_bi": "🇧🇮", - "flag_kh": "🇰🇭", - "flag_cm": "🇨🇲", - "flag_ca": "🇨🇦", - "flag_ic": "🇮🇨", - "flag_cv": "🇨🇻", - "flag_bq": "🇧🇶", - "flag_ky": "🇰🇾", - "flag_cf": "🇨🇫", - "flag_td": "🇹🇩", - "flag_cl": "🇨🇱", - "flag_cn": "🇨🇳", - "flag_cx": "🇨🇽", - "flag_cc": "🇨🇨", - "flag_co": "🇨🇴", - "flag_km": "🇰🇲", - "flag_cg": "🇨🇬", - "flag_cd": "🇨🇩", - "flag_ck": "🇨🇰", - "flag_cr": "🇨🇷", - "flag_ci": "🇨🇮", - "flag_hr": "🇭🇷", - "flag_cu": "🇨🇺", - "flag_cw": "🇨🇼", - "flag_cy": "🇨🇾", - "flag_cz": "🇨🇿", - "flag_dk": "🇩🇰", - "flag_dj": "🇩🇯", - "flag_dm": "🇩🇲", - "flag_do": "🇩🇴", - "flag_ec": "🇪🇨", - "flag_eg": "🇪🇬", - "flag_sv": "🇸🇻", - "flag_gq": "🇬🇶", - "flag_er": "🇪🇷", - "flag_ee": "🇪🇪", - "flag_et": "🇪🇹", - "flag_eu": "🇪🇺", - "flag_fk": "🇫🇰", - "flag_fo": "🇫🇴", - "flag_fj": "🇫🇯", - "flag_fi": "🇫🇮", - "flag_fr": "🇫🇷", - "flag_gf": "🇬🇫", - "flag_pf": "🇵🇫", - "flag_tf": "🇹🇫", - "flag_ga": "🇬🇦", - "flag_gm": "🇬🇲", - "flag_ge": "🇬🇪", - "flag_de": "🇩🇪", - "flag_gh": "🇬🇭", - "flag_gi": "🇬🇮", - "flag_gr": "🇬🇷", - "flag_gl": "🇬🇱", - "flag_gd": "🇬🇩", - "flag_gp": "🇬🇵", - "flag_gu": "🇬🇺", - "flag_gt": "🇬🇹", - "flag_gg": "🇬🇬", - "flag_gn": "🇬🇳", - "flag_gw": "🇬🇼", - "flag_gy": "🇬🇾", - "flag_ht": "🇭🇹", - "flag_hn": "🇭🇳", - "flag_hk": "🇭🇰", - "flag_hu": "🇭🇺", - "flag_is": "🇮🇸", - "flag_in": "🇮🇳", - "flag_id": "🇮🇩", - "flag_ir": "🇮🇷", - "flag_iq": "🇮🇶", - "flag_ie": "🇮🇪", - "flag_im": "🇮🇲", - "flag_il": "🇮🇱", - "flag_it": "🇮🇹", - "flag_jm": "🇯🇲", - "flag_jp": "🇯🇵", - "crossed_flags": "🎌", - "flag_je": "🇯🇪", - "flag_jo": "🇯🇴", - "flag_kz": "🇰🇿", - "flag_ke": "🇰🇪", - "flag_ki": "🇰🇮", - "flag_xk": "🇽🇰", - "flag_kw": "🇰🇼", - "flag_kg": "🇰🇬", - "flag_la": "🇱🇦", - "flag_lv": "🇱🇻", - "flag_lb": "🇱🇧", - "flag_ls": "🇱🇸", - "flag_lr": "🇱🇷", - "flag_ly": "🇱🇾", - "flag_li": "🇱🇮", - "flag_lt": "🇱🇹", - "flag_lu": "🇱🇺", - "flag_mo": "🇲🇴", - "flag_mk": "🇲🇰", - "flag_mg": "🇲🇬", - "flag_mw": "🇲🇼", - "flag_my": "🇲🇾", - "flag_mv": "🇲🇻", - "flag_ml": "🇲🇱", - "flag_mt": "🇲🇹", - "flag_mh": "🇲🇭", - "flag_mq": "🇲🇶", - "flag_mr": "🇲🇷", - "flag_mu": "🇲🇺", - "flag_yt": "🇾🇹", - "flag_mx": "🇲🇽", - "flag_fm": "🇫🇲", - "flag_md": "🇲🇩", - "flag_mc": "🇲🇨", - "flag_mn": "🇲🇳", - "flag_me": "🇲🇪", - "flag_ms": "🇲🇸", - "flag_ma": "🇲🇦", - "flag_mz": "🇲🇿", - "flag_mm": "🇲🇲", - "flag_na": "🇳🇦", - "flag_nr": "🇳🇷", - "flag_np": "🇳🇵", - "flag_nl": "🇳🇱", - "flag_nc": "🇳🇨", - "flag_nz": "🇳🇿", - "flag_ni": "🇳🇮", - "flag_ne": "🇳🇪", - "flag_ng": "🇳🇬", - "flag_nu": "🇳🇺", - "flag_nf": "🇳🇫", - "flag_kp": "🇰🇵", - "flag_mp": "🇲🇵", - "flag_no": "🇳🇴", - "flag_om": "🇴🇲", - "flag_pk": "🇵🇰", - "flag_pw": "🇵🇼", - "flag_ps": "🇵🇸", - "flag_pa": "🇵🇦", - "flag_pg": "🇵🇬", - "flag_py": "🇵🇾", - "flag_pe": "🇵🇪", - "flag_ph": "🇵🇭", - "flag_pn": "🇵🇳", - "flag_pl": "🇵🇱", - "flag_pt": "🇵🇹", - "flag_pr": "🇵🇷", - "flag_qa": "🇶🇦", - "flag_re": "🇷🇪", - "flag_ro": "🇷🇴", - "flag_ru": "🇷🇺", - "flag_rw": "🇷🇼", - "flag_ws": "🇼🇸", - "flag_sm": "🇸🇲", - "flag_st": "🇸🇹", - "flag_sa": "🇸🇦", - "flag_sn": "🇸🇳", - "flag_rs": "🇷🇸", - "flag_sc": "🇸🇨", - "flag_sl": "🇸🇱", - "flag_sg": "🇸🇬", - "flag_sx": "🇸🇽", - "flag_sk": "🇸🇰", - "flag_si": "🇸🇮", - "flag_gs": "🇬🇸", - "flag_sb": "🇸🇧", - "flag_so": "🇸🇴", - "flag_za": "🇿🇦", - "flag_kr": "🇰🇷", - "flag_ss": "🇸🇸", - "flag_es": "🇪🇸", - "flag_lk": "🇱🇰", - "flag_bl": "🇧🇱", - "flag_sh": "🇸🇭", - "flag_kn": "🇰🇳", - "flag_lc": "🇱🇨", - "flag_pm": "🇵🇲", - "flag_vc": "🇻🇨", - "flag_sd": "🇸🇩", - "flag_sr": "🇸🇷", - "flag_sz": "🇸🇿", - "flag_se": "🇸🇪", - "flag_ch": "🇨🇭", - "flag_sy": "🇸🇾", - "flag_tw": "🇹🇼", - "flag_tj": "🇹🇯", - "flag_tz": "🇹🇿", - "flag_th": "🇹🇭", - "flag_tl": "🇹🇱", - "flag_tg": "🇹🇬", - "flag_tk": "🇹🇰", - "flag_to": "🇹🇴", - "flag_tt": "🇹🇹", - "flag_tn": "🇹🇳", - "flag_tr": "🇹🇷", - "flag_tm": "🇹🇲", - "flag_tc": "🇹🇨", - "flag_vi": "🇻🇮", - "flag_tv": "🇹🇻", - "flag_ug": "🇺🇬", - "flag_ua": "🇺🇦", - "flag_ae": "🇦🇪", - "flag_gb": "🇬🇧", - "england": "🏴󠁧󠁢󠁥󠁮󠁧󠁿", - "scotland": "🏴󠁧󠁢󠁳󠁣󠁴󠁿", - "wales": "🏴󠁧󠁢󠁷󠁬󠁳󠁿", - "flag_us": "🇺🇸", - "flag_uy": "🇺🇾", - "flag_uz": "🇺🇿", - "flag_vu": "🇻🇺", - "flag_va": "🇻🇦", - "flag_ve": "🇻🇪", - "flag_vn": "🇻🇳", - "flag_wf": "🇼🇫", - "flag_eh": "🇪🇭", - "flag_ye": "🇾🇪", - "flag_zm": "🇿🇲", - "flag_zw": "🇿🇼", - "flag_ac": "🇦🇨", - "flag_bv": "🇧🇻", - "flag_cp": "🇨🇵", - "flag_ea": "🇪🇦", - "flag_dg": "🇩🇬", - "flag_hm": "🇭🇲", - "flag_mf": "🇲🇫", - "flag_sj": "🇸🇯", - "flag_ta": "🇹🇦", - "flag_um": "🇺🇲", - "united_nations": "🇺🇳" - } -} diff --git a/emojiinfo/emojiinfo.py b/emojiinfo/emojiinfo.py deleted file mode 100644 index 96b533d..0000000 --- a/emojiinfo/emojiinfo.py +++ /dev/null @@ -1,119 +0,0 @@ -import io - -import aiohttp -import discord -from colorthief import ColorThief -from red_commons.logging import RedTraceLogger, getLogger -from redbot.core import app_commands, commands -from redbot.core.bot import Red -from redbot.core.utils.chat_formatting import bold, humanize_list - -from .model import PartialEmoji - - -class EmojiInfo(commands.Cog): - """Retrieve information about emojis.""" - - __author__ = ["[cswimr](https://www.coastalcommits.com/cswimr)"] - __git__ = "https://www.coastalcommits.com/cswimr/SeaCogs" - __version__ = "1.0.3" - __documentation__ = "https://seacogs.coastalcommits.com/emojiinfo/" - - def __init__(self, bot: Red) -> None: - super().__init__() - self.bot: Red = bot - self.logger: RedTraceLogger = getLogger(name="red.SeaCogs.EmojiInfo") - - def format_help_for_context(self, ctx: commands.Context) -> str: - pre_processed = super().format_help_for_context(ctx) or "" - n = "\n" if "\n\n" not in pre_processed else "" - text = [ - f"{pre_processed}{n}", - f"{bold('Cog Version:')} [{self.__version__}]({self.__git__})", - f"{bold('Author:')} {humanize_list(self.__author__)}", - f"{bold('Documentation:')} {self.__documentation__}", - ] - return "\n".join(text) - - async def fetch_twemoji(self, unicode_emoji) -> str: - base_url = "https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/72x72/" - emoji_codepoint = "-".join([hex(ord(char))[2:] for char in unicode_emoji]) - segments = emoji_codepoint.split("-") - valid_segments = [seg for seg in segments if len(seg) >= 4] - return f"{base_url}{valid_segments[0]}.png" - - async def fetch_primary_color(self, emoji_url: str) -> discord.Color | None: - async with aiohttp.ClientSession() as session: - async with session.get(emoji_url) as response: - if response.status != 200: - return None - image = await response.read() - dominant_color = ColorThief(io.BytesIO(image)).get_color(quality=1) - return discord.Color.from_rgb(*dominant_color) - - async def get_emoji_info(self, emoji: PartialEmoji) -> tuple[str, str]: - if emoji.is_unicode_emoji(): - try: - emoji_url = await self.fetch_twemoji(unicode_emoji=emoji.name) - except IndexError as e: - raise e - else: - emoji_url = emoji.url - - if emoji.id is not None: - emoji_id = f"{bold('ID:')} `{emoji.id}`\n" - markdown = f"`<{'a' if emoji.animated else ''}:{emoji.name}:{emoji.id}>`" - name = f"{bold('Name:')} {emoji.name}\n" - aliases = "" - group = "" - else: - emoji_id = "" - markdown = f"`{emoji}`" - name = f"{bold('Name:')} {emoji.aliases.pop(0) if emoji.aliases else emoji.name}\n" - aliases = f"{bold('Aliases:')} {', '.join(emoji.aliases)}\n" if emoji.aliases else "" - group = f"{bold('Group:')} {emoji.group}\n" - - return (f"{name}{emoji_id}{bold('Native:')} {emoji.is_unicode_emoji()}\n{group}{aliases}{bold('Animated:')} {emoji.animated}\n{bold('Markdown:')} {markdown}\n{bold('URL:')} [Click Here]({emoji_url})"), emoji_url - - @app_commands.command(name="emoji") - @app_commands.describe(emoji="What emoji would you like to get information on?", ephemeral="Would you like the response to be hidden?") - async def emoji_slash(self, interaction: discord.Interaction, emoji: str, ephemeral: bool = True) -> None: - """Retrieve information about an emoji.""" - await interaction.response.defer(ephemeral=ephemeral) - - try: - retrieved_emoji: PartialEmoji = PartialEmoji.from_str(self, value=emoji) - string, emoji_url = await self.get_emoji_info(retrieved_emoji) - self.logger.verbose(f"Emoji:\n{string}") - except (IndexError, UnboundLocalError): - return await interaction.followup.send("Please provide a valid emoji!") - - assert isinstance(interaction.channel, discord.TextChannel) - if await self.bot.embed_requested(channel=interaction.channel): - embed = discord.Embed(title="Emoji Information", description=string, color=await self.fetch_primary_color(emoji_url) or await self.bot.get_embed_color(interaction.channel)) - embed.set_thumbnail(url=emoji_url) - - await interaction.followup.send(embed=embed) - return None - await interaction.followup.send(content=string) - return None - - @commands.command(name="emoji") - async def emoji(self, ctx: commands.Context, *, emoji: str) -> None: - """Retrieve information about an emoji.""" - try: - retrieved_emoji: PartialEmoji = PartialEmoji.from_str(self, value=emoji) - string, emoji_url = await self.get_emoji_info(retrieved_emoji) - self.logger.verbose(f"Emoji:\n{string}") - except (IndexError, UnboundLocalError): - await ctx.send("Please provide a valid emoji!") - return - - if await ctx.embed_requested(): - embed = discord.Embed(title="Emoji Information", description=string, color=await self.fetch_primary_color(emoji_url) or await ctx.embed_color()) - embed.set_thumbnail(url=emoji_url) - - await ctx.send(embed=embed) - return - await ctx.send(content=string) - return diff --git a/emojiinfo/info.json b/emojiinfo/info.json deleted file mode 100644 index ccc32c7..0000000 --- a/emojiinfo/info.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "$schema": "https://raw.githubusercontent.com/Cog-Creators/Red-DiscordBot/refs/heads/V3/develop/schema/red_cog_repo.schema.json", - "author": ["cswimr"], - "install_msg": "Thank you for installing Emoji!", - "name": "Emoji", - "short": "Retrieve information about emojis.", - "description": "Retrieve information about emojis.", - "end_user_data_statement": "This cog does not store end user data.", - "hidden": false, - "disabled": false, - "min_bot_version": "3.5.0", - "min_python_version": [3, 10, 0], - "requirements": ["colorthief"], - "tags": ["utility"] -} diff --git a/emojiinfo/model.py b/emojiinfo/model.py deleted file mode 100644 index c553950..0000000 --- a/emojiinfo/model.py +++ /dev/null @@ -1,91 +0,0 @@ -import json - -import discord -from redbot.core import commands, data_manager - - -class PartialEmoji(discord.PartialEmoji): - """Represents a "partial" emoji. Subclasses `discord.PartialEmoji` - - .. container:: operations - - .. describe:: x == y - - Checks if two emoji are the same. - - .. describe:: x != y - - Checks if two emoji are not the same. - - .. describe:: hash(x) - - Return the emoji's hash. - - .. describe:: str(x) - - Returns the emoji rendered for discord. - - Attributes - ----------- - name: Optional[:class:`str`] - The custom emoji name, if applicable, or the unicode codepoint - of the non-custom emoji. This can be ``None`` if the emoji - got deleted (e.g. removing a reaction with a deleted emoji). - animated: :class:`bool` - Whether the emoji is animated or not. - id: Optional[:class:`int`] - The ID of the custom emoji, if applicable. - group: Optional[:class:`str`] - The group name of the emoji if it is a native emoji. - """ - - def __init__(self, *, name: str, animated: bool = False, id: int | None = None, group: str | None = None, aliases: list | None = None) -> None: # pylint: disable=redefined-builtin # noqa: A002 - super().__init__(name=name, animated=animated, id=id) - self.group = group - self.aliases = aliases - - @classmethod - def from_str(cls, coginstance: commands.Cog, value: str) -> "PartialEmoji": - """Converts a Discord string representation of an emoji to a :class:`PartialEmoji`. - - The formats accepted are: - - - ``a:name:id`` - - ```` - - ``name:id`` - - ``<:name:id>`` - - If the format does not match then it is assumed to be a unicode emoji. - - .. versionadded:: 2.0 - - Parameters - ------------ - value: :class:`str` - The string representation of an emoji. - - Returns - -------- - :class:`PartialEmoji` - The partial emoji from this string. - """ - match = cls._CUSTOM_EMOJI_RE.match(value) - if match is not None: - groups = match.groupdict() - animated = bool(groups["animated"]) - emoji_id = int(groups["id"]) - name = groups["name"] - return cls(name=name, animated=animated, id=emoji_id) - - path = data_manager.bundled_data_path(coginstance) / "emojis.json" - with open(path, "r", encoding="UTF-8") as file: - emojis: dict = json.load(file) - emoji_aliases = [] - emoji_group = None - for dict_name, group in emojis.items(): - for k, v in group.items(): - if v == value: - emoji_group = dict_name - if k not in emoji_aliases: - emoji_aliases.append(k) - return cls(name=value, animated=False, id=None, group=emoji_group, aliases=emoji_aliases) diff --git a/flake.lock b/flake.lock deleted file mode 100644 index 363c464..0000000 --- a/flake.lock +++ /dev/null @@ -1,25 +0,0 @@ -{ - "nodes": { - "nixpkgs": { - "locked": { - "lastModified": 1738680400, - "narHash": "sha256-ooLh+XW8jfa+91F1nhf9OF7qhuA/y1ChLx6lXDNeY5U=", - "rev": "799ba5bffed04ced7067a91798353d360788b30d", - "revCount": 747653, - "type": "tarball", - "url": "https://api.flakehub.com/f/pinned/NixOS/nixpkgs/0.1.747653%2Brev-799ba5bffed04ced7067a91798353d360788b30d/0194d302-29da-7009-8f43-5b8a58825954/source.tar.gz" - }, - "original": { - "type": "tarball", - "url": "https://flakehub.com/f/NixOS/nixpkgs/0.1.%2A.tar.gz" - } - }, - "root": { - "inputs": { - "nixpkgs": "nixpkgs" - } - } - }, - "root": "root", - "version": 7 -} diff --git a/flake.nix b/flake.nix deleted file mode 100644 index 819e209..0000000 --- a/flake.nix +++ /dev/null @@ -1,72 +0,0 @@ -{ - description = "SeaCogs Nix Flake"; - inputs.nixpkgs.url = "https://flakehub.com/f/NixOS/nixpkgs/0.1.*.tar.gz"; - - outputs = - { self, nixpkgs }: - let - supportedSystems = [ - "x86_64-linux" - "aarch64-linux" - "x86_64-darwin" - "aarch64-darwin" - ]; - forEachSupportedSystem = - f: - nixpkgs.lib.genAttrs supportedSystems ( - system: - f { - pkgs = import nixpkgs { inherit system; }; - lib = nixpkgs.lib; - } - ); - in - { - devShells = forEachSupportedSystem ( - { pkgs, lib }: - let - myPython = pkgs.python311; - lib-path = - with pkgs; - lib.makeLibraryPath [ - stdenv.cc.cc - # Red-DiscordBot dependencies - libffi - libsodium - # PyLav dependency - libaio - # Material for MkDocs dependency - cairo - ]; - in - { - default = pkgs.mkShell { - lib-path = lib-path; - packages = with pkgs; [ - myPython - uv - ruff # the ruff pip package installs a dynamically linked binary that cannot run on NixOS - forgejo-runner - # Red-DiscordBot dependencies - git - jdk17 - # Material for MkDocs dependencies - pngquant - # SeaCogs dependencies - dig - ]; - shellHook = # bash - '' - export "LD_LIBRARY_PATH=$LD_LIBRARY_PATH:${lib-path}" - export "UV_PYTHON_PREFERENCE=only-system" - export "UV_PYTHON_DOWNLOADS=never" - uv sync --all-groups - source ./.venv/bin/activate - export "PYTHONPATH=`pwd`/.venv/${myPython.sitePackages}/:$PYTHONPATH" - export "PATH=${pkgs.ruff}/bin:$PATH" - ''; - }; - } - ); - }; -} diff --git a/hotreload/__init__.py b/hotreload/__init__.py deleted file mode 100644 index 7140931..0000000 --- a/hotreload/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -from .hotreload import HotReload - - -async def setup(bot): - await bot.add_cog(HotReload(bot)) diff --git a/hotreload/hotreload.py b/hotreload/hotreload.py deleted file mode 100644 index 7eed202..0000000 --- a/hotreload/hotreload.py +++ /dev/null @@ -1,192 +0,0 @@ -import py_compile -from asyncio import run_coroutine_threadsafe -from pathlib import Path -from tempfile import NamedTemporaryFile -from typing import Generator, List, Sequence - -import discord -from red_commons.logging import RedTraceLogger, getLogger -from redbot.core import Config, checks, commands -from redbot.core.bot import Red -from redbot.core.core_commands import CoreLogic -from redbot.core.utils.chat_formatting import bold, box, humanize_list -from typing_extensions import override -from watchdog.events import FileSystemEvent, FileSystemMovedEvent, RegexMatchingEventHandler -from watchdog.observers import Observer -from watchdog.observers.api import BaseObserver - - -class HotReload(commands.Cog): - """Automatically reload cogs in local cog paths on file change.""" - - __author__ = ["[cswimr](https://www.coastalcommits.com/cswimr)"] - __git__ = "https://www.coastalcommits.com/cswimr/SeaCogs" - __version__ = "1.4.2" - __documentation__ = "https://seacogs.coastalcommits.com/hotreload/" - - def __init__(self, bot: Red) -> None: - super().__init__() - self.bot: Red = bot - self.config: Config = Config.get_conf(cog_instance=self, identifier=294518358420750336, force_registration=True) - self.logger: RedTraceLogger = getLogger(name="red.SeaCogs.HotReload") - self.observers: List[BaseObserver] = [] - self.config.register_global(notify_channel=None, compile_before_reload=False) - watchdog_loggers = [getLogger(name="watchdog.observers.inotify_buffer")] - for watchdog_logger in watchdog_loggers: - watchdog_logger.setLevel("INFO") # SHUT UP!!!! - - @override - async def cog_load(self) -> None: - """Start the observer when the cog is loaded.""" - _ = self.bot.loop.create_task(self.start_observer()) - - @override - async def cog_unload(self) -> None: - """Stop the observer when the cog is unloaded.""" - for observer in self.observers: - observer.stop() - observer.join() - self.logger.info("Stopped observer. No longer watching for file changes.") - - @override - def format_help_for_context(self, ctx: commands.Context) -> str: - pre_processed = super().format_help_for_context(ctx) or "" - n = "\n" if "\n\n" not in pre_processed else "" - text = [ - f"{pre_processed}{n}", - f"{bold('Cog Version:')} [{self.__version__}]({self.__git__})", - f"{bold('Author:')} {humanize_list(self.__author__)}", - f"{bold('Documentation:')} {self.__documentation__}", - ] - return "\n".join(text) - - # pylint: disable=protected-access - async def get_paths(self) -> Generator[Path, None, None]: - """Retrieve user defined paths.""" - cog_manager = self.bot._cog_mgr # noqa: SLF001 # We have to use this private method because there is no public API to get user defined paths - cog_paths = await cog_manager.user_defined_paths() - return (Path(path) for path in cog_paths) - - async def start_observer(self) -> None: - """Start the observer to watch for file changes.""" - self.observers.append(Observer()) - paths = await self.get_paths() - is_first = True - for observer in self.observers: - if not is_first: - observer.stop() - observer.join() - self.logger.debug("Stopped hanging observer.") - continue - for path in paths: - if not path.exists(): - self.logger.warning("Path %s does not exist. Skipping.", path) - continue - self.logger.debug("Adding observer schedule for path %s.", path) - observer.schedule(event_handler=HotReloadHandler(cog=self, path=path), path=str(path), recursive=True) - observer.start() - self.logger.info("Started observer. Watching for file changes.") - is_first = False - - @checks.is_owner() - @commands.group(name="hotreload") - async def hotreload_group(self, ctx: commands.Context) -> None: - """HotReload configuration commands.""" - - @hotreload_group.command(name="notifychannel") - async def hotreload_notifychannel(self, ctx: commands.Context, channel: discord.TextChannel) -> None: - """Set the channel to send notifications to.""" - await self.config.notify_channel.set(channel.id) - await ctx.send(f"Notifications will be sent to {channel.mention}.") - - @hotreload_group.command(name="compile") # type: ignore - async def hotreload_compile(self, ctx: commands.Context, compile_before_reload: bool) -> None: - """Set whether to compile modified files before reloading.""" - await self.config.compile_before_reload.set(compile_before_reload) - await ctx.send(f"I {'will' if compile_before_reload else 'will not'} compile modified files before hotreloading cogs.") - - @hotreload_group.command(name="list") # type: ignore - async def hotreload_list(self, ctx: commands.Context) -> None: - """List the currently active observers.""" - if not self.observers: - await ctx.send("No observers are currently active.") - return - await ctx.send(f"Currently active observers (If there are more than one of these, report an issue): {box(humanize_list([str(o) for o in self.observers], style='unit'))}") - - -class HotReloadHandler(RegexMatchingEventHandler): - """Handler for file changes.""" - - def __init__(self, cog: HotReload, path: Path) -> None: - super().__init__(regexes=[r".*\.py$"]) - self.cog: HotReload = cog - self.path: Path = path - self.logger: RedTraceLogger = getLogger(name="red.SeaCogs.HotReload.Observer") - - def on_any_event(self, event: FileSystemEvent) -> None: - """Handle filesystem events.""" - if event.is_directory: - return - - allowed_events = ("moved", "deleted", "created", "modified") - if event.event_type not in allowed_events: - return - - relative_src_path = Path(str(event.src_path)).relative_to(self.path) - src_package_name = relative_src_path.parts[0] - cogs_to_reload = [src_package_name] - - if isinstance(event, FileSystemMovedEvent): - dest = f" to {event.dest_path}" - relative_dest_path = Path(str(event.dest_path)).relative_to(self.path) - dest_package_name = relative_dest_path.parts[0] - if dest_package_name != src_package_name: - cogs_to_reload.append(dest_package_name) - else: - dest = "" - - self.logger.info("File %s has been %s%s.", event.src_path, event.event_type, dest) - - run_coroutine_threadsafe( - coro=self.reload_cogs( - cog_names=cogs_to_reload, - paths=[Path(str(p)) for p in (event.src_path, getattr(event, "dest_path", None)) if p], - ), - loop=self.cog.bot.loop, - ) - - # pylint: disable=protected-access - async def reload_cogs(self, cog_names: Sequence[str], paths: Sequence[Path]) -> None: - """Reload modified cogs.""" - if not self.compile_modified_files(cog_names, paths): - return - - core_logic = CoreLogic(bot=self.cog.bot) - self.logger.info("Reloading cogs: %s", humanize_list(cog_names, style="unit")) - await core_logic._reload(pkg_names=cog_names) # noqa: SLF001 # We have to use this private method because there is no public API to reload other cogs - self.logger.info("Reloaded cogs: %s", humanize_list(cog_names, style="unit")) - - channel = self.cog.bot.get_channel(await self.cog.config.notify_channel()) - if channel and isinstance(channel, discord.TextChannel): - await channel.send(f"Reloaded cogs: {humanize_list(cog_names, style='unit')}") - - def compile_modified_files(self, cog_names: Sequence[str], paths: Sequence[Path]) -> bool: - """Compile modified files to ensure they are valid Python files.""" - for path in paths: - if not path.exists() or path.suffix != ".py": - self.logger.debug("Path %s does not exist or does not point to a Python file. Skipping compilation step.", path) - continue - - try: - with NamedTemporaryFile() as temp_file: - self.logger.debug("Attempting to compile %s", path) - py_compile.compile(file=str(path), cfile=temp_file.name, doraise=True) - self.logger.debug("Successfully compiled %s", path) - - except py_compile.PyCompileError as e: - e.__suppress_context__ = True - self.logger.exception("%s failed to compile. Not reloading cogs %s.", path, humanize_list(cog_names, style="unit")) - return False - except OSError: - self.logger.exception("Failed to create tempfile for compilation step. Skipping.") - return True diff --git a/hotreload/info.json b/hotreload/info.json deleted file mode 100644 index 4669078..0000000 --- a/hotreload/info.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "$schema": "https://raw.githubusercontent.com/Cog-Creators/Red-DiscordBot/refs/heads/V3/develop/schema/red_cog_repo.schema.json", - "author": ["cswimr"], - "install_msg": "Thank you for installing HotReload! Please see the [documentation](https://seacogs.coastalcommits.com/hotreload) to get started.", - "name": "HotReload", - "short": "Automatically reload cogs in local cog paths on file change.", - "description": "Automatically reload cogs in local cog paths on file change.", - "end_user_data_statement": "This cog does not store end user data.", - "hidden": false, - "disabled": false, - "min_bot_version": "3.5.0", - "min_python_version": [3, 8, 0], - "requirements": ["watchdog"], - "tags": ["utility", "development"] -} diff --git a/info.json b/info.json index 08ba1dc..04f29ab 100644 --- a/info.json +++ b/info.json @@ -1,8 +1,9 @@ { - "$schema": "https://raw.githubusercontent.com/Cog-Creators/Red-DiscordBot/V3/develop/schema/red_cog_repo.schema.json", - "author": ["cswimr"], - "install_msg": "Thanks for installing my repo!\n\nIf you have any issues with any of the cogs, please create an issue [here](https://coastalcommits.com/cswimr/SeaCogs/issues) or join my [Discord Server](https://discord.gg/eMUMe77Yb8 ).", - "index_name": "sea-cogs", - "short": "Various cogs for Red, by cswimr", - "description": "Various cogs for Red, by cswimr" + "author": [ + "SeaswimmerTheFsh (seasw.)" + ], + "install_msg": "Thanks for installing my repo!\n\nIf you have any issues with any of the cogs, please create an issue [here](https://coastalcommits.com/SeaswimmerTheFsh/SeaCogs/issues) or join my [Discord Server](https://discord.gg/eMUMe77Yb8 ).", + "name": "SeaCogs", + "short": "Various cogs for Red, by SeaswimmerTheFsh (seasw.)", + "description": "Various cogs for Red, by SeaswimmerTheFsh (seasw.)" } diff --git a/mkdocs.yml b/mkdocs.yml index 81ab9ed..c769609 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -1,37 +1,35 @@ site_name: SeaCogs Documentation -site_url: !ENV [SITE_URL, "https://seacogs.coastalcommits.com"] +site_url: !ENV [SITE_URL, 'https://seacogs.coastalcommits.com'] repo_name: CoastalCommits -repo_url: https://coastalcommits.com/cswimr/SeaCogs -edit_uri: !ENV [EDIT_URI, "src/branch/main/.docs"] -copyright: Copyright © 2023-2024, cswimr +repo_url: https://coastalcommits.com/SeaswimmerTheFsh/SeaCogs +edit_uri: !ENV [EDIT_URI, 'src/branch/main/.docs'] +copyright: Copyright © 2023-2024, SeaswimmerTheFsh docs_dir: .docs -site_author: cswimr +site_author: SeaswimmerTheFsh site_description: Documentation for my Red-DiscordBot Cogs. nav: - Home: index.md - Aurora: - - aurora/index.md - - Moderation Commands: aurora/moderation-commands.md - - Case Commands: aurora/case-commands.md - - Configuration: aurora/configuration.md + - aurora/index.md + - Moderation Commands: aurora/moderation-commands.md + - Case Commands: aurora/case-commands.md + - Configuration: aurora/configuration.md - Bible: bible.md - Backup: backup.md - - EmojiInfo: emojiinfo.md - - HotReload: hotreload.md - Nerdify: nerdify.md - Pterodactyl: - - pterodactyl/index.md - - Installing Red: pterodactyl/installing-red.md - - Getting Started: pterodactyl/getting-started.md - - Configuration: pterodactyl/configuration.md - - Regex Examples: pterodactyl/regex.md + - pterodactyl/index.md + - Installing Red: pterodactyl/installing-red.md + - Getting Started: pterodactyl/getting-started.md + - Configuration: pterodactyl/configuration.md + - Regex Examples: pterodactyl/regex.md plugins: - git-authors - search - - social + #- social - git-revision-date-localized: enable_creation_date: true type: timeago @@ -73,7 +71,7 @@ markdown_extensions: theme: name: material palette: - - media: "(prefers-color-scheme: light)" + - media: '(prefers-color-scheme: light)' scheme: default primary: white accent: light blue @@ -81,7 +79,7 @@ theme: icon: material/toggle-switch name: Switch to dark mode - - media: "(prefers-color-scheme: dark)" + - media: '(prefers-color-scheme: dark)' scheme: slate primary: black accent: light blue @@ -114,5 +112,3 @@ watch: - ./bible - ./nerdify - ./pterodactyl - - ./emojiinfo - - ./antipolls diff --git a/nerdify/info.json b/nerdify/info.json index eeb0ef7..38730c7 100644 --- a/nerdify/info.json +++ b/nerdify/info.json @@ -1,14 +1,17 @@ { - "$schema": "https://raw.githubusercontent.com/Cog-Creators/Red-DiscordBot/refs/heads/V3/develop/schema/red_cog_repo.schema.json", - "author": ["cswimr"], - "install_msg": "Thank you for installing Nerdify!\nYou can find the source code of this cog [here](https://coastalcommits.com/cswimr/SeaCogs). Based off of PhasecoreX's [UwU]() cog.", - "name": "Nerdify", - "short": "Nerdify your text!", - "description": "Nerdify your text!", - "end_user_data_statement": "This cog does not store end user data.", + "author" : ["SeaswimmerTheFsh (seasw.)"], + "install_msg" : "Thank you for installing Nerdify!\nYou can find the source code of this cog [here](https://coastalcommits.com/SeaswimmerTheFsh/SeaCogs). Based off of PhasecoreX's [UwU]() cog.", + "name" : "Nerdify", + "short" : "Nerdify your text!", + "description" : "Nerdify your text!", + "end_user_data_statement" : "This cog does not store end user data.", "hidden": false, "disabled": false, "min_bot_version": "3.5.0", "min_python_version": [3, 8, 0], - "tags": ["fun", "text", "meme"] + "tags": [ + "fun", + "text", + "meme" + ] } diff --git a/nerdify/nerdify.py b/nerdify/nerdify.py index fb9b784..76307b1 100644 --- a/nerdify/nerdify.py +++ b/nerdify/nerdify.py @@ -12,15 +12,13 @@ from typing import Any, Optional, Union import discord from redbot.core import commands from redbot.core.utils import chat_formatting, common_filters -from redbot.core.utils.chat_formatting import bold, humanize_list class Nerdify(commands.Cog): """Nerdify your text.""" - __author__ = ["[cswimr](https://www.coastalcommits.com/cswimr)"] - __git__ = "https://www.coastalcommits.com/cswimr/SeaCogs" - __version__ = "1.3.5" + __author__ = ["SeaswimmerTheFsh"] + __version__ = "1.3.4" __documentation__ = "https://seacogs.coastalcommits.com/nerdify/" def __init__(self, bot): @@ -31,26 +29,21 @@ class Nerdify(commands.Cog): n = "\n" if "\n\n" not in pre_processed else "" text = [ f"{pre_processed}{n}", - f"{bold('Cog Version:')} [{self.__version__}]({self.__git__})", - f"{bold('Author:')} {humanize_list(self.__author__)}", - f"{bold('Documentation:')} {self.__documentation__}", + f"Cog Version: **{self.__version__}**", + f"Author: {chat_formatting.humanize_list(self.__author__)}", + f"Documentation: {self.__documentation__}" ] return "\n".join(text) @commands.command(aliases=["nerd"]) async def nerdify( - self, - ctx: commands.Context, - *, - text: Optional[str] = None, + self, ctx: commands.Context, *, text: Optional[str] = None ) -> None: """Nerdify the replied to message, previous message, or your own text.""" if not text: if hasattr(ctx.message, "reference") and ctx.message.reference: with suppress( - discord.Forbidden, - discord.NotFound, - discord.HTTPException, + discord.Forbidden, discord.NotFound, discord.HTTPException ): message_id = ctx.message.reference.message_id if message_id: @@ -66,9 +59,7 @@ class Nerdify(commands.Cog): ctx.channel, self.nerdify_text(text), allowed_mentions=discord.AllowedMentions( - everyone=False, - users=False, - roles=False, + everyone=False, users=False, roles=False ), ) @@ -83,10 +74,7 @@ class Nerdify(commands.Cog): return f'"{text}" 🤓' async def type_message( - self, - destination: discord.abc.Messageable, - content: str, - **kwargs: Any, + self, destination: discord.abc.Messageable, content: str, **kwargs: Any ) -> Union[discord.Message, None]: """Simulate typing and sending a message to a destination. diff --git a/poetry.lock b/poetry.lock new file mode 100644 index 0000000..2767d72 --- /dev/null +++ b/poetry.lock @@ -0,0 +1,2439 @@ +# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand. + +[[package]] +name = "aiohttp" +version = "3.9.3" +description = "Async http client/server framework (asyncio)" +optional = false +python-versions = ">=3.8" +files = [ + {file = "aiohttp-3.9.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:939677b61f9d72a4fa2a042a5eee2a99a24001a67c13da113b2e30396567db54"}, + {file = "aiohttp-3.9.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1f5cd333fcf7590a18334c90f8c9147c837a6ec8a178e88d90a9b96ea03194cc"}, + {file = "aiohttp-3.9.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:82e6aa28dd46374f72093eda8bcd142f7771ee1eb9d1e223ff0fa7177a96b4a5"}, + {file = "aiohttp-3.9.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f56455b0c2c7cc3b0c584815264461d07b177f903a04481dfc33e08a89f0c26b"}, + {file = "aiohttp-3.9.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bca77a198bb6e69795ef2f09a5f4c12758487f83f33d63acde5f0d4919815768"}, + {file = "aiohttp-3.9.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e083c285857b78ee21a96ba1eb1b5339733c3563f72980728ca2b08b53826ca5"}, + {file = "aiohttp-3.9.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ab40e6251c3873d86ea9b30a1ac6d7478c09277b32e14745d0d3c6e76e3c7e29"}, + {file = "aiohttp-3.9.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:df822ee7feaaeffb99c1a9e5e608800bd8eda6e5f18f5cfb0dc7eeb2eaa6bbec"}, + {file = "aiohttp-3.9.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:acef0899fea7492145d2bbaaaec7b345c87753168589cc7faf0afec9afe9b747"}, + {file = "aiohttp-3.9.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:cd73265a9e5ea618014802ab01babf1940cecb90c9762d8b9e7d2cc1e1969ec6"}, + {file = "aiohttp-3.9.3-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:a78ed8a53a1221393d9637c01870248a6f4ea5b214a59a92a36f18151739452c"}, + {file = "aiohttp-3.9.3-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:6b0e029353361f1746bac2e4cc19b32f972ec03f0f943b390c4ab3371840aabf"}, + {file = "aiohttp-3.9.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7cf5c9458e1e90e3c390c2639f1017a0379a99a94fdfad3a1fd966a2874bba52"}, + {file = "aiohttp-3.9.3-cp310-cp310-win32.whl", hash = "sha256:3e59c23c52765951b69ec45ddbbc9403a8761ee6f57253250c6e1536cacc758b"}, + {file = "aiohttp-3.9.3-cp310-cp310-win_amd64.whl", hash = "sha256:055ce4f74b82551678291473f66dc9fb9048a50d8324278751926ff0ae7715e5"}, + {file = "aiohttp-3.9.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6b88f9386ff1ad91ace19d2a1c0225896e28815ee09fc6a8932fded8cda97c3d"}, + {file = "aiohttp-3.9.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c46956ed82961e31557b6857a5ca153c67e5476972e5f7190015018760938da2"}, + {file = "aiohttp-3.9.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:07b837ef0d2f252f96009e9b8435ec1fef68ef8b1461933253d318748ec1acdc"}, + {file = "aiohttp-3.9.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dad46e6f620574b3b4801c68255492e0159d1712271cc99d8bdf35f2043ec266"}, + {file = "aiohttp-3.9.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5ed3e046ea7b14938112ccd53d91c1539af3e6679b222f9469981e3dac7ba1ce"}, + {file = "aiohttp-3.9.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:039df344b45ae0b34ac885ab5b53940b174530d4dd8a14ed8b0e2155b9dddccb"}, + {file = "aiohttp-3.9.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7943c414d3a8d9235f5f15c22ace69787c140c80b718dcd57caaade95f7cd93b"}, + {file = "aiohttp-3.9.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:84871a243359bb42c12728f04d181a389718710129b36b6aad0fc4655a7647d4"}, + {file = "aiohttp-3.9.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:5eafe2c065df5401ba06821b9a054d9cb2848867f3c59801b5d07a0be3a380ae"}, + {file = "aiohttp-3.9.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:9d3c9b50f19704552f23b4eaea1fc082fdd82c63429a6506446cbd8737823da3"}, + {file = "aiohttp-3.9.3-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:f033d80bc6283092613882dfe40419c6a6a1527e04fc69350e87a9df02bbc283"}, + {file = "aiohttp-3.9.3-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:2c895a656dd7e061b2fd6bb77d971cc38f2afc277229ce7dd3552de8313a483e"}, + {file = "aiohttp-3.9.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1f5a71d25cd8106eab05f8704cd9167b6e5187bcdf8f090a66c6d88b634802b4"}, + {file = "aiohttp-3.9.3-cp311-cp311-win32.whl", hash = "sha256:50fca156d718f8ced687a373f9e140c1bb765ca16e3d6f4fe116e3df7c05b2c5"}, + {file = "aiohttp-3.9.3-cp311-cp311-win_amd64.whl", hash = "sha256:5fe9ce6c09668063b8447f85d43b8d1c4e5d3d7e92c63173e6180b2ac5d46dd8"}, + {file = "aiohttp-3.9.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:38a19bc3b686ad55804ae931012f78f7a534cce165d089a2059f658f6c91fa60"}, + {file = "aiohttp-3.9.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:770d015888c2a598b377bd2f663adfd947d78c0124cfe7b959e1ef39f5b13869"}, + {file = "aiohttp-3.9.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ee43080e75fc92bf36219926c8e6de497f9b247301bbf88c5c7593d931426679"}, + {file = "aiohttp-3.9.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:52df73f14ed99cee84865b95a3d9e044f226320a87af208f068ecc33e0c35b96"}, + {file = "aiohttp-3.9.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dc9b311743a78043b26ffaeeb9715dc360335e5517832f5a8e339f8a43581e4d"}, + {file = "aiohttp-3.9.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b955ed993491f1a5da7f92e98d5dad3c1e14dc175f74517c4e610b1f2456fb11"}, + {file = "aiohttp-3.9.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:504b6981675ace64c28bf4a05a508af5cde526e36492c98916127f5a02354d53"}, + {file = "aiohttp-3.9.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a6fe5571784af92b6bc2fda8d1925cccdf24642d49546d3144948a6a1ed58ca5"}, + {file = "aiohttp-3.9.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ba39e9c8627edc56544c8628cc180d88605df3892beeb2b94c9bc857774848ca"}, + {file = "aiohttp-3.9.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:e5e46b578c0e9db71d04c4b506a2121c0cb371dd89af17a0586ff6769d4c58c1"}, + {file = "aiohttp-3.9.3-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:938a9653e1e0c592053f815f7028e41a3062e902095e5a7dc84617c87267ebd5"}, + {file = "aiohttp-3.9.3-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:c3452ea726c76e92f3b9fae4b34a151981a9ec0a4847a627c43d71a15ac32aa6"}, + {file = "aiohttp-3.9.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ff30218887e62209942f91ac1be902cc80cddb86bf00fbc6783b7a43b2bea26f"}, + {file = "aiohttp-3.9.3-cp312-cp312-win32.whl", hash = "sha256:38f307b41e0bea3294a9a2a87833191e4bcf89bb0365e83a8be3a58b31fb7f38"}, + {file = "aiohttp-3.9.3-cp312-cp312-win_amd64.whl", hash = "sha256:b791a3143681a520c0a17e26ae7465f1b6f99461a28019d1a2f425236e6eedb5"}, + {file = "aiohttp-3.9.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:0ed621426d961df79aa3b963ac7af0d40392956ffa9be022024cd16297b30c8c"}, + {file = "aiohttp-3.9.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7f46acd6a194287b7e41e87957bfe2ad1ad88318d447caf5b090012f2c5bb528"}, + {file = "aiohttp-3.9.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:feeb18a801aacb098220e2c3eea59a512362eb408d4afd0c242044c33ad6d542"}, + {file = "aiohttp-3.9.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f734e38fd8666f53da904c52a23ce517f1b07722118d750405af7e4123933511"}, + {file = "aiohttp-3.9.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b40670ec7e2156d8e57f70aec34a7216407848dfe6c693ef131ddf6e76feb672"}, + {file = "aiohttp-3.9.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fdd215b7b7fd4a53994f238d0f46b7ba4ac4c0adb12452beee724ddd0743ae5d"}, + {file = "aiohttp-3.9.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:017a21b0df49039c8f46ca0971b3a7fdc1f56741ab1240cb90ca408049766168"}, + {file = "aiohttp-3.9.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e99abf0bba688259a496f966211c49a514e65afa9b3073a1fcee08856e04425b"}, + {file = "aiohttp-3.9.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:648056db9a9fa565d3fa851880f99f45e3f9a771dd3ff3bb0c048ea83fb28194"}, + {file = "aiohttp-3.9.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:8aacb477dc26797ee089721536a292a664846489c49d3ef9725f992449eda5a8"}, + {file = "aiohttp-3.9.3-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:522a11c934ea660ff8953eda090dcd2154d367dec1ae3c540aff9f8a5c109ab4"}, + {file = "aiohttp-3.9.3-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:5bce0dc147ca85caa5d33debc4f4d65e8e8b5c97c7f9f660f215fa74fc49a321"}, + {file = "aiohttp-3.9.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:4b4af9f25b49a7be47c0972139e59ec0e8285c371049df1a63b6ca81fdd216a2"}, + {file = "aiohttp-3.9.3-cp38-cp38-win32.whl", hash = "sha256:298abd678033b8571995650ccee753d9458dfa0377be4dba91e4491da3f2be63"}, + {file = "aiohttp-3.9.3-cp38-cp38-win_amd64.whl", hash = "sha256:69361bfdca5468c0488d7017b9b1e5ce769d40b46a9f4a2eed26b78619e9396c"}, + {file = "aiohttp-3.9.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:0fa43c32d1643f518491d9d3a730f85f5bbaedcbd7fbcae27435bb8b7a061b29"}, + {file = "aiohttp-3.9.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:835a55b7ca49468aaaac0b217092dfdff370e6c215c9224c52f30daaa735c1c1"}, + {file = "aiohttp-3.9.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:06a9b2c8837d9a94fae16c6223acc14b4dfdff216ab9b7202e07a9a09541168f"}, + {file = "aiohttp-3.9.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:abf151955990d23f84205286938796c55ff11bbfb4ccfada8c9c83ae6b3c89a3"}, + {file = "aiohttp-3.9.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:59c26c95975f26e662ca78fdf543d4eeaef70e533a672b4113dd888bd2423caa"}, + {file = "aiohttp-3.9.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f95511dd5d0e05fd9728bac4096319f80615aaef4acbecb35a990afebe953b0e"}, + {file = "aiohttp-3.9.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:595f105710293e76b9dc09f52e0dd896bd064a79346234b521f6b968ffdd8e58"}, + {file = "aiohttp-3.9.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c7c8b816c2b5af5c8a436df44ca08258fc1a13b449393a91484225fcb7545533"}, + {file = "aiohttp-3.9.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f1088fa100bf46e7b398ffd9904f4808a0612e1d966b4aa43baa535d1b6341eb"}, + {file = "aiohttp-3.9.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f59dfe57bb1ec82ac0698ebfcdb7bcd0e99c255bd637ff613760d5f33e7c81b3"}, + {file = "aiohttp-3.9.3-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:361a1026c9dd4aba0109e4040e2aecf9884f5cfe1b1b1bd3d09419c205e2e53d"}, + {file = "aiohttp-3.9.3-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:363afe77cfcbe3a36353d8ea133e904b108feea505aa4792dad6585a8192c55a"}, + {file = "aiohttp-3.9.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8e2c45c208c62e955e8256949eb225bd8b66a4c9b6865729a786f2aa79b72e9d"}, + {file = "aiohttp-3.9.3-cp39-cp39-win32.whl", hash = "sha256:f7217af2e14da0856e082e96ff637f14ae45c10a5714b63c77f26d8884cf1051"}, + {file = "aiohttp-3.9.3-cp39-cp39-win_amd64.whl", hash = "sha256:27468897f628c627230dba07ec65dc8d0db566923c48f29e084ce382119802bc"}, + {file = "aiohttp-3.9.3.tar.gz", hash = "sha256:90842933e5d1ff760fae6caca4b2b3edba53ba8f4b71e95dacf2818a2aca06f7"}, +] + +[package.dependencies] +aiosignal = ">=1.1.2" +attrs = ">=17.3.0" +frozenlist = ">=1.1.1" +multidict = ">=4.5,<7.0" +yarl = ">=1.0,<2.0" + +[package.extras] +speedups = ["Brotli", "aiodns", "brotlicffi"] + +[[package]] +name = "aiohttp-json-rpc" +version = "0.13.3" +description = "Implementation JSON-RPC 2.0 server and client using aiohttp on top of websockets transport" +optional = false +python-versions = ">=3.5" +files = [ + {file = "aiohttp-json-rpc-0.13.3.tar.gz", hash = "sha256:6237a104478c22c6ef96c7227a01d6832597b414e4b79a52d85593356a169e99"}, + {file = "aiohttp_json_rpc-0.13.3-py3-none-any.whl", hash = "sha256:4fbd197aced61bd2df7ae3237ead7d3e08833c2ccf48b8581e1828c95ebee680"}, +] + +[package.dependencies] +aiohttp = ">=3,<4" + +[[package]] +name = "aiosignal" +version = "1.3.1" +description = "aiosignal: a list of registered asynchronous callbacks" +optional = false +python-versions = ">=3.7" +files = [ + {file = "aiosignal-1.3.1-py3-none-any.whl", hash = "sha256:f8376fb07dd1e86a584e4fcdec80b36b7f81aac666ebc724e2c090300dd83b17"}, + {file = "aiosignal-1.3.1.tar.gz", hash = "sha256:54cd96e15e1649b75d6c87526a6ff0b6c1b0dd3459f43d9ca11d48c339b68cfc"}, +] + +[package.dependencies] +frozenlist = ">=1.1.0" + +[[package]] +name = "apsw" +version = "3.45.2.0" +description = "Another Python SQLite Wrapper" +optional = false +python-versions = ">=3.8" +files = [ + {file = "apsw-3.45.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1873cf5edb291fddbad0bbfd193ee5ec6fc05ea3dbc39ab801a90c211673734e"}, + {file = "apsw-3.45.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e08849bdee202f536fe0e1da68f5cf94bf74e9981bbac6df4e60dd478da31aab"}, + {file = "apsw-3.45.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0ae4e74e5a208a78a8f289425f38bec4a4561b5cf97b854f35f28efeb00a45a6"}, + {file = "apsw-3.45.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:372f741aa038e188cc860fa5a76af63376b8673996fc5b7d2f9ed5f20002edd5"}, + {file = "apsw-3.45.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ae16d9dc225d297d48b4fdd96f51745f4233c38fa2a3b6bfffd7e43c9bd99e13"}, + {file = "apsw-3.45.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1cb2c450ce9d56965be213f432eb4a3f12cbee202a2cf9fe84c1a956e1516798"}, + {file = "apsw-3.45.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:c9c53f08af854768e3d2d4fb15ab2c869317a97ec8b722183904ee0cc7a00a3f"}, + {file = "apsw-3.45.2.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:13a8ebb90021b8c0812571477a0d1c12ef2d52ee1feec3ae5ad07e53b46c537c"}, + {file = "apsw-3.45.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b2cc8887247fdbcc9b935b7c4a2288a17fe85a30009798b65a886e57c08bcb76"}, + {file = "apsw-3.45.2.0-cp310-cp310-win32.whl", hash = "sha256:d755c164d593d822e4ff4e26e415a81a6dc0d9956883ec8c4a8900b4e4e15e97"}, + {file = "apsw-3.45.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:ff5a16c611a461bdb84b531d1ce70fc95d6e4b5a9d3b46a6367374f7ed351f1c"}, + {file = "apsw-3.45.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:967f25f8a7d296b2a4af105b1a8db3d5700d011eb22e91f4db39f833eca429b0"}, + {file = "apsw-3.45.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:919808b4abe466a66a3aacfb53b5db29e0e694f0b846edd3ce804abe829b88de"}, + {file = "apsw-3.45.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:858e09db02f44f40305d5199c1f4e6820d4083273f050d047c4c944481d24fca"}, + {file = "apsw-3.45.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cb886ad478f3bb9414e7e812f128cecb3601fc37f97e4f892c6f224edced0d9"}, + {file = "apsw-3.45.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1018ff485277e1b5adeca2a5470b760d9a5ca9a1720c8889678a9afbf8d51a77"}, + {file = "apsw-3.45.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c580467ef70e5618006dcae965783d1db4fb6016738ee7c6f610acecf9d42425"}, + {file = "apsw-3.45.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8f8baf12a21e017559528bf9159eb91cfa0209eba17356150c16d4a4223e95e1"}, + {file = "apsw-3.45.2.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:3e6aef31244dfaaee475eeece7d866cadad872c25d0df2158d64f6259cf8614f"}, + {file = "apsw-3.45.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:455182f76ba6caa105964ce38bfb523e58ef47a07a5854c4f77c7695c95cd42a"}, + {file = "apsw-3.45.2.0-cp311-cp311-win32.whl", hash = "sha256:16944708c503887c6cdedadf5ac79a25bdfa5a67b937a5d64d74cf42803606c8"}, + {file = "apsw-3.45.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:e94d007441e1df2c2c990c7985d39f7f1037758f02940ee987ecbcc1383402d8"}, + {file = "apsw-3.45.2.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f12f78b4ec5cdaea391673d7396bb4117c4ef6a2ad91287c66a06fe17f7e067d"}, + {file = "apsw-3.45.2.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5353c872476c79613511bdc0a60668d760a0dfeda2d56f2b5b616fc4a261fcb4"}, + {file = "apsw-3.45.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:94427f8cb4b37dc67d208c34faa37bed3be683ac181e0d4a9e007f23dda0f65e"}, + {file = "apsw-3.45.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7d6f0d1786574db07aa0fbfbfd4db75ae02942e16b0d6d2f20e4a7736c93375"}, + {file = "apsw-3.45.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5bd4b72c85e95d9eb2c93e78d27083df68fe9287a7be22eaacacebfa941c2ac4"}, + {file = "apsw-3.45.2.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:22e1c8e7a5b7244ec5a714cf5244c405198577a1e9eacc0ce5957974d4232498"}, + {file = "apsw-3.45.2.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:23b3ebddf63536382500562349d33f72310d340239085defbc9d6affe987007f"}, + {file = "apsw-3.45.2.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:f1620ca1eb6ceab90fd5bd3fb5b2d5449c09b63994292ca54efb1605118dfd0e"}, + {file = "apsw-3.45.2.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:7c968cc31104812de006cff832a9b29c15fa71ad0cf8c825d2e4e8393840e797"}, + {file = "apsw-3.45.2.0-cp312-cp312-win32.whl", hash = "sha256:3f96754fa0baa7933b769d3f782f73f3761bfdd581ff79f9ed117e33988daf5b"}, + {file = "apsw-3.45.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:cb081d1ab72b65ce104784460a3c07c1a3d7501f432570f912b81a4aabf5bbd1"}, + {file = "apsw-3.45.2.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6a8ab86d33043bf47ef584498b82b435cb9de79eee5f99737e0eaa056e1f6b62"}, + {file = "apsw-3.45.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:75f0e2be1aee0c8db1ed7e9cf41625df0cc971c780be0a598f25e14eb9863ab6"}, + {file = "apsw-3.45.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5ddf42eb2fc59aa59f720fc7b5df626907ff71b7b5d13dad16f4d201a376431f"}, + {file = "apsw-3.45.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:632f5b590059b9242e4a710082c50972b71916ee8f121051a7bbaed6bafbdc55"}, + {file = "apsw-3.45.2.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b400cd5cb4029e8f55a7526b10af680340c5dd7a75c6a175fccc6047602e393f"}, + {file = "apsw-3.45.2.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:34dd353b3351a421e12dd71bf0e3cded710a40c38acc88f64df11ba912a2b15d"}, + {file = "apsw-3.45.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:fe857ea56cf11a0256cd7dd7076a51c2cfb0c0ee07b8e85c7eb10c88e8fc2bae"}, + {file = "apsw-3.45.2.0-cp38-cp38-win32.whl", hash = "sha256:083ef86ba378a6ee2cd717c6d521554792e2f9eea157e2a0cf9a5059cfc43af2"}, + {file = "apsw-3.45.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:efe0f06b58b3b1a79dd86c2b6ef32feca9ca31baf8e8bcede08fb7a77b494431"}, + {file = "apsw-3.45.2.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:dce665254a76dc41fcce6bc22f9001fb1e84c7e8efeeb0591a9111e3225b4fb2"}, + {file = "apsw-3.45.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fd17728f715df34b976ad14e5dc712877e3313f963cb595c4b17f24022712253"}, + {file = "apsw-3.45.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6f6800583c5b6daa98f825fc27b534f5c312b9b125657aeb7e21ba9ee835617c"}, + {file = "apsw-3.45.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c8c20642b3b4ffdc9640c69ca66b1c557106d6a6caae5131758d9910d81e86d5"}, + {file = "apsw-3.45.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abdc314e4b4e6ce3fd1e027c452b5ac0f3d1326adf8f321c568c9384646ae93d"}, + {file = "apsw-3.45.2.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:26dea875572859c073cfa747f909c595604a0636149bf375e4f14a16da12aa33"}, + {file = "apsw-3.45.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:122c60f673804b79d08fc59c32e667ac82691ac0817151b8341a8b4b4272a16b"}, + {file = "apsw-3.45.2.0-cp39-cp39-win32.whl", hash = "sha256:24d001fcfe8a7decb92722d94a9f9e756564c65ba3806d4156ad827f4bdf9247"}, + {file = "apsw-3.45.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:01319f1332020407c0af54144c8100c0258add40ec4a661416b5261a0d2150f0"}, + {file = "apsw-3.45.2.0.tar.gz", hash = "sha256:4fe81f5e390969d08d3048f357a68b347316b8f09455ff4657d94c56acfa255c"}, +] + +[[package]] +name = "astroid" +version = "3.1.0" +description = "An abstract syntax tree for Python with inference support." +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "astroid-3.1.0-py3-none-any.whl", hash = "sha256:951798f922990137ac090c53af473db7ab4e70c770e6d7fae0cec59f74411819"}, + {file = "astroid-3.1.0.tar.gz", hash = "sha256:ac248253bfa4bd924a0de213707e7ebeeb3138abeb48d798784ead1e56d419d4"}, +] + +[[package]] +name = "attrs" +version = "23.2.0" +description = "Classes Without Boilerplate" +optional = false +python-versions = ">=3.7" +files = [ + {file = "attrs-23.2.0-py3-none-any.whl", hash = "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1"}, + {file = "attrs-23.2.0.tar.gz", hash = "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30"}, +] + +[package.extras] +cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] +dev = ["attrs[tests]", "pre-commit"] +docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] +tests = ["attrs[tests-no-zope]", "zope-interface"] +tests-mypy = ["mypy (>=1.6)", "pytest-mypy-plugins"] +tests-no-zope = ["attrs[tests-mypy]", "cloudpickle", "hypothesis", "pympler", "pytest (>=4.3.0)", "pytest-xdist[psutil]"] + +[[package]] +name = "babel" +version = "2.14.0" +description = "Internationalization utilities" +optional = false +python-versions = ">=3.7" +files = [ + {file = "Babel-2.14.0-py3-none-any.whl", hash = "sha256:efb1a25b7118e67ce3a259bed20545c29cb68be8ad2c784c83689981b7a57287"}, + {file = "Babel-2.14.0.tar.gz", hash = "sha256:6919867db036398ba21eb5c7a0f6b28ab8cbc3ae7a73a44ebe34ae74a4e7d363"}, +] + +[package.extras] +dev = ["freezegun (>=1.0,<2.0)", "pytest (>=6.0)", "pytest-cov"] + +[[package]] +name = "brotli" +version = "1.1.0" +description = "Python bindings for the Brotli compression library" +optional = false +python-versions = "*" +files = [ + {file = "Brotli-1.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e1140c64812cb9b06c922e77f1c26a75ec5e3f0fb2bf92cc8c58720dec276752"}, + {file = "Brotli-1.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c8fd5270e906eef71d4a8d19b7c6a43760c6abcfcc10c9101d14eb2357418de9"}, + {file = "Brotli-1.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1ae56aca0402a0f9a3431cddda62ad71666ca9d4dc3a10a142b9dce2e3c0cda3"}, + {file = "Brotli-1.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:43ce1b9935bfa1ede40028054d7f48b5469cd02733a365eec8a329ffd342915d"}, + {file = "Brotli-1.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:7c4855522edb2e6ae7fdb58e07c3ba9111e7621a8956f481c68d5d979c93032e"}, + {file = "Brotli-1.1.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:38025d9f30cf4634f8309c6874ef871b841eb3c347e90b0851f63d1ded5212da"}, + {file = "Brotli-1.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e6a904cb26bfefc2f0a6f240bdf5233be78cd2488900a2f846f3c3ac8489ab80"}, + {file = "Brotli-1.1.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a37b8f0391212d29b3a91a799c8e4a2855e0576911cdfb2515487e30e322253d"}, + {file = "Brotli-1.1.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:e84799f09591700a4154154cab9787452925578841a94321d5ee8fb9a9a328f0"}, + {file = "Brotli-1.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f66b5337fa213f1da0d9000bc8dc0cb5b896b726eefd9c6046f699b169c41b9e"}, + {file = "Brotli-1.1.0-cp310-cp310-win32.whl", hash = "sha256:be36e3d172dc816333f33520154d708a2657ea63762ec16b62ece02ab5e4daf2"}, + {file = "Brotli-1.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:0c6244521dda65ea562d5a69b9a26120769b7a9fb3db2fe9545935ed6735b128"}, + {file = "Brotli-1.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a3daabb76a78f829cafc365531c972016e4aa8d5b4bf60660ad8ecee19df7ccc"}, + {file = "Brotli-1.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c8146669223164fc87a7e3de9f81e9423c67a79d6b3447994dfb9c95da16e2d6"}, + {file = "Brotli-1.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:30924eb4c57903d5a7526b08ef4a584acc22ab1ffa085faceb521521d2de32dd"}, + {file = "Brotli-1.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ceb64bbc6eac5a140ca649003756940f8d6a7c444a68af170b3187623b43bebf"}, + {file = "Brotli-1.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a469274ad18dc0e4d316eefa616d1d0c2ff9da369af19fa6f3daa4f09671fd61"}, + {file = "Brotli-1.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:524f35912131cc2cabb00edfd8d573b07f2d9f21fa824bd3fb19725a9cf06327"}, + {file = "Brotli-1.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:5b3cc074004d968722f51e550b41a27be656ec48f8afaeeb45ebf65b561481dd"}, + {file = "Brotli-1.1.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:19c116e796420b0cee3da1ccec3b764ed2952ccfcc298b55a10e5610ad7885f9"}, + {file = "Brotli-1.1.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:510b5b1bfbe20e1a7b3baf5fed9e9451873559a976c1a78eebaa3b86c57b4265"}, + {file = "Brotli-1.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a1fd8a29719ccce974d523580987b7f8229aeace506952fa9ce1d53a033873c8"}, + {file = "Brotli-1.1.0-cp311-cp311-win32.whl", hash = "sha256:39da8adedf6942d76dc3e46653e52df937a3c4d6d18fdc94a7c29d263b1f5b50"}, + {file = "Brotli-1.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:aac0411d20e345dc0920bdec5548e438e999ff68d77564d5e9463a7ca9d3e7b1"}, + {file = "Brotli-1.1.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:316cc9b17edf613ac76b1f1f305d2a748f1b976b033b049a6ecdfd5612c70409"}, + {file = "Brotli-1.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:caf9ee9a5775f3111642d33b86237b05808dafcd6268faa492250e9b78046eb2"}, + {file = "Brotli-1.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:70051525001750221daa10907c77830bc889cb6d865cc0b813d9db7fefc21451"}, + {file = "Brotli-1.1.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7f4bf76817c14aa98cc6697ac02f3972cb8c3da93e9ef16b9c66573a68014f91"}, + {file = "Brotli-1.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d0c5516f0aed654134a2fc936325cc2e642f8a0e096d075209672eb321cff408"}, + {file = "Brotli-1.1.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6c3020404e0b5eefd7c9485ccf8393cfb75ec38ce75586e046573c9dc29967a0"}, + {file = "Brotli-1.1.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:4ed11165dd45ce798d99a136808a794a748d5dc38511303239d4e2363c0695dc"}, + {file = "Brotli-1.1.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:4093c631e96fdd49e0377a9c167bfd75b6d0bad2ace734c6eb20b348bc3ea180"}, + {file = "Brotli-1.1.0-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:7e4c4629ddad63006efa0ef968c8e4751c5868ff0b1c5c40f76524e894c50248"}, + {file = "Brotli-1.1.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:861bf317735688269936f755fa136a99d1ed526883859f86e41a5d43c61d8966"}, + {file = "Brotli-1.1.0-cp312-cp312-win32.whl", hash = "sha256:5f4d5ea15c9382135076d2fb28dde923352fe02951e66935a9efaac8f10e81b0"}, + {file = "Brotli-1.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:906bc3a79de8c4ae5b86d3d75a8b77e44404b0f4261714306e3ad248d8ab0951"}, + {file = "Brotli-1.1.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:a090ca607cbb6a34b0391776f0cb48062081f5f60ddcce5d11838e67a01928d1"}, + {file = "Brotli-1.1.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2de9d02f5bda03d27ede52e8cfe7b865b066fa49258cbab568720aa5be80a47d"}, + {file = "Brotli-1.1.0-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2333e30a5e00fe0fe55903c8832e08ee9c3b1382aacf4db26664a16528d51b4b"}, + {file = "Brotli-1.1.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4d4a848d1837973bf0f4b5e54e3bec977d99be36a7895c61abb659301b02c112"}, + {file = "Brotli-1.1.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:fdc3ff3bfccdc6b9cc7c342c03aa2400683f0cb891d46e94b64a197910dc4064"}, + {file = "Brotli-1.1.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:5eeb539606f18a0b232d4ba45adccde4125592f3f636a6182b4a8a436548b914"}, + {file = "Brotli-1.1.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:fd5f17ff8f14003595ab414e45fce13d073e0762394f957182e69035c9f3d7c2"}, + {file = "Brotli-1.1.0-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:069a121ac97412d1fe506da790b3e69f52254b9df4eb665cd42460c837193354"}, + {file = "Brotli-1.1.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:e93dfc1a1165e385cc8239fab7c036fb2cd8093728cbd85097b284d7b99249a2"}, + {file = "Brotli-1.1.0-cp36-cp36m-win32.whl", hash = "sha256:a599669fd7c47233438a56936988a2478685e74854088ef5293802123b5b2460"}, + {file = "Brotli-1.1.0-cp36-cp36m-win_amd64.whl", hash = "sha256:d143fd47fad1db3d7c27a1b1d66162e855b5d50a89666af46e1679c496e8e579"}, + {file = "Brotli-1.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:11d00ed0a83fa22d29bc6b64ef636c4552ebafcef57154b4ddd132f5638fbd1c"}, + {file = "Brotli-1.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f733d788519c7e3e71f0855c96618720f5d3d60c3cb829d8bbb722dddce37985"}, + {file = "Brotli-1.1.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:929811df5462e182b13920da56c6e0284af407d1de637d8e536c5cd00a7daf60"}, + {file = "Brotli-1.1.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0b63b949ff929fbc2d6d3ce0e924c9b93c9785d877a21a1b678877ffbbc4423a"}, + {file = "Brotli-1.1.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:d192f0f30804e55db0d0e0a35d83a9fead0e9a359a9ed0285dbacea60cc10a84"}, + {file = "Brotli-1.1.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:f296c40e23065d0d6650c4aefe7470d2a25fffda489bcc3eb66083f3ac9f6643"}, + {file = "Brotli-1.1.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:919e32f147ae93a09fe064d77d5ebf4e35502a8df75c29fb05788528e330fe74"}, + {file = "Brotli-1.1.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:23032ae55523cc7bccb4f6a0bf368cd25ad9bcdcc1990b64a647e7bbcce9cb5b"}, + {file = "Brotli-1.1.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:224e57f6eac61cc449f498cc5f0e1725ba2071a3d4f48d5d9dffba42db196438"}, + {file = "Brotli-1.1.0-cp37-cp37m-win32.whl", hash = "sha256:587ca6d3cef6e4e868102672d3bd9dc9698c309ba56d41c2b9c85bbb903cdb95"}, + {file = "Brotli-1.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:2954c1c23f81c2eaf0b0717d9380bd348578a94161a65b3a2afc62c86467dd68"}, + {file = "Brotli-1.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:efa8b278894b14d6da122a72fefcebc28445f2d3f880ac59d46c90f4c13be9a3"}, + {file = "Brotli-1.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:03d20af184290887bdea3f0f78c4f737d126c74dc2f3ccadf07e54ceca3bf208"}, + {file = "Brotli-1.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6172447e1b368dcbc458925e5ddaf9113477b0ed542df258d84fa28fc45ceea7"}, + {file = "Brotli-1.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a743e5a28af5f70f9c080380a5f908d4d21d40e8f0e0c8901604d15cfa9ba751"}, + {file = "Brotli-1.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0541e747cce78e24ea12d69176f6a7ddb690e62c425e01d31cc065e69ce55b48"}, + {file = "Brotli-1.1.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:cdbc1fc1bc0bff1cef838eafe581b55bfbffaed4ed0318b724d0b71d4d377619"}, + {file = "Brotli-1.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:890b5a14ce214389b2cc36ce82f3093f96f4cc730c1cffdbefff77a7c71f2a97"}, + {file = "Brotli-1.1.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:1ab4fbee0b2d9098c74f3057b2bc055a8bd92ccf02f65944a241b4349229185a"}, + {file = "Brotli-1.1.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:141bd4d93984070e097521ed07e2575b46f817d08f9fa42b16b9b5f27b5ac088"}, + {file = "Brotli-1.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:fce1473f3ccc4187f75b4690cfc922628aed4d3dd013d047f95a9b3919a86596"}, + {file = "Brotli-1.1.0-cp38-cp38-win32.whl", hash = "sha256:db85ecf4e609a48f4b29055f1e144231b90edc90af7481aa731ba2d059226b1b"}, + {file = "Brotli-1.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:3d7954194c36e304e1523f55d7042c59dc53ec20dd4e9ea9d151f1b62b4415c0"}, + {file = "Brotli-1.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5fb2ce4b8045c78ebbc7b8f3c15062e435d47e7393cc57c25115cfd49883747a"}, + {file = "Brotli-1.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7905193081db9bfa73b1219140b3d315831cbff0d8941f22da695832f0dd188f"}, + {file = "Brotli-1.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a77def80806c421b4b0af06f45d65a136e7ac0bdca3c09d9e2ea4e515367c7e9"}, + {file = "Brotli-1.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8dadd1314583ec0bf2d1379f7008ad627cd6336625d6679cf2f8e67081b83acf"}, + {file = "Brotli-1.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:901032ff242d479a0efa956d853d16875d42157f98951c0230f69e69f9c09bac"}, + {file = "Brotli-1.1.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:22fc2a8549ffe699bfba2256ab2ed0421a7b8fadff114a3d201794e45a9ff578"}, + {file = "Brotli-1.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ae15b066e5ad21366600ebec29a7ccbc86812ed267e4b28e860b8ca16a2bc474"}, + {file = "Brotli-1.1.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:949f3b7c29912693cee0afcf09acd6ebc04c57af949d9bf77d6101ebb61e388c"}, + {file = "Brotli-1.1.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:89f4988c7203739d48c6f806f1e87a1d96e0806d44f0fba61dba81392c9e474d"}, + {file = "Brotli-1.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:de6551e370ef19f8de1807d0a9aa2cdfdce2e85ce88b122fe9f6b2b076837e59"}, + {file = "Brotli-1.1.0-cp39-cp39-win32.whl", hash = "sha256:f0d8a7a6b5983c2496e364b969f0e526647a06b075d034f3297dc66f3b360c64"}, + {file = "Brotli-1.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:cdad5b9014d83ca68c25d2e9444e28e967ef16e80f6b436918c700c117a85467"}, + {file = "Brotli-1.1.0.tar.gz", hash = "sha256:81de08ac11bcb85841e440c13611c00b67d3bf82698314928d0b676362546724"}, +] + +[[package]] +name = "cairocffi" +version = "1.6.1" +description = "cffi-based cairo bindings for Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "cairocffi-1.6.1-py3-none-any.whl", hash = "sha256:aa78ee52b9069d7475eeac457389b6275aa92111895d78fbaa2202a52dac112e"}, + {file = "cairocffi-1.6.1.tar.gz", hash = "sha256:78e6bbe47357640c453d0be929fa49cd05cce2e1286f3d2a1ca9cbda7efdb8b7"}, +] + +[package.dependencies] +cffi = ">=1.1.0" + +[package.extras] +doc = ["sphinx", "sphinx_rtd_theme"] +test = ["flake8", "isort", "numpy", "pikepdf", "pytest"] +xcb = ["xcffib (>=1.4.0)"] + +[[package]] +name = "cairosvg" +version = "2.7.1" +description = "A Simple SVG Converter based on Cairo" +optional = false +python-versions = ">=3.5" +files = [ + {file = "CairoSVG-2.7.1-py3-none-any.whl", hash = "sha256:8a5222d4e6c3f86f1f7046b63246877a63b49923a1cd202184c3a634ef546b3b"}, + {file = "CairoSVG-2.7.1.tar.gz", hash = "sha256:432531d72347291b9a9ebfb6777026b607563fd8719c46ee742db0aef7271ba0"}, +] + +[package.dependencies] +cairocffi = "*" +cssselect2 = "*" +defusedxml = "*" +pillow = "*" +tinycss2 = "*" + +[package.extras] +doc = ["sphinx", "sphinx-rtd-theme"] +test = ["flake8", "isort", "pytest"] + +[[package]] +name = "certifi" +version = "2024.2.2" +description = "Python package for providing Mozilla's CA Bundle." +optional = false +python-versions = ">=3.6" +files = [ + {file = "certifi-2024.2.2-py3-none-any.whl", hash = "sha256:dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1"}, + {file = "certifi-2024.2.2.tar.gz", hash = "sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f"}, +] + +[[package]] +name = "cffi" +version = "1.16.0" +description = "Foreign Function Interface for Python calling C code." +optional = false +python-versions = ">=3.8" +files = [ + {file = "cffi-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088"}, + {file = "cffi-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614"}, + {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743"}, + {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d"}, + {file = "cffi-1.16.0-cp310-cp310-win32.whl", hash = "sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a"}, + {file = "cffi-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1"}, + {file = "cffi-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404"}, + {file = "cffi-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e"}, + {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc"}, + {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb"}, + {file = "cffi-1.16.0-cp311-cp311-win32.whl", hash = "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab"}, + {file = "cffi-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba"}, + {file = "cffi-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956"}, + {file = "cffi-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969"}, + {file = "cffi-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520"}, + {file = "cffi-1.16.0-cp312-cp312-win32.whl", hash = "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b"}, + {file = "cffi-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235"}, + {file = "cffi-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324"}, + {file = "cffi-1.16.0-cp38-cp38-win32.whl", hash = "sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a"}, + {file = "cffi-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36"}, + {file = "cffi-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed"}, + {file = "cffi-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098"}, + {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000"}, + {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe"}, + {file = "cffi-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4"}, + {file = "cffi-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8"}, + {file = "cffi-1.16.0.tar.gz", hash = "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0"}, +] + +[package.dependencies] +pycparser = "*" + +[[package]] +name = "charset-normalizer" +version = "3.3.2" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, + {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, +] + +[[package]] +name = "click" +version = "8.1.7" +description = "Composable command line interface toolkit" +optional = false +python-versions = ">=3.7" +files = [ + {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, + {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "contextlib2" +version = "21.6.0" +description = "Backports and enhancements for the contextlib module" +optional = false +python-versions = ">=3.6" +files = [ + {file = "contextlib2-21.6.0-py2.py3-none-any.whl", hash = "sha256:3fbdb64466afd23abaf6c977627b75b6139a5a3e8ce38405c5b413aed7a0471f"}, + {file = "contextlib2-21.6.0.tar.gz", hash = "sha256:ab1e2bfe1d01d968e1b7e8d9023bc51ef3509bba217bb730cee3827e1ee82869"}, +] + +[[package]] +name = "cssselect2" +version = "0.7.0" +description = "CSS selectors for Python ElementTree" +optional = false +python-versions = ">=3.7" +files = [ + {file = "cssselect2-0.7.0-py3-none-any.whl", hash = "sha256:fd23a65bfd444595913f02fc71f6b286c29261e354c41d722ca7a261a49b5969"}, + {file = "cssselect2-0.7.0.tar.gz", hash = "sha256:1ccd984dab89fc68955043aca4e1b03e0cf29cad9880f6e28e3ba7a74b14aa5a"}, +] + +[package.dependencies] +tinycss2 = "*" +webencodings = "*" + +[package.extras] +doc = ["sphinx", "sphinx_rtd_theme"] +test = ["flake8", "isort", "pytest"] + +[[package]] +name = "defusedxml" +version = "0.7.1" +description = "XML bomb protection for Python stdlib modules" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61"}, + {file = "defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69"}, +] + +[[package]] +name = "dill" +version = "0.3.8" +description = "serialize all of Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "dill-0.3.8-py3-none-any.whl", hash = "sha256:c36ca9ffb54365bdd2f8eb3eff7d2a21237f8452b57ace88b1ac615b7e815bd7"}, + {file = "dill-0.3.8.tar.gz", hash = "sha256:3ebe3c479ad625c4553aca177444d89b486b1d84982eeacded644afc0cf797ca"}, +] + +[package.extras] +graph = ["objgraph (>=1.7.2)"] +profile = ["gprof2dot (>=2022.7.29)"] + +[[package]] +name = "discord-py" +version = "2.3.2" +description = "A Python wrapper for the Discord API" +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "discord.py-2.3.2-py3-none-any.whl", hash = "sha256:9da4679fc3cb10c64b388284700dc998663e0e57328283bbfcfc2525ec5960a6"}, + {file = "discord.py-2.3.2.tar.gz", hash = "sha256:4560f70f2eddba7e83370ecebd237ac09fbb4980dc66507482b0c0e5b8f76b9c"}, +] + +[package.dependencies] +aiohttp = ">=3.7.4,<4" + +[package.extras] +docs = ["sphinx (==4.4.0)", "sphinxcontrib-trio (==1.1.2)", "sphinxcontrib-websupport", "typing-extensions (>=4.3,<5)"] +speed = ["Brotli", "aiodns (>=1.1)", "cchardet (==2.1.7)", "orjson (>=3.5.4)"] +test = ["coverage[toml]", "pytest", "pytest-asyncio", "pytest-cov", "pytest-mock", "typing-extensions (>=4.3,<5)"] +voice = ["PyNaCl (>=1.3.0,<1.6)"] + +[[package]] +name = "distro" +version = "1.9.0" +description = "Distro - an OS platform information API" +optional = false +python-versions = ">=3.6" +files = [ + {file = "distro-1.9.0-py3-none-any.whl", hash = "sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2"}, + {file = "distro-1.9.0.tar.gz", hash = "sha256:2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed"}, +] + +[[package]] +name = "frozenlist" +version = "1.4.1" +description = "A list-like structure which implements collections.abc.MutableSequence" +optional = false +python-versions = ">=3.8" +files = [ + {file = "frozenlist-1.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f9aa1878d1083b276b0196f2dfbe00c9b7e752475ed3b682025ff20c1c1f51ac"}, + {file = "frozenlist-1.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:29acab3f66f0f24674b7dc4736477bcd4bc3ad4b896f5f45379a67bce8b96868"}, + {file = "frozenlist-1.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:74fb4bee6880b529a0c6560885fce4dc95936920f9f20f53d99a213f7bf66776"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:590344787a90ae57d62511dd7c736ed56b428f04cd8c161fcc5e7232c130c69a"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:068b63f23b17df8569b7fdca5517edef76171cf3897eb68beb01341131fbd2ad"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c849d495bf5154cd8da18a9eb15db127d4dba2968d88831aff6f0331ea9bd4c"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9750cc7fe1ae3b1611bb8cfc3f9ec11d532244235d75901fb6b8e42ce9229dfe"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9b2de4cf0cdd5bd2dee4c4f63a653c61d2408055ab77b151c1957f221cabf2a"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0633c8d5337cb5c77acbccc6357ac49a1770b8c487e5b3505c57b949b4b82e98"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:27657df69e8801be6c3638054e202a135c7f299267f1a55ed3a598934f6c0d75"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:f9a3ea26252bd92f570600098783d1371354d89d5f6b7dfd87359d669f2109b5"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:4f57dab5fe3407b6c0c1cc907ac98e8a189f9e418f3b6e54d65a718aaafe3950"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e02a0e11cf6597299b9f3bbd3f93d79217cb90cfd1411aec33848b13f5c656cc"}, + {file = "frozenlist-1.4.1-cp310-cp310-win32.whl", hash = "sha256:a828c57f00f729620a442881cc60e57cfcec6842ba38e1b19fd3e47ac0ff8dc1"}, + {file = "frozenlist-1.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:f56e2333dda1fe0f909e7cc59f021eba0d2307bc6f012a1ccf2beca6ba362439"}, + {file = "frozenlist-1.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a0cb6f11204443f27a1628b0e460f37fb30f624be6051d490fa7d7e26d4af3d0"}, + {file = "frozenlist-1.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b46c8ae3a8f1f41a0d2ef350c0b6e65822d80772fe46b653ab6b6274f61d4a49"}, + {file = "frozenlist-1.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fde5bd59ab5357e3853313127f4d3565fc7dad314a74d7b5d43c22c6a5ed2ced"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:722e1124aec435320ae01ee3ac7bec11a5d47f25d0ed6328f2273d287bc3abb0"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2471c201b70d58a0f0c1f91261542a03d9a5e088ed3dc6c160d614c01649c106"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c757a9dd70d72b076d6f68efdbb9bc943665ae954dad2801b874c8c69e185068"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f146e0911cb2f1da549fc58fc7bcd2b836a44b79ef871980d605ec392ff6b0d2"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f9c515e7914626b2a2e1e311794b4c35720a0be87af52b79ff8e1429fc25f19"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c302220494f5c1ebeb0912ea782bcd5e2f8308037b3c7553fad0e48ebad6ad82"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:442acde1e068288a4ba7acfe05f5f343e19fac87bfc96d89eb886b0363e977ec"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:1b280e6507ea8a4fa0c0a7150b4e526a8d113989e28eaaef946cc77ffd7efc0a"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:fe1a06da377e3a1062ae5fe0926e12b84eceb8a50b350ddca72dc85015873f74"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:db9e724bebd621d9beca794f2a4ff1d26eed5965b004a97f1f1685a173b869c2"}, + {file = "frozenlist-1.4.1-cp311-cp311-win32.whl", hash = "sha256:e774d53b1a477a67838a904131c4b0eef6b3d8a651f8b138b04f748fccfefe17"}, + {file = "frozenlist-1.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:fb3c2db03683b5767dedb5769b8a40ebb47d6f7f45b1b3e3b4b51ec8ad9d9825"}, + {file = "frozenlist-1.4.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:1979bc0aeb89b33b588c51c54ab0161791149f2461ea7c7c946d95d5f93b56ae"}, + {file = "frozenlist-1.4.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:cc7b01b3754ea68a62bd77ce6020afaffb44a590c2289089289363472d13aedb"}, + {file = "frozenlist-1.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c9c92be9fd329ac801cc420e08452b70e7aeab94ea4233a4804f0915c14eba9b"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c3894db91f5a489fc8fa6a9991820f368f0b3cbdb9cd8849547ccfab3392d86"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ba60bb19387e13597fb059f32cd4d59445d7b18b69a745b8f8e5db0346f33480"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8aefbba5f69d42246543407ed2461db31006b0f76c4e32dfd6f42215a2c41d09"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:780d3a35680ced9ce682fbcf4cb9c2bad3136eeff760ab33707b71db84664e3a"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9acbb16f06fe7f52f441bb6f413ebae6c37baa6ef9edd49cdd567216da8600cd"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:23b701e65c7b36e4bf15546a89279bd4d8675faabc287d06bbcfac7d3c33e1e6"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:3e0153a805a98f5ada7e09826255ba99fb4f7524bb81bf6b47fb702666484ae1"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:dd9b1baec094d91bf36ec729445f7769d0d0cf6b64d04d86e45baf89e2b9059b"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:1a4471094e146b6790f61b98616ab8e44f72661879cc63fa1049d13ef711e71e"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5667ed53d68d91920defdf4035d1cdaa3c3121dc0b113255124bcfada1cfa1b8"}, + {file = "frozenlist-1.4.1-cp312-cp312-win32.whl", hash = "sha256:beee944ae828747fd7cb216a70f120767fc9f4f00bacae8543c14a6831673f89"}, + {file = "frozenlist-1.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:64536573d0a2cb6e625cf309984e2d873979709f2cf22839bf2d61790b448ad5"}, + {file = "frozenlist-1.4.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:20b51fa3f588ff2fe658663db52a41a4f7aa6c04f6201449c6c7c476bd255c0d"}, + {file = "frozenlist-1.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:410478a0c562d1a5bcc2f7ea448359fcb050ed48b3c6f6f4f18c313a9bdb1826"}, + {file = "frozenlist-1.4.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c6321c9efe29975232da3bd0af0ad216800a47e93d763ce64f291917a381b8eb"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48f6a4533887e189dae092f1cf981f2e3885175f7a0f33c91fb5b7b682b6bab6"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6eb73fa5426ea69ee0e012fb59cdc76a15b1283d6e32e4f8dc4482ec67d1194d"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fbeb989b5cc29e8daf7f976b421c220f1b8c731cbf22b9130d8815418ea45887"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:32453c1de775c889eb4e22f1197fe3bdfe457d16476ea407472b9442e6295f7a"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:693945278a31f2086d9bf3df0fe8254bbeaef1fe71e1351c3bd730aa7d31c41b"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:1d0ce09d36d53bbbe566fe296965b23b961764c0bcf3ce2fa45f463745c04701"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3a670dc61eb0d0eb7080890c13de3066790f9049b47b0de04007090807c776b0"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:dca69045298ce5c11fd539682cff879cc1e664c245d1c64da929813e54241d11"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:a06339f38e9ed3a64e4c4e43aec7f59084033647f908e4259d279a52d3757d09"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b7f2f9f912dca3934c1baec2e4585a674ef16fe00218d833856408c48d5beee7"}, + {file = "frozenlist-1.4.1-cp38-cp38-win32.whl", hash = "sha256:e7004be74cbb7d9f34553a5ce5fb08be14fb33bc86f332fb71cbe5216362a497"}, + {file = "frozenlist-1.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:5a7d70357e7cee13f470c7883a063aae5fe209a493c57d86eb7f5a6f910fae09"}, + {file = "frozenlist-1.4.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:bfa4a17e17ce9abf47a74ae02f32d014c5e9404b6d9ac7f729e01562bbee601e"}, + {file = "frozenlist-1.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b7e3ed87d4138356775346e6845cccbe66cd9e207f3cd11d2f0b9fd13681359d"}, + {file = "frozenlist-1.4.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c99169d4ff810155ca50b4da3b075cbde79752443117d89429595c2e8e37fed8"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edb678da49d9f72c9f6c609fbe41a5dfb9a9282f9e6a2253d5a91e0fc382d7c0"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6db4667b187a6742b33afbbaf05a7bc551ffcf1ced0000a571aedbb4aa42fc7b"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55fdc093b5a3cb41d420884cdaf37a1e74c3c37a31f46e66286d9145d2063bd0"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82e8211d69a4f4bc360ea22cd6555f8e61a1bd211d1d5d39d3d228b48c83a897"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89aa2c2eeb20957be2d950b85974b30a01a762f3308cd02bb15e1ad632e22dc7"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9d3e0c25a2350080e9319724dede4f31f43a6c9779be48021a7f4ebde8b2d742"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7268252af60904bf52c26173cbadc3a071cece75f873705419c8681f24d3edea"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:0c250a29735d4f15321007fb02865f0e6b6a41a6b88f1f523ca1596ab5f50bd5"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:96ec70beabbd3b10e8bfe52616a13561e58fe84c0101dd031dc78f250d5128b9"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:23b2d7679b73fe0e5a4560b672a39f98dfc6f60df63823b0a9970525325b95f6"}, + {file = "frozenlist-1.4.1-cp39-cp39-win32.whl", hash = "sha256:a7496bfe1da7fb1a4e1cc23bb67c58fab69311cc7d32b5a99c2007b4b2a0e932"}, + {file = "frozenlist-1.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:e6a20a581f9ce92d389a8c7d7c3dd47c81fd5d6e655c8dddf341e14aa48659d0"}, + {file = "frozenlist-1.4.1-py3-none-any.whl", hash = "sha256:04ced3e6a46b4cfffe20f9ae482818e34eba9b5fb0ce4056e4cc9b6e212d09b7"}, + {file = "frozenlist-1.4.1.tar.gz", hash = "sha256:c037a86e8513059a2613aaba4d817bb90b9d9b6b69aace3ce9c877e8c8ed402b"}, +] + +[[package]] +name = "ghp-import" +version = "2.1.0" +description = "Copy your docs directly to the gh-pages branch." +optional = false +python-versions = "*" +files = [ + {file = "ghp-import-2.1.0.tar.gz", hash = "sha256:9c535c4c61193c2df8871222567d7fd7e5014d835f97dc7b7439069e2413d343"}, + {file = "ghp_import-2.1.0-py3-none-any.whl", hash = "sha256:8337dd7b50877f163d4c0289bc1f1c7f127550241988d568c1db512c4324a619"}, +] + +[package.dependencies] +python-dateutil = ">=2.8.1" + +[package.extras] +dev = ["flake8", "markdown", "twine", "wheel"] + +[[package]] +name = "gitdb" +version = "4.0.11" +description = "Git Object Database" +optional = false +python-versions = ">=3.7" +files = [ + {file = "gitdb-4.0.11-py3-none-any.whl", hash = "sha256:81a3407ddd2ee8df444cbacea00e2d038e40150acfa3001696fe0dcf1d3adfa4"}, + {file = "gitdb-4.0.11.tar.gz", hash = "sha256:bf5421126136d6d0af55bc1e7c1af1c397a34f5b7bd79e776cd3e89785c2b04b"}, +] + +[package.dependencies] +smmap = ">=3.0.1,<6" + +[[package]] +name = "gitpython" +version = "3.1.42" +description = "GitPython is a Python library used to interact with Git repositories" +optional = false +python-versions = ">=3.7" +files = [ + {file = "GitPython-3.1.42-py3-none-any.whl", hash = "sha256:1bf9cd7c9e7255f77778ea54359e54ac22a72a5b51288c457c881057b7bb9ecd"}, + {file = "GitPython-3.1.42.tar.gz", hash = "sha256:2d99869e0fef71a73cbd242528105af1d6c1b108c60dfabd994bf292f76c3ceb"}, +] + +[package.dependencies] +gitdb = ">=4.0.1,<5" + +[package.extras] +test = ["black", "coverage[toml]", "ddt (>=1.1.1,!=1.4.3)", "mock", "mypy", "pre-commit", "pytest (>=7.3.1)", "pytest-cov", "pytest-instafail", "pytest-mock", "pytest-sugar"] + +[[package]] +name = "griffe" +version = "0.42.1" +description = "Signatures for entire Python programs. Extract the structure, the frame, the skeleton of your project, to generate API documentation or find breaking changes in your API." +optional = false +python-versions = ">=3.8" +files = [ + {file = "griffe-0.42.1-py3-none-any.whl", hash = "sha256:7e805e35617601355edcac0d3511cedc1ed0cb1f7645e2d336ae4b05bbae7b3b"}, + {file = "griffe-0.42.1.tar.gz", hash = "sha256:57046131384043ed078692b85d86b76568a686266cc036b9b56b704466f803ce"}, +] + +[package.dependencies] +colorama = ">=0.4" + +[[package]] +name = "idna" +version = "3.6" +description = "Internationalized Domain Names in Applications (IDNA)" +optional = false +python-versions = ">=3.5" +files = [ + {file = "idna-3.6-py3-none-any.whl", hash = "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f"}, + {file = "idna-3.6.tar.gz", hash = "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca"}, +] + +[[package]] +name = "isort" +version = "5.13.2" +description = "A Python utility / library to sort Python imports." +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "isort-5.13.2-py3-none-any.whl", hash = "sha256:8ca5e72a8d85860d5a3fa69b8745237f2939afe12dbf656afbcb47fe72d947a6"}, + {file = "isort-5.13.2.tar.gz", hash = "sha256:48fdfcb9face5d58a4f6dde2e72a1fb8dcaf8ab26f95ab49fab84c2ddefb0109"}, +] + +[package.extras] +colors = ["colorama (>=0.4.6)"] + +[[package]] +name = "jinja2" +version = "3.1.3" +description = "A very fast and expressive template engine." +optional = false +python-versions = ">=3.7" +files = [ + {file = "Jinja2-3.1.3-py3-none-any.whl", hash = "sha256:7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa"}, + {file = "Jinja2-3.1.3.tar.gz", hash = "sha256:ac8bd6544d4bb2c9792bf3a159e80bba8fda7f07e81bc3aed565432d5925ba90"}, +] + +[package.dependencies] +MarkupSafe = ">=2.0" + +[package.extras] +i18n = ["Babel (>=2.7)"] + +[[package]] +name = "markdown" +version = "3.6" +description = "Python implementation of John Gruber's Markdown." +optional = false +python-versions = ">=3.8" +files = [ + {file = "Markdown-3.6-py3-none-any.whl", hash = "sha256:48f276f4d8cfb8ce6527c8f79e2ee29708508bf4d40aa410fbc3b4ee832c850f"}, + {file = "Markdown-3.6.tar.gz", hash = "sha256:ed4f41f6daecbeeb96e576ce414c41d2d876daa9a16cb35fa8ed8c2ddfad0224"}, +] + +[package.extras] +docs = ["mdx-gh-links (>=0.2)", "mkdocs (>=1.5)", "mkdocs-gen-files", "mkdocs-literate-nav", "mkdocs-nature (>=0.6)", "mkdocs-section-index", "mkdocstrings[python]"] +testing = ["coverage", "pyyaml"] + +[[package]] +name = "markdown-it-py" +version = "3.0.0" +description = "Python port of markdown-it. Markdown parsing, done right!" +optional = false +python-versions = ">=3.8" +files = [ + {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"}, + {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"}, +] + +[package.dependencies] +mdurl = ">=0.1,<1.0" + +[package.extras] +benchmarking = ["psutil", "pytest", "pytest-benchmark"] +code-style = ["pre-commit (>=3.0,<4.0)"] +compare = ["commonmark (>=0.9,<1.0)", "markdown (>=3.4,<4.0)", "mistletoe (>=1.0,<2.0)", "mistune (>=2.0,<3.0)", "panflute (>=2.3,<3.0)"] +linkify = ["linkify-it-py (>=1,<3)"] +plugins = ["mdit-py-plugins"] +profiling = ["gprof2dot"] +rtd = ["jupyter_sphinx", "mdit-py-plugins", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"] +testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] + +[[package]] +name = "markupsafe" +version = "2.1.5" +description = "Safely add untrusted strings to HTML/XML markup." +optional = false +python-versions = ">=3.7" +files = [ + {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-win32.whl", hash = "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-win32.whl", hash = "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-win_amd64.whl", hash = "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-win32.whl", hash = "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-win_amd64.whl", hash = "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-win32.whl", hash = "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5"}, + {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"}, +] + +[[package]] +name = "mccabe" +version = "0.7.0" +description = "McCabe checker, plugin for flake8" +optional = false +python-versions = ">=3.6" +files = [ + {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, + {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, +] + +[[package]] +name = "mdurl" +version = "0.1.2" +description = "Markdown URL utilities" +optional = false +python-versions = ">=3.7" +files = [ + {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, + {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, +] + +[[package]] +name = "mergedeep" +version = "1.3.4" +description = "A deep merge function for 🐍." +optional = false +python-versions = ">=3.6" +files = [ + {file = "mergedeep-1.3.4-py3-none-any.whl", hash = "sha256:70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307"}, + {file = "mergedeep-1.3.4.tar.gz", hash = "sha256:0096d52e9dad9939c3d975a774666af186eda617e6ca84df4c94dec30004f2a8"}, +] + +[[package]] +name = "mkdocs" +version = "1.5.3" +description = "Project documentation with Markdown." +optional = false +python-versions = ">=3.7" +files = [ + {file = "mkdocs-1.5.3-py3-none-any.whl", hash = "sha256:3b3a78e736b31158d64dbb2f8ba29bd46a379d0c6e324c2246c3bc3d2189cfc1"}, + {file = "mkdocs-1.5.3.tar.gz", hash = "sha256:eb7c99214dcb945313ba30426c2451b735992c73c2e10838f76d09e39ff4d0e2"}, +] + +[package.dependencies] +click = ">=7.0" +colorama = {version = ">=0.4", markers = "platform_system == \"Windows\""} +ghp-import = ">=1.0" +jinja2 = ">=2.11.1" +markdown = ">=3.2.1" +markupsafe = ">=2.0.1" +mergedeep = ">=1.3.4" +packaging = ">=20.5" +pathspec = ">=0.11.1" +platformdirs = ">=2.2.0" +pyyaml = ">=5.1" +pyyaml-env-tag = ">=0.1" +watchdog = ">=2.0" + +[package.extras] +i18n = ["babel (>=2.9.0)"] +min-versions = ["babel (==2.9.0)", "click (==7.0)", "colorama (==0.4)", "ghp-import (==1.0)", "importlib-metadata (==4.3)", "jinja2 (==2.11.1)", "markdown (==3.2.1)", "markupsafe (==2.0.1)", "mergedeep (==1.3.4)", "packaging (==20.5)", "pathspec (==0.11.1)", "platformdirs (==2.2.0)", "pyyaml (==5.1)", "pyyaml-env-tag (==0.1)", "typing-extensions (==3.10)", "watchdog (==2.0)"] + +[[package]] +name = "mkdocs-autorefs" +version = "1.0.1" +description = "Automatically link across pages in MkDocs." +optional = false +python-versions = ">=3.8" +files = [ + {file = "mkdocs_autorefs-1.0.1-py3-none-any.whl", hash = "sha256:aacdfae1ab197780fb7a2dac92ad8a3d8f7ca8049a9cbe56a4218cd52e8da570"}, + {file = "mkdocs_autorefs-1.0.1.tar.gz", hash = "sha256:f684edf847eced40b570b57846b15f0bf57fb93ac2c510450775dcf16accb971"}, +] + +[package.dependencies] +Markdown = ">=3.3" +markupsafe = ">=2.0.1" +mkdocs = ">=1.1" + +[[package]] +name = "mkdocs-git-authors-plugin" +version = "0.7.2" +description = "Mkdocs plugin to display git authors of a page" +optional = false +python-versions = ">=3.7" +files = [ + {file = "mkdocs-git-authors-plugin-0.7.2.tar.gz", hash = "sha256:f541730e4cabdafa0ac758c94d28ba5e8ddca4c859e5de4c89f1226cb6ccd0ad"}, + {file = "mkdocs_git_authors_plugin-0.7.2-py3-none-any.whl", hash = "sha256:c8a2784a867db79ad3b477a96ee96875d17b09192b6d3be71f08df25afff76c4"}, +] + +[package.dependencies] +mkdocs = ">=1.0" + +[[package]] +name = "mkdocs-git-revision-date-localized-plugin" +version = "1.2.2" +description = "Mkdocs plugin that enables displaying the localized date of the last git modification of a markdown file." +optional = false +python-versions = ">=3.6" +files = [ + {file = "mkdocs-git-revision-date-localized-plugin-1.2.2.tar.gz", hash = "sha256:0c43a9aac1fa69df99a823f833cc223bac9967b60d5261a857761c7c6e3b30de"}, + {file = "mkdocs_git_revision_date_localized_plugin-1.2.2-py3-none-any.whl", hash = "sha256:85c7fe9ab06e7a63c4e522c26fee8b51d357cb8cbe605064501ad80f4f31cb94"}, +] + +[package.dependencies] +babel = ">=2.7.0" +GitPython = "*" +mkdocs = ">=1.0" +pytz = "*" + +[[package]] +name = "mkdocs-material" +version = "9.5.15" +description = "Documentation that simply works" +optional = false +python-versions = ">=3.8" +files = [ + {file = "mkdocs_material-9.5.15-py3-none-any.whl", hash = "sha256:e5c96dec3d19491de49ca643fc1dbb92b278e43cdb816c775bc47db77d9b62fb"}, + {file = "mkdocs_material-9.5.15.tar.gz", hash = "sha256:39f03cca45e82bf54eb7456b5a18bd252eabfdd67f237a229471484a0a4d4635"}, +] + +[package.dependencies] +babel = ">=2.10,<3.0" +cairosvg = {version = ">=2.6,<3.0", optional = true, markers = "extra == \"imaging\""} +colorama = ">=0.4,<1.0" +jinja2 = ">=3.0,<4.0" +markdown = ">=3.2,<4.0" +mkdocs = ">=1.5.3,<1.6.0" +mkdocs-material-extensions = ">=1.3,<2.0" +paginate = ">=0.5,<1.0" +pillow = {version = ">=10.2,<11.0", optional = true, markers = "extra == \"imaging\""} +pygments = ">=2.16,<3.0" +pymdown-extensions = ">=10.2,<11.0" +regex = ">=2022.4" +requests = ">=2.26,<3.0" + +[package.extras] +git = ["mkdocs-git-committers-plugin-2 (>=1.1,<2.0)", "mkdocs-git-revision-date-localized-plugin (>=1.2.4,<2.0)"] +imaging = ["cairosvg (>=2.6,<3.0)", "pillow (>=10.2,<11.0)"] +recommended = ["mkdocs-minify-plugin (>=0.7,<1.0)", "mkdocs-redirects (>=1.2,<2.0)", "mkdocs-rss-plugin (>=1.6,<2.0)"] + +[[package]] +name = "mkdocs-material-extensions" +version = "1.3.1" +description = "Extension pack for Python Markdown and MkDocs Material." +optional = false +python-versions = ">=3.8" +files = [ + {file = "mkdocs_material_extensions-1.3.1-py3-none-any.whl", hash = "sha256:adff8b62700b25cb77b53358dad940f3ef973dd6db797907c49e3c2ef3ab4e31"}, + {file = "mkdocs_material_extensions-1.3.1.tar.gz", hash = "sha256:10c9511cea88f568257f960358a467d12b970e1f7b2c0e5fb2bb48cab1928443"}, +] + +[[package]] +name = "mkdocs-redirects" +version = "1.2.1" +description = "A MkDocs plugin for dynamic page redirects to prevent broken links." +optional = false +python-versions = ">=3.6" +files = [ + {file = "mkdocs-redirects-1.2.1.tar.gz", hash = "sha256:9420066d70e2a6bb357adf86e67023dcdca1857f97f07c7fe450f8f1fb42f861"}, +] + +[package.dependencies] +mkdocs = ">=1.1.1" + +[package.extras] +dev = ["autoflake", "black", "isort", "pytest", "twine (>=1.13.0)"] +release = ["twine (>=1.13.0)"] +test = ["autoflake", "black", "isort", "pytest"] + +[[package]] +name = "mkdocstrings" +version = "0.24.0" +description = "Automatic documentation from sources, for MkDocs." +optional = false +python-versions = ">=3.8" +files = [ + {file = "mkdocstrings-0.24.0-py3-none-any.whl", hash = "sha256:f4908560c10f587326d8f5165d1908817b2e280bbf707607f601c996366a2264"}, + {file = "mkdocstrings-0.24.0.tar.gz", hash = "sha256:222b1165be41257b494a9d29b14135d2b7ca43f38161d5b10caae03b87bd4f7e"}, +] + +[package.dependencies] +click = ">=7.0" +Jinja2 = ">=2.11.1" +Markdown = ">=3.3" +MarkupSafe = ">=1.1" +mkdocs = ">=1.4" +mkdocs-autorefs = ">=0.3.1" +mkdocstrings-python = {version = ">=0.5.2", optional = true, markers = "extra == \"python\""} +platformdirs = ">=2.2.0" +pymdown-extensions = ">=6.3" + +[package.extras] +crystal = ["mkdocstrings-crystal (>=0.3.4)"] +python = ["mkdocstrings-python (>=0.5.2)"] +python-legacy = ["mkdocstrings-python-legacy (>=0.2.1)"] + +[[package]] +name = "mkdocstrings-python" +version = "1.8.0" +description = "A Python handler for mkdocstrings." +optional = false +python-versions = ">=3.8" +files = [ + {file = "mkdocstrings_python-1.8.0-py3-none-any.whl", hash = "sha256:4209970cc90bec194568682a535848a8d8489516c6ed4adbe58bbc67b699ca9d"}, + {file = "mkdocstrings_python-1.8.0.tar.gz", hash = "sha256:1488bddf50ee42c07d9a488dddc197f8e8999c2899687043ec5dd1643d057192"}, +] + +[package.dependencies] +griffe = ">=0.37" +mkdocstrings = ">=0.20" + +[[package]] +name = "multidict" +version = "6.0.5" +description = "multidict implementation" +optional = false +python-versions = ">=3.7" +files = [ + {file = "multidict-6.0.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:228b644ae063c10e7f324ab1ab6b548bdf6f8b47f3ec234fef1093bc2735e5f9"}, + {file = "multidict-6.0.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:896ebdcf62683551312c30e20614305f53125750803b614e9e6ce74a96232604"}, + {file = "multidict-6.0.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:411bf8515f3be9813d06004cac41ccf7d1cd46dfe233705933dd163b60e37600"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d147090048129ce3c453f0292e7697d333db95e52616b3793922945804a433c"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:215ed703caf15f578dca76ee6f6b21b7603791ae090fbf1ef9d865571039ade5"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c6390cf87ff6234643428991b7359b5f59cc15155695deb4eda5c777d2b880f"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21fd81c4ebdb4f214161be351eb5bcf385426bf023041da2fd9e60681f3cebae"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3cc2ad10255f903656017363cd59436f2111443a76f996584d1077e43ee51182"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6939c95381e003f54cd4c5516740faba40cf5ad3eeff460c3ad1d3e0ea2549bf"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:220dd781e3f7af2c2c1053da9fa96d9cf3072ca58f057f4c5adaaa1cab8fc442"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:766c8f7511df26d9f11cd3a8be623e59cca73d44643abab3f8c8c07620524e4a"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:fe5d7785250541f7f5019ab9cba2c71169dc7d74d0f45253f8313f436458a4ef"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c1c1496e73051918fcd4f58ff2e0f2f3066d1c76a0c6aeffd9b45d53243702cc"}, + {file = "multidict-6.0.5-cp310-cp310-win32.whl", hash = "sha256:7afcdd1fc07befad18ec4523a782cde4e93e0a2bf71239894b8d61ee578c1319"}, + {file = "multidict-6.0.5-cp310-cp310-win_amd64.whl", hash = "sha256:99f60d34c048c5c2fabc766108c103612344c46e35d4ed9ae0673d33c8fb26e8"}, + {file = "multidict-6.0.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f285e862d2f153a70586579c15c44656f888806ed0e5b56b64489afe4a2dbfba"}, + {file = "multidict-6.0.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:53689bb4e102200a4fafa9de9c7c3c212ab40a7ab2c8e474491914d2305f187e"}, + {file = "multidict-6.0.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:612d1156111ae11d14afaf3a0669ebf6c170dbb735e510a7438ffe2369a847fd"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7be7047bd08accdb7487737631d25735c9a04327911de89ff1b26b81745bd4e3"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de170c7b4fe6859beb8926e84f7d7d6c693dfe8e27372ce3b76f01c46e489fcf"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:04bde7a7b3de05732a4eb39c94574db1ec99abb56162d6c520ad26f83267de29"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85f67aed7bb647f93e7520633d8f51d3cbc6ab96957c71272b286b2f30dc70ed"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:425bf820055005bfc8aa9a0b99ccb52cc2f4070153e34b701acc98d201693733"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d3eb1ceec286eba8220c26f3b0096cf189aea7057b6e7b7a2e60ed36b373b77f"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7901c05ead4b3fb75113fb1dd33eb1253c6d3ee37ce93305acd9d38e0b5f21a4"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e0e79d91e71b9867c73323a3444724d496c037e578a0e1755ae159ba14f4f3d1"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:29bfeb0dff5cb5fdab2023a7a9947b3b4af63e9c47cae2a10ad58394b517fddc"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e030047e85cbcedbfc073f71836d62dd5dadfbe7531cae27789ff66bc551bd5e"}, + {file = "multidict-6.0.5-cp311-cp311-win32.whl", hash = "sha256:2f4848aa3baa109e6ab81fe2006c77ed4d3cd1e0ac2c1fbddb7b1277c168788c"}, + {file = "multidict-6.0.5-cp311-cp311-win_amd64.whl", hash = "sha256:2faa5ae9376faba05f630d7e5e6be05be22913782b927b19d12b8145968a85ea"}, + {file = "multidict-6.0.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:51d035609b86722963404f711db441cf7134f1889107fb171a970c9701f92e1e"}, + {file = "multidict-6.0.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:cbebcd5bcaf1eaf302617c114aa67569dd3f090dd0ce8ba9e35e9985b41ac35b"}, + {file = "multidict-6.0.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2ffc42c922dbfddb4a4c3b438eb056828719f07608af27d163191cb3e3aa6cc5"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ceb3b7e6a0135e092de86110c5a74e46bda4bd4fbfeeb3a3bcec79c0f861e450"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:79660376075cfd4b2c80f295528aa6beb2058fd289f4c9252f986751a4cd0496"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e4428b29611e989719874670fd152b6625500ad6c686d464e99f5aaeeaca175a"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d84a5c3a5f7ce6db1f999fb9438f686bc2e09d38143f2d93d8406ed2dd6b9226"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:76c0de87358b192de7ea9649beb392f107dcad9ad27276324c24c91774ca5271"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:79a6d2ba910adb2cbafc95dad936f8b9386e77c84c35bc0add315b856d7c3abb"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:92d16a3e275e38293623ebf639c471d3e03bb20b8ebb845237e0d3664914caef"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:fb616be3538599e797a2017cccca78e354c767165e8858ab5116813146041a24"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:14c2976aa9038c2629efa2c148022ed5eb4cb939e15ec7aace7ca932f48f9ba6"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:435a0984199d81ca178b9ae2c26ec3d49692d20ee29bc4c11a2a8d4514c67eda"}, + {file = "multidict-6.0.5-cp312-cp312-win32.whl", hash = "sha256:9fe7b0653ba3d9d65cbe7698cca585bf0f8c83dbbcc710db9c90f478e175f2d5"}, + {file = "multidict-6.0.5-cp312-cp312-win_amd64.whl", hash = "sha256:01265f5e40f5a17f8241d52656ed27192be03bfa8764d88e8220141d1e4b3556"}, + {file = "multidict-6.0.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:19fe01cea168585ba0f678cad6f58133db2aa14eccaf22f88e4a6dccadfad8b3"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6bf7a982604375a8d49b6cc1b781c1747f243d91b81035a9b43a2126c04766f5"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:107c0cdefe028703fb5dafe640a409cb146d44a6ae201e55b35a4af8e95457dd"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:403c0911cd5d5791605808b942c88a8155c2592e05332d2bf78f18697a5fa15e"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aeaf541ddbad8311a87dd695ed9642401131ea39ad7bc8cf3ef3967fd093b626"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e4972624066095e52b569e02b5ca97dbd7a7ddd4294bf4e7247d52635630dd83"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d946b0a9eb8aaa590df1fe082cee553ceab173e6cb5b03239716338629c50c7a"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b55358304d7a73d7bdf5de62494aaf70bd33015831ffd98bc498b433dfe5b10c"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:a3145cb08d8625b2d3fee1b2d596a8766352979c9bffe5d7833e0503d0f0b5e5"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:d65f25da8e248202bd47445cec78e0025c0fe7582b23ec69c3b27a640dd7a8e3"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:c9bf56195c6bbd293340ea82eafd0071cb3d450c703d2c93afb89f93b8386ccc"}, + {file = "multidict-6.0.5-cp37-cp37m-win32.whl", hash = "sha256:69db76c09796b313331bb7048229e3bee7928eb62bab5e071e9f7fcc4879caee"}, + {file = "multidict-6.0.5-cp37-cp37m-win_amd64.whl", hash = "sha256:fce28b3c8a81b6b36dfac9feb1de115bab619b3c13905b419ec71d03a3fc1423"}, + {file = "multidict-6.0.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:76f067f5121dcecf0d63a67f29080b26c43c71a98b10c701b0677e4a065fbd54"}, + {file = "multidict-6.0.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b82cc8ace10ab5bd93235dfaab2021c70637005e1ac787031f4d1da63d493c1d"}, + {file = "multidict-6.0.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5cb241881eefd96b46f89b1a056187ea8e9ba14ab88ba632e68d7a2ecb7aadf7"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8e94e6912639a02ce173341ff62cc1201232ab86b8a8fcc05572741a5dc7d93"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:09a892e4a9fb47331da06948690ae38eaa2426de97b4ccbfafbdcbe5c8f37ff8"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55205d03e8a598cfc688c71ca8ea5f66447164efff8869517f175ea632c7cb7b"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37b15024f864916b4951adb95d3a80c9431299080341ab9544ed148091b53f50"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2a1dee728b52b33eebff5072817176c172050d44d67befd681609b4746e1c2e"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:edd08e6f2f1a390bf137080507e44ccc086353c8e98c657e666c017718561b89"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:60d698e8179a42ec85172d12f50b1668254628425a6bd611aba022257cac1386"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:3d25f19500588cbc47dc19081d78131c32637c25804df8414463ec908631e453"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:4cc0ef8b962ac7a5e62b9e826bd0cd5040e7d401bc45a6835910ed699037a461"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:eca2e9d0cc5a889850e9bbd68e98314ada174ff6ccd1129500103df7a94a7a44"}, + {file = "multidict-6.0.5-cp38-cp38-win32.whl", hash = "sha256:4a6a4f196f08c58c59e0b8ef8ec441d12aee4125a7d4f4fef000ccb22f8d7241"}, + {file = "multidict-6.0.5-cp38-cp38-win_amd64.whl", hash = "sha256:0275e35209c27a3f7951e1ce7aaf93ce0d163b28948444bec61dd7badc6d3f8c"}, + {file = "multidict-6.0.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e7be68734bd8c9a513f2b0cfd508802d6609da068f40dc57d4e3494cefc92929"}, + {file = "multidict-6.0.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1d9ea7a7e779d7a3561aade7d596649fbecfa5c08a7674b11b423783217933f9"}, + {file = "multidict-6.0.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ea1456df2a27c73ce51120fa2f519f1bea2f4a03a917f4a43c8707cf4cbbae1a"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf590b134eb70629e350691ecca88eac3e3b8b3c86992042fb82e3cb1830d5e1"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5c0631926c4f58e9a5ccce555ad7747d9a9f8b10619621f22f9635f069f6233e"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dce1c6912ab9ff5f179eaf6efe7365c1f425ed690b03341911bf4939ef2f3046"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0868d64af83169e4d4152ec612637a543f7a336e4a307b119e98042e852ad9c"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:141b43360bfd3bdd75f15ed811850763555a251e38b2405967f8e25fb43f7d40"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7df704ca8cf4a073334e0427ae2345323613e4df18cc224f647f251e5e75a527"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:6214c5a5571802c33f80e6c84713b2c79e024995b9c5897f794b43e714daeec9"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:cd6c8fca38178e12c00418de737aef1261576bd1b6e8c6134d3e729a4e858b38"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:e02021f87a5b6932fa6ce916ca004c4d441509d33bbdbeca70d05dff5e9d2479"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ebd8d160f91a764652d3e51ce0d2956b38efe37c9231cd82cfc0bed2e40b581c"}, + {file = "multidict-6.0.5-cp39-cp39-win32.whl", hash = "sha256:04da1bb8c8dbadf2a18a452639771951c662c5ad03aefe4884775454be322c9b"}, + {file = "multidict-6.0.5-cp39-cp39-win_amd64.whl", hash = "sha256:d6f6d4f185481c9669b9447bf9d9cf3b95a0e9df9d169bbc17e363b7d5487755"}, + {file = "multidict-6.0.5-py3-none-any.whl", hash = "sha256:0d63c74e3d7ab26de115c49bffc92cc77ed23395303d496eae515d4204a625e7"}, + {file = "multidict-6.0.5.tar.gz", hash = "sha256:f7e301075edaf50500f0b341543c41194d8df3ae5caf4702f2095f3ca73dd8da"}, +] + +[[package]] +name = "numpy" +version = "1.26.4" +description = "Fundamental package for array computing in Python" +optional = false +python-versions = ">=3.9" +files = [ + {file = "numpy-1.26.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0"}, + {file = "numpy-1.26.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a"}, + {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d209d8969599b27ad20994c8e41936ee0964e6da07478d6c35016bc386b66ad4"}, + {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f"}, + {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:62b8e4b1e28009ef2846b4c7852046736bab361f7aeadeb6a5b89ebec3c7055a"}, + {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a4abb4f9001ad2858e7ac189089c42178fcce737e4169dc61321660f1a96c7d2"}, + {file = "numpy-1.26.4-cp310-cp310-win32.whl", hash = "sha256:bfe25acf8b437eb2a8b2d49d443800a5f18508cd811fea3181723922a8a82b07"}, + {file = "numpy-1.26.4-cp310-cp310-win_amd64.whl", hash = "sha256:b97fe8060236edf3662adfc2c633f56a08ae30560c56310562cb4f95500022d5"}, + {file = "numpy-1.26.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71"}, + {file = "numpy-1.26.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef"}, + {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e"}, + {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5"}, + {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a"}, + {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a"}, + {file = "numpy-1.26.4-cp311-cp311-win32.whl", hash = "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20"}, + {file = "numpy-1.26.4-cp311-cp311-win_amd64.whl", hash = "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2"}, + {file = "numpy-1.26.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218"}, + {file = "numpy-1.26.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b"}, + {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b"}, + {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed"}, + {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a"}, + {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0"}, + {file = "numpy-1.26.4-cp312-cp312-win32.whl", hash = "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110"}, + {file = "numpy-1.26.4-cp312-cp312-win_amd64.whl", hash = "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818"}, + {file = "numpy-1.26.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7349ab0fa0c429c82442a27a9673fc802ffdb7c7775fad780226cb234965e53c"}, + {file = "numpy-1.26.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:52b8b60467cd7dd1e9ed082188b4e6bb35aa5cdd01777621a1658910745b90be"}, + {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5241e0a80d808d70546c697135da2c613f30e28251ff8307eb72ba696945764"}, + {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f870204a840a60da0b12273ef34f7051e98c3b5961b61b0c2c1be6dfd64fbcd3"}, + {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:679b0076f67ecc0138fd2ede3a8fd196dddc2ad3254069bcb9faf9a79b1cebcd"}, + {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:47711010ad8555514b434df65f7d7b076bb8261df1ca9bb78f53d3b2db02e95c"}, + {file = "numpy-1.26.4-cp39-cp39-win32.whl", hash = "sha256:a354325ee03388678242a4d7ebcd08b5c727033fcff3b2f536aea978e15ee9e6"}, + {file = "numpy-1.26.4-cp39-cp39-win_amd64.whl", hash = "sha256:3373d5d70a5fe74a2c1bb6d2cfd9609ecf686d47a2d7b1d37a8f3b6bf6003aea"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:afedb719a9dcfc7eaf2287b839d8198e06dcd4cb5d276a3df279231138e83d30"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95a7476c59002f2f6c590b9b7b998306fba6a5aa646b1e22ddfeaf8f78c3a29c"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7e50d0a0cc3189f9cb0aeb3a6a6af18c16f59f004b866cd2be1c14b36134a4a0"}, + {file = "numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010"}, +] + +[[package]] +name = "orjson" +version = "3.9.15" +description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" +optional = false +python-versions = ">=3.8" +files = [ + {file = "orjson-3.9.15-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:d61f7ce4727a9fa7680cd6f3986b0e2c732639f46a5e0156e550e35258aa313a"}, + {file = "orjson-3.9.15-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4feeb41882e8aa17634b589533baafdceb387e01e117b1ec65534ec724023d04"}, + {file = "orjson-3.9.15-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fbbeb3c9b2edb5fd044b2a070f127a0ac456ffd079cb82746fc84af01ef021a4"}, + {file = "orjson-3.9.15-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b66bcc5670e8a6b78f0313bcb74774c8291f6f8aeef10fe70e910b8040f3ab75"}, + {file = "orjson-3.9.15-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2973474811db7b35c30248d1129c64fd2bdf40d57d84beed2a9a379a6f57d0ab"}, + {file = "orjson-3.9.15-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fe41b6f72f52d3da4db524c8653e46243c8c92df826ab5ffaece2dba9cccd58"}, + {file = "orjson-3.9.15-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4228aace81781cc9d05a3ec3a6d2673a1ad0d8725b4e915f1089803e9efd2b99"}, + {file = "orjson-3.9.15-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:6f7b65bfaf69493c73423ce9db66cfe9138b2f9ef62897486417a8fcb0a92bfe"}, + {file = "orjson-3.9.15-cp310-none-win32.whl", hash = "sha256:2d99e3c4c13a7b0fb3792cc04c2829c9db07838fb6973e578b85c1745e7d0ce7"}, + {file = "orjson-3.9.15-cp310-none-win_amd64.whl", hash = "sha256:b725da33e6e58e4a5d27958568484aa766e825e93aa20c26c91168be58e08cbb"}, + {file = "orjson-3.9.15-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:c8e8fe01e435005d4421f183038fc70ca85d2c1e490f51fb972db92af6e047c2"}, + {file = "orjson-3.9.15-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:87f1097acb569dde17f246faa268759a71a2cb8c96dd392cd25c668b104cad2f"}, + {file = "orjson-3.9.15-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ff0f9913d82e1d1fadbd976424c316fbc4d9c525c81d047bbdd16bd27dd98cfc"}, + {file = "orjson-3.9.15-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8055ec598605b0077e29652ccfe9372247474375e0e3f5775c91d9434e12d6b1"}, + {file = "orjson-3.9.15-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d6768a327ea1ba44c9114dba5fdda4a214bdb70129065cd0807eb5f010bfcbb5"}, + {file = "orjson-3.9.15-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:12365576039b1a5a47df01aadb353b68223da413e2e7f98c02403061aad34bde"}, + {file = "orjson-3.9.15-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:71c6b009d431b3839d7c14c3af86788b3cfac41e969e3e1c22f8a6ea13139404"}, + {file = "orjson-3.9.15-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e18668f1bd39e69b7fed19fa7cd1cd110a121ec25439328b5c89934e6d30d357"}, + {file = "orjson-3.9.15-cp311-none-win32.whl", hash = "sha256:62482873e0289cf7313461009bf62ac8b2e54bc6f00c6fabcde785709231a5d7"}, + {file = "orjson-3.9.15-cp311-none-win_amd64.whl", hash = "sha256:b3d336ed75d17c7b1af233a6561cf421dee41d9204aa3cfcc6c9c65cd5bb69a8"}, + {file = "orjson-3.9.15-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:82425dd5c7bd3adfe4e94c78e27e2fa02971750c2b7ffba648b0f5d5cc016a73"}, + {file = "orjson-3.9.15-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c51378d4a8255b2e7c1e5cc430644f0939539deddfa77f6fac7b56a9784160a"}, + {file = "orjson-3.9.15-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6ae4e06be04dc00618247c4ae3f7c3e561d5bc19ab6941427f6d3722a0875ef7"}, + {file = "orjson-3.9.15-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bcef128f970bb63ecf9a65f7beafd9b55e3aaf0efc271a4154050fc15cdb386e"}, + {file = "orjson-3.9.15-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b72758f3ffc36ca566ba98a8e7f4f373b6c17c646ff8ad9b21ad10c29186f00d"}, + {file = "orjson-3.9.15-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10c57bc7b946cf2efa67ac55766e41764b66d40cbd9489041e637c1304400494"}, + {file = "orjson-3.9.15-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:946c3a1ef25338e78107fba746f299f926db408d34553b4754e90a7de1d44068"}, + {file = "orjson-3.9.15-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2f256d03957075fcb5923410058982aea85455d035607486ccb847f095442bda"}, + {file = "orjson-3.9.15-cp312-none-win_amd64.whl", hash = "sha256:5bb399e1b49db120653a31463b4a7b27cf2fbfe60469546baf681d1b39f4edf2"}, + {file = "orjson-3.9.15-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:b17f0f14a9c0ba55ff6279a922d1932e24b13fc218a3e968ecdbf791b3682b25"}, + {file = "orjson-3.9.15-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f6cbd8e6e446fb7e4ed5bac4661a29e43f38aeecbf60c4b900b825a353276a1"}, + {file = "orjson-3.9.15-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:76bc6356d07c1d9f4b782813094d0caf1703b729d876ab6a676f3aaa9a47e37c"}, + {file = "orjson-3.9.15-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fdfa97090e2d6f73dced247a2f2d8004ac6449df6568f30e7fa1a045767c69a6"}, + {file = "orjson-3.9.15-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7413070a3e927e4207d00bd65f42d1b780fb0d32d7b1d951f6dc6ade318e1b5a"}, + {file = "orjson-3.9.15-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9cf1596680ac1f01839dba32d496136bdd5d8ffb858c280fa82bbfeb173bdd40"}, + {file = "orjson-3.9.15-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:809d653c155e2cc4fd39ad69c08fdff7f4016c355ae4b88905219d3579e31eb7"}, + {file = "orjson-3.9.15-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:920fa5a0c5175ab14b9c78f6f820b75804fb4984423ee4c4f1e6d748f8b22bc1"}, + {file = "orjson-3.9.15-cp38-none-win32.whl", hash = "sha256:2b5c0f532905e60cf22a511120e3719b85d9c25d0e1c2a8abb20c4dede3b05a5"}, + {file = "orjson-3.9.15-cp38-none-win_amd64.whl", hash = "sha256:67384f588f7f8daf040114337d34a5188346e3fae6c38b6a19a2fe8c663a2f9b"}, + {file = "orjson-3.9.15-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:6fc2fe4647927070df3d93f561d7e588a38865ea0040027662e3e541d592811e"}, + {file = "orjson-3.9.15-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:34cbcd216e7af5270f2ffa63a963346845eb71e174ea530867b7443892d77180"}, + {file = "orjson-3.9.15-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f541587f5c558abd93cb0de491ce99a9ef8d1ae29dd6ab4dbb5a13281ae04cbd"}, + {file = "orjson-3.9.15-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:92255879280ef9c3c0bcb327c5a1b8ed694c290d61a6a532458264f887f052cb"}, + {file = "orjson-3.9.15-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:05a1f57fb601c426635fcae9ddbe90dfc1ed42245eb4c75e4960440cac667262"}, + {file = "orjson-3.9.15-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ede0bde16cc6e9b96633df1631fbcd66491d1063667f260a4f2386a098393790"}, + {file = "orjson-3.9.15-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:e88b97ef13910e5f87bcbc4dd7979a7de9ba8702b54d3204ac587e83639c0c2b"}, + {file = "orjson-3.9.15-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:57d5d8cf9c27f7ef6bc56a5925c7fbc76b61288ab674eb352c26ac780caa5b10"}, + {file = "orjson-3.9.15-cp39-none-win32.whl", hash = "sha256:001f4eb0ecd8e9ebd295722d0cbedf0748680fb9998d3993abaed2f40587257a"}, + {file = "orjson-3.9.15-cp39-none-win_amd64.whl", hash = "sha256:ea0b183a5fe6b2b45f3b854b0d19c4e932d6f5934ae1f723b07cf9560edd4ec7"}, + {file = "orjson-3.9.15.tar.gz", hash = "sha256:95cae920959d772f30ab36d3b25f83bb0f3be671e986c72ce22f8fa700dae061"}, +] + +[[package]] +name = "packaging" +version = "24.0" +description = "Core utilities for Python packages" +optional = false +python-versions = ">=3.7" +files = [ + {file = "packaging-24.0-py3-none-any.whl", hash = "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5"}, + {file = "packaging-24.0.tar.gz", hash = "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9"}, +] + +[[package]] +name = "paginate" +version = "0.5.6" +description = "Divides large result sets into pages for easier browsing" +optional = false +python-versions = "*" +files = [ + {file = "paginate-0.5.6.tar.gz", hash = "sha256:5e6007b6a9398177a7e1648d04fdd9f8c9766a1a945bceac82f1929e8c78af2d"}, +] + +[[package]] +name = "pathspec" +version = "0.12.1" +description = "Utility library for gitignore style pattern matching of file paths." +optional = false +python-versions = ">=3.8" +files = [ + {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, + {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, +] + +[[package]] +name = "pillow" +version = "10.3.0" +description = "Python Imaging Library (Fork)" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pillow-10.3.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:90b9e29824800e90c84e4022dd5cc16eb2d9605ee13f05d47641eb183cd73d45"}, + {file = "pillow-10.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a2c405445c79c3f5a124573a051062300936b0281fee57637e706453e452746c"}, + {file = "pillow-10.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78618cdbccaa74d3f88d0ad6cb8ac3007f1a6fa5c6f19af64b55ca170bfa1edf"}, + {file = "pillow-10.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:261ddb7ca91fcf71757979534fb4c128448b5b4c55cb6152d280312062f69599"}, + {file = "pillow-10.3.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:ce49c67f4ea0609933d01c0731b34b8695a7a748d6c8d186f95e7d085d2fe475"}, + {file = "pillow-10.3.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:b14f16f94cbc61215115b9b1236f9c18403c15dd3c52cf629072afa9d54c1cbf"}, + {file = "pillow-10.3.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d33891be6df59d93df4d846640f0e46f1a807339f09e79a8040bc887bdcd7ed3"}, + {file = "pillow-10.3.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b50811d664d392f02f7761621303eba9d1b056fb1868c8cdf4231279645c25f5"}, + {file = "pillow-10.3.0-cp310-cp310-win32.whl", hash = "sha256:ca2870d5d10d8726a27396d3ca4cf7976cec0f3cb706debe88e3a5bd4610f7d2"}, + {file = "pillow-10.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:f0d0591a0aeaefdaf9a5e545e7485f89910c977087e7de2b6c388aec32011e9f"}, + {file = "pillow-10.3.0-cp310-cp310-win_arm64.whl", hash = "sha256:ccce24b7ad89adb5a1e34a6ba96ac2530046763912806ad4c247356a8f33a67b"}, + {file = "pillow-10.3.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:5f77cf66e96ae734717d341c145c5949c63180842a545c47a0ce7ae52ca83795"}, + {file = "pillow-10.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e4b878386c4bf293578b48fc570b84ecfe477d3b77ba39a6e87150af77f40c57"}, + {file = "pillow-10.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fdcbb4068117dfd9ce0138d068ac512843c52295ed996ae6dd1faf537b6dbc27"}, + {file = "pillow-10.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9797a6c8fe16f25749b371c02e2ade0efb51155e767a971c61734b1bf6293994"}, + {file = "pillow-10.3.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:9e91179a242bbc99be65e139e30690e081fe6cb91a8e77faf4c409653de39451"}, + {file = "pillow-10.3.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:1b87bd9d81d179bd8ab871603bd80d8645729939f90b71e62914e816a76fc6bd"}, + {file = "pillow-10.3.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:81d09caa7b27ef4e61cb7d8fbf1714f5aec1c6b6c5270ee53504981e6e9121ad"}, + {file = "pillow-10.3.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:048ad577748b9fa4a99a0548c64f2cb8d672d5bf2e643a739ac8faff1164238c"}, + {file = "pillow-10.3.0-cp311-cp311-win32.whl", hash = "sha256:7161ec49ef0800947dc5570f86568a7bb36fa97dd09e9827dc02b718c5643f09"}, + {file = "pillow-10.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:8eb0908e954d093b02a543dc963984d6e99ad2b5e36503d8a0aaf040505f747d"}, + {file = "pillow-10.3.0-cp311-cp311-win_arm64.whl", hash = "sha256:4e6f7d1c414191c1199f8996d3f2282b9ebea0945693fb67392c75a3a320941f"}, + {file = "pillow-10.3.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:e46f38133e5a060d46bd630faa4d9fa0202377495df1f068a8299fd78c84de84"}, + {file = "pillow-10.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:50b8eae8f7334ec826d6eeffaeeb00e36b5e24aa0b9df322c247539714c6df19"}, + {file = "pillow-10.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d3bea1c75f8c53ee4d505c3e67d8c158ad4df0d83170605b50b64025917f338"}, + {file = "pillow-10.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19aeb96d43902f0a783946a0a87dbdad5c84c936025b8419da0a0cd7724356b1"}, + {file = "pillow-10.3.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:74d28c17412d9caa1066f7a31df8403ec23d5268ba46cd0ad2c50fb82ae40462"}, + {file = "pillow-10.3.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:ff61bfd9253c3915e6d41c651d5f962da23eda633cf02262990094a18a55371a"}, + {file = "pillow-10.3.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d886f5d353333b4771d21267c7ecc75b710f1a73d72d03ca06df49b09015a9ef"}, + {file = "pillow-10.3.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4b5ec25d8b17217d635f8935dbc1b9aa5907962fae29dff220f2659487891cd3"}, + {file = "pillow-10.3.0-cp312-cp312-win32.whl", hash = "sha256:51243f1ed5161b9945011a7360e997729776f6e5d7005ba0c6879267d4c5139d"}, + {file = "pillow-10.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:412444afb8c4c7a6cc11a47dade32982439925537e483be7c0ae0cf96c4f6a0b"}, + {file = "pillow-10.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:798232c92e7665fe82ac085f9d8e8ca98826f8e27859d9a96b41d519ecd2e49a"}, + {file = "pillow-10.3.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:4eaa22f0d22b1a7e93ff0a596d57fdede2e550aecffb5a1ef1106aaece48e96b"}, + {file = "pillow-10.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cd5e14fbf22a87321b24c88669aad3a51ec052eb145315b3da3b7e3cc105b9a2"}, + {file = "pillow-10.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1530e8f3a4b965eb6a7785cf17a426c779333eb62c9a7d1bbcf3ffd5bf77a4aa"}, + {file = "pillow-10.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d512aafa1d32efa014fa041d38868fda85028e3f930a96f85d49c7d8ddc0383"}, + {file = "pillow-10.3.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:339894035d0ede518b16073bdc2feef4c991ee991a29774b33e515f1d308e08d"}, + {file = "pillow-10.3.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:aa7e402ce11f0885305bfb6afb3434b3cd8f53b563ac065452d9d5654c7b86fd"}, + {file = "pillow-10.3.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0ea2a783a2bdf2a561808fe4a7a12e9aa3799b701ba305de596bc48b8bdfce9d"}, + {file = "pillow-10.3.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c78e1b00a87ce43bb37642c0812315b411e856a905d58d597750eb79802aaaa3"}, + {file = "pillow-10.3.0-cp38-cp38-win32.whl", hash = "sha256:72d622d262e463dfb7595202d229f5f3ab4b852289a1cd09650362db23b9eb0b"}, + {file = "pillow-10.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:2034f6759a722da3a3dbd91a81148cf884e91d1b747992ca288ab88c1de15999"}, + {file = "pillow-10.3.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:2ed854e716a89b1afcedea551cd85f2eb2a807613752ab997b9974aaa0d56936"}, + {file = "pillow-10.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:dc1a390a82755a8c26c9964d457d4c9cbec5405896cba94cf51f36ea0d855002"}, + {file = "pillow-10.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4203efca580f0dd6f882ca211f923168548f7ba334c189e9eab1178ab840bf60"}, + {file = "pillow-10.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3102045a10945173d38336f6e71a8dc71bcaeed55c3123ad4af82c52807b9375"}, + {file = "pillow-10.3.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:6fb1b30043271ec92dc65f6d9f0b7a830c210b8a96423074b15c7bc999975f57"}, + {file = "pillow-10.3.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:1dfc94946bc60ea375cc39cff0b8da6c7e5f8fcdc1d946beb8da5c216156ddd8"}, + {file = "pillow-10.3.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b09b86b27a064c9624d0a6c54da01c1beaf5b6cadfa609cf63789b1d08a797b9"}, + {file = "pillow-10.3.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d3b2348a78bc939b4fed6552abfd2e7988e0f81443ef3911a4b8498ca084f6eb"}, + {file = "pillow-10.3.0-cp39-cp39-win32.whl", hash = "sha256:45ebc7b45406febf07fef35d856f0293a92e7417ae7933207e90bf9090b70572"}, + {file = "pillow-10.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:0ba26351b137ca4e0db0342d5d00d2e355eb29372c05afd544ebf47c0956ffeb"}, + {file = "pillow-10.3.0-cp39-cp39-win_arm64.whl", hash = "sha256:50fd3f6b26e3441ae07b7c979309638b72abc1a25da31a81a7fbd9495713ef4f"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:6b02471b72526ab8a18c39cb7967b72d194ec53c1fd0a70b050565a0f366d355"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:8ab74c06ffdab957d7670c2a5a6e1a70181cd10b727cd788c4dd9005b6a8acd9"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:048eeade4c33fdf7e08da40ef402e748df113fd0b4584e32c4af74fe78baaeb2"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e2ec1e921fd07c7cda7962bad283acc2f2a9ccc1b971ee4b216b75fad6f0463"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:4c8e73e99da7db1b4cad7f8d682cf6abad7844da39834c288fbfa394a47bbced"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:16563993329b79513f59142a6b02055e10514c1a8e86dca8b48a893e33cf91e3"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:dd78700f5788ae180b5ee8902c6aea5a5726bac7c364b202b4b3e3ba2d293170"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:aff76a55a8aa8364d25400a210a65ff59d0168e0b4285ba6bf2bd83cf675ba32"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:b7bc2176354defba3edc2b9a777744462da2f8e921fbaf61e52acb95bafa9828"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:793b4e24db2e8742ca6423d3fde8396db336698c55cd34b660663ee9e45ed37f"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d93480005693d247f8346bc8ee28c72a2191bdf1f6b5db469c096c0c867ac015"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c83341b89884e2b2e55886e8fbbf37c3fa5efd6c8907124aeb72f285ae5696e5"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:1a1d1915db1a4fdb2754b9de292642a39a7fb28f1736699527bb649484fb966a"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a0eaa93d054751ee9964afa21c06247779b90440ca41d184aeb5d410f20ff591"}, + {file = "pillow-10.3.0.tar.gz", hash = "sha256:9d2455fbf44c914840c793e89aa82d0e1763a14253a000743719ae5946814b2d"}, +] + +[package.extras] +docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-removed-in", "sphinxext-opengraph"] +fpx = ["olefile"] +mic = ["olefile"] +tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] +typing = ["typing-extensions"] +xmp = ["defusedxml"] + +[[package]] +name = "platformdirs" +version = "4.2.0" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +optional = false +python-versions = ">=3.8" +files = [ + {file = "platformdirs-4.2.0-py3-none-any.whl", hash = "sha256:0614df2a2f37e1a662acbd8e2b25b92ccf8632929bc6d43467e17fe89c75e068"}, + {file = "platformdirs-4.2.0.tar.gz", hash = "sha256:ef0cc731df711022c174543cb70a9b5bd22e5a9337c8624ef2c2ceb8ddad8768"}, +] + +[package.extras] +docs = ["furo (>=2023.9.10)", "proselint (>=0.13)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)"] + +[[package]] +name = "psutil" +version = "5.9.8" +description = "Cross-platform lib for process and system monitoring in Python." +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +files = [ + {file = "psutil-5.9.8-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:26bd09967ae00920df88e0352a91cff1a78f8d69b3ecabbfe733610c0af486c8"}, + {file = "psutil-5.9.8-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:05806de88103b25903dff19bb6692bd2e714ccf9e668d050d144012055cbca73"}, + {file = "psutil-5.9.8-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:611052c4bc70432ec770d5d54f64206aa7203a101ec273a0cd82418c86503bb7"}, + {file = "psutil-5.9.8-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:50187900d73c1381ba1454cf40308c2bf6f34268518b3f36a9b663ca87e65e36"}, + {file = "psutil-5.9.8-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:02615ed8c5ea222323408ceba16c60e99c3f91639b07da6373fb7e6539abc56d"}, + {file = "psutil-5.9.8-cp27-none-win32.whl", hash = "sha256:36f435891adb138ed3c9e58c6af3e2e6ca9ac2f365efe1f9cfef2794e6c93b4e"}, + {file = "psutil-5.9.8-cp27-none-win_amd64.whl", hash = "sha256:bd1184ceb3f87651a67b2708d4c3338e9b10c5df903f2e3776b62303b26cb631"}, + {file = "psutil-5.9.8-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:aee678c8720623dc456fa20659af736241f575d79429a0e5e9cf88ae0605cc81"}, + {file = "psutil-5.9.8-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8cb6403ce6d8e047495a701dc7c5bd788add903f8986d523e3e20b98b733e421"}, + {file = "psutil-5.9.8-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d06016f7f8625a1825ba3732081d77c94589dca78b7a3fc072194851e88461a4"}, + {file = "psutil-5.9.8-cp36-cp36m-win32.whl", hash = "sha256:7d79560ad97af658a0f6adfef8b834b53f64746d45b403f225b85c5c2c140eee"}, + {file = "psutil-5.9.8-cp36-cp36m-win_amd64.whl", hash = "sha256:27cc40c3493bb10de1be4b3f07cae4c010ce715290a5be22b98493509c6299e2"}, + {file = "psutil-5.9.8-cp37-abi3-win32.whl", hash = "sha256:bc56c2a1b0d15aa3eaa5a60c9f3f8e3e565303b465dbf57a1b730e7a2b9844e0"}, + {file = "psutil-5.9.8-cp37-abi3-win_amd64.whl", hash = "sha256:8db4c1b57507eef143a15a6884ca10f7c73876cdf5d51e713151c1236a0e68cf"}, + {file = "psutil-5.9.8-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:d16bbddf0693323b8c6123dd804100241da461e41d6e332fb0ba6058f630f8c8"}, + {file = "psutil-5.9.8.tar.gz", hash = "sha256:6be126e3225486dff286a8fb9a06246a5253f4c7c53b475ea5f5ac934e64194c"}, +] + +[package.extras] +test = ["enum34", "ipaddress", "mock", "pywin32", "wmi"] + +[[package]] +name = "py-dactyl" +version = "2.0.4" +description = "An easy to use Python wrapper for the Pterodactyl Panel API." +optional = false +python-versions = ">=3.4" +files = [ + {file = "py-dactyl-2.0.4.tar.gz", hash = "sha256:a16e13a37ee7743b07931f17a9a049e6a22f3fe0c4475e661684deea5f510e77"}, + {file = "py_dactyl-2.0.4-py3-none-any.whl", hash = "sha256:7868d528d9a8080c68f49e87418e3ca8a853db2bdff835cf40045400ce6d31b3"}, +] + +[package.dependencies] +requests = ">=2.21.0" + +[[package]] +name = "pycparser" +version = "2.21" +description = "C parser in Python" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, + {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, +] + +[[package]] +name = "pygments" +version = "2.17.2" +description = "Pygments is a syntax highlighting package written in Python." +optional = false +python-versions = ">=3.7" +files = [ + {file = "pygments-2.17.2-py3-none-any.whl", hash = "sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c"}, + {file = "pygments-2.17.2.tar.gz", hash = "sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367"}, +] + +[package.extras] +plugins = ["importlib-metadata"] +windows-terminal = ["colorama (>=0.4.6)"] + +[[package]] +name = "pylint" +version = "3.1.0" +description = "python code static checker" +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "pylint-3.1.0-py3-none-any.whl", hash = "sha256:507a5b60953874766d8a366e8e8c7af63e058b26345cfcb5f91f89d987fd6b74"}, + {file = "pylint-3.1.0.tar.gz", hash = "sha256:6a69beb4a6f63debebaab0a3477ecd0f559aa726af4954fc948c51f7a2549e23"}, +] + +[package.dependencies] +astroid = ">=3.1.0,<=3.2.0-dev0" +colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} +dill = {version = ">=0.3.6", markers = "python_version >= \"3.11\""} +isort = ">=4.2.5,<5.13.0 || >5.13.0,<6" +mccabe = ">=0.6,<0.8" +platformdirs = ">=2.2.0" +tomlkit = ">=0.10.1" + +[package.extras] +spelling = ["pyenchant (>=3.2,<4.0)"] +testutils = ["gitpython (>3)"] + +[[package]] +name = "pymdown-extensions" +version = "10.7.1" +description = "Extension pack for Python Markdown." +optional = false +python-versions = ">=3.8" +files = [ + {file = "pymdown_extensions-10.7.1-py3-none-any.whl", hash = "sha256:f5cc7000d7ff0d1ce9395d216017fa4df3dde800afb1fb72d1c7d3fd35e710f4"}, + {file = "pymdown_extensions-10.7.1.tar.gz", hash = "sha256:c70e146bdd83c744ffc766b4671999796aba18842b268510a329f7f64700d584"}, +] + +[package.dependencies] +markdown = ">=3.5" +pyyaml = "*" + +[package.extras] +extra = ["pygments (>=2.12)"] + +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +description = "Extensions to the standard Python datetime module" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +files = [ + {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, + {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, +] + +[package.dependencies] +six = ">=1.5" + +[[package]] +name = "pytz" +version = "2024.1" +description = "World timezone definitions, modern and historical" +optional = false +python-versions = "*" +files = [ + {file = "pytz-2024.1-py2.py3-none-any.whl", hash = "sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319"}, + {file = "pytz-2024.1.tar.gz", hash = "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812"}, +] + +[[package]] +name = "pyyaml" +version = "6.0.1" +description = "YAML parser and emitter for Python" +optional = false +python-versions = ">=3.6" +files = [ + {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"}, + {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, + {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, + {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, + {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, + {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, + {file = "PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, + {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, + {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, + {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, + {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, + {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, + {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, + {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd"}, + {file = "PyYAML-6.0.1-cp36-cp36m-win32.whl", hash = "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585"}, + {file = "PyYAML-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa"}, + {file = "PyYAML-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c"}, + {file = "PyYAML-6.0.1-cp37-cp37m-win32.whl", hash = "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba"}, + {file = "PyYAML-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867"}, + {file = "PyYAML-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, + {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, + {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, + {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, + {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, + {file = "PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, + {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, + {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, + {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, + {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, +] + +[[package]] +name = "pyyaml-env-tag" +version = "0.1" +description = "A custom YAML tag for referencing environment variables in YAML files. " +optional = false +python-versions = ">=3.6" +files = [ + {file = "pyyaml_env_tag-0.1-py3-none-any.whl", hash = "sha256:af31106dec8a4d68c60207c1886031cbf839b68aa7abccdb19868200532c2069"}, + {file = "pyyaml_env_tag-0.1.tar.gz", hash = "sha256:70092675bda14fdec33b31ba77e7543de9ddc88f2e5b99160396572d11525bdb"}, +] + +[package.dependencies] +pyyaml = "*" + +[[package]] +name = "rapidfuzz" +version = "3.6.2" +description = "rapid fuzzy string matching" +optional = false +python-versions = ">=3.8" +files = [ + {file = "rapidfuzz-3.6.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a5637e6bf11b15b5aff6ee818c76bdec99ad208511b78985e6209ba648a6e3ee"}, + {file = "rapidfuzz-3.6.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:380586664f2f63807050ddb95e7702888b4f0b425abf17655940c411f39287ad"}, + {file = "rapidfuzz-3.6.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3168ff565d4b8c239cf11fb604dd2507d30e9bcaac76a4077c0ac23cf2c866ed"}, + {file = "rapidfuzz-3.6.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:be69f7fd46b5c6467fe5e2fd4cff3816b0c03048eed8a4becb9a73e6000960e7"}, + {file = "rapidfuzz-3.6.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cbd5894f23fdf5697499cf759523639838ac822bd1600e343fdce7313baa02ae"}, + {file = "rapidfuzz-3.6.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:85a5b6e026393fe39fb61146b9c17c5af66fffbe1410e992c4bb06d9ec327bd3"}, + {file = "rapidfuzz-3.6.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ab269adfc64480f209e99f253391a10735edd5c09046e04899adab5fb132f20e"}, + {file = "rapidfuzz-3.6.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:35aeac852bca06023d6bbd50c1fc504ca5a9a3613d5e75a140f0be7601fa34ef"}, + {file = "rapidfuzz-3.6.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e706f302c6a3ae0d74edd0d6ace46aee1ae07c563b436ccf5ff04db2b3571e60"}, + {file = "rapidfuzz-3.6.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:bec353f022011e6e5cd28ccb8700fbd2a33918197af0d4e0abb3c3f4845cc864"}, + {file = "rapidfuzz-3.6.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:ef3925daaa93eed20401012e219f569ff0c039ed5bf4ce2d3737b4f75d441622"}, + {file = "rapidfuzz-3.6.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:6ee98d88ae9ccc77ff61992ed33b2496478def5dc0da55c9a9aa06fcb725a352"}, + {file = "rapidfuzz-3.6.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:423c7c588b09d618601097b7a0017dfcb91132a2076bef29023c5f3cd2dc3de1"}, + {file = "rapidfuzz-3.6.2-cp310-cp310-win32.whl", hash = "sha256:c17c5efee347a40a6f4c1eec59e3d7d1e22f7613a97f8b8a07733ef723483a04"}, + {file = "rapidfuzz-3.6.2-cp310-cp310-win_amd64.whl", hash = "sha256:4209816626d8d6ff8ae7dc248061c6059e618b70c6e6f6e4d7444ae3740b2b85"}, + {file = "rapidfuzz-3.6.2-cp310-cp310-win_arm64.whl", hash = "sha256:1c54d3c85e522d3ac9ee39415f183c8fa184c4f87e7e5a37938f15a6d50e853a"}, + {file = "rapidfuzz-3.6.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e06f6d270112f5db001f1cba5a97e1a48aee3d3dbdcbea3ec027c230462dbf9b"}, + {file = "rapidfuzz-3.6.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:080cb71b50cb6aff11d1c6aeb157f273e2da0b2bdb3f9d7b01257e49e69a8576"}, + {file = "rapidfuzz-3.6.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a7895e04a22d6515bc91a850e0831f2405547605aa311d1ffec51e4818abc3c1"}, + {file = "rapidfuzz-3.6.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd82f9838519136b7083dd1e3149ee80344521f3dc37f744f227505ff0883efb"}, + {file = "rapidfuzz-3.6.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a945567c2b0b6e069454c9782d5234b0b6795718adf7a9f868bd3144afa6a023"}, + {file = "rapidfuzz-3.6.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:673ba2c343644805acdae1cb949c6a4de71aa2f62a998978551ebea59603af3f"}, + {file = "rapidfuzz-3.6.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9d457c89bac1471442002e70551e8268e639b3870b4a4521eae363c07253be87"}, + {file = "rapidfuzz-3.6.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:495c0d8e14e6f12520eb7fc71b9ba9fcaafb47fc23a654e6e89b6c7985ec0020"}, + {file = "rapidfuzz-3.6.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6d67b649bf3e1b1722d04eca44d37919aef88305ce7ad05564502d013cf550fd"}, + {file = "rapidfuzz-3.6.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:e48dde8ca83d11daa00900cf6a5d281a1297aef9b7bfa73801af6e8822be5019"}, + {file = "rapidfuzz-3.6.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:824cc381cf81cbf8d158f6935664ec2a69e6ac3b1d39fa201988bf81a257f775"}, + {file = "rapidfuzz-3.6.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:1dfe4c24957474ce0ac75d886387e30e292b4be39228a6d71f76de414dc187db"}, + {file = "rapidfuzz-3.6.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d57b98013b802621bbc8b12a46bfc9d36ac552ab51ca207f7ce167ad46adabeb"}, + {file = "rapidfuzz-3.6.2-cp311-cp311-win32.whl", hash = "sha256:9a07dffac439223b4f1025dbfc68f4445a3460a859309c9858c2a3fa29617cdc"}, + {file = "rapidfuzz-3.6.2-cp311-cp311-win_amd64.whl", hash = "sha256:95a49c6b8bf1229743ae585dd5b7d57f0d15a7eb6e826866d5c9965ba958503c"}, + {file = "rapidfuzz-3.6.2-cp311-cp311-win_arm64.whl", hash = "sha256:af7c19ec86e11488539380d3db1755be5d561a3c0e7b04ff9d07abd7f9a8e9d8"}, + {file = "rapidfuzz-3.6.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:de8adc12161bf282c60f12dc9233bb31632f71d446a010fe7469a69b8153427f"}, + {file = "rapidfuzz-3.6.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:337e357f693130c4c6be740652542b260e36f622c59e01fa33d58f1d2750c930"}, + {file = "rapidfuzz-3.6.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6468f8bc8c3c50604f43631550ef9cfec873515dba5023ca34d461be94669fc8"}, + {file = "rapidfuzz-3.6.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:74c6773b11445b5e5cf93ca383171cd0ac0cdeafea11a7b2a5688f8bf8d813e6"}, + {file = "rapidfuzz-3.6.2-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e1507fc5769aa109dda4de3a15f822a0f6a03e18d627bd0ba3ddbb253cf70e07"}, + {file = "rapidfuzz-3.6.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:617949a70150e6fffdaed19253dd49f7a53528411dc8bf7663d499ba21e0f61e"}, + {file = "rapidfuzz-3.6.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f8b77779174b1b40aa70827692571ab457061897846255ad7d5d559e2edb1932"}, + {file = "rapidfuzz-3.6.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80e51b22a7da83f9c87a97e92df07ed0612c74c35496590255f4b5d5b4212dfe"}, + {file = "rapidfuzz-3.6.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3ae7c86914cb6673e97e187ba431b9c4cf4177d9ae77f8a1e5b2ba9a5628839e"}, + {file = "rapidfuzz-3.6.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:ddc380ffaa90f204cc9ddcb779114b9ab6f015246d549de9d47871a97ef9f18a"}, + {file = "rapidfuzz-3.6.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:3c1dc078ef371fce09f9f3eec2ca4eaa2a8cd412ec53941015b4f39f14d34407"}, + {file = "rapidfuzz-3.6.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:9a74102fc5a2534fe91f7507838623e1f3a149d8e05648389c42bb42e14b1c3f"}, + {file = "rapidfuzz-3.6.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:48e1eaea8fcd522fca7f04f0480663f0f0cfb77957092cce60a93f4462864996"}, + {file = "rapidfuzz-3.6.2-cp312-cp312-win32.whl", hash = "sha256:66b008bf2972740cd2dda5d382eb8bdb87265cd88198e71c7797bdc0d1f79d20"}, + {file = "rapidfuzz-3.6.2-cp312-cp312-win_amd64.whl", hash = "sha256:87ac3a87f2251ae2e95fc9478ca5c759de6d141d04c84d3fec9f9cdcfc167b33"}, + {file = "rapidfuzz-3.6.2-cp312-cp312-win_arm64.whl", hash = "sha256:b593cc51aed887e93b78c2f94dfae9008be2b23d17afd3b1f1d3eb3913b58f26"}, + {file = "rapidfuzz-3.6.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:7d830bc7a9b586a374147ec60b08b1f9ae5996b43f75cc514f37faef3866b519"}, + {file = "rapidfuzz-3.6.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:dbee7f5ff11872b76505cbd87c814abc823e8757f11c69062eb3b25130a283da"}, + {file = "rapidfuzz-3.6.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:28c011fb31f2c3f82f503aedd6097d3d3854e574e327a119a3b7eb2cf90b79ca"}, + {file = "rapidfuzz-3.6.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cda81d0e0ce0c13abfa46b24e10c1e85f9c6acb628f0a9a948f5779f9c2076a2"}, + {file = "rapidfuzz-3.6.2-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c279928651ce0e9e5220dcb25a00cc53b65e592a0861336a38299bcdca3a596"}, + {file = "rapidfuzz-3.6.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:35bd4bc9c40e6994c5d6edea4b9319388b4d9711c13c66d543bb4c37624b4184"}, + {file = "rapidfuzz-3.6.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d07899506a5a8760448d9df036d528b55a554bf571714173635c79eef4a86e58"}, + {file = "rapidfuzz-3.6.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eb2e51d01b9c6d6954a3e055c57a80d4685b4fc82719db5519fc153566bcd6bb"}, + {file = "rapidfuzz-3.6.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:153d065e353371cc0aeff32b99999a5758266a64e958d1364189367c1c9f6814"}, + {file = "rapidfuzz-3.6.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4edcceebb85ebfa49a3ddcde20ad891d36c08dc0fd592efdab0e7d313a4e36af"}, + {file = "rapidfuzz-3.6.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:3549123fca5bb817341025f98e8e49ca99f84596c7c4f92b658f8e5836040d4a"}, + {file = "rapidfuzz-3.6.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:84c1032ae42628465b7a5cc35249906061e18a8193c9c27cbd2db54e9823a9a6"}, + {file = "rapidfuzz-3.6.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:9bcc91ebd8fc69a6bd3b5711c8250f5f4e70606b4da75ef415f57ad209978205"}, + {file = "rapidfuzz-3.6.2-cp38-cp38-win32.whl", hash = "sha256:f3a70f341c4c111bad910d2df69c78577a98af140319a996af24c9385939335d"}, + {file = "rapidfuzz-3.6.2-cp38-cp38-win_amd64.whl", hash = "sha256:354ad5fe655beb7b279390cb58334903931c5452ecbad1b1666ffb06786498e2"}, + {file = "rapidfuzz-3.6.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:1b86b93d93020c2b3edc1665d75c8855784845fc0a739b312c26c3a4bf0c80d5"}, + {file = "rapidfuzz-3.6.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:28243086ed0e50808bb56632e5442c457241646aeafafd501ac87901f40a3237"}, + {file = "rapidfuzz-3.6.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ed52461ae5a9ea4c400d38e2649c74a413f1a6d8fb8308b66f1fbd122514732f"}, + {file = "rapidfuzz-3.6.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2a46220f86a5f9cb016af31525e0d0865cad437d02239aa0d8aed2ab8bff1f1c"}, + {file = "rapidfuzz-3.6.2-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:81a630ed2fc3ec5fc7400eb66bab1f87e282b4d47f0abe3e48c6634dfa13b5e4"}, + {file = "rapidfuzz-3.6.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d8e5a437b9089df6242a718d9c31ab1742989e9400a0977af012ef483b63b4c2"}, + {file = "rapidfuzz-3.6.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:16270b5529de83b7bae7457e952e4d9cf3fbf029a837dd32d415bb9e0eb8e599"}, + {file = "rapidfuzz-3.6.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5378c04102c7f084cde30a100154fa6d7e2baf0d51a6bdd2f912545559c1fb35"}, + {file = "rapidfuzz-3.6.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7f18397c8d6a65fc0b288d2fc29bc7baeea6ba91eeb95163a3cd98f23cd3bc85"}, + {file = "rapidfuzz-3.6.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:2acd2514defce81e6ff4bbff50252d5e7df8e85a731442c4b83e44c86cf1c916"}, + {file = "rapidfuzz-3.6.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:1df2faf80201952e252413b6fac6f3e146080dcebb87bb1bb722508e67558ed8"}, + {file = "rapidfuzz-3.6.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:6440ed0b3007c1c9286b0b88fe2ab2d9e83edd60cd62293b3dfabb732b4e8a30"}, + {file = "rapidfuzz-3.6.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4fcfa23b5553b27f4016df77c53172ea743454cf12c28cfa7c35a309a2be93b3"}, + {file = "rapidfuzz-3.6.2-cp39-cp39-win32.whl", hash = "sha256:2d580d937146e803c8e5e1b87916cab8d6f84013b6392713e201efcda335c7d8"}, + {file = "rapidfuzz-3.6.2-cp39-cp39-win_amd64.whl", hash = "sha256:fe2a68be734e8e88af23385c68d6467e15818b6b1df1cbfebf7bff577226c957"}, + {file = "rapidfuzz-3.6.2-cp39-cp39-win_arm64.whl", hash = "sha256:6478f7803efebf5f644d0b758439c5b25728550fdfbb19783d150004c46a75a9"}, + {file = "rapidfuzz-3.6.2-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:36ce7b68a7b90b787cdd73480a68d2f1ca63c31a3a9d5a79a8736f978e1e9344"}, + {file = "rapidfuzz-3.6.2-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:53597fd72a9340bcdd80d3620f4957c2b92f9b569313b969a3abdaffd193aae6"}, + {file = "rapidfuzz-3.6.2-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d4f6de745fe6ce46a422d353ee10599013631d7d714a36d025f164b2d4e8c000"}, + {file = "rapidfuzz-3.6.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:62df2136068e2515ed8beb01756381ff62c29384d785e3bf46e3111d4ea3ba1e"}, + {file = "rapidfuzz-3.6.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:7382c90170f60c846c81a07ddd80bb2e8c43c8383754486fa37f67391a571897"}, + {file = "rapidfuzz-3.6.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:f31314fd2e2f3dc3e519e6f93669462ce7953df2def1c344aa8f5345976d0eb2"}, + {file = "rapidfuzz-3.6.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:012221629d54d3bee954148247f711eb86d4d390b589ebfe03172ea0b37a7531"}, + {file = "rapidfuzz-3.6.2-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d41dd59a70decfce6595315367a2fea2af660d92a9d144acc6479030501014d7"}, + {file = "rapidfuzz-3.6.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f9fa14136a5b0cba1ec42531f7c3e0b0d3edb7fd6bc5e5ae7b498541f3855ab"}, + {file = "rapidfuzz-3.6.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:259364199cbfeca33b1af369fc7951f71717aa285184a3fa5a7b1772da1b89db"}, + {file = "rapidfuzz-3.6.2.tar.gz", hash = "sha256:cf911e792ab0c431694c9bf2648afabfd92099103f2e31492893e078ddca5e1a"}, +] + +[package.extras] +full = ["numpy"] + +[[package]] +name = "red-commons" +version = "1.0.0" +description = "Common utilities used by multiple projects maintained by Cog Creators." +optional = false +python-versions = ">=3.8" +files = [ + {file = "Red-Commons-1.0.0.tar.gz", hash = "sha256:b9bcc55c72801c33eb0c77aaf48041d018bfb5f1293053cff8a3e10e4d33e52d"}, + {file = "red_commons-1.0.0-py3-none-any.whl", hash = "sha256:7007b70abfe8e2c9a8e03f8b60810ab1201c4d8274974e0c3842d972cb25af44"}, +] + +[package.extras] +dev = ["black (==22.1.0)", "flake8 (==4.0.1)", "isort (==5.10.1)"] + +[[package]] +name = "red-discordbot" +version = "3.5.7" +description = "A highly customisable Discord bot" +optional = false +python-versions = "<3.12,>=3.8.1" +files = [ + {file = "Red-DiscordBot-3.5.7.tar.gz", hash = "sha256:7673ea794016b6d3d7b96eb07a46cd92c52974e15b3a6ad95608df69dc320838"}, + {file = "Red_DiscordBot-3.5.7-py3-none-any.whl", hash = "sha256:3b9df02cd8efd35170c9505e3f0a8c9b1bd415bcc2ca451a19733d28b1b3a5b4"}, +] + +[package.dependencies] +aiohttp = "3.9.3" +aiohttp-json-rpc = "0.13.3" +aiosignal = "1.3.1" +apsw = "3.45.2.0" +attrs = "23.2.0" +babel = "2.14.0" +brotli = "1.1.0" +click = "8.1.7" +colorama = {version = "0.4.6", markers = "sys_platform == \"win32\""} +contextlib2 = "21.6.0" +discord-py = "2.3.2" +distro = {version = "1.9.0", markers = "sys_platform == \"linux\""} +frozenlist = "1.4.1" +idna = "3.6" +markdown = "3.6" +markdown-it-py = "3.0.0" +mdurl = "0.1.2" +multidict = "6.0.5" +orjson = "3.9.15" +packaging = "24.0" +platformdirs = "4.2.0" +psutil = "5.9.8" +pygments = "2.17.2" +python-dateutil = "2.9.0.post0" +pyyaml = "6.0.1" +rapidfuzz = "3.6.2" +red-commons = "1.0.0" +red-lavalink = "0.11.0" +rich = "13.7.1" +schema = "0.7.5" +six = "1.16.0" +typing-extensions = "4.10.0" +uvloop = {version = "0.19.0", markers = "sys_platform != \"win32\" and platform_python_implementation == \"CPython\""} +yarl = "1.9.4" + +[package.extras] +all = ["async-timeout (==4.0.3)", "asyncpg (==0.29.0)"] +dev = ["alabaster (==0.7.13)", "astroid (==3.1.0)", "async-timeout (==4.0.3)", "asyncpg (==0.29.0)", "black (==23.12.1)", "certifi (==2024.2.2)", "charset-normalizer (==3.3.2)", "dill (==0.3.8)", "docutils (==0.20.1)", "exceptiongroup (==1.2.0)", "imagesize (==1.4.1)", "importlib-metadata (==7.1.0)", "iniconfig (==2.0.0)", "isort (==5.13.2)", "jinja2 (==3.1.3)", "markupsafe (==2.1.5)", "mccabe (==0.7.0)", "mypy-extensions (==1.0.0)", "pathspec (==0.12.1)", "pluggy (==1.4.0)", "pylint (==3.1.0)", "pytest (==7.4.4)", "pytest-asyncio (==0.21.1)", "pytest-mock (==3.12.0)", "pytz (==2024.1)", "requests (==2.31.0)", "snowballstemmer (==2.2.0)", "sphinx (==7.1.2)", "sphinx-prompt (==1.7.0)", "sphinx-rtd-theme (==2.0.0)", "sphinxcontrib-applehelp (==1.0.4)", "sphinxcontrib-devhelp (==1.0.2)", "sphinxcontrib-htmlhelp (==2.0.1)", "sphinxcontrib-jquery (==4.1)", "sphinxcontrib-jsmath (==1.0.1)", "sphinxcontrib-qthelp (==1.0.3)", "sphinxcontrib-serializinghtml (==1.1.5)", "sphinxcontrib-trio (==1.1.2)", "tomli (==2.0.1)", "tomli (==2.0.1)", "tomlkit (==0.12.4)", "urllib3 (==2.2.1)", "zipp (==3.18.1)"] +doc = ["alabaster (==0.7.13)", "certifi (==2024.2.2)", "charset-normalizer (==3.3.2)", "docutils (==0.20.1)", "imagesize (==1.4.1)", "importlib-metadata (==7.1.0)", "jinja2 (==3.1.3)", "markupsafe (==2.1.5)", "pytz (==2024.1)", "requests (==2.31.0)", "snowballstemmer (==2.2.0)", "sphinx (==7.1.2)", "sphinx-prompt (==1.7.0)", "sphinx-rtd-theme (==2.0.0)", "sphinxcontrib-applehelp (==1.0.4)", "sphinxcontrib-devhelp (==1.0.2)", "sphinxcontrib-htmlhelp (==2.0.1)", "sphinxcontrib-jquery (==4.1)", "sphinxcontrib-jsmath (==1.0.1)", "sphinxcontrib-qthelp (==1.0.3)", "sphinxcontrib-serializinghtml (==1.1.5)", "sphinxcontrib-trio (==1.1.2)", "urllib3 (==2.2.1)", "zipp (==3.18.1)"] +postgres = ["async-timeout (==4.0.3)", "asyncpg (==0.29.0)"] +style = ["black (==23.12.1)", "mypy-extensions (==1.0.0)", "pathspec (==0.12.1)", "tomli (==2.0.1)"] +test = ["astroid (==3.1.0)", "dill (==0.3.8)", "exceptiongroup (==1.2.0)", "iniconfig (==2.0.0)", "isort (==5.13.2)", "mccabe (==0.7.0)", "pluggy (==1.4.0)", "pylint (==3.1.0)", "pytest (==7.4.4)", "pytest-asyncio (==0.21.1)", "pytest-mock (==3.12.0)", "tomli (==2.0.1)", "tomlkit (==0.12.4)"] + +[[package]] +name = "red-lavalink" +version = "0.11.0" +description = "Lavalink client library for Red-DiscordBot" +optional = false +python-versions = ">=3.8.1" +files = [ + {file = "Red-Lavalink-0.11.0.tar.gz", hash = "sha256:6ee2671dfc43a96b7e6be4effaa4137024de51bc5681f64a67c125bc3b7d4f99"}, + {file = "Red_Lavalink-0.11.0-py3-none-any.whl", hash = "sha256:f76329eee2ec5e4d77e0e97fe6ba76207efdcc8d963a9c39913cf91057d7920a"}, +] + +[package.dependencies] +aiohttp = ">=3.6.0" +"discord.py" = ">=2.0.0" +Red-Commons = ">=1.0.0,<2" + +[package.extras] +doc = ["sphinx", "sphinx-rtd-theme", "sphinxcontrib-trio"] +test = ["pytest (>=7)", "pytest-asyncio (>=0.19)"] + +[[package]] +name = "regex" +version = "2023.12.25" +description = "Alternative regular expression module, to replace re." +optional = false +python-versions = ">=3.7" +files = [ + {file = "regex-2023.12.25-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0694219a1d54336fd0445ea382d49d36882415c0134ee1e8332afd1529f0baa5"}, + {file = "regex-2023.12.25-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b014333bd0217ad3d54c143de9d4b9a3ca1c5a29a6d0d554952ea071cff0f1f8"}, + {file = "regex-2023.12.25-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d865984b3f71f6d0af64d0d88f5733521698f6c16f445bb09ce746c92c97c586"}, + {file = "regex-2023.12.25-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e0eabac536b4cc7f57a5f3d095bfa557860ab912f25965e08fe1545e2ed8b4c"}, + {file = "regex-2023.12.25-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c25a8ad70e716f96e13a637802813f65d8a6760ef48672aa3502f4c24ea8b400"}, + {file = "regex-2023.12.25-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a9b6d73353f777630626f403b0652055ebfe8ff142a44ec2cf18ae470395766e"}, + {file = "regex-2023.12.25-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9cc99d6946d750eb75827cb53c4371b8b0fe89c733a94b1573c9dd16ea6c9e4"}, + {file = "regex-2023.12.25-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88d1f7bef20c721359d8675f7d9f8e414ec5003d8f642fdfd8087777ff7f94b5"}, + {file = "regex-2023.12.25-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cb3fe77aec8f1995611f966d0c656fdce398317f850d0e6e7aebdfe61f40e1cd"}, + {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7aa47c2e9ea33a4a2a05f40fcd3ea36d73853a2aae7b4feab6fc85f8bf2c9704"}, + {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:df26481f0c7a3f8739fecb3e81bc9da3fcfae34d6c094563b9d4670b047312e1"}, + {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:c40281f7d70baf6e0db0c2f7472b31609f5bc2748fe7275ea65a0b4601d9b392"}, + {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:d94a1db462d5690ebf6ae86d11c5e420042b9898af5dcf278bd97d6bda065423"}, + {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ba1b30765a55acf15dce3f364e4928b80858fa8f979ad41f862358939bdd1f2f"}, + {file = "regex-2023.12.25-cp310-cp310-win32.whl", hash = "sha256:150c39f5b964e4d7dba46a7962a088fbc91f06e606f023ce57bb347a3b2d4630"}, + {file = "regex-2023.12.25-cp310-cp310-win_amd64.whl", hash = "sha256:09da66917262d9481c719599116c7dc0c321ffcec4b1f510c4f8a066f8768105"}, + {file = "regex-2023.12.25-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1b9d811f72210fa9306aeb88385b8f8bcef0dfbf3873410413c00aa94c56c2b6"}, + {file = "regex-2023.12.25-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d902a43085a308cef32c0d3aea962524b725403fd9373dea18110904003bac97"}, + {file = "regex-2023.12.25-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d166eafc19f4718df38887b2bbe1467a4f74a9830e8605089ea7a30dd4da8887"}, + {file = "regex-2023.12.25-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7ad32824b7f02bb3c9f80306d405a1d9b7bb89362d68b3c5a9be53836caebdb"}, + {file = "regex-2023.12.25-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:636ba0a77de609d6510235b7f0e77ec494d2657108f777e8765efc060094c98c"}, + {file = "regex-2023.12.25-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fda75704357805eb953a3ee15a2b240694a9a514548cd49b3c5124b4e2ad01b"}, + {file = "regex-2023.12.25-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f72cbae7f6b01591f90814250e636065850c5926751af02bb48da94dfced7baa"}, + {file = "regex-2023.12.25-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:db2a0b1857f18b11e3b0e54ddfefc96af46b0896fb678c85f63fb8c37518b3e7"}, + {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:7502534e55c7c36c0978c91ba6f61703faf7ce733715ca48f499d3dbbd7657e0"}, + {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:e8c7e08bb566de4faaf11984af13f6bcf6a08f327b13631d41d62592681d24fe"}, + {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:283fc8eed679758de38fe493b7d7d84a198b558942b03f017b1f94dda8efae80"}, + {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:f44dd4d68697559d007462b0a3a1d9acd61d97072b71f6d1968daef26bc744bd"}, + {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:67d3ccfc590e5e7197750fcb3a2915b416a53e2de847a728cfa60141054123d4"}, + {file = "regex-2023.12.25-cp311-cp311-win32.whl", hash = "sha256:68191f80a9bad283432385961d9efe09d783bcd36ed35a60fb1ff3f1ec2efe87"}, + {file = "regex-2023.12.25-cp311-cp311-win_amd64.whl", hash = "sha256:7d2af3f6b8419661a0c421584cfe8aaec1c0e435ce7e47ee2a97e344b98f794f"}, + {file = "regex-2023.12.25-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8a0ccf52bb37d1a700375a6b395bff5dd15c50acb745f7db30415bae3c2b0715"}, + {file = "regex-2023.12.25-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c3c4a78615b7762740531c27cf46e2f388d8d727d0c0c739e72048beb26c8a9d"}, + {file = "regex-2023.12.25-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ad83e7545b4ab69216cef4cc47e344d19622e28aabec61574b20257c65466d6a"}, + {file = "regex-2023.12.25-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b7a635871143661feccce3979e1727c4e094f2bdfd3ec4b90dfd4f16f571a87a"}, + {file = "regex-2023.12.25-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d498eea3f581fbe1b34b59c697512a8baef88212f92e4c7830fcc1499f5b45a5"}, + {file = "regex-2023.12.25-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:43f7cd5754d02a56ae4ebb91b33461dc67be8e3e0153f593c509e21d219c5060"}, + {file = "regex-2023.12.25-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:51f4b32f793812714fd5307222a7f77e739b9bc566dc94a18126aba3b92b98a3"}, + {file = "regex-2023.12.25-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ba99d8077424501b9616b43a2d208095746fb1284fc5ba490139651f971d39d9"}, + {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:4bfc2b16e3ba8850e0e262467275dd4d62f0d045e0e9eda2bc65078c0110a11f"}, + {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8c2c19dae8a3eb0ea45a8448356ed561be843b13cbc34b840922ddf565498c1c"}, + {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:60080bb3d8617d96f0fb7e19796384cc2467447ef1c491694850ebd3670bc457"}, + {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b77e27b79448e34c2c51c09836033056a0547aa360c45eeeb67803da7b0eedaf"}, + {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:518440c991f514331f4850a63560321f833979d145d7d81186dbe2f19e27ae3d"}, + {file = "regex-2023.12.25-cp312-cp312-win32.whl", hash = "sha256:e2610e9406d3b0073636a3a2e80db05a02f0c3169b5632022b4e81c0364bcda5"}, + {file = "regex-2023.12.25-cp312-cp312-win_amd64.whl", hash = "sha256:cc37b9aeebab425f11f27e5e9e6cf580be7206c6582a64467a14dda211abc232"}, + {file = "regex-2023.12.25-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:da695d75ac97cb1cd725adac136d25ca687da4536154cdc2815f576e4da11c69"}, + {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d126361607b33c4eb7b36debc173bf25d7805847346dd4d99b5499e1fef52bc7"}, + {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4719bb05094d7d8563a450cf8738d2e1061420f79cfcc1fa7f0a44744c4d8f73"}, + {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5dd58946bce44b53b06d94aa95560d0b243eb2fe64227cba50017a8d8b3cd3e2"}, + {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:22a86d9fff2009302c440b9d799ef2fe322416d2d58fc124b926aa89365ec482"}, + {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2aae8101919e8aa05ecfe6322b278f41ce2994c4a430303c4cd163fef746e04f"}, + {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e692296c4cc2873967771345a876bcfc1c547e8dd695c6b89342488b0ea55cd8"}, + {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:263ef5cc10979837f243950637fffb06e8daed7f1ac1e39d5910fd29929e489a"}, + {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:d6f7e255e5fa94642a0724e35406e6cb7001c09d476ab5fce002f652b36d0c39"}, + {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:88ad44e220e22b63b0f8f81f007e8abbb92874d8ced66f32571ef8beb0643b2b"}, + {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:3a17d3ede18f9cedcbe23d2daa8a2cd6f59fe2bf082c567e43083bba3fb00347"}, + {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d15b274f9e15b1a0b7a45d2ac86d1f634d983ca40d6b886721626c47a400bf39"}, + {file = "regex-2023.12.25-cp37-cp37m-win32.whl", hash = "sha256:ed19b3a05ae0c97dd8f75a5d8f21f7723a8c33bbc555da6bbe1f96c470139d3c"}, + {file = "regex-2023.12.25-cp37-cp37m-win_amd64.whl", hash = "sha256:a6d1047952c0b8104a1d371f88f4ab62e6275567d4458c1e26e9627ad489b445"}, + {file = "regex-2023.12.25-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:b43523d7bc2abd757119dbfb38af91b5735eea45537ec6ec3a5ec3f9562a1c53"}, + {file = "regex-2023.12.25-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:efb2d82f33b2212898f1659fb1c2e9ac30493ac41e4d53123da374c3b5541e64"}, + {file = "regex-2023.12.25-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b7fca9205b59c1a3d5031f7e64ed627a1074730a51c2a80e97653e3e9fa0d415"}, + {file = "regex-2023.12.25-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:086dd15e9435b393ae06f96ab69ab2d333f5d65cbe65ca5a3ef0ec9564dfe770"}, + {file = "regex-2023.12.25-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e81469f7d01efed9b53740aedd26085f20d49da65f9c1f41e822a33992cb1590"}, + {file = "regex-2023.12.25-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:34e4af5b27232f68042aa40a91c3b9bb4da0eeb31b7632e0091afc4310afe6cb"}, + {file = "regex-2023.12.25-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9852b76ab558e45b20bf1893b59af64a28bd3820b0c2efc80e0a70a4a3ea51c1"}, + {file = "regex-2023.12.25-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ff100b203092af77d1a5a7abe085b3506b7eaaf9abf65b73b7d6905b6cb76988"}, + {file = "regex-2023.12.25-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cc038b2d8b1470364b1888a98fd22d616fba2b6309c5b5f181ad4483e0017861"}, + {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:094ba386bb5c01e54e14434d4caabf6583334090865b23ef58e0424a6286d3dc"}, + {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5cd05d0f57846d8ba4b71d9c00f6f37d6b97d5e5ef8b3c3840426a475c8f70f4"}, + {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:9aa1a67bbf0f957bbe096375887b2505f5d8ae16bf04488e8b0f334c36e31360"}, + {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:98a2636994f943b871786c9e82bfe7883ecdaba2ef5df54e1450fa9869d1f756"}, + {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:37f8e93a81fc5e5bd8db7e10e62dc64261bcd88f8d7e6640aaebe9bc180d9ce2"}, + {file = "regex-2023.12.25-cp38-cp38-win32.whl", hash = "sha256:d78bd484930c1da2b9679290a41cdb25cc127d783768a0369d6b449e72f88beb"}, + {file = "regex-2023.12.25-cp38-cp38-win_amd64.whl", hash = "sha256:b521dcecebc5b978b447f0f69b5b7f3840eac454862270406a39837ffae4e697"}, + {file = "regex-2023.12.25-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f7bc09bc9c29ebead055bcba136a67378f03d66bf359e87d0f7c759d6d4ffa31"}, + {file = "regex-2023.12.25-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e14b73607d6231f3cc4622809c196b540a6a44e903bcfad940779c80dffa7be7"}, + {file = "regex-2023.12.25-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9eda5f7a50141291beda3edd00abc2d4a5b16c29c92daf8d5bd76934150f3edc"}, + {file = "regex-2023.12.25-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc6bb9aa69aacf0f6032c307da718f61a40cf970849e471254e0e91c56ffca95"}, + {file = "regex-2023.12.25-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:298dc6354d414bc921581be85695d18912bea163a8b23cac9a2562bbcd5088b1"}, + {file = "regex-2023.12.25-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2f4e475a80ecbd15896a976aa0b386c5525d0ed34d5c600b6d3ebac0a67c7ddf"}, + {file = "regex-2023.12.25-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:531ac6cf22b53e0696f8e1d56ce2396311254eb806111ddd3922c9d937151dae"}, + {file = "regex-2023.12.25-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:22f3470f7524b6da61e2020672df2f3063676aff444db1daa283c2ea4ed259d6"}, + {file = "regex-2023.12.25-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:89723d2112697feaa320c9d351e5f5e7b841e83f8b143dba8e2d2b5f04e10923"}, + {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0ecf44ddf9171cd7566ef1768047f6e66975788258b1c6c6ca78098b95cf9a3d"}, + {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:905466ad1702ed4acfd67a902af50b8db1feeb9781436372261808df7a2a7bca"}, + {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:4558410b7a5607a645e9804a3e9dd509af12fb72b9825b13791a37cd417d73a5"}, + {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:7e316026cc1095f2a3e8cc012822c99f413b702eaa2ca5408a513609488cb62f"}, + {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3b1de218d5375cd6ac4b5493e0b9f3df2be331e86520f23382f216c137913d20"}, + {file = "regex-2023.12.25-cp39-cp39-win32.whl", hash = "sha256:11a963f8e25ab5c61348d090bf1b07f1953929c13bd2309a0662e9ff680763c9"}, + {file = "regex-2023.12.25-cp39-cp39-win_amd64.whl", hash = "sha256:e693e233ac92ba83a87024e1d32b5f9ab15ca55ddd916d878146f4e3406b5c91"}, + {file = "regex-2023.12.25.tar.gz", hash = "sha256:29171aa128da69afdf4bde412d5bedc335f2ca8fcfe4489038577d05f16181e5"}, +] + +[[package]] +name = "requests" +version = "2.31.0" +description = "Python HTTP for Humans." +optional = false +python-versions = ">=3.7" +files = [ + {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, + {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, +] + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = ">=2,<4" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<3" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] + +[[package]] +name = "rich" +version = "13.7.1" +description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "rich-13.7.1-py3-none-any.whl", hash = "sha256:4edbae314f59eb482f54e9e30bf00d33350aaa94f4bfcd4e9e3110e64d0d7222"}, + {file = "rich-13.7.1.tar.gz", hash = "sha256:9be308cb1fe2f1f57d67ce99e95af38a1e2bc71ad9813b0e247cf7ffbcc3a432"}, +] + +[package.dependencies] +markdown-it-py = ">=2.2.0" +pygments = ">=2.13.0,<3.0.0" + +[package.extras] +jupyter = ["ipywidgets (>=7.5.1,<9)"] + +[[package]] +name = "ruff" +version = "0.3.4" +description = "An extremely fast Python linter and code formatter, written in Rust." +optional = false +python-versions = ">=3.7" +files = [ + {file = "ruff-0.3.4-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:60c870a7d46efcbc8385d27ec07fe534ac32f3b251e4fc44b3cbfd9e09609ef4"}, + {file = "ruff-0.3.4-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:6fc14fa742e1d8f24910e1fff0bd5e26d395b0e0e04cc1b15c7c5e5fe5b4af91"}, + {file = "ruff-0.3.4-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d3ee7880f653cc03749a3bfea720cf2a192e4f884925b0cf7eecce82f0ce5854"}, + {file = "ruff-0.3.4-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:cf133dd744f2470b347f602452a88e70dadfbe0fcfb5fd46e093d55da65f82f7"}, + {file = "ruff-0.3.4-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3f3860057590e810c7ffea75669bdc6927bfd91e29b4baa9258fd48b540a4365"}, + {file = "ruff-0.3.4-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:986f2377f7cf12efac1f515fc1a5b753c000ed1e0a6de96747cdf2da20a1b369"}, + {file = "ruff-0.3.4-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4fd98e85869603e65f554fdc5cddf0712e352fe6e61d29d5a6fe087ec82b76c"}, + {file = "ruff-0.3.4-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:64abeed785dad51801b423fa51840b1764b35d6c461ea8caef9cf9e5e5ab34d9"}, + {file = "ruff-0.3.4-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:df52972138318bc7546d92348a1ee58449bc3f9eaf0db278906eb511889c4b50"}, + {file = "ruff-0.3.4-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:98e98300056445ba2cc27d0b325fd044dc17fcc38e4e4d2c7711585bd0a958ed"}, + {file = "ruff-0.3.4-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:519cf6a0ebed244dce1dc8aecd3dc99add7a2ee15bb68cf19588bb5bf58e0488"}, + {file = "ruff-0.3.4-py3-none-musllinux_1_2_i686.whl", hash = "sha256:bb0acfb921030d00070539c038cd24bb1df73a2981e9f55942514af8b17be94e"}, + {file = "ruff-0.3.4-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:cf187a7e7098233d0d0c71175375c5162f880126c4c716fa28a8ac418dcf3378"}, + {file = "ruff-0.3.4-py3-none-win32.whl", hash = "sha256:af27ac187c0a331e8ef91d84bf1c3c6a5dea97e912a7560ac0cef25c526a4102"}, + {file = "ruff-0.3.4-py3-none-win_amd64.whl", hash = "sha256:de0d5069b165e5a32b3c6ffbb81c350b1e3d3483347196ffdf86dc0ef9e37dd6"}, + {file = "ruff-0.3.4-py3-none-win_arm64.whl", hash = "sha256:6810563cc08ad0096b57c717bd78aeac888a1bfd38654d9113cb3dc4d3f74232"}, + {file = "ruff-0.3.4.tar.gz", hash = "sha256:f0f4484c6541a99862b693e13a151435a279b271cff20e37101116a21e2a1ad1"}, +] + +[[package]] +name = "schema" +version = "0.7.5" +description = "Simple data validation library" +optional = false +python-versions = "*" +files = [ + {file = "schema-0.7.5-py2.py3-none-any.whl", hash = "sha256:f3ffdeeada09ec34bf40d7d79996d9f7175db93b7a5065de0faa7f41083c1e6c"}, + {file = "schema-0.7.5.tar.gz", hash = "sha256:f06717112c61895cabc4707752b88716e8420a8819d71404501e114f91043197"}, +] + +[package.dependencies] +contextlib2 = ">=0.5.5" + +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] + +[[package]] +name = "smmap" +version = "5.0.1" +description = "A pure Python implementation of a sliding window memory map manager" +optional = false +python-versions = ">=3.7" +files = [ + {file = "smmap-5.0.1-py3-none-any.whl", hash = "sha256:e6d8668fa5f93e706934a62d7b4db19c8d9eb8cf2adbb75ef1b675aa332b69da"}, + {file = "smmap-5.0.1.tar.gz", hash = "sha256:dceeb6c0028fdb6734471eb07c0cd2aae706ccaecab45965ee83f11c8d3b1f62"}, +] + +[[package]] +name = "tinycss2" +version = "1.2.1" +description = "A tiny CSS parser" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tinycss2-1.2.1-py3-none-any.whl", hash = "sha256:2b80a96d41e7c3914b8cda8bc7f705a4d9c49275616e886103dd839dfc847847"}, + {file = "tinycss2-1.2.1.tar.gz", hash = "sha256:8cff3a8f066c2ec677c06dbc7b45619804a6938478d9d73c284b29d14ecb0627"}, +] + +[package.dependencies] +webencodings = ">=0.4" + +[package.extras] +doc = ["sphinx", "sphinx_rtd_theme"] +test = ["flake8", "isort", "pytest"] + +[[package]] +name = "tomlkit" +version = "0.12.4" +description = "Style preserving TOML library" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tomlkit-0.12.4-py3-none-any.whl", hash = "sha256:5cd82d48a3dd89dee1f9d64420aa20ae65cfbd00668d6f094d7578a78efbb77b"}, + {file = "tomlkit-0.12.4.tar.gz", hash = "sha256:7ca1cfc12232806517a8515047ba66a19369e71edf2439d0f5824f91032b6cc3"}, +] + +[[package]] +name = "typing-extensions" +version = "4.10.0" +description = "Backported and Experimental Type Hints for Python 3.8+" +optional = false +python-versions = ">=3.8" +files = [ + {file = "typing_extensions-4.10.0-py3-none-any.whl", hash = "sha256:69b1a937c3a517342112fb4c6df7e72fc39a38e7891a5730ed4985b5214b5475"}, + {file = "typing_extensions-4.10.0.tar.gz", hash = "sha256:b0abd7c89e8fb96f98db18d86106ff1d90ab692004eb746cf6eda2682f91b3cb"}, +] + +[[package]] +name = "urllib3" +version = "2.2.1" +description = "HTTP library with thread-safe connection pooling, file post, and more." +optional = false +python-versions = ">=3.8" +files = [ + {file = "urllib3-2.2.1-py3-none-any.whl", hash = "sha256:450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d"}, + {file = "urllib3-2.2.1.tar.gz", hash = "sha256:d0570876c61ab9e520d776c38acbbb5b05a776d3f9ff98a5c8fd5162a444cf19"}, +] + +[package.extras] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +h2 = ["h2 (>=4,<5)"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] + +[[package]] +name = "uvloop" +version = "0.19.0" +description = "Fast implementation of asyncio event loop on top of libuv" +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "uvloop-0.19.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:de4313d7f575474c8f5a12e163f6d89c0a878bc49219641d49e6f1444369a90e"}, + {file = "uvloop-0.19.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5588bd21cf1fcf06bded085f37e43ce0e00424197e7c10e77afd4bbefffef428"}, + {file = "uvloop-0.19.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b1fd71c3843327f3bbc3237bedcdb6504fd50368ab3e04d0410e52ec293f5b8"}, + {file = "uvloop-0.19.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a05128d315e2912791de6088c34136bfcdd0c7cbc1cf85fd6fd1bb321b7c849"}, + {file = "uvloop-0.19.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:cd81bdc2b8219cb4b2556eea39d2e36bfa375a2dd021404f90a62e44efaaf957"}, + {file = "uvloop-0.19.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:5f17766fb6da94135526273080f3455a112f82570b2ee5daa64d682387fe0dcd"}, + {file = "uvloop-0.19.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4ce6b0af8f2729a02a5d1575feacb2a94fc7b2e983868b009d51c9a9d2149bef"}, + {file = "uvloop-0.19.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:31e672bb38b45abc4f26e273be83b72a0d28d074d5b370fc4dcf4c4eb15417d2"}, + {file = "uvloop-0.19.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:570fc0ed613883d8d30ee40397b79207eedd2624891692471808a95069a007c1"}, + {file = "uvloop-0.19.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5138821e40b0c3e6c9478643b4660bd44372ae1e16a322b8fc07478f92684e24"}, + {file = "uvloop-0.19.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:91ab01c6cd00e39cde50173ba4ec68a1e578fee9279ba64f5221810a9e786533"}, + {file = "uvloop-0.19.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:47bf3e9312f63684efe283f7342afb414eea4d3011542155c7e625cd799c3b12"}, + {file = "uvloop-0.19.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:da8435a3bd498419ee8c13c34b89b5005130a476bda1d6ca8cfdde3de35cd650"}, + {file = "uvloop-0.19.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:02506dc23a5d90e04d4f65c7791e65cf44bd91b37f24cfc3ef6cf2aff05dc7ec"}, + {file = "uvloop-0.19.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2693049be9d36fef81741fddb3f441673ba12a34a704e7b4361efb75cf30befc"}, + {file = "uvloop-0.19.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7010271303961c6f0fe37731004335401eb9075a12680738731e9c92ddd96ad6"}, + {file = "uvloop-0.19.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:5daa304d2161d2918fa9a17d5635099a2f78ae5b5960e742b2fcfbb7aefaa593"}, + {file = "uvloop-0.19.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:7207272c9520203fea9b93843bb775d03e1cf88a80a936ce760f60bb5add92f3"}, + {file = "uvloop-0.19.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:78ab247f0b5671cc887c31d33f9b3abfb88d2614b84e4303f1a63b46c046c8bd"}, + {file = "uvloop-0.19.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:472d61143059c84947aa8bb74eabbace30d577a03a1805b77933d6bd13ddebbd"}, + {file = "uvloop-0.19.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45bf4c24c19fb8a50902ae37c5de50da81de4922af65baf760f7c0c42e1088be"}, + {file = "uvloop-0.19.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:271718e26b3e17906b28b67314c45d19106112067205119dddbd834c2b7ce797"}, + {file = "uvloop-0.19.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:34175c9fd2a4bc3adc1380e1261f60306344e3407c20a4d684fd5f3be010fa3d"}, + {file = "uvloop-0.19.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:e27f100e1ff17f6feeb1f33968bc185bf8ce41ca557deee9d9bbbffeb72030b7"}, + {file = "uvloop-0.19.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:13dfdf492af0aa0a0edf66807d2b465607d11c4fa48f4a1fd41cbea5b18e8e8b"}, + {file = "uvloop-0.19.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6e3d4e85ac060e2342ff85e90d0c04157acb210b9ce508e784a944f852a40e67"}, + {file = "uvloop-0.19.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8ca4956c9ab567d87d59d49fa3704cf29e37109ad348f2d5223c9bf761a332e7"}, + {file = "uvloop-0.19.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f467a5fd23b4fc43ed86342641f3936a68ded707f4627622fa3f82a120e18256"}, + {file = "uvloop-0.19.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:492e2c32c2af3f971473bc22f086513cedfc66a130756145a931a90c3958cb17"}, + {file = "uvloop-0.19.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:2df95fca285a9f5bfe730e51945ffe2fa71ccbfdde3b0da5772b4ee4f2e770d5"}, + {file = "uvloop-0.19.0.tar.gz", hash = "sha256:0246f4fd1bf2bf702e06b0d45ee91677ee5c31242f39aab4ea6fe0c51aedd0fd"}, +] + +[package.extras] +docs = ["Sphinx (>=4.1.2,<4.2.0)", "sphinx-rtd-theme (>=0.5.2,<0.6.0)", "sphinxcontrib-asyncio (>=0.3.0,<0.4.0)"] +test = ["Cython (>=0.29.36,<0.30.0)", "aiohttp (==3.9.0b0)", "aiohttp (>=3.8.1)", "flake8 (>=5.0,<6.0)", "mypy (>=0.800)", "psutil", "pyOpenSSL (>=23.0.0,<23.1.0)", "pycodestyle (>=2.9.0,<2.10.0)"] + +[[package]] +name = "watchdog" +version = "4.0.0" +description = "Filesystem events monitoring" +optional = false +python-versions = ">=3.8" +files = [ + {file = "watchdog-4.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:39cb34b1f1afbf23e9562501673e7146777efe95da24fab5707b88f7fb11649b"}, + {file = "watchdog-4.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c522392acc5e962bcac3b22b9592493ffd06d1fc5d755954e6be9f4990de932b"}, + {file = "watchdog-4.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6c47bdd680009b11c9ac382163e05ca43baf4127954c5f6d0250e7d772d2b80c"}, + {file = "watchdog-4.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8350d4055505412a426b6ad8c521bc7d367d1637a762c70fdd93a3a0d595990b"}, + {file = "watchdog-4.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c17d98799f32e3f55f181f19dd2021d762eb38fdd381b4a748b9f5a36738e935"}, + {file = "watchdog-4.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4986db5e8880b0e6b7cd52ba36255d4793bf5cdc95bd6264806c233173b1ec0b"}, + {file = "watchdog-4.0.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:11e12fafb13372e18ca1bbf12d50f593e7280646687463dd47730fd4f4d5d257"}, + {file = "watchdog-4.0.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5369136a6474678e02426bd984466343924d1df8e2fd94a9b443cb7e3aa20d19"}, + {file = "watchdog-4.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:76ad8484379695f3fe46228962017a7e1337e9acadafed67eb20aabb175df98b"}, + {file = "watchdog-4.0.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:45cc09cc4c3b43fb10b59ef4d07318d9a3ecdbff03abd2e36e77b6dd9f9a5c85"}, + {file = "watchdog-4.0.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:eed82cdf79cd7f0232e2fdc1ad05b06a5e102a43e331f7d041e5f0e0a34a51c4"}, + {file = "watchdog-4.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ba30a896166f0fee83183cec913298151b73164160d965af2e93a20bbd2ab605"}, + {file = "watchdog-4.0.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:d18d7f18a47de6863cd480734613502904611730f8def45fc52a5d97503e5101"}, + {file = "watchdog-4.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2895bf0518361a9728773083908801a376743bcc37dfa252b801af8fd281b1ca"}, + {file = "watchdog-4.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:87e9df830022488e235dd601478c15ad73a0389628588ba0b028cb74eb72fed8"}, + {file = "watchdog-4.0.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6e949a8a94186bced05b6508faa61b7adacc911115664ccb1923b9ad1f1ccf7b"}, + {file = "watchdog-4.0.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6a4db54edea37d1058b08947c789a2354ee02972ed5d1e0dca9b0b820f4c7f92"}, + {file = "watchdog-4.0.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d31481ccf4694a8416b681544c23bd271f5a123162ab603c7d7d2dd7dd901a07"}, + {file = "watchdog-4.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:8fec441f5adcf81dd240a5fe78e3d83767999771630b5ddfc5867827a34fa3d3"}, + {file = "watchdog-4.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:6a9c71a0b02985b4b0b6d14b875a6c86ddea2fdbebd0c9a720a806a8bbffc69f"}, + {file = "watchdog-4.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:557ba04c816d23ce98a06e70af6abaa0485f6d94994ec78a42b05d1c03dcbd50"}, + {file = "watchdog-4.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:d0f9bd1fd919134d459d8abf954f63886745f4660ef66480b9d753a7c9d40927"}, + {file = "watchdog-4.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:f9b2fdca47dc855516b2d66eef3c39f2672cbf7e7a42e7e67ad2cbfcd6ba107d"}, + {file = "watchdog-4.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:73c7a935e62033bd5e8f0da33a4dcb763da2361921a69a5a95aaf6c93aa03a87"}, + {file = "watchdog-4.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:6a80d5cae8c265842c7419c560b9961561556c4361b297b4c431903f8c33b269"}, + {file = "watchdog-4.0.0-py3-none-win32.whl", hash = "sha256:8f9a542c979df62098ae9c58b19e03ad3df1c9d8c6895d96c0d51da17b243b1c"}, + {file = "watchdog-4.0.0-py3-none-win_amd64.whl", hash = "sha256:f970663fa4f7e80401a7b0cbeec00fa801bf0287d93d48368fc3e6fa32716245"}, + {file = "watchdog-4.0.0-py3-none-win_ia64.whl", hash = "sha256:9a03e16e55465177d416699331b0f3564138f1807ecc5f2de9d55d8f188d08c7"}, + {file = "watchdog-4.0.0.tar.gz", hash = "sha256:e3e7065cbdabe6183ab82199d7a4f6b3ba0a438c5a512a68559846ccb76a78ec"}, +] + +[package.extras] +watchmedo = ["PyYAML (>=3.10)"] + +[[package]] +name = "webencodings" +version = "0.5.1" +description = "Character encoding aliases for legacy web content" +optional = false +python-versions = "*" +files = [ + {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, + {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, +] + +[[package]] +name = "websockets" +version = "12.0" +description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" +optional = false +python-versions = ">=3.8" +files = [ + {file = "websockets-12.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d554236b2a2006e0ce16315c16eaa0d628dab009c33b63ea03f41c6107958374"}, + {file = "websockets-12.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2d225bb6886591b1746b17c0573e29804619c8f755b5598d875bb4235ea639be"}, + {file = "websockets-12.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:eb809e816916a3b210bed3c82fb88eaf16e8afcf9c115ebb2bacede1797d2547"}, + {file = "websockets-12.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c588f6abc13f78a67044c6b1273a99e1cf31038ad51815b3b016ce699f0d75c2"}, + {file = "websockets-12.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5aa9348186d79a5f232115ed3fa9020eab66d6c3437d72f9d2c8ac0c6858c558"}, + {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"}, + {file = "websockets-12.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:70ec754cc2a769bcd218ed8d7209055667b30860ffecb8633a834dde27d6307c"}, + {file = "websockets-12.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6e96f5ed1b83a8ddb07909b45bd94833b0710f738115751cdaa9da1fb0cb66e8"}, + {file = "websockets-12.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4d87be612cbef86f994178d5186add3d94e9f31cc3cb499a0482b866ec477603"}, + {file = "websockets-12.0-cp310-cp310-win32.whl", hash = "sha256:befe90632d66caaf72e8b2ed4d7f02b348913813c8b0a32fae1cc5fe3730902f"}, + {file = "websockets-12.0-cp310-cp310-win_amd64.whl", hash = "sha256:363f57ca8bc8576195d0540c648aa58ac18cf85b76ad5202b9f976918f4219cf"}, + {file = "websockets-12.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5d873c7de42dea355d73f170be0f23788cf3fa9f7bed718fd2830eefedce01b4"}, + {file = "websockets-12.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3f61726cae9f65b872502ff3c1496abc93ffbe31b278455c418492016e2afc8f"}, + {file = "websockets-12.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ed2fcf7a07334c77fc8a230755c2209223a7cc44fc27597729b8ef5425aa61a3"}, + {file = "websockets-12.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e332c210b14b57904869ca9f9bf4ca32f5427a03eeb625da9b616c85a3a506c"}, + {file = "websockets-12.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5693ef74233122f8ebab026817b1b37fe25c411ecfca084b29bc7d6efc548f45"}, + {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"}, + {file = "websockets-12.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6e2df67b8014767d0f785baa98393725739287684b9f8d8a1001eb2839031447"}, + {file = "websockets-12.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:bea88d71630c5900690fcb03161ab18f8f244805c59e2e0dc4ffadae0a7ee0ca"}, + {file = "websockets-12.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:dff6cdf35e31d1315790149fee351f9e52978130cef6c87c4b6c9b3baf78bc53"}, + {file = "websockets-12.0-cp311-cp311-win32.whl", hash = "sha256:3e3aa8c468af01d70332a382350ee95f6986db479ce7af14d5e81ec52aa2b402"}, + {file = "websockets-12.0-cp311-cp311-win_amd64.whl", hash = "sha256:25eb766c8ad27da0f79420b2af4b85d29914ba0edf69f547cc4f06ca6f1d403b"}, + {file = "websockets-12.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0e6e2711d5a8e6e482cacb927a49a3d432345dfe7dea8ace7b5790df5932e4df"}, + {file = "websockets-12.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:dbcf72a37f0b3316e993e13ecf32f10c0e1259c28ffd0a85cee26e8549595fbc"}, + {file = "websockets-12.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:12743ab88ab2af1d17dd4acb4645677cb7063ef4db93abffbf164218a5d54c6b"}, + {file = "websockets-12.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b645f491f3c48d3f8a00d1fce07445fab7347fec54a3e65f0725d730d5b99cb"}, + {file = "websockets-12.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9893d1aa45a7f8b3bc4510f6ccf8db8c3b62120917af15e3de247f0780294b92"}, + {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"}, + {file = "websockets-12.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:f764ba54e33daf20e167915edc443b6f88956f37fb606449b4a5b10ba42235a5"}, + {file = "websockets-12.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:1e4b3f8ea6a9cfa8be8484c9221ec0257508e3a1ec43c36acdefb2a9c3b00aa2"}, + {file = "websockets-12.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9fdf06fd06c32205a07e47328ab49c40fc1407cdec801d698a7c41167ea45113"}, + {file = "websockets-12.0-cp312-cp312-win32.whl", hash = "sha256:baa386875b70cbd81798fa9f71be689c1bf484f65fd6fb08d051a0ee4e79924d"}, + {file = "websockets-12.0-cp312-cp312-win_amd64.whl", hash = "sha256:ae0a5da8f35a5be197f328d4727dbcfafa53d1824fac3d96cdd3a642fe09394f"}, + {file = "websockets-12.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5f6ffe2c6598f7f7207eef9a1228b6f5c818f9f4d53ee920aacd35cec8110438"}, + {file = "websockets-12.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9edf3fc590cc2ec20dc9d7a45108b5bbaf21c0d89f9fd3fd1685e223771dc0b2"}, + {file = "websockets-12.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8572132c7be52632201a35f5e08348137f658e5ffd21f51f94572ca6c05ea81d"}, + {file = "websockets-12.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:604428d1b87edbf02b233e2c207d7d528460fa978f9e391bd8aaf9c8311de137"}, + {file = "websockets-12.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1a9d160fd080c6285e202327aba140fc9a0d910b09e423afff4ae5cbbf1c7205"}, + {file = "websockets-12.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87b4aafed34653e465eb77b7c93ef058516cb5acf3eb21e42f33928616172def"}, + {file = "websockets-12.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b2ee7288b85959797970114deae81ab41b731f19ebcd3bd499ae9ca0e3f1d2c8"}, + {file = "websockets-12.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:7fa3d25e81bfe6a89718e9791128398a50dec6d57faf23770787ff441d851967"}, + {file = "websockets-12.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:a571f035a47212288e3b3519944f6bf4ac7bc7553243e41eac50dd48552b6df7"}, + {file = "websockets-12.0-cp38-cp38-win32.whl", hash = "sha256:3c6cc1360c10c17463aadd29dd3af332d4a1adaa8796f6b0e9f9df1fdb0bad62"}, + {file = "websockets-12.0-cp38-cp38-win_amd64.whl", hash = "sha256:1bf386089178ea69d720f8db6199a0504a406209a0fc23e603b27b300fdd6892"}, + {file = "websockets-12.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:ab3d732ad50a4fbd04a4490ef08acd0517b6ae6b77eb967251f4c263011a990d"}, + {file = "websockets-12.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a1d9697f3337a89691e3bd8dc56dea45a6f6d975f92e7d5f773bc715c15dde28"}, + {file = "websockets-12.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1df2fbd2c8a98d38a66f5238484405b8d1d16f929bb7a33ed73e4801222a6f53"}, + {file = "websockets-12.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23509452b3bc38e3a057382c2e941d5ac2e01e251acce7adc74011d7d8de434c"}, + {file = "websockets-12.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e5fc14ec6ea568200ea4ef46545073da81900a2b67b3e666f04adf53ad452ec"}, + {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"}, + {file = "websockets-12.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b81f90dcc6c85a9b7f29873beb56c94c85d6f0dac2ea8b60d995bd18bf3e2aae"}, + {file = "websockets-12.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:a02413bc474feda2849c59ed2dfb2cddb4cd3d2f03a2fedec51d6e959d9b608b"}, + {file = "websockets-12.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:bbe6013f9f791944ed31ca08b077e26249309639313fff132bfbf3ba105673b9"}, + {file = "websockets-12.0-cp39-cp39-win32.whl", hash = "sha256:cbe83a6bbdf207ff0541de01e11904827540aa069293696dd528a6640bd6a5f6"}, + {file = "websockets-12.0-cp39-cp39-win_amd64.whl", hash = "sha256:fc4e7fa5414512b481a2483775a8e8be7803a35b30ca805afa4998a84f9fd9e8"}, + {file = "websockets-12.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:248d8e2446e13c1d4326e0a6a4e9629cb13a11195051a73acf414812700badbd"}, + {file = "websockets-12.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f44069528d45a933997a6fef143030d8ca8042f0dfaad753e2906398290e2870"}, + {file = "websockets-12.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c4e37d36f0d19f0a4413d3e18c0d03d0c268ada2061868c1e6f5ab1a6d575077"}, + {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"}, + {file = "websockets-12.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:2c71bd45a777433dd9113847af751aae36e448bc6b8c361a566cb043eda6ec30"}, + {file = "websockets-12.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0bee75f400895aef54157b36ed6d3b308fcab62e5260703add87f44cee9c82a6"}, + {file = "websockets-12.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:423fc1ed29f7512fceb727e2d2aecb952c46aa34895e9ed96071821309951123"}, + {file = "websockets-12.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:27a5e9964ef509016759f2ef3f2c1e13f403725a5e6a1775555994966a66e931"}, + {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"}, + {file = "websockets-12.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:b067cb952ce8bf40115f6c19f478dc71c5e719b7fbaa511359795dfd9d1a6468"}, + {file = "websockets-12.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:00700340c6c7ab788f176d118775202aadea7602c5cc6be6ae127761c16d6b0b"}, + {file = "websockets-12.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e469d01137942849cff40517c97a30a93ae79917752b34029f0ec72df6b46399"}, + {file = "websockets-12.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffefa1374cd508d633646d51a8e9277763a9b78ae71324183693959cf94635a7"}, + {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"}, + {file = "websockets-12.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2cb388a5bfb56df4d9a406783b7f9dbefb888c09b71629351cc6b036e9259370"}, + {file = "websockets-12.0-py3-none-any.whl", hash = "sha256:dc284bbc8d7c78a6c69e0c7325ab46ee5e40bb4d50e494d8131a07ef47500e9e"}, + {file = "websockets-12.0.tar.gz", hash = "sha256:81df9cbcbb6c260de1e007e58c011bfebe2dafc8435107b0537f393dd38c8b1b"}, +] + +[[package]] +name = "yarl" +version = "1.9.4" +description = "Yet another URL library" +optional = false +python-versions = ">=3.7" +files = [ + {file = "yarl-1.9.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a8c1df72eb746f4136fe9a2e72b0c9dc1da1cbd23b5372f94b5820ff8ae30e0e"}, + {file = "yarl-1.9.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a3a6ed1d525bfb91b3fc9b690c5a21bb52de28c018530ad85093cc488bee2dd2"}, + {file = "yarl-1.9.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c38c9ddb6103ceae4e4498f9c08fac9b590c5c71b0370f98714768e22ac6fa66"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d9e09c9d74f4566e905a0b8fa668c58109f7624db96a2171f21747abc7524234"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8477c1ee4bd47c57d49621a062121c3023609f7a13b8a46953eb6c9716ca392"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5ff2c858f5f6a42c2a8e751100f237c5e869cbde669a724f2062d4c4ef93551"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:357495293086c5b6d34ca9616a43d329317feab7917518bc97a08f9e55648455"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54525ae423d7b7a8ee81ba189f131054defdb122cde31ff17477951464c1691c"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:801e9264d19643548651b9db361ce3287176671fb0117f96b5ac0ee1c3530d53"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e516dc8baf7b380e6c1c26792610230f37147bb754d6426462ab115a02944385"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:7d5aaac37d19b2904bb9dfe12cdb08c8443e7ba7d2852894ad448d4b8f442863"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:54beabb809ffcacbd9d28ac57b0db46e42a6e341a030293fb3185c409e626b8b"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bac8d525a8dbc2a1507ec731d2867025d11ceadcb4dd421423a5d42c56818541"}, + {file = "yarl-1.9.4-cp310-cp310-win32.whl", hash = "sha256:7855426dfbddac81896b6e533ebefc0af2f132d4a47340cee6d22cac7190022d"}, + {file = "yarl-1.9.4-cp310-cp310-win_amd64.whl", hash = "sha256:848cd2a1df56ddbffeb375535fb62c9d1645dde33ca4d51341378b3f5954429b"}, + {file = "yarl-1.9.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:35a2b9396879ce32754bd457d31a51ff0a9d426fd9e0e3c33394bf4b9036b099"}, + {file = "yarl-1.9.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c7d56b293cc071e82532f70adcbd8b61909eec973ae9d2d1f9b233f3d943f2c"}, + {file = "yarl-1.9.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d8a1c6c0be645c745a081c192e747c5de06e944a0d21245f4cf7c05e457c36e0"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b3c1ffe10069f655ea2d731808e76e0f452fc6c749bea04781daf18e6039525"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:549d19c84c55d11687ddbd47eeb348a89df9cb30e1993f1b128f4685cd0ebbf8"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7409f968456111140c1c95301cadf071bd30a81cbd7ab829169fb9e3d72eae9"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e23a6d84d9d1738dbc6e38167776107e63307dfc8ad108e580548d1f2c587f42"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d8b889777de69897406c9fb0b76cdf2fd0f31267861ae7501d93003d55f54fbe"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:03caa9507d3d3c83bca08650678e25364e1843b484f19986a527630ca376ecce"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4e9035df8d0880b2f1c7f5031f33f69e071dfe72ee9310cfc76f7b605958ceb9"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:c0ec0ed476f77db9fb29bca17f0a8fcc7bc97ad4c6c1d8959c507decb22e8572"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:ee04010f26d5102399bd17f8df8bc38dc7ccd7701dc77f4a68c5b8d733406958"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:49a180c2e0743d5d6e0b4d1a9e5f633c62eca3f8a86ba5dd3c471060e352ca98"}, + {file = "yarl-1.9.4-cp311-cp311-win32.whl", hash = "sha256:81eb57278deb6098a5b62e88ad8281b2ba09f2f1147c4767522353eaa6260b31"}, + {file = "yarl-1.9.4-cp311-cp311-win_amd64.whl", hash = "sha256:d1d2532b340b692880261c15aee4dc94dd22ca5d61b9db9a8a361953d36410b1"}, + {file = "yarl-1.9.4-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0d2454f0aef65ea81037759be5ca9947539667eecebca092733b2eb43c965a81"}, + {file = "yarl-1.9.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:44d8ffbb9c06e5a7f529f38f53eda23e50d1ed33c6c869e01481d3fafa6b8142"}, + {file = "yarl-1.9.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:aaaea1e536f98754a6e5c56091baa1b6ce2f2700cc4a00b0d49eca8dea471074"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3777ce5536d17989c91696db1d459574e9a9bd37660ea7ee4d3344579bb6f129"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fc5fc1eeb029757349ad26bbc5880557389a03fa6ada41703db5e068881e5f2"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ea65804b5dc88dacd4a40279af0cdadcfe74b3e5b4c897aa0d81cf86927fee78"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa102d6d280a5455ad6a0f9e6d769989638718e938a6a0a2ff3f4a7ff8c62cc4"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09efe4615ada057ba2d30df871d2f668af661e971dfeedf0c159927d48bbeff0"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:008d3e808d03ef28542372d01057fd09168419cdc8f848efe2804f894ae03e51"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:6f5cb257bc2ec58f437da2b37a8cd48f666db96d47b8a3115c29f316313654ff"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:992f18e0ea248ee03b5a6e8b3b4738850ae7dbb172cc41c966462801cbf62cf7"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:0e9d124c191d5b881060a9e5060627694c3bdd1fe24c5eecc8d5d7d0eb6faabc"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3986b6f41ad22988e53d5778f91855dc0399b043fc8946d4f2e68af22ee9ff10"}, + {file = "yarl-1.9.4-cp312-cp312-win32.whl", hash = "sha256:4b21516d181cd77ebd06ce160ef8cc2a5e9ad35fb1c5930882baff5ac865eee7"}, + {file = "yarl-1.9.4-cp312-cp312-win_amd64.whl", hash = "sha256:a9bd00dc3bc395a662900f33f74feb3e757429e545d831eef5bb280252631984"}, + {file = "yarl-1.9.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:63b20738b5aac74e239622d2fe30df4fca4942a86e31bf47a81a0e94c14df94f"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7d7f7de27b8944f1fee2c26a88b4dabc2409d2fea7a9ed3df79b67277644e17"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c74018551e31269d56fab81a728f683667e7c28c04e807ba08f8c9e3bba32f14"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ca06675212f94e7a610e85ca36948bb8fc023e458dd6c63ef71abfd482481aa5"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5aef935237d60a51a62b86249839b51345f47564208c6ee615ed2a40878dccdd"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2b134fd795e2322b7684155b7855cc99409d10b2e408056db2b93b51a52accc7"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d25039a474c4c72a5ad4b52495056f843a7ff07b632c1b92ea9043a3d9950f6e"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f7d6b36dd2e029b6bcb8a13cf19664c7b8e19ab3a58e0fefbb5b8461447ed5ec"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:957b4774373cf6f709359e5c8c4a0af9f6d7875db657adb0feaf8d6cb3c3964c"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:d7eeb6d22331e2fd42fce928a81c697c9ee2d51400bd1a28803965883e13cead"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:6a962e04b8f91f8c4e5917e518d17958e3bdee71fd1d8b88cdce74dd0ebbf434"}, + {file = "yarl-1.9.4-cp37-cp37m-win32.whl", hash = "sha256:f3bc6af6e2b8f92eced34ef6a96ffb248e863af20ef4fde9448cc8c9b858b749"}, + {file = "yarl-1.9.4-cp37-cp37m-win_amd64.whl", hash = "sha256:ad4d7a90a92e528aadf4965d685c17dacff3df282db1121136c382dc0b6014d2"}, + {file = "yarl-1.9.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ec61d826d80fc293ed46c9dd26995921e3a82146feacd952ef0757236fc137be"}, + {file = "yarl-1.9.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8be9e837ea9113676e5754b43b940b50cce76d9ed7d2461df1af39a8ee674d9f"}, + {file = "yarl-1.9.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:bef596fdaa8f26e3d66af846bbe77057237cb6e8efff8cd7cc8dff9a62278bbf"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d47552b6e52c3319fede1b60b3de120fe83bde9b7bddad11a69fb0af7db32f1"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84fc30f71689d7fc9168b92788abc977dc8cefa806909565fc2951d02f6b7d57"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4aa9741085f635934f3a2583e16fcf62ba835719a8b2b28fb2917bb0537c1dfa"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:206a55215e6d05dbc6c98ce598a59e6fbd0c493e2de4ea6cc2f4934d5a18d130"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07574b007ee20e5c375a8fe4a0789fad26db905f9813be0f9fef5a68080de559"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5a2e2433eb9344a163aced6a5f6c9222c0786e5a9e9cac2c89f0b28433f56e23"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:6ad6d10ed9b67a382b45f29ea028f92d25bc0bc1daf6c5b801b90b5aa70fb9ec"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:6fe79f998a4052d79e1c30eeb7d6c1c1056ad33300f682465e1b4e9b5a188b78"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:a825ec844298c791fd28ed14ed1bffc56a98d15b8c58a20e0e08c1f5f2bea1be"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8619d6915b3b0b34420cf9b2bb6d81ef59d984cb0fde7544e9ece32b4b3043c3"}, + {file = "yarl-1.9.4-cp38-cp38-win32.whl", hash = "sha256:686a0c2f85f83463272ddffd4deb5e591c98aac1897d65e92319f729c320eece"}, + {file = "yarl-1.9.4-cp38-cp38-win_amd64.whl", hash = "sha256:a00862fb23195b6b8322f7d781b0dc1d82cb3bcac346d1e38689370cc1cc398b"}, + {file = "yarl-1.9.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:604f31d97fa493083ea21bd9b92c419012531c4e17ea6da0f65cacdcf5d0bd27"}, + {file = "yarl-1.9.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8a854227cf581330ffa2c4824d96e52ee621dd571078a252c25e3a3b3d94a1b1"}, + {file = "yarl-1.9.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ba6f52cbc7809cd8d74604cce9c14868306ae4aa0282016b641c661f981a6e91"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a6327976c7c2f4ee6816eff196e25385ccc02cb81427952414a64811037bbc8b"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8397a3817d7dcdd14bb266283cd1d6fc7264a48c186b986f32e86d86d35fbac5"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e0381b4ce23ff92f8170080c97678040fc5b08da85e9e292292aba67fdac6c34"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23d32a2594cb5d565d358a92e151315d1b2268bc10f4610d098f96b147370136"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ddb2a5c08a4eaaba605340fdee8fc08e406c56617566d9643ad8bf6852778fc7"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:26a1dc6285e03f3cc9e839a2da83bcbf31dcb0d004c72d0730e755b33466c30e"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:18580f672e44ce1238b82f7fb87d727c4a131f3a9d33a5e0e82b793362bf18b4"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:29e0f83f37610f173eb7e7b5562dd71467993495e568e708d99e9d1944f561ec"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:1f23e4fe1e8794f74b6027d7cf19dc25f8b63af1483d91d595d4a07eca1fb26c"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:db8e58b9d79200c76956cefd14d5c90af54416ff5353c5bfd7cbe58818e26ef0"}, + {file = "yarl-1.9.4-cp39-cp39-win32.whl", hash = "sha256:c7224cab95645c7ab53791022ae77a4509472613e839dab722a72abe5a684575"}, + {file = "yarl-1.9.4-cp39-cp39-win_amd64.whl", hash = "sha256:824d6c50492add5da9374875ce72db7a0733b29c2394890aef23d533106e2b15"}, + {file = "yarl-1.9.4-py3-none-any.whl", hash = "sha256:928cecb0ef9d5a7946eb6ff58417ad2fe9375762382f1bf5c55e61645f2c43ad"}, + {file = "yarl-1.9.4.tar.gz", hash = "sha256:566db86717cf8080b99b58b083b773a908ae40f06681e87e589a976faf8246bf"}, +] + +[package.dependencies] +idna = ">=2.0" +multidict = ">=4.0" + +[metadata] +lock-version = "2.0" +python-versions = ">=3.11,<3.12" +content-hash = "42f6d2a053929b5a71b673e30f222c3e5914c723d074b453afd349e11118590f" diff --git a/pterodactyl/config.py b/pterodactyl/config.py index 800d773..28fecd8 100644 --- a/pterodactyl/config.py +++ b/pterodactyl/config.py @@ -2,29 +2,28 @@ from redbot.core import Config config: Config = Config.get_conf(None, identifier=457581387213637448123567, cog_name="Pterodactyl", force_registration=True) - def register_config(config_obj: Config) -> None: config_obj.register_global( base_url=None, server_id=None, console_channel=None, console_commands_enabled=False, - current_status="", + current_status='', chat_regex=r"^\[\d{2}:\d{2}:\d{2}\sINFO\]: (?!\[(?:Server|Rcon)\])(?:<|\[)(\w+)(?:>|\]) (.*)", server_regex=r"^\[\d{2}:\d{2}:\d{2} INFO\]:(?: \[Not Secure\])? \[(?:Server|Rcon)\] (.*)", join_regex=r"^\[\d{2}:\d{2}:\d{2} INFO\]: ([^<\n]+) joined the game$", leave_regex=r"^\[\d{2}:\d{2}:\d{2} INFO\]: ([^<\n]+) left the game$", achievement_regex=r"^\[\d{2}:\d{2}:\d{2} INFO\]: (.*) has (made the advancement|completed the challenge) \[(.*)\]$", - chat_command='tellraw @a ["",{"text":".$N ","color":".$C","insertion":"<@.$I>","hoverEvent":{"action":"show_text","contents":"Shift click to mention this user inside Discord"}},{"text":"(DISCORD):","color":"blue","clickEvent":{"action":"open_url","value":".$V"},"hoverEvent":{"action":"show_text","contents":"Click to join the Discord Server"}},{"text":" .$M","color":"white"}]', # noqa: E501 - topic="Server IP: .$H\nServer Players: .$P/.$M", + chat_command='tellraw @a ["",{"text":".$N ","color":".$C","insertion":"<@.$I>","hoverEvent":{"action":"show_text","contents":"Shift click to mention this user inside Discord"}},{"text":"(DISCORD):","color":"blue","clickEvent":{"action":"open_url","value":".$V"},"hoverEvent":{"action":"show_text","contents":"Click to join the Discord Server"}},{"text":" .$M","color":"white"}]', # noqa: E501 + topic='Server IP: .$H\nServer Players: .$P/.$M', topic_hostname=None, topic_port=25565, api_endpoint="minecraft", chat_channel=None, - startup_msg="Server started!", - shutdown_msg="Server stopped!", - join_msg="Welcome to the server! 👋", - leave_msg="Goodbye! 👋", + startup_msg='Server started!', + shutdown_msg='Server stopped!', + join_msg='Welcome to the server! 👋', + leave_msg='Goodbye! 👋', mask_ip=True, invite=None, regex_blacklist={}, diff --git a/pterodactyl/data/unknown.png b/pterodactyl/data/unknown.png deleted file mode 100644 index 16fe498..0000000 Binary files a/pterodactyl/data/unknown.png and /dev/null differ diff --git a/pterodactyl/info.json b/pterodactyl/info.json index d32c39c..0a10241 100644 --- a/pterodactyl/info.json +++ b/pterodactyl/info.json @@ -1,18 +1,19 @@ { - "$schema": "https://raw.githubusercontent.com/Cog-Creators/Red-DiscordBot/refs/heads/V3/develop/schema/red_cog_repo.schema.json", - "author": ["cswimr"], - "install_msg": "Thank you for installing Pterodactyl!\nYou can find the source code of this cog [here](https://coastalcommits.com/cswimr/SeaCogs).\nDocumentation can be found [here](https://seacogs.coastalcommits.com/pterodactyl ).", - "name": "Pterodactyl", - "short": "Interface with Pterodactyl through websockets.", - "description": "Interface with Pterodactyl through websockets.", - "end_user_data_statement": "This cog does not store end user data.", + "author" : ["SeaswimmerTheFsh (seasw.)"], + "install_msg" : "Thank you for installing Pterodactyl!\nYou can find the source code of this cog [here](https://coastalcommits.com/SeaswimmerTheFsh/SeaCogs).\nDocumentation can be found [here](https://seacogs.coastalcommits.com/pterodactyl ).", + "name" : "Pterodactyl", + "short" : "Interface with Pterodactyl through websockets.", + "description" : "Interface with Pterodactyl through websockets.", + "end_user_data_statement" : "This cog does not store end user data.", "hidden": false, "disabled": false, "min_bot_version": "3.5.0", - "min_python_version": [3, 10, 0], - "requirements": [ - "git+https://github.com/iamkubi/pydactyl@v2.0.5", - "websockets" - ], - "tags": ["pterodactyl", "minecraft", "server", "management"] + "min_python_version": [3, 8, 0], + "requirements": ["git+https://github.com/SeaswimmerTheFsh/pydactyl", "websockets"], + "tags": [ + "pterodactyl", + "minecraft", + "server", + "management" + ] } diff --git a/pterodactyl/logger.py b/pterodactyl/logger.py index 8600903..64b005f 100644 --- a/pterodactyl/logger.py +++ b/pterodactyl/logger.py @@ -1,8 +1,8 @@ from red_commons import logging from red_commons.logging import getLogger -logger = getLogger("red.SeaCogs.Pterodactyl") -websocket_logger = getLogger("red.SeaCogs.Pterodactyl.Websocket") +logger = getLogger('red.SeaCogs.Pterodactyl') +websocket_logger = getLogger('red.SeaCogs.Pterodactyl.websocket') if logger.level >= logging.VERBOSE: websocket_logger.setLevel(logging.logging.INFO) elif logger.level < logging.VERBOSE: diff --git a/pterodactyl/mcsrvstatus.py b/pterodactyl/mcsrvstatus.py index d677029..689088b 100644 --- a/pterodactyl/mcsrvstatus.py +++ b/pterodactyl/mcsrvstatus.py @@ -1,18 +1,10 @@ import aiohttp -async def get_status(host: str, port: int = 25565) -> tuple[bool, dict]: - """Get the status of a Minecraft server using the [mcsrvstat.us API](https://api.mcsrvstat.us). - - Args: - host (str): The host of the server. - port (int, optional): The port to connect to. Defaults to 25565. - - Returns: - A tuple containing a boolean and a dictionary. The boolean is True if the server is online, or False if it is offline. The dictionary contains the response from the API.""" +async def get_status(host, port = 25565) -> tuple[bool, dict]: async with aiohttp.ClientSession() as session: - async with session.get(f"https://api.mcsrvstat.us/2/{host}:{port}") as response: - response = await response.json() # noqa: PLW2901 - if response["online"]: + async with session.get(f'https://api.mcsrvstat.us/2/{host}:{port}') as response: + response = await response.json() + if response['online']: return (True, response) return (False, response) diff --git a/pterodactyl/pterodactyl.py b/pterodactyl/pterodactyl.py index d500620..43396dd 100644 --- a/pterodactyl/pterodactyl.py +++ b/pterodactyl/pterodactyl.py @@ -1,6 +1,6 @@ import asyncio import json -from typing import AsyncIterable, Iterable, Mapping, Optional, Tuple, Union +from typing import Mapping, Optional, Tuple, Union import discord import websockets @@ -9,9 +9,8 @@ from pydactyl import PterodactylClient from redbot.core import app_commands, commands from redbot.core.app_commands import Choice from redbot.core.bot import Red -from redbot.core.utils.chat_formatting import bold, box, humanize_list +from redbot.core.utils.chat_formatting import box, error, humanize_list from redbot.core.utils.views import ConfirmView -from typing_extensions import override from pterodactyl import mcsrvstatus from pterodactyl.config import config, register_config @@ -21,84 +20,55 @@ from pterodactyl.logger import logger class Pterodactyl(commands.Cog): """Pterodactyl allows you to manage your Pterodactyl Panel from Discord.""" - __author__ = ["[cswimr](https://www.coastalcommits.com/cswimr)"] - __git__ = "https://www.coastalcommits.com/cswimr/SeaCogs" - __version__ = "2.0.9" + __author__ = ["SeaswimmerTheFsh"] + __version__ = "2.0.0" __documentation__ = "https://seacogs.coastalcommits.com/pterodactyl/" def __init__(self, bot: Red): self.bot = bot self.client: Optional[PterodactylClient] = None self.task: Optional[asyncio.Task] = None - self.websocket: Optional[websockets.ClientConnection] = None + self.websocket: Optional[websockets.WebSocketClientProtocol] = None self.retry_counter: int = 0 register_config(config) - self.task = self._get_task() + self.task = self.get_task() self.update_topic.start() - @override def format_help_for_context(self, ctx: commands.Context) -> str: pre_processed = super().format_help_for_context(ctx) or "" n = "\n" if "\n\n" not in pre_processed else "" text = [ f"{pre_processed}{n}", - f"{bold('Cog Version:')} [{self.__version__}]({self.__git__})", - f"{bold('Author:')} {humanize_list(self.__author__)}", - f"{bold('Documentation:')} {self.__documentation__}", + f"Cog Version: **{self.__version__}**", + f"Author: {humanize_list(self.__author__)}", + f"Documentation: {self.__documentation__}", ] return "\n".join(text) - @override - async def cog_load(self) -> None: - pterodactyl_keys = await self.bot.get_shared_api_tokens("pterodactyl") - api_key = pterodactyl_keys.get("api_key") - if api_key is None: - self.maybe_cancel_task() - logger.error("Pterodactyl API key not set. Please set it using `[p]set api`.") - return - base_url = await config.base_url() - if base_url is None: - self.maybe_cancel_task() - logger.error("Pterodactyl base URL not set. Please set it using `[p]pterodactyl config url`.") - return - server_id = await config.server_id() - if server_id is None: - self.maybe_cancel_task() - logger.error("Pterodactyl server ID not set. Please set it using `[p]pterodactyl config serverid`.") - return - - self.client = PterodactylClient(base_url, api_key).client - - @override async def cog_unload(self) -> None: self.update_topic.cancel() - self.maybe_cancel_task() + self.task.cancel() + self.retry_counter = 0 + await self.client._session.close() # pylint: disable=protected-access - def maybe_cancel_task(self, reset_retry_counter: bool = True) -> None: - if self.task: - self.task.cancel() - if reset_retry_counter: - self.retry_counter = 0 - - def _get_task(self) -> asyncio.Task: + def get_task(self) -> asyncio.Task: from pterodactyl.websocket import establish_websocket_connection - task = self.bot.loop.create_task(establish_websocket_connection(self), name="Pterodactyl Websocket Connection") - task.add_done_callback(self._error_callback) + task.add_done_callback(self.error_callback) return task - def _error_callback(self, fut) -> None: # NOTE Thanks flame442 and zephyrkul for helping me figure this out + def error_callback(self, fut) -> None: #NOTE - Thanks flame442 and zephyrkul for helping me figure this out try: fut.result() except asyncio.CancelledError: logger.info("WebSocket task has been cancelled.") - except Exception as e: # pylint: disable=broad-exception-caught + except Exception as e: # pylint: disable=broad-exception-caught logger.error("WebSocket task has failed: %s", e, exc_info=e) - self.maybe_cancel_task(reset_retry_counter=False) + self.task.cancel() if self.retry_counter < 5: self.retry_counter += 1 logger.info("Retrying in %s seconds...", 5 * self.retry_counter) - self.task = self.bot.loop.call_later(5 * self.retry_counter, self._get_task) + self.task = self.bot.loop.call_later(5 * self.retry_counter, self.get_task) else: logger.info("Retry limit reached. Stopping task.") @@ -109,9 +79,9 @@ class Pterodactyl(commands.Cog): console = self.bot.get_channel(await config.console_channel()) chat = self.bot.get_channel(await config.chat_channel()) if console: - await console.edit(topic=topic) # type: ignore + await console.edit(topic=topic) if chat: - await chat.edit(topic=topic) # type: ignore + await chat.edit(topic=topic) @commands.Cog.listener() async def on_message_without_command(self, message: discord.Message) -> None: @@ -122,7 +92,13 @@ class Pterodactyl(commands.Cog): return logger.debug("Received console command from %s: %s", message.author.id, message.content) await message.channel.send(f"Received console command from {message.author.id}: {message.content[:1900]}", allowed_mentions=discord.AllowedMentions.none()) - await self._send(json.dumps({"event": "send command", "args": [message.content]})) + try: + await self.websocket.send(json.dumps({"event": "send command", "args": [message.content]})) + except websockets.exceptions.ConnectionClosed as e: + logger.error("WebSocket connection closed: %s", e) + self.task.cancel() + self.retry_counter = 0 + self.task = self.get_task() if message.channel.id == await config.chat_channel() and message.author.bot is False: logger.debug("Received chat message from %s: %s", message.author.id, message.content) channel = self.bot.get_channel(await config.console_channel()) @@ -130,22 +106,13 @@ class Pterodactyl(commands.Cog): await channel.send(f"Received chat message from {message.author.id}: {message.content[:1900]}", allowed_mentions=discord.AllowedMentions.none()) msg = json.dumps({"event": "send command", "args": [await self.get_chat_command(message)]}) logger.debug("Sending chat message to server:\n%s", msg) - await self._send(message=msg) - - async def _send(self, message: Union[websockets.Data, Iterable[websockets.Data], AsyncIterable[websockets.Data]], text: bool = False): - """Send a message through the websocket connection. Restarts the websocket connection task if it is closed, and reinvokes itself.""" - try: - await self.websocket.send(message=message, text=text) # type: ignore - we want this to error if `self.websocket` is none - except websockets.exceptions.ConnectionClosed as e: - logger.error("WebSocket connection closed: %s", e) - self.maybe_cancel_task() - self.task = self._get_task() try: - await asyncio.wait_for(fut=self.task, timeout=60) - await self._send(message=message, text=text) - except asyncio.TimeoutError: - logger.error("Timeout while waiting for websocket connection") - raise + await self.websocket.send(msg) + except websockets.exceptions.ConnectionClosed as e: + logger.error("WebSocket connection closed: %s", e) + self.task.cancel() + self.retry_counter = 0 + self.task = self.get_task() async def get_topic(self) -> str: topic: str = await config.topic() @@ -156,27 +123,23 @@ class Pterodactyl(commands.Cog): if await config.api_endpoint() == "minecraft": status, response = await mcsrvstatus.get_status(await config.topic_hostname(), await config.topic_port()) if status: - placeholders.update( - { - "I": response["ip"], - "M": str(response["players"]["max"]), - "P": str(response["players"]["online"]), - "V": response["version"], - "D": response["motd"]["clean"][0] if response["motd"]["clean"] else "unset", - }, - ) + placeholders.update({ + "I": response['ip'], + "M": str(response['players']['max']), + "P": str(response['players']['online']), + "V": response['version'], + "D": response['motd']['clean'][0] if response['motd']['clean'] else "unset", + }) else: - placeholders.update( - { - "I": response["ip"], - "M": "0", - "P": "0", - "V": "Server Offline", - "D": "Server Offline", - }, - ) + placeholders.update({ + "I": response['ip'], + "M": "0", + "P": "0", + "V": "Server Offline", + "D": "Server Offline", + }) for key, value in placeholders.items(): - topic = topic.replace(".$" + key, value) + topic = topic.replace('.$' + key, value) return topic async def get_chat_command(self, message: discord.Message) -> str: @@ -185,82 +148,115 @@ class Pterodactyl(commands.Cog): "C": str(message.author.color), "D": message.author.discriminator, "I": str(message.author.id), - "M": message.content.replace('"', "").replace("\n", " "), + "M": message.content.replace('"','').replace("\n", " "), "N": message.author.display_name, "U": message.author.name, "V": await config.invite() or "use [p]pterodactyl config invite to change me", } for key, value in placeholders.items(): - command = command.replace(".$" + key, value) + command = command.replace('.$' + key, value) return command async def get_player_list(self) -> Optional[Tuple[str, list]]: if await config.api_endpoint() == "minecraft": status, response = await mcsrvstatus.get_status(await config.topic_hostname(), await config.topic_port()) - if status and "list" in response["players"]: - output_str = "\n".join(response["players"]["list"]) - return output_str, response["players"]["list"] + if status and 'list' in response['players']: + output_str = '\n'.join(response['players']['list']) + return output_str, response['players']['list'] return None - return None async def get_player_list_embed(self, ctx: Union[commands.Context, discord.Interaction]) -> Optional[discord.Embed]: player_list = await self.get_player_list() - if player_list and isinstance(ctx.channel, discord.abc.Messageable): + if player_list: embed = discord.Embed(color=await self.bot.get_embed_color(ctx.channel), title="Players Online") embed.description = player_list[0] return embed return None - async def power(self, ctx: Union[discord.Interaction, commands.Context], action: str, action_ing: str, warning: str = "") -> None: + async def power(self, ctx: Union[discord.Interaction, commands.Context], action: str, action_ing: str, warning: str = '') -> None: if isinstance(ctx, discord.Interaction): - ctx = await self.bot.get_context(ctx) + author = ctx.user + else: + author = ctx.author current_status = await config.current_status() if current_status == action_ing: - await ctx.send(f"Server is already {action_ing}.", ephemeral=True) - return + if isinstance(ctx, discord.Interaction): + return await ctx.response.send_message(f"Server is already {action_ing}.", ephemeral=True) + return await ctx.send(f"Server is already {action_ing}.") if current_status in ["starting", "stopping"] and action != "kill": - await ctx.send("Another power action is already in progress.", ephemeral=True) - return + if isinstance(ctx, discord.Interaction): + return await ctx.response.send_message("Another power action is already in progress.", ephemeral=True) + return await ctx.send("Another power action is already in progress.") - view = ConfirmView(ctx.author, disable_buttons=True) + view = ConfirmView(author, disable_buttons=True) - message = await ctx.send(f"{warning}Are you sure you want to {action} the server?", view=view) + if isinstance(ctx, discord.Interaction): + await ctx.response.send_message(f"{warning}Are you sure you want to {action} the server?", view=view) + else: + message = await ctx.send(f"{warning}Are you sure you want to {action} the server?", view=view) await view.wait() if view.result is True: - await message.edit(content=f"Sending websocket command to {action} server...", view=None) + if isinstance(ctx, discord.Interaction): + await ctx.edit_original_response(content=f"Sending websocket command to {action} server...", view=None) + else: + await message.edit(content=f"Sending websocket command to {action} server...", view=None) - await self._send(json.dumps({"event": "set state", "args": [action]})) + await self.websocket.send(json.dumps({"event": "set state", "args": [action]})) - await message.edit(content=f"Server {action_ing}", view=None) - return + if isinstance(ctx, discord.Interaction): + await ctx.edit_original_response(content=f"Server {action_ing}", view=None) + else: + await message.edit(content=f"Server {action_ing}", view=None) - await message.edit(content="Cancelled.", view=None) - return + else: + if isinstance(ctx, discord.Interaction): + await ctx.edit_original_response(content="Cancelled.", view=None) + else: + await message.edit(content="Cancelled.", view=None) async def send_command(self, ctx: Union[discord.Interaction, commands.Context], command: str): channel = self.bot.get_channel(await config.console_channel()) if isinstance(ctx, discord.Interaction): - ctx = await self.bot.get_context(ctx) - if channel: - await channel.send(f"Received console command from {ctx.author.id}: {command[:1900]}", allowed_mentions=discord.AllowedMentions.none()) - await self._send(json.dumps({"event": "send command", "args": [command]})) - await ctx.send(f"Command sent to server. {box(command, 'json')}") + if channel: + await channel.send(f"Received console command from {ctx.user.id}: {command[:1900]}", allowed_mentions=discord.AllowedMentions.none()) + try: + await self.websocket.send(json.dumps({"event": "send command", "args": [command]})) + await ctx.response.send_message(f"Command sent to server. {box(command, 'json')}", ephemeral=True) + except websockets.exceptions.ConnectionClosed as e: + logger.error("WebSocket connection closed: %s", e) + await ctx.response.send_message(error("WebSocket connection closed.")) + self.task.cancel() + self.retry_counter = 0 + self.task = self.get_task() + else: + if channel: + await channel.send(f"Received console command from {ctx.author.id}: {command[:1900]}", allowed_mentions=discord.AllowedMentions.none()) + try: + await self.websocket.send(json.dumps({"event": "send command", "args": [command]})) + await ctx.send(f"Command sent to server. {box(command, 'json')}") + except websockets.exceptions.ConnectionClosed as e: + logger.error("WebSocket connection closed: %s", e) + await ctx.send(error("WebSocket connection closed.")) + self.task.cancel() + self.retry_counter = 0 + self.task = self.get_task() @commands.Cog.listener() - async def on_red_api_tokens_update(self, service_name: str, api_tokens: Mapping[str, str]): # pylint: disable=unused-argument + async def on_red_api_tokens_update(self, service_name: str, api_tokens: Mapping[str,str]): # pylint: disable=unused-argument if service_name == "pterodactyl": logger.info("Configuration value set: api_key\nRestarting task...") - self.maybe_cancel_task(reset_retry_counter=True) - self.task = self._get_task() + self.task.cancel() + self.retry_counter = 0 + self.task = self.get_task() slash_pterodactyl = app_commands.Group(name="pterodactyl", description="Pterodactyl allows you to manage your Pterodactyl Panel from Discord.") - @slash_pterodactyl.command(name="command", description="Send a command to the server console.") + @slash_pterodactyl.command(name = "command", description = "Send a command to the server console.") async def slash_pterodactyl_command(self, interaction: discord.Interaction, command: str) -> None: """Send a command to the server console. @@ -270,7 +266,7 @@ class Pterodactyl(commands.Cog): The command to send to the server.""" return await self.send_command(interaction, command) - @slash_pterodactyl.command(name="players", description="Retrieve a list of players on the server.") + @slash_pterodactyl.command(name = "players", description = "Retrieve a list of players on the server.") async def slash_pterodactyl_players(self, interaction: discord.Interaction) -> None: """Retrieve a list of players on the server.""" e = await self.get_player_list_embed(interaction) @@ -279,8 +275,13 @@ class Pterodactyl(commands.Cog): else: await interaction.response.send_message("No players online.", ephemeral=True) - @slash_pterodactyl.command(name="power", description="Send power actions to the server.") - @app_commands.choices(action=[Choice(name="Start", value="start"), Choice(name="Stop", value="stop"), Choice(name="Restart", value="restart"), Choice(name="⚠️ Kill ⚠️", value="kill")]) + @slash_pterodactyl.command(name = "power", description = "Send power actions to the server.") + @app_commands.choices(action=[ + Choice(name="Start", value="start"), + Choice(name="Stop", value="stop"), + Choice(name="Restart", value="restart"), + Choice(name="⚠️ Kill ⚠️", value="kill") + ]) async def slash_pterodactyl_power(self, interaction: discord.Interaction, action: app_commands.Choice[str]) -> None: """Send power actions to the server. @@ -294,11 +295,11 @@ class Pterodactyl(commands.Cog): return await self.power(interaction, action.value, "stopping...") return await self.power(interaction, action.value, f"{action.value}ing...") - @commands.group(autohelp=True, name="pterodactyl", aliases=["ptero"]) + @commands.group(autohelp = True, name = "pterodactyl", aliases = ["ptero"]) async def pterodactyl(self, ctx: commands.Context) -> None: """Pterodactyl allows you to manage your Pterodactyl Panel from Discord.""" - @pterodactyl.command(name="players", aliases=["list", "online", "playerlist", "who"]) + @pterodactyl.command(name = "players", aliases=["list", "online", "playerlist", "who"]) async def pterodactyl_players(self, ctx: commands.Context) -> None: """Retrieve a list of players on the server.""" e = await self.get_player_list_embed(ctx) @@ -307,43 +308,43 @@ class Pterodactyl(commands.Cog): else: await ctx.send("No players online.") - @pterodactyl.command(name="command", aliases=["cmd", "execute", "exec"]) + @pterodactyl.command(name = "command", aliases = ["cmd", "execute", "exec"]) @commands.admin() async def pterodactyl_command(self, ctx: commands.Context, *, command: str) -> None: """Send a command to the server console.""" return await self.send_command(ctx, command) - @pterodactyl.group(autohelp=True, name="power") + @pterodactyl.group(autohelp = True, name = "power") @commands.admin() async def pterodactyl_power(self, ctx: commands.Context) -> None: """Send power actions to the server.""" - @pterodactyl_power.command(name="start") + @pterodactyl_power.command(name = "start") async def pterodactyl_power_start(self, ctx: commands.Context) -> Optional[discord.Message]: """Start the server.""" return await self.power(ctx, "start", "starting...") - @pterodactyl_power.command(name="stop") + @pterodactyl_power.command(name = "stop") async def pterodactyl_power_stop(self, ctx: commands.Context) -> Optional[discord.Message]: """Stop the server.""" return await self.power(ctx, "stop", "stopping...") - @pterodactyl_power.command(name="restart") + @pterodactyl_power.command(name = "restart") async def pterodactyl_power_restart(self, ctx: commands.Context) -> Optional[discord.Message]: """Restart the server.""" return await self.power(ctx, "restart", "restarting...") - @pterodactyl_power.command(name="kill") + @pterodactyl_power.command(name = "kill") async def pterodactyl_power_kill(self, ctx: commands.Context) -> Optional[discord.Message]: """Kill the server.""" return await self.power(ctx, "kill", "stopping... (forcefully killed)", warning="**⚠️ Forcefully killing the server process can corrupt data in some cases. ⚠️**\n") - @pterodactyl.group(autohelp=True, name="config", aliases=["settings", "set"]) + @pterodactyl.group(autohelp = True, name = "config", aliases = ["settings", "set"]) @commands.is_owner() async def pterodactyl_config(self, ctx: commands.Context) -> None: """Configure Pterodactyl settings.""" - @pterodactyl_config.command(name="url") + @pterodactyl_config.command(name = "url") async def pterodactyl_config_base_url(self, ctx: commands.Context, *, base_url: str) -> None: """Set the base URL of your Pterodactyl Panel. @@ -352,57 +353,59 @@ class Pterodactyl(commands.Cog): await config.base_url.set(base_url) await ctx.send(f"Base URL set to {base_url}") logger.info("Configuration value set: base_url = %s\nRestarting task...", base_url) - self.maybe_cancel_task(reset_retry_counter=True) - self.task = self._get_task() + self.task.cancel() + self.retry_counter = 0 + self.task = self.get_task() - @pterodactyl_config.command(name="serverid") + @pterodactyl_config.command(name = "serverid") async def pterodactyl_config_server_id(self, ctx: commands.Context, *, server_id: str) -> None: """Set the ID of your server.""" await config.server_id.set(server_id) await ctx.send(f"Server ID set to {server_id}") logger.info("Configuration value set: server_id = %s\nRestarting task...", server_id) - self.maybe_cancel_task(reset_retry_counter=True) - self.task = self._get_task() + self.task.cancel() + self.retry_counter = 0 + self.task = self.get_task() - @pterodactyl_config.group(name="console") + @pterodactyl_config.group(name = "console") async def pterodactyl_config_console(self, ctx: commands.Context): """Configure console settings.""" - @pterodactyl_config_console.command(name="channel") + @pterodactyl_config_console.command(name = "channel") async def pterodactyl_config_console_channel(self, ctx: commands.Context, channel: discord.TextChannel) -> None: """Set the channel to send console output to.""" await config.console_channel.set(channel.id) await ctx.send(f"Console channel set to {channel.mention}") - @pterodactyl_config_console.command(name="commands") + @pterodactyl_config_console.command(name = "commands") async def pterodactyl_config_console_commands(self, ctx: commands.Context, enabled: bool) -> None: """Enable or disable console commands.""" await config.console_commands_enabled.set(enabled) await ctx.send(f"Console commands set to {enabled}") - @pterodactyl_config.command(name="invite") + @pterodactyl_config.command(name = "invite") async def pterodactyl_config_invite(self, ctx: commands.Context, invite: str) -> None: """Set the invite link for your server.""" await config.invite.set(invite) await ctx.send(f"Invite link set to {invite}") - @pterodactyl_config.group(name="topic") + @pterodactyl_config.group(name = "topic") async def pterodactyl_config_topic(self, ctx: commands.Context): """Set the topic for the console and chat channels.""" - @pterodactyl_config_topic.command(name="host", aliases=["hostname", "ip"]) + @pterodactyl_config_topic.command(name = "host", aliases = ["hostname", "ip"]) async def pterodactyl_config_topic_host(self, ctx: commands.Context, host: str) -> None: """Set the hostname or IP address of your server.""" await config.topic_hostname.set(host) await ctx.send(f"Hostname/IP set to `{host}`") - @pterodactyl_config_topic.command(name="port") + @pterodactyl_config_topic.command(name = "port") async def pterodactyl_config_topic_port(self, ctx: commands.Context, port: int) -> None: """Set the port of your server.""" await config.topic_port.set(port) await ctx.send(f"Port set to `{port}`") - @pterodactyl_config_topic.command(name="text") + @pterodactyl_config_topic.command(name = "text") async def pterodactyl_config_topic_text(self, ctx: commands.Context, *, text: str) -> None: """Set the text for the console and chat channels. @@ -416,19 +419,19 @@ class Pterodactyl(commands.Cog): - `.$V` (version) - `.$D` (description / Message of the Day)""" await config.topic.set(text) - await ctx.send(f"Topic set to:\n{box(text, 'markdown')}") + await ctx.send(f"Topic set to:\n{box(text, 'yaml')}") - @pterodactyl_config.group(name="chat") + @pterodactyl_config.group(name = "chat") async def pterodactyl_config_chat(self, ctx: commands.Context): """Configure chat settings.""" - @pterodactyl_config_chat.command(name="channel") + @pterodactyl_config_chat.command(name = "channel") async def pterodactyl_config_chat_channel(self, ctx: commands.Context, channel: discord.TextChannel) -> None: """Set the channel to send chat output to.""" await config.chat_channel.set(channel.id) await ctx.send(f"Chat channel set to {channel.mention}") - @pterodactyl_config_chat.command(name="command") + @pterodactyl_config_chat.command(name = "command") async def pterodactyl_config_chat_command(self, ctx: commands.Context, *, command: str) -> None: """Set the command that will be used to send messages from Discord. @@ -437,11 +440,11 @@ class Pterodactyl(commands.Cog): await config.chat_command.set(command) await ctx.send(f"Chat command set to:\n{box(command, 'json')}") - @pterodactyl_config.group(name="regex") + @pterodactyl_config.group(name = "regex") async def pterodactyl_config_regex(self, ctx: commands.Context) -> None: """Set regex patterns.""" - @pterodactyl_config_regex.command(name="chat") + @pterodactyl_config_regex.command(name = "chat") async def pterodactyl_config_regex_chat(self, ctx: commands.Context, *, regex: str) -> None: """Set the regex pattern to match chat messages on the server. @@ -449,7 +452,7 @@ class Pterodactyl(commands.Cog): await config.chat_regex.set(regex) await ctx.send(f"Chat regex set to:\n{box(regex, 'regex')}") - @pterodactyl_config_regex.command(name="server") + @pterodactyl_config_regex.command(name = "server") async def pterodactyl_config_regex_server(self, ctx: commands.Context, *, regex: str) -> None: """Set the regex pattern to match server messages on the server. @@ -457,7 +460,7 @@ class Pterodactyl(commands.Cog): await config.server_regex.set(regex) await ctx.send(f"Server regex set to:\n{box(regex, 'regex')}") - @pterodactyl_config_regex.command(name="join") + @pterodactyl_config_regex.command(name = "join") async def pterodactyl_config_regex_join(self, ctx: commands.Context, *, regex: str) -> None: """Set the regex pattern to match join messages on the server. @@ -465,7 +468,7 @@ class Pterodactyl(commands.Cog): await config.join_regex.set(regex) await ctx.send(f"Join regex set to:\n{box(regex, 'regex')}") - @pterodactyl_config_regex.command(name="leave") + @pterodactyl_config_regex.command(name = "leave") async def pterodactyl_config_regex_leave(self, ctx: commands.Context, *, regex: str) -> None: """Set the regex pattern to match leave messages on the server. @@ -473,7 +476,7 @@ class Pterodactyl(commands.Cog): await config.leave_regex.set(regex) await ctx.send(f"Leave regex set to:\n{box(regex, 'regex')}") - @pterodactyl_config_regex.command(name="achievement") + @pterodactyl_config_regex.command(name = "achievement") async def pterodactyl_config_regex_achievement(self, ctx: commands.Context, *, regex: str) -> None: """Set the regex pattern to match achievement messages on the server. @@ -481,41 +484,41 @@ class Pterodactyl(commands.Cog): await config.achievement_regex.set(regex) await ctx.send(f"Achievement regex set to:\n{box(regex, 'regex')}") - @pterodactyl_config.group(name="messages", aliases=["msg", "msgs", "message"]) + @pterodactyl_config.group(name = "messages", aliases = ['msg', 'msgs', 'message']) async def pterodactyl_config_messages(self, ctx: commands.Context): """Configure message settings.""" - @pterodactyl_config_messages.command(name="startup") + @pterodactyl_config_messages.command(name = "startup") async def pterodactyl_config_messages_startup(self, ctx: commands.Context, *, message: str) -> None: """Set the message that will be sent when the server starts.""" await config.startup_msg.set(message) await ctx.send(f"Startup message set to: {message}") - @pterodactyl_config_messages.command(name="shutdown") + @pterodactyl_config_messages.command(name = "shutdown") async def pterodactyl_config_messages_shutdown(self, ctx: commands.Context, *, message: str) -> None: """Set the message that will be sent when the server stops.""" await config.shutdown_msg.set(message) await ctx.send(f"Shutdown message set to: {message}") - @pterodactyl_config_messages.command(name="join") + @pterodactyl_config_messages.command(name = "join") async def pterodactyl_config_messages_join(self, ctx: commands.Context, *, message: str) -> None: """Set the message that will be sent when a user joins the server. This is only shown in embeds.""" await config.join_msg.set(message) await ctx.send(f"Join message set to: {message}") - @pterodactyl_config_messages.command(name="leave") + @pterodactyl_config_messages.command(name = "leave") async def pterodactyl_config_messages_leave(self, ctx: commands.Context, *, message: str) -> None: """Set the message that will be sent when a user leaves the server. This is only shown in embeds.""" await config.leave_msg.set(message) await ctx.send(f"Leave message set to: {message}") - @pterodactyl_config.command(name="ip") + @pterodactyl_config.command(name = "ip") async def pterodactyl_config_mask_ip(self, ctx: commands.Context, mask: bool) -> None: """Mask the IP addresses of users in console messages.""" await config.mask_ip.set(mask) await ctx.send(f"IP masking set to {mask}") - @pterodactyl_config.command(name="api") + @pterodactyl_config.command(name = "api") async def pterodactyl_config_api(self, ctx: commands.Context, endpoint: str) -> None: """Set the API endpoint for retrieving user avatars. @@ -524,14 +527,11 @@ class Pterodactyl(commands.Cog): await config.api_endpoint.set(endpoint) await ctx.send(f"API endpoint set to {endpoint}") - @pterodactyl_config_regex.group( - name="blacklist", - aliases=["block", "blocklist"], - ) + @pterodactyl_config_regex.group(name = "blacklist", aliases = ['block', 'blocklist'],) async def pterodactyl_config_regex_blacklist(self, ctx: commands.Context): """Blacklist regex patterns.""" - @pterodactyl_config_regex_blacklist.command(name="add") + @pterodactyl_config_regex_blacklist.command(name = "add") async def pterodactyl_config_regex_blacklist_add(self, ctx: commands.Context, name: str, *, regex: str) -> None: """Add a regex pattern to the blacklist.""" async with config.regex_blacklist() as blacklist: @@ -549,7 +549,7 @@ class Pterodactyl(commands.Cog): else: await msg.edit(content="Cancelled.") - @pterodactyl_config_regex_blacklist.command(name="remove") + @pterodactyl_config_regex_blacklist.command(name = "remove") async def pterodactyl_config_regex_blacklist_remove(self, ctx: commands.Context, name: str) -> None: """Remove a regex pattern from the blacklist.""" async with config.regex_blacklist() as blacklist: @@ -566,7 +566,7 @@ class Pterodactyl(commands.Cog): else: await ctx.send(f"Name `{name}` does not exist in the blacklist.") - @pterodactyl_config.command(name="view", aliases=["show"]) + @pterodactyl_config.command(name = 'view', aliases = ['show']) async def pterodactyl_config_view(self, ctx: commands.Context) -> None: """View the current configuration.""" base_url = await config.base_url() @@ -591,7 +591,7 @@ class Pterodactyl(commands.Cog): topic_text = await config.topic() topic_hostname = await config.topic_hostname() topic_port = await config.topic_port() - embed = discord.Embed(color=await ctx.embed_color(), title="Pterodactyl Configuration") + embed = discord.Embed(color = await ctx.embed_color(), title="Pterodactyl Configuration") embed.description = f"""**Base URL:** {base_url} **Server ID:** `{server_id}` **Console Channel:** <#{console_channel}> @@ -607,19 +607,19 @@ class Pterodactyl(commands.Cog): **Topic Hostname:** `{topic_hostname}` **Topic Port:** `{topic_port}` - **Topic Text:** {box(topic_text, "markdown")} + **Topic Text:** {box(topic_text, 'yaml')} - **Chat Command:** {box(chat_command, "json")} - **Chat Regex:** {box(chat_regex, "regex")} - **Server Regex:** {box(server_regex, "regex")} - **Join Regex:** {box(join_regex, "regex")} - **Leave Regex:** {box(leave_regex, "regex")} - **Achievement Regex:** {box(achievement_regex, "regex")}""" + **Chat Command:** {box(chat_command, 'json')} + **Chat Regex:** {box(chat_regex, 're')} + **Server Regex:** {box(server_regex, 're')} + **Join Regex:** {box(join_regex, 're')} + **Leave Regex:** {box(leave_regex, 're')} + **Achievement Regex:** {box(achievement_regex, 're')}""" await ctx.send(embed=embed) if not len(regex_blacklist) == 0: - regex_blacklist_embed = discord.Embed(color=await ctx.embed_color(), title="Regex Blacklist") + regex_blacklist_embed = discord.Embed(color = await ctx.embed_color(), title="Regex Blacklist") for name, regex in regex_blacklist.items(): - regex_blacklist_embed.add_field(name=name, value=box(regex, "regex"), inline=False) + regex_blacklist_embed.add_field(name=name, value=box(regex, 're'), inline=False) await ctx.send(embed=regex_blacklist_embed) def get_bool_str(self, inp: bool) -> str: diff --git a/pterodactyl/websocket.py b/pterodactyl/websocket.py index 0948a1a..cb09002 100644 --- a/pterodactyl/websocket.py +++ b/pterodactyl/websocket.py @@ -1,15 +1,13 @@ # pylint: disable=cyclic-import import json import re -from pathlib import Path -from typing import Any, Optional, Tuple, Union +from typing import Optional, Union import aiohttp import discord +import websockets from pydactyl import PterodactylClient -from redbot.core.data_manager import bundled_data_path from redbot.core.utils.chat_formatting import bold, pagify -from websockets.asyncio.client import connect from pterodactyl.config import config from pterodactyl.logger import logger, websocket_logger @@ -19,48 +17,46 @@ from pterodactyl.pterodactyl import Pterodactyl async def establish_websocket_connection(coginstance: Pterodactyl) -> None: await coginstance.bot.wait_until_red_ready() base_url = await config.base_url() - base_url = base_url[:-1] if base_url.endswith("/") else base_url + base_url = base_url[:-1] if base_url.endswith('/') else base_url logger.info("Establishing WebSocket connection") websocket_credentials = await retrieve_websocket_credentials(coginstance) - async with connect(websocket_credentials["data"]["socket"], origin=base_url, ping_timeout=60, logger=websocket_logger) as websocket: + async with websockets.connect(websocket_credentials['data']['socket'], origin=base_url, ping_timeout=60, logger=websocket_logger) as websocket: logger.info("WebSocket connection established") - auth_message = json.dumps({"event": "auth", "args": [websocket_credentials["data"]["token"]]}) + auth_message = json.dumps({"event": "auth", "args": [websocket_credentials['data']['token']]}) await websocket.send(auth_message) logger.info("Authentication message sent") coginstance.websocket = websocket - while True: # pylint: disable=too-many-nested-blocks + while True: # pylint: disable=too-many-nested-blocks message = json.loads(await websocket.recv()) - if message["event"] in ("token expiring", "token expired"): + if message['event'] in ('token expiring', 'token expired'): logger.info("Received token expiring/expired event. Refreshing token.") websocket_credentials = await retrieve_websocket_credentials(coginstance) - auth_message = json.dumps({"event": "auth", "args": [websocket_credentials["data"]["token"]]}) + auth_message = json.dumps({"event": "auth", "args": [websocket_credentials['data']['token']]}) await websocket.send(auth_message) logger.info("Authentication message sent") - if message["event"] == "auth success": + if message['event'] == 'auth success': logger.info("WebSocket authentication successful") - if message["event"] == "console output" and await config.console_channel() is not None: + if message['event'] == 'console output' and await config.console_channel() is not None: regex_blacklist: dict = await config.regex_blacklist() - matches = [re.search(regex, message["args"][0]) for regex in regex_blacklist.values()] + matches = [re.search(regex, message['args'][0]) for regex in regex_blacklist.values()] - if await config.current_status() in ("running", "") and not any(matches): - content = remove_ansi_escape_codes(message["args"][0]) + if await config.current_status() in ('running', '') and not any(matches): + content = remove_ansi_escape_codes(message['args'][0]) if await config.mask_ip() is True: content = mask_ip(content) console_channel = coginstance.bot.get_channel(await config.console_channel()) - assert isinstance(console_channel, discord.abc.Messageable) chat_channel = coginstance.bot.get_channel(await config.chat_channel()) - assert isinstance(chat_channel, discord.abc.Messageable) if console_channel is not None: - if content.startswith("["): + if content.startswith('['): pagified_content = pagify(content, delims=[" ", "\n"]) for page in pagified_content: await console_channel.send(content=page, allowed_mentions=discord.AllowedMentions.none()) @@ -68,26 +64,21 @@ async def establish_websocket_connection(coginstance: Pterodactyl) -> None: server_message = await check_if_server_message(content) if server_message: if chat_channel is not None: - await chat_channel.send(server_message if len(server_message) < 2000 else server_message[:1997] + "...", allowed_mentions=discord.AllowedMentions.none()) + await chat_channel.send(server_message if len(server_message) < 2000 else server_message[:1997] + '...', allowed_mentions=discord.AllowedMentions.none()) chat_message = await check_if_chat_message(content) if chat_message: - info = await get_info(chat_message["username"]) + info = await get_info(chat_message['username']) if info is not None: - await send_chat_discord(coginstance, chat_message["username"], chat_message["message"], info["data"]["player"]["avatar"]) + await send_chat_discord(coginstance, chat_message['username'], chat_message['message'], info['data']['player']['avatar']) else: - await send_chat_discord(coginstance, chat_message["username"], chat_message["message"], "https://seafsh.cc/u/j3AzqQ.png") + await send_chat_discord(coginstance, chat_message['username'], chat_message['message'], 'https://seafsh.cc/u/j3AzqQ.png') join_message = await check_if_join_message(content) if join_message: if chat_channel is not None: if coginstance.bot.embed_requested(chat_channel): - embed, img = await generate_join_leave_embed(coginstance=coginstance, username=join_message, join=True) - if img: - with open(img, "rb") as file: - await chat_channel.send(embed=embed, file=discord.File(fp=file)) - else: - await chat_channel.send(embed=embed) + await chat_channel.send(embed=await generate_join_leave_embed(join_message, True)) else: await chat_channel.send(f"{join_message} joined the game", allowed_mentions=discord.AllowedMentions.none()) @@ -95,12 +86,7 @@ async def establish_websocket_connection(coginstance: Pterodactyl) -> None: if leave_message: if chat_channel is not None: if coginstance.bot.embed_requested(chat_channel): - embed, img = await generate_join_leave_embed(coginstance=coginstance, username=leave_message, join=False) - if img: - with open(img, "rb") as file: - await chat_channel.send(embed=embed, file=discord.File(fp=file)) - else: - await chat_channel.send(embed=embed) + await chat_channel.send(embed=await generate_join_leave_embed(leave_message, False)) else: await chat_channel.send(f"{leave_message} left the game", allowed_mentions=discord.AllowedMentions.none()) @@ -108,17 +94,13 @@ async def establish_websocket_connection(coginstance: Pterodactyl) -> None: if achievement_message: if chat_channel is not None: if coginstance.bot.embed_requested(chat_channel): - embed, img = await generate_achievement_embed(coginstance, achievement_message["username"], achievement_message["achievement"], achievement_message["challenge"]) - if img: - await chat_channel.send(embed=embed, file=discord.File(fp=img)) - else: - await chat_channel.send(embed=embed) + await chat_channel.send(embed=await generate_achievement_embed(achievement_message['username'], achievement_message['achievement'], achievement_message['challenge'])) else: await chat_channel.send(f"{achievement_message['username']} has {'completed the challenge' if achievement_message['challenge'] else 'made the advancement'} {achievement_message['achievement']}") - if message["event"] == "status": + if message['event'] == 'status': old_status = await config.current_status() - current_status = message["args"][0] + current_status = message['args'][0] if old_status != current_status: await config.current_status.set(current_status) if await config.console_channel() is not None: @@ -126,92 +108,81 @@ async def establish_websocket_connection(coginstance: Pterodactyl) -> None: if console is not None: await console.send(f"Server status changed! `{current_status}`") if await config.chat_channel() is not None: - if current_status == "running" and await config.startup_msg() is not None: + if current_status == 'running' and await config.startup_msg() is not None: chat = coginstance.bot.get_channel(await config.chat_channel()) if chat is not None: await chat.send(await config.startup_msg()) - if current_status == "stopping" and await config.shutdown_msg() is not None: + if current_status == 'stopping' and await config.shutdown_msg() is not None: chat = coginstance.bot.get_channel(await config.chat_channel()) if chat is not None: await chat.send(await config.shutdown_msg()) - -async def retrieve_websocket_credentials(coginstance: Pterodactyl) -> dict: +async def retrieve_websocket_credentials(coginstance: Pterodactyl) -> Optional[dict]: pterodactyl_keys = await coginstance.bot.get_shared_api_tokens("pterodactyl") api_key = pterodactyl_keys.get("api_key") if api_key is None: - coginstance.maybe_cancel_task() + coginstance.task.cancel() raise ValueError("Pterodactyl API key not set. Please set it using `[p]set api`.") base_url = await config.base_url() if base_url is None: - coginstance.maybe_cancel_task() + coginstance.task.cancel() raise ValueError("Pterodactyl base URL not set. Please set it using `[p]pterodactyl config url`.") server_id = await config.server_id() if server_id is None: - coginstance.maybe_cancel_task() + coginstance.task.cancel() raise ValueError("Pterodactyl server ID not set. Please set it using `[p]pterodactyl config serverid`.") client = PterodactylClient(base_url, api_key).client coginstance.client = client - websocket_credentials: dict[str, Any] = client.servers.get_websocket(server_id) - if not websocket_credentials: - coginstance.maybe_cancel_task() - raise ValueError("Failed to retrieve websocket credentials. Please ensure the API details are correctly configured.") - logger.debug( - """Websocket connection details retrieved: + websocket_credentials = client.servers.get_websocket(server_id) + logger.debug("""Websocket connection details retrieved: Socket: %s Token: %s...""", - websocket_credentials["data"]["socket"], - websocket_credentials["data"]["token"][:20], - ) + websocket_credentials['data']['socket'], + websocket_credentials['data']['token'][:20] + ) return websocket_credentials - # NOTE - The token is truncated to prevent it from being logged in its entirety, for security reasons - + #NOTE - The token is truncated to prevent it from being logged in its entirety, for security reasons def remove_ansi_escape_codes(text: str) -> str: - ansi_escape = re.compile(r"\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])") - # NOTE - https://chat.openai.com/share/d92f9acf-d776-4fd6-a53f-b14ac15dd540 - return ansi_escape.sub("", text) + ansi_escape = re.compile(r'\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])') + #NOTE - https://chat.openai.com/share/d92f9acf-d776-4fd6-a53f-b14ac15dd540 + return ansi_escape.sub('', text) - -async def check_if_server_message(text: str) -> Optional[str]: +async def check_if_server_message(text: str) -> Union[bool, str]: regex = await config.server_regex() match: Optional[re.Match[str]] = re.match(regex, text) if match: - logger.trace("Message is a server message") + logger.debug("Message is a server message") return match.group(1) - return None + return False - -async def check_if_chat_message(text: str) -> Optional[dict]: +async def check_if_chat_message(text: str) -> Union[bool, dict]: regex = await config.chat_regex() match: Optional[re.Match[str]] = re.match(regex, text) if match: groups = {"username": match.group(1), "message": match.group(2)} - logger.trace("Message is a chat message\n%s", json.dumps(groups)) + logger.debug("Message is a chat message\n%s", json.dumps(groups)) return groups - return None + return False - -async def check_if_join_message(text: str) -> Optional[str]: +async def check_if_join_message(text: str) -> Union[bool, str]: regex = await config.join_regex() match: Optional[re.Match[str]] = re.match(regex, text) if match: - logger.trace("Message is a join message") + logger.debug("Message is a join message") return match.group(1) - return None + return False - -async def check_if_leave_message(text: str) -> Optional[str]: +async def check_if_leave_message(text: str) -> Union[bool, str]: regex = await config.leave_regex() match: Optional[re.Match[str]] = re.match(regex, text) if match: - logger.trace("Message is a leave message") + logger.debug("Message is a leave message") return match.group(1) - return None + return False - -async def check_if_achievement_message(text: str) -> Optional[dict]: +async def check_if_achievement_message(text: str) -> Union[bool, dict]: regex = await config.achievement_regex() match: Optional[re.Match[str]] = re.match(regex, text) if match: @@ -220,25 +191,23 @@ async def check_if_achievement_message(text: str) -> Optional[dict]: groups["challenge"] = True else: groups["challenge"] = False - logger.trace("Message is an achievement message") + logger.debug("Message is an achievement message") return groups - return None - + return False async def get_info(username: str) -> Optional[dict]: - logger.verbose("Retrieving player info for %s", username) + logger.debug("Retrieving player info for %s", username) endpoint = await config.api_endpoint() async with aiohttp.ClientSession() as session: async with session.get(f"https://playerdb.co/api/player/{endpoint}/{username}") as response: if response.status == 200: - logger.verbose("Player info retrieved for %s", username) + logger.debug("Player info retrieved for %s", username) return await response.json() - logger.warning("Failed to retrieve player info for %s: %s", username, response.status) + logger.error("Failed to retrieve player info for %s: %s", username, response.status) return None - async def send_chat_discord(coginstance: Pterodactyl, username: str, message: str, avatar_url: str) -> None: - logger.trace("Sending chat message to Discord") + logger.debug("Sending chat message to Discord") channel = coginstance.bot.get_channel(await config.chat_channel()) if channel is not None: webhooks = await channel.webhooks() @@ -246,44 +215,37 @@ async def send_chat_discord(coginstance: Pterodactyl, username: str, message: st if webhook is None: webhook = await channel.create_webhook(name="Pterodactyl Chat") await webhook.send(content=message, username=username, avatar_url=avatar_url, allowed_mentions=discord.AllowedMentions(everyone=False, roles=False, users=True)) - logger.trace("Chat message sent to Discord") + logger.debug("Chat message sent to Discord") else: logger.warning("Chat channel not set. Skipping sending chat message to Discord") - -async def generate_join_leave_embed(coginstance: Pterodactyl, username: str, join: bool) -> Tuple[discord.Embed, Optional[Union[str, Path]]]: +async def generate_join_leave_embed(username: str, join: bool) -> discord.Embed: embed = discord.Embed() embed.color = discord.Color.green() if join else discord.Color.red() embed.description = await config.join_msg() if join else await config.leave_msg() info = await get_info(username) if info: - img = None - embed.set_author(name=username, icon_url=info["data"]["player"]["avatar"]) + embed.set_author(name=username, icon_url=info['data']['player']['avatar']) else: - img = bundled_data_path(coginstance) / "unknown.png" - embed.set_author(name=username, icon_url="attachment://unknown.png") + embed.set_author(name=username, icon_url='https://seafsh.cc/u/j3AzqQ.png') embed.timestamp = discord.utils.utcnow() - return embed, img + return embed - -async def generate_achievement_embed(coginstance: Pterodactyl, username: str, achievement: str, challenge: bool) -> Tuple[discord.Embed, Optional[Union[str, Path]]]: +async def generate_achievement_embed(username: str, achievement: str, challenge: bool) -> discord.Embed: embed = discord.Embed() - embed.color = discord.Color.from_str("#a800a7") if challenge else discord.Color.from_str("#54fb54") + embed.color = discord.Color.from_str('#a800a7') if challenge else discord.Color.from_str('#54fb54') embed.description = f"{bold(username)} has {'completed the challenge' if challenge else 'made the advancement'} {bold(achievement)}" info = await get_info(username) if info: - img = None - embed.set_author(name=username, icon_url=info["data"]["player"]["avatar"]) + embed.set_author(name=username, icon_url=info['data']['player']['avatar']) else: - img = bundled_data_path(coginstance) / "unknown.png" - embed.set_author(name=username, icon_url="attachment://unknown.png") + embed.set_author(name=username, icon_url='https://seafsh.cc/u/j3AzqQ.png') embed.timestamp = discord.utils.utcnow() - return embed, img - + return embed def mask_ip(string: str) -> str: def check(match: re.Match[str]): ip = match.group(0) - return ".".join(r"\*" * len(octet) for octet in ip.split(".")) - - return re.sub(r"\b(?:\d{1,3}\.){3}\d{1,3}\b", check, string) + masked_ip = '.'.join(r'\*' * len(octet) for octet in ip.split('.')) + return masked_ip + return re.sub(r'\b(?:\d{1,3}\.){3}\d{1,3}\b', check, string) diff --git a/pyproject.toml b/pyproject.toml index 6f3ebd0..93bdd53 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,76 +1,71 @@ -[project] +[tool.poetry] name = "seacogs" version = "0.1.0" description = "My assorted cogs for Red-DiscordBot." -authors = [{ name = "cswimr", email = "seaswimmerthefsh@gmail.com" }] -license = { file = "LICENSE" } +authors = ["SeaswimmerTheFsh"] +license = "MPL 2" readme = "README.md" -requires-python = ">=3.11" -dependencies = [ - "aiosqlite==0.21.0", - "beautifulsoup4==4.13.3", - "colorthief==0.2.1", - "markdownify==1.1.0", - "numpy==2.2.4", - "phx-class-registry==5.1.1", - "pillow==10.4.0", - "pip==25.0.1", - "py-dactyl", - "pydantic==2.11.1", - "red-discordbot==3.5.18", - "watchdog==6.0.0", - "websockets==15.0.1", -] +package-mode = false -[dependency-groups] -documentation = [ - "mkdocs==1.6.1", - "mkdocs-git-authors-plugin==0.9.4", - "mkdocs-git-revision-date-localized-plugin==1.4.5", - "mkdocs-material[imaging]==9.6.10", - "mkdocs-redirects==1.2.2", - "mkdocstrings[python]==0.29.0", -] +[tool.poetry.dependencies] +python = ">=3.11,<3.12" +Red-DiscordBot = "^3.5.5" +py-dactyl = "^2.0.4" +websockets = "^12.0" +pillow = "^10.3.0" +numpy = "^1.26.4" -[tool.uv] -dev-dependencies = ["pylint==3.3.6", "ruff==0.11.2", "sqlite-web==0.6.4"] +[tool.poetry.group.dev] +optional = true -[tool.uv.sources] -py-dactyl = { git = "https://github.com/iamkubi/pydactyl", tag = "v2.0.5" } +[tool.poetry.group.dev.dependencies] +ruff = "^0.3.1" +pylint = "^3.1.0" -[tool.basedpyright] -typeCheckingMode = "basic" -reportAttributeAccessIssue = false # disabled because `commands.group.command` is listed as Any / Unknown for some reason +[tool.poetry.group.docs] +optional = true + +[tool.poetry.group.docs.dependencies] +mkdocs = "1.5.3" +mkdocstrings = {extras = ["python"], version = "0.24.0"} +mkdocs-git-authors-plugin = "0.7.2" +mkdocs-git-revision-date-localized-plugin = "1.2.2" +mkdocs-material = {extras = ["imaging"], version = "^9.5.2"} +mkdocs-redirects = "^1.2.1" + +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api" [tool.ruff] # Exclude a variety of commonly ignored directories. exclude = [ - ".bzr", - ".direnv", - ".eggs", - ".git", - ".git-rewrite", - ".hg", - ".ipynb_checkpoints", - ".mypy_cache", - ".nox", - ".pants.d", - ".pyenv", - ".pytest_cache", - ".pytype", - ".ruff_cache", - ".svn", - ".tox", - ".venv", - ".vscode", - "__pypackages__", - "_build", - "buck-out", - "build", - "dist", - "node_modules", - "site-packages", - "venv", + ".bzr", + ".direnv", + ".eggs", + ".git", + ".git-rewrite", + ".hg", + ".ipynb_checkpoints", + ".mypy_cache", + ".nox", + ".pants.d", + ".pyenv", + ".pytest_cache", + ".pytype", + ".ruff_cache", + ".svn", + ".tox", + ".venv", + ".vscode", + "__pypackages__", + "_build", + "buck-out", + "build", + "dist", + "node_modules", + "site-packages", + "venv", ] # Same as Black. @@ -84,32 +79,8 @@ target-version = "py311" # Enable Pyflakes (`F`) and a subset of the pycodestyle (`E`) codes by default. # Unlike Flake8, Ruff doesn't enable pycodestyle warnings (`W`) or # McCabe complexity (`C901`) by default. -select = [ - "I", - "N", - "F", - "W", - "E", - "G", - "A", - "COM", - "INP", - "T20", - "PLC", - "PLE", - "PLW", - "PLR", - "LOG", - "SLF", - "ERA", - "FIX", - "PERF", - "C4", - "EM", - "RET", - "RSE", -] -ignore = ["PLR0911", "PLR0912", "PLR0915", "PLR2004", "PLR0913", "EM101"] +select = ["F", "W", "E", "C901"] +ignore = ["C901"] # Allow fix for all enabled rules (when `--fix`) is provided. fixable = ["ALL"] diff --git a/renovate.json b/renovate.json deleted file mode 100644 index 5af45a8..0000000 --- a/renovate.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "extends": [ - "local>cc/renovate-config" - ] -} \ No newline at end of file diff --git a/seautils/__init__.py b/seautils/__init__.py deleted file mode 100644 index dd217b4..0000000 --- a/seautils/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -from .seautils import SeaUtils - - -async def setup(bot): - await bot.add_cog(SeaUtils(bot)) diff --git a/seautils/info.json b/seautils/info.json deleted file mode 100644 index bdd6708..0000000 --- a/seautils/info.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "$schema": "https://raw.githubusercontent.com/Cog-Creators/Red-DiscordBot/refs/heads/V3/develop/schema/red_cog_repo.schema.json", - "author": ["cswimr"], - "install_msg": "Thank you for installing SeaUtils!\nYou can find the source code of this cog [here](https://coastalcommits.com/cswimr/SeaCogs).", - "name": "SeaUtils", - "short": "A collection of useful utilities.", - "description": "A collection of useful utilities.", - "end_user_data_statement": "This cog does not store end user data.", - "hidden": true, - "disabled": false, - "min_bot_version": "3.5.0", - "min_python_version": [3, 8, 0], - "requirements": ["beautifulsoup4", "markdownify"] -} diff --git a/seautils/seautils.py b/seautils/seautils.py deleted file mode 100644 index 126ffd1..0000000 --- a/seautils/seautils.py +++ /dev/null @@ -1,232 +0,0 @@ -# _____ _ -# / ____| (_) -# | (___ ___ __ _ _____ ___ _ __ ___ _ __ ___ ___ _ __ -# \___ \ / _ \/ _` / __\ \ /\ / / | '_ ` _ \| '_ ` _ \ / _ \ '__| -# ____) | __/ (_| \__ \\ V V /| | | | | | | | | | | | __/ | -# |_____/ \___|\__,_|___/ \_/\_/ |_|_| |_| |_|_| |_| |_|\___|_| - -import asyncio -import inspect -import operator -import re -from asyncio.subprocess import Process -from functools import partial, partialmethod -from typing import Any - -import aiohttp -import yaml -from bs4 import BeautifulSoup -from discord import Color, Embed, app_commands -from discord.utils import CachedSlotProperty, cached_property -from markdownify import MarkdownConverter -from redbot.core import commands -from redbot.core.bot import Red -from redbot.core.dev_commands import cleanup_code -from redbot.core.utils import chat_formatting as cf -from redbot.core.utils.views import SimpleMenu - - -def md(soup: BeautifulSoup, **options) -> Any | str: - return MarkdownConverter(**options).convert_soup(soup=soup) - - -def format_rfc_text(text: str, number: int) -> str: - one: str = re.sub(r"\(\.\/rfc(\d+)", r"(https://www.rfc-editor.org/rfc/rfc\1.html", text) - two: str = re.sub(r"\((#(?:section|page)-\d+(?:.\d+)?)\)", f"(https://www.rfc-editor.org/rfc/rfc{number}.html\1)", one) - three: str = re.sub(r"\n{3,}", "\n\n", two) - return three - - -class SeaUtils(commands.Cog): - """A collection of random utilities.""" - - __author__ = ["[cswimr](https://www.coastalcommits.com/cswimr)"] - __git__ = "https://www.coastalcommits.com/cswimr/SeaCogs" - __version__ = "1.0.2" - __documentation__ = "https://seacogs.coastalcommits.com/seautils/" - - def __init__(self, bot: Red) -> None: - self.bot = bot - - def format_help_for_context(self, ctx: commands.Context) -> str: - pre_processed = super().format_help_for_context(ctx) or "" - n = "\n" if "\n\n" not in pre_processed else "" - text = [ - f"{pre_processed}{n}", - f"{cf.bold('Cog Version:')} [{self.__version__}]({self.__git__})", - f"{cf.bold('Author:')} {cf.humanize_list(self.__author__)}", - f"{cf.bold('Documentation:')} {self.__documentation__}", - ] - return "\n".join(text) - - def format_src(self, obj: Any) -> str: - """A large portion of this code is repurposed from Zephyrkul's RTFS cog. - https://github.com/Zephyrkul/FluffyCogs/blob/master/rtfs/rtfs.py""" - obj = inspect.unwrap(func=obj) - src: Any = getattr(obj, "__func__", obj) - if isinstance(obj, (commands.Command, app_commands.Command)): - src = obj.callback - elif isinstance(obj, (partial, partialmethod)): - src = obj.func - elif isinstance(obj, property): - src = obj.fget - elif isinstance(obj, (cached_property, CachedSlotProperty)): - src = obj.function - return inspect.getsource(object=src) - - @commands.command(aliases=["source", "src", "code", "showsource"]) # type: ignore - @commands.is_owner() - async def showcode(self, ctx: commands.Context, *, object: str) -> None: # pylint: disable=redefined-builtin # noqa: A002 - """Show the code for a particular object.""" - try: - if object.startswith("/") and (obj := ctx.bot.tree.get_command(object[1:])): - text = self.format_src(obj) - elif obj := ctx.bot.get_cog(object): - text = self.format_src(type(obj)) - elif obj := ctx.bot.get_command(object): - text = self.format_src(obj) - else: - raise AttributeError - temp_content = cf.pagify(text=cleanup_code(text), escape_mass_mentions=True, page_length=1977) - content = [] - max_i = operator.length_hint(temp_content) - i = 1 - for page in temp_content: - content.append(f"**Page {i}/{max_i}**\n{cf.box(page, lang='py')}") - i += 1 - await SimpleMenu(pages=content, disable_after_timeout=True, timeout=180).start(ctx) - except (OSError, AttributeError, UnboundLocalError): - if ctx.embed_requested(): - embed = Embed(title="Object not found!", color=await ctx.embed_color()) - await ctx.send(embed=embed, reference=ctx.message.to_reference(fail_if_not_exists=False)) - else: - await ctx.send(content="Object not found!", reference=ctx.message.to_reference(fail_if_not_exists=False)) - - @commands.command(name="dig", aliases=["dnslookup", "nslookup"]) # type: ignore - @commands.is_owner() - async def dig(self, ctx: commands.Context, name: str, record_type: str | None = None, server: str | None = None, port: int = 53) -> None: - """Retrieve DNS information for a domain. - - Uses `dig` to perform a DNS query. Will fall back to `nslookup` if `dig` is not installed on the system. - `nslookup` does not provide as much information as `dig`, so only the `name` parameter will be used if `nslookup` is used. - Will return the A, AAAA, and CNAME records for a domain by default. You can specify a different record type with the `type` parameter.""" - command_opts: list[str] = ["dig"] - query_types: list[str] = [record_type] if record_type else ["A", "AAAA", "CNAME"] - if server: - command_opts.extend(["@", server]) - for query_type in query_types: - command_opts.extend([name, query_type]) - command_opts.extend(["-p", str(port), "+yaml"]) - - try: - process: Process = await asyncio.create_subprocess_exec(*command_opts, stdout=asyncio.subprocess.PIPE, stderr=asyncio.subprocess.PIPE) - stdout, stderr = await process.communicate() - if stderr: - await ctx.maybe_send_embed(message="An error was encountered!\n" + cf.box(text=stderr.decode())) - else: - data = yaml.safe_load(stdout.decode()) - message_data: dict = data[0]["message"] - response_data: dict = message_data["response_message_data"] - if ctx.embed_requested(): - embed = Embed(title="DNS Query Result", color=await ctx.embed_color(), timestamp=message_data["response_time"]) - embed.add_field(name="Response Address", value=message_data["response_address"], inline=True) - embed.add_field(name="Response Port", value=message_data["response_port"], inline=True) - embed.add_field(name="Query Address", value=message_data["query_address"], inline=True) - embed.add_field(name="Query Port", value=message_data["query_port"], inline=True) - embed.add_field(name="Status", value=response_data["status"], inline=True) - embed.add_field(name="Flags", value=response_data["flags"], inline=True) - - if response_data.get("status") != "NOERROR": - embed.colour = Color.red() - embed.description = cf.error("Dig query did not return `NOERROR` status.") - - questions = [] - answers = [] - authorities = [] - for m in data: - response = m["message"]["response_message_data"] - if "QUESTION_SECTION" in response: - for question in response["QUESTION_SECTION"]: - if question not in questions: - questions.append(question) - - if "ANSWER_SECTION" in response: - for answer in response["ANSWER_SECTION"]: - if answer not in answers: - answers.append(answer) - - if "AUTHORITY_SECTION" in response: - for authority in response["AUTHORITY_SECTION"]: - if authority not in authorities: - authorities.append(authority) - - if questions: - question_section = "\n".join(questions) - embed.add_field(name="Question Section", value=f"{cf.box(text=question_section, lang='prolog')}", inline=False) - - if answers: - answer_section = "\n".join(answers) - if len(answer_section) > 1024: - embed.description = cf.warning("Answer section is too long to fit within embed field, falling back to description.") + cf.box(answer_section) - else: - embed.add_field(name="Answer Section", value=f"{cf.box(text=answer_section, lang='prolog')}", inline=False) - - if authorities: - authority_section = "\n".join(authorities) - embed.add_field(name="Authority Section", value=f"{cf.box(text=authority_section, lang='prolog')}", inline=False) - await ctx.send(embed=embed) - else: - await ctx.send(content=cf.box(text=str(stdout), lang="yaml")) - except FileNotFoundError: - try: - ns_process = await asyncio.create_subprocess_exec("nslookup", name, stdout=asyncio.subprocess.PIPE, stderr=asyncio.subprocess.PIPE) - ns_stdout, ns_stderr = await ns_process.communicate() - if ns_stderr: - await ctx.maybe_send_embed(message="An error was encountered!\n" + cf.box(text=ns_stderr.decode())) - else: - warning = cf.warning("`dig` is not installed! Defaulting to `nslookup`.\nThis command provides more information when `dig` is installed on the system.\n") - if await ctx.embed_requested(): - embed = Embed(title="DNS Query Result", color=await ctx.embed_color(), timestamp=ctx.message.created_at) - embed.description = warning + cf.box(text=ns_stdout.decode()) - await ctx.send(embed=embed) - else: - await ctx.send(content=warning + cf.box(text=ns_stdout.decode())) - except FileNotFoundError: - await ctx.maybe_send_embed(message=cf.error("Neither `dig` nor `nslookup` are installed on the system. Unable to resolve DNS query.")) - - @commands.command() - async def rfc(self, ctx: commands.Context, number: int) -> None: - """Retrieve the text of an RFC document. - - This command uses the [RFC Editor website](https://www.rfc-editor.org/) to fetch the text of an RFC document. - A [Request for Comments (RFC)](https://en.wikipedia.org/wiki/Request_for_Comments) is a publication in a series from the principal technical development and standards-setting bodies for the [Internet](https://en.wikipedia.org/wiki/Internet), most prominently the [Internet Engineering Task Force](https://en.wikipedia.org/wiki/Internet_Engineering_Task_Force). An RFC is authored by individuals or groups of engineers and [computer scientists](https://en.wikipedia.org/wiki/Computer_scientist) in the form of a [memorandum](https://en.wikipedia.org/wiki/Memorandum) describing methods, behaviors, research, or innovations applicable to the working of the Internet and Internet-connected systems. It is submitted either for [peer review](https://en.wikipedia.org/wiki/Peer_review) or to convey new concepts, information, or, occasionally, engineering humor.""" # noqa: E501 - url = f"https://www.rfc-editor.org/rfc/rfc{number}.html" - datatracker_url = f"https://datatracker.ietf.org/doc/rfc{number}" - async with aiohttp.ClientSession() as session: - async with session.get(url=url) as response: - if response.status == 200: - html = await response.text() - soup = BeautifulSoup(html, "html.parser") - pre_tags = soup.find_all("pre") - content: list[str | Embed] = [] - for pre_tag in pre_tags: - text = format_rfc_text(md(pre_tag), number) - if len(text) > 4096: - pagified_text = cf.pagify(text, delims=["\n\n"], page_length=4096) - for page in pagified_text: - if await ctx.embed_requested(): - embed = Embed(title=f"RFC Document {number}", url=datatracker_url, description=page, color=await ctx.embed_color()) - content.append(embed) - else: - content.append(page) - elif await ctx.embed_requested(): - embed = Embed(title=f"RFC Document {number}", url=datatracker_url, description=text, color=await ctx.embed_color()) - content.append(embed) - else: - content.append(text) - if await ctx.embed_requested(): - for embed in content: - embed.set_footer(text=f"Page {content.index(embed) + 1}/{len(content)}") - await SimpleMenu(pages=content, disable_after_timeout=True, timeout=300).start(ctx) # type: ignore - else: - await ctx.maybe_send_embed(message=cf.error(f"An error occurred while fetching RFC {number}. Status code: {response.status}.")) diff --git a/uv.lock b/uv.lock deleted file mode 100644 index 14654e8..0000000 --- a/uv.lock +++ /dev/null @@ -1,2075 +0,0 @@ -version = 1 -revision = 1 -requires-python = ">=3.11" -resolution-markers = [ - "python_full_version >= '3.13'", - "python_full_version == '3.12.*'", - "python_full_version < '3.12'", -] - -[[package]] -name = "aiohttp" -version = "3.9.5" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "aiosignal" }, - { name = "attrs" }, - { name = "frozenlist" }, - { name = "multidict" }, - { name = "yarl" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/04/a4/e3679773ea7eb5b37a2c998e25b017cc5349edf6ba2739d1f32855cfb11b/aiohttp-3.9.5.tar.gz", hash = "sha256:edea7d15772ceeb29db4aff55e482d4bcfb6ae160ce144f2682de02f6d693551", size = 7504841 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/67/f5/aa23d04a1bb57e5f51108a6473964a2618cc83e608e23e3543031aa2bb3a/aiohttp-3.9.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e0ae53e33ee7476dd3d1132f932eeb39bf6125083820049d06edcdca4381f342", size = 599387 }, - { url = "https://files.pythonhosted.org/packages/97/e7/575ca16871071313a7a7a03fa055f0c3d52f77eb8583b373ac17fc87ec15/aiohttp-3.9.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c088c4d70d21f8ca5c0b8b5403fe84a7bc8e024161febdd4ef04575ef35d474d", size = 402427 }, - { url = "https://files.pythonhosted.org/packages/4e/78/266be6e31daad1a2dc99c777dfb12b62044691ec573b6e48409a0d804fc7/aiohttp-3.9.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:639d0042b7670222f33b0028de6b4e2fad6451462ce7df2af8aee37dcac55424", size = 390243 }, - { url = "https://files.pythonhosted.org/packages/73/f1/084f82069428b87d2b5c1e3e2d1d51911981f4cccd94c5c3691f10061c99/aiohttp-3.9.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f26383adb94da5e7fb388d441bf09c61e5e35f455a3217bfd790c6b6bc64b2ee", size = 1312924 }, - { url = "https://files.pythonhosted.org/packages/1f/d6/412156ea1aa44a5cc95421db85b0c7a5d1ee3ba71efad04db84305ca1968/aiohttp-3.9.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:66331d00fb28dc90aa606d9a54304af76b335ae204d1836f65797d6fe27f1ca2", size = 1349620 }, - { url = "https://files.pythonhosted.org/packages/3f/42/376e5e4b6f167358e1e8c6a78cae64ca49d30d6edecbab80796dbb838855/aiohttp-3.9.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4ff550491f5492ab5ed3533e76b8567f4b37bd2995e780a1f46bca2024223233", size = 1387070 }, - { url = "https://files.pythonhosted.org/packages/24/99/e76e65ca811100b445d3c8af9764b27c5180ca11a15af694366424896647/aiohttp-3.9.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f22eb3a6c1080d862befa0a89c380b4dafce29dc6cd56083f630073d102eb595", size = 1297781 }, - { url = "https://files.pythonhosted.org/packages/01/af/8da680fa69632f413860d3f4dcace47f7fc50486fe920ec43447ffaccee7/aiohttp-3.9.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a81b1143d42b66ffc40a441379387076243ef7b51019204fd3ec36b9f69e77d6", size = 1257586 }, - { url = "https://files.pythonhosted.org/packages/90/ae/a0741922ef3e99e71faa18ddf1a3a00309dd01107d3dc51f46bedd30e5c6/aiohttp-3.9.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f64fd07515dad67f24b6ea4a66ae2876c01031de91c93075b8093f07c0a2d93d", size = 1319016 }, - { url = "https://files.pythonhosted.org/packages/ef/bd/61671d071518ac18875c1471cf5f6e210f48c855bdfc9e6cbe47134e2921/aiohttp-3.9.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:93e22add827447d2e26d67c9ac0161756007f152fdc5210277d00a85f6c92323", size = 1268646 }, - { url = "https://files.pythonhosted.org/packages/ea/d1/0e1d60543d68583ed5b87f4d2eb1c72e54c68933e7799e649de04ffbb6b0/aiohttp-3.9.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:55b39c8684a46e56ef8c8d24faf02de4a2b2ac60d26cee93bc595651ff545de9", size = 1350674 }, - { url = "https://files.pythonhosted.org/packages/46/60/4f5225360aebb03d9fbf2a26c79fa01c6da326eeb160d212050990a7f658/aiohttp-3.9.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4715a9b778f4293b9f8ae7a0a7cef9829f02ff8d6277a39d7f40565c737d3771", size = 1394599 }, - { url = "https://files.pythonhosted.org/packages/6b/99/c742967d54091496a5675ae9faa910765f572e7863461ccc7fb22a1501e2/aiohttp-3.9.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:afc52b8d969eff14e069a710057d15ab9ac17cd4b6753042c407dcea0e40bf75", size = 1302531 }, - { url = "https://files.pythonhosted.org/packages/a7/a5/e8e0e4bf0adb3ebd3773ebb0fb006d4e4850d1a9eef0a911482eba883814/aiohttp-3.9.5-cp311-cp311-win32.whl", hash = "sha256:b3df71da99c98534be076196791adca8819761f0bf6e08e07fd7da25127150d6", size = 350613 }, - { url = "https://files.pythonhosted.org/packages/a4/69/0d415c6d8450842652ce01b29f43416a0f30122b75899de01485623c7850/aiohttp-3.9.5-cp311-cp311-win_amd64.whl", hash = "sha256:88e311d98cc0bf45b62fc46c66753a83445f5ab20038bcc1b8a1cc05666f428a", size = 370792 }, - { url = "https://files.pythonhosted.org/packages/5e/25/c6bd6cb160a4dc81f83adbc9bdd6758f01932a6c81a3e4ac707746e7855e/aiohttp-3.9.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:c7a4b7a6cf5b6eb11e109a9755fd4fda7d57395f8c575e166d363b9fc3ec4678", size = 595330 }, - { url = "https://files.pythonhosted.org/packages/18/5f/f6428eb55244d44e1c674c8c823ae1567136ac1d2f8b128e194dd4febbe1/aiohttp-3.9.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:0a158704edf0abcac8ac371fbb54044f3270bdbc93e254a82b6c82be1ef08f3c", size = 395974 }, - { url = "https://files.pythonhosted.org/packages/78/28/2080ed3140b7d25c406f77fe2d5776edd9c7a25228f7f905d7058a6e2d61/aiohttp-3.9.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d153f652a687a8e95ad367a86a61e8d53d528b0530ef382ec5aaf533140ed00f", size = 392399 }, - { url = "https://files.pythonhosted.org/packages/d3/c0/cd9d02e1b9e1b1073c94f7692ffe69067987c4acc0252bbc0c7645360d37/aiohttp-3.9.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82a6a97d9771cb48ae16979c3a3a9a18b600a8505b1115cfe354dfb2054468b4", size = 1322648 }, - { url = "https://files.pythonhosted.org/packages/f2/fb/d65d58230e9ed5cfed886b0c433634bfb14cbe183125e84de909559e29e7/aiohttp-3.9.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:60cdbd56f4cad9f69c35eaac0fbbdf1f77b0ff9456cebd4902f3dd1cf096464c", size = 1362078 }, - { url = "https://files.pythonhosted.org/packages/a6/39/ca4fc97af53167ff6c8888a59002b17447bddd8dd474ae0f0e778446cfe7/aiohttp-3.9.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8676e8fd73141ded15ea586de0b7cda1542960a7b9ad89b2b06428e97125d4fa", size = 1404667 }, - { url = "https://files.pythonhosted.org/packages/dd/0a/526c8480bd846b9155c624c7e54db94733fc6b381dfd748cc8dd69c994b0/aiohttp-3.9.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da00da442a0e31f1c69d26d224e1efd3a1ca5bcbf210978a2ca7426dfcae9f58", size = 1317772 }, - { url = "https://files.pythonhosted.org/packages/0c/ea/8e1bd13e39b3f4c37889b8480f04ed398e07017f5709d66d4e1d0dee39fe/aiohttp-3.9.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18f634d540dd099c262e9f887c8bbacc959847cfe5da7a0e2e1cf3f14dbf2daf", size = 1269636 }, - { url = "https://files.pythonhosted.org/packages/2a/ac/7c00027510f42a21c0a905f2472d9afef7ea276573357829bfe8c12883d4/aiohttp-3.9.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:320e8618eda64e19d11bdb3bd04ccc0a816c17eaecb7e4945d01deee2a22f95f", size = 1324957 }, - { url = "https://files.pythonhosted.org/packages/e3/f5/e0c216a12b2490cbecd79e9b7671f4e50dfc72e9a52347943aabe6f5bc44/aiohttp-3.9.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:2faa61a904b83142747fc6a6d7ad8fccff898c849123030f8e75d5d967fd4a81", size = 1267548 }, - { url = "https://files.pythonhosted.org/packages/88/31/e55083b026428324cde827c04bdfbc837c131f9d3ee38d28c766614b09ef/aiohttp-3.9.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:8c64a6dc3fe5db7b1b4d2b5cb84c4f677768bdc340611eca673afb7cf416ef5a", size = 1353136 }, - { url = "https://files.pythonhosted.org/packages/54/8e/72d1ddd6e653b6d4b7b1fece7619287d3319bae10ad3a7f12d956bcc9e96/aiohttp-3.9.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:393c7aba2b55559ef7ab791c94b44f7482a07bf7640d17b341b79081f5e5cd1a", size = 1400946 }, - { url = "https://files.pythonhosted.org/packages/5c/f1/f61b397a0eaf01d197e610b0f56935b0002d688f27d73af2882b282fc2f8/aiohttp-3.9.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:c671dc117c2c21a1ca10c116cfcd6e3e44da7fcde37bf83b2be485ab377b25da", size = 1319358 }, - { url = "https://files.pythonhosted.org/packages/d1/5d/8cb20df780921adf9f436f214350729b12873742abd697c981229c554acc/aiohttp-3.9.5-cp312-cp312-win32.whl", hash = "sha256:5a7ee16aab26e76add4afc45e8f8206c95d1d75540f1039b84a03c3b3800dd59", size = 347602 }, - { url = "https://files.pythonhosted.org/packages/a0/00/cdbda8b406ce7b656b9cb765f8134b1edb999f816f54e47347d2bc67f4bf/aiohttp-3.9.5-cp312-cp312-win_amd64.whl", hash = "sha256:5ca51eadbd67045396bc92a4345d1790b7301c14d1848feaac1d6a6c9289e888", size = 369012 }, -] - -[[package]] -name = "aiohttp-json-rpc" -version = "0.13.3" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "aiohttp" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/53/98/11d7a28734cbea1dd5ceb3e6603402169541a4f1a429b810988680975293/aiohttp-json-rpc-0.13.3.tar.gz", hash = "sha256:6237a104478c22c6ef96c7227a01d6832597b414e4b79a52d85593356a169e99", size = 28657 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c1/a3/82986305dc5e917bd05c530bd2ec951aff82a63afb6ae512f3c56046cc94/aiohttp_json_rpc-0.13.3-py3-none-any.whl", hash = "sha256:4fbd197aced61bd2df7ae3237ead7d3e08833c2ccf48b8581e1828c95ebee680", size = 30720 }, -] - -[[package]] -name = "aiosignal" -version = "1.3.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "frozenlist" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/ae/67/0952ed97a9793b4958e5736f6d2b346b414a2cd63e82d05940032f45b32f/aiosignal-1.3.1.tar.gz", hash = "sha256:54cd96e15e1649b75d6c87526a6ff0b6c1b0dd3459f43d9ca11d48c339b68cfc", size = 19422 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/76/ac/a7305707cb852b7e16ff80eaf5692309bde30e2b1100a1fcacdc8f731d97/aiosignal-1.3.1-py3-none-any.whl", hash = "sha256:f8376fb07dd1e86a584e4fcdec80b36b7f81aac666ebc724e2c090300dd83b17", size = 7617 }, -] - -[[package]] -name = "aiosqlite" -version = "0.21.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/13/7d/8bca2bf9a247c2c5dfeec1d7a5f40db6518f88d314b8bca9da29670d2671/aiosqlite-0.21.0.tar.gz", hash = "sha256:131bb8056daa3bc875608c631c678cda73922a2d4ba8aec373b19f18c17e7aa3", size = 13454 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f5/10/6c25ed6de94c49f88a91fa5018cb4c0f3625f31d5be9f771ebe5cc7cd506/aiosqlite-0.21.0-py3-none-any.whl", hash = "sha256:2549cf4057f95f53dcba16f2b64e8e2791d7e1adedb13197dd8ed77bb226d7d0", size = 15792 }, -] - -[[package]] -name = "annotated-types" -version = "0.7.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643 }, -] - -[[package]] -name = "apsw" -version = "3.46.1.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/2e/9f/29be0326b2178cfe10d6d45de83163c70cd0b4985502f398fe32791943e2/apsw-3.46.1.0.tar.gz", hash = "sha256:96e3dfad1fd0cc77a778aa6b27468292041a8e9cb1f2dcf06bd773762c9b0c0c", size = 403954 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d0/64/772661433d50473bf09b4f3e777cb5580dd29093461138e897f57402be51/apsw-3.46.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8acacf3a0187cbd4c82c9eaa2c7e2704c13997a351efdffbdfa69ea1778bda1f", size = 1330000 }, - { url = "https://files.pythonhosted.org/packages/09/08/2311678a00314fcf3c007d1b17780c0ba19084c09afca89c082353785616/apsw-3.46.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2fcc5fd76a4a21fb1cc1694495e221206a46d932c675ba5dda8f070262347e0b", size = 1252124 }, - { url = "https://files.pythonhosted.org/packages/51/01/bf171dec627935691bcf8e900151031ad9b50689d488d9ef2069f5179aa2/apsw-3.46.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca319360995762fbed9e7d252c3ae4ea84af2d7bc1aef21adbcb4e088a416373", size = 5332494 }, - { url = "https://files.pythonhosted.org/packages/5e/1d/be64af8c3043d2d39bab4fc6bfc55aadfa24bffc3d8bf522908b9b831a92/apsw-3.46.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42036093f8b7dd66bbb18b717ef6dfa62c4a2acd9bcdf05fdf5caedf77a47c01", size = 5380153 }, - { url = "https://files.pythonhosted.org/packages/00/32/d9ebff5ecc7fd0100e7cb62dbbebc9edbd70d3812c4cc811ee823ec1c33c/apsw-3.46.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4d54efc7d7d58b782dc84f29c5d25d190984dec20d8233484d3b092ded1241e1", size = 5264455 }, - { url = "https://files.pythonhosted.org/packages/f9/46/ebe89b57f229a0db9eb44eafa87077a1b23881d3f366dc035047327dbeac/apsw-3.46.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:3864151c23edd3a232e059925bd37044e2c1b90f20ba1d0b46005d0e5d97d10d", size = 5361349 }, - { url = "https://files.pythonhosted.org/packages/a2/72/25955d7d36264e705d8be86fdc49b1ff4a5438a8a9ff8ce78f9a806b10d1/apsw-3.46.1.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:3e42ebb5997fcd6234cdb888f641ca37a7e9d03c13c4f2e1e0ac66151a182e79", size = 5351742 }, - { url = "https://files.pythonhosted.org/packages/56/9c/a15ed769f3b5f5012e9216598ed6db333c74bfbe3b197a217aa67c46094a/apsw-3.46.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7ea887719b60d48ac569eb42594f7dd772ab2b2287aaae9c9a007789467aa26a", size = 5423667 }, - { url = "https://files.pythonhosted.org/packages/a6/ed/a1f3437764ae69efebff2b64de0e9e7e3169fe0e44b52763cb808dbb74c3/apsw-3.46.1.0-cp311-cp311-win32.whl", hash = "sha256:67754bc4c0b2dda1a112f0adfdd6d25c2f724d8c086decb9690349056f799eed", size = 1030732 }, - { url = "https://files.pythonhosted.org/packages/8c/05/d3a57fd6da3093f12b1e92e93cf1a036e0293879198697fe2b500bfd8a17/apsw-3.46.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:fef6891bc388d92ac8208db2e6f5cd90bd75a64930147f515f2e28526a278c81", size = 1203793 }, - { url = "https://files.pythonhosted.org/packages/4f/54/efebcf27cedd308a6e39d4b159450544965913679e03b9f1afac96765d90/apsw-3.46.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a892c3dccbb2f96611a0707fb4cf1573c88a4a2898b45f013a202557f602faa8", size = 1330291 }, - { url = "https://files.pythonhosted.org/packages/fb/c9/6382df13216f524a8e4d37298d6dfe3a5ba0b67a4be91082ce4858a75b5f/apsw-3.46.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1e01e2cf7faae0d86540e9c638778c98cdd14b365136d9b11d2a0a7dfe4893f3", size = 1251560 }, - { url = "https://files.pythonhosted.org/packages/89/82/4f6409346583232d49bbbe14ce0dd006ff9552c9e4e3f32dc132deb8fbe9/apsw-3.46.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf96999557f5ccc5c8424b0c8637447652994e26b4fe87b72626def24c53dcf1", size = 5322282 }, - { url = "https://files.pythonhosted.org/packages/83/e2/ddb1cbe4d6e348e601c58e1d0b65b8f7bbc5b436c5820deb43e602eb918a/apsw-3.46.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:925c01733c0de8adf7f3cbf299e4bcb38961b62de4436f8704e5ff9800523a7c", size = 5363048 }, - { url = "https://files.pythonhosted.org/packages/f0/c9/86a6ae3248773abe08b168c24a08fc02b4cbd55fcf013a604bc50191e908/apsw-3.46.1.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:979f1fca9ec09c1e8bd466ad17fde25dffb06ea621bd8b7c08e404d042c4d362", size = 5252462 }, - { url = "https://files.pythonhosted.org/packages/93/47/02a42f5889f897c4358b2c2c61c88eea80ba21dbdbd79f218a301aeb282b/apsw-3.46.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e02c614ca3afceb6c80349485dd2d49fea584a885794ca732513d8aa746781d7", size = 5352619 }, - { url = "https://files.pythonhosted.org/packages/c4/08/e989cc8b419de48c9eb07c23b780a70786ecee3bfc4525936c2fb4006ae4/apsw-3.46.1.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:c9c130253eba2f70547253f54db05d0e6aa41962d9d712b9e1b8efba1ea2990b", size = 5333787 }, - { url = "https://files.pythonhosted.org/packages/50/15/7a1d05f1424f8bfb0f4d6bc070d97c2a416e94aca57d653a6b81d7c260eb/apsw-3.46.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:999f8fc2607a98ecfddb9d266bd746ae9a08dfa67841700ccfb0108a9cfe9104", size = 5407568 }, - { url = "https://files.pythonhosted.org/packages/76/57/ce935c45e21f95faf956e8cd0c04a583324e226f1838980c5d344a9fb2ac/apsw-3.46.1.0-cp312-cp312-win32.whl", hash = "sha256:0f864580269c5cfe7aed899057a6e76f06940d2bc4134c2e32d36aadad0b3e29", size = 1030498 }, - { url = "https://files.pythonhosted.org/packages/fa/39/a99ddf2fd49ae794885d22f0ec9e7be56ad4794a393bfbe395b9711d9dc5/apsw-3.46.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:fb770bbe185d3cd6609bb245e22108490c81a025e3be82cd278116b5e21cbbee", size = 1202387 }, - { url = "https://files.pythonhosted.org/packages/01/91/1dad0195b08a035b48fa278d3ccea1336d48e3b8a5a8be5bc0ebdc4cd5c1/apsw-3.46.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8113139847f1ad7023a2b8ab8cee15ceec2406c9fbc6709c64a029947485bc23", size = 1329935 }, - { url = "https://files.pythonhosted.org/packages/00/45/38c7f64d4d6567bc989fde6d39498c6cc6d4540c2094a38fd803662d1f06/apsw-3.46.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:038e9550dc24413a12fde36492ab275410c35982e97d33cc5fd7c18325bbc9e1", size = 1249843 }, - { url = "https://files.pythonhosted.org/packages/72/43/dc5ed5a6ad6caad5874496f6ef5b31bfa309d0dc10435f0581486e63c419/apsw-3.46.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1779f6d512d07b1fa914d268c42ac47170fd41aeae3352c3ce1c5c9f410496b9", size = 5323599 }, - { url = "https://files.pythonhosted.org/packages/3d/3c/9b5ef3e9edb7b4864ae6365cad8c5b26c6490552d1b7a9896e6dd8c37f48/apsw-3.46.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5b2497696ccb5ac928ba3bbae988a82e00d0be3242b7bdd0553ce4447bdcc73b", size = 5375717 }, - { url = "https://files.pythonhosted.org/packages/df/eb/09435de9918e2f4ff05c812ccbc6f3d857fa35835303c1028e92f0b3c630/apsw-3.46.1.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1b182bafe729822f7a934d081d9190b76e0dae1f5f098efa7430fcdd38e3a315", size = 5263638 }, - { url = "https://files.pythonhosted.org/packages/1f/8a/d1be6a390d8b524bbacfe6b2d59d94391275a38dda87cc815fed7299511a/apsw-3.46.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d08cf0df8f58b4bdf8c0b7a4c8e70f2a8840be631f40dae848b384636a22fe0d", size = 5357278 }, - { url = "https://files.pythonhosted.org/packages/11/f8/b51d9b4bacec54fcafa042c24e58e2f349cc5eedcaab31e06f4862c6bcf5/apsw-3.46.1.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:7d37e2f6e1a22bb1a82905237b4d433124ccc53a62f918b9cf7c42c6e49241d0", size = 5335671 }, - { url = "https://files.pythonhosted.org/packages/a7/35/6a7cfdb1275a2c84f5cf5e108f49da7c491bb20b8aa6e48e8dd5d6f84dc3/apsw-3.46.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:3d49e1996c13661011505cd53502e580c63062eafeebaebcd80ec34b435475c4", size = 5416144 }, - { url = "https://files.pythonhosted.org/packages/aa/8c/91264d7fcc0e70a9c09aefac0794ee9aad2006ffd0183061fb1f462fe9bb/apsw-3.46.1.0-cp313-cp313-win32.whl", hash = "sha256:42039f5d650ef1bb12e1304aebe47338c20bead38b41bae0f22f98e78cc6855c", size = 1029293 }, - { url = "https://files.pythonhosted.org/packages/cc/d2/9a917ea97c2a13978e97c854d49d286060f028ad172d9958f33cb8e29e14/apsw-3.46.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:1c37abd9f344aefa11c3fe213738c1db4fe49bacef1aee360087fa1ac840b1c4", size = 1200893 }, -] - -[[package]] -name = "astroid" -version = "3.3.9" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/39/33/536530122a22a7504b159bccaf30a1f76aa19d23028bd8b5009eb9b2efea/astroid-3.3.9.tar.gz", hash = "sha256:622cc8e3048684aa42c820d9d218978021c3c3d174fb03a9f0d615921744f550", size = 398731 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/de/80/c749efbd8eef5ea77c7d6f1956e8fbfb51963b7f93ef79647afd4d9886e3/astroid-3.3.9-py3-none-any.whl", hash = "sha256:d05bfd0acba96a7bd43e222828b7d9bc1e138aaeb0649707908d3702a9831248", size = 275339 }, -] - -[[package]] -name = "async-timeout" -version = "4.0.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/87/d6/21b30a550dafea84b1b8eee21b5e23fa16d010ae006011221f33dcd8d7f8/async-timeout-4.0.3.tar.gz", hash = "sha256:4640d96be84d82d02ed59ea2b7105a0f7b33abe8703703cd0ab0bf87c427522f", size = 8345 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a7/fa/e01228c2938de91d47b307831c62ab9e4001e747789d0b05baf779a6488c/async_timeout-4.0.3-py3-none-any.whl", hash = "sha256:7405140ff1230c310e51dc27b3145b9092d659ce68ff733fb0cefe3ee42be028", size = 5721 }, -] - -[[package]] -name = "attrs" -version = "25.3.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/5a/b0/1367933a8532ee6ff8d63537de4f1177af4bff9f3e829baf7331f595bb24/attrs-25.3.0.tar.gz", hash = "sha256:75d7cefc7fb576747b2c81b4442d4d4a1ce0900973527c011d1030fd3bf4af1b", size = 812032 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/77/06/bb80f5f86020c4551da315d78b3ab75e8228f89f0162f2c3a819e407941a/attrs-25.3.0-py3-none-any.whl", hash = "sha256:427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3", size = 63815 }, -] - -[[package]] -name = "audioop-lts" -version = "0.2.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/dd/3b/69ff8a885e4c1c42014c2765275c4bd91fe7bc9847e9d8543dbcbb09f820/audioop_lts-0.2.1.tar.gz", hash = "sha256:e81268da0baa880431b68b1308ab7257eb33f356e57a5f9b1f915dfb13dd1387", size = 30204 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/01/91/a219253cc6e92db2ebeaf5cf8197f71d995df6f6b16091d1f3ce62cb169d/audioop_lts-0.2.1-cp313-abi3-macosx_10_13_universal2.whl", hash = "sha256:fd1345ae99e17e6910f47ce7d52673c6a1a70820d78b67de1b7abb3af29c426a", size = 46252 }, - { url = "https://files.pythonhosted.org/packages/ec/f6/3cb21e0accd9e112d27cee3b1477cd04dafe88675c54ad8b0d56226c1e0b/audioop_lts-0.2.1-cp313-abi3-macosx_10_13_x86_64.whl", hash = "sha256:e175350da05d2087e12cea8e72a70a1a8b14a17e92ed2022952a4419689ede5e", size = 27183 }, - { url = "https://files.pythonhosted.org/packages/ea/7e/f94c8a6a8b2571694375b4cf94d3e5e0f529e8e6ba280fad4d8c70621f27/audioop_lts-0.2.1-cp313-abi3-macosx_11_0_arm64.whl", hash = "sha256:4a8dd6a81770f6ecf019c4b6d659e000dc26571b273953cef7cd1d5ce2ff3ae6", size = 26726 }, - { url = "https://files.pythonhosted.org/packages/ef/f8/a0e8e7a033b03fae2b16bc5aa48100b461c4f3a8a38af56d5ad579924a3a/audioop_lts-0.2.1-cp313-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d1cd3c0b6f2ca25c7d2b1c3adeecbe23e65689839ba73331ebc7d893fcda7ffe", size = 80718 }, - { url = "https://files.pythonhosted.org/packages/8f/ea/a98ebd4ed631c93b8b8f2368862cd8084d75c77a697248c24437c36a6f7e/audioop_lts-0.2.1-cp313-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ff3f97b3372c97782e9c6d3d7fdbe83bce8f70de719605bd7ee1839cd1ab360a", size = 88326 }, - { url = "https://files.pythonhosted.org/packages/33/79/e97a9f9daac0982aa92db1199339bd393594d9a4196ad95ae088635a105f/audioop_lts-0.2.1-cp313-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a351af79edefc2a1bd2234bfd8b339935f389209943043913a919df4b0f13300", size = 80539 }, - { url = "https://files.pythonhosted.org/packages/b2/d3/1051d80e6f2d6f4773f90c07e73743a1e19fcd31af58ff4e8ef0375d3a80/audioop_lts-0.2.1-cp313-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2aeb6f96f7f6da80354330470b9134d81b4cf544cdd1c549f2f45fe964d28059", size = 78577 }, - { url = "https://files.pythonhosted.org/packages/7a/1d/54f4c58bae8dc8c64a75071c7e98e105ddaca35449376fcb0180f6e3c9df/audioop_lts-0.2.1-cp313-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c589f06407e8340e81962575fcffbba1e92671879a221186c3d4662de9fe804e", size = 82074 }, - { url = "https://files.pythonhosted.org/packages/36/89/2e78daa7cebbea57e72c0e1927413be4db675548a537cfba6a19040d52fa/audioop_lts-0.2.1-cp313-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:fbae5d6925d7c26e712f0beda5ed69ebb40e14212c185d129b8dfbfcc335eb48", size = 84210 }, - { url = "https://files.pythonhosted.org/packages/a5/57/3ff8a74df2ec2fa6d2ae06ac86e4a27d6412dbb7d0e0d41024222744c7e0/audioop_lts-0.2.1-cp313-abi3-musllinux_1_2_i686.whl", hash = "sha256:d2d5434717f33117f29b5691fbdf142d36573d751716249a288fbb96ba26a281", size = 85664 }, - { url = "https://files.pythonhosted.org/packages/16/01/21cc4e5878f6edbc8e54be4c108d7cb9cb6202313cfe98e4ece6064580dd/audioop_lts-0.2.1-cp313-abi3-musllinux_1_2_ppc64le.whl", hash = "sha256:f626a01c0a186b08f7ff61431c01c055961ee28769591efa8800beadd27a2959", size = 93255 }, - { url = "https://files.pythonhosted.org/packages/3e/28/7f7418c362a899ac3b0bf13b1fde2d4ffccfdeb6a859abd26f2d142a1d58/audioop_lts-0.2.1-cp313-abi3-musllinux_1_2_s390x.whl", hash = "sha256:05da64e73837f88ee5c6217d732d2584cf638003ac72df124740460531e95e47", size = 87760 }, - { url = "https://files.pythonhosted.org/packages/6d/d8/577a8be87dc7dd2ba568895045cee7d32e81d85a7e44a29000fe02c4d9d4/audioop_lts-0.2.1-cp313-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:56b7a0a4dba8e353436f31a932f3045d108a67b5943b30f85a5563f4d8488d77", size = 84992 }, - { url = "https://files.pythonhosted.org/packages/ef/9a/4699b0c4fcf89936d2bfb5425f55f1a8b86dff4237cfcc104946c9cd9858/audioop_lts-0.2.1-cp313-abi3-win32.whl", hash = "sha256:6e899eb8874dc2413b11926b5fb3857ec0ab55222840e38016a6ba2ea9b7d5e3", size = 26059 }, - { url = "https://files.pythonhosted.org/packages/3a/1c/1f88e9c5dd4785a547ce5fd1eb83fff832c00cc0e15c04c1119b02582d06/audioop_lts-0.2.1-cp313-abi3-win_amd64.whl", hash = "sha256:64562c5c771fb0a8b6262829b9b4f37a7b886c01b4d3ecdbae1d629717db08b4", size = 30412 }, - { url = "https://files.pythonhosted.org/packages/c4/e9/c123fd29d89a6402ad261516f848437472ccc602abb59bba522af45e281b/audioop_lts-0.2.1-cp313-abi3-win_arm64.whl", hash = "sha256:c45317debeb64002e980077642afbd977773a25fa3dfd7ed0c84dccfc1fafcb0", size = 23578 }, - { url = "https://files.pythonhosted.org/packages/7a/99/bb664a99561fd4266687e5cb8965e6ec31ba4ff7002c3fce3dc5ef2709db/audioop_lts-0.2.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:3827e3fce6fee4d69d96a3d00cd2ab07f3c0d844cb1e44e26f719b34a5b15455", size = 46827 }, - { url = "https://files.pythonhosted.org/packages/c4/e3/f664171e867e0768ab982715e744430cf323f1282eb2e11ebfb6ee4c4551/audioop_lts-0.2.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:161249db9343b3c9780ca92c0be0d1ccbfecdbccac6844f3d0d44b9c4a00a17f", size = 27479 }, - { url = "https://files.pythonhosted.org/packages/a6/0d/2a79231ff54eb20e83b47e7610462ad6a2bea4e113fae5aa91c6547e7764/audioop_lts-0.2.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5b7b4ff9de7a44e0ad2618afdc2ac920b91f4a6d3509520ee65339d4acde5abf", size = 27056 }, - { url = "https://files.pythonhosted.org/packages/86/46/342471398283bb0634f5a6df947806a423ba74b2e29e250c7ec0e3720e4f/audioop_lts-0.2.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:72e37f416adb43b0ced93419de0122b42753ee74e87070777b53c5d2241e7fab", size = 87802 }, - { url = "https://files.pythonhosted.org/packages/56/44/7a85b08d4ed55517634ff19ddfbd0af05bf8bfd39a204e4445cd0e6f0cc9/audioop_lts-0.2.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:534ce808e6bab6adb65548723c8cbe189a3379245db89b9d555c4210b4aaa9b6", size = 95016 }, - { url = "https://files.pythonhosted.org/packages/a8/2a/45edbca97ea9ee9e6bbbdb8d25613a36e16a4d1e14ae01557392f15cc8d3/audioop_lts-0.2.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d2de9b6fb8b1cf9f03990b299a9112bfdf8b86b6987003ca9e8a6c4f56d39543", size = 87394 }, - { url = "https://files.pythonhosted.org/packages/14/ae/832bcbbef2c510629593bf46739374174606e25ac7d106b08d396b74c964/audioop_lts-0.2.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f24865991b5ed4b038add5edbf424639d1358144f4e2a3e7a84bc6ba23e35074", size = 84874 }, - { url = "https://files.pythonhosted.org/packages/26/1c/8023c3490798ed2f90dfe58ec3b26d7520a243ae9c0fc751ed3c9d8dbb69/audioop_lts-0.2.1-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bdb3b7912ccd57ea53197943f1bbc67262dcf29802c4a6df79ec1c715d45a78", size = 88698 }, - { url = "https://files.pythonhosted.org/packages/2c/db/5379d953d4918278b1f04a5a64b2c112bd7aae8f81021009da0dcb77173c/audioop_lts-0.2.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:120678b208cca1158f0a12d667af592e067f7a50df9adc4dc8f6ad8d065a93fb", size = 90401 }, - { url = "https://files.pythonhosted.org/packages/99/6e/3c45d316705ab1aec2e69543a5b5e458d0d112a93d08994347fafef03d50/audioop_lts-0.2.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:54cd4520fc830b23c7d223693ed3e1b4d464997dd3abc7c15dce9a1f9bd76ab2", size = 91864 }, - { url = "https://files.pythonhosted.org/packages/08/58/6a371d8fed4f34debdb532c0b00942a84ebf3e7ad368e5edc26931d0e251/audioop_lts-0.2.1-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:d6bd20c7a10abcb0fb3d8aaa7508c0bf3d40dfad7515c572014da4b979d3310a", size = 98796 }, - { url = "https://files.pythonhosted.org/packages/ee/77/d637aa35497e0034ff846fd3330d1db26bc6fd9dd79c406e1341188b06a2/audioop_lts-0.2.1-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:f0ed1ad9bd862539ea875fb339ecb18fcc4148f8d9908f4502df28f94d23491a", size = 94116 }, - { url = "https://files.pythonhosted.org/packages/1a/60/7afc2abf46bbcf525a6ebc0305d85ab08dc2d1e2da72c48dbb35eee5b62c/audioop_lts-0.2.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e1af3ff32b8c38a7d900382646e91f2fc515fd19dea37e9392275a5cbfdbff63", size = 91520 }, - { url = "https://files.pythonhosted.org/packages/65/6d/42d40da100be1afb661fd77c2b1c0dfab08af1540df57533621aea3db52a/audioop_lts-0.2.1-cp313-cp313t-win32.whl", hash = "sha256:f51bb55122a89f7a0817d7ac2319744b4640b5b446c4c3efcea5764ea99ae509", size = 26482 }, - { url = "https://files.pythonhosted.org/packages/01/09/f08494dca79f65212f5b273aecc5a2f96691bf3307cac29acfcf84300c01/audioop_lts-0.2.1-cp313-cp313t-win_amd64.whl", hash = "sha256:f0f2f336aa2aee2bce0b0dcc32bbba9178995454c7b979cf6ce086a8801e14c7", size = 30780 }, - { url = "https://files.pythonhosted.org/packages/5d/35/be73b6015511aa0173ec595fc579133b797ad532996f2998fd6b8d1bbe6b/audioop_lts-0.2.1-cp313-cp313t-win_arm64.whl", hash = "sha256:78bfb3703388c780edf900be66e07de5a3d4105ca8e8720c5c4d67927e0b15d0", size = 23918 }, -] - -[[package]] -name = "babel" -version = "2.17.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/7d/6b/d52e42361e1aa00709585ecc30b3f9684b3ab62530771402248b1b1d6240/babel-2.17.0.tar.gz", hash = "sha256:0c54cffb19f690cdcc52a3b50bcbf71e07a808d1c80d549f2459b9d2cf0afb9d", size = 9951852 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b7/b8/3fe70c75fe32afc4bb507f75563d39bc5642255d1d94f1f23604725780bf/babel-2.17.0-py3-none-any.whl", hash = "sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2", size = 10182537 }, -] - -[[package]] -name = "backrefs" -version = "5.8" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/6c/46/caba1eb32fa5784428ab401a5487f73db4104590ecd939ed9daaf18b47e0/backrefs-5.8.tar.gz", hash = "sha256:2cab642a205ce966af3dd4b38ee36009b31fa9502a35fd61d59ccc116e40a6bd", size = 6773994 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/bf/cb/d019ab87fe70e0fe3946196d50d6a4428623dc0c38a6669c8cae0320fbf3/backrefs-5.8-py310-none-any.whl", hash = "sha256:c67f6638a34a5b8730812f5101376f9d41dc38c43f1fdc35cb54700f6ed4465d", size = 380337 }, - { url = "https://files.pythonhosted.org/packages/a9/86/abd17f50ee21b2248075cb6924c6e7f9d23b4925ca64ec660e869c2633f1/backrefs-5.8-py311-none-any.whl", hash = "sha256:2e1c15e4af0e12e45c8701bd5da0902d326b2e200cafcd25e49d9f06d44bb61b", size = 392142 }, - { url = "https://files.pythonhosted.org/packages/b3/04/7b415bd75c8ab3268cc138c76fa648c19495fcc7d155508a0e62f3f82308/backrefs-5.8-py312-none-any.whl", hash = "sha256:bbef7169a33811080d67cdf1538c8289f76f0942ff971222a16034da88a73486", size = 398021 }, - { url = "https://files.pythonhosted.org/packages/04/b8/60dcfb90eb03a06e883a92abbc2ab95c71f0d8c9dd0af76ab1d5ce0b1402/backrefs-5.8-py313-none-any.whl", hash = "sha256:e3a63b073867dbefd0536425f43db618578528e3896fb77be7141328642a1585", size = 399915 }, - { url = "https://files.pythonhosted.org/packages/0c/37/fb6973edeb700f6e3d6ff222400602ab1830446c25c7b4676d8de93e65b8/backrefs-5.8-py39-none-any.whl", hash = "sha256:a66851e4533fb5b371aa0628e1fee1af05135616b86140c9d787a2ffdf4b8fdc", size = 380336 }, -] - -[[package]] -name = "beautifulsoup4" -version = "4.13.3" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "soupsieve" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/f0/3c/adaf39ce1fb4afdd21b611e3d530b183bb7759c9b673d60db0e347fd4439/beautifulsoup4-4.13.3.tar.gz", hash = "sha256:1bd32405dacc920b42b83ba01644747ed77456a65760e285fbc47633ceddaf8b", size = 619516 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f9/49/6abb616eb3cbab6a7cca303dc02fdf3836de2e0b834bf966a7f5271a34d8/beautifulsoup4-4.13.3-py3-none-any.whl", hash = "sha256:99045d7d3f08f91f0d656bc9b7efbae189426cd913d830294a15eefa0ea4df16", size = 186015 }, -] - -[[package]] -name = "blinker" -version = "1.9.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/21/28/9b3f50ce0e048515135495f198351908d99540d69bfdc8c1d15b73dc55ce/blinker-1.9.0.tar.gz", hash = "sha256:b4ce2265a7abece45e7cc896e98dbebe6cead56bcf805a3d23136d145f5445bf", size = 22460 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/10/cb/f2ad4230dc2eb1a74edf38f1a38b9b52277f75bef262d8908e60d957e13c/blinker-1.9.0-py3-none-any.whl", hash = "sha256:ba0efaa9080b619ff2f3459d1d500c57bddea4a6b424b60a91141db6fd2f08bc", size = 8458 }, -] - -[[package]] -name = "brotli" -version = "1.1.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/2f/c2/f9e977608bdf958650638c3f1e28f85a1b075f075ebbe77db8555463787b/Brotli-1.1.0.tar.gz", hash = "sha256:81de08ac11bcb85841e440c13611c00b67d3bf82698314928d0b676362546724", size = 7372270 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/96/12/ad41e7fadd5db55459c4c401842b47f7fee51068f86dd2894dd0dcfc2d2a/Brotli-1.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a3daabb76a78f829cafc365531c972016e4aa8d5b4bf60660ad8ecee19df7ccc", size = 873068 }, - { url = "https://files.pythonhosted.org/packages/95/4e/5afab7b2b4b61a84e9c75b17814198ce515343a44e2ed4488fac314cd0a9/Brotli-1.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c8146669223164fc87a7e3de9f81e9423c67a79d6b3447994dfb9c95da16e2d6", size = 446244 }, - { url = "https://files.pythonhosted.org/packages/9d/e6/f305eb61fb9a8580c525478a4a34c5ae1a9bcb12c3aee619114940bc513d/Brotli-1.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:30924eb4c57903d5a7526b08ef4a584acc22ab1ffa085faceb521521d2de32dd", size = 2906500 }, - { url = "https://files.pythonhosted.org/packages/3e/4f/af6846cfbc1550a3024e5d3775ede1e00474c40882c7bf5b37a43ca35e91/Brotli-1.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ceb64bbc6eac5a140ca649003756940f8d6a7c444a68af170b3187623b43bebf", size = 2943950 }, - { url = "https://files.pythonhosted.org/packages/b3/e7/ca2993c7682d8629b62630ebf0d1f3bb3d579e667ce8e7ca03a0a0576a2d/Brotli-1.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a469274ad18dc0e4d316eefa616d1d0c2ff9da369af19fa6f3daa4f09671fd61", size = 2918527 }, - { url = "https://files.pythonhosted.org/packages/b3/96/da98e7bedc4c51104d29cc61e5f449a502dd3dbc211944546a4cc65500d3/Brotli-1.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:524f35912131cc2cabb00edfd8d573b07f2d9f21fa824bd3fb19725a9cf06327", size = 2845489 }, - { url = "https://files.pythonhosted.org/packages/e8/ef/ccbc16947d6ce943a7f57e1a40596c75859eeb6d279c6994eddd69615265/Brotli-1.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:5b3cc074004d968722f51e550b41a27be656ec48f8afaeeb45ebf65b561481dd", size = 2914080 }, - { url = "https://files.pythonhosted.org/packages/80/d6/0bd38d758d1afa62a5524172f0b18626bb2392d717ff94806f741fcd5ee9/Brotli-1.1.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:19c116e796420b0cee3da1ccec3b764ed2952ccfcc298b55a10e5610ad7885f9", size = 2813051 }, - { url = "https://files.pythonhosted.org/packages/14/56/48859dd5d129d7519e001f06dcfbb6e2cf6db92b2702c0c2ce7d97e086c1/Brotli-1.1.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:510b5b1bfbe20e1a7b3baf5fed9e9451873559a976c1a78eebaa3b86c57b4265", size = 2938172 }, - { url = "https://files.pythonhosted.org/packages/3d/77/a236d5f8cd9e9f4348da5acc75ab032ab1ab2c03cc8f430d24eea2672888/Brotli-1.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a1fd8a29719ccce974d523580987b7f8229aeace506952fa9ce1d53a033873c8", size = 2933023 }, - { url = "https://files.pythonhosted.org/packages/f1/87/3b283efc0f5cb35f7f84c0c240b1e1a1003a5e47141a4881bf87c86d0ce2/Brotli-1.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c247dd99d39e0338a604f8c2b3bc7061d5c2e9e2ac7ba9cc1be5a69cb6cd832f", size = 2935871 }, - { url = "https://files.pythonhosted.org/packages/f3/eb/2be4cc3e2141dc1a43ad4ca1875a72088229de38c68e842746b342667b2a/Brotli-1.1.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:1b2c248cd517c222d89e74669a4adfa5577e06ab68771a529060cf5a156e9757", size = 2847784 }, - { url = "https://files.pythonhosted.org/packages/66/13/b58ddebfd35edde572ccefe6890cf7c493f0c319aad2a5badee134b4d8ec/Brotli-1.1.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:2a24c50840d89ded6c9a8fdc7b6ed3692ed4e86f1c4a4a938e1e92def92933e0", size = 3034905 }, - { url = "https://files.pythonhosted.org/packages/84/9c/bc96b6c7db824998a49ed3b38e441a2cae9234da6fa11f6ed17e8cf4f147/Brotli-1.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f31859074d57b4639318523d6ffdca586ace54271a73ad23ad021acd807eb14b", size = 2929467 }, - { url = "https://files.pythonhosted.org/packages/e7/71/8f161dee223c7ff7fea9d44893fba953ce97cf2c3c33f78ba260a91bcff5/Brotli-1.1.0-cp311-cp311-win32.whl", hash = "sha256:39da8adedf6942d76dc3e46653e52df937a3c4d6d18fdc94a7c29d263b1f5b50", size = 333169 }, - { url = "https://files.pythonhosted.org/packages/02/8a/fece0ee1057643cb2a5bbf59682de13f1725f8482b2c057d4e799d7ade75/Brotli-1.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:aac0411d20e345dc0920bdec5548e438e999ff68d77564d5e9463a7ca9d3e7b1", size = 357253 }, - { url = "https://files.pythonhosted.org/packages/5c/d0/5373ae13b93fe00095a58efcbce837fd470ca39f703a235d2a999baadfbc/Brotli-1.1.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:32d95b80260d79926f5fab3c41701dbb818fde1c9da590e77e571eefd14abe28", size = 815693 }, - { url = "https://files.pythonhosted.org/packages/8e/48/f6e1cdf86751300c288c1459724bfa6917a80e30dbfc326f92cea5d3683a/Brotli-1.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b760c65308ff1e462f65d69c12e4ae085cff3b332d894637f6273a12a482d09f", size = 422489 }, - { url = "https://files.pythonhosted.org/packages/06/88/564958cedce636d0f1bed313381dfc4b4e3d3f6015a63dae6146e1b8c65c/Brotli-1.1.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:316cc9b17edf613ac76b1f1f305d2a748f1b976b033b049a6ecdfd5612c70409", size = 873081 }, - { url = "https://files.pythonhosted.org/packages/58/79/b7026a8bb65da9a6bb7d14329fd2bd48d2b7f86d7329d5cc8ddc6a90526f/Brotli-1.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:caf9ee9a5775f3111642d33b86237b05808dafcd6268faa492250e9b78046eb2", size = 446244 }, - { url = "https://files.pythonhosted.org/packages/e5/18/c18c32ecea41b6c0004e15606e274006366fe19436b6adccc1ae7b2e50c2/Brotli-1.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:70051525001750221daa10907c77830bc889cb6d865cc0b813d9db7fefc21451", size = 2906505 }, - { url = "https://files.pythonhosted.org/packages/08/c8/69ec0496b1ada7569b62d85893d928e865df29b90736558d6c98c2031208/Brotli-1.1.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7f4bf76817c14aa98cc6697ac02f3972cb8c3da93e9ef16b9c66573a68014f91", size = 2944152 }, - { url = "https://files.pythonhosted.org/packages/ab/fb/0517cea182219d6768113a38167ef6d4eb157a033178cc938033a552ed6d/Brotli-1.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d0c5516f0aed654134a2fc936325cc2e642f8a0e096d075209672eb321cff408", size = 2919252 }, - { url = "https://files.pythonhosted.org/packages/c7/53/73a3431662e33ae61a5c80b1b9d2d18f58dfa910ae8dd696e57d39f1a2f5/Brotli-1.1.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6c3020404e0b5eefd7c9485ccf8393cfb75ec38ce75586e046573c9dc29967a0", size = 2845955 }, - { url = "https://files.pythonhosted.org/packages/55/ac/bd280708d9c5ebdbf9de01459e625a3e3803cce0784f47d633562cf40e83/Brotli-1.1.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:4ed11165dd45ce798d99a136808a794a748d5dc38511303239d4e2363c0695dc", size = 2914304 }, - { url = "https://files.pythonhosted.org/packages/76/58/5c391b41ecfc4527d2cc3350719b02e87cb424ef8ba2023fb662f9bf743c/Brotli-1.1.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:4093c631e96fdd49e0377a9c167bfd75b6d0bad2ace734c6eb20b348bc3ea180", size = 2814452 }, - { url = "https://files.pythonhosted.org/packages/c7/4e/91b8256dfe99c407f174924b65a01f5305e303f486cc7a2e8a5d43c8bec3/Brotli-1.1.0-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:7e4c4629ddad63006efa0ef968c8e4751c5868ff0b1c5c40f76524e894c50248", size = 2938751 }, - { url = "https://files.pythonhosted.org/packages/5a/a6/e2a39a5d3b412938362bbbeba5af904092bf3f95b867b4a3eb856104074e/Brotli-1.1.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:861bf317735688269936f755fa136a99d1ed526883859f86e41a5d43c61d8966", size = 2933757 }, - { url = "https://files.pythonhosted.org/packages/13/f0/358354786280a509482e0e77c1a5459e439766597d280f28cb097642fc26/Brotli-1.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:87a3044c3a35055527ac75e419dfa9f4f3667a1e887ee80360589eb8c90aabb9", size = 2936146 }, - { url = "https://files.pythonhosted.org/packages/80/f7/daf538c1060d3a88266b80ecc1d1c98b79553b3f117a485653f17070ea2a/Brotli-1.1.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:c5529b34c1c9d937168297f2c1fde7ebe9ebdd5e121297ff9c043bdb2ae3d6fb", size = 2848055 }, - { url = "https://files.pythonhosted.org/packages/ad/cf/0eaa0585c4077d3c2d1edf322d8e97aabf317941d3a72d7b3ad8bce004b0/Brotli-1.1.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:ca63e1890ede90b2e4454f9a65135a4d387a4585ff8282bb72964fab893f2111", size = 3035102 }, - { url = "https://files.pythonhosted.org/packages/d8/63/1c1585b2aa554fe6dbce30f0c18bdbc877fa9a1bf5ff17677d9cca0ac122/Brotli-1.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e79e6520141d792237c70bcd7a3b122d00f2613769ae0cb61c52e89fd3443839", size = 2930029 }, - { url = "https://files.pythonhosted.org/packages/5f/3b/4e3fd1893eb3bbfef8e5a80d4508bec17a57bb92d586c85c12d28666bb13/Brotli-1.1.0-cp312-cp312-win32.whl", hash = "sha256:5f4d5ea15c9382135076d2fb28dde923352fe02951e66935a9efaac8f10e81b0", size = 333276 }, - { url = "https://files.pythonhosted.org/packages/3d/d5/942051b45a9e883b5b6e98c041698b1eb2012d25e5948c58d6bf85b1bb43/Brotli-1.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:906bc3a79de8c4ae5b86d3d75a8b77e44404b0f4261714306e3ad248d8ab0951", size = 357255 }, - { url = "https://files.pythonhosted.org/packages/0a/9f/fb37bb8ffc52a8da37b1c03c459a8cd55df7a57bdccd8831d500e994a0ca/Brotli-1.1.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8bf32b98b75c13ec7cf774164172683d6e7891088f6316e54425fde1efc276d5", size = 815681 }, - { url = "https://files.pythonhosted.org/packages/06/b3/dbd332a988586fefb0aa49c779f59f47cae76855c2d00f450364bb574cac/Brotli-1.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7bc37c4d6b87fb1017ea28c9508b36bbcb0c3d18b4260fcdf08b200c74a6aee8", size = 422475 }, - { url = "https://files.pythonhosted.org/packages/bb/80/6aaddc2f63dbcf2d93c2d204e49c11a9ec93a8c7c63261e2b4bd35198283/Brotli-1.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c0ef38c7a7014ffac184db9e04debe495d317cc9c6fb10071f7fefd93100a4f", size = 2906173 }, - { url = "https://files.pythonhosted.org/packages/ea/1d/e6ca79c96ff5b641df6097d299347507d39a9604bde8915e76bf026d6c77/Brotli-1.1.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91d7cc2a76b5567591d12c01f019dd7afce6ba8cba6571187e21e2fc418ae648", size = 2943803 }, - { url = "https://files.pythonhosted.org/packages/ac/a3/d98d2472e0130b7dd3acdbb7f390d478123dbf62b7d32bda5c830a96116d/Brotli-1.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a93dde851926f4f2678e704fadeb39e16c35d8baebd5252c9fd94ce8ce68c4a0", size = 2918946 }, - { url = "https://files.pythonhosted.org/packages/c4/a5/c69e6d272aee3e1423ed005d8915a7eaa0384c7de503da987f2d224d0721/Brotli-1.1.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f0db75f47be8b8abc8d9e31bc7aad0547ca26f24a54e6fd10231d623f183d089", size = 2845707 }, - { url = "https://files.pythonhosted.org/packages/58/9f/4149d38b52725afa39067350696c09526de0125ebfbaab5acc5af28b42ea/Brotli-1.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6967ced6730aed543b8673008b5a391c3b1076d834ca438bbd70635c73775368", size = 2936231 }, - { url = "https://files.pythonhosted.org/packages/5a/5a/145de884285611838a16bebfdb060c231c52b8f84dfbe52b852a15780386/Brotli-1.1.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:7eedaa5d036d9336c95915035fb57422054014ebdeb6f3b42eac809928e40d0c", size = 2848157 }, - { url = "https://files.pythonhosted.org/packages/50/ae/408b6bfb8525dadebd3b3dd5b19d631da4f7d46420321db44cd99dcf2f2c/Brotli-1.1.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:d487f5432bf35b60ed625d7e1b448e2dc855422e87469e3f450aa5552b0eb284", size = 3035122 }, - { url = "https://files.pythonhosted.org/packages/af/85/a94e5cfaa0ca449d8f91c3d6f78313ebf919a0dbd55a100c711c6e9655bc/Brotli-1.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:832436e59afb93e1836081a20f324cb185836c617659b07b129141a8426973c7", size = 2930206 }, - { url = "https://files.pythonhosted.org/packages/c2/f0/a61d9262cd01351df22e57ad7c34f66794709acab13f34be2675f45bf89d/Brotli-1.1.0-cp313-cp313-win32.whl", hash = "sha256:43395e90523f9c23a3d5bdf004733246fba087f2948f87ab28015f12359ca6a0", size = 333804 }, - { url = "https://files.pythonhosted.org/packages/7e/c1/ec214e9c94000d1c1974ec67ced1c970c148aa6b8d8373066123fc3dbf06/Brotli-1.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:9011560a466d2eb3f5a6e4929cf4a09be405c64154e12df0dd72713f6500e32b", size = 358517 }, -] - -[[package]] -name = "cairocffi" -version = "1.7.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "cffi" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/70/c5/1a4dc131459e68a173cbdab5fad6b524f53f9c1ef7861b7698e998b837cc/cairocffi-1.7.1.tar.gz", hash = "sha256:2e48ee864884ec4a3a34bfa8c9ab9999f688286eb714a15a43ec9d068c36557b", size = 88096 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/93/d8/ba13451aa6b745c49536e87b6bf8f629b950e84bd0e8308f7dc6883b67e2/cairocffi-1.7.1-py3-none-any.whl", hash = "sha256:9803a0e11f6c962f3b0ae2ec8ba6ae45e957a146a004697a1ac1bbf16b073b3f", size = 75611 }, -] - -[[package]] -name = "cairosvg" -version = "2.7.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "cairocffi" }, - { name = "cssselect2" }, - { name = "defusedxml" }, - { name = "pillow" }, - { name = "tinycss2" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/d5/e6/ec5900b724e3c44af7f6f51f719919137284e5da4aabe96508baec8a1b40/CairoSVG-2.7.1.tar.gz", hash = "sha256:432531d72347291b9a9ebfb6777026b607563fd8719c46ee742db0aef7271ba0", size = 8399085 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/01/a5/1866b42151f50453f1a0d28fc4c39f5be5f412a2e914f33449c42daafdf1/CairoSVG-2.7.1-py3-none-any.whl", hash = "sha256:8a5222d4e6c3f86f1f7046b63246877a63b49923a1cd202184c3a634ef546b3b", size = 43235 }, -] - -[[package]] -name = "certifi" -version = "2025.1.31" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/1c/ab/c9f1e32b7b1bf505bf26f0ef697775960db7932abeb7b516de930ba2705f/certifi-2025.1.31.tar.gz", hash = "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651", size = 167577 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/38/fc/bce832fd4fd99766c04d1ee0eead6b0ec6486fb100ae5e74c1d91292b982/certifi-2025.1.31-py3-none-any.whl", hash = "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe", size = 166393 }, -] - -[[package]] -name = "cffi" -version = "1.17.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "pycparser" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/fc/97/c783634659c2920c3fc70419e3af40972dbaf758daa229a7d6ea6135c90d/cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824", size = 516621 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/6b/f4/927e3a8899e52a27fa57a48607ff7dc91a9ebe97399b357b85a0c7892e00/cffi-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401", size = 182264 }, - { url = "https://files.pythonhosted.org/packages/6c/f5/6c3a8efe5f503175aaddcbea6ad0d2c96dad6f5abb205750d1b3df44ef29/cffi-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf", size = 178651 }, - { url = "https://files.pythonhosted.org/packages/94/dd/a3f0118e688d1b1a57553da23b16bdade96d2f9bcda4d32e7d2838047ff7/cffi-1.17.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4", size = 445259 }, - { url = "https://files.pythonhosted.org/packages/2e/ea/70ce63780f096e16ce8588efe039d3c4f91deb1dc01e9c73a287939c79a6/cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41", size = 469200 }, - { url = "https://files.pythonhosted.org/packages/1c/a0/a4fa9f4f781bda074c3ddd57a572b060fa0df7655d2a4247bbe277200146/cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1", size = 477235 }, - { url = "https://files.pythonhosted.org/packages/62/12/ce8710b5b8affbcdd5c6e367217c242524ad17a02fe5beec3ee339f69f85/cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6", size = 459721 }, - { url = "https://files.pythonhosted.org/packages/ff/6b/d45873c5e0242196f042d555526f92aa9e0c32355a1be1ff8c27f077fd37/cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d", size = 467242 }, - { url = "https://files.pythonhosted.org/packages/1a/52/d9a0e523a572fbccf2955f5abe883cfa8bcc570d7faeee06336fbd50c9fc/cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6", size = 477999 }, - { url = "https://files.pythonhosted.org/packages/44/74/f2a2460684a1a2d00ca799ad880d54652841a780c4c97b87754f660c7603/cffi-1.17.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f", size = 454242 }, - { url = "https://files.pythonhosted.org/packages/f8/4a/34599cac7dfcd888ff54e801afe06a19c17787dfd94495ab0c8d35fe99fb/cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b", size = 478604 }, - { url = "https://files.pythonhosted.org/packages/34/33/e1b8a1ba29025adbdcda5fb3a36f94c03d771c1b7b12f726ff7fef2ebe36/cffi-1.17.1-cp311-cp311-win32.whl", hash = "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655", size = 171727 }, - { url = "https://files.pythonhosted.org/packages/3d/97/50228be003bb2802627d28ec0627837ac0bf35c90cf769812056f235b2d1/cffi-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0", size = 181400 }, - { url = "https://files.pythonhosted.org/packages/5a/84/e94227139ee5fb4d600a7a4927f322e1d4aea6fdc50bd3fca8493caba23f/cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4", size = 183178 }, - { url = "https://files.pythonhosted.org/packages/da/ee/fb72c2b48656111c4ef27f0f91da355e130a923473bf5ee75c5643d00cca/cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c", size = 178840 }, - { url = "https://files.pythonhosted.org/packages/cc/b6/db007700f67d151abadf508cbfd6a1884f57eab90b1bb985c4c8c02b0f28/cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36", size = 454803 }, - { url = "https://files.pythonhosted.org/packages/1a/df/f8d151540d8c200eb1c6fba8cd0dfd40904f1b0682ea705c36e6c2e97ab3/cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5", size = 478850 }, - { url = "https://files.pythonhosted.org/packages/28/c0/b31116332a547fd2677ae5b78a2ef662dfc8023d67f41b2a83f7c2aa78b1/cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff", size = 485729 }, - { url = "https://files.pythonhosted.org/packages/91/2b/9a1ddfa5c7f13cab007a2c9cc295b70fbbda7cb10a286aa6810338e60ea1/cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99", size = 471256 }, - { url = "https://files.pythonhosted.org/packages/b2/d5/da47df7004cb17e4955df6a43d14b3b4ae77737dff8bf7f8f333196717bf/cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93", size = 479424 }, - { url = "https://files.pythonhosted.org/packages/0b/ac/2a28bcf513e93a219c8a4e8e125534f4f6db03e3179ba1c45e949b76212c/cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3", size = 484568 }, - { url = "https://files.pythonhosted.org/packages/d4/38/ca8a4f639065f14ae0f1d9751e70447a261f1a30fa7547a828ae08142465/cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8", size = 488736 }, - { url = "https://files.pythonhosted.org/packages/86/c5/28b2d6f799ec0bdecf44dced2ec5ed43e0eb63097b0f58c293583b406582/cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65", size = 172448 }, - { url = "https://files.pythonhosted.org/packages/50/b9/db34c4755a7bd1cb2d1603ac3863f22bcecbd1ba29e5ee841a4bc510b294/cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903", size = 181976 }, - { url = "https://files.pythonhosted.org/packages/8d/f8/dd6c246b148639254dad4d6803eb6a54e8c85c6e11ec9df2cffa87571dbe/cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e", size = 182989 }, - { url = "https://files.pythonhosted.org/packages/8b/f1/672d303ddf17c24fc83afd712316fda78dc6fce1cd53011b839483e1ecc8/cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2", size = 178802 }, - { url = "https://files.pythonhosted.org/packages/0e/2d/eab2e858a91fdff70533cab61dcff4a1f55ec60425832ddfdc9cd36bc8af/cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3", size = 454792 }, - { url = "https://files.pythonhosted.org/packages/75/b2/fbaec7c4455c604e29388d55599b99ebcc250a60050610fadde58932b7ee/cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683", size = 478893 }, - { url = "https://files.pythonhosted.org/packages/4f/b7/6e4a2162178bf1935c336d4da8a9352cccab4d3a5d7914065490f08c0690/cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5", size = 485810 }, - { url = "https://files.pythonhosted.org/packages/c7/8a/1d0e4a9c26e54746dc08c2c6c037889124d4f59dffd853a659fa545f1b40/cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4", size = 471200 }, - { url = "https://files.pythonhosted.org/packages/26/9f/1aab65a6c0db35f43c4d1b4f580e8df53914310afc10ae0397d29d697af4/cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd", size = 479447 }, - { url = "https://files.pythonhosted.org/packages/5f/e4/fb8b3dd8dc0e98edf1135ff067ae070bb32ef9d509d6cb0f538cd6f7483f/cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed", size = 484358 }, - { url = "https://files.pythonhosted.org/packages/f1/47/d7145bf2dc04684935d57d67dff9d6d795b2ba2796806bb109864be3a151/cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9", size = 488469 }, - { url = "https://files.pythonhosted.org/packages/bf/ee/f94057fa6426481d663b88637a9a10e859e492c73d0384514a17d78ee205/cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d", size = 172475 }, - { url = "https://files.pythonhosted.org/packages/7c/fc/6a8cb64e5f0324877d503c854da15d76c1e50eb722e320b15345c4d0c6de/cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a", size = 182009 }, -] - -[[package]] -name = "charset-normalizer" -version = "3.4.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/16/b0/572805e227f01586461c80e0fd25d65a2115599cc9dad142fee4b747c357/charset_normalizer-3.4.1.tar.gz", hash = "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3", size = 123188 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/72/80/41ef5d5a7935d2d3a773e3eaebf0a9350542f2cab4eac59a7a4741fbbbbe/charset_normalizer-3.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125", size = 194995 }, - { url = "https://files.pythonhosted.org/packages/7a/28/0b9fefa7b8b080ec492110af6d88aa3dea91c464b17d53474b6e9ba5d2c5/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1", size = 139471 }, - { url = "https://files.pythonhosted.org/packages/71/64/d24ab1a997efb06402e3fc07317e94da358e2585165930d9d59ad45fcae2/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3", size = 149831 }, - { url = "https://files.pythonhosted.org/packages/37/ed/be39e5258e198655240db5e19e0b11379163ad7070962d6b0c87ed2c4d39/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd", size = 142335 }, - { url = "https://files.pythonhosted.org/packages/88/83/489e9504711fa05d8dde1574996408026bdbdbd938f23be67deebb5eca92/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00", size = 143862 }, - { url = "https://files.pythonhosted.org/packages/c6/c7/32da20821cf387b759ad24627a9aca289d2822de929b8a41b6241767b461/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eea6ee1db730b3483adf394ea72f808b6e18cf3cb6454b4d86e04fa8c4327a12", size = 145673 }, - { url = "https://files.pythonhosted.org/packages/68/85/f4288e96039abdd5aeb5c546fa20a37b50da71b5cf01e75e87f16cd43304/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77", size = 140211 }, - { url = "https://files.pythonhosted.org/packages/28/a3/a42e70d03cbdabc18997baf4f0227c73591a08041c149e710045c281f97b/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4d86f7aff21ee58f26dcf5ae81a9addbd914115cdebcbb2217e4f0ed8982e146", size = 148039 }, - { url = "https://files.pythonhosted.org/packages/85/e4/65699e8ab3014ecbe6f5c71d1a55d810fb716bbfd74f6283d5c2aa87febf/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd", size = 151939 }, - { url = "https://files.pythonhosted.org/packages/b1/82/8e9fe624cc5374193de6860aba3ea8070f584c8565ee77c168ec13274bd2/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6", size = 149075 }, - { url = "https://files.pythonhosted.org/packages/3d/7b/82865ba54c765560c8433f65e8acb9217cb839a9e32b42af4aa8e945870f/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8", size = 144340 }, - { url = "https://files.pythonhosted.org/packages/b5/b6/9674a4b7d4d99a0d2df9b215da766ee682718f88055751e1e5e753c82db0/charset_normalizer-3.4.1-cp311-cp311-win32.whl", hash = "sha256:8417cb1f36cc0bc7eaba8ccb0e04d55f0ee52df06df3ad55259b9a323555fc8b", size = 95205 }, - { url = "https://files.pythonhosted.org/packages/1e/ab/45b180e175de4402dcf7547e4fb617283bae54ce35c27930a6f35b6bef15/charset_normalizer-3.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76", size = 102441 }, - { url = "https://files.pythonhosted.org/packages/0a/9a/dd1e1cdceb841925b7798369a09279bd1cf183cef0f9ddf15a3a6502ee45/charset_normalizer-3.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545", size = 196105 }, - { url = "https://files.pythonhosted.org/packages/d3/8c/90bfabf8c4809ecb648f39794cf2a84ff2e7d2a6cf159fe68d9a26160467/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7", size = 140404 }, - { url = "https://files.pythonhosted.org/packages/ad/8f/e410d57c721945ea3b4f1a04b74f70ce8fa800d393d72899f0a40526401f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757", size = 150423 }, - { url = "https://files.pythonhosted.org/packages/f0/b8/e6825e25deb691ff98cf5c9072ee0605dc2acfca98af70c2d1b1bc75190d/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa", size = 143184 }, - { url = "https://files.pythonhosted.org/packages/3e/a2/513f6cbe752421f16d969e32f3583762bfd583848b763913ddab8d9bfd4f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d", size = 145268 }, - { url = "https://files.pythonhosted.org/packages/74/94/8a5277664f27c3c438546f3eb53b33f5b19568eb7424736bdc440a88a31f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616", size = 147601 }, - { url = "https://files.pythonhosted.org/packages/7c/5f/6d352c51ee763623a98e31194823518e09bfa48be2a7e8383cf691bbb3d0/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b", size = 141098 }, - { url = "https://files.pythonhosted.org/packages/78/d4/f5704cb629ba5ab16d1d3d741396aec6dc3ca2b67757c45b0599bb010478/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d", size = 149520 }, - { url = "https://files.pythonhosted.org/packages/c5/96/64120b1d02b81785f222b976c0fb79a35875457fa9bb40827678e54d1bc8/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a", size = 152852 }, - { url = "https://files.pythonhosted.org/packages/84/c9/98e3732278a99f47d487fd3468bc60b882920cef29d1fa6ca460a1fdf4e6/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9", size = 150488 }, - { url = "https://files.pythonhosted.org/packages/13/0e/9c8d4cb99c98c1007cc11eda969ebfe837bbbd0acdb4736d228ccaabcd22/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1", size = 146192 }, - { url = "https://files.pythonhosted.org/packages/b2/21/2b6b5b860781a0b49427309cb8670785aa543fb2178de875b87b9cc97746/charset_normalizer-3.4.1-cp312-cp312-win32.whl", hash = "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35", size = 95550 }, - { url = "https://files.pythonhosted.org/packages/21/5b/1b390b03b1d16c7e382b561c5329f83cc06623916aab983e8ab9239c7d5c/charset_normalizer-3.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f", size = 102785 }, - { url = "https://files.pythonhosted.org/packages/38/94/ce8e6f63d18049672c76d07d119304e1e2d7c6098f0841b51c666e9f44a0/charset_normalizer-3.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda", size = 195698 }, - { url = "https://files.pythonhosted.org/packages/24/2e/dfdd9770664aae179a96561cc6952ff08f9a8cd09a908f259a9dfa063568/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313", size = 140162 }, - { url = "https://files.pythonhosted.org/packages/24/4e/f646b9093cff8fc86f2d60af2de4dc17c759de9d554f130b140ea4738ca6/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9", size = 150263 }, - { url = "https://files.pythonhosted.org/packages/5e/67/2937f8d548c3ef6e2f9aab0f6e21001056f692d43282b165e7c56023e6dd/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b", size = 142966 }, - { url = "https://files.pythonhosted.org/packages/52/ed/b7f4f07de100bdb95c1756d3a4d17b90c1a3c53715c1a476f8738058e0fa/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11", size = 144992 }, - { url = "https://files.pythonhosted.org/packages/96/2c/d49710a6dbcd3776265f4c923bb73ebe83933dfbaa841c5da850fe0fd20b/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f", size = 147162 }, - { url = "https://files.pythonhosted.org/packages/b4/41/35ff1f9a6bd380303dea55e44c4933b4cc3c4850988927d4082ada230273/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd", size = 140972 }, - { url = "https://files.pythonhosted.org/packages/fb/43/c6a0b685fe6910d08ba971f62cd9c3e862a85770395ba5d9cad4fede33ab/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2", size = 149095 }, - { url = "https://files.pythonhosted.org/packages/4c/ff/a9a504662452e2d2878512115638966e75633519ec11f25fca3d2049a94a/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886", size = 152668 }, - { url = "https://files.pythonhosted.org/packages/6c/71/189996b6d9a4b932564701628af5cee6716733e9165af1d5e1b285c530ed/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601", size = 150073 }, - { url = "https://files.pythonhosted.org/packages/e4/93/946a86ce20790e11312c87c75ba68d5f6ad2208cfb52b2d6a2c32840d922/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd", size = 145732 }, - { url = "https://files.pythonhosted.org/packages/cd/e5/131d2fb1b0dddafc37be4f3a2fa79aa4c037368be9423061dccadfd90091/charset_normalizer-3.4.1-cp313-cp313-win32.whl", hash = "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407", size = 95391 }, - { url = "https://files.pythonhosted.org/packages/27/f2/4f9a69cc7712b9b5ad8fdb87039fd89abba997ad5cbe690d1835d40405b0/charset_normalizer-3.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971", size = 102702 }, - { url = "https://files.pythonhosted.org/packages/0e/f6/65ecc6878a89bb1c23a086ea335ad4bf21a588990c3f535a227b9eea9108/charset_normalizer-3.4.1-py3-none-any.whl", hash = "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85", size = 49767 }, -] - -[[package]] -name = "click" -version = "8.1.8" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "colorama", marker = "sys_platform == 'win32'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/b9/2e/0090cbf739cee7d23781ad4b89a9894a41538e4fcf4c31dcdd705b78eb8b/click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a", size = 226593 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7e/d4/7ebdbd03970677812aac39c869717059dbb71a4cfc033ca6e5221787892c/click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2", size = 98188 }, -] - -[[package]] -name = "colorama" -version = "0.4.6" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335 }, -] - -[[package]] -name = "colorthief" -version = "0.2.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "pillow" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/b6/b2/b55b741f7a7d1299d23e1c635f00f6c57ea4d2e9b76d09e1fc5ea3ca9921/colorthief-0.2.1.tar.gz", hash = "sha256:079cb0c95bdd669c4643e2f7494de13b0b6029d5cdbe2d74d5d3c3386bd57221", size = 6164 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/56/18/be03b7058e65f9df479b14e7af4e73945ce311e07aaad45cf2536e14791a/colorthief-0.2.1-py2.py3-none-any.whl", hash = "sha256:b04fc8ce5cf9c888768745e29cb19b7b688d5711af6fba26e8057debabec56b9", size = 6134 }, -] - -[[package]] -name = "cssselect2" -version = "0.8.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "tinycss2" }, - { name = "webencodings" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/9f/86/fd7f58fc498b3166f3a7e8e0cddb6e620fe1da35b02248b1bd59e95dbaaa/cssselect2-0.8.0.tar.gz", hash = "sha256:7674ffb954a3b46162392aee2a3a0aedb2e14ecf99fcc28644900f4e6e3e9d3a", size = 35716 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/0f/e7/aa315e6a749d9b96c2504a1ba0ba031ba2d0517e972ce22682e3fccecb09/cssselect2-0.8.0-py3-none-any.whl", hash = "sha256:46fc70ebc41ced7a32cd42d58b1884d72ade23d21e5a4eaaf022401c13f0e76e", size = 15454 }, -] - -[[package]] -name = "defusedxml" -version = "0.7.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/0f/d5/c66da9b79e5bdb124974bfe172b4daf3c984ebd9c2a06e2b8a4dc7331c72/defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69", size = 75520 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61", size = 25604 }, -] - -[[package]] -name = "dill" -version = "0.3.9" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/70/43/86fe3f9e130c4137b0f1b50784dd70a5087b911fe07fa81e53e0c4c47fea/dill-0.3.9.tar.gz", hash = "sha256:81aa267dddf68cbfe8029c42ca9ec6a4ab3b22371d1c450abc54422577b4512c", size = 187000 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/46/d1/e73b6ad76f0b1fb7f23c35c6d95dbc506a9c8804f43dda8cb5b0fa6331fd/dill-0.3.9-py3-none-any.whl", hash = "sha256:468dff3b89520b474c0397703366b7b95eebe6303f108adf9b19da1f702be87a", size = 119418 }, -] - -[[package]] -name = "discord-py" -version = "2.5.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "aiohttp" }, - { name = "audioop-lts", marker = "python_full_version >= '3.13'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/7f/dd/5817c7af5e614e45cdf38cbf6c3f4597590c442822a648121a34dee7fa0f/discord_py-2.5.2.tar.gz", hash = "sha256:01cd362023bfea1a4a1d43f5280b5ef00cad2c7eba80098909f98bf28e578524", size = 1054879 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/57/a8/dc908a0fe4cd7e3950c9fa6906f7bf2e5d92d36b432f84897185e1b77138/discord_py-2.5.2-py3-none-any.whl", hash = "sha256:81f23a17c50509ffebe0668441cb80c139e74da5115305f70e27ce821361295a", size = 1155105 }, -] - -[[package]] -name = "distro" -version = "1.9.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/fc/f8/98eea607f65de6527f8a2e8885fc8015d3e6f5775df186e443e0964a11c3/distro-1.9.0.tar.gz", hash = "sha256:2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed", size = 60722 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/12/b3/231ffd4ab1fc9d679809f356cebee130ac7daa00d6d6f3206dd4fd137e9e/distro-1.9.0-py3-none-any.whl", hash = "sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2", size = 20277 }, -] - -[[package]] -name = "flask" -version = "3.1.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "blinker" }, - { name = "click" }, - { name = "itsdangerous" }, - { name = "jinja2" }, - { name = "werkzeug" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/89/50/dff6380f1c7f84135484e176e0cac8690af72fa90e932ad2a0a60e28c69b/flask-3.1.0.tar.gz", hash = "sha256:5f873c5184c897c8d9d1b05df1e3d01b14910ce69607a117bd3277098a5836ac", size = 680824 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/af/47/93213ee66ef8fae3b93b3e29206f6b251e65c97bd91d8e1c5596ef15af0a/flask-3.1.0-py3-none-any.whl", hash = "sha256:d667207822eb83f1c4b50949b1623c8fc8d51f2341d65f72e1a1815397551136", size = 102979 }, -] - -[[package]] -name = "frozenlist" -version = "1.5.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/8f/ed/0f4cec13a93c02c47ec32d81d11c0c1efbadf4a471e3f3ce7cad366cbbd3/frozenlist-1.5.0.tar.gz", hash = "sha256:81d5af29e61b9c8348e876d442253723928dce6433e0e76cd925cd83f1b4b817", size = 39930 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/79/43/0bed28bf5eb1c9e4301003b74453b8e7aa85fb293b31dde352aac528dafc/frozenlist-1.5.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:fd74520371c3c4175142d02a976aee0b4cb4a7cc912a60586ffd8d5929979b30", size = 94987 }, - { url = "https://files.pythonhosted.org/packages/bb/bf/b74e38f09a246e8abbe1e90eb65787ed745ccab6eaa58b9c9308e052323d/frozenlist-1.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2f3f7a0fbc219fb4455264cae4d9f01ad41ae6ee8524500f381de64ffaa077d5", size = 54584 }, - { url = "https://files.pythonhosted.org/packages/2c/31/ab01375682f14f7613a1ade30149f684c84f9b8823a4391ed950c8285656/frozenlist-1.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f47c9c9028f55a04ac254346e92977bf0f166c483c74b4232bee19a6697e4778", size = 52499 }, - { url = "https://files.pythonhosted.org/packages/98/a8/d0ac0b9276e1404f58fec3ab6e90a4f76b778a49373ccaf6a563f100dfbc/frozenlist-1.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0996c66760924da6e88922756d99b47512a71cfd45215f3570bf1e0b694c206a", size = 276357 }, - { url = "https://files.pythonhosted.org/packages/ad/c9/c7761084fa822f07dac38ac29f841d4587570dd211e2262544aa0b791d21/frozenlist-1.5.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a2fe128eb4edeabe11896cb6af88fca5346059f6c8d807e3b910069f39157869", size = 287516 }, - { url = "https://files.pythonhosted.org/packages/a1/ff/cd7479e703c39df7bdab431798cef89dc75010d8aa0ca2514c5b9321db27/frozenlist-1.5.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1a8ea951bbb6cacd492e3948b8da8c502a3f814f5d20935aae74b5df2b19cf3d", size = 283131 }, - { url = "https://files.pythonhosted.org/packages/59/a0/370941beb47d237eca4fbf27e4e91389fd68699e6f4b0ebcc95da463835b/frozenlist-1.5.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:de537c11e4aa01d37db0d403b57bd6f0546e71a82347a97c6a9f0dcc532b3a45", size = 261320 }, - { url = "https://files.pythonhosted.org/packages/b8/5f/c10123e8d64867bc9b4f2f510a32042a306ff5fcd7e2e09e5ae5100ee333/frozenlist-1.5.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c2623347b933fcb9095841f1cc5d4ff0b278addd743e0e966cb3d460278840d", size = 274877 }, - { url = "https://files.pythonhosted.org/packages/fa/79/38c505601ae29d4348f21706c5d89755ceded02a745016ba2f58bd5f1ea6/frozenlist-1.5.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cee6798eaf8b1416ef6909b06f7dc04b60755206bddc599f52232606e18179d3", size = 269592 }, - { url = "https://files.pythonhosted.org/packages/19/e2/39f3a53191b8204ba9f0bb574b926b73dd2efba2a2b9d2d730517e8f7622/frozenlist-1.5.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f5f9da7f5dbc00a604fe74aa02ae7c98bcede8a3b8b9666f9f86fc13993bc71a", size = 265934 }, - { url = "https://files.pythonhosted.org/packages/d5/c9/3075eb7f7f3a91f1a6b00284af4de0a65a9ae47084930916f5528144c9dd/frozenlist-1.5.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:90646abbc7a5d5c7c19461d2e3eeb76eb0b204919e6ece342feb6032c9325ae9", size = 283859 }, - { url = "https://files.pythonhosted.org/packages/05/f5/549f44d314c29408b962fa2b0e69a1a67c59379fb143b92a0a065ffd1f0f/frozenlist-1.5.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:bdac3c7d9b705d253b2ce370fde941836a5f8b3c5c2b8fd70940a3ea3af7f4f2", size = 287560 }, - { url = "https://files.pythonhosted.org/packages/9d/f8/cb09b3c24a3eac02c4c07a9558e11e9e244fb02bf62c85ac2106d1eb0c0b/frozenlist-1.5.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:03d33c2ddbc1816237a67f66336616416e2bbb6beb306e5f890f2eb22b959cdf", size = 277150 }, - { url = "https://files.pythonhosted.org/packages/37/48/38c2db3f54d1501e692d6fe058f45b6ad1b358d82cd19436efab80cfc965/frozenlist-1.5.0-cp311-cp311-win32.whl", hash = "sha256:237f6b23ee0f44066219dae14c70ae38a63f0440ce6750f868ee08775073f942", size = 45244 }, - { url = "https://files.pythonhosted.org/packages/ca/8c/2ddffeb8b60a4bce3b196c32fcc30d8830d4615e7b492ec2071da801b8ad/frozenlist-1.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:0cc974cc93d32c42e7b0f6cf242a6bd941c57c61b618e78b6c0a96cb72788c1d", size = 51634 }, - { url = "https://files.pythonhosted.org/packages/79/73/fa6d1a96ab7fd6e6d1c3500700963eab46813847f01ef0ccbaa726181dd5/frozenlist-1.5.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:31115ba75889723431aa9a4e77d5f398f5cf976eea3bdf61749731f62d4a4a21", size = 94026 }, - { url = "https://files.pythonhosted.org/packages/ab/04/ea8bf62c8868b8eada363f20ff1b647cf2e93377a7b284d36062d21d81d1/frozenlist-1.5.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7437601c4d89d070eac8323f121fcf25f88674627505334654fd027b091db09d", size = 54150 }, - { url = "https://files.pythonhosted.org/packages/d0/9a/8e479b482a6f2070b26bda572c5e6889bb3ba48977e81beea35b5ae13ece/frozenlist-1.5.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7948140d9f8ece1745be806f2bfdf390127cf1a763b925c4a805c603df5e697e", size = 51927 }, - { url = "https://files.pythonhosted.org/packages/e3/12/2aad87deb08a4e7ccfb33600871bbe8f0e08cb6d8224371387f3303654d7/frozenlist-1.5.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:feeb64bc9bcc6b45c6311c9e9b99406660a9c05ca8a5b30d14a78555088b0b3a", size = 282647 }, - { url = "https://files.pythonhosted.org/packages/77/f2/07f06b05d8a427ea0060a9cef6e63405ea9e0d761846b95ef3fb3be57111/frozenlist-1.5.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:683173d371daad49cffb8309779e886e59c2f369430ad28fe715f66d08d4ab1a", size = 289052 }, - { url = "https://files.pythonhosted.org/packages/bd/9f/8bf45a2f1cd4aa401acd271b077989c9267ae8463e7c8b1eb0d3f561b65e/frozenlist-1.5.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7d57d8f702221405a9d9b40f9da8ac2e4a1a8b5285aac6100f3393675f0a85ee", size = 291719 }, - { url = "https://files.pythonhosted.org/packages/41/d1/1f20fd05a6c42d3868709b7604c9f15538a29e4f734c694c6bcfc3d3b935/frozenlist-1.5.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:30c72000fbcc35b129cb09956836c7d7abf78ab5416595e4857d1cae8d6251a6", size = 267433 }, - { url = "https://files.pythonhosted.org/packages/af/f2/64b73a9bb86f5a89fb55450e97cd5c1f84a862d4ff90d9fd1a73ab0f64a5/frozenlist-1.5.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:000a77d6034fbad9b6bb880f7ec073027908f1b40254b5d6f26210d2dab1240e", size = 283591 }, - { url = "https://files.pythonhosted.org/packages/29/e2/ffbb1fae55a791fd6c2938dd9ea779509c977435ba3940b9f2e8dc9d5316/frozenlist-1.5.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5d7f5a50342475962eb18b740f3beecc685a15b52c91f7d975257e13e029eca9", size = 273249 }, - { url = "https://files.pythonhosted.org/packages/2e/6e/008136a30798bb63618a114b9321b5971172a5abddff44a100c7edc5ad4f/frozenlist-1.5.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:87f724d055eb4785d9be84e9ebf0f24e392ddfad00b3fe036e43f489fafc9039", size = 271075 }, - { url = "https://files.pythonhosted.org/packages/ae/f0/4e71e54a026b06724cec9b6c54f0b13a4e9e298cc8db0f82ec70e151f5ce/frozenlist-1.5.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:6e9080bb2fb195a046e5177f10d9d82b8a204c0736a97a153c2466127de87784", size = 285398 }, - { url = "https://files.pythonhosted.org/packages/4d/36/70ec246851478b1c0b59f11ef8ade9c482ff447c1363c2bd5fad45098b12/frozenlist-1.5.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9b93d7aaa36c966fa42efcaf716e6b3900438632a626fb09c049f6a2f09fc631", size = 294445 }, - { url = "https://files.pythonhosted.org/packages/37/e0/47f87544055b3349b633a03c4d94b405956cf2437f4ab46d0928b74b7526/frozenlist-1.5.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:52ef692a4bc60a6dd57f507429636c2af8b6046db8b31b18dac02cbc8f507f7f", size = 280569 }, - { url = "https://files.pythonhosted.org/packages/f9/7c/490133c160fb6b84ed374c266f42800e33b50c3bbab1652764e6e1fc498a/frozenlist-1.5.0-cp312-cp312-win32.whl", hash = "sha256:29d94c256679247b33a3dc96cce0f93cbc69c23bf75ff715919332fdbb6a32b8", size = 44721 }, - { url = "https://files.pythonhosted.org/packages/b1/56/4e45136ffc6bdbfa68c29ca56ef53783ef4c2fd395f7cbf99a2624aa9aaa/frozenlist-1.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:8969190d709e7c48ea386db202d708eb94bdb29207a1f269bab1196ce0dcca1f", size = 51329 }, - { url = "https://files.pythonhosted.org/packages/da/3b/915f0bca8a7ea04483622e84a9bd90033bab54bdf485479556c74fd5eaf5/frozenlist-1.5.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7a1a048f9215c90973402e26c01d1cff8a209e1f1b53f72b95c13db61b00f953", size = 91538 }, - { url = "https://files.pythonhosted.org/packages/c7/d1/a7c98aad7e44afe5306a2b068434a5830f1470675f0e715abb86eb15f15b/frozenlist-1.5.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:dd47a5181ce5fcb463b5d9e17ecfdb02b678cca31280639255ce9d0e5aa67af0", size = 52849 }, - { url = "https://files.pythonhosted.org/packages/3a/c8/76f23bf9ab15d5f760eb48701909645f686f9c64fbb8982674c241fbef14/frozenlist-1.5.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1431d60b36d15cda188ea222033eec8e0eab488f39a272461f2e6d9e1a8e63c2", size = 50583 }, - { url = "https://files.pythonhosted.org/packages/1f/22/462a3dd093d11df623179d7754a3b3269de3b42de2808cddef50ee0f4f48/frozenlist-1.5.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6482a5851f5d72767fbd0e507e80737f9c8646ae7fd303def99bfe813f76cf7f", size = 265636 }, - { url = "https://files.pythonhosted.org/packages/80/cf/e075e407fc2ae7328155a1cd7e22f932773c8073c1fc78016607d19cc3e5/frozenlist-1.5.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:44c49271a937625619e862baacbd037a7ef86dd1ee215afc298a417ff3270608", size = 270214 }, - { url = "https://files.pythonhosted.org/packages/a1/58/0642d061d5de779f39c50cbb00df49682832923f3d2ebfb0fedf02d05f7f/frozenlist-1.5.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:12f78f98c2f1c2429d42e6a485f433722b0061d5c0b0139efa64f396efb5886b", size = 273905 }, - { url = "https://files.pythonhosted.org/packages/ab/66/3fe0f5f8f2add5b4ab7aa4e199f767fd3b55da26e3ca4ce2cc36698e50c4/frozenlist-1.5.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ce3aa154c452d2467487765e3adc730a8c153af77ad84096bc19ce19a2400840", size = 250542 }, - { url = "https://files.pythonhosted.org/packages/f6/b8/260791bde9198c87a465224e0e2bb62c4e716f5d198fc3a1dacc4895dbd1/frozenlist-1.5.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9b7dc0c4338e6b8b091e8faf0db3168a37101943e687f373dce00959583f7439", size = 267026 }, - { url = "https://files.pythonhosted.org/packages/2e/a4/3d24f88c527f08f8d44ade24eaee83b2627793fa62fa07cbb7ff7a2f7d42/frozenlist-1.5.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:45e0896250900b5aa25180f9aec243e84e92ac84bd4a74d9ad4138ef3f5c97de", size = 257690 }, - { url = "https://files.pythonhosted.org/packages/de/9a/d311d660420b2beeff3459b6626f2ab4fb236d07afbdac034a4371fe696e/frozenlist-1.5.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:561eb1c9579d495fddb6da8959fd2a1fca2c6d060d4113f5844b433fc02f2641", size = 253893 }, - { url = "https://files.pythonhosted.org/packages/c6/23/e491aadc25b56eabd0f18c53bb19f3cdc6de30b2129ee0bc39cd387cd560/frozenlist-1.5.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:df6e2f325bfee1f49f81aaac97d2aa757c7646534a06f8f577ce184afe2f0a9e", size = 267006 }, - { url = "https://files.pythonhosted.org/packages/08/c4/ab918ce636a35fb974d13d666dcbe03969592aeca6c3ab3835acff01f79c/frozenlist-1.5.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:140228863501b44b809fb39ec56b5d4071f4d0aa6d216c19cbb08b8c5a7eadb9", size = 276157 }, - { url = "https://files.pythonhosted.org/packages/c0/29/3b7a0bbbbe5a34833ba26f686aabfe982924adbdcafdc294a7a129c31688/frozenlist-1.5.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7707a25d6a77f5d27ea7dc7d1fc608aa0a478193823f88511ef5e6b8a48f9d03", size = 264642 }, - { url = "https://files.pythonhosted.org/packages/ab/42/0595b3dbffc2e82d7fe658c12d5a5bafcd7516c6bf2d1d1feb5387caa9c1/frozenlist-1.5.0-cp313-cp313-win32.whl", hash = "sha256:31a9ac2b38ab9b5a8933b693db4939764ad3f299fcaa931a3e605bc3460e693c", size = 44914 }, - { url = "https://files.pythonhosted.org/packages/17/c4/b7db1206a3fea44bf3b838ca61deb6f74424a8a5db1dd53ecb21da669be6/frozenlist-1.5.0-cp313-cp313-win_amd64.whl", hash = "sha256:11aabdd62b8b9c4b84081a3c246506d1cddd2dd93ff0ad53ede5defec7886b28", size = 51167 }, - { url = "https://files.pythonhosted.org/packages/c6/c8/a5be5b7550c10858fcf9b0ea054baccab474da77d37f1e828ce043a3a5d4/frozenlist-1.5.0-py3-none-any.whl", hash = "sha256:d994863bba198a4a518b467bb971c56e1db3f180a25c6cf7bb1949c267f748c3", size = 11901 }, -] - -[[package]] -name = "ghp-import" -version = "2.1.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "python-dateutil" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/d9/29/d40217cbe2f6b1359e00c6c307bb3fc876ba74068cbab3dde77f03ca0dc4/ghp-import-2.1.0.tar.gz", hash = "sha256:9c535c4c61193c2df8871222567d7fd7e5014d835f97dc7b7439069e2413d343", size = 10943 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl", hash = "sha256:8337dd7b50877f163d4c0289bc1f1c7f127550241988d568c1db512c4324a619", size = 11034 }, -] - -[[package]] -name = "gitdb" -version = "4.0.12" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "smmap" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/72/94/63b0fc47eb32792c7ba1fe1b694daec9a63620db1e313033d18140c2320a/gitdb-4.0.12.tar.gz", hash = "sha256:5ef71f855d191a3326fcfbc0d5da835f26b13fbcba60c32c21091c349ffdb571", size = 394684 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a0/61/5c78b91c3143ed5c14207f463aecfc8f9dbb5092fb2869baf37c273b2705/gitdb-4.0.12-py3-none-any.whl", hash = "sha256:67073e15955400952c6565cc3e707c554a4eea2e428946f7a4c162fab9bd9bcf", size = 62794 }, -] - -[[package]] -name = "gitpython" -version = "3.1.44" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "gitdb" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/c0/89/37df0b71473153574a5cdef8f242de422a0f5d26d7a9e231e6f169b4ad14/gitpython-3.1.44.tar.gz", hash = "sha256:c87e30b26253bf5418b01b0660f818967f3c503193838337fe5e573331249269", size = 214196 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/1d/9a/4114a9057db2f1462d5c8f8390ab7383925fe1ac012eaa42402ad65c2963/GitPython-3.1.44-py3-none-any.whl", hash = "sha256:9e0e10cda9bed1ee64bc9a6de50e7e38a9c9943241cd7f585f6df3ed28011110", size = 207599 }, -] - -[[package]] -name = "griffe" -version = "1.7.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "colorama" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/30/1b/fe7a3a33a2fb7ad7807f71957e6108a50d93271ab718d9a56080415f66de/griffe-1.7.1.tar.gz", hash = "sha256:464730d0e95d0afd038e699a5f7276d7438d0712db0c489a17e761f70e011507", size = 394522 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/1d/94/48e28b1c7402f750200e9e3ef4834c862ea85c64f426a231a6dc312f61a9/griffe-1.7.1-py3-none-any.whl", hash = "sha256:37a7f15233937d723ddc969fa4117fdd03988885c16938dc43bccdfe8fa4d02d", size = 129134 }, -] - -[[package]] -name = "idna" -version = "3.10" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442 }, -] - -[[package]] -name = "importlib-metadata" -version = "8.5.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "zipp" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/cd/12/33e59336dca5be0c398a7482335911a33aa0e20776128f038019f1a95f1b/importlib_metadata-8.5.0.tar.gz", hash = "sha256:71522656f0abace1d072b9e5481a48f07c138e00f079c38c8f883823f9c26bd7", size = 55304 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a0/d9/a1e041c5e7caa9a05c925f4bdbdfb7f006d1f74996af53467bc394c97be7/importlib_metadata-8.5.0-py3-none-any.whl", hash = "sha256:45e54197d28b7a7f1559e60b95e7c567032b602131fbd588f1497f47880aa68b", size = 26514 }, -] - -[[package]] -name = "isort" -version = "6.0.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b8/21/1e2a441f74a653a144224d7d21afe8f4169e6c7c20bb13aec3a2dc3815e0/isort-6.0.1.tar.gz", hash = "sha256:1cb5df28dfbc742e490c5e41bad6da41b805b0a8be7bc93cd0fb2a8a890ac450", size = 821955 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c1/11/114d0a5f4dabbdcedc1125dee0888514c3c3b16d3e9facad87ed96fad97c/isort-6.0.1-py3-none-any.whl", hash = "sha256:2dc5d7f65c9678d94c88dfc29161a320eec67328bc97aad576874cb4be1e9615", size = 94186 }, -] - -[[package]] -name = "itsdangerous" -version = "2.2.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/9c/cb/8ac0172223afbccb63986cc25049b154ecfb5e85932587206f42317be31d/itsdangerous-2.2.0.tar.gz", hash = "sha256:e0050c0b7da1eea53ffaf149c0cfbb5c6e2e2b69c4bef22c81fa6eb73e5f6173", size = 54410 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/04/96/92447566d16df59b2a776c0fb82dbc4d9e07cd95062562af01e408583fc4/itsdangerous-2.2.0-py3-none-any.whl", hash = "sha256:c6242fc49e35958c8b15141343aa660db5fc54d4f13a1db01a3f5891b98700ef", size = 16234 }, -] - -[[package]] -name = "jinja2" -version = "3.1.6" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "markupsafe" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899 }, -] - -[[package]] -name = "markdown" -version = "3.7" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/54/28/3af612670f82f4c056911fbbbb42760255801b3068c48de792d354ff4472/markdown-3.7.tar.gz", hash = "sha256:2ae2471477cfd02dbbf038d5d9bc226d40def84b4fe2986e49b59b6b472bbed2", size = 357086 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/3f/08/83871f3c50fc983b88547c196d11cf8c3340e37c32d2e9d6152abe2c61f7/Markdown-3.7-py3-none-any.whl", hash = "sha256:7eb6df5690b81a1d7942992c97fad2938e956e79df20cbc6186e9c3a77b1c803", size = 106349 }, -] - -[[package]] -name = "markdown-it-py" -version = "3.0.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "mdurl" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/38/71/3b932df36c1a044d397a1f92d1cf91ee0a503d91e470cbd670aa66b07ed0/markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb", size = 74596 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", size = 87528 }, -] - -[[package]] -name = "markdownify" -version = "1.1.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "beautifulsoup4" }, - { name = "six" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/2f/78/c48fed23c7aebc2c16049062e72de1da3220c274de59d28c942acdc9ffb2/markdownify-1.1.0.tar.gz", hash = "sha256:449c0bbbf1401c5112379619524f33b63490a8fa479456d41de9dc9e37560ebd", size = 17127 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/64/11/b751af7ad41b254a802cf52f7bc1fca7cabe2388132f2ce60a1a6b9b9622/markdownify-1.1.0-py3-none-any.whl", hash = "sha256:32a5a08e9af02c8a6528942224c91b933b4bd2c7d078f9012943776fc313eeef", size = 13901 }, -] - -[[package]] -name = "markupsafe" -version = "3.0.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b2/97/5d42485e71dfc078108a86d6de8fa46db44a1a9295e89c5d6d4a06e23a62/markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0", size = 20537 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/6b/28/bbf83e3f76936960b850435576dd5e67034e200469571be53f69174a2dfd/MarkupSafe-3.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d", size = 14353 }, - { url = "https://files.pythonhosted.org/packages/6c/30/316d194b093cde57d448a4c3209f22e3046c5bb2fb0820b118292b334be7/MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93", size = 12392 }, - { url = "https://files.pythonhosted.org/packages/f2/96/9cdafba8445d3a53cae530aaf83c38ec64c4d5427d975c974084af5bc5d2/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832", size = 23984 }, - { url = "https://files.pythonhosted.org/packages/f1/a4/aefb044a2cd8d7334c8a47d3fb2c9f328ac48cb349468cc31c20b539305f/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84", size = 23120 }, - { url = "https://files.pythonhosted.org/packages/8d/21/5e4851379f88f3fad1de30361db501300d4f07bcad047d3cb0449fc51f8c/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca", size = 23032 }, - { url = "https://files.pythonhosted.org/packages/00/7b/e92c64e079b2d0d7ddf69899c98842f3f9a60a1ae72657c89ce2655c999d/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798", size = 24057 }, - { url = "https://files.pythonhosted.org/packages/f9/ac/46f960ca323037caa0a10662ef97d0a4728e890334fc156b9f9e52bcc4ca/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e", size = 23359 }, - { url = "https://files.pythonhosted.org/packages/69/84/83439e16197337b8b14b6a5b9c2105fff81d42c2a7c5b58ac7b62ee2c3b1/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4", size = 23306 }, - { url = "https://files.pythonhosted.org/packages/9a/34/a15aa69f01e2181ed8d2b685c0d2f6655d5cca2c4db0ddea775e631918cd/MarkupSafe-3.0.2-cp311-cp311-win32.whl", hash = "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d", size = 15094 }, - { url = "https://files.pythonhosted.org/packages/da/b8/3a3bd761922d416f3dc5d00bfbed11f66b1ab89a0c2b6e887240a30b0f6b/MarkupSafe-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b", size = 15521 }, - { url = "https://files.pythonhosted.org/packages/22/09/d1f21434c97fc42f09d290cbb6350d44eb12f09cc62c9476effdb33a18aa/MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf", size = 14274 }, - { url = "https://files.pythonhosted.org/packages/6b/b0/18f76bba336fa5aecf79d45dcd6c806c280ec44538b3c13671d49099fdd0/MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225", size = 12348 }, - { url = "https://files.pythonhosted.org/packages/e0/25/dd5c0f6ac1311e9b40f4af06c78efde0f3b5cbf02502f8ef9501294c425b/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028", size = 24149 }, - { url = "https://files.pythonhosted.org/packages/f3/f0/89e7aadfb3749d0f52234a0c8c7867877876e0a20b60e2188e9850794c17/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8", size = 23118 }, - { url = "https://files.pythonhosted.org/packages/d5/da/f2eeb64c723f5e3777bc081da884b414671982008c47dcc1873d81f625b6/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c", size = 22993 }, - { url = "https://files.pythonhosted.org/packages/da/0e/1f32af846df486dce7c227fe0f2398dc7e2e51d4a370508281f3c1c5cddc/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557", size = 24178 }, - { url = "https://files.pythonhosted.org/packages/c4/f6/bb3ca0532de8086cbff5f06d137064c8410d10779c4c127e0e47d17c0b71/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22", size = 23319 }, - { url = "https://files.pythonhosted.org/packages/a2/82/8be4c96ffee03c5b4a034e60a31294daf481e12c7c43ab8e34a1453ee48b/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48", size = 23352 }, - { url = "https://files.pythonhosted.org/packages/51/ae/97827349d3fcffee7e184bdf7f41cd6b88d9919c80f0263ba7acd1bbcb18/MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30", size = 15097 }, - { url = "https://files.pythonhosted.org/packages/c1/80/a61f99dc3a936413c3ee4e1eecac96c0da5ed07ad56fd975f1a9da5bc630/MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87", size = 15601 }, - { url = "https://files.pythonhosted.org/packages/83/0e/67eb10a7ecc77a0c2bbe2b0235765b98d164d81600746914bebada795e97/MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd", size = 14274 }, - { url = "https://files.pythonhosted.org/packages/2b/6d/9409f3684d3335375d04e5f05744dfe7e9f120062c9857df4ab490a1031a/MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430", size = 12352 }, - { url = "https://files.pythonhosted.org/packages/d2/f5/6eadfcd3885ea85fe2a7c128315cc1bb7241e1987443d78c8fe712d03091/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094", size = 24122 }, - { url = "https://files.pythonhosted.org/packages/0c/91/96cf928db8236f1bfab6ce15ad070dfdd02ed88261c2afafd4b43575e9e9/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396", size = 23085 }, - { url = "https://files.pythonhosted.org/packages/c2/cf/c9d56af24d56ea04daae7ac0940232d31d5a8354f2b457c6d856b2057d69/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79", size = 22978 }, - { url = "https://files.pythonhosted.org/packages/2a/9f/8619835cd6a711d6272d62abb78c033bda638fdc54c4e7f4272cf1c0962b/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a", size = 24208 }, - { url = "https://files.pythonhosted.org/packages/f9/bf/176950a1792b2cd2102b8ffeb5133e1ed984547b75db47c25a67d3359f77/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca", size = 23357 }, - { url = "https://files.pythonhosted.org/packages/ce/4f/9a02c1d335caabe5c4efb90e1b6e8ee944aa245c1aaaab8e8a618987d816/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c", size = 23344 }, - { url = "https://files.pythonhosted.org/packages/ee/55/c271b57db36f748f0e04a759ace9f8f759ccf22b4960c270c78a394f58be/MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1", size = 15101 }, - { url = "https://files.pythonhosted.org/packages/29/88/07df22d2dd4df40aba9f3e402e6dc1b8ee86297dddbad4872bd5e7b0094f/MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f", size = 15603 }, - { url = "https://files.pythonhosted.org/packages/62/6a/8b89d24db2d32d433dffcd6a8779159da109842434f1dd2f6e71f32f738c/MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c", size = 14510 }, - { url = "https://files.pythonhosted.org/packages/7a/06/a10f955f70a2e5a9bf78d11a161029d278eeacbd35ef806c3fd17b13060d/MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb", size = 12486 }, - { url = "https://files.pythonhosted.org/packages/34/cf/65d4a571869a1a9078198ca28f39fba5fbb910f952f9dbc5220afff9f5e6/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c", size = 25480 }, - { url = "https://files.pythonhosted.org/packages/0c/e3/90e9651924c430b885468b56b3d597cabf6d72be4b24a0acd1fa0e12af67/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d", size = 23914 }, - { url = "https://files.pythonhosted.org/packages/66/8c/6c7cf61f95d63bb866db39085150df1f2a5bd3335298f14a66b48e92659c/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe", size = 23796 }, - { url = "https://files.pythonhosted.org/packages/bb/35/cbe9238ec3f47ac9a7c8b3df7a808e7cb50fe149dc7039f5f454b3fba218/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5", size = 25473 }, - { url = "https://files.pythonhosted.org/packages/e6/32/7621a4382488aa283cc05e8984a9c219abad3bca087be9ec77e89939ded9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a", size = 24114 }, - { url = "https://files.pythonhosted.org/packages/0d/80/0985960e4b89922cb5a0bac0ed39c5b96cbc1a536a99f30e8c220a996ed9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9", size = 24098 }, - { url = "https://files.pythonhosted.org/packages/82/78/fedb03c7d5380df2427038ec8d973587e90561b2d90cd472ce9254cf348b/MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6", size = 15208 }, - { url = "https://files.pythonhosted.org/packages/4f/65/6079a46068dfceaeabb5dcad6d674f5f5c61a6fa5673746f42a9f4c233b3/MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f", size = 15739 }, -] - -[[package]] -name = "mccabe" -version = "0.7.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e7/ff/0ffefdcac38932a54d2b5eed4e0ba8a408f215002cd178ad1df0f2806ff8/mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325", size = 9658 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/27/1a/1f68f9ba0c207934b35b86a8ca3aad8395a3d6dd7921c0686e23853ff5a9/mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e", size = 7350 }, -] - -[[package]] -name = "mdurl" -version = "0.1.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979 }, -] - -[[package]] -name = "mergedeep" -version = "1.3.4" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/3a/41/580bb4006e3ed0361b8151a01d324fb03f420815446c7def45d02f74c270/mergedeep-1.3.4.tar.gz", hash = "sha256:0096d52e9dad9939c3d975a774666af186eda617e6ca84df4c94dec30004f2a8", size = 4661 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/2c/19/04f9b178c2d8a15b076c8b5140708fa6ffc5601fb6f1e975537072df5b2a/mergedeep-1.3.4-py3-none-any.whl", hash = "sha256:70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307", size = 6354 }, -] - -[[package]] -name = "mkdocs" -version = "1.6.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "click" }, - { name = "colorama", marker = "sys_platform == 'win32'" }, - { name = "ghp-import" }, - { name = "jinja2" }, - { name = "markdown" }, - { name = "markupsafe" }, - { name = "mergedeep" }, - { name = "mkdocs-get-deps" }, - { name = "packaging" }, - { name = "pathspec" }, - { name = "pyyaml" }, - { name = "pyyaml-env-tag" }, - { name = "watchdog" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/bc/c6/bbd4f061bd16b378247f12953ffcb04786a618ce5e904b8c5a01a0309061/mkdocs-1.6.1.tar.gz", hash = "sha256:7b432f01d928c084353ab39c57282f29f92136665bdd6abf7c1ec8d822ef86f2", size = 3889159 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/22/5b/dbc6a8cddc9cfa9c4971d59fb12bb8d42e161b7e7f8cc89e49137c5b279c/mkdocs-1.6.1-py3-none-any.whl", hash = "sha256:db91759624d1647f3f34aa0c3f327dd2601beae39a366d6e064c03468d35c20e", size = 3864451 }, -] - -[[package]] -name = "mkdocs-autorefs" -version = "1.4.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "markdown" }, - { name = "markupsafe" }, - { name = "mkdocs" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/c2/44/140469d87379c02f1e1870315f3143718036a983dd0416650827b8883192/mkdocs_autorefs-1.4.1.tar.gz", hash = "sha256:4b5b6235a4becb2b10425c2fa191737e415b37aa3418919db33e5d774c9db079", size = 4131355 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f8/29/1125f7b11db63e8e32bcfa0752a4eea30abff3ebd0796f808e14571ddaa2/mkdocs_autorefs-1.4.1-py3-none-any.whl", hash = "sha256:9793c5ac06a6ebbe52ec0f8439256e66187badf4b5334b5fde0b128ec134df4f", size = 5782047 }, -] - -[[package]] -name = "mkdocs-get-deps" -version = "0.2.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "mergedeep" }, - { name = "platformdirs" }, - { name = "pyyaml" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/98/f5/ed29cd50067784976f25ed0ed6fcd3c2ce9eb90650aa3b2796ddf7b6870b/mkdocs_get_deps-0.2.0.tar.gz", hash = "sha256:162b3d129c7fad9b19abfdcb9c1458a651628e4b1dea628ac68790fb3061c60c", size = 10239 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/9f/d4/029f984e8d3f3b6b726bd33cafc473b75e9e44c0f7e80a5b29abc466bdea/mkdocs_get_deps-0.2.0-py3-none-any.whl", hash = "sha256:2bf11d0b133e77a0dd036abeeb06dec8775e46efa526dc70667d8863eefc6134", size = 9521 }, -] - -[[package]] -name = "mkdocs-git-authors-plugin" -version = "0.9.4" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "mkdocs" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/87/9a/063c4a3688e4669eb2054e4bf6e9cc582f6c1d85674e3f5b836ceff97c3b/mkdocs_git_authors_plugin-0.9.4.tar.gz", hash = "sha256:f5cfaf93d08981ce25591bbaf642051ed168c3886bb96ecd2dca53f0ef1973b8", size = 21914 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/5c/ac/2b5bae4047276fda2bdd14a6d4af59288fb4d5de54151ae4e6ba17611ceb/mkdocs_git_authors_plugin-0.9.4-py3-none-any.whl", hash = "sha256:84b9b56c703841189c64d8ff6947034fe0a9c14a0a8f1f6255edfcfe3a56825f", size = 20752 }, -] - -[[package]] -name = "mkdocs-git-revision-date-localized-plugin" -version = "1.4.5" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "babel" }, - { name = "gitpython" }, - { name = "mkdocs" }, - { name = "pytz" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/3c/93/3987505121a9b596b05c8a38054b587cfe0d78a1a3e92144204f2c45722b/mkdocs_git_revision_date_localized_plugin-1.4.5.tar.gz", hash = "sha256:9e37f1343d314c9cd8f9cbbf117c4bdc1d2d24a0653c5bbd7059d072f2cd0972", size = 450263 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/da/c0/b63cb3008564242a3d1ba7a6dd6dc29d7fb297e65bda93cef655780757af/mkdocs_git_revision_date_localized_plugin-1.4.5-py3-none-any.whl", hash = "sha256:395ae0b9eec565c78a76fffc938b70f52774bf2971245482d31aba47018c5fa9", size = 25284 }, -] - -[[package]] -name = "mkdocs-material" -version = "9.6.10" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "babel" }, - { name = "backrefs" }, - { name = "colorama" }, - { name = "jinja2" }, - { name = "markdown" }, - { name = "mkdocs" }, - { name = "mkdocs-material-extensions" }, - { name = "paginate" }, - { name = "pygments" }, - { name = "pymdown-extensions" }, - { name = "requests" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/e6/fc/f42c09e3fe13d48193edf22a63484186b0be67a73fc006eab389bf47d66f/mkdocs_material-9.6.10.tar.gz", hash = "sha256:25a453c1f24f34fcf1f53680c03d2c1421b52ce5247f4468153c87a70cd5f1fc", size = 3951725 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e4/2f/e210215a3c2918739096ff7bf71a3cf32b7d8d1dfd5ceff8a82e2741dc16/mkdocs_material-9.6.10-py3-none-any.whl", hash = "sha256:36168548df4e2ddeb9a334ddae4ab9c388ccfea4dd50ffee657d22b93dcb1c3e", size = 8703722 }, -] - -[package.optional-dependencies] -imaging = [ - { name = "cairosvg" }, - { name = "pillow" }, -] - -[[package]] -name = "mkdocs-material-extensions" -version = "1.3.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/79/9b/9b4c96d6593b2a541e1cb8b34899a6d021d208bb357042823d4d2cabdbe7/mkdocs_material_extensions-1.3.1.tar.gz", hash = "sha256:10c9511cea88f568257f960358a467d12b970e1f7b2c0e5fb2bb48cab1928443", size = 11847 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/5b/54/662a4743aa81d9582ee9339d4ffa3c8fd40a4965e033d77b9da9774d3960/mkdocs_material_extensions-1.3.1-py3-none-any.whl", hash = "sha256:adff8b62700b25cb77b53358dad940f3ef973dd6db797907c49e3c2ef3ab4e31", size = 8728 }, -] - -[[package]] -name = "mkdocs-redirects" -version = "1.2.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "mkdocs" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/f1/a8/6d44a6cf07e969c7420cb36ab287b0669da636a2044de38a7d2208d5a758/mkdocs_redirects-1.2.2.tar.gz", hash = "sha256:3094981b42ffab29313c2c1b8ac3969861109f58b2dd58c45fc81cd44bfa0095", size = 7162 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c4/ec/38443b1f2a3821bbcb24e46cd8ba979154417794d54baf949fefde1c2146/mkdocs_redirects-1.2.2-py3-none-any.whl", hash = "sha256:7dbfa5647b79a3589da4401403d69494bd1f4ad03b9c15136720367e1f340ed5", size = 6142 }, -] - -[[package]] -name = "mkdocstrings" -version = "0.29.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "jinja2" }, - { name = "markdown" }, - { name = "markupsafe" }, - { name = "mkdocs" }, - { name = "mkdocs-autorefs" }, - { name = "pymdown-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/8e/4d/a9484dc5d926295bdf308f1f6c4f07fcc99735b970591edc414d401fcc91/mkdocstrings-0.29.0.tar.gz", hash = "sha256:3657be1384543ce0ee82112c3e521bbf48e41303aa0c229b9ffcccba057d922e", size = 1212185 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/15/47/eb876dfd84e48f31ff60897d161b309cf6a04ca270155b0662aae562b3fb/mkdocstrings-0.29.0-py3-none-any.whl", hash = "sha256:8ea98358d2006f60befa940fdebbbc88a26b37ecbcded10be726ba359284f73d", size = 1630824 }, -] - -[package.optional-dependencies] -python = [ - { name = "mkdocstrings-python" }, -] - -[[package]] -name = "mkdocstrings-python" -version = "1.16.8" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "griffe" }, - { name = "mkdocs-autorefs" }, - { name = "mkdocstrings" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/8e/b8/62190ea298fdb1e84670ef548590748c633ab4e05b35bcf902e89f2f28c6/mkdocstrings_python-1.16.8.tar.gz", hash = "sha256:9453ccae69be103810c1cf6435ce71c8f714ae37fef4d87d16aa92a7c800fe1d", size = 205119 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/67/d0/ef6e82f7a68c7ac02e1a01815fbe88773f4f9e40728ed35bd1664a5d76f2/mkdocstrings_python-1.16.8-py3-none-any.whl", hash = "sha256:211b7aaf776cd45578ecb531e5ad0d3a35a8be9101a6bfa10de38a69af9d8fd8", size = 124116 }, -] - -[[package]] -name = "multidict" -version = "6.1.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d6/be/504b89a5e9ca731cd47487e91c469064f8ae5af93b7259758dcfc2b9c848/multidict-6.1.0.tar.gz", hash = "sha256:22ae2ebf9b0c69d206c003e2f6a914ea33f0a932d4aa16f236afc049d9958f4a", size = 64002 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/93/13/df3505a46d0cd08428e4c8169a196131d1b0c4b515c3649829258843dde6/multidict-6.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3efe2c2cb5763f2f1b275ad2bf7a287d3f7ebbef35648a9726e3b69284a4f3d6", size = 48570 }, - { url = "https://files.pythonhosted.org/packages/f0/e1/a215908bfae1343cdb72f805366592bdd60487b4232d039c437fe8f5013d/multidict-6.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c7053d3b0353a8b9de430a4f4b4268ac9a4fb3481af37dfe49825bf45ca24156", size = 29316 }, - { url = "https://files.pythonhosted.org/packages/70/0f/6dc70ddf5d442702ed74f298d69977f904960b82368532c88e854b79f72b/multidict-6.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:27e5fc84ccef8dfaabb09d82b7d179c7cf1a3fbc8a966f8274fcb4ab2eb4cadb", size = 29640 }, - { url = "https://files.pythonhosted.org/packages/d8/6d/9c87b73a13d1cdea30b321ef4b3824449866bd7f7127eceed066ccb9b9ff/multidict-6.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e2b90b43e696f25c62656389d32236e049568b39320e2735d51f08fd362761b", size = 131067 }, - { url = "https://files.pythonhosted.org/packages/cc/1e/1b34154fef373371fd6c65125b3d42ff5f56c7ccc6bfff91b9b3c60ae9e0/multidict-6.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d83a047959d38a7ff552ff94be767b7fd79b831ad1cd9920662db05fec24fe72", size = 138507 }, - { url = "https://files.pythonhosted.org/packages/fb/e0/0bc6b2bac6e461822b5f575eae85da6aae76d0e2a79b6665d6206b8e2e48/multidict-6.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d1a9dd711d0877a1ece3d2e4fea11a8e75741ca21954c919406b44e7cf971304", size = 133905 }, - { url = "https://files.pythonhosted.org/packages/ba/af/73d13b918071ff9b2205fcf773d316e0f8fefb4ec65354bbcf0b10908cc6/multidict-6.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec2abea24d98246b94913b76a125e855eb5c434f7c46546046372fe60f666351", size = 129004 }, - { url = "https://files.pythonhosted.org/packages/74/21/23960627b00ed39643302d81bcda44c9444ebcdc04ee5bedd0757513f259/multidict-6.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4867cafcbc6585e4b678876c489b9273b13e9fff9f6d6d66add5e15d11d926cb", size = 121308 }, - { url = "https://files.pythonhosted.org/packages/8b/5c/cf282263ffce4a596ed0bb2aa1a1dddfe1996d6a62d08842a8d4b33dca13/multidict-6.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:5b48204e8d955c47c55b72779802b219a39acc3ee3d0116d5080c388970b76e3", size = 132608 }, - { url = "https://files.pythonhosted.org/packages/d7/3e/97e778c041c72063f42b290888daff008d3ab1427f5b09b714f5a8eff294/multidict-6.1.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:d8fff389528cad1618fb4b26b95550327495462cd745d879a8c7c2115248e399", size = 127029 }, - { url = "https://files.pythonhosted.org/packages/47/ac/3efb7bfe2f3aefcf8d103e9a7162572f01936155ab2f7ebcc7c255a23212/multidict-6.1.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:a7a9541cd308eed5e30318430a9c74d2132e9a8cb46b901326272d780bf2d423", size = 137594 }, - { url = "https://files.pythonhosted.org/packages/42/9b/6c6e9e8dc4f915fc90a9b7798c44a30773dea2995fdcb619870e705afe2b/multidict-6.1.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:da1758c76f50c39a2efd5e9859ce7d776317eb1dd34317c8152ac9251fc574a3", size = 134556 }, - { url = "https://files.pythonhosted.org/packages/1d/10/8e881743b26aaf718379a14ac58572a240e8293a1c9d68e1418fb11c0f90/multidict-6.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c943a53e9186688b45b323602298ab727d8865d8c9ee0b17f8d62d14b56f0753", size = 130993 }, - { url = "https://files.pythonhosted.org/packages/45/84/3eb91b4b557442802d058a7579e864b329968c8d0ea57d907e7023c677f2/multidict-6.1.0-cp311-cp311-win32.whl", hash = "sha256:90f8717cb649eea3504091e640a1b8568faad18bd4b9fcd692853a04475a4b80", size = 26405 }, - { url = "https://files.pythonhosted.org/packages/9f/0b/ad879847ecbf6d27e90a6eabb7eff6b62c129eefe617ea45eae7c1f0aead/multidict-6.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:82176036e65644a6cc5bd619f65f6f19781e8ec2e5330f51aa9ada7504cc1926", size = 28795 }, - { url = "https://files.pythonhosted.org/packages/fd/16/92057c74ba3b96d5e211b553895cd6dc7cc4d1e43d9ab8fafc727681ef71/multidict-6.1.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b04772ed465fa3cc947db808fa306d79b43e896beb677a56fb2347ca1a49c1fa", size = 48713 }, - { url = "https://files.pythonhosted.org/packages/94/3d/37d1b8893ae79716179540b89fc6a0ee56b4a65fcc0d63535c6f5d96f217/multidict-6.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6180c0ae073bddeb5a97a38c03f30c233e0a4d39cd86166251617d1bbd0af436", size = 29516 }, - { url = "https://files.pythonhosted.org/packages/a2/12/adb6b3200c363062f805275b4c1e656be2b3681aada66c80129932ff0bae/multidict-6.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:071120490b47aa997cca00666923a83f02c7fbb44f71cf7f136df753f7fa8761", size = 29557 }, - { url = "https://files.pythonhosted.org/packages/47/e9/604bb05e6e5bce1e6a5cf80a474e0f072e80d8ac105f1b994a53e0b28c42/multidict-6.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50b3a2710631848991d0bf7de077502e8994c804bb805aeb2925a981de58ec2e", size = 130170 }, - { url = "https://files.pythonhosted.org/packages/7e/13/9efa50801785eccbf7086b3c83b71a4fb501a4d43549c2f2f80b8787d69f/multidict-6.1.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b58c621844d55e71c1b7f7c498ce5aa6985d743a1a59034c57a905b3f153c1ef", size = 134836 }, - { url = "https://files.pythonhosted.org/packages/bf/0f/93808b765192780d117814a6dfcc2e75de6dcc610009ad408b8814dca3ba/multidict-6.1.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55b6d90641869892caa9ca42ff913f7ff1c5ece06474fbd32fb2cf6834726c95", size = 133475 }, - { url = "https://files.pythonhosted.org/packages/d3/c8/529101d7176fe7dfe1d99604e48d69c5dfdcadb4f06561f465c8ef12b4df/multidict-6.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b820514bfc0b98a30e3d85462084779900347e4d49267f747ff54060cc33925", size = 131049 }, - { url = "https://files.pythonhosted.org/packages/ca/0c/fc85b439014d5a58063e19c3a158a889deec399d47b5269a0f3b6a2e28bc/multidict-6.1.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10a9b09aba0c5b48c53761b7c720aaaf7cf236d5fe394cd399c7ba662d5f9966", size = 120370 }, - { url = "https://files.pythonhosted.org/packages/db/46/d4416eb20176492d2258fbd47b4abe729ff3b6e9c829ea4236f93c865089/multidict-6.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1e16bf3e5fc9f44632affb159d30a437bfe286ce9e02754759be5536b169b305", size = 125178 }, - { url = "https://files.pythonhosted.org/packages/5b/46/73697ad7ec521df7de5531a32780bbfd908ded0643cbe457f981a701457c/multidict-6.1.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:76f364861c3bfc98cbbcbd402d83454ed9e01a5224bb3a28bf70002a230f73e2", size = 119567 }, - { url = "https://files.pythonhosted.org/packages/cd/ed/51f060e2cb0e7635329fa6ff930aa5cffa17f4c7f5c6c3ddc3500708e2f2/multidict-6.1.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:820c661588bd01a0aa62a1283f20d2be4281b086f80dad9e955e690c75fb54a2", size = 129822 }, - { url = "https://files.pythonhosted.org/packages/df/9e/ee7d1954b1331da3eddea0c4e08d9142da5f14b1321c7301f5014f49d492/multidict-6.1.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:0e5f362e895bc5b9e67fe6e4ded2492d8124bdf817827f33c5b46c2fe3ffaca6", size = 128656 }, - { url = "https://files.pythonhosted.org/packages/77/00/8538f11e3356b5d95fa4b024aa566cde7a38aa7a5f08f4912b32a037c5dc/multidict-6.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3ec660d19bbc671e3a6443325f07263be452c453ac9e512f5eb935e7d4ac28b3", size = 125360 }, - { url = "https://files.pythonhosted.org/packages/be/05/5d334c1f2462d43fec2363cd00b1c44c93a78c3925d952e9a71caf662e96/multidict-6.1.0-cp312-cp312-win32.whl", hash = "sha256:58130ecf8f7b8112cdb841486404f1282b9c86ccb30d3519faf301b2e5659133", size = 26382 }, - { url = "https://files.pythonhosted.org/packages/a3/bf/f332a13486b1ed0496d624bcc7e8357bb8053823e8cd4b9a18edc1d97e73/multidict-6.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:188215fc0aafb8e03341995e7c4797860181562380f81ed0a87ff455b70bf1f1", size = 28529 }, - { url = "https://files.pythonhosted.org/packages/22/67/1c7c0f39fe069aa4e5d794f323be24bf4d33d62d2a348acdb7991f8f30db/multidict-6.1.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:d569388c381b24671589335a3be6e1d45546c2988c2ebe30fdcada8457a31008", size = 48771 }, - { url = "https://files.pythonhosted.org/packages/3c/25/c186ee7b212bdf0df2519eacfb1981a017bda34392c67542c274651daf23/multidict-6.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:052e10d2d37810b99cc170b785945421141bf7bb7d2f8799d431e7db229c385f", size = 29533 }, - { url = "https://files.pythonhosted.org/packages/67/5e/04575fd837e0958e324ca035b339cea174554f6f641d3fb2b4f2e7ff44a2/multidict-6.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f90c822a402cb865e396a504f9fc8173ef34212a342d92e362ca498cad308e28", size = 29595 }, - { url = "https://files.pythonhosted.org/packages/d3/b2/e56388f86663810c07cfe4a3c3d87227f3811eeb2d08450b9e5d19d78876/multidict-6.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b225d95519a5bf73860323e633a664b0d85ad3d5bede6d30d95b35d4dfe8805b", size = 130094 }, - { url = "https://files.pythonhosted.org/packages/6c/ee/30ae9b4186a644d284543d55d491fbd4239b015d36b23fea43b4c94f7052/multidict-6.1.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:23bfd518810af7de1116313ebd9092cb9aa629beb12f6ed631ad53356ed6b86c", size = 134876 }, - { url = "https://files.pythonhosted.org/packages/84/c7/70461c13ba8ce3c779503c70ec9d0345ae84de04521c1f45a04d5f48943d/multidict-6.1.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c09fcfdccdd0b57867577b719c69e347a436b86cd83747f179dbf0cc0d4c1f3", size = 133500 }, - { url = "https://files.pythonhosted.org/packages/4a/9f/002af221253f10f99959561123fae676148dd730e2daa2cd053846a58507/multidict-6.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf6bea52ec97e95560af5ae576bdac3aa3aae0b6758c6efa115236d9e07dae44", size = 131099 }, - { url = "https://files.pythonhosted.org/packages/82/42/d1c7a7301d52af79d88548a97e297f9d99c961ad76bbe6f67442bb77f097/multidict-6.1.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57feec87371dbb3520da6192213c7d6fc892d5589a93db548331954de8248fd2", size = 120403 }, - { url = "https://files.pythonhosted.org/packages/68/f3/471985c2c7ac707547553e8f37cff5158030d36bdec4414cb825fbaa5327/multidict-6.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0c3f390dc53279cbc8ba976e5f8035eab997829066756d811616b652b00a23a3", size = 125348 }, - { url = "https://files.pythonhosted.org/packages/67/2c/e6df05c77e0e433c214ec1d21ddd203d9a4770a1f2866a8ca40a545869a0/multidict-6.1.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:59bfeae4b25ec05b34f1956eaa1cb38032282cd4dfabc5056d0a1ec4d696d3aa", size = 119673 }, - { url = "https://files.pythonhosted.org/packages/c5/cd/bc8608fff06239c9fb333f9db7743a1b2eafe98c2666c9a196e867a3a0a4/multidict-6.1.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:b2f59caeaf7632cc633b5cf6fc449372b83bbdf0da4ae04d5be36118e46cc0aa", size = 129927 }, - { url = "https://files.pythonhosted.org/packages/44/8e/281b69b7bc84fc963a44dc6e0bbcc7150e517b91df368a27834299a526ac/multidict-6.1.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:37bb93b2178e02b7b618893990941900fd25b6b9ac0fa49931a40aecdf083fe4", size = 128711 }, - { url = "https://files.pythonhosted.org/packages/12/a4/63e7cd38ed29dd9f1881d5119f272c898ca92536cdb53ffe0843197f6c85/multidict-6.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4e9f48f58c2c523d5a06faea47866cd35b32655c46b443f163d08c6d0ddb17d6", size = 125519 }, - { url = "https://files.pythonhosted.org/packages/38/e0/4f5855037a72cd8a7a2f60a3952d9aa45feedb37ae7831642102604e8a37/multidict-6.1.0-cp313-cp313-win32.whl", hash = "sha256:3a37ffb35399029b45c6cc33640a92bef403c9fd388acce75cdc88f58bd19a81", size = 26426 }, - { url = "https://files.pythonhosted.org/packages/7e/a5/17ee3a4db1e310b7405f5d25834460073a8ccd86198ce044dfaf69eac073/multidict-6.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:e9aa71e15d9d9beaad2c6b9319edcdc0a49a43ef5c0a4c8265ca9ee7d6c67774", size = 28531 }, - { url = "https://files.pythonhosted.org/packages/99/b7/b9e70fde2c0f0c9af4cc5277782a89b66d35948ea3369ec9f598358c3ac5/multidict-6.1.0-py3-none-any.whl", hash = "sha256:48e171e52d1c4d33888e529b999e5900356b9ae588c2f09a52dcefb158b27506", size = 10051 }, -] - -[[package]] -name = "numpy" -version = "2.2.4" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e1/78/31103410a57bc2c2b93a3597340a8119588571f6a4539067546cb9a0bfac/numpy-2.2.4.tar.gz", hash = "sha256:9ba03692a45d3eef66559efe1d1096c4b9b75c0986b5dff5530c378fb8331d4f", size = 20270701 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/16/fb/09e778ee3a8ea0d4dc8329cca0a9c9e65fed847d08e37eba74cb7ed4b252/numpy-2.2.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e9e0a277bb2eb5d8a7407e14688b85fd8ad628ee4e0c7930415687b6564207a4", size = 21254989 }, - { url = "https://files.pythonhosted.org/packages/a2/0a/1212befdbecab5d80eca3cde47d304cad986ad4eec7d85a42e0b6d2cc2ef/numpy-2.2.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9eeea959168ea555e556b8188da5fa7831e21d91ce031e95ce23747b7609f8a4", size = 14425910 }, - { url = "https://files.pythonhosted.org/packages/2b/3e/e7247c1d4f15086bb106c8d43c925b0b2ea20270224f5186fa48d4fb5cbd/numpy-2.2.4-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:bd3ad3b0a40e713fc68f99ecfd07124195333f1e689387c180813f0e94309d6f", size = 5426490 }, - { url = "https://files.pythonhosted.org/packages/5d/fa/aa7cd6be51419b894c5787a8a93c3302a1ed4f82d35beb0613ec15bdd0e2/numpy-2.2.4-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:cf28633d64294969c019c6df4ff37f5698e8326db68cc2b66576a51fad634880", size = 6967754 }, - { url = "https://files.pythonhosted.org/packages/d5/ee/96457c943265de9fadeb3d2ffdbab003f7fba13d971084a9876affcda095/numpy-2.2.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2fa8fa7697ad1646b5c93de1719965844e004fcad23c91228aca1cf0800044a1", size = 14373079 }, - { url = "https://files.pythonhosted.org/packages/c5/5c/ceefca458559f0ccc7a982319f37ed07b0d7b526964ae6cc61f8ad1b6119/numpy-2.2.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f4162988a360a29af158aeb4a2f4f09ffed6a969c9776f8f3bdee9b06a8ab7e5", size = 16428819 }, - { url = "https://files.pythonhosted.org/packages/22/31/9b2ac8eee99e001eb6add9fa27514ef5e9faf176169057a12860af52704c/numpy-2.2.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:892c10d6a73e0f14935c31229e03325a7b3093fafd6ce0af704be7f894d95687", size = 15881470 }, - { url = "https://files.pythonhosted.org/packages/f0/dc/8569b5f25ff30484b555ad8a3f537e0225d091abec386c9420cf5f7a2976/numpy-2.2.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:db1f1c22173ac1c58db249ae48aa7ead29f534b9a948bc56828337aa84a32ed6", size = 18218144 }, - { url = "https://files.pythonhosted.org/packages/5e/05/463c023a39bdeb9bb43a99e7dee2c664cb68d5bb87d14f92482b9f6011cc/numpy-2.2.4-cp311-cp311-win32.whl", hash = "sha256:ea2bb7e2ae9e37d96835b3576a4fa4b3a97592fbea8ef7c3587078b0068b8f09", size = 6606368 }, - { url = "https://files.pythonhosted.org/packages/8b/72/10c1d2d82101c468a28adc35de6c77b308f288cfd0b88e1070f15b98e00c/numpy-2.2.4-cp311-cp311-win_amd64.whl", hash = "sha256:f7de08cbe5551911886d1ab60de58448c6df0f67d9feb7d1fb21e9875ef95e91", size = 12947526 }, - { url = "https://files.pythonhosted.org/packages/a2/30/182db21d4f2a95904cec1a6f779479ea1ac07c0647f064dea454ec650c42/numpy-2.2.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a7b9084668aa0f64e64bd00d27ba5146ef1c3a8835f3bd912e7a9e01326804c4", size = 20947156 }, - { url = "https://files.pythonhosted.org/packages/24/6d/9483566acfbda6c62c6bc74b6e981c777229d2af93c8eb2469b26ac1b7bc/numpy-2.2.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:dbe512c511956b893d2dacd007d955a3f03d555ae05cfa3ff1c1ff6df8851854", size = 14133092 }, - { url = "https://files.pythonhosted.org/packages/27/f6/dba8a258acbf9d2bed2525cdcbb9493ef9bae5199d7a9cb92ee7e9b2aea6/numpy-2.2.4-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:bb649f8b207ab07caebba230d851b579a3c8711a851d29efe15008e31bb4de24", size = 5163515 }, - { url = "https://files.pythonhosted.org/packages/62/30/82116199d1c249446723c68f2c9da40d7f062551036f50b8c4caa42ae252/numpy-2.2.4-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:f34dc300df798742b3d06515aa2a0aee20941c13579d7a2f2e10af01ae4901ee", size = 6696558 }, - { url = "https://files.pythonhosted.org/packages/0e/b2/54122b3c6df5df3e87582b2e9430f1bdb63af4023c739ba300164c9ae503/numpy-2.2.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c3f7ac96b16955634e223b579a3e5798df59007ca43e8d451a0e6a50f6bfdfba", size = 14084742 }, - { url = "https://files.pythonhosted.org/packages/02/e2/e2cbb8d634151aab9528ef7b8bab52ee4ab10e076509285602c2a3a686e0/numpy-2.2.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f92084defa704deadd4e0a5ab1dc52d8ac9e8a8ef617f3fbb853e79b0ea3592", size = 16134051 }, - { url = "https://files.pythonhosted.org/packages/8e/21/efd47800e4affc993e8be50c1b768de038363dd88865920439ef7b422c60/numpy-2.2.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7a4e84a6283b36632e2a5b56e121961f6542ab886bc9e12f8f9818b3c266bfbb", size = 15578972 }, - { url = "https://files.pythonhosted.org/packages/04/1e/f8bb88f6157045dd5d9b27ccf433d016981032690969aa5c19e332b138c0/numpy-2.2.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:11c43995255eb4127115956495f43e9343736edb7fcdb0d973defd9de14cd84f", size = 17898106 }, - { url = "https://files.pythonhosted.org/packages/2b/93/df59a5a3897c1f036ae8ff845e45f4081bb06943039ae28a3c1c7c780f22/numpy-2.2.4-cp312-cp312-win32.whl", hash = "sha256:65ef3468b53269eb5fdb3a5c09508c032b793da03251d5f8722b1194f1790c00", size = 6311190 }, - { url = "https://files.pythonhosted.org/packages/46/69/8c4f928741c2a8efa255fdc7e9097527c6dc4e4df147e3cadc5d9357ce85/numpy-2.2.4-cp312-cp312-win_amd64.whl", hash = "sha256:2aad3c17ed2ff455b8eaafe06bcdae0062a1db77cb99f4b9cbb5f4ecb13c5146", size = 12644305 }, - { url = "https://files.pythonhosted.org/packages/2a/d0/bd5ad792e78017f5decfb2ecc947422a3669a34f775679a76317af671ffc/numpy-2.2.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1cf4e5c6a278d620dee9ddeb487dc6a860f9b199eadeecc567f777daace1e9e7", size = 20933623 }, - { url = "https://files.pythonhosted.org/packages/c3/bc/2b3545766337b95409868f8e62053135bdc7fa2ce630aba983a2aa60b559/numpy-2.2.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1974afec0b479e50438fc3648974268f972e2d908ddb6d7fb634598cdb8260a0", size = 14148681 }, - { url = "https://files.pythonhosted.org/packages/6a/70/67b24d68a56551d43a6ec9fe8c5f91b526d4c1a46a6387b956bf2d64744e/numpy-2.2.4-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:79bd5f0a02aa16808fcbc79a9a376a147cc1045f7dfe44c6e7d53fa8b8a79392", size = 5148759 }, - { url = "https://files.pythonhosted.org/packages/1c/8b/e2fc8a75fcb7be12d90b31477c9356c0cbb44abce7ffb36be39a0017afad/numpy-2.2.4-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:3387dd7232804b341165cedcb90694565a6015433ee076c6754775e85d86f1fc", size = 6683092 }, - { url = "https://files.pythonhosted.org/packages/13/73/41b7b27f169ecf368b52533edb72e56a133f9e86256e809e169362553b49/numpy-2.2.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f527d8fdb0286fd2fd97a2a96c6be17ba4232da346931d967a0630050dfd298", size = 14081422 }, - { url = "https://files.pythonhosted.org/packages/4b/04/e208ff3ae3ddfbafc05910f89546382f15a3f10186b1f56bd99f159689c2/numpy-2.2.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bce43e386c16898b91e162e5baaad90c4b06f9dcbe36282490032cec98dc8ae7", size = 16132202 }, - { url = "https://files.pythonhosted.org/packages/fe/bc/2218160574d862d5e55f803d88ddcad88beff94791f9c5f86d67bd8fbf1c/numpy-2.2.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:31504f970f563d99f71a3512d0c01a645b692b12a63630d6aafa0939e52361e6", size = 15573131 }, - { url = "https://files.pythonhosted.org/packages/a5/78/97c775bc4f05abc8a8426436b7cb1be806a02a2994b195945600855e3a25/numpy-2.2.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:81413336ef121a6ba746892fad881a83351ee3e1e4011f52e97fba79233611fd", size = 17894270 }, - { url = "https://files.pythonhosted.org/packages/b9/eb/38c06217a5f6de27dcb41524ca95a44e395e6a1decdc0c99fec0832ce6ae/numpy-2.2.4-cp313-cp313-win32.whl", hash = "sha256:f486038e44caa08dbd97275a9a35a283a8f1d2f0ee60ac260a1790e76660833c", size = 6308141 }, - { url = "https://files.pythonhosted.org/packages/52/17/d0dd10ab6d125c6d11ffb6dfa3423c3571befab8358d4f85cd4471964fcd/numpy-2.2.4-cp313-cp313-win_amd64.whl", hash = "sha256:207a2b8441cc8b6a2a78c9ddc64d00d20c303d79fba08c577752f080c4007ee3", size = 12636885 }, - { url = "https://files.pythonhosted.org/packages/fa/e2/793288ede17a0fdc921172916efb40f3cbc2aa97e76c5c84aba6dc7e8747/numpy-2.2.4-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:8120575cb4882318c791f839a4fd66161a6fa46f3f0a5e613071aae35b5dd8f8", size = 20961829 }, - { url = "https://files.pythonhosted.org/packages/3a/75/bb4573f6c462afd1ea5cbedcc362fe3e9bdbcc57aefd37c681be1155fbaa/numpy-2.2.4-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a761ba0fa886a7bb33c6c8f6f20213735cb19642c580a931c625ee377ee8bd39", size = 14161419 }, - { url = "https://files.pythonhosted.org/packages/03/68/07b4cd01090ca46c7a336958b413cdbe75002286295f2addea767b7f16c9/numpy-2.2.4-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:ac0280f1ba4a4bfff363a99a6aceed4f8e123f8a9b234c89140f5e894e452ecd", size = 5196414 }, - { url = "https://files.pythonhosted.org/packages/a5/fd/d4a29478d622fedff5c4b4b4cedfc37a00691079623c0575978d2446db9e/numpy-2.2.4-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:879cf3a9a2b53a4672a168c21375166171bc3932b7e21f622201811c43cdd3b0", size = 6709379 }, - { url = "https://files.pythonhosted.org/packages/41/78/96dddb75bb9be730b87c72f30ffdd62611aba234e4e460576a068c98eff6/numpy-2.2.4-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f05d4198c1bacc9124018109c5fba2f3201dbe7ab6e92ff100494f236209c960", size = 14051725 }, - { url = "https://files.pythonhosted.org/packages/00/06/5306b8199bffac2a29d9119c11f457f6c7d41115a335b78d3f86fad4dbe8/numpy-2.2.4-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e2f085ce2e813a50dfd0e01fbfc0c12bbe5d2063d99f8b29da30e544fb6483b8", size = 16101638 }, - { url = "https://files.pythonhosted.org/packages/fa/03/74c5b631ee1ded596945c12027649e6344614144369fd3ec1aaced782882/numpy-2.2.4-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:92bda934a791c01d6d9d8e038363c50918ef7c40601552a58ac84c9613a665bc", size = 15571717 }, - { url = "https://files.pythonhosted.org/packages/cb/dc/4fc7c0283abe0981e3b89f9b332a134e237dd476b0c018e1e21083310c31/numpy-2.2.4-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ee4d528022f4c5ff67332469e10efe06a267e32f4067dc76bb7e2cddf3cd25ff", size = 17879998 }, - { url = "https://files.pythonhosted.org/packages/e5/2b/878576190c5cfa29ed896b518cc516aecc7c98a919e20706c12480465f43/numpy-2.2.4-cp313-cp313t-win32.whl", hash = "sha256:05c076d531e9998e7e694c36e8b349969c56eadd2cdcd07242958489d79a7286", size = 6366896 }, - { url = "https://files.pythonhosted.org/packages/3e/05/eb7eec66b95cf697f08c754ef26c3549d03ebd682819f794cb039574a0a6/numpy-2.2.4-cp313-cp313t-win_amd64.whl", hash = "sha256:188dcbca89834cc2e14eb2f106c96d6d46f200fe0200310fc29089657379c58d", size = 12739119 }, -] - -[[package]] -name = "orjson" -version = "3.10.15" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ae/f9/5dea21763eeff8c1590076918a446ea3d6140743e0e36f58f369928ed0f4/orjson-3.10.15.tar.gz", hash = "sha256:05ca7fe452a2e9d8d9d706a2984c95b9c2ebc5db417ce0b7a49b91d50642a23e", size = 5282482 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7a/a2/21b25ce4a2c71dbb90948ee81bd7a42b4fbfc63162e57faf83157d5540ae/orjson-3.10.15-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:c4cc83960ab79a4031f3119cc4b1a1c627a3dc09df125b27c4201dff2af7eaa6", size = 249533 }, - { url = "https://files.pythonhosted.org/packages/b2/85/2076fc12d8225698a51278009726750c9c65c846eda741e77e1761cfef33/orjson-3.10.15-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ddbeef2481d895ab8be5185f2432c334d6dec1f5d1933a9c83014d188e102cef", size = 125230 }, - { url = "https://files.pythonhosted.org/packages/06/df/a85a7955f11274191eccf559e8481b2be74a7c6d43075d0a9506aa80284d/orjson-3.10.15-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9e590a0477b23ecd5b0ac865b1b907b01b3c5535f5e8a8f6ab0e503efb896334", size = 150148 }, - { url = "https://files.pythonhosted.org/packages/37/b3/94c55625a29b8767c0eed194cb000b3787e3c23b4cdd13be17bae6ccbb4b/orjson-3.10.15-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a6be38bd103d2fd9bdfa31c2720b23b5d47c6796bcb1d1b598e3924441b4298d", size = 139749 }, - { url = "https://files.pythonhosted.org/packages/53/ba/c608b1e719971e8ddac2379f290404c2e914cf8e976369bae3cad88768b1/orjson-3.10.15-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ff4f6edb1578960ed628a3b998fa54d78d9bb3e2eb2cfc5c2a09732431c678d0", size = 154558 }, - { url = "https://files.pythonhosted.org/packages/b2/c4/c1fb835bb23ad788a39aa9ebb8821d51b1c03588d9a9e4ca7de5b354fdd5/orjson-3.10.15-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b0482b21d0462eddd67e7fce10b89e0b6ac56570424662b685a0d6fccf581e13", size = 130349 }, - { url = "https://files.pythonhosted.org/packages/78/14/bb2b48b26ab3c570b284eb2157d98c1ef331a8397f6c8bd983b270467f5c/orjson-3.10.15-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:bb5cc3527036ae3d98b65e37b7986a918955f85332c1ee07f9d3f82f3a6899b5", size = 138513 }, - { url = "https://files.pythonhosted.org/packages/4a/97/d5b353a5fe532e92c46467aa37e637f81af8468aa894cd77d2ec8a12f99e/orjson-3.10.15-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d569c1c462912acdd119ccbf719cf7102ea2c67dd03b99edcb1a3048651ac96b", size = 130942 }, - { url = "https://files.pythonhosted.org/packages/b5/5d/a067bec55293cca48fea8b9928cfa84c623be0cce8141d47690e64a6ca12/orjson-3.10.15-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:1e6d33efab6b71d67f22bf2962895d3dc6f82a6273a965fab762e64fa90dc399", size = 414717 }, - { url = "https://files.pythonhosted.org/packages/6f/9a/1485b8b05c6b4c4db172c438cf5db5dcfd10e72a9bc23c151a1137e763e0/orjson-3.10.15-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:c33be3795e299f565681d69852ac8c1bc5c84863c0b0030b2b3468843be90388", size = 141033 }, - { url = "https://files.pythonhosted.org/packages/f8/d2/fc67523656e43a0c7eaeae9007c8b02e86076b15d591e9be11554d3d3138/orjson-3.10.15-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:eea80037b9fae5339b214f59308ef0589fc06dc870578b7cce6d71eb2096764c", size = 129720 }, - { url = "https://files.pythonhosted.org/packages/79/42/f58c7bd4e5b54da2ce2ef0331a39ccbbaa7699b7f70206fbf06737c9ed7d/orjson-3.10.15-cp311-cp311-win32.whl", hash = "sha256:d5ac11b659fd798228a7adba3e37c010e0152b78b1982897020a8e019a94882e", size = 142473 }, - { url = "https://files.pythonhosted.org/packages/00/f8/bb60a4644287a544ec81df1699d5b965776bc9848d9029d9f9b3402ac8bb/orjson-3.10.15-cp311-cp311-win_amd64.whl", hash = "sha256:cf45e0214c593660339ef63e875f32ddd5aa3b4adc15e662cdb80dc49e194f8e", size = 133570 }, - { url = "https://files.pythonhosted.org/packages/66/85/22fe737188905a71afcc4bf7cc4c79cd7f5bbe9ed1fe0aac4ce4c33edc30/orjson-3.10.15-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:9d11c0714fc85bfcf36ada1179400862da3288fc785c30e8297844c867d7505a", size = 249504 }, - { url = "https://files.pythonhosted.org/packages/48/b7/2622b29f3afebe938a0a9037e184660379797d5fd5234e5998345d7a5b43/orjson-3.10.15-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dba5a1e85d554e3897fa9fe6fbcff2ed32d55008973ec9a2b992bd9a65d2352d", size = 125080 }, - { url = "https://files.pythonhosted.org/packages/ce/8f/0b72a48f4403d0b88b2a41450c535b3e8989e8a2d7800659a967efc7c115/orjson-3.10.15-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7723ad949a0ea502df656948ddd8b392780a5beaa4c3b5f97e525191b102fff0", size = 150121 }, - { url = "https://files.pythonhosted.org/packages/06/ec/acb1a20cd49edb2000be5a0404cd43e3c8aad219f376ac8c60b870518c03/orjson-3.10.15-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6fd9bc64421e9fe9bd88039e7ce8e58d4fead67ca88e3a4014b143cec7684fd4", size = 139796 }, - { url = "https://files.pythonhosted.org/packages/33/e1/f7840a2ea852114b23a52a1c0b2bea0a1ea22236efbcdb876402d799c423/orjson-3.10.15-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dadba0e7b6594216c214ef7894c4bd5f08d7c0135f4dd0145600be4fbcc16767", size = 154636 }, - { url = "https://files.pythonhosted.org/packages/fa/da/31543337febd043b8fa80a3b67de627669b88c7b128d9ad4cc2ece005b7a/orjson-3.10.15-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b48f59114fe318f33bbaee8ebeda696d8ccc94c9e90bc27dbe72153094e26f41", size = 130621 }, - { url = "https://files.pythonhosted.org/packages/ed/78/66115dc9afbc22496530d2139f2f4455698be444c7c2475cb48f657cefc9/orjson-3.10.15-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:035fb83585e0f15e076759b6fedaf0abb460d1765b6a36f48018a52858443514", size = 138516 }, - { url = "https://files.pythonhosted.org/packages/22/84/cd4f5fb5427ffcf823140957a47503076184cb1ce15bcc1165125c26c46c/orjson-3.10.15-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d13b7fe322d75bf84464b075eafd8e7dd9eae05649aa2a5354cfa32f43c59f17", size = 130762 }, - { url = "https://files.pythonhosted.org/packages/93/1f/67596b711ba9f56dd75d73b60089c5c92057f1130bb3a25a0f53fb9a583b/orjson-3.10.15-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:7066b74f9f259849629e0d04db6609db4cf5b973248f455ba5d3bd58a4daaa5b", size = 414700 }, - { url = "https://files.pythonhosted.org/packages/7c/0c/6a3b3271b46443d90efb713c3e4fe83fa8cd71cda0d11a0f69a03f437c6e/orjson-3.10.15-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:88dc3f65a026bd3175eb157fea994fca6ac7c4c8579fc5a86fc2114ad05705b7", size = 141077 }, - { url = "https://files.pythonhosted.org/packages/3b/9b/33c58e0bfc788995eccd0d525ecd6b84b40d7ed182dd0751cd4c1322ac62/orjson-3.10.15-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b342567e5465bd99faa559507fe45e33fc76b9fb868a63f1642c6bc0735ad02a", size = 129898 }, - { url = "https://files.pythonhosted.org/packages/01/c1/d577ecd2e9fa393366a1ea0a9267f6510d86e6c4bb1cdfb9877104cac44c/orjson-3.10.15-cp312-cp312-win32.whl", hash = "sha256:0a4f27ea5617828e6b58922fdbec67b0aa4bb844e2d363b9244c47fa2180e665", size = 142566 }, - { url = "https://files.pythonhosted.org/packages/ed/eb/a85317ee1732d1034b92d56f89f1de4d7bf7904f5c8fb9dcdd5b1c83917f/orjson-3.10.15-cp312-cp312-win_amd64.whl", hash = "sha256:ef5b87e7aa9545ddadd2309efe6824bd3dd64ac101c15dae0f2f597911d46eaa", size = 133732 }, - { url = "https://files.pythonhosted.org/packages/06/10/fe7d60b8da538e8d3d3721f08c1b7bff0491e8fa4dd3bf11a17e34f4730e/orjson-3.10.15-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:bae0e6ec2b7ba6895198cd981b7cca95d1487d0147c8ed751e5632ad16f031a6", size = 249399 }, - { url = "https://files.pythonhosted.org/packages/6b/83/52c356fd3a61abd829ae7e4366a6fe8e8863c825a60d7ac5156067516edf/orjson-3.10.15-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f93ce145b2db1252dd86af37d4165b6faa83072b46e3995ecc95d4b2301b725a", size = 125044 }, - { url = "https://files.pythonhosted.org/packages/55/b2/d06d5901408e7ded1a74c7c20d70e3a127057a6d21355f50c90c0f337913/orjson-3.10.15-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7c203f6f969210128af3acae0ef9ea6aab9782939f45f6fe02d05958fe761ef9", size = 150066 }, - { url = "https://files.pythonhosted.org/packages/75/8c/60c3106e08dc593a861755781c7c675a566445cc39558677d505878d879f/orjson-3.10.15-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8918719572d662e18b8af66aef699d8c21072e54b6c82a3f8f6404c1f5ccd5e0", size = 139737 }, - { url = "https://files.pythonhosted.org/packages/6a/8c/ae00d7d0ab8a4490b1efeb01ad4ab2f1982e69cc82490bf8093407718ff5/orjson-3.10.15-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f71eae9651465dff70aa80db92586ad5b92df46a9373ee55252109bb6b703307", size = 154804 }, - { url = "https://files.pythonhosted.org/packages/22/86/65dc69bd88b6dd254535310e97bc518aa50a39ef9c5a2a5d518e7a223710/orjson-3.10.15-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e117eb299a35f2634e25ed120c37c641398826c2f5a3d3cc39f5993b96171b9e", size = 130583 }, - { url = "https://files.pythonhosted.org/packages/bb/00/6fe01ededb05d52be42fabb13d93a36e51f1fd9be173bd95707d11a8a860/orjson-3.10.15-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:13242f12d295e83c2955756a574ddd6741c81e5b99f2bef8ed8d53e47a01e4b7", size = 138465 }, - { url = "https://files.pythonhosted.org/packages/db/2f/4cc151c4b471b0cdc8cb29d3eadbce5007eb0475d26fa26ed123dca93b33/orjson-3.10.15-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7946922ada8f3e0b7b958cc3eb22cfcf6c0df83d1fe5521b4a100103e3fa84c8", size = 130742 }, - { url = "https://files.pythonhosted.org/packages/9f/13/8a6109e4b477c518498ca37963d9c0eb1508b259725553fb53d53b20e2ea/orjson-3.10.15-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:b7155eb1623347f0f22c38c9abdd738b287e39b9982e1da227503387b81b34ca", size = 414669 }, - { url = "https://files.pythonhosted.org/packages/22/7b/1d229d6d24644ed4d0a803de1b0e2df832032d5beda7346831c78191b5b2/orjson-3.10.15-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:208beedfa807c922da4e81061dafa9c8489c6328934ca2a562efa707e049e561", size = 141043 }, - { url = "https://files.pythonhosted.org/packages/cc/d3/6dc91156cf12ed86bed383bcb942d84d23304a1e57b7ab030bf60ea130d6/orjson-3.10.15-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eca81f83b1b8c07449e1d6ff7074e82e3fd6777e588f1a6632127f286a968825", size = 129826 }, - { url = "https://files.pythonhosted.org/packages/b3/38/c47c25b86f6996f1343be721b6ea4367bc1c8bc0fc3f6bbcd995d18cb19d/orjson-3.10.15-cp313-cp313-win32.whl", hash = "sha256:c03cd6eea1bd3b949d0d007c8d57049aa2b39bd49f58b4b2af571a5d3833d890", size = 142542 }, - { url = "https://files.pythonhosted.org/packages/27/f1/1d7ec15b20f8ce9300bc850de1e059132b88990e46cd0ccac29cbf11e4f9/orjson-3.10.15-cp313-cp313-win_amd64.whl", hash = "sha256:fd56a26a04f6ba5fb2045b0acc487a63162a958ed837648c5781e1fe3316cfbf", size = 133444 }, -] - -[[package]] -name = "packaging" -version = "24.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d0/63/68dbb6eb2de9cb10ee4c9c14a0148804425e13c4fb20d61cce69f53106da/packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f", size = 163950 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/88/ef/eb23f262cca3c0c4eb7ab1933c3b1f03d021f2c48f54763065b6f0e321be/packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759", size = 65451 }, -] - -[[package]] -name = "paginate" -version = "0.5.7" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ec/46/68dde5b6bc00c1296ec6466ab27dddede6aec9af1b99090e1107091b3b84/paginate-0.5.7.tar.gz", hash = "sha256:22bd083ab41e1a8b4f3690544afb2c60c25e5c9a63a30fa2f483f6c60c8e5945", size = 19252 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/90/96/04b8e52da071d28f5e21a805b19cb9390aa17a47462ac87f5e2696b9566d/paginate-0.5.7-py2.py3-none-any.whl", hash = "sha256:b885e2af73abcf01d9559fd5216b57ef722f8c42affbb63942377668e35c7591", size = 13746 }, -] - -[[package]] -name = "pathspec" -version = "0.12.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ca/bc/f35b8446f4531a7cb215605d100cd88b7ac6f44ab3fc94870c120ab3adbf/pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712", size = 51043 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", size = 31191 }, -] - -[[package]] -name = "peewee" -version = "3.17.9" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/57/09/4393bd378e70b7fc3163ee83353cc27bb520010a5c2b3c924121e7e7e068/peewee-3.17.9.tar.gz", hash = "sha256:fe15cd001758e324c8e3ca8c8ed900e7397c2907291789e1efc383e66b9bc7a8", size = 3026085 } - -[[package]] -name = "phx-class-registry" -version = "5.1.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ad/e1/4038dc8b09e66b1f850913c05fe1c039f8d9c0ef61347af37c75bbe77e3f/phx_class_registry-5.1.1.tar.gz", hash = "sha256:06c9af198b846a7530406314f63f8d83441daf42d29ee25d8c0b19a9dbc37939", size = 32115 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7d/85/67eb86f25b1857a7669c4ad7a46b439e55c5301cbcb08b9ce8fa9125700d/phx_class_registry-5.1.1-py3-none-any.whl", hash = "sha256:b093ecc1dad34c5dc6eda2530046d956f2303a5cfaa543bf7fba35ce3c7b1672", size = 15732 }, -] - -[[package]] -name = "pillow" -version = "10.4.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/cd/74/ad3d526f3bf7b6d3f408b73fde271ec69dfac8b81341a318ce825f2b3812/pillow-10.4.0.tar.gz", hash = "sha256:166c1cd4d24309b30d61f79f4a9114b7b2313d7450912277855ff5dfd7cd4a06", size = 46555059 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a7/62/c9449f9c3043c37f73e7487ec4ef0c03eb9c9afc91a92b977a67b3c0bbc5/pillow-10.4.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:0a9ec697746f268507404647e531e92889890a087e03681a3606d9b920fbee3c", size = 3509265 }, - { url = "https://files.pythonhosted.org/packages/f4/5f/491dafc7bbf5a3cc1845dc0430872e8096eb9e2b6f8161509d124594ec2d/pillow-10.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dfe91cb65544a1321e631e696759491ae04a2ea11d36715eca01ce07284738be", size = 3375655 }, - { url = "https://files.pythonhosted.org/packages/73/d5/c4011a76f4207a3c151134cd22a1415741e42fa5ddecec7c0182887deb3d/pillow-10.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5dc6761a6efc781e6a1544206f22c80c3af4c8cf461206d46a1e6006e4429ff3", size = 4340304 }, - { url = "https://files.pythonhosted.org/packages/ac/10/c67e20445a707f7a610699bba4fe050583b688d8cd2d202572b257f46600/pillow-10.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e84b6cc6a4a3d76c153a6b19270b3526a5a8ed6b09501d3af891daa2a9de7d6", size = 4452804 }, - { url = "https://files.pythonhosted.org/packages/a9/83/6523837906d1da2b269dee787e31df3b0acb12e3d08f024965a3e7f64665/pillow-10.4.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:bbc527b519bd3aa9d7f429d152fea69f9ad37c95f0b02aebddff592688998abe", size = 4365126 }, - { url = "https://files.pythonhosted.org/packages/ba/e5/8c68ff608a4203085158cff5cc2a3c534ec384536d9438c405ed6370d080/pillow-10.4.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:76a911dfe51a36041f2e756b00f96ed84677cdeb75d25c767f296c1c1eda1319", size = 4533541 }, - { url = "https://files.pythonhosted.org/packages/f4/7c/01b8dbdca5bc6785573f4cee96e2358b0918b7b2c7b60d8b6f3abf87a070/pillow-10.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:59291fb29317122398786c2d44427bbd1a6d7ff54017075b22be9d21aa59bd8d", size = 4471616 }, - { url = "https://files.pythonhosted.org/packages/c8/57/2899b82394a35a0fbfd352e290945440e3b3785655a03365c0ca8279f351/pillow-10.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:416d3a5d0e8cfe4f27f574362435bc9bae57f679a7158e0096ad2beb427b8696", size = 4600802 }, - { url = "https://files.pythonhosted.org/packages/4d/d7/a44f193d4c26e58ee5d2d9db3d4854b2cfb5b5e08d360a5e03fe987c0086/pillow-10.4.0-cp311-cp311-win32.whl", hash = "sha256:7086cc1d5eebb91ad24ded9f58bec6c688e9f0ed7eb3dbbf1e4800280a896496", size = 2235213 }, - { url = "https://files.pythonhosted.org/packages/c1/d0/5866318eec2b801cdb8c82abf190c8343d8a1cd8bf5a0c17444a6f268291/pillow-10.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:cbed61494057c0f83b83eb3a310f0bf774b09513307c434d4366ed64f4128a91", size = 2554498 }, - { url = "https://files.pythonhosted.org/packages/d4/c8/310ac16ac2b97e902d9eb438688de0d961660a87703ad1561fd3dfbd2aa0/pillow-10.4.0-cp311-cp311-win_arm64.whl", hash = "sha256:f5f0c3e969c8f12dd2bb7e0b15d5c468b51e5017e01e2e867335c81903046a22", size = 2243219 }, - { url = "https://files.pythonhosted.org/packages/05/cb/0353013dc30c02a8be34eb91d25e4e4cf594b59e5a55ea1128fde1e5f8ea/pillow-10.4.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:673655af3eadf4df6b5457033f086e90299fdd7a47983a13827acf7459c15d94", size = 3509350 }, - { url = "https://files.pythonhosted.org/packages/e7/cf/5c558a0f247e0bf9cec92bff9b46ae6474dd736f6d906315e60e4075f737/pillow-10.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:866b6942a92f56300012f5fbac71f2d610312ee65e22f1aa2609e491284e5597", size = 3374980 }, - { url = "https://files.pythonhosted.org/packages/84/48/6e394b86369a4eb68b8a1382c78dc092245af517385c086c5094e3b34428/pillow-10.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29dbdc4207642ea6aad70fbde1a9338753d33fb23ed6956e706936706f52dd80", size = 4343799 }, - { url = "https://files.pythonhosted.org/packages/3b/f3/a8c6c11fa84b59b9df0cd5694492da8c039a24cd159f0f6918690105c3be/pillow-10.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf2342ac639c4cf38799a44950bbc2dfcb685f052b9e262f446482afaf4bffca", size = 4459973 }, - { url = "https://files.pythonhosted.org/packages/7d/1b/c14b4197b80150fb64453585247e6fb2e1d93761fa0fa9cf63b102fde822/pillow-10.4.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:f5b92f4d70791b4a67157321c4e8225d60b119c5cc9aee8ecf153aace4aad4ef", size = 4370054 }, - { url = "https://files.pythonhosted.org/packages/55/77/40daddf677897a923d5d33329acd52a2144d54a9644f2a5422c028c6bf2d/pillow-10.4.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:86dcb5a1eb778d8b25659d5e4341269e8590ad6b4e8b44d9f4b07f8d136c414a", size = 4539484 }, - { url = "https://files.pythonhosted.org/packages/40/54/90de3e4256b1207300fb2b1d7168dd912a2fb4b2401e439ba23c2b2cabde/pillow-10.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:780c072c2e11c9b2c7ca37f9a2ee8ba66f44367ac3e5c7832afcfe5104fd6d1b", size = 4477375 }, - { url = "https://files.pythonhosted.org/packages/13/24/1bfba52f44193860918ff7c93d03d95e3f8748ca1de3ceaf11157a14cf16/pillow-10.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:37fb69d905be665f68f28a8bba3c6d3223c8efe1edf14cc4cfa06c241f8c81d9", size = 4608773 }, - { url = "https://files.pythonhosted.org/packages/55/04/5e6de6e6120451ec0c24516c41dbaf80cce1b6451f96561235ef2429da2e/pillow-10.4.0-cp312-cp312-win32.whl", hash = "sha256:7dfecdbad5c301d7b5bde160150b4db4c659cee2b69589705b6f8a0c509d9f42", size = 2235690 }, - { url = "https://files.pythonhosted.org/packages/74/0a/d4ce3c44bca8635bd29a2eab5aa181b654a734a29b263ca8efe013beea98/pillow-10.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:1d846aea995ad352d4bdcc847535bd56e0fd88d36829d2c90be880ef1ee4668a", size = 2554951 }, - { url = "https://files.pythonhosted.org/packages/b5/ca/184349ee40f2e92439be9b3502ae6cfc43ac4b50bc4fc6b3de7957563894/pillow-10.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:e553cad5179a66ba15bb18b353a19020e73a7921296a7979c4a2b7f6a5cd57f9", size = 2243427 }, - { url = "https://files.pythonhosted.org/packages/c3/00/706cebe7c2c12a6318aabe5d354836f54adff7156fd9e1bd6c89f4ba0e98/pillow-10.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8bc1a764ed8c957a2e9cacf97c8b2b053b70307cf2996aafd70e91a082e70df3", size = 3525685 }, - { url = "https://files.pythonhosted.org/packages/cf/76/f658cbfa49405e5ecbfb9ba42d07074ad9792031267e782d409fd8fe7c69/pillow-10.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6209bb41dc692ddfee4942517c19ee81b86c864b626dbfca272ec0f7cff5d9fb", size = 3374883 }, - { url = "https://files.pythonhosted.org/packages/46/2b/99c28c4379a85e65378211971c0b430d9c7234b1ec4d59b2668f6299e011/pillow-10.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bee197b30783295d2eb680b311af15a20a8b24024a19c3a26431ff83eb8d1f70", size = 4339837 }, - { url = "https://files.pythonhosted.org/packages/f1/74/b1ec314f624c0c43711fdf0d8076f82d9d802afd58f1d62c2a86878e8615/pillow-10.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ef61f5dd14c300786318482456481463b9d6b91ebe5ef12f405afbba77ed0be", size = 4455562 }, - { url = "https://files.pythonhosted.org/packages/4a/2a/4b04157cb7b9c74372fa867096a1607e6fedad93a44deeff553ccd307868/pillow-10.4.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:297e388da6e248c98bc4a02e018966af0c5f92dfacf5a5ca22fa01cb3179bca0", size = 4366761 }, - { url = "https://files.pythonhosted.org/packages/ac/7b/8f1d815c1a6a268fe90481232c98dd0e5fa8c75e341a75f060037bd5ceae/pillow-10.4.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:e4db64794ccdf6cb83a59d73405f63adbe2a1887012e308828596100a0b2f6cc", size = 4536767 }, - { url = "https://files.pythonhosted.org/packages/e5/77/05fa64d1f45d12c22c314e7b97398ffb28ef2813a485465017b7978b3ce7/pillow-10.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bd2880a07482090a3bcb01f4265f1936a903d70bc740bfcb1fd4e8a2ffe5cf5a", size = 4477989 }, - { url = "https://files.pythonhosted.org/packages/12/63/b0397cfc2caae05c3fb2f4ed1b4fc4fc878f0243510a7a6034ca59726494/pillow-10.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4b35b21b819ac1dbd1233317adeecd63495f6babf21b7b2512d244ff6c6ce309", size = 4610255 }, - { url = "https://files.pythonhosted.org/packages/7b/f9/cfaa5082ca9bc4a6de66ffe1c12c2d90bf09c309a5f52b27759a596900e7/pillow-10.4.0-cp313-cp313-win32.whl", hash = "sha256:551d3fd6e9dc15e4c1eb6fc4ba2b39c0c7933fa113b220057a34f4bb3268a060", size = 2235603 }, - { url = "https://files.pythonhosted.org/packages/01/6a/30ff0eef6e0c0e71e55ded56a38d4859bf9d3634a94a88743897b5f96936/pillow-10.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:030abdbe43ee02e0de642aee345efa443740aa4d828bfe8e2eb11922ea6a21ea", size = 2554972 }, - { url = "https://files.pythonhosted.org/packages/48/2c/2e0a52890f269435eee38b21c8218e102c621fe8d8df8b9dd06fabf879ba/pillow-10.4.0-cp313-cp313-win_arm64.whl", hash = "sha256:5b001114dd152cfd6b23befeb28d7aee43553e2402c9f159807bf55f33af8a8d", size = 2243375 }, -] - -[[package]] -name = "pip" -version = "25.0.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/70/53/b309b4a497b09655cb7e07088966881a57d082f48ac3cb54ea729fd2c6cf/pip-25.0.1.tar.gz", hash = "sha256:88f96547ea48b940a3a385494e181e29fb8637898f88d88737c5049780f196ea", size = 1950850 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c9/bc/b7db44f5f39f9d0494071bddae6880eb645970366d0a200022a1a93d57f5/pip-25.0.1-py3-none-any.whl", hash = "sha256:c46efd13b6aa8279f33f2864459c8ce587ea6a1a59ee20de055868d8f7688f7f", size = 1841526 }, -] - -[[package]] -name = "platformdirs" -version = "4.3.6" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/13/fc/128cc9cb8f03208bdbf93d3aa862e16d376844a14f9a0ce5cf4507372de4/platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907", size = 21302 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/3c/a6/bc1012356d8ece4d66dd75c4b9fc6c1f6650ddd5991e421177d9f8f671be/platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb", size = 18439 }, -] - -[[package]] -name = "propcache" -version = "0.2.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a9/4d/5e5a60b78dbc1d464f8a7bbaeb30957257afdc8512cbb9dfd5659304f5cd/propcache-0.2.0.tar.gz", hash = "sha256:df81779732feb9d01e5d513fad0122efb3d53bbc75f61b2a4f29a020bc985e70", size = 40951 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e0/1c/71eec730e12aec6511e702ad0cd73c2872eccb7cad39de8ba3ba9de693ef/propcache-0.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:63f13bf09cc3336eb04a837490b8f332e0db41da66995c9fd1ba04552e516354", size = 80811 }, - { url = "https://files.pythonhosted.org/packages/89/c3/7e94009f9a4934c48a371632197406a8860b9f08e3f7f7d922ab69e57a41/propcache-0.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:608cce1da6f2672a56b24a015b42db4ac612ee709f3d29f27a00c943d9e851de", size = 46365 }, - { url = "https://files.pythonhosted.org/packages/c0/1d/c700d16d1d6903aeab28372fe9999762f074b80b96a0ccc953175b858743/propcache-0.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:466c219deee4536fbc83c08d09115249db301550625c7fef1c5563a584c9bc87", size = 45602 }, - { url = "https://files.pythonhosted.org/packages/2e/5e/4a3e96380805bf742712e39a4534689f4cddf5fa2d3a93f22e9fd8001b23/propcache-0.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc2db02409338bf36590aa985a461b2c96fce91f8e7e0f14c50c5fcc4f229016", size = 236161 }, - { url = "https://files.pythonhosted.org/packages/a5/85/90132481183d1436dff6e29f4fa81b891afb6cb89a7306f32ac500a25932/propcache-0.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a6ed8db0a556343d566a5c124ee483ae113acc9a557a807d439bcecc44e7dfbb", size = 244938 }, - { url = "https://files.pythonhosted.org/packages/4a/89/c893533cb45c79c970834274e2d0f6d64383ec740be631b6a0a1d2b4ddc0/propcache-0.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:91997d9cb4a325b60d4e3f20967f8eb08dfcb32b22554d5ef78e6fd1dda743a2", size = 243576 }, - { url = "https://files.pythonhosted.org/packages/8c/56/98c2054c8526331a05f205bf45cbb2cda4e58e56df70e76d6a509e5d6ec6/propcache-0.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c7dde9e533c0a49d802b4f3f218fa9ad0a1ce21f2c2eb80d5216565202acab4", size = 236011 }, - { url = "https://files.pythonhosted.org/packages/2d/0c/8b8b9f8a6e1abd869c0fa79b907228e7abb966919047d294ef5df0d136cf/propcache-0.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffcad6c564fe6b9b8916c1aefbb37a362deebf9394bd2974e9d84232e3e08504", size = 224834 }, - { url = "https://files.pythonhosted.org/packages/18/bb/397d05a7298b7711b90e13108db697732325cafdcd8484c894885c1bf109/propcache-0.2.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:97a58a28bcf63284e8b4d7b460cbee1edaab24634e82059c7b8c09e65284f178", size = 224946 }, - { url = "https://files.pythonhosted.org/packages/25/19/4fc08dac19297ac58135c03770b42377be211622fd0147f015f78d47cd31/propcache-0.2.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:945db8ee295d3af9dbdbb698cce9bbc5c59b5c3fe328bbc4387f59a8a35f998d", size = 217280 }, - { url = "https://files.pythonhosted.org/packages/7e/76/c79276a43df2096ce2aba07ce47576832b1174c0c480fe6b04bd70120e59/propcache-0.2.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:39e104da444a34830751715f45ef9fc537475ba21b7f1f5b0f4d71a3b60d7fe2", size = 220088 }, - { url = "https://files.pythonhosted.org/packages/c3/9a/8a8cf428a91b1336b883f09c8b884e1734c87f724d74b917129a24fe2093/propcache-0.2.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:c5ecca8f9bab618340c8e848d340baf68bcd8ad90a8ecd7a4524a81c1764b3db", size = 233008 }, - { url = "https://files.pythonhosted.org/packages/25/7b/768a8969abd447d5f0f3333df85c6a5d94982a1bc9a89c53c154bf7a8b11/propcache-0.2.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:c436130cc779806bdf5d5fae0d848713105472b8566b75ff70048c47d3961c5b", size = 237719 }, - { url = "https://files.pythonhosted.org/packages/ed/0d/e5d68ccc7976ef8b57d80613ac07bbaf0614d43f4750cf953f0168ef114f/propcache-0.2.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:191db28dc6dcd29d1a3e063c3be0b40688ed76434622c53a284e5427565bbd9b", size = 227729 }, - { url = "https://files.pythonhosted.org/packages/05/64/17eb2796e2d1c3d0c431dc5f40078d7282f4645af0bb4da9097fbb628c6c/propcache-0.2.0-cp311-cp311-win32.whl", hash = "sha256:5f2564ec89058ee7c7989a7b719115bdfe2a2fb8e7a4543b8d1c0cc4cf6478c1", size = 40473 }, - { url = "https://files.pythonhosted.org/packages/83/c5/e89fc428ccdc897ade08cd7605f174c69390147526627a7650fb883e0cd0/propcache-0.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:6e2e54267980349b723cff366d1e29b138b9a60fa376664a157a342689553f71", size = 44921 }, - { url = "https://files.pythonhosted.org/packages/7c/46/a41ca1097769fc548fc9216ec4c1471b772cc39720eb47ed7e38ef0006a9/propcache-0.2.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:2ee7606193fb267be4b2e3b32714f2d58cad27217638db98a60f9efb5efeccc2", size = 80800 }, - { url = "https://files.pythonhosted.org/packages/75/4f/93df46aab9cc473498ff56be39b5f6ee1e33529223d7a4d8c0a6101a9ba2/propcache-0.2.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:91ee8fc02ca52e24bcb77b234f22afc03288e1dafbb1f88fe24db308910c4ac7", size = 46443 }, - { url = "https://files.pythonhosted.org/packages/0b/17/308acc6aee65d0f9a8375e36c4807ac6605d1f38074b1581bd4042b9fb37/propcache-0.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2e900bad2a8456d00a113cad8c13343f3b1f327534e3589acc2219729237a2e8", size = 45676 }, - { url = "https://files.pythonhosted.org/packages/65/44/626599d2854d6c1d4530b9a05e7ff2ee22b790358334b475ed7c89f7d625/propcache-0.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f52a68c21363c45297aca15561812d542f8fc683c85201df0bebe209e349f793", size = 246191 }, - { url = "https://files.pythonhosted.org/packages/f2/df/5d996d7cb18df076debae7d76ac3da085c0575a9f2be6b1f707fe227b54c/propcache-0.2.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1e41d67757ff4fbc8ef2af99b338bfb955010444b92929e9e55a6d4dcc3c4f09", size = 251791 }, - { url = "https://files.pythonhosted.org/packages/2e/6d/9f91e5dde8b1f662f6dd4dff36098ed22a1ef4e08e1316f05f4758f1576c/propcache-0.2.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a64e32f8bd94c105cc27f42d3b658902b5bcc947ece3c8fe7bc1b05982f60e89", size = 253434 }, - { url = "https://files.pythonhosted.org/packages/3c/e9/1b54b7e26f50b3e0497cd13d3483d781d284452c2c50dd2a615a92a087a3/propcache-0.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:55346705687dbd7ef0d77883ab4f6fabc48232f587925bdaf95219bae072491e", size = 248150 }, - { url = "https://files.pythonhosted.org/packages/a7/ef/a35bf191c8038fe3ce9a414b907371c81d102384eda5dbafe6f4dce0cf9b/propcache-0.2.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:00181262b17e517df2cd85656fcd6b4e70946fe62cd625b9d74ac9977b64d8d9", size = 233568 }, - { url = "https://files.pythonhosted.org/packages/97/d9/d00bb9277a9165a5e6d60f2142cd1a38a750045c9c12e47ae087f686d781/propcache-0.2.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6994984550eaf25dd7fc7bd1b700ff45c894149341725bb4edc67f0ffa94efa4", size = 229874 }, - { url = "https://files.pythonhosted.org/packages/8e/78/c123cf22469bdc4b18efb78893e69c70a8b16de88e6160b69ca6bdd88b5d/propcache-0.2.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:56295eb1e5f3aecd516d91b00cfd8bf3a13991de5a479df9e27dd569ea23959c", size = 225857 }, - { url = "https://files.pythonhosted.org/packages/31/1b/fd6b2f1f36d028820d35475be78859d8c89c8f091ad30e377ac49fd66359/propcache-0.2.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:439e76255daa0f8151d3cb325f6dd4a3e93043e6403e6491813bcaaaa8733887", size = 227604 }, - { url = "https://files.pythonhosted.org/packages/99/36/b07be976edf77a07233ba712e53262937625af02154353171716894a86a6/propcache-0.2.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:f6475a1b2ecb310c98c28d271a30df74f9dd436ee46d09236a6b750a7599ce57", size = 238430 }, - { url = "https://files.pythonhosted.org/packages/0d/64/5822f496c9010e3966e934a011ac08cac8734561842bc7c1f65586e0683c/propcache-0.2.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:3444cdba6628accf384e349014084b1cacd866fbb88433cd9d279d90a54e0b23", size = 244814 }, - { url = "https://files.pythonhosted.org/packages/fd/bd/8657918a35d50b18a9e4d78a5df7b6c82a637a311ab20851eef4326305c1/propcache-0.2.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4a9d9b4d0a9b38d1c391bb4ad24aa65f306c6f01b512e10a8a34a2dc5675d348", size = 235922 }, - { url = "https://files.pythonhosted.org/packages/a8/6f/ec0095e1647b4727db945213a9f395b1103c442ef65e54c62e92a72a3f75/propcache-0.2.0-cp312-cp312-win32.whl", hash = "sha256:69d3a98eebae99a420d4b28756c8ce6ea5a29291baf2dc9ff9414b42676f61d5", size = 40177 }, - { url = "https://files.pythonhosted.org/packages/20/a2/bd0896fdc4f4c1db46d9bc361c8c79a9bf08ccc08ba054a98e38e7ba1557/propcache-0.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:ad9c9b99b05f163109466638bd30ada1722abb01bbb85c739c50b6dc11f92dc3", size = 44446 }, - { url = "https://files.pythonhosted.org/packages/a8/a7/5f37b69197d4f558bfef5b4bceaff7c43cc9b51adf5bd75e9081d7ea80e4/propcache-0.2.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ecddc221a077a8132cf7c747d5352a15ed763b674c0448d811f408bf803d9ad7", size = 78120 }, - { url = "https://files.pythonhosted.org/packages/c8/cd/48ab2b30a6b353ecb95a244915f85756d74f815862eb2ecc7a518d565b48/propcache-0.2.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0e53cb83fdd61cbd67202735e6a6687a7b491c8742dfc39c9e01e80354956763", size = 45127 }, - { url = "https://files.pythonhosted.org/packages/a5/ba/0a1ef94a3412aab057bd996ed5f0ac7458be5bf469e85c70fa9ceb43290b/propcache-0.2.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:92fe151145a990c22cbccf9ae15cae8ae9eddabfc949a219c9f667877e40853d", size = 44419 }, - { url = "https://files.pythonhosted.org/packages/b4/6c/ca70bee4f22fa99eacd04f4d2f1699be9d13538ccf22b3169a61c60a27fa/propcache-0.2.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d6a21ef516d36909931a2967621eecb256018aeb11fc48656e3257e73e2e247a", size = 229611 }, - { url = "https://files.pythonhosted.org/packages/19/70/47b872a263e8511ca33718d96a10c17d3c853aefadeb86dc26e8421184b9/propcache-0.2.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3f88a4095e913f98988f5b338c1d4d5d07dbb0b6bad19892fd447484e483ba6b", size = 234005 }, - { url = "https://files.pythonhosted.org/packages/4f/be/3b0ab8c84a22e4a3224719099c1229ddfdd8a6a1558cf75cb55ee1e35c25/propcache-0.2.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5a5b3bb545ead161be780ee85a2b54fdf7092815995661947812dde94a40f6fb", size = 237270 }, - { url = "https://files.pythonhosted.org/packages/04/d8/f071bb000d4b8f851d312c3c75701e586b3f643fe14a2e3409b1b9ab3936/propcache-0.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67aeb72e0f482709991aa91345a831d0b707d16b0257e8ef88a2ad246a7280bf", size = 231877 }, - { url = "https://files.pythonhosted.org/packages/93/e7/57a035a1359e542bbb0a7df95aad6b9871ebee6dce2840cb157a415bd1f3/propcache-0.2.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c997f8c44ec9b9b0bcbf2d422cc00a1d9b9c681f56efa6ca149a941e5560da2", size = 217848 }, - { url = "https://files.pythonhosted.org/packages/f0/93/d1dea40f112ec183398fb6c42fde340edd7bab202411c4aa1a8289f461b6/propcache-0.2.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:2a66df3d4992bc1d725b9aa803e8c5a66c010c65c741ad901e260ece77f58d2f", size = 216987 }, - { url = "https://files.pythonhosted.org/packages/62/4c/877340871251145d3522c2b5d25c16a1690ad655fbab7bb9ece6b117e39f/propcache-0.2.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:3ebbcf2a07621f29638799828b8d8668c421bfb94c6cb04269130d8de4fb7136", size = 212451 }, - { url = "https://files.pythonhosted.org/packages/7c/bb/a91b72efeeb42906ef58ccf0cdb87947b54d7475fee3c93425d732f16a61/propcache-0.2.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:1235c01ddaa80da8235741e80815ce381c5267f96cc49b1477fdcf8c047ef325", size = 212879 }, - { url = "https://files.pythonhosted.org/packages/9b/7f/ee7fea8faac57b3ec5d91ff47470c6c5d40d7f15d0b1fccac806348fa59e/propcache-0.2.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3947483a381259c06921612550867b37d22e1df6d6d7e8361264b6d037595f44", size = 222288 }, - { url = "https://files.pythonhosted.org/packages/ff/d7/acd67901c43d2e6b20a7a973d9d5fd543c6e277af29b1eb0e1f7bd7ca7d2/propcache-0.2.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:d5bed7f9805cc29c780f3aee05de3262ee7ce1f47083cfe9f77471e9d6777e83", size = 228257 }, - { url = "https://files.pythonhosted.org/packages/8d/6f/6272ecc7a8daad1d0754cfc6c8846076a8cb13f810005c79b15ce0ef0cf2/propcache-0.2.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e4a91d44379f45f5e540971d41e4626dacd7f01004826a18cb048e7da7e96544", size = 221075 }, - { url = "https://files.pythonhosted.org/packages/7c/bd/c7a6a719a6b3dd8b3aeadb3675b5783983529e4a3185946aa444d3e078f6/propcache-0.2.0-cp313-cp313-win32.whl", hash = "sha256:f902804113e032e2cdf8c71015651c97af6418363bea8d78dc0911d56c335032", size = 39654 }, - { url = "https://files.pythonhosted.org/packages/88/e7/0eef39eff84fa3e001b44de0bd41c7c0e3432e7648ffd3d64955910f002d/propcache-0.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:8f188cfcc64fb1266f4684206c9de0e80f54622c3f22a910cbd200478aeae61e", size = 43705 }, - { url = "https://files.pythonhosted.org/packages/3d/b6/e6d98278f2d49b22b4d033c9f792eda783b9ab2094b041f013fc69bcde87/propcache-0.2.0-py3-none-any.whl", hash = "sha256:2ccc28197af5313706511fab3a8b66dcd6da067a1331372c82ea1cb74285e036", size = 11603 }, -] - -[[package]] -name = "psutil" -version = "7.0.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/2a/80/336820c1ad9286a4ded7e845b2eccfcb27851ab8ac6abece774a6ff4d3de/psutil-7.0.0.tar.gz", hash = "sha256:7be9c3eba38beccb6495ea33afd982a44074b78f28c434a1f51cc07fd315c456", size = 497003 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ed/e6/2d26234410f8b8abdbf891c9da62bee396583f713fb9f3325a4760875d22/psutil-7.0.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:101d71dc322e3cffd7cea0650b09b3d08b8e7c4109dd6809fe452dfd00e58b25", size = 238051 }, - { url = "https://files.pythonhosted.org/packages/04/8b/30f930733afe425e3cbfc0e1468a30a18942350c1a8816acfade80c005c4/psutil-7.0.0-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:39db632f6bb862eeccf56660871433e111b6ea58f2caea825571951d4b6aa3da", size = 239535 }, - { url = "https://files.pythonhosted.org/packages/2a/ed/d362e84620dd22876b55389248e522338ed1bf134a5edd3b8231d7207f6d/psutil-7.0.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1fcee592b4c6f146991ca55919ea3d1f8926497a713ed7faaf8225e174581e91", size = 275004 }, - { url = "https://files.pythonhosted.org/packages/bf/b9/b0eb3f3cbcb734d930fdf839431606844a825b23eaf9a6ab371edac8162c/psutil-7.0.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b1388a4f6875d7e2aff5c4ca1cc16c545ed41dd8bb596cefea80111db353a34", size = 277986 }, - { url = "https://files.pythonhosted.org/packages/eb/a2/709e0fe2f093556c17fbafda93ac032257242cabcc7ff3369e2cb76a97aa/psutil-7.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5f098451abc2828f7dc6b58d44b532b22f2088f4999a937557b603ce72b1993", size = 279544 }, - { url = "https://files.pythonhosted.org/packages/50/e6/eecf58810b9d12e6427369784efe814a1eec0f492084ce8eb8f4d89d6d61/psutil-7.0.0-cp37-abi3-win32.whl", hash = "sha256:ba3fcef7523064a6c9da440fc4d6bd07da93ac726b5733c29027d7dc95b39d99", size = 241053 }, - { url = "https://files.pythonhosted.org/packages/50/1b/6921afe68c74868b4c9fa424dad3be35b095e16687989ebbb50ce4fceb7c/psutil-7.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:4cf3d4eb1aa9b348dec30105c55cd9b7d4629285735a102beb4441e38db90553", size = 244885 }, -] - -[[package]] -name = "py-dactyl" -version = "2.0.5" -source = { git = "https://github.com/iamkubi/pydactyl?tag=v2.0.5#ef5d8b9b807f67067dc1214097abf01ddb7e551f" } -dependencies = [ - { name = "requests" }, -] - -[[package]] -name = "pycparser" -version = "2.22" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/1d/b2/31537cf4b1ca988837256c910a668b553fceb8f069bedc4b1c826024b52c/pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6", size = 172736 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/13/a3/a812df4e2dd5696d1f351d58b8fe16a405b234ad2886a0dab9183fb78109/pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc", size = 117552 }, -] - -[[package]] -name = "pydantic" -version = "2.11.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "annotated-types" }, - { name = "pydantic-core" }, - { name = "typing-extensions" }, - { name = "typing-inspection" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/93/a3/698b87a4d4d303d7c5f62ea5fbf7a79cab236ccfbd0a17847b7f77f8163e/pydantic-2.11.1.tar.gz", hash = "sha256:442557d2910e75c991c39f4b4ab18963d57b9b55122c8b2a9cd176d8c29ce968", size = 782817 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/cc/12/f9221a949f2419e2e23847303c002476c26fbcfd62dc7f3d25d0bec5ca99/pydantic-2.11.1-py3-none-any.whl", hash = "sha256:5b6c415eee9f8123a14d859be0c84363fec6b1feb6b688d6435801230b56e0b8", size = 442648 }, -] - -[[package]] -name = "pydantic-core" -version = "2.33.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/b9/05/91ce14dfd5a3a99555fce436318cc0fd1f08c4daa32b3248ad63669ea8b4/pydantic_core-2.33.0.tar.gz", hash = "sha256:40eb8af662ba409c3cbf4a8150ad32ae73514cd7cb1f1a2113af39763dd616b3", size = 434080 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f0/93/9e97af2619b4026596487a79133e425c7d3c374f0a7f100f3d76bcdf9c83/pydantic_core-2.33.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:a608a75846804271cf9c83e40bbb4dab2ac614d33c6fd5b0c6187f53f5c593ef", size = 2042784 }, - { url = "https://files.pythonhosted.org/packages/42/b4/0bba8412fd242729feeb80e7152e24f0e1a1c19f4121ca3d4a307f4e6222/pydantic_core-2.33.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e1c69aa459f5609dec2fa0652d495353accf3eda5bdb18782bc5a2ae45c9273a", size = 1858179 }, - { url = "https://files.pythonhosted.org/packages/69/1f/c1c40305d929bd08af863df64b0a26203b70b352a1962d86f3bcd52950fe/pydantic_core-2.33.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9ec80eb5a5f45a2211793f1c4aeddff0c3761d1c70d684965c1807e923a588b", size = 1909396 }, - { url = "https://files.pythonhosted.org/packages/0f/99/d2e727375c329c1e652b5d450fbb9d56e8c3933a397e4bd46e67c68c2cd5/pydantic_core-2.33.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e925819a98318d17251776bd3d6aa9f3ff77b965762155bdad15d1a9265c4cfd", size = 1998264 }, - { url = "https://files.pythonhosted.org/packages/9c/2e/3119a33931278d96ecc2e9e1b9d50c240636cfeb0c49951746ae34e4de74/pydantic_core-2.33.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5bf68bb859799e9cec3d9dd8323c40c00a254aabb56fe08f907e437005932f2b", size = 2140588 }, - { url = "https://files.pythonhosted.org/packages/35/bd/9267bd1ba55f17c80ef6cb7e07b3890b4acbe8eb6014f3102092d53d9300/pydantic_core-2.33.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1b2ea72dea0825949a045fa4071f6d5b3d7620d2a208335207793cf29c5a182d", size = 2746296 }, - { url = "https://files.pythonhosted.org/packages/6f/ed/ef37de6478a412ee627cbebd73e7b72a680f45bfacce9ff1199de6e17e88/pydantic_core-2.33.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1583539533160186ac546b49f5cde9ffc928062c96920f58bd95de32ffd7bffd", size = 2005555 }, - { url = "https://files.pythonhosted.org/packages/dd/84/72c8d1439585d8ee7bc35eb8f88a04a4d302ee4018871f1f85ae1b0c6625/pydantic_core-2.33.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:23c3e77bf8a7317612e5c26a3b084c7edeb9552d645742a54a5867635b4f2453", size = 2124452 }, - { url = "https://files.pythonhosted.org/packages/a7/8f/cb13de30c6a3e303423751a529a3d1271c2effee4b98cf3e397a66ae8498/pydantic_core-2.33.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a7a7f2a3f628d2f7ef11cb6188bcf0b9e1558151d511b974dfea10a49afe192b", size = 2087001 }, - { url = "https://files.pythonhosted.org/packages/83/d0/e93dc8884bf288a63fedeb8040ac8f29cb71ca52e755f48e5170bb63e55b/pydantic_core-2.33.0-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:f1fb026c575e16f673c61c7b86144517705865173f3d0907040ac30c4f9f5915", size = 2261663 }, - { url = "https://files.pythonhosted.org/packages/4c/ba/4b7739c95efa0b542ee45fd872c8f6b1884ab808cf04ce7ac6621b6df76e/pydantic_core-2.33.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:635702b2fed997e0ac256b2cfbdb4dd0bf7c56b5d8fba8ef03489c03b3eb40e2", size = 2257786 }, - { url = "https://files.pythonhosted.org/packages/cc/98/73cbca1d2360c27752cfa2fcdcf14d96230e92d7d48ecd50499865c56bf7/pydantic_core-2.33.0-cp311-cp311-win32.whl", hash = "sha256:07b4ced28fccae3f00626eaa0c4001aa9ec140a29501770a88dbbb0966019a86", size = 1925697 }, - { url = "https://files.pythonhosted.org/packages/9a/26/d85a40edeca5d8830ffc33667d6fef329fd0f4bc0c5181b8b0e206cfe488/pydantic_core-2.33.0-cp311-cp311-win_amd64.whl", hash = "sha256:4927564be53239a87770a5f86bdc272b8d1fbb87ab7783ad70255b4ab01aa25b", size = 1949859 }, - { url = "https://files.pythonhosted.org/packages/7e/0b/5a381605f0b9870465b805f2c86c06b0a7c191668ebe4117777306c2c1e5/pydantic_core-2.33.0-cp311-cp311-win_arm64.whl", hash = "sha256:69297418ad644d521ea3e1aa2e14a2a422726167e9ad22b89e8f1130d68e1e9a", size = 1907978 }, - { url = "https://files.pythonhosted.org/packages/a9/c4/c9381323cbdc1bb26d352bc184422ce77c4bc2f2312b782761093a59fafc/pydantic_core-2.33.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:6c32a40712e3662bebe524abe8abb757f2fa2000028d64cc5a1006016c06af43", size = 2025127 }, - { url = "https://files.pythonhosted.org/packages/6f/bd/af35278080716ecab8f57e84515c7dc535ed95d1c7f52c1c6f7b313a9dab/pydantic_core-2.33.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8ec86b5baa36f0a0bfb37db86c7d52652f8e8aa076ab745ef7725784183c3fdd", size = 1851687 }, - { url = "https://files.pythonhosted.org/packages/12/e4/a01461225809c3533c23bd1916b1e8c2e21727f0fea60ab1acbffc4e2fca/pydantic_core-2.33.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4deac83a8cc1d09e40683be0bc6d1fa4cde8df0a9bf0cda5693f9b0569ac01b6", size = 1892232 }, - { url = "https://files.pythonhosted.org/packages/51/17/3d53d62a328fb0a49911c2962036b9e7a4f781b7d15e9093c26299e5f76d/pydantic_core-2.33.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:175ab598fb457a9aee63206a1993874badf3ed9a456e0654273e56f00747bbd6", size = 1977896 }, - { url = "https://files.pythonhosted.org/packages/30/98/01f9d86e02ec4a38f4b02086acf067f2c776b845d43f901bd1ee1c21bc4b/pydantic_core-2.33.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5f36afd0d56a6c42cf4e8465b6441cf546ed69d3a4ec92724cc9c8c61bd6ecf4", size = 2127717 }, - { url = "https://files.pythonhosted.org/packages/3c/43/6f381575c61b7c58b0fd0b92134c5a1897deea4cdfc3d47567b3ff460a4e/pydantic_core-2.33.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0a98257451164666afafc7cbf5fb00d613e33f7e7ebb322fbcd99345695a9a61", size = 2680287 }, - { url = "https://files.pythonhosted.org/packages/01/42/c0d10d1451d161a9a0da9bbef023b8005aa26e9993a8cc24dc9e3aa96c93/pydantic_core-2.33.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ecc6d02d69b54a2eb83ebcc6f29df04957f734bcf309d346b4f83354d8376862", size = 2008276 }, - { url = "https://files.pythonhosted.org/packages/20/ca/e08df9dba546905c70bae44ced9f3bea25432e34448d95618d41968f40b7/pydantic_core-2.33.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1a69b7596c6603afd049ce7f3835bcf57dd3892fc7279f0ddf987bebed8caa5a", size = 2115305 }, - { url = "https://files.pythonhosted.org/packages/03/1f/9b01d990730a98833113581a78e595fd40ed4c20f9693f5a658fb5f91eff/pydantic_core-2.33.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ea30239c148b6ef41364c6f51d103c2988965b643d62e10b233b5efdca8c0099", size = 2068999 }, - { url = "https://files.pythonhosted.org/packages/20/18/fe752476a709191148e8b1e1139147841ea5d2b22adcde6ee6abb6c8e7cf/pydantic_core-2.33.0-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:abfa44cf2f7f7d7a199be6c6ec141c9024063205545aa09304349781b9a125e6", size = 2241488 }, - { url = "https://files.pythonhosted.org/packages/81/22/14738ad0a0bf484b928c9e52004f5e0b81dd8dabbdf23b843717b37a71d1/pydantic_core-2.33.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:20d4275f3c4659d92048c70797e5fdc396c6e4446caf517ba5cad2db60cd39d3", size = 2248430 }, - { url = "https://files.pythonhosted.org/packages/e8/27/be7571e215ac8d321712f2433c445b03dbcd645366a18f67b334df8912bc/pydantic_core-2.33.0-cp312-cp312-win32.whl", hash = "sha256:918f2013d7eadea1d88d1a35fd4a1e16aaf90343eb446f91cb091ce7f9b431a2", size = 1908353 }, - { url = "https://files.pythonhosted.org/packages/be/3a/be78f28732f93128bd0e3944bdd4b3970b389a1fbd44907c97291c8dcdec/pydantic_core-2.33.0-cp312-cp312-win_amd64.whl", hash = "sha256:aec79acc183865bad120b0190afac467c20b15289050648b876b07777e67ea48", size = 1955956 }, - { url = "https://files.pythonhosted.org/packages/21/26/b8911ac74faa994694b76ee6a22875cc7a4abea3c381fdba4edc6c6bef84/pydantic_core-2.33.0-cp312-cp312-win_arm64.whl", hash = "sha256:5461934e895968655225dfa8b3be79e7e927e95d4bd6c2d40edd2fa7052e71b6", size = 1903259 }, - { url = "https://files.pythonhosted.org/packages/79/20/de2ad03ce8f5b3accf2196ea9b44f31b0cd16ac6e8cfc6b21976ed45ec35/pydantic_core-2.33.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:f00e8b59e1fc8f09d05594aa7d2b726f1b277ca6155fc84c0396db1b373c4555", size = 2032214 }, - { url = "https://files.pythonhosted.org/packages/f9/af/6817dfda9aac4958d8b516cbb94af507eb171c997ea66453d4d162ae8948/pydantic_core-2.33.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1a73be93ecef45786d7d95b0c5e9b294faf35629d03d5b145b09b81258c7cd6d", size = 1852338 }, - { url = "https://files.pythonhosted.org/packages/44/f3/49193a312d9c49314f2b953fb55740b7c530710977cabe7183b8ef111b7f/pydantic_core-2.33.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ff48a55be9da6930254565ff5238d71d5e9cd8c5487a191cb85df3bdb8c77365", size = 1896913 }, - { url = "https://files.pythonhosted.org/packages/06/e0/c746677825b2e29a2fa02122a8991c83cdd5b4c5f638f0664d4e35edd4b2/pydantic_core-2.33.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:26a4ea04195638dcd8c53dadb545d70badba51735b1594810e9768c2c0b4a5da", size = 1986046 }, - { url = "https://files.pythonhosted.org/packages/11/ec/44914e7ff78cef16afb5e5273d480c136725acd73d894affdbe2a1bbaad5/pydantic_core-2.33.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:41d698dcbe12b60661f0632b543dbb119e6ba088103b364ff65e951610cb7ce0", size = 2128097 }, - { url = "https://files.pythonhosted.org/packages/fe/f5/c6247d424d01f605ed2e3802f338691cae17137cee6484dce9f1ac0b872b/pydantic_core-2.33.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ae62032ef513fe6281ef0009e30838a01057b832dc265da32c10469622613885", size = 2681062 }, - { url = "https://files.pythonhosted.org/packages/f0/85/114a2113b126fdd7cf9a9443b1b1fe1b572e5bd259d50ba9d5d3e1927fa9/pydantic_core-2.33.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f225f3a3995dbbc26affc191d0443c6c4aa71b83358fd4c2b7d63e2f6f0336f9", size = 2007487 }, - { url = "https://files.pythonhosted.org/packages/e6/40/3c05ed28d225c7a9acd2b34c5c8010c279683a870219b97e9f164a5a8af0/pydantic_core-2.33.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5bdd36b362f419c78d09630cbaebc64913f66f62bda6d42d5fbb08da8cc4f181", size = 2121382 }, - { url = "https://files.pythonhosted.org/packages/8a/22/e70c086f41eebd323e6baa92cc906c3f38ddce7486007eb2bdb3b11c8f64/pydantic_core-2.33.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:2a0147c0bef783fd9abc9f016d66edb6cac466dc54a17ec5f5ada08ff65caf5d", size = 2072473 }, - { url = "https://files.pythonhosted.org/packages/3e/84/d1614dedd8fe5114f6a0e348bcd1535f97d76c038d6102f271433cd1361d/pydantic_core-2.33.0-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:c860773a0f205926172c6644c394e02c25421dc9a456deff16f64c0e299487d3", size = 2249468 }, - { url = "https://files.pythonhosted.org/packages/b0/c0/787061eef44135e00fddb4b56b387a06c303bfd3884a6df9bea5cb730230/pydantic_core-2.33.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:138d31e3f90087f42aa6286fb640f3c7a8eb7bdae829418265e7e7474bd2574b", size = 2254716 }, - { url = "https://files.pythonhosted.org/packages/ae/e2/27262eb04963201e89f9c280f1e10c493a7a37bc877e023f31aa72d2f911/pydantic_core-2.33.0-cp313-cp313-win32.whl", hash = "sha256:d20cbb9d3e95114325780f3cfe990f3ecae24de7a2d75f978783878cce2ad585", size = 1916450 }, - { url = "https://files.pythonhosted.org/packages/13/8d/25ff96f1e89b19e0b70b3cd607c9ea7ca27e1dcb810a9cd4255ed6abf869/pydantic_core-2.33.0-cp313-cp313-win_amd64.whl", hash = "sha256:ca1103d70306489e3d006b0f79db8ca5dd3c977f6f13b2c59ff745249431a606", size = 1956092 }, - { url = "https://files.pythonhosted.org/packages/1b/64/66a2efeff657b04323ffcd7b898cb0354d36dae3a561049e092134a83e9c/pydantic_core-2.33.0-cp313-cp313-win_arm64.whl", hash = "sha256:6291797cad239285275558e0a27872da735b05c75d5237bbade8736f80e4c225", size = 1908367 }, - { url = "https://files.pythonhosted.org/packages/52/54/295e38769133363d7ec4a5863a4d579f331728c71a6644ff1024ee529315/pydantic_core-2.33.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:7b79af799630af263eca9ec87db519426d8c9b3be35016eddad1832bac812d87", size = 1813331 }, - { url = "https://files.pythonhosted.org/packages/4c/9c/0c8ea02db8d682aa1ef48938abae833c1d69bdfa6e5ec13b21734b01ae70/pydantic_core-2.33.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eabf946a4739b5237f4f56d77fa6668263bc466d06a8036c055587c130a46f7b", size = 1986653 }, - { url = "https://files.pythonhosted.org/packages/8e/4f/3fb47d6cbc08c7e00f92300e64ba655428c05c56b8ab6723bd290bae6458/pydantic_core-2.33.0-cp313-cp313t-win_amd64.whl", hash = "sha256:8a1d581e8cdbb857b0e0e81df98603376c1a5c34dc5e54039dcc00f043df81e7", size = 1931234 }, - { url = "https://files.pythonhosted.org/packages/2b/b2/553e42762e7b08771fca41c0230c1ac276f9e79e78f57628e1b7d328551d/pydantic_core-2.33.0-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5d8dc9f63a26f7259b57f46a7aab5af86b2ad6fbe48487500bb1f4b27e051e4c", size = 2041207 }, - { url = "https://files.pythonhosted.org/packages/85/81/a91a57bbf3efe53525ab75f65944b8950e6ef84fe3b9a26c1ec173363263/pydantic_core-2.33.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:30369e54d6d0113d2aa5aee7a90d17f225c13d87902ace8fcd7bbf99b19124db", size = 1873736 }, - { url = "https://files.pythonhosted.org/packages/9c/d2/5ab52e9f551cdcbc1ee99a0b3ef595f56d031f66f88e5ca6726c49f9ce65/pydantic_core-2.33.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3eb479354c62067afa62f53bb387827bee2f75c9c79ef25eef6ab84d4b1ae3b", size = 1903794 }, - { url = "https://files.pythonhosted.org/packages/2f/5f/a81742d3f3821b16f1265f057d6e0b68a3ab13a814fe4bffac536a1f26fd/pydantic_core-2.33.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0310524c833d91403c960b8a3cf9f46c282eadd6afd276c8c5edc617bd705dc9", size = 2083457 }, - { url = "https://files.pythonhosted.org/packages/b5/2f/e872005bc0fc47f9c036b67b12349a8522d32e3bda928e82d676e2a594d1/pydantic_core-2.33.0-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:eddb18a00bbb855325db27b4c2a89a4ba491cd6a0bd6d852b225172a1f54b36c", size = 2119537 }, - { url = "https://files.pythonhosted.org/packages/d3/13/183f13ce647202eaf3dada9e42cdfc59cbb95faedd44d25f22b931115c7f/pydantic_core-2.33.0-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:ade5dbcf8d9ef8f4b28e682d0b29f3008df9842bb5ac48ac2c17bc55771cc976", size = 2080069 }, - { url = "https://files.pythonhosted.org/packages/23/8b/b6be91243da44a26558d9c3a9007043b3750334136c6550551e8092d6d96/pydantic_core-2.33.0-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:2c0afd34f928383e3fd25740f2050dbac9d077e7ba5adbaa2227f4d4f3c8da5c", size = 2251618 }, - { url = "https://files.pythonhosted.org/packages/aa/c5/fbcf1977035b834f63eb542e74cd6c807177f383386175b468f0865bcac4/pydantic_core-2.33.0-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:7da333f21cd9df51d5731513a6d39319892947604924ddf2e24a4612975fb936", size = 2255374 }, - { url = "https://files.pythonhosted.org/packages/2f/f8/66f328e411f1c9574b13c2c28ab01f308b53688bbbe6ca8fb981e6cabc42/pydantic_core-2.33.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:4b6d77c75a57f041c5ee915ff0b0bb58eabb78728b69ed967bc5b780e8f701b8", size = 2082099 }, -] - -[[package]] -name = "pygments" -version = "2.19.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/7c/2d/c3338d48ea6cc0feb8446d8e6937e1408088a72a39937982cc6111d17f84/pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f", size = 4968581 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/8a/0b/9fcc47d19c48b59121088dd6da2488a49d5f72dacf8262e2790a1d2c7d15/pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c", size = 1225293 }, -] - -[[package]] -name = "pylint" -version = "3.3.6" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "astroid" }, - { name = "colorama", marker = "sys_platform == 'win32'" }, - { name = "dill" }, - { name = "isort" }, - { name = "mccabe" }, - { name = "platformdirs" }, - { name = "tomlkit" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/69/a7/113d02340afb9dcbb0c8b25454e9538cd08f0ebf3e510df4ed916caa1a89/pylint-3.3.6.tar.gz", hash = "sha256:b634a041aac33706d56a0d217e6587228c66427e20ec21a019bc4cdee48c040a", size = 1519586 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/31/21/9537fc94aee9ec7316a230a49895266cf02d78aa29b0a2efbc39566e0935/pylint-3.3.6-py3-none-any.whl", hash = "sha256:8b7c2d3e86ae3f94fb27703d521dd0b9b6b378775991f504d7c3a6275aa0a6a6", size = 522462 }, -] - -[[package]] -name = "pymdown-extensions" -version = "10.14.3" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "markdown" }, - { name = "pyyaml" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/7c/44/e6de2fdc880ad0ec7547ca2e087212be815efbc9a425a8d5ba9ede602cbb/pymdown_extensions-10.14.3.tar.gz", hash = "sha256:41e576ce3f5d650be59e900e4ceff231e0aed2a88cf30acaee41e02f063a061b", size = 846846 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/eb/f5/b9e2a42aa8f9e34d52d66de87941ecd236570c7ed2e87775ed23bbe4e224/pymdown_extensions-10.14.3-py3-none-any.whl", hash = "sha256:05e0bee73d64b9c71a4ae17c72abc2f700e8bc8403755a00580b49a4e9f189e9", size = 264467 }, -] - -[[package]] -name = "python-dateutil" -version = "2.9.0.post0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "six" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892 }, -] - -[[package]] -name = "pytz" -version = "2025.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f8/bf/abbd3cdfb8fbc7fb3d4d38d320f2441b1e7cbe29be4f23797b4a2b5d8aac/pytz-2025.2.tar.gz", hash = "sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3", size = 320884 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl", hash = "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00", size = 509225 }, -] - -[[package]] -name = "pyyaml" -version = "6.0.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/54/ed/79a089b6be93607fa5cdaedf301d7dfb23af5f25c398d5ead2525b063e17/pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", size = 130631 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f8/aa/7af4e81f7acba21a4c6be026da38fd2b872ca46226673c89a758ebdc4fd2/PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774", size = 184612 }, - { url = "https://files.pythonhosted.org/packages/8b/62/b9faa998fd185f65c1371643678e4d58254add437edb764a08c5a98fb986/PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee", size = 172040 }, - { url = "https://files.pythonhosted.org/packages/ad/0c/c804f5f922a9a6563bab712d8dcc70251e8af811fce4524d57c2c0fd49a4/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c", size = 736829 }, - { url = "https://files.pythonhosted.org/packages/51/16/6af8d6a6b210c8e54f1406a6b9481febf9c64a3109c541567e35a49aa2e7/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317", size = 764167 }, - { url = "https://files.pythonhosted.org/packages/75/e4/2c27590dfc9992f73aabbeb9241ae20220bd9452df27483b6e56d3975cc5/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85", size = 762952 }, - { url = "https://files.pythonhosted.org/packages/9b/97/ecc1abf4a823f5ac61941a9c00fe501b02ac3ab0e373c3857f7d4b83e2b6/PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4", size = 735301 }, - { url = "https://files.pythonhosted.org/packages/45/73/0f49dacd6e82c9430e46f4a027baa4ca205e8b0a9dce1397f44edc23559d/PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e", size = 756638 }, - { url = "https://files.pythonhosted.org/packages/22/5f/956f0f9fc65223a58fbc14459bf34b4cc48dec52e00535c79b8db361aabd/PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5", size = 143850 }, - { url = "https://files.pythonhosted.org/packages/ed/23/8da0bbe2ab9dcdd11f4f4557ccaf95c10b9811b13ecced089d43ce59c3c8/PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44", size = 161980 }, - { url = "https://files.pythonhosted.org/packages/86/0c/c581167fc46d6d6d7ddcfb8c843a4de25bdd27e4466938109ca68492292c/PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab", size = 183873 }, - { url = "https://files.pythonhosted.org/packages/a8/0c/38374f5bb272c051e2a69281d71cba6fdb983413e6758b84482905e29a5d/PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725", size = 173302 }, - { url = "https://files.pythonhosted.org/packages/c3/93/9916574aa8c00aa06bbac729972eb1071d002b8e158bd0e83a3b9a20a1f7/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5", size = 739154 }, - { url = "https://files.pythonhosted.org/packages/95/0f/b8938f1cbd09739c6da569d172531567dbcc9789e0029aa070856f123984/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425", size = 766223 }, - { url = "https://files.pythonhosted.org/packages/b9/2b/614b4752f2e127db5cc206abc23a8c19678e92b23c3db30fc86ab731d3bd/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476", size = 767542 }, - { url = "https://files.pythonhosted.org/packages/d4/00/dd137d5bcc7efea1836d6264f049359861cf548469d18da90cd8216cf05f/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48", size = 731164 }, - { url = "https://files.pythonhosted.org/packages/c9/1f/4f998c900485e5c0ef43838363ba4a9723ac0ad73a9dc42068b12aaba4e4/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b", size = 756611 }, - { url = "https://files.pythonhosted.org/packages/df/d1/f5a275fdb252768b7a11ec63585bc38d0e87c9e05668a139fea92b80634c/PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4", size = 140591 }, - { url = "https://files.pythonhosted.org/packages/0c/e8/4f648c598b17c3d06e8753d7d13d57542b30d56e6c2dedf9c331ae56312e/PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8", size = 156338 }, - { url = "https://files.pythonhosted.org/packages/ef/e3/3af305b830494fa85d95f6d95ef7fa73f2ee1cc8ef5b495c7c3269fb835f/PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba", size = 181309 }, - { url = "https://files.pythonhosted.org/packages/45/9f/3b1c20a0b7a3200524eb0076cc027a970d320bd3a6592873c85c92a08731/PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1", size = 171679 }, - { url = "https://files.pythonhosted.org/packages/7c/9a/337322f27005c33bcb656c655fa78325b730324c78620e8328ae28b64d0c/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133", size = 733428 }, - { url = "https://files.pythonhosted.org/packages/a3/69/864fbe19e6c18ea3cc196cbe5d392175b4cf3d5d0ac1403ec3f2d237ebb5/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484", size = 763361 }, - { url = "https://files.pythonhosted.org/packages/04/24/b7721e4845c2f162d26f50521b825fb061bc0a5afcf9a386840f23ea19fa/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5", size = 759523 }, - { url = "https://files.pythonhosted.org/packages/2b/b2/e3234f59ba06559c6ff63c4e10baea10e5e7df868092bf9ab40e5b9c56b6/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc", size = 726660 }, - { url = "https://files.pythonhosted.org/packages/fe/0f/25911a9f080464c59fab9027482f822b86bf0608957a5fcc6eaac85aa515/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652", size = 751597 }, - { url = "https://files.pythonhosted.org/packages/14/0d/e2c3b43bbce3cf6bd97c840b46088a3031085179e596d4929729d8d68270/PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", size = 140527 }, - { url = "https://files.pythonhosted.org/packages/fa/de/02b54f42487e3d3c6efb3f89428677074ca7bf43aae402517bc7cca949f3/PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", size = 156446 }, -] - -[[package]] -name = "pyyaml-env-tag" -version = "0.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "pyyaml" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/fb/8e/da1c6c58f751b70f8ceb1eb25bc25d524e8f14fe16edcce3f4e3ba08629c/pyyaml_env_tag-0.1.tar.gz", hash = "sha256:70092675bda14fdec33b31ba77e7543de9ddc88f2e5b99160396572d11525bdb", size = 5631 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/5a/66/bbb1dd374f5c870f59c5bb1db0e18cbe7fa739415a24cbd95b2d1f5ae0c4/pyyaml_env_tag-0.1-py3-none-any.whl", hash = "sha256:af31106dec8a4d68c60207c1886031cbf839b68aa7abccdb19868200532c2069", size = 3911 }, -] - -[[package]] -name = "rapidfuzz" -version = "3.9.7" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/17/ac/1f1bf726645d7740df2d1371380e35098bb8a460f482343cba1dd1668ab6/rapidfuzz-3.9.7.tar.gz", hash = "sha256:f1c7296534c1afb6f495aa95871f14ccdc197c6db42965854e483100df313030", size = 1596228 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/18/dd/530be3f5fb7ad43cc8ccce2cb391146602e11b5df1f1e948adfa7bae0802/rapidfuzz-3.9.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d098ce6162eb5e48fceb0745455bc950af059df6113eec83e916c129fca11408", size = 2055425 }, - { url = "https://files.pythonhosted.org/packages/60/e5/c919e2257c8c3ee43155f580bb86682d3b1f16256dc3622ca2e416068d67/rapidfuzz-3.9.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:048d55d36c02c6685a2b2741688503c3d15149694506655b6169dcfd3b6c2585", size = 1510614 }, - { url = "https://files.pythonhosted.org/packages/06/09/efe65f1b01e1778e57b8f29e9f8d39c8203c6022698a246f6c57e8471000/rapidfuzz-3.9.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c33211cfff9aec425bb1bfedaf94afcf337063aa273754f22779d6dadebef4c2", size = 1559939 }, - { url = "https://files.pythonhosted.org/packages/c1/f0/344a41ac82970e0a7b88821f9cfd3b46779db88089c146c9937e4bbfcc6c/rapidfuzz-3.9.7-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e6d9db2fa4e9be171e9bb31cf2d2575574774966b43f5b951062bb2e67885852", size = 5964378 }, - { url = "https://files.pythonhosted.org/packages/83/31/3194dc0262dfa3c3bd585e6aac95af21c78e26981a9b19da08a4fd97adda/rapidfuzz-3.9.7-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d4e049d5ad61448c9a020d1061eba20944c4887d720c4069724beb6ea1692507", size = 1825499 }, - { url = "https://files.pythonhosted.org/packages/e6/3e/ea01677779779819c083580e501aba1773f4fbcd7082fc52f110e73c09f5/rapidfuzz-3.9.7-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cfa74aac64c85898b93d9c80bb935a96bf64985e28d4ee0f1a3d1f3bf11a5106", size = 1830054 }, - { url = "https://files.pythonhosted.org/packages/8a/c4/a06602d0bf830414dd6b458785d868252d6f2cbe1a0a1f57a62cfab1a9ec/rapidfuzz-3.9.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:965693c2e9efd425b0f059f5be50ef830129f82892fa1858e220e424d9d0160f", size = 3384099 }, - { url = "https://files.pythonhosted.org/packages/87/f3/787a2950df7cc23eac5a89b9ee47cf833a9b5759f59b90a50d351467c257/rapidfuzz-3.9.7-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8501000a5eb8037c4b56857724797fe5a8b01853c363de91c8d0d0ad56bef319", size = 2458238 }, - { url = "https://files.pythonhosted.org/packages/41/85/e3531a970ae92dfe8c1c8060920d83ba083f4d56cd0953f444aaa15af9a9/rapidfuzz-3.9.7-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8d92c552c6b7577402afdd547dcf5d31ea6c8ae31ad03f78226e055cfa37f3c6", size = 7239492 }, - { url = "https://files.pythonhosted.org/packages/b3/5f/08d5637681c80c2d5ae20d2f1e5be9e37351e8313359c2a00770efa14be7/rapidfuzz-3.9.7-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:1ee2086f490cb501d86b7e386c1eb4e3a0ccbb0c99067089efaa8c79012c8952", size = 2837408 }, - { url = "https://files.pythonhosted.org/packages/0a/54/6f44905e09fc0136621ffa914737326aa3b6b9b6c24f3565af1c63cf3f3f/rapidfuzz-3.9.7-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:1de91e7fd7f525e10ea79a6e62c559d1b0278ec097ad83d9da378b6fab65a265", size = 3386607 }, - { url = "https://files.pythonhosted.org/packages/77/a3/ac9b99d96a91b5d2ffa920481cbd94fcc73a042aee0b17ba627a146e7199/rapidfuzz-3.9.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a4da514d13f4433e16960a17f05b67e0af30ac771719c9a9fb877e5004f74477", size = 4392097 }, - { url = "https://files.pythonhosted.org/packages/f0/cc/67f959d95e556f1925b4c9211fb7f63c0df60610c28c2c618b48df9ff1d6/rapidfuzz-3.9.7-cp311-cp311-win32.whl", hash = "sha256:a40184c67db8252593ec518e17fb8a6e86d7259dc9f2d6c0bf4ff4db8cf1ad4b", size = 1857658 }, - { url = "https://files.pythonhosted.org/packages/64/d9/c86f7b247b1603cae62d5d39cbc12f5baaeb34e80fd00c7211fe43157a66/rapidfuzz-3.9.7-cp311-cp311-win_amd64.whl", hash = "sha256:c4f28f1930b09a2c300357d8465b388cecb7e8b2f454a5d5425561710b7fd07f", size = 1662871 }, - { url = "https://files.pythonhosted.org/packages/67/43/ca9cda58a08808b891866afecf567f5dd317c72816fe3df50cb87649d625/rapidfuzz-3.9.7-cp311-cp311-win_arm64.whl", hash = "sha256:675b75412a943bb83f1f53e2e54fd18c80ef15ed642dc6eb0382d1949419d904", size = 856548 }, - { url = "https://files.pythonhosted.org/packages/c5/69/3382886cf73774d6b4085e177e665326ee065d806ed775aa61e5d9e5cd8a/rapidfuzz-3.9.7-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:1ef6a1a8f0b12f8722f595f15c62950c9a02d5abc64742561299ffd49f6c6944", size = 2053430 }, - { url = "https://files.pythonhosted.org/packages/33/58/d67551479432be743b9e36eaf46e8ca6a76a8edfeb060137856576836129/rapidfuzz-3.9.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:32532af1d70c6ec02ea5ac7ee2766dfff7c8ae8c761abfe8da9e527314e634e8", size = 1506225 }, - { url = "https://files.pythonhosted.org/packages/f0/d5/294e26070cc5f3ad079c001606f6fcccbd6e0d7e8b58dd1c9d4048971706/rapidfuzz-3.9.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ae1a38bade755aa9dd95a81cda949e1bf9cd92b79341ccc5e2189c9e7bdfc5ec", size = 1542826 }, - { url = "https://files.pythonhosted.org/packages/24/4d/3e7f2afdb4571031e2b122d5d7a029dbc3e98a54d11ef5b20be142dbc688/rapidfuzz-3.9.7-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d73ee2df41224c87336448d279b5b6a3a75f36e41dd3dcf538c0c9cce36360d8", size = 5858829 }, - { url = "https://files.pythonhosted.org/packages/c3/37/71c46506ec0e71a3508fc1ea23a44c34f948b8e21057dd5cc23ebd252267/rapidfuzz-3.9.7-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be3a1fc3e2ab3bdf93dc0c83c00acca8afd2a80602297d96cf4a0ba028333cdf", size = 1794619 }, - { url = "https://files.pythonhosted.org/packages/5b/66/c62120f3d559136eb5d9504d0a1665f3d3ba63f0fe936360a605de8b3a4a/rapidfuzz-3.9.7-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:603f48f621272a448ff58bb556feb4371252a02156593303391f5c3281dfaeac", size = 1818937 }, - { url = "https://files.pythonhosted.org/packages/1e/bf/4717fb73e06c717d25472433420dec570cf8ee283a23529a643eb6317284/rapidfuzz-3.9.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:268f8e1ca50fc61c0736f3fe9d47891424adf62d96ed30196f30f4bd8216b41f", size = 3381291 }, - { url = "https://files.pythonhosted.org/packages/e7/33/d3dce4519a2d2d0c52174780aba6908ecb7c01182d8c3411a30d85849635/rapidfuzz-3.9.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5f8bf3f0d02935751d8660abda6044821a861f6229f7d359f98bcdcc7e66c39b", size = 2425772 }, - { url = "https://files.pythonhosted.org/packages/30/72/0fb88a4e5d500cfc15bcc1d3c854fe53cf6242ba917a0626a615a1f5c579/rapidfuzz-3.9.7-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b997ff3b39d4cee9fb025d6c46b0a24bd67595ce5a5b652a97fb3a9d60beb651", size = 7176976 }, - { url = "https://files.pythonhosted.org/packages/61/21/82acba73a147dd009aef4603da95ff8cbacb644e79f409244ee65fd5a299/rapidfuzz-3.9.7-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:ca66676c8ef6557f9b81c5b2b519097817a7c776a6599b8d6fcc3e16edd216fe", size = 2800261 }, - { url = "https://files.pythonhosted.org/packages/73/3a/edccc360599fe6153472d4f2452cff65dd45422453141504d5002e1ce450/rapidfuzz-3.9.7-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:35d3044cb635ca6b1b2b7b67b3597bd19f34f1753b129eb6d2ae04cf98cd3945", size = 3345108 }, - { url = "https://files.pythonhosted.org/packages/38/00/e7b2656faa7a4ec6760299ab973d37fa9cae6ae91f6e3ca3987577665b99/rapidfuzz-3.9.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5a93c9e60904cb76e7aefef67afffb8b37c4894f81415ed513db090f29d01101", size = 4360023 }, - { url = "https://files.pythonhosted.org/packages/0d/c5/a9ab2e06a6661aa6f3955b478e3c6c6c2ebd9016570d6a34e88f41b4e59f/rapidfuzz-3.9.7-cp312-cp312-win32.whl", hash = "sha256:579d107102c0725f7c79b4e79f16d3cf4d7c9208f29c66b064fa1fd4641d5155", size = 1842729 }, - { url = "https://files.pythonhosted.org/packages/70/e6/4aa3e901452f54c201435da7f61a896daa16dce7899d4aebb856666ddb6b/rapidfuzz-3.9.7-cp312-cp312-win_amd64.whl", hash = "sha256:953b3780765c8846866faf891ee4290f6a41a6dacf4fbcd3926f78c9de412ca6", size = 1655171 }, - { url = "https://files.pythonhosted.org/packages/0d/16/8fadcef053e7658e731e2155ca795279c5159a28035891324f482e4ff6fc/rapidfuzz-3.9.7-cp312-cp312-win_arm64.whl", hash = "sha256:7c20c1474b068c4bd45bf2fd0ad548df284f74e9a14a68b06746c56e3aa8eb70", size = 851234 }, - { url = "https://files.pythonhosted.org/packages/78/5c/7a2f42b4610a1edf23aca94f609bf3390671e3b0e1bb42dab32274699b23/rapidfuzz-3.9.7-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:fde81b1da9a947f931711febe2e2bee694e891f6d3e6aa6bc02c1884702aea19", size = 2026090 }, - { url = "https://files.pythonhosted.org/packages/93/60/9cfaac357675e8459f3360cd300cbb34dfa58061f8ad3acab0b5bf474c6f/rapidfuzz-3.9.7-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:47e92c155a14f44511ea8ebcc6bc1535a1fe8d0a7d67ad3cc47ba61606df7bcf", size = 1499416 }, - { url = "https://files.pythonhosted.org/packages/f2/53/1c2a0a525f709bb0cb0891c51d914a08e8f1e2f66078d43c17586f43610a/rapidfuzz-3.9.7-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8772b745668260c5c4d069c678bbaa68812e6c69830f3771eaad521af7bc17f8", size = 1537254 }, - { url = "https://files.pythonhosted.org/packages/cc/0e/4c7e85cc9f10ea005c3695af3f6ba47e5796fbe28a7700170cb09b266156/rapidfuzz-3.9.7-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:578302828dd97ee2ba507d2f71d62164e28d2fc7bc73aad0d2d1d2afc021a5d5", size = 5877170 }, - { url = "https://files.pythonhosted.org/packages/07/71/548af38b262bc4494266a7e26250e22ebd686203b5c9269e2878383b34fc/rapidfuzz-3.9.7-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fc3e6081069eea61593f1d6839029da53d00c8c9b205c5534853eaa3f031085c", size = 1766905 }, - { url = "https://files.pythonhosted.org/packages/9c/ef/96159e7e0236efe9ffb78d7b02cee1b6a02dede9c23ede56ae4454031348/rapidfuzz-3.9.7-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0b1c2d504eddf97bc0f2eba422c8915576dbf025062ceaca2d68aecd66324ad9", size = 1819869 }, - { url = "https://files.pythonhosted.org/packages/75/8d/73d521da17f32ad389e8593f9d3d5df06b889ed2d261ca5a5bed657a13e8/rapidfuzz-3.9.7-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fb76e5a21034f0307c51c5a2fc08856f698c53a4c593b17d291f7d6e9d09ca3", size = 3361102 }, - { url = "https://files.pythonhosted.org/packages/3a/bc/394837f81c377aad90cc6d5e0fa138da91101a63cac31b31f2ca85a65c7c/rapidfuzz-3.9.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d4ba2318ef670ce505f42881a5d2af70f948124646947341a3c6ccb33cd70369", size = 2421346 }, - { url = "https://files.pythonhosted.org/packages/96/fa/daf98b62dc5e6b6e094d6d17f0b23340463f1b4c9e556249103acba4ee7c/rapidfuzz-3.9.7-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:057bb03f39e285047d7e9412e01ecf31bb2d42b9466a5409d715d587460dd59b", size = 7190698 }, - { url = "https://files.pythonhosted.org/packages/dc/da/d548faf4d8cf14c0c58bd2ea91d27d3f0137dd2a7973eece7a561e0b9a2c/rapidfuzz-3.9.7-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:a8feac9006d5c9758438906f093befffc4290de75663dbb2098461df7c7d28dd", size = 2791263 }, - { url = "https://files.pythonhosted.org/packages/35/17/5cb93655581eccf105c006c3d1918e9e7f359df6b2dbe0fbb012e4a4a4cd/rapidfuzz-3.9.7-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:95b8292383e717e10455f2c917df45032b611141e43d1adf70f71b1566136b11", size = 3341012 }, - { url = "https://files.pythonhosted.org/packages/a5/77/3486e011a9977ca5f070469f1ff38c7e38877e5ca4299368c85af48e1189/rapidfuzz-3.9.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e9fbf659537d246086d0297628b3795dc3e4a384101ecc01e5791c827b8d7345", size = 4355424 }, - { url = "https://files.pythonhosted.org/packages/6d/c7/a4add18324590be9cf311763baf0b3afe24a3065f54604052e6141161a45/rapidfuzz-3.9.7-cp313-cp313-win32.whl", hash = "sha256:1dc516ac6d32027be2b0196bedf6d977ac26debd09ca182376322ad620460feb", size = 1840822 }, - { url = "https://files.pythonhosted.org/packages/6e/3c/cc468b42740bb77dc94dd92cd29cf18ea4301a6f0cea3663d3291d97800a/rapidfuzz-3.9.7-cp313-cp313-win_amd64.whl", hash = "sha256:b4f86e09d3064dca0b014cd48688964036a904a2d28048f00c8f4640796d06a8", size = 1652011 }, - { url = "https://files.pythonhosted.org/packages/96/c7/b1fbae97a9e53ae833d477653bf5ab095b14338da0e79db4ae4bbf985ebb/rapidfuzz-3.9.7-cp313-cp313-win_arm64.whl", hash = "sha256:19c64d8ddb2940b42a4567b23f1681af77f50a5ff6c9b8e85daba079c210716e", size = 850094 }, -] - -[[package]] -name = "red-commons" -version = "1.0.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/26/a9/de9bad2793856dfdc7dca87b306bed42f04dbcf703e21093b30980325ca5/Red-Commons-1.0.0.tar.gz", hash = "sha256:b9bcc55c72801c33eb0c77aaf48041d018bfb5f1293053cff8a3e10e4d33e52d", size = 2898 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/39/7a/4afb80e4aa69fec9736159d2571db76e3546c6e3b4e8deefe0e55114526c/red_commons-1.0.0-py3-none-any.whl", hash = "sha256:7007b70abfe8e2c9a8e03f8b60810ab1201c4d8274974e0c3842d972cb25af44", size = 3531 }, -] - -[[package]] -name = "red-discordbot" -version = "3.5.18" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "aiohttp" }, - { name = "aiohttp-json-rpc" }, - { name = "aiosignal" }, - { name = "apsw" }, - { name = "async-timeout", marker = "python_full_version >= '3.12'" }, - { name = "attrs" }, - { name = "babel" }, - { name = "brotli" }, - { name = "click" }, - { name = "colorama", marker = "sys_platform == 'win32'" }, - { name = "discord-py" }, - { name = "distro", marker = "sys_platform == 'linux'" }, - { name = "frozenlist" }, - { name = "idna" }, - { name = "importlib-metadata", marker = "python_full_version >= '3.12'" }, - { name = "markdown" }, - { name = "markdown-it-py" }, - { name = "mdurl" }, - { name = "multidict" }, - { name = "orjson" }, - { name = "packaging" }, - { name = "platformdirs" }, - { name = "propcache" }, - { name = "psutil" }, - { name = "pygments" }, - { name = "python-dateutil" }, - { name = "pyyaml" }, - { name = "rapidfuzz" }, - { name = "red-commons" }, - { name = "red-lavalink" }, - { name = "rich" }, - { name = "schema" }, - { name = "six" }, - { name = "typing-extensions" }, - { name = "uvloop", marker = "platform_python_implementation == 'CPython' and sys_platform != 'win32'" }, - { name = "yarl" }, - { name = "zipp", marker = "python_full_version >= '3.12'" }, - { name = "zstandard" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/da/49/8926e62a2185699fa08c138181f49cb21c4bdeb6b2833c8b168aa34dc1b0/red_discordbot-3.5.18.tar.gz", hash = "sha256:bf760a35c54b57bd51f6d03eba66e77d8cedc58da0f59fc3243b0a1ed359523c", size = 3735416 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/84/8f/bf3bba7fde1146564053e4131f72c2fc439221732e634f700623787a11ab/red_discordbot-3.5.18-py3-none-any.whl", hash = "sha256:51048b356003bffc17057a705d6eced538b997f770f4401731af7e0fccd8e7a3", size = 5883303 }, -] - -[[package]] -name = "red-lavalink" -version = "0.11.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "aiohttp" }, - { name = "discord-py" }, - { name = "red-commons" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/6d/66/b05f3661afbc22d7af10827eaf68e5da5076d73ad0c3f7028acb8bf40bfd/Red-Lavalink-0.11.0.tar.gz", hash = "sha256:6ee2671dfc43a96b7e6be4effaa4137024de51bc5681f64a67c125bc3b7d4f99", size = 33992 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/20/01/748c284bd03e788ac2c6cf2c58f19b4d1e3ad96dae36b21e289f1bc6c5e5/Red_Lavalink-0.11.0-py3-none-any.whl", hash = "sha256:f76329eee2ec5e4d77e0e97fe6ba76207efdcc8d963a9c39913cf91057d7920a", size = 36060 }, -] - -[[package]] -name = "requests" -version = "2.32.3" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "certifi" }, - { name = "charset-normalizer" }, - { name = "idna" }, - { name = "urllib3" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/63/70/2bf7780ad2d390a8d301ad0b550f1581eadbd9a20f896afe06353c2a2913/requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", size = 131218 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", size = 64928 }, -] - -[[package]] -name = "rich" -version = "13.9.4" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "markdown-it-py" }, - { name = "pygments" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/ab/3a/0316b28d0761c6734d6bc14e770d85506c986c85ffb239e688eeaab2c2bc/rich-13.9.4.tar.gz", hash = "sha256:439594978a49a09530cff7ebc4b5c7103ef57baf48d5ea3184f21d9a2befa098", size = 223149 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/19/71/39c7c0d87f8d4e6c020a393182060eaefeeae6c01dab6a84ec346f2567df/rich-13.9.4-py3-none-any.whl", hash = "sha256:6049d5e6ec054bf2779ab3358186963bac2ea89175919d699e378b99738c2a90", size = 242424 }, -] - -[[package]] -name = "ruff" -version = "0.11.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/90/61/fb87430f040e4e577e784e325351186976516faef17d6fcd921fe28edfd7/ruff-0.11.2.tar.gz", hash = "sha256:ec47591497d5a1050175bdf4e1a4e6272cddff7da88a2ad595e1e326041d8d94", size = 3857511 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/62/99/102578506f0f5fa29fd7e0df0a273864f79af044757aef73d1cae0afe6ad/ruff-0.11.2-py3-none-linux_armv6l.whl", hash = "sha256:c69e20ea49e973f3afec2c06376eb56045709f0212615c1adb0eda35e8a4e477", size = 10113146 }, - { url = "https://files.pythonhosted.org/packages/74/ad/5cd4ba58ab602a579997a8494b96f10f316e874d7c435bcc1a92e6da1b12/ruff-0.11.2-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:2c5424cc1c4eb1d8ecabe6d4f1b70470b4f24a0c0171356290b1953ad8f0e272", size = 10867092 }, - { url = "https://files.pythonhosted.org/packages/fc/3e/d3f13619e1d152c7b600a38c1a035e833e794c6625c9a6cea6f63dbf3af4/ruff-0.11.2-py3-none-macosx_11_0_arm64.whl", hash = "sha256:ecf20854cc73f42171eedb66f006a43d0a21bfb98a2523a809931cda569552d9", size = 10224082 }, - { url = "https://files.pythonhosted.org/packages/90/06/f77b3d790d24a93f38e3806216f263974909888fd1e826717c3ec956bbcd/ruff-0.11.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0c543bf65d5d27240321604cee0633a70c6c25c9a2f2492efa9f6d4b8e4199bb", size = 10394818 }, - { url = "https://files.pythonhosted.org/packages/99/7f/78aa431d3ddebfc2418cd95b786642557ba8b3cb578c075239da9ce97ff9/ruff-0.11.2-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:20967168cc21195db5830b9224be0e964cc9c8ecf3b5a9e3ce19876e8d3a96e3", size = 9952251 }, - { url = "https://files.pythonhosted.org/packages/30/3e/f11186d1ddfaca438c3bbff73c6a2fdb5b60e6450cc466129c694b0ab7a2/ruff-0.11.2-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:955a9ce63483999d9f0b8f0b4a3ad669e53484232853054cc8b9d51ab4c5de74", size = 11563566 }, - { url = "https://files.pythonhosted.org/packages/22/6c/6ca91befbc0a6539ee133d9a9ce60b1a354db12c3c5d11cfdbf77140f851/ruff-0.11.2-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:86b3a27c38b8fce73bcd262b0de32e9a6801b76d52cdb3ae4c914515f0cef608", size = 12208721 }, - { url = "https://files.pythonhosted.org/packages/19/b0/24516a3b850d55b17c03fc399b681c6a549d06ce665915721dc5d6458a5c/ruff-0.11.2-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a3b66a03b248c9fcd9d64d445bafdf1589326bee6fc5c8e92d7562e58883e30f", size = 11662274 }, - { url = "https://files.pythonhosted.org/packages/d7/65/76be06d28ecb7c6070280cef2bcb20c98fbf99ff60b1c57d2fb9b8771348/ruff-0.11.2-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0397c2672db015be5aa3d4dac54c69aa012429097ff219392c018e21f5085147", size = 13792284 }, - { url = "https://files.pythonhosted.org/packages/ce/d2/4ceed7147e05852876f3b5f3fdc23f878ce2b7e0b90dd6e698bda3d20787/ruff-0.11.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:869bcf3f9abf6457fbe39b5a37333aa4eecc52a3b99c98827ccc371a8e5b6f1b", size = 11327861 }, - { url = "https://files.pythonhosted.org/packages/c4/78/4935ecba13706fd60ebe0e3dc50371f2bdc3d9bc80e68adc32ff93914534/ruff-0.11.2-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:2a2b50ca35457ba785cd8c93ebbe529467594087b527a08d487cf0ee7b3087e9", size = 10276560 }, - { url = "https://files.pythonhosted.org/packages/81/7f/1b2435c3f5245d410bb5dc80f13ec796454c21fbda12b77d7588d5cf4e29/ruff-0.11.2-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:7c69c74bf53ddcfbc22e6eb2f31211df7f65054bfc1f72288fc71e5f82db3eab", size = 9945091 }, - { url = "https://files.pythonhosted.org/packages/39/c4/692284c07e6bf2b31d82bb8c32f8840f9d0627d92983edaac991a2b66c0a/ruff-0.11.2-py3-none-musllinux_1_2_i686.whl", hash = "sha256:6e8fb75e14560f7cf53b15bbc55baf5ecbe373dd5f3aab96ff7aa7777edd7630", size = 10977133 }, - { url = "https://files.pythonhosted.org/packages/94/cf/8ab81cb7dd7a3b0a3960c2769825038f3adcd75faf46dd6376086df8b128/ruff-0.11.2-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:842a472d7b4d6f5924e9297aa38149e5dcb1e628773b70e6387ae2c97a63c58f", size = 11378514 }, - { url = "https://files.pythonhosted.org/packages/d9/3a/a647fa4f316482dacf2fd68e8a386327a33d6eabd8eb2f9a0c3d291ec549/ruff-0.11.2-py3-none-win32.whl", hash = "sha256:aca01ccd0eb5eb7156b324cfaa088586f06a86d9e5314b0eb330cb48415097cc", size = 10319835 }, - { url = "https://files.pythonhosted.org/packages/86/54/3c12d3af58012a5e2cd7ebdbe9983f4834af3f8cbea0e8a8c74fa1e23b2b/ruff-0.11.2-py3-none-win_amd64.whl", hash = "sha256:3170150172a8f994136c0c66f494edf199a0bbea7a409f649e4bc8f4d7084080", size = 11373713 }, - { url = "https://files.pythonhosted.org/packages/d6/d4/dd813703af8a1e2ac33bf3feb27e8a5ad514c9f219df80c64d69807e7f71/ruff-0.11.2-py3-none-win_arm64.whl", hash = "sha256:52933095158ff328f4c77af3d74f0379e34fd52f175144cefc1b192e7ccd32b4", size = 10441990 }, -] - -[[package]] -name = "schema" -version = "0.7.7" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d4/01/0ea2e66bad2f13271e93b729c653747614784d3ebde219679e41ccdceecd/schema-0.7.7.tar.gz", hash = "sha256:7da553abd2958a19dc2547c388cde53398b39196175a9be59ea1caf5ab0a1807", size = 44245 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ad/1b/81855a88c6db2b114d5b2e9f96339190d5ee4d1b981d217fa32127bb00e0/schema-0.7.7-py2.py3-none-any.whl", hash = "sha256:5d976a5b50f36e74e2157b47097b60002bd4d42e65425fcc9c9befadb4255dde", size = 18632 }, -] - -[[package]] -name = "seacogs" -version = "0.1.0" -source = { virtual = "." } -dependencies = [ - { name = "aiosqlite" }, - { name = "beautifulsoup4" }, - { name = "colorthief" }, - { name = "markdownify" }, - { name = "numpy" }, - { name = "phx-class-registry" }, - { name = "pillow" }, - { name = "pip" }, - { name = "py-dactyl" }, - { name = "pydantic" }, - { name = "red-discordbot" }, - { name = "watchdog" }, - { name = "websockets" }, -] - -[package.dev-dependencies] -dev = [ - { name = "pylint" }, - { name = "ruff" }, - { name = "sqlite-web" }, -] -documentation = [ - { name = "mkdocs" }, - { name = "mkdocs-git-authors-plugin" }, - { name = "mkdocs-git-revision-date-localized-plugin" }, - { name = "mkdocs-material", extra = ["imaging"] }, - { name = "mkdocs-redirects" }, - { name = "mkdocstrings", extra = ["python"] }, -] - -[package.metadata] -requires-dist = [ - { name = "aiosqlite", specifier = "==0.21.0" }, - { name = "beautifulsoup4", specifier = "==4.13.3" }, - { name = "colorthief", specifier = "==0.2.1" }, - { name = "markdownify", specifier = "==1.1.0" }, - { name = "numpy", specifier = "==2.2.4" }, - { name = "phx-class-registry", specifier = "==5.1.1" }, - { name = "pillow", specifier = "==10.4.0" }, - { name = "pip", specifier = "==25.0.1" }, - { name = "py-dactyl", git = "https://github.com/iamkubi/pydactyl?tag=v2.0.5" }, - { name = "pydantic", specifier = "==2.11.1" }, - { name = "red-discordbot", specifier = "==3.5.18" }, - { name = "watchdog", specifier = "==6.0.0" }, - { name = "websockets", specifier = "==15.0.1" }, -] - -[package.metadata.requires-dev] -dev = [ - { name = "pylint", specifier = "==3.3.6" }, - { name = "ruff", specifier = "==0.11.2" }, - { name = "sqlite-web", specifier = "==0.6.4" }, -] -documentation = [ - { name = "mkdocs", specifier = "==1.6.1" }, - { name = "mkdocs-git-authors-plugin", specifier = "==0.9.4" }, - { name = "mkdocs-git-revision-date-localized-plugin", specifier = "==1.4.5" }, - { name = "mkdocs-material", extras = ["imaging"], specifier = "==9.6.10" }, - { name = "mkdocs-redirects", specifier = "==1.2.2" }, - { name = "mkdocstrings", extras = ["python"], specifier = "==0.29.0" }, -] - -[[package]] -name = "six" -version = "1.17.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050 }, -] - -[[package]] -name = "smmap" -version = "5.0.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/44/cd/a040c4b3119bbe532e5b0732286f805445375489fceaec1f48306068ee3b/smmap-5.0.2.tar.gz", hash = "sha256:26ea65a03958fa0c8a1c7e8c7a58fdc77221b8910f6be2131affade476898ad5", size = 22329 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/04/be/d09147ad1ec7934636ad912901c5fd7667e1c858e19d355237db0d0cd5e4/smmap-5.0.2-py3-none-any.whl", hash = "sha256:b30115f0def7d7531d22a0fb6502488d879e75b260a9db4d0819cfb25403af5e", size = 24303 }, -] - -[[package]] -name = "soupsieve" -version = "2.6" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d7/ce/fbaeed4f9fb8b2daa961f90591662df6a86c1abf25c548329a86920aedfb/soupsieve-2.6.tar.gz", hash = "sha256:e2e68417777af359ec65daac1057404a3c8a5455bb8abc36f1a9866ab1a51abb", size = 101569 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d1/c2/fe97d779f3ef3b15f05c94a2f1e3d21732574ed441687474db9d342a7315/soupsieve-2.6-py3-none-any.whl", hash = "sha256:e72c4ff06e4fb6e4b5a9f0f55fe6e81514581fca1515028625d0f299c602ccc9", size = 36186 }, -] - -[[package]] -name = "sqlite-web" -version = "0.6.4" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "flask" }, - { name = "peewee" }, - { name = "pygments" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/7e/ee/6748afd822a2cc26f40cf2917350be0fbaa6a57bbb0e85dc75a1e098d82c/sqlite-web-0.6.4.tar.gz", hash = "sha256:e4175dd42f4cdc78ef7c329d56f19243efc8d088a6bdfd4c6703e89d18aac2a5", size = 807634 } - -[[package]] -name = "tinycss2" -version = "1.4.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "webencodings" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/7a/fd/7a5ee21fd08ff70d3d33a5781c255cbe779659bd03278feb98b19ee550f4/tinycss2-1.4.0.tar.gz", hash = "sha256:10c0972f6fc0fbee87c3edb76549357415e94548c1ae10ebccdea16fb404a9b7", size = 87085 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl", hash = "sha256:3a49cf47b7675da0b15d0c6e1df8df4ebd96e9394bb905a5775adb0d884c5289", size = 26610 }, -] - -[[package]] -name = "tomlkit" -version = "0.13.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b1/09/a439bec5888f00a54b8b9f05fa94d7f901d6735ef4e55dcec9bc37b5d8fa/tomlkit-0.13.2.tar.gz", hash = "sha256:fff5fe59a87295b278abd31bec92c15d9bc4a06885ab12bcea52c71119392e79", size = 192885 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f9/b6/a447b5e4ec71e13871be01ba81f5dfc9d0af7e473da256ff46bc0e24026f/tomlkit-0.13.2-py3-none-any.whl", hash = "sha256:7a974427f6e119197f670fbbbeae7bef749a6c14e793db934baefc1b5f03efde", size = 37955 }, -] - -[[package]] -name = "typing-extensions" -version = "4.13.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/0e/3e/b00a62db91a83fff600de219b6ea9908e6918664899a2d85db222f4fbf19/typing_extensions-4.13.0.tar.gz", hash = "sha256:0a4ac55a5820789d87e297727d229866c9650f6521b64206413c4fbada24d95b", size = 106520 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e0/86/39b65d676ec5732de17b7e3c476e45bb80ec64eb50737a8dce1a4178aba1/typing_extensions-4.13.0-py3-none-any.whl", hash = "sha256:c8dd92cc0d6425a97c18fbb9d1954e5ff92c1ca881a309c45f06ebc0b79058e5", size = 45683 }, -] - -[[package]] -name = "typing-inspection" -version = "0.4.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/82/5c/e6082df02e215b846b4b8c0b887a64d7d08ffaba30605502639d44c06b82/typing_inspection-0.4.0.tar.gz", hash = "sha256:9765c87de36671694a67904bf2c96e395be9c6439bb6c87b5142569dcdd65122", size = 76222 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/31/08/aa4fdfb71f7de5176385bd9e90852eaf6b5d622735020ad600f2bab54385/typing_inspection-0.4.0-py3-none-any.whl", hash = "sha256:50e72559fcd2a6367a19f7a7e610e6afcb9fac940c650290eed893d61386832f", size = 14125 }, -] - -[[package]] -name = "urllib3" -version = "2.3.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/aa/63/e53da845320b757bf29ef6a9062f5c669fe997973f966045cb019c3f4b66/urllib3-2.3.0.tar.gz", hash = "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d", size = 307268 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c8/19/4ec628951a74043532ca2cf5d97b7b14863931476d117c471e8e2b1eb39f/urllib3-2.3.0-py3-none-any.whl", hash = "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df", size = 128369 }, -] - -[[package]] -name = "uvloop" -version = "0.21.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/af/c0/854216d09d33c543f12a44b393c402e89a920b1a0a7dc634c42de91b9cf6/uvloop-0.21.0.tar.gz", hash = "sha256:3bf12b0fda68447806a7ad847bfa591613177275d35b6724b1ee573faa3704e3", size = 2492741 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/57/a7/4cf0334105c1160dd6819f3297f8700fda7fc30ab4f61fbf3e725acbc7cc/uvloop-0.21.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c0f3fa6200b3108919f8bdabb9a7f87f20e7097ea3c543754cabc7d717d95cf8", size = 1447410 }, - { url = "https://files.pythonhosted.org/packages/8c/7c/1517b0bbc2dbe784b563d6ab54f2ef88c890fdad77232c98ed490aa07132/uvloop-0.21.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0878c2640cf341b269b7e128b1a5fed890adc4455513ca710d77d5e93aa6d6a0", size = 805476 }, - { url = "https://files.pythonhosted.org/packages/ee/ea/0bfae1aceb82a503f358d8d2fa126ca9dbdb2ba9c7866974faec1cb5875c/uvloop-0.21.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9fb766bb57b7388745d8bcc53a359b116b8a04c83a2288069809d2b3466c37e", size = 3960855 }, - { url = "https://files.pythonhosted.org/packages/8a/ca/0864176a649838b838f36d44bf31c451597ab363b60dc9e09c9630619d41/uvloop-0.21.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a375441696e2eda1c43c44ccb66e04d61ceeffcd76e4929e527b7fa401b90fb", size = 3973185 }, - { url = "https://files.pythonhosted.org/packages/30/bf/08ad29979a936d63787ba47a540de2132169f140d54aa25bc8c3df3e67f4/uvloop-0.21.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:baa0e6291d91649c6ba4ed4b2f982f9fa165b5bbd50a9e203c416a2797bab3c6", size = 3820256 }, - { url = "https://files.pythonhosted.org/packages/da/e2/5cf6ef37e3daf2f06e651aae5ea108ad30df3cb269102678b61ebf1fdf42/uvloop-0.21.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4509360fcc4c3bd2c70d87573ad472de40c13387f5fda8cb58350a1d7475e58d", size = 3937323 }, - { url = "https://files.pythonhosted.org/packages/8c/4c/03f93178830dc7ce8b4cdee1d36770d2f5ebb6f3d37d354e061eefc73545/uvloop-0.21.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:359ec2c888397b9e592a889c4d72ba3d6befba8b2bb01743f72fffbde663b59c", size = 1471284 }, - { url = "https://files.pythonhosted.org/packages/43/3e/92c03f4d05e50f09251bd8b2b2b584a2a7f8fe600008bcc4523337abe676/uvloop-0.21.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f7089d2dc73179ce5ac255bdf37c236a9f914b264825fdaacaded6990a7fb4c2", size = 821349 }, - { url = "https://files.pythonhosted.org/packages/a6/ef/a02ec5da49909dbbfb1fd205a9a1ac4e88ea92dcae885e7c961847cd51e2/uvloop-0.21.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:baa4dcdbd9ae0a372f2167a207cd98c9f9a1ea1188a8a526431eef2f8116cc8d", size = 4580089 }, - { url = "https://files.pythonhosted.org/packages/06/a7/b4e6a19925c900be9f98bec0a75e6e8f79bb53bdeb891916609ab3958967/uvloop-0.21.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86975dca1c773a2c9864f4c52c5a55631038e387b47eaf56210f873887b6c8dc", size = 4693770 }, - { url = "https://files.pythonhosted.org/packages/ce/0c/f07435a18a4b94ce6bd0677d8319cd3de61f3a9eeb1e5f8ab4e8b5edfcb3/uvloop-0.21.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:461d9ae6660fbbafedd07559c6a2e57cd553b34b0065b6550685f6653a98c1cb", size = 4451321 }, - { url = "https://files.pythonhosted.org/packages/8f/eb/f7032be105877bcf924709c97b1bf3b90255b4ec251f9340cef912559f28/uvloop-0.21.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:183aef7c8730e54c9a3ee3227464daed66e37ba13040bb3f350bc2ddc040f22f", size = 4659022 }, - { url = "https://files.pythonhosted.org/packages/3f/8d/2cbef610ca21539f0f36e2b34da49302029e7c9f09acef0b1c3b5839412b/uvloop-0.21.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:bfd55dfcc2a512316e65f16e503e9e450cab148ef11df4e4e679b5e8253a5281", size = 1468123 }, - { url = "https://files.pythonhosted.org/packages/93/0d/b0038d5a469f94ed8f2b2fce2434a18396d8fbfb5da85a0a9781ebbdec14/uvloop-0.21.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:787ae31ad8a2856fc4e7c095341cccc7209bd657d0e71ad0dc2ea83c4a6fa8af", size = 819325 }, - { url = "https://files.pythonhosted.org/packages/50/94/0a687f39e78c4c1e02e3272c6b2ccdb4e0085fda3b8352fecd0410ccf915/uvloop-0.21.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ee4d4ef48036ff6e5cfffb09dd192c7a5027153948d85b8da7ff705065bacc6", size = 4582806 }, - { url = "https://files.pythonhosted.org/packages/d2/19/f5b78616566ea68edd42aacaf645adbf71fbd83fc52281fba555dc27e3f1/uvloop-0.21.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3df876acd7ec037a3d005b3ab85a7e4110422e4d9c1571d4fc89b0fc41b6816", size = 4701068 }, - { url = "https://files.pythonhosted.org/packages/47/57/66f061ee118f413cd22a656de622925097170b9380b30091b78ea0c6ea75/uvloop-0.21.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bd53ecc9a0f3d87ab847503c2e1552b690362e005ab54e8a48ba97da3924c0dc", size = 4454428 }, - { url = "https://files.pythonhosted.org/packages/63/9a/0962b05b308494e3202d3f794a6e85abe471fe3cafdbcf95c2e8c713aabd/uvloop-0.21.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a5c39f217ab3c663dc699c04cbd50c13813e31d917642d459fdcec07555cc553", size = 4660018 }, -] - -[[package]] -name = "watchdog" -version = "6.0.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/db/7d/7f3d619e951c88ed75c6037b246ddcf2d322812ee8ea189be89511721d54/watchdog-6.0.0.tar.gz", hash = "sha256:9ddf7c82fda3ae8e24decda1338ede66e1c99883db93711d8fb941eaa2d8c282", size = 131220 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e0/24/d9be5cd6642a6aa68352ded4b4b10fb0d7889cb7f45814fb92cecd35f101/watchdog-6.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6eb11feb5a0d452ee41f824e271ca311a09e250441c262ca2fd7ebcf2461a06c", size = 96393 }, - { url = "https://files.pythonhosted.org/packages/63/7a/6013b0d8dbc56adca7fdd4f0beed381c59f6752341b12fa0886fa7afc78b/watchdog-6.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ef810fbf7b781a5a593894e4f439773830bdecb885e6880d957d5b9382a960d2", size = 88392 }, - { url = "https://files.pythonhosted.org/packages/d1/40/b75381494851556de56281e053700e46bff5b37bf4c7267e858640af5a7f/watchdog-6.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:afd0fe1b2270917c5e23c2a65ce50c2a4abb63daafb0d419fde368e272a76b7c", size = 89019 }, - { url = "https://files.pythonhosted.org/packages/39/ea/3930d07dafc9e286ed356a679aa02d777c06e9bfd1164fa7c19c288a5483/watchdog-6.0.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:bdd4e6f14b8b18c334febb9c4425a878a2ac20efd1e0b231978e7b150f92a948", size = 96471 }, - { url = "https://files.pythonhosted.org/packages/12/87/48361531f70b1f87928b045df868a9fd4e253d9ae087fa4cf3f7113be363/watchdog-6.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c7c15dda13c4eb00d6fb6fc508b3c0ed88b9d5d374056b239c4ad1611125c860", size = 88449 }, - { url = "https://files.pythonhosted.org/packages/5b/7e/8f322f5e600812e6f9a31b75d242631068ca8f4ef0582dd3ae6e72daecc8/watchdog-6.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6f10cb2d5902447c7d0da897e2c6768bca89174d0c6e1e30abec5421af97a5b0", size = 89054 }, - { url = "https://files.pythonhosted.org/packages/68/98/b0345cabdce2041a01293ba483333582891a3bd5769b08eceb0d406056ef/watchdog-6.0.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:490ab2ef84f11129844c23fb14ecf30ef3d8a6abafd3754a6f75ca1e6654136c", size = 96480 }, - { url = "https://files.pythonhosted.org/packages/85/83/cdf13902c626b28eedef7ec4f10745c52aad8a8fe7eb04ed7b1f111ca20e/watchdog-6.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:76aae96b00ae814b181bb25b1b98076d5fc84e8a53cd8885a318b42b6d3a5134", size = 88451 }, - { url = "https://files.pythonhosted.org/packages/fe/c4/225c87bae08c8b9ec99030cd48ae9c4eca050a59bf5c2255853e18c87b50/watchdog-6.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a175f755fc2279e0b7312c0035d52e27211a5bc39719dd529625b1930917345b", size = 89057 }, - { url = "https://files.pythonhosted.org/packages/a9/c7/ca4bf3e518cb57a686b2feb4f55a1892fd9a3dd13f470fca14e00f80ea36/watchdog-6.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:7607498efa04a3542ae3e05e64da8202e58159aa1fa4acddf7678d34a35d4f13", size = 79079 }, - { url = "https://files.pythonhosted.org/packages/5c/51/d46dc9332f9a647593c947b4b88e2381c8dfc0942d15b8edc0310fa4abb1/watchdog-6.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:9041567ee8953024c83343288ccc458fd0a2d811d6a0fd68c4c22609e3490379", size = 79078 }, - { url = "https://files.pythonhosted.org/packages/d4/57/04edbf5e169cd318d5f07b4766fee38e825d64b6913ca157ca32d1a42267/watchdog-6.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:82dc3e3143c7e38ec49d61af98d6558288c415eac98486a5c581726e0737c00e", size = 79076 }, - { url = "https://files.pythonhosted.org/packages/ab/cc/da8422b300e13cb187d2203f20b9253e91058aaf7db65b74142013478e66/watchdog-6.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:212ac9b8bf1161dc91bd09c048048a95ca3a4c4f5e5d4a7d1b1a7d5752a7f96f", size = 79077 }, - { url = "https://files.pythonhosted.org/packages/2c/3b/b8964e04ae1a025c44ba8e4291f86e97fac443bca31de8bd98d3263d2fcf/watchdog-6.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:e3df4cbb9a450c6d49318f6d14f4bbc80d763fa587ba46ec86f99f9e6876bb26", size = 79078 }, - { url = "https://files.pythonhosted.org/packages/62/ae/a696eb424bedff7407801c257d4b1afda455fe40821a2be430e173660e81/watchdog-6.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:2cce7cfc2008eb51feb6aab51251fd79b85d9894e98ba847408f662b3395ca3c", size = 79077 }, - { url = "https://files.pythonhosted.org/packages/b5/e8/dbf020b4d98251a9860752a094d09a65e1b436ad181faf929983f697048f/watchdog-6.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:20ffe5b202af80ab4266dcd3e91aae72bf2da48c0d33bdb15c66658e685e94e2", size = 79078 }, - { url = "https://files.pythonhosted.org/packages/07/f6/d0e5b343768e8bcb4cda79f0f2f55051bf26177ecd5651f84c07567461cf/watchdog-6.0.0-py3-none-win32.whl", hash = "sha256:07df1fdd701c5d4c8e55ef6cf55b8f0120fe1aef7ef39a1c6fc6bc2e606d517a", size = 79065 }, - { url = "https://files.pythonhosted.org/packages/db/d9/c495884c6e548fce18a8f40568ff120bc3a4b7b99813081c8ac0c936fa64/watchdog-6.0.0-py3-none-win_amd64.whl", hash = "sha256:cbafb470cf848d93b5d013e2ecb245d4aa1c8fd0504e863ccefa32445359d680", size = 79070 }, - { url = "https://files.pythonhosted.org/packages/33/e8/e40370e6d74ddba47f002a32919d91310d6074130fe4e17dabcafc15cbf1/watchdog-6.0.0-py3-none-win_ia64.whl", hash = "sha256:a1914259fa9e1454315171103c6a30961236f508b9b623eae470268bbcc6a22f", size = 79067 }, -] - -[[package]] -name = "webencodings" -version = "0.5.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/0b/02/ae6ceac1baeda530866a85075641cec12989bd8d31af6d5ab4a3e8c92f47/webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923", size = 9721 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78", size = 11774 }, -] - -[[package]] -name = "websockets" -version = "15.0.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/21/e6/26d09fab466b7ca9c7737474c52be4f76a40301b08362eb2dbc19dcc16c1/websockets-15.0.1.tar.gz", hash = "sha256:82544de02076bafba038ce055ee6412d68da13ab47f0c60cab827346de828dee", size = 177016 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/9f/32/18fcd5919c293a398db67443acd33fde142f283853076049824fc58e6f75/websockets-15.0.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:823c248b690b2fd9303ba00c4f66cd5e2d8c3ba4aa968b2779be9532a4dad431", size = 175423 }, - { url = "https://files.pythonhosted.org/packages/76/70/ba1ad96b07869275ef42e2ce21f07a5b0148936688c2baf7e4a1f60d5058/websockets-15.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678999709e68425ae2593acf2e3ebcbcf2e69885a5ee78f9eb80e6e371f1bf57", size = 173082 }, - { url = "https://files.pythonhosted.org/packages/86/f2/10b55821dd40eb696ce4704a87d57774696f9451108cff0d2824c97e0f97/websockets-15.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d50fd1ee42388dcfb2b3676132c78116490976f1300da28eb629272d5d93e905", size = 173330 }, - { url = "https://files.pythonhosted.org/packages/a5/90/1c37ae8b8a113d3daf1065222b6af61cc44102da95388ac0018fcb7d93d9/websockets-15.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d99e5546bf73dbad5bf3547174cd6cb8ba7273062a23808ffea025ecb1cf8562", size = 182878 }, - { url = "https://files.pythonhosted.org/packages/8e/8d/96e8e288b2a41dffafb78e8904ea7367ee4f891dafc2ab8d87e2124cb3d3/websockets-15.0.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:66dd88c918e3287efc22409d426c8f729688d89a0c587c88971a0faa2c2f3792", size = 181883 }, - { url = "https://files.pythonhosted.org/packages/93/1f/5d6dbf551766308f6f50f8baf8e9860be6182911e8106da7a7f73785f4c4/websockets-15.0.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8dd8327c795b3e3f219760fa603dcae1dcc148172290a8ab15158cf85a953413", size = 182252 }, - { url = "https://files.pythonhosted.org/packages/d4/78/2d4fed9123e6620cbf1706c0de8a1632e1a28e7774d94346d7de1bba2ca3/websockets-15.0.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8fdc51055e6ff4adeb88d58a11042ec9a5eae317a0a53d12c062c8a8865909e8", size = 182521 }, - { url = "https://files.pythonhosted.org/packages/e7/3b/66d4c1b444dd1a9823c4a81f50231b921bab54eee2f69e70319b4e21f1ca/websockets-15.0.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:693f0192126df6c2327cce3baa7c06f2a117575e32ab2308f7f8216c29d9e2e3", size = 181958 }, - { url = "https://files.pythonhosted.org/packages/08/ff/e9eed2ee5fed6f76fdd6032ca5cd38c57ca9661430bb3d5fb2872dc8703c/websockets-15.0.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:54479983bd5fb469c38f2f5c7e3a24f9a4e70594cd68cd1fa6b9340dadaff7cf", size = 181918 }, - { url = "https://files.pythonhosted.org/packages/d8/75/994634a49b7e12532be6a42103597b71098fd25900f7437d6055ed39930a/websockets-15.0.1-cp311-cp311-win32.whl", hash = "sha256:16b6c1b3e57799b9d38427dda63edcbe4926352c47cf88588c0be4ace18dac85", size = 176388 }, - { url = "https://files.pythonhosted.org/packages/98/93/e36c73f78400a65f5e236cd376713c34182e6663f6889cd45a4a04d8f203/websockets-15.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:27ccee0071a0e75d22cb35849b1db43f2ecd3e161041ac1ee9d2352ddf72f065", size = 176828 }, - { url = "https://files.pythonhosted.org/packages/51/6b/4545a0d843594f5d0771e86463606a3988b5a09ca5123136f8a76580dd63/websockets-15.0.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:3e90baa811a5d73f3ca0bcbf32064d663ed81318ab225ee4f427ad4e26e5aff3", size = 175437 }, - { url = "https://files.pythonhosted.org/packages/f4/71/809a0f5f6a06522af902e0f2ea2757f71ead94610010cf570ab5c98e99ed/websockets-15.0.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:592f1a9fe869c778694f0aa806ba0374e97648ab57936f092fd9d87f8bc03665", size = 173096 }, - { url = "https://files.pythonhosted.org/packages/3d/69/1a681dd6f02180916f116894181eab8b2e25b31e484c5d0eae637ec01f7c/websockets-15.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0701bc3cfcb9164d04a14b149fd74be7347a530ad3bbf15ab2c678a2cd3dd9a2", size = 173332 }, - { url = "https://files.pythonhosted.org/packages/a6/02/0073b3952f5bce97eafbb35757f8d0d54812b6174ed8dd952aa08429bcc3/websockets-15.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8b56bdcdb4505c8078cb6c7157d9811a85790f2f2b3632c7d1462ab5783d215", size = 183152 }, - { url = "https://files.pythonhosted.org/packages/74/45/c205c8480eafd114b428284840da0b1be9ffd0e4f87338dc95dc6ff961a1/websockets-15.0.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0af68c55afbd5f07986df82831c7bff04846928ea8d1fd7f30052638788bc9b5", size = 182096 }, - { url = "https://files.pythonhosted.org/packages/14/8f/aa61f528fba38578ec553c145857a181384c72b98156f858ca5c8e82d9d3/websockets-15.0.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64dee438fed052b52e4f98f76c5790513235efaa1ef7f3f2192c392cd7c91b65", size = 182523 }, - { url = "https://files.pythonhosted.org/packages/ec/6d/0267396610add5bc0d0d3e77f546d4cd287200804fe02323797de77dbce9/websockets-15.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d5f6b181bb38171a8ad1d6aa58a67a6aa9d4b38d0f8c5f496b9e42561dfc62fe", size = 182790 }, - { url = "https://files.pythonhosted.org/packages/02/05/c68c5adbf679cf610ae2f74a9b871ae84564462955d991178f95a1ddb7dd/websockets-15.0.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:5d54b09eba2bada6011aea5375542a157637b91029687eb4fdb2dab11059c1b4", size = 182165 }, - { url = "https://files.pythonhosted.org/packages/29/93/bb672df7b2f5faac89761cb5fa34f5cec45a4026c383a4b5761c6cea5c16/websockets-15.0.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3be571a8b5afed347da347bfcf27ba12b069d9d7f42cb8c7028b5e98bbb12597", size = 182160 }, - { url = "https://files.pythonhosted.org/packages/ff/83/de1f7709376dc3ca9b7eeb4b9a07b4526b14876b6d372a4dc62312bebee0/websockets-15.0.1-cp312-cp312-win32.whl", hash = "sha256:c338ffa0520bdb12fbc527265235639fb76e7bc7faafbb93f6ba80d9c06578a9", size = 176395 }, - { url = "https://files.pythonhosted.org/packages/7d/71/abf2ebc3bbfa40f391ce1428c7168fb20582d0ff57019b69ea20fa698043/websockets-15.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:fcd5cf9e305d7b8338754470cf69cf81f420459dbae8a3b40cee57417f4614a7", size = 176841 }, - { url = "https://files.pythonhosted.org/packages/cb/9f/51f0cf64471a9d2b4d0fc6c534f323b664e7095640c34562f5182e5a7195/websockets-15.0.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ee443ef070bb3b6ed74514f5efaa37a252af57c90eb33b956d35c8e9c10a1931", size = 175440 }, - { url = "https://files.pythonhosted.org/packages/8a/05/aa116ec9943c718905997412c5989f7ed671bc0188ee2ba89520e8765d7b/websockets-15.0.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5a939de6b7b4e18ca683218320fc67ea886038265fd1ed30173f5ce3f8e85675", size = 173098 }, - { url = "https://files.pythonhosted.org/packages/ff/0b/33cef55ff24f2d92924923c99926dcce78e7bd922d649467f0eda8368923/websockets-15.0.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:746ee8dba912cd6fc889a8147168991d50ed70447bf18bcda7039f7d2e3d9151", size = 173329 }, - { url = "https://files.pythonhosted.org/packages/31/1d/063b25dcc01faa8fada1469bdf769de3768b7044eac9d41f734fd7b6ad6d/websockets-15.0.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:595b6c3969023ecf9041b2936ac3827e4623bfa3ccf007575f04c5a6aa318c22", size = 183111 }, - { url = "https://files.pythonhosted.org/packages/93/53/9a87ee494a51bf63e4ec9241c1ccc4f7c2f45fff85d5bde2ff74fcb68b9e/websockets-15.0.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c714d2fc58b5ca3e285461a4cc0c9a66bd0e24c5da9911e30158286c9b5be7f", size = 182054 }, - { url = "https://files.pythonhosted.org/packages/ff/b2/83a6ddf56cdcbad4e3d841fcc55d6ba7d19aeb89c50f24dd7e859ec0805f/websockets-15.0.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f3c1e2ab208db911594ae5b4f79addeb3501604a165019dd221c0bdcabe4db8", size = 182496 }, - { url = "https://files.pythonhosted.org/packages/98/41/e7038944ed0abf34c45aa4635ba28136f06052e08fc2168520bb8b25149f/websockets-15.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:229cf1d3ca6c1804400b0a9790dc66528e08a6a1feec0d5040e8b9eb14422375", size = 182829 }, - { url = "https://files.pythonhosted.org/packages/e0/17/de15b6158680c7623c6ef0db361da965ab25d813ae54fcfeae2e5b9ef910/websockets-15.0.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:756c56e867a90fb00177d530dca4b097dd753cde348448a1012ed6c5131f8b7d", size = 182217 }, - { url = "https://files.pythonhosted.org/packages/33/2b/1f168cb6041853eef0362fb9554c3824367c5560cbdaad89ac40f8c2edfc/websockets-15.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:558d023b3df0bffe50a04e710bc87742de35060580a293c2a984299ed83bc4e4", size = 182195 }, - { url = "https://files.pythonhosted.org/packages/86/eb/20b6cdf273913d0ad05a6a14aed4b9a85591c18a987a3d47f20fa13dcc47/websockets-15.0.1-cp313-cp313-win32.whl", hash = "sha256:ba9e56e8ceeeedb2e080147ba85ffcd5cd0711b89576b83784d8605a7df455fa", size = 176393 }, - { url = "https://files.pythonhosted.org/packages/1b/6c/c65773d6cab416a64d191d6ee8a8b1c68a09970ea6909d16965d26bfed1e/websockets-15.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:e09473f095a819042ecb2ab9465aee615bd9c2028e4ef7d933600a8401c79561", size = 176837 }, - { url = "https://files.pythonhosted.org/packages/fa/a8/5b41e0da817d64113292ab1f8247140aac61cbf6cfd085d6a0fa77f4984f/websockets-15.0.1-py3-none-any.whl", hash = "sha256:f7a866fbc1e97b5c617ee4116daaa09b722101d4a3c170c787450ba409f9736f", size = 169743 }, -] - -[[package]] -name = "werkzeug" -version = "3.1.3" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "markupsafe" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/9f/69/83029f1f6300c5fb2471d621ab06f6ec6b3324685a2ce0f9777fd4a8b71e/werkzeug-3.1.3.tar.gz", hash = "sha256:60723ce945c19328679790e3282cc758aa4a6040e4bb330f53d30fa546d44746", size = 806925 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/52/24/ab44c871b0f07f491e5d2ad12c9bd7358e527510618cb1b803a88e986db1/werkzeug-3.1.3-py3-none-any.whl", hash = "sha256:54b78bf3716d19a65be4fceccc0d1d7b89e608834989dfae50ea87564639213e", size = 224498 }, -] - -[[package]] -name = "yarl" -version = "1.15.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "idna" }, - { name = "multidict" }, - { name = "propcache" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/06/e1/d5427a061819c9f885f58bb0467d02a523f1aec19f9e5f9c82ce950d90d3/yarl-1.15.2.tar.gz", hash = "sha256:a39c36f4218a5bb668b4f06874d676d35a035ee668e6e7e3538835c703634b84", size = 169318 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/4a/59/3ae125c97a2a8571ea16fdf59fcbd288bc169e0005d1af9946a90ea831d9/yarl-1.15.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9fcda20b2de7042cc35cf911702fa3d8311bd40055a14446c1e62403684afdc5", size = 136492 }, - { url = "https://files.pythonhosted.org/packages/f9/2b/efa58f36b582db45b94c15e87803b775eb8a4ca0db558121a272e67f3564/yarl-1.15.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0545de8c688fbbf3088f9e8b801157923be4bf8e7b03e97c2ecd4dfa39e48e0e", size = 88614 }, - { url = "https://files.pythonhosted.org/packages/82/69/eb73c0453a2ff53194df485dc7427d54e6cb8d1180fcef53251a8e24d069/yarl-1.15.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fbda058a9a68bec347962595f50546a8a4a34fd7b0654a7b9697917dc2bf810d", size = 86607 }, - { url = "https://files.pythonhosted.org/packages/48/4e/89beaee3a4da0d1c6af1176d738cff415ff2ad3737785ee25382409fe3e3/yarl-1.15.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d1ac2bc069f4a458634c26b101c2341b18da85cb96afe0015990507efec2e417", size = 334077 }, - { url = "https://files.pythonhosted.org/packages/da/e8/8fcaa7552093f94c3f327783e2171da0eaa71db0c267510898a575066b0f/yarl-1.15.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cd126498171f752dd85737ab1544329a4520c53eed3997f9b08aefbafb1cc53b", size = 347365 }, - { url = "https://files.pythonhosted.org/packages/be/fa/dc2002f82a89feab13a783d3e6b915a3a2e0e83314d9e3f6d845ee31bfcc/yarl-1.15.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3db817b4e95eb05c362e3b45dafe7144b18603e1211f4a5b36eb9522ecc62bcf", size = 344823 }, - { url = "https://files.pythonhosted.org/packages/ae/c8/c4a00fe7f2aa6970c2651df332a14c88f8baaedb2e32d6c3b8c8a003ea74/yarl-1.15.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:076b1ed2ac819933895b1a000904f62d615fe4533a5cf3e052ff9a1da560575c", size = 337132 }, - { url = "https://files.pythonhosted.org/packages/07/bf/84125f85f44bf2af03f3cf64e87214b42cd59dcc8a04960d610a9825f4d4/yarl-1.15.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f8cfd847e6b9ecf9f2f2531c8427035f291ec286c0a4944b0a9fce58c6446046", size = 326258 }, - { url = "https://files.pythonhosted.org/packages/00/19/73ad8122b2fa73fe22e32c24b82a6c053cf6c73e2f649b73f7ef97bee8d0/yarl-1.15.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:32b66be100ac5739065496c74c4b7f3015cef792c3174982809274d7e51b3e04", size = 336212 }, - { url = "https://files.pythonhosted.org/packages/39/1d/2fa4337d11f6587e9b7565f84eba549f2921494bc8b10bfe811079acaa70/yarl-1.15.2-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:34a2d76a1984cac04ff8b1bfc939ec9dc0914821264d4a9c8fd0ed6aa8d4cfd2", size = 330397 }, - { url = "https://files.pythonhosted.org/packages/39/ab/dce75e06806bcb4305966471ead03ce639d8230f4f52c32bd614d820c044/yarl-1.15.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:0afad2cd484908f472c8fe2e8ef499facee54a0a6978be0e0cff67b1254fd747", size = 334985 }, - { url = "https://files.pythonhosted.org/packages/c1/98/3f679149347a5e34c952bf8f71a387bc96b3488fae81399a49f8b1a01134/yarl-1.15.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:c68e820879ff39992c7f148113b46efcd6ec765a4865581f2902b3c43a5f4bbb", size = 356033 }, - { url = "https://files.pythonhosted.org/packages/f7/8c/96546061c19852d0a4b1b07084a58c2e8911db6bcf7838972cff542e09fb/yarl-1.15.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:98f68df80ec6ca3015186b2677c208c096d646ef37bbf8b49764ab4a38183931", size = 357710 }, - { url = "https://files.pythonhosted.org/packages/01/45/ade6fb3daf689816ebaddb3175c962731edf300425c3254c559b6d0dcc27/yarl-1.15.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3c56ec1eacd0a5d35b8a29f468659c47f4fe61b2cab948ca756c39b7617f0aa5", size = 345532 }, - { url = "https://files.pythonhosted.org/packages/e7/d7/8de800d3aecda0e64c43e8fc844f7effc8731a6099fa0c055738a2247504/yarl-1.15.2-cp311-cp311-win32.whl", hash = "sha256:eedc3f247ee7b3808ea07205f3e7d7879bc19ad3e6222195cd5fbf9988853e4d", size = 78250 }, - { url = "https://files.pythonhosted.org/packages/3a/6c/69058bbcfb0164f221aa30e0cd1a250f6babb01221e27c95058c51c498ca/yarl-1.15.2-cp311-cp311-win_amd64.whl", hash = "sha256:0ccaa1bc98751fbfcf53dc8dfdb90d96e98838010fc254180dd6707a6e8bb179", size = 84492 }, - { url = "https://files.pythonhosted.org/packages/e0/d1/17ff90e7e5b1a0b4ddad847f9ec6a214b87905e3a59d01bff9207ce2253b/yarl-1.15.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:82d5161e8cb8f36ec778fd7ac4d740415d84030f5b9ef8fe4da54784a1f46c94", size = 136721 }, - { url = "https://files.pythonhosted.org/packages/44/50/a64ca0577aeb9507f4b672f9c833d46cf8f1e042ce2e80c11753b936457d/yarl-1.15.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fa2bea05ff0a8fb4d8124498e00e02398f06d23cdadd0fe027d84a3f7afde31e", size = 88954 }, - { url = "https://files.pythonhosted.org/packages/c9/0a/a30d0b02046d4088c1fd32d85d025bd70ceb55f441213dee14d503694f41/yarl-1.15.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:99e12d2bf587b44deb74e0d6170fec37adb489964dbca656ec41a7cd8f2ff178", size = 86692 }, - { url = "https://files.pythonhosted.org/packages/06/0b/7613decb8baa26cba840d7ea2074bd3c5e27684cbcb6d06e7840d6c5226c/yarl-1.15.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:243fbbbf003754fe41b5bdf10ce1e7f80bcc70732b5b54222c124d6b4c2ab31c", size = 325762 }, - { url = "https://files.pythonhosted.org/packages/97/f5/b8c389a58d1eb08f89341fc1bbcc23a0341f7372185a0a0704dbdadba53a/yarl-1.15.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:856b7f1a7b98a8c31823285786bd566cf06226ac4f38b3ef462f593c608a9bd6", size = 335037 }, - { url = "https://files.pythonhosted.org/packages/cb/f9/d89b93a7bb8b66e01bf722dcc6fec15e11946e649e71414fd532b05c4d5d/yarl-1.15.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:553dad9af802a9ad1a6525e7528152a015b85fb8dbf764ebfc755c695f488367", size = 334221 }, - { url = "https://files.pythonhosted.org/packages/10/77/1db077601998e0831a540a690dcb0f450c31f64c492e993e2eaadfbc7d31/yarl-1.15.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:30c3ff305f6e06650a761c4393666f77384f1cc6c5c0251965d6bfa5fbc88f7f", size = 330167 }, - { url = "https://files.pythonhosted.org/packages/3b/c2/e5b7121662fd758656784fffcff2e411c593ec46dc9ec68e0859a2ffaee3/yarl-1.15.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:353665775be69bbfc6d54c8d134bfc533e332149faeddd631b0bc79df0897f46", size = 317472 }, - { url = "https://files.pythonhosted.org/packages/c6/f3/41e366c17e50782651b192ba06a71d53500cc351547816bf1928fb043c4f/yarl-1.15.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f4fe99ce44128c71233d0d72152db31ca119711dfc5f2c82385ad611d8d7f897", size = 330896 }, - { url = "https://files.pythonhosted.org/packages/79/a2/d72e501bc1e33e68a5a31f584fe4556ab71a50a27bfd607d023f097cc9bb/yarl-1.15.2-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:9c1e3ff4b89cdd2e1a24c214f141e848b9e0451f08d7d4963cb4108d4d798f1f", size = 328787 }, - { url = "https://files.pythonhosted.org/packages/9d/ba/890f7e1ea17f3c247748548eee876528ceb939e44566fa7d53baee57e5aa/yarl-1.15.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:711bdfae4e699a6d4f371137cbe9e740dc958530cb920eb6f43ff9551e17cfbc", size = 332631 }, - { url = "https://files.pythonhosted.org/packages/48/c7/27b34206fd5dfe76b2caa08bf22f9212b2d665d5bb2df8a6dd3af498dcf4/yarl-1.15.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4388c72174868884f76affcdd3656544c426407e0043c89b684d22fb265e04a5", size = 344023 }, - { url = "https://files.pythonhosted.org/packages/88/e7/730b130f4f02bd8b00479baf9a57fdea1dc927436ed1d6ba08fa5c36c68e/yarl-1.15.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:f0e1844ad47c7bd5d6fa784f1d4accc5f4168b48999303a868fe0f8597bde715", size = 352290 }, - { url = "https://files.pythonhosted.org/packages/84/9b/e8dda28f91a0af67098cddd455e6b540d3f682dda4c0de224215a57dee4a/yarl-1.15.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a5cafb02cf097a82d74403f7e0b6b9df3ffbfe8edf9415ea816314711764a27b", size = 343742 }, - { url = "https://files.pythonhosted.org/packages/66/47/b1c6bb85f2b66decbe189e27fcc956ab74670a068655df30ef9a2e15c379/yarl-1.15.2-cp312-cp312-win32.whl", hash = "sha256:156ececdf636143f508770bf8a3a0498de64da5abd890c7dbb42ca9e3b6c05b8", size = 78051 }, - { url = "https://files.pythonhosted.org/packages/7d/9e/1a897e5248ec53e96e9f15b3e6928efd5e75d322c6cf666f55c1c063e5c9/yarl-1.15.2-cp312-cp312-win_amd64.whl", hash = "sha256:435aca062444a7f0c884861d2e3ea79883bd1cd19d0a381928b69ae1b85bc51d", size = 84313 }, - { url = "https://files.pythonhosted.org/packages/46/ab/be3229898d7eb1149e6ba7fe44f873cf054d275a00b326f2a858c9ff7175/yarl-1.15.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:416f2e3beaeae81e2f7a45dc711258be5bdc79c940a9a270b266c0bec038fb84", size = 135006 }, - { url = "https://files.pythonhosted.org/packages/10/10/b91c186b1b0e63951f80481b3e6879bb9f7179d471fe7c4440c9e900e2a3/yarl-1.15.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:173563f3696124372831007e3d4b9821746964a95968628f7075d9231ac6bb33", size = 88121 }, - { url = "https://files.pythonhosted.org/packages/bf/1d/4ceaccf836b9591abfde775e84249b847ac4c6c14ee2dd8d15b5b3cede44/yarl-1.15.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9ce2e0f6123a60bd1a7f5ae3b2c49b240c12c132847f17aa990b841a417598a2", size = 85967 }, - { url = "https://files.pythonhosted.org/packages/93/bd/c924f22bdb2c5d0ca03a9e64ecc5e041aace138c2a91afff7e2f01edc3a1/yarl-1.15.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eaea112aed589131f73d50d570a6864728bd7c0c66ef6c9154ed7b59f24da611", size = 325615 }, - { url = "https://files.pythonhosted.org/packages/59/a5/6226accd5c01cafd57af0d249c7cf9dd12569cd9c78fbd93e8198e7a9d84/yarl-1.15.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e4ca3b9f370f218cc2a0309542cab8d0acdfd66667e7c37d04d617012485f904", size = 334945 }, - { url = "https://files.pythonhosted.org/packages/4c/c1/cc6ccdd2bcd0ff7291602d5831754595260f8d2754642dfd34fef1791059/yarl-1.15.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:23ec1d3c31882b2a8a69c801ef58ebf7bae2553211ebbddf04235be275a38548", size = 336701 }, - { url = "https://files.pythonhosted.org/packages/ef/ff/39a767ee249444e4b26ea998a526838238f8994c8f274befc1f94dacfb43/yarl-1.15.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75119badf45f7183e10e348edff5a76a94dc19ba9287d94001ff05e81475967b", size = 330977 }, - { url = "https://files.pythonhosted.org/packages/dd/ba/b1fed73f9d39e3e7be8f6786be5a2ab4399c21504c9168c3cadf6e441c2e/yarl-1.15.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:78e6fdc976ec966b99e4daa3812fac0274cc28cd2b24b0d92462e2e5ef90d368", size = 317402 }, - { url = "https://files.pythonhosted.org/packages/82/e8/03e3ebb7f558374f29c04868b20ca484d7997f80a0a191490790a8c28058/yarl-1.15.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:8657d3f37f781d987037f9cc20bbc8b40425fa14380c87da0cb8dfce7c92d0fb", size = 331776 }, - { url = "https://files.pythonhosted.org/packages/1f/83/90b0f4fd1ecf2602ba4ac50ad0bbc463122208f52dd13f152bbc0d8417dd/yarl-1.15.2-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:93bed8a8084544c6efe8856c362af08a23e959340c87a95687fdbe9c9f280c8b", size = 331585 }, - { url = "https://files.pythonhosted.org/packages/c7/f6/1ed7e7f270ae5f9f1174c1f8597b29658f552fee101c26de8b2eb4ca147a/yarl-1.15.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:69d5856d526802cbda768d3e6246cd0d77450fa2a4bc2ea0ea14f0d972c2894b", size = 336395 }, - { url = "https://files.pythonhosted.org/packages/e0/3a/4354ed8812909d9ec54a92716a53259b09e6b664209231f2ec5e75f4820d/yarl-1.15.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:ccad2800dfdff34392448c4bf834be124f10a5bc102f254521d931c1c53c455a", size = 342810 }, - { url = "https://files.pythonhosted.org/packages/de/cc/39e55e16b1415a87f6d300064965d6cfb2ac8571e11339ccb7dada2444d9/yarl-1.15.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:a880372e2e5dbb9258a4e8ff43f13888039abb9dd6d515f28611c54361bc5644", size = 351441 }, - { url = "https://files.pythonhosted.org/packages/fb/19/5cd4757079dc9d9f3de3e3831719b695f709a8ce029e70b33350c9d082a7/yarl-1.15.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:c998d0558805860503bc3a595994895ca0f7835e00668dadc673bbf7f5fbfcbe", size = 345875 }, - { url = "https://files.pythonhosted.org/packages/83/a0/ef09b54634f73417f1ea4a746456a4372c1b044f07b26e16fa241bd2d94e/yarl-1.15.2-cp313-cp313-win32.whl", hash = "sha256:533a28754e7f7439f217550a497bb026c54072dbe16402b183fdbca2431935a9", size = 302609 }, - { url = "https://files.pythonhosted.org/packages/20/9f/f39c37c17929d3975da84c737b96b606b68c495cc4ee86408f10523a1635/yarl-1.15.2-cp313-cp313-win_amd64.whl", hash = "sha256:5838f2b79dc8f96fdc44077c9e4e2e33d7089b10788464609df788eb97d03aad", size = 308252 }, - { url = "https://files.pythonhosted.org/packages/46/cf/a28c494decc9c8776b0d7b729c68d26fdafefcedd8d2eab5d9cd767376b2/yarl-1.15.2-py3-none-any.whl", hash = "sha256:0d3105efab7c5c091609abacad33afff33bdff0035bece164c98bcf5a85ef90a", size = 38891 }, -] - -[[package]] -name = "zipp" -version = "3.20.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/54/bf/5c0000c44ebc80123ecbdddba1f5dcd94a5ada602a9c225d84b5aaa55e86/zipp-3.20.2.tar.gz", hash = "sha256:bc9eb26f4506fda01b81bcde0ca78103b6e62f991b381fec825435c836edbc29", size = 24199 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/62/8b/5ba542fa83c90e09eac972fc9baca7a88e7e7ca4b221a89251954019308b/zipp-3.20.2-py3-none-any.whl", hash = "sha256:a817ac80d6cf4b23bf7f2828b7cabf326f15a001bea8b1f9b49631780ba28350", size = 9200 }, -] - -[[package]] -name = "zstandard" -version = "0.23.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "cffi", marker = "platform_python_implementation == 'PyPy'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/ed/f6/2ac0287b442160a89d726b17a9184a4c615bb5237db763791a7fd16d9df1/zstandard-0.23.0.tar.gz", hash = "sha256:b2d8c62d08e7255f68f7a740bae85b3c9b8e5466baa9cbf7f57f1cde0ac6bc09", size = 681701 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/9e/40/f67e7d2c25a0e2dc1744dd781110b0b60306657f8696cafb7ad7579469bd/zstandard-0.23.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:34895a41273ad33347b2fc70e1bff4240556de3c46c6ea430a7ed91f9042aa4e", size = 788699 }, - { url = "https://files.pythonhosted.org/packages/e8/46/66d5b55f4d737dd6ab75851b224abf0afe5774976fe511a54d2eb9063a41/zstandard-0.23.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:77ea385f7dd5b5676d7fd943292ffa18fbf5c72ba98f7d09fc1fb9e819b34c23", size = 633681 }, - { url = "https://files.pythonhosted.org/packages/63/b6/677e65c095d8e12b66b8f862b069bcf1f1d781b9c9c6f12eb55000d57583/zstandard-0.23.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:983b6efd649723474f29ed42e1467f90a35a74793437d0bc64a5bf482bedfa0a", size = 4944328 }, - { url = "https://files.pythonhosted.org/packages/59/cc/e76acb4c42afa05a9d20827116d1f9287e9c32b7ad58cc3af0721ce2b481/zstandard-0.23.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80a539906390591dd39ebb8d773771dc4db82ace6372c4d41e2d293f8e32b8db", size = 5311955 }, - { url = "https://files.pythonhosted.org/packages/78/e4/644b8075f18fc7f632130c32e8f36f6dc1b93065bf2dd87f03223b187f26/zstandard-0.23.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:445e4cb5048b04e90ce96a79b4b63140e3f4ab5f662321975679b5f6360b90e2", size = 5344944 }, - { url = "https://files.pythonhosted.org/packages/76/3f/dbafccf19cfeca25bbabf6f2dd81796b7218f768ec400f043edc767015a6/zstandard-0.23.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd30d9c67d13d891f2360b2a120186729c111238ac63b43dbd37a5a40670b8ca", size = 5442927 }, - { url = "https://files.pythonhosted.org/packages/0c/c3/d24a01a19b6733b9f218e94d1a87c477d523237e07f94899e1c10f6fd06c/zstandard-0.23.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d20fd853fbb5807c8e84c136c278827b6167ded66c72ec6f9a14b863d809211c", size = 4864910 }, - { url = "https://files.pythonhosted.org/packages/1c/a9/cf8f78ead4597264f7618d0875be01f9bc23c9d1d11afb6d225b867cb423/zstandard-0.23.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ed1708dbf4d2e3a1c5c69110ba2b4eb6678262028afd6c6fbcc5a8dac9cda68e", size = 4935544 }, - { url = "https://files.pythonhosted.org/packages/2c/96/8af1e3731b67965fb995a940c04a2c20997a7b3b14826b9d1301cf160879/zstandard-0.23.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:be9b5b8659dff1f913039c2feee1aca499cfbc19e98fa12bc85e037c17ec6ca5", size = 5467094 }, - { url = "https://files.pythonhosted.org/packages/ff/57/43ea9df642c636cb79f88a13ab07d92d88d3bfe3e550b55a25a07a26d878/zstandard-0.23.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:65308f4b4890aa12d9b6ad9f2844b7ee42c7f7a4fd3390425b242ffc57498f48", size = 4860440 }, - { url = "https://files.pythonhosted.org/packages/46/37/edb78f33c7f44f806525f27baa300341918fd4c4af9472fbc2c3094be2e8/zstandard-0.23.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:98da17ce9cbf3bfe4617e836d561e433f871129e3a7ac16d6ef4c680f13a839c", size = 4700091 }, - { url = "https://files.pythonhosted.org/packages/c1/f1/454ac3962671a754f3cb49242472df5c2cced4eb959ae203a377b45b1a3c/zstandard-0.23.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:8ed7d27cb56b3e058d3cf684d7200703bcae623e1dcc06ed1e18ecda39fee003", size = 5208682 }, - { url = "https://files.pythonhosted.org/packages/85/b2/1734b0fff1634390b1b887202d557d2dd542de84a4c155c258cf75da4773/zstandard-0.23.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:b69bb4f51daf461b15e7b3db033160937d3ff88303a7bc808c67bbc1eaf98c78", size = 5669707 }, - { url = "https://files.pythonhosted.org/packages/52/5a/87d6971f0997c4b9b09c495bf92189fb63de86a83cadc4977dc19735f652/zstandard-0.23.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:034b88913ecc1b097f528e42b539453fa82c3557e414b3de9d5632c80439a473", size = 5201792 }, - { url = "https://files.pythonhosted.org/packages/79/02/6f6a42cc84459d399bd1a4e1adfc78d4dfe45e56d05b072008d10040e13b/zstandard-0.23.0-cp311-cp311-win32.whl", hash = "sha256:f2d4380bf5f62daabd7b751ea2339c1a21d1c9463f1feb7fc2bdcea2c29c3160", size = 430586 }, - { url = "https://files.pythonhosted.org/packages/be/a2/4272175d47c623ff78196f3c10e9dc7045c1b9caf3735bf041e65271eca4/zstandard-0.23.0-cp311-cp311-win_amd64.whl", hash = "sha256:62136da96a973bd2557f06ddd4e8e807f9e13cbb0bfb9cc06cfe6d98ea90dfe0", size = 495420 }, - { url = "https://files.pythonhosted.org/packages/7b/83/f23338c963bd9de687d47bf32efe9fd30164e722ba27fb59df33e6b1719b/zstandard-0.23.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b4567955a6bc1b20e9c31612e615af6b53733491aeaa19a6b3b37f3b65477094", size = 788713 }, - { url = "https://files.pythonhosted.org/packages/5b/b3/1a028f6750fd9227ee0b937a278a434ab7f7fdc3066c3173f64366fe2466/zstandard-0.23.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1e172f57cd78c20f13a3415cc8dfe24bf388614324d25539146594c16d78fcc8", size = 633459 }, - { url = "https://files.pythonhosted.org/packages/26/af/36d89aae0c1f95a0a98e50711bc5d92c144939efc1f81a2fcd3e78d7f4c1/zstandard-0.23.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b0e166f698c5a3e914947388c162be2583e0c638a4703fc6a543e23a88dea3c1", size = 4945707 }, - { url = "https://files.pythonhosted.org/packages/cd/2e/2051f5c772f4dfc0aae3741d5fc72c3dcfe3aaeb461cc231668a4db1ce14/zstandard-0.23.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:12a289832e520c6bd4dcaad68e944b86da3bad0d339ef7989fb7e88f92e96072", size = 5306545 }, - { url = "https://files.pythonhosted.org/packages/0a/9e/a11c97b087f89cab030fa71206963090d2fecd8eb83e67bb8f3ffb84c024/zstandard-0.23.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d50d31bfedd53a928fed6707b15a8dbeef011bb6366297cc435accc888b27c20", size = 5337533 }, - { url = "https://files.pythonhosted.org/packages/fc/79/edeb217c57fe1bf16d890aa91a1c2c96b28c07b46afed54a5dcf310c3f6f/zstandard-0.23.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72c68dda124a1a138340fb62fa21b9bf4848437d9ca60bd35db36f2d3345f373", size = 5436510 }, - { url = "https://files.pythonhosted.org/packages/81/4f/c21383d97cb7a422ddf1ae824b53ce4b51063d0eeb2afa757eb40804a8ef/zstandard-0.23.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:53dd9d5e3d29f95acd5de6802e909ada8d8d8cfa37a3ac64836f3bc4bc5512db", size = 4859973 }, - { url = "https://files.pythonhosted.org/packages/ab/15/08d22e87753304405ccac8be2493a495f529edd81d39a0870621462276ef/zstandard-0.23.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:6a41c120c3dbc0d81a8e8adc73312d668cd34acd7725f036992b1b72d22c1772", size = 4936968 }, - { url = "https://files.pythonhosted.org/packages/eb/fa/f3670a597949fe7dcf38119a39f7da49a8a84a6f0b1a2e46b2f71a0ab83f/zstandard-0.23.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:40b33d93c6eddf02d2c19f5773196068d875c41ca25730e8288e9b672897c105", size = 5467179 }, - { url = "https://files.pythonhosted.org/packages/4e/a9/dad2ab22020211e380adc477a1dbf9f109b1f8d94c614944843e20dc2a99/zstandard-0.23.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9206649ec587e6b02bd124fb7799b86cddec350f6f6c14bc82a2b70183e708ba", size = 4848577 }, - { url = "https://files.pythonhosted.org/packages/08/03/dd28b4484b0770f1e23478413e01bee476ae8227bbc81561f9c329e12564/zstandard-0.23.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:76e79bc28a65f467e0409098fa2c4376931fd3207fbeb6b956c7c476d53746dd", size = 4693899 }, - { url = "https://files.pythonhosted.org/packages/2b/64/3da7497eb635d025841e958bcd66a86117ae320c3b14b0ae86e9e8627518/zstandard-0.23.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:66b689c107857eceabf2cf3d3fc699c3c0fe8ccd18df2219d978c0283e4c508a", size = 5199964 }, - { url = "https://files.pythonhosted.org/packages/43/a4/d82decbab158a0e8a6ebb7fc98bc4d903266bce85b6e9aaedea1d288338c/zstandard-0.23.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9c236e635582742fee16603042553d276cca506e824fa2e6489db04039521e90", size = 5655398 }, - { url = "https://files.pythonhosted.org/packages/f2/61/ac78a1263bc83a5cf29e7458b77a568eda5a8f81980691bbc6eb6a0d45cc/zstandard-0.23.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a8fffdbd9d1408006baaf02f1068d7dd1f016c6bcb7538682622c556e7b68e35", size = 5191313 }, - { url = "https://files.pythonhosted.org/packages/e7/54/967c478314e16af5baf849b6ee9d6ea724ae5b100eb506011f045d3d4e16/zstandard-0.23.0-cp312-cp312-win32.whl", hash = "sha256:dc1d33abb8a0d754ea4763bad944fd965d3d95b5baef6b121c0c9013eaf1907d", size = 430877 }, - { url = "https://files.pythonhosted.org/packages/75/37/872d74bd7739639c4553bf94c84af7d54d8211b626b352bc57f0fd8d1e3f/zstandard-0.23.0-cp312-cp312-win_amd64.whl", hash = "sha256:64585e1dba664dc67c7cdabd56c1e5685233fbb1fc1966cfba2a340ec0dfff7b", size = 495595 }, - { url = "https://files.pythonhosted.org/packages/80/f1/8386f3f7c10261fe85fbc2c012fdb3d4db793b921c9abcc995d8da1b7a80/zstandard-0.23.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:576856e8594e6649aee06ddbfc738fec6a834f7c85bf7cadd1c53d4a58186ef9", size = 788975 }, - { url = "https://files.pythonhosted.org/packages/16/e8/cbf01077550b3e5dc86089035ff8f6fbbb312bc0983757c2d1117ebba242/zstandard-0.23.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:38302b78a850ff82656beaddeb0bb989a0322a8bbb1bf1ab10c17506681d772a", size = 633448 }, - { url = "https://files.pythonhosted.org/packages/06/27/4a1b4c267c29a464a161aeb2589aff212b4db653a1d96bffe3598f3f0d22/zstandard-0.23.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d2240ddc86b74966c34554c49d00eaafa8200a18d3a5b6ffbf7da63b11d74ee2", size = 4945269 }, - { url = "https://files.pythonhosted.org/packages/7c/64/d99261cc57afd9ae65b707e38045ed8269fbdae73544fd2e4a4d50d0ed83/zstandard-0.23.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2ef230a8fd217a2015bc91b74f6b3b7d6522ba48be29ad4ea0ca3a3775bf7dd5", size = 5306228 }, - { url = "https://files.pythonhosted.org/packages/7a/cf/27b74c6f22541f0263016a0fd6369b1b7818941de639215c84e4e94b2a1c/zstandard-0.23.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:774d45b1fac1461f48698a9d4b5fa19a69d47ece02fa469825b442263f04021f", size = 5336891 }, - { url = "https://files.pythonhosted.org/packages/fa/18/89ac62eac46b69948bf35fcd90d37103f38722968e2981f752d69081ec4d/zstandard-0.23.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f77fa49079891a4aab203d0b1744acc85577ed16d767b52fc089d83faf8d8ed", size = 5436310 }, - { url = "https://files.pythonhosted.org/packages/a8/a8/5ca5328ee568a873f5118d5b5f70d1f36c6387716efe2e369010289a5738/zstandard-0.23.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ac184f87ff521f4840e6ea0b10c0ec90c6b1dcd0bad2f1e4a9a1b4fa177982ea", size = 4859912 }, - { url = "https://files.pythonhosted.org/packages/ea/ca/3781059c95fd0868658b1cf0440edd832b942f84ae60685d0cfdb808bca1/zstandard-0.23.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:c363b53e257246a954ebc7c488304b5592b9c53fbe74d03bc1c64dda153fb847", size = 4936946 }, - { url = "https://files.pythonhosted.org/packages/ce/11/41a58986f809532742c2b832c53b74ba0e0a5dae7e8ab4642bf5876f35de/zstandard-0.23.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:e7792606d606c8df5277c32ccb58f29b9b8603bf83b48639b7aedf6df4fe8171", size = 5466994 }, - { url = "https://files.pythonhosted.org/packages/83/e3/97d84fe95edd38d7053af05159465d298c8b20cebe9ccb3d26783faa9094/zstandard-0.23.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a0817825b900fcd43ac5d05b8b3079937073d2b1ff9cf89427590718b70dd840", size = 4848681 }, - { url = "https://files.pythonhosted.org/packages/6e/99/cb1e63e931de15c88af26085e3f2d9af9ce53ccafac73b6e48418fd5a6e6/zstandard-0.23.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:9da6bc32faac9a293ddfdcb9108d4b20416219461e4ec64dfea8383cac186690", size = 4694239 }, - { url = "https://files.pythonhosted.org/packages/ab/50/b1e703016eebbc6501fc92f34db7b1c68e54e567ef39e6e59cf5fb6f2ec0/zstandard-0.23.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:fd7699e8fd9969f455ef2926221e0233f81a2542921471382e77a9e2f2b57f4b", size = 5200149 }, - { url = "https://files.pythonhosted.org/packages/aa/e0/932388630aaba70197c78bdb10cce2c91fae01a7e553b76ce85471aec690/zstandard-0.23.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:d477ed829077cd945b01fc3115edd132c47e6540ddcd96ca169facff28173057", size = 5655392 }, - { url = "https://files.pythonhosted.org/packages/02/90/2633473864f67a15526324b007a9f96c96f56d5f32ef2a56cc12f9548723/zstandard-0.23.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa6ce8b52c5987b3e34d5674b0ab529a4602b632ebab0a93b07bfb4dfc8f8a33", size = 5191299 }, - { url = "https://files.pythonhosted.org/packages/b0/4c/315ca5c32da7e2dc3455f3b2caee5c8c2246074a61aac6ec3378a97b7136/zstandard-0.23.0-cp313-cp313-win32.whl", hash = "sha256:a9b07268d0c3ca5c170a385a0ab9fb7fdd9f5fd866be004c4ea39e44edce47dd", size = 430862 }, - { url = "https://files.pythonhosted.org/packages/a2/bf/c6aaba098e2d04781e8f4f7c0ba3c7aa73d00e4c436bcc0cf059a66691d1/zstandard-0.23.0-cp313-cp313-win_amd64.whl", hash = "sha256:f3513916e8c645d0610815c257cbfd3242adfd5c4cfa78be514e5a3ebb42a41b", size = 495578 }, -]