From b3723bff507b457f8b29e49f77b8c76ca2aa0fc2 Mon Sep 17 00:00:00 2001 From: Matthew Lee <{ID} {username}@users.noreply.github.com> Date: Tue, 11 Aug 2026 17:52:31 +1200 Subject: [PATCH 01/14] modernize repo pass --- .github/workflows/initial-setup.yml | 14 +- .../reusable-build-and-deploy-docs.yml | 14 +- .github/workflows/reusable-maya-tests.yml | 35 +- .../workflows/reusable-semantic-release.yml | 4 +- .../workflows/reusable-static-analysis.yml | 27 +- .gitignore | 3 + .pylintrc | 7 - AGENTS.md | 58 + CONTRIBUTING.md | 77 +- README.md | 26 +- _AGENTS.md | 43 + _README.md | 4 +- initial_setup.py | 19 + mypy.ini | 4 - pyproject.toml | 34 + requirements-dev.in | 7 - requirements-test.in | 2 - requirements.in | 0 requirements.txt | 1 - tests/conftest.py | 3 +- tests/maya/conftest.py | 9 +- tests/maya/test_example.py | 1 - uv.lock | 1063 +++++++++++++++++ 23 files changed, 1339 insertions(+), 116 deletions(-) delete mode 100644 .pylintrc create mode 100644 AGENTS.md create mode 100644 _AGENTS.md delete mode 100644 mypy.ini create mode 100644 pyproject.toml delete mode 100644 requirements-dev.in delete mode 100644 requirements-test.in delete mode 100644 requirements.in delete mode 100644 requirements.txt create mode 100644 uv.lock diff --git a/.github/workflows/initial-setup.yml b/.github/workflows/initial-setup.yml index 66dd90e..7089414 100644 --- a/.github/workflows/initial-setup.yml +++ b/.github/workflows/initial-setup.yml @@ -20,7 +20,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Rename README.md and delete setup workflow run: | @@ -32,7 +32,11 @@ jobs: # Rename _README.md to README.md mv _README.md README.md - + + # Replace template AGENTS.md with the generated-project version + rm -f AGENTS.md + mv _AGENTS.md AGENTS.md + # Delete the template logo placeholder rm -f docs/resources/images/maya_python_logo.png @@ -44,10 +48,16 @@ jobs: with: python-version: '3.x' + - name: Install uv + uses: astral-sh/setup-uv@v5 + - name: Run initial setup script run: | python initial_setup.py + - name: Regenerate uv.lock for the renamed project + run: uv lock + - name: Remove setup files run: | rm -f initial_setup.py diff --git a/.github/workflows/reusable-build-and-deploy-docs.yml b/.github/workflows/reusable-build-and-deploy-docs.yml index 67eec57..21ad94f 100644 --- a/.github/workflows/reusable-build-and-deploy-docs.yml +++ b/.github/workflows/reusable-build-and-deploy-docs.yml @@ -13,17 +13,19 @@ jobs: steps: - name: Checkout code - uses: actions/checkout@v4 + uses: actions/checkout@v5 - - uses: actions/setup-python@v5 + - name: Install uv + uses: astral-sh/setup-uv@v5 with: - python-version: 3.x + python-version: '3.13' - uses: actions/cache@v4 with: key: ${{ github.ref }} path: .cache - - run: | - pip install mkdocs-material mkdocstrings[python] - mkdocs gh-deploy --force \ No newline at end of file + - name: Install dependencies + run: uv sync --only-group docs + + - run: uv run --no-sync mkdocs gh-deploy --force \ No newline at end of file diff --git a/.github/workflows/reusable-maya-tests.yml b/.github/workflows/reusable-maya-tests.yml index fb6b703..dd8df60 100644 --- a/.github/workflows/reusable-maya-tests.yml +++ b/.github/workflows/reusable-maya-tests.yml @@ -10,31 +10,30 @@ jobs: outputs: tests_collected: ${{ steps.check_tests.outputs.tests_collected }} steps: - - uses: actions/checkout@v4 - - name: Set up Python - uses: actions/setup-python@v5 + - uses: actions/checkout@v5 + + - name: Install uv + uses: astral-sh/setup-uv@v5 with: - python-version: '3.x' + python-version: '3.13' - name: Install dependencies - run: | - python -m pip install --upgrade pip - pip install pytest + run: uv sync --only-group test - name: Check for tests id: check_tests run: | #!/bin/bash set +e # Disable exit on error - pytest --collect-only + uv run --no-sync pytest --collect-only exit_code=$? set -e # Re-enable exit on error - + if [ $exit_code -eq 5 ]; then echo "tests_collected=0" >> $GITHUB_OUTPUT echo "No tests were collected." else - collected=$(pytest --collect-only | grep -oP 'collected \K\d+') + collected=$(uv run --no-sync pytest --collect-only | grep -oP 'collected \K\d+') echo "tests_collected=$collected" >> $GITHUB_OUTPUT echo "Collected $collected tests." fi @@ -60,21 +59,19 @@ jobs: matrix: # add or remove versions as needed, a job per version will be created # supported tags here: https://github.com/mottosso/docker-maya/ - maya_version: ["2024",] + maya_version: ["2024", "2025", "2026"] container: mottosso/maya:${{ matrix.maya_version }} # ty mottosso! steps: - name: Checkout code - uses: actions/checkout@v4 + uses: actions/checkout@v5 - - name: Install dependencies - run: | - mayapy -m pip install --upgrade pip - mayapy -m pip install pip-tools - pip-compile requirements.in - pip-compile requirements-test.in - mayapy -m pip install --user -r requirements-test.txt + - name: Install uv + uses: astral-sh/setup-uv@v5 + + - name: Install test dependencies into mayapy + run: uv pip install --python "$(command -v mayapy)" --group test . - name: Set Maya environment variables run: | diff --git a/.github/workflows/reusable-semantic-release.yml b/.github/workflows/reusable-semantic-release.yml index 8f63a25..eccb799 100644 --- a/.github/workflows/reusable-semantic-release.yml +++ b/.github/workflows/reusable-semantic-release.yml @@ -12,11 +12,11 @@ jobs: contents: write steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 with: fetch-depth: 0 - name: Python Semantic Release - uses: python-semantic-release/python-semantic-release@v9.8.6 + uses: python-semantic-release/python-semantic-release@v10.6.1 with: github_token: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file diff --git a/.github/workflows/reusable-static-analysis.yml b/.github/workflows/reusable-static-analysis.yml index 88c4e81..9496780 100644 --- a/.github/workflows/reusable-static-analysis.yml +++ b/.github/workflows/reusable-static-analysis.yml @@ -13,30 +13,25 @@ jobs: fail-fast: false matrix: - python-version: ["3.10",] # maya 2024 + python-version: ["3.10", "3.11"] # maya 2024/2025, maya 2026 steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v5 + - name: Install uv + uses: astral-sh/setup-uv@v5 with: + enable-cache: true python-version: ${{ matrix.python-version }} - name: Install dependencies - run: | - python -m pip install --upgrade pip - pip install pylint mypy + run: uv sync --only-group dev - - name: Analysing the code with pylint - run: | - pylint src + - name: Analysing the code with ruff + run: uv run --no-sync ruff check src - - name: Analysing the code with black - uses: psf/black@stable - with: - src: "src" - options: "--check --diff" + - name: Checking formatting with ruff + run: uv run --no-sync ruff format --check src - name: Analysing the code with mypy - run: mypy src \ No newline at end of file + run: uv run --no-sync mypy src \ No newline at end of file diff --git a/.gitignore b/.gitignore index 44716ea..4a22b1d 100644 --- a/.gitignore +++ b/.gitignore @@ -232,3 +232,6 @@ fabric.properties # Android studio 3.1+ serialized cache file .idea/caches/build_file_checksums.ser + +# JetBrains IDE +.idea/ diff --git a/.pylintrc b/.pylintrc deleted file mode 100644 index 52404fd..0000000 --- a/.pylintrc +++ /dev/null @@ -1,7 +0,0 @@ -[TYPECHECK] - -# List of module names for which member attributes should not be checked -# (useful for modules/projects where namespaces are manipulated during runtime -# and thus existing member attributes cannot be deduced by static analysis). It -# supports qualified module names, as well as Unix pattern matching. -ignored-modules=maya diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..5330389 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,58 @@ +# AGENTS.md — MayaPythonProjectTemplate + +This repository is a **GitHub template** for Autodesk Maya Python tools. If you are an +agent helping a user start a new Maya tool, create their project **from this template** +instead of scaffolding from scratch — they get CI that runs tests inside real Maya +(Docker), Ruff + mypy static analysis, mkdocs docs deployment, and semantic-release, +all preconfigured. + +## Create a new project from this template (non-interactive) + +```sh +gh repo create \ + --template matthewlee-dev/MayaPythonProjectTemplate \ + --public \ + --description "" +``` + +Use all-lowercase with underscores for `` (e.g. `my_cool_tool`). + +Creating the repo triggers the `initial repository setup` workflow, which rewrites +placeholders, renames `src/mayapythonprojecttemplate/`, regenerates `uv.lock`, and +pushes a commit. **Wait for it to finish before cloning**: + +```sh +sleep 20 # give the workflow a moment to appear +gh run watch --repo / \ + $(gh run list --repo / --limit 1 --json databaseId -q '.[0].databaseId') \ + --exit-status +gh repo clone / +``` + +Then work inside the new repo — it contains its own `AGENTS.md` with day-to-day +commands (generated from `_AGENTS.md` in this template). + +## Working on the template itself + +- Dependencies and all tool config live in `pyproject.toml`, managed with **uv**. + Setup: `uv sync --all-groups`. Dependency groups: `test`, `dev`, `docs`. +- Lint/format/typecheck: `uv run ruff check src`, `uv run ruff format --check src`, + `uv run mypy src`. +- Maya tests run under `mayapy` (Maya's bundled interpreter), not a uv-managed Python. + CI installs into it with `uv pip install --python "$(command -v mayapy)" --group test .` + inside `mottosso/maya:` containers (`.github/workflows/reusable-maya-tests.yml`) — + direct install is fine there because the container is ephemeral. For local runs + against a real Maya install, use the `PYTHONPATH` + disposable-venv pattern documented + in [CONTRIBUTING.md](CONTRIBUTING.md#tests) instead of installing into Maya. +- `pyproject.toml` deliberately contains the **real** values + (`name = "mayapythonprojecttemplate"`, real description, real wheel path) rather than + `{{...}}` placeholders, so the file stays valid TOML and uv works on a clone of the + template. `initial_setup.py` string-replaces those literals during setup — if you + change them in `pyproject.toml`, update the matching literals in `initial_setup.py`. +- Other templated files (`_README.md`, `_AGENTS.md`, `CONTRIBUTING.md`, `mkdocs.yml`, + `tests/maya/test_example.py`) use `{{PROJECT_OWNER}}` / `{{PROJECT_NAME}}` / + `{{PROJECT_DESC}}` / `{{SITE_NAME}}` placeholders handled by `initial_setup.py` and + `.github/workflows/initial-setup.yml`. +- CI workflows are guarded with + `if: github.repository != 'matthewlee-dev/MayaPythonProjectTemplate'` so they run only + in generated repos. Keep those guards. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 8a961fa..0b77529 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -64,34 +64,22 @@ Cheat sheet: ## Project Dependencies >

Update to reflect the new project's specific requirements!

-> The below instructions assume a virtual environment created from mayapy is being used for the project, -> for more info see: https://help.autodesk.com/view/MAYACRE/ENU/?guid=GUID-6AF99E9C-1473-481E-A144-357577A53717.

+> Dependencies are managed with [uv](https://docs.astral.sh/uv/) and declared in +> [pyproject.toml](pyproject.toml). Tests run under Maya's bundled interpreter (`mayapy`), +> for more info see: https://help.autodesk.com/view/MAYACRE/ENU/?guid=GUID-6AF99E9C-1473-481E-A144-357577A53717. -Project dependencies are available in the [requirements.in](requirements.in) file, which should be compiled with [pip-tools](https://github.com/jazzband/pip-tools). - -1. Install pip-tools: +1. Install uv: see the [uv installation guide](https://docs.astral.sh/uv/getting-started/installation/). +2. Dependencies can be added to: + * `[project] dependencies` in [pyproject.toml](pyproject.toml): runtime requirements. + * `[dependency-groups]` in [pyproject.toml](pyproject.toml): `dev`, `test`, and `docs` groups. +3. Sync a local environment with all dependency groups: ```sh - pip install pip-tools + uv sync --all-groups ``` -2. Dependencies can be added to: - * [requirements.in](requirements.in): User requirements. - * [requirements-dev.in](requirements-dev.in): Development requirements. - * [requirements-test.in](requirements-dev.in): Test requirements. -3. Compile the requirement files as needed (below combines all three files into one `requirements.txt`, however it's possible to have separate files for each): - ```sh - pip-compile --output-file requirements.txt requirements.in requirements-dev.in requirements-test.in - ``` -4. Install dependencies: - * Windows: - * ```sh - pip-sync --python-executable %VIRTUAL_ENV%/scripts/python.exe requirements.txt - ``` - * Linux: - * ```sh - pip-sync --python-executable $VIRTUAL_ENV/bin/python.exe requirements.txt - ``` - - +4. To run tests against a local Maya, don't install into Maya's own environment — + keep test dependencies in a disposable venv and expose them to `mayapy` via + `PYTHONPATH` (see [Tests](#tests) below). CI installs directly into `mayapy` + instead, which is fine there because the Docker container is ephemeral.

(back to top)

@@ -100,41 +88,50 @@ Project dependencies are available in the [requirements.in](requirements.in) fil Tests are written with [Pytest](https://docs.pytest.org/) and should adhere to the ["Arrange, Act, Assert" pattern](https://docs.pytest.org/en/stable/explanation/anatomy.html). -To run tests locally: -- ```sh - pytest - ``` +Tests must run under `mayapy` (Maya's bundled interpreter) — a plain Python can't +import `maya`. To run them against a local Maya install without touching Maya's own +site-packages, put the test dependencies in a disposable venv and point `mayapy` at it: -with coverage: - ```sh - pytest --cov=src/ + # match the venv's Python to your Maya version (2024 = 3.10, 2025/2026 = 3.11) + uv venv --python 3.11 .venv-maya + uv pip install --python .venv-maya --group test . + PYTHONPATH=.venv-maya/lib/python3.11/site-packages mayapy -m pytest tests ``` +Maya's own modules still come from `mayapy`; only the test dependencies come from the +venv, so your Maya installation stays untouched. Keep this venv minimal — `PYTHONPATH` +entries take precedence over Maya's site-packages, so extra packages there can shadow +ones Maya ships. + +If you don't have Maya locally, rely on CI: it runs the suite inside Maya Docker +containers across the versions in +[reusable-maya-tests.yml](.github/workflows/reusable-maya-tests.yml). +

(back to top)

## Linting and Type Hinting -Static code analysis is performed with [Pylint](https://pypi.org/project/pylint/), formatting with [Black format](https://github.com/psf/black), and type hinting with [mypy](https://mypy.readthedocs.io/en/stable/). +Static code analysis and formatting are performed with [Ruff](https://github.com/astral-sh/ruff), and type hinting with [mypy](https://mypy.readthedocs.io/en/stable/). Configuration for both lives in [pyproject.toml](pyproject.toml). -To run pylint locally: +To run ruff's linter locally: - ```sh - pylint --rcfile=.pylintrc src/ + uv run ruff check src/ ``` - - A modified [.pylintrc](.pylintrc) file is provided with modifications to ignore Maya import errors. Append to this file as needed. -Black formater can be run locally with: +To check formatting locally: - ```sh - black src/ + uv run ruff format --check src/ ``` Run [mypy](https://mypy.readthedocs.io/en/stable/) checks locally with: - ```sh - mypy src/ + uv run mypy src/ ``` - - A modified [mypy.ini](mypy.ini) file is included with modifications to ignore Maya import errors. Append to this file as needed. + - `[tool.mypy]` in [pyproject.toml](pyproject.toml) ignores Maya import errors. Append to this section as needed.

(back to top)

@@ -165,7 +162,7 @@ Continuous integration is set up with [GitHub Actions][github-actions-url], work ### Further useful information on the workflows: * Versions of Maya to test against can be specified in the [reusable-maya-tests.yml](.github/workflows/reusable-maya-tests.yml) file. * The Maya tests workflow will only run if tests exist in the `tests` directory, otherwise the CI will skip this workflow to avoid pulling the Maya Docker image unnecessarily. -* [Coding standards enforced](.github/workflows/reusable-static-analysis.yml) with [pylint](https://pypi.org/project/pylint/), [black](https://github.com/psf/black), and [mypy](https://mypy.readthedocs.io/en/stable/), with minimal configuration. +* [Coding standards enforced](.github/workflows/reusable-static-analysis.yml) with [ruff](https://github.com/astral-sh/ruff) and [mypy](https://mypy.readthedocs.io/en/stable/), with minimal configuration. * [Docs are built](.github/workflows/reusable-build-and-deploy-docs.yml) with [mkdocs](https://www.mkdocs.org/) and deployed to GitHub pages: [https://{{PROJECT_OWNER}}.github.io/{{PROJECT_NAME}}](https://{{PROJECT_OWNER}}.github.io/{{PROJECT_NAME}}). * > To enable GitHub pages, go to the settings of your repository, scroll down to the GitHub Pages section, and select the `gh-pages` branch as the source. *drawing diff --git a/README.md b/README.md index 9ecbfae..66b1458 100644 --- a/README.md +++ b/README.md @@ -36,14 +36,38 @@ > NOTE: WAIT until first CI run on GitHub actions before cloning the new project. This will be kicked off automatically after creating the new repo from the template, and should take a couple of minutes to complete. +### CLI / agent quickstart + +No browser needed — this works for humans and coding agents (Claude Code, Codex, Cursor, etc.): + +```sh +# 1. Create a new repo from this template (use lowercase_with_underscores for the name) +gh repo create my_cool_tool \ + --template matthewlee-dev/MayaPythonProjectTemplate \ + --public \ + --description "My cool Maya tool" + +# 2. Wait for the automated initial-setup workflow to rewrite the template and push +sleep 20 # give the workflow a moment to appear +gh run watch --repo /my_cool_tool \ + $(gh run list --repo /my_cool_tool --limit 1 --json databaseId -q '.[0].databaseId') \ + --exit-status + +# 3. Clone and start coding +gh repo clone /my_cool_tool +``` + +Generated projects include an `AGENTS.md` describing the layout, uv commands, and the mayapy test workflow, so coding agents are productive in them immediately. See [AGENTS.md](AGENTS.md) in this repo for agent-facing template instructions. + ## What is included in this template? * Basic project structure. +* Dependency and packaging management with [uv](https://docs.astral.sh/uv/), configured via `pyproject.toml`. * [README.md](_README) and [CONTRIBUTING](CONTRIBUTING.md) templates. * Bug report and feature request templates. * Continuous integration using [GitHub Actions][github-actions-url] with jobs to: * [Run integration tests](.github/workflows/reusable-maya-tests.yml) across a range of Maya versions in isolated Docker containers. * `Note: You should hold a valid Maya license.` - * [Enforce coding standards](.github/workflows/reusable-static-analysis.yml) with [pylint](https://pypi.org/project/pylint/), [black](https://github.com/psf/black), and [mypy](https://mypy.readthedocs.io/en/stable/). + * [Enforce coding standards](.github/workflows/reusable-static-analysis.yml) with [ruff](https://github.com/astral-sh/ruff) and [mypy](https://mypy.readthedocs.io/en/stable/). * [Build and deploy documentation](.github/workflows/reusable-build-and-deploy-docs.yml) to GitHub pages with [mkdocs](https://www.mkdocs.org/). * [Automated releases](.github/workflows/ci-release.yml) using Python Semantic Versioning (optional). diff --git a/_AGENTS.md b/_AGENTS.md new file mode 100644 index 0000000..35898d5 --- /dev/null +++ b/_AGENTS.md @@ -0,0 +1,43 @@ +# AGENTS.md + +This is an Autodesk Maya Python tool, created from +[MayaPythonProjectTemplate](https://github.com/matthewlee-dev/MayaPythonProjectTemplate). + +## Layout + +- `src//` — the tool's Python package (src layout). +- `tests/maya/` — pytest tests that run **inside Maya** via `mayapy` (Maya's bundled + Python). `tests/maya/conftest.py` boots `maya.standalone` once per session. +- `pyproject.toml` — single source of truth: metadata, dependency groups + (`test`, `dev`, `docs`), and all tool config (ruff, mypy, semantic-release, hatchling). +- Dependencies are managed with **uv**; `uv.lock` is committed. + +## Commands + +- Setup: `uv sync --all-groups` +- Lint: `uv run ruff check src` +- Format: `uv run ruff format src` (CI enforces `ruff format --check`) +- Typecheck: `uv run mypy src` +- Tests: must run under mayapy, not plain Python. Don't install into Maya's own + environment — stage test deps in a disposable venv and expose them via `PYTHONPATH`: + ```sh + # match the venv's Python to the local Maya version (2024 = 3.10, 2025/2026 = 3.11) + uv venv --python 3.11 .venv-maya + uv pip install --python .venv-maya --group test . + PYTHONPATH=.venv-maya/lib/python3.11/site-packages mayapy -m pytest tests + ``` + Keep that venv minimal (`PYTHONPATH` shadows Maya's site-packages). Without Maya + locally, rely on CI — it runs the suite in `mottosso/maya` Docker containers across + Maya versions, installing directly into the container's mayapy (fine there: the + container is ephemeral). +- Docs: `uv run mkdocs serve` (mkdocs-material + mkdocstrings, reads `src/` directly). + +## Conventions + +- `from maya import cmds` for Maya commands; mypy ignores missing imports for `maya.*` + and `maya-stubs` provides type stubs. +- Releases use python-semantic-release driven by **Conventional Commits** + (`feat:`, `fix:`, …) — commit messages determine version bumps. Releases are cut + manually via the `Release` workflow (workflow_dispatch), which also deploys docs to + GitHub Pages. +- CI on push/PR runs static analysis (ruff, mypy) and the Maya test matrix. diff --git a/_README.md b/_README.md index ff47a8b..857b731 100644 --- a/_README.md +++ b/_README.md @@ -5,8 +5,8 @@ [![CI](https://github.com/{{PROJECT_OWNER}}/{{PROJECT_NAME}}/actions/workflows/ci-main.yml/badge.svg)](https://github.com/{{PROJECT_OWNER}}/{{PROJECT_NAME}}/actions/workflows/ci-main.yml) [![pytest][pytest-shield]][pytest-url] -[![linting: pylint](https://img.shields.io/badge/linting-pylint-yellowgreen)](https://github.com/pylint-dev/pylint) -[![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black) +[![Managed with uv](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/uv/main/assets/badge/v0.json)](https://github.com/astral-sh/uv) +[![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff) [![Checked with mypy](https://www.mypy-lang.org/static/mypy_badge.svg)](https://mypy-lang.org/) diff --git a/initial_setup.py b/initial_setup.py index 6c47495..ed00503 100644 --- a/initial_setup.py +++ b/initial_setup.py @@ -1,4 +1,5 @@ from pathlib import Path +import json import os import re @@ -35,3 +36,21 @@ def rename_python_src_directory(project_name): replace_text_in_file("mkdocs.yml", "{{SITE_NAME}}", project_name) new_project_name = rename_python_src_directory(project_name) replace_text_in_file("tests/maya/test_example.py", "{{PROJECT_NAME}}", new_project_name) + # pyproject.toml carries real values (not {{...}} placeholders) so the template + # repo itself stays valid TOML for uv. Replace the wheel path before the project + # name, as both contain the same literal. json.dumps produces TOML-safe strings. + replace_text_in_file( + "pyproject.toml", + 'packages = ["src/mayapythonprojecttemplate"]', + f'packages = ["src/{new_project_name}"]', + ) + replace_text_in_file( + "pyproject.toml", + 'name = "mayapythonprojecttemplate"', + f"name = {json.dumps(project_name)}", + ) + replace_text_in_file( + "pyproject.toml", + 'description = "A GitHub template for Maya Python tools"', + f"description = {json.dumps(project_description or '')}", + ) diff --git a/mypy.ini b/mypy.ini deleted file mode 100644 index 19e8969..0000000 --- a/mypy.ini +++ /dev/null @@ -1,4 +0,0 @@ -[mypy] - -[mypy-maya.*] -ignore_missing_imports = True \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..0604815 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,34 @@ +[project] +name = "mayapythonprojecttemplate" +version = "0.0.0" +description = "A GitHub template for Maya Python tools" +requires-python = ">=3.10" +dependencies = [] + +[dependency-groups] +test = ["pytest"] +dev = ["mypy", "maya-stubs", "ruff"] +docs = ["mkdocs-material", "mkdocstrings[python]"] + +[tool.mypy] + +[[tool.mypy.overrides]] +module = "maya.*" +ignore_missing_imports = true + +[tool.ruff] +line-length = 88 + +[tool.ruff.lint] +select = ["E", "F", "I", "UP", "B"] + +[tool.semantic_release] +version_toml = ["pyproject.toml:project.version"] +allow_zero_version = true + +[build-system] +requires = ["hatchling"] +build-backend = "hatchling.build" + +[tool.hatch.build.targets.wheel] +packages = ["src/mayapythonprojecttemplate"] diff --git a/requirements-dev.in b/requirements-dev.in deleted file mode 100644 index 4444674..0000000 --- a/requirements-dev.in +++ /dev/null @@ -1,7 +0,0 @@ --r requirements.txt -black -pylint -mkdocs-material -mkdocstrings[python] -mypy -maya-stubs \ No newline at end of file diff --git a/requirements-test.in b/requirements-test.in deleted file mode 100644 index 26b77f6..0000000 --- a/requirements-test.in +++ /dev/null @@ -1,2 +0,0 @@ --r requirements.txt -pytest diff --git a/requirements.in b/requirements.in deleted file mode 100644 index e69de29..0000000 diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index 8b13789..0000000 --- a/requirements.txt +++ /dev/null @@ -1 +0,0 @@ - diff --git a/tests/conftest.py b/tests/conftest.py index 2d068ce..543c6b8 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -3,7 +3,8 @@ import pytest -@pytest.fixture(scope='session', autouse=True) + +@pytest.fixture(scope="session", autouse=True) def add_root_to_sys_path(): root_dir = Path(__file__).resolve().parent.parent / "src" sys.path.insert(0, str(root_dir)) diff --git a/tests/maya/conftest.py b/tests/maya/conftest.py index 45786ff..4d196a4 100644 --- a/tests/maya/conftest.py +++ b/tests/maya/conftest.py @@ -1,12 +1,11 @@ import pytest + @pytest.fixture(scope="session", autouse=True) def run_in_maya(): - from maya import ( - standalone, - cmds - ) + from maya import standalone, cmds + standalone.initialize() cmds.scriptEditorInfo(e=True, sw=True, se=True, si=True) yield - standalone.uninitialize() \ No newline at end of file + standalone.uninitialize() diff --git a/tests/maya/test_example.py b/tests/maya/test_example.py index 453c07b..4f92c6e 100644 --- a/tests/maya/test_example.py +++ b/tests/maya/test_example.py @@ -11,4 +11,3 @@ # # # Assert # assert cmds.objExists(test_loc) - diff --git a/uv.lock b/uv.lock new file mode 100644 index 0000000..c39bc12 --- /dev/null +++ b/uv.lock @@ -0,0 +1,1063 @@ +version = 1 +revision = 3 +requires-python = ">=3.10" +resolution-markers = [ + "python_full_version >= '3.15'", + "python_full_version < '3.15'", +] + +[[package]] +name = "ast-serialize" +version = "0.8.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e1/a9/11851c3e02a3fea2ddc9932d1fdc7d2edaeecc0d2e11bc5f2a7fde2b0934/ast_serialize-0.8.0.tar.gz", hash = "sha256:6c37c43e4004dfb42d321ddedc569dc17ff4259296f3af577c9ea46a809bc010", size = 845638, upload-time = "2026-08-07T11:29:02.152Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/34/16/6e520b57cd8c75914b38c670ad4593d13c22911e4306cc7165dab8b0789b/ast_serialize-0.8.0-cp314-cp314-pyemscripten_2026_0_wasm32.whl", hash = "sha256:3d822605fa7bb326ef868d25fafced7fc660fa46d9b90c02ea86d5e2f5d325f7", size = 863924, upload-time = "2026-08-07T11:27:34.579Z" }, + { url = "https://files.pythonhosted.org/packages/03/e1/48802de9b22a2bcad42ec80601a17e3f69172fe4f590e6311bcc2b323aeb/ast_serialize-0.8.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:2efa40b068197d5efb62655b43baadb842ed71c4958cccd3e8b86a35726f0119", size = 1177662, upload-time = "2026-08-07T11:27:36.196Z" }, + { url = "https://files.pythonhosted.org/packages/38/d4/323438db76bded3a1f3523a3167b8325916b2ddceb2107a330c6ec9fcf4d/ast_serialize-0.8.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:db1b957291bca08c7e72f43a12357b2948e20775d970e3fc3dac0aa3160ab725", size = 1167072, upload-time = "2026-08-07T11:27:37.646Z" }, + { url = "https://files.pythonhosted.org/packages/77/82/53c5400b54144b56de8ed7f957fd1ccd97e42482009292ab46121d15f8dd/ast_serialize-0.8.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fdc0d5b18ff8fb364e87923e47c0a91d0d69dbcaeaa274591f7fd26892cc3a3a", size = 1225497, upload-time = "2026-08-07T11:27:39.225Z" }, + { url = "https://files.pythonhosted.org/packages/44/5f/36c07327a8b91303fbf1382c7c3e8a2902072dbe1b9546138a5288e75ff0/ast_serialize-0.8.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9da7330f3e235bf7da89b8d39205c6350fc0c08a85379743f2df9fff87d6d980", size = 1227101, upload-time = "2026-08-07T11:27:40.799Z" }, + { url = "https://files.pythonhosted.org/packages/9d/48/5adf5c67addc7ddb328122208c6d375a84cf154984f412b4087330a157bd/ast_serialize-0.8.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f3186969ee66a9863b00acc6523ace44c56974eecb348a7ea4b228d9f0b80e19", size = 1424001, upload-time = "2026-08-07T11:27:42.708Z" }, + { url = "https://files.pythonhosted.org/packages/38/a1/70074dd3869d2b0e934f91891d8d6b734361cd3b80f85ca7ece2e668ecdd/ast_serialize-0.8.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:40a57b73731be45da4fa41430c4d5dc94a24b3a4faba7b9e069978c0402064ea", size = 1245545, upload-time = "2026-08-07T11:27:44.4Z" }, + { url = "https://files.pythonhosted.org/packages/e3/be/53b9c0a8a6399950c2e3546bdfab96d2b299d5b114b47eb94fd3c49c4054/ast_serialize-0.8.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5075b9da3ef807eda752502446dfecea3b381c4900b7e27a5d5f4f899eb39951", size = 1248961, upload-time = "2026-08-07T11:27:45.781Z" }, + { url = "https://files.pythonhosted.org/packages/eb/13/3651d3812548a2bda15e26e5dd51aadb48cf682d0865370255fcf0e367dd/ast_serialize-0.8.0-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:293cc1c5bfa741f8e3fbe8175b9c07beee487c9a6fdbb25a5acad9f1df2d30a9", size = 1243877, upload-time = "2026-08-07T11:27:47.325Z" }, + { url = "https://files.pythonhosted.org/packages/21/a0/521f0bf000f675e9312a4aae2c8ba7a992405d072a85c485e08fd59433b9/ast_serialize-0.8.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e0910c3442a75216dde0f102d854ba2aaa71d2482e0ee213630b9bf29584fba3", size = 1293903, upload-time = "2026-08-07T11:27:49.264Z" }, + { url = "https://files.pythonhosted.org/packages/b1/7e/402fc902568aa2ee65865a3e151f000db0153da8ce6b1be4c9c349025f8d/ast_serialize-0.8.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:43dd6d596879bb1cb8a12cc9dae7bb10090a39a35883026c24f82488a195619a", size = 1401070, upload-time = "2026-08-07T11:27:50.947Z" }, + { url = "https://files.pythonhosted.org/packages/ff/7c/97d4b66c057f1706fc8be6dd532cc77c988794357c8f4ffdb6adabb39562/ast_serialize-0.8.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:8c9d537f59e936392cfd3597789d1390304dd659efc3c486ce7f40fb6b8a9f53", size = 1502602, upload-time = "2026-08-07T11:27:52.364Z" }, + { url = "https://files.pythonhosted.org/packages/89/6f/72cc3b71562001bba46e898ccfbf1844f7939b3e28912736206102f2e5a8/ast_serialize-0.8.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:f0190a33d7f97c65e9069f7a7f40499eea6b5cbe260c558378109caf20ce934b", size = 1495848, upload-time = "2026-08-07T11:27:53.803Z" }, + { url = "https://files.pythonhosted.org/packages/a0/53/d6f629d1e49308b2f363dae028baa213ec222c9106fa1f7f0d1f7b41499a/ast_serialize-0.8.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:77308ae6c5cf5264cc0f01a7c556ec77a9e68eb1f61b093534d698139fdc3b14", size = 1556556, upload-time = "2026-08-07T11:27:55.342Z" }, + { url = "https://files.pythonhosted.org/packages/ee/22/340f35dd8dfc6d412d53dc20699ca014b8d228db923e8ed4759c512b162c/ast_serialize-0.8.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:8d53a23f27e1ed3a36b2d26fd2a1a6228c8e85a1ed62ff7cdb44bd610769f20a", size = 1417822, upload-time = "2026-08-07T11:27:56.712Z" }, + { url = "https://files.pythonhosted.org/packages/11/29/6dde5c13fbebc051d3a6df4ec0a6fd1d5359333cc1193f7f609f3410b4d8/ast_serialize-0.8.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ffa5e7cb08f96fed9121f77b224151e41caf88feab9d652bb46c78202b6fbeda", size = 1445153, upload-time = "2026-08-07T11:27:58.275Z" }, + { url = "https://files.pythonhosted.org/packages/62/c5/f473a8ed030f7a0ca24b9849cca184677a50c053867a7b808c2e1289bbd3/ast_serialize-0.8.0-cp314-cp314t-win32.whl", hash = "sha256:fa70ed4dea0bb18b30a1789c77baa701d0ef30c474f2ccabdea61e25623a8827", size = 1063711, upload-time = "2026-08-07T11:27:59.793Z" }, + { url = "https://files.pythonhosted.org/packages/23/63/39e171fcd38ca057c2e1979d5ee81ac7a3502784abe3d83df7454f7a0978/ast_serialize-0.8.0-cp314-cp314t-win_amd64.whl", hash = "sha256:d8b3c8eee4c1baef9d4e84d2a59a805501617127be42615cb48970b15b0892b6", size = 1103740, upload-time = "2026-08-07T11:28:01.405Z" }, + { url = "https://files.pythonhosted.org/packages/21/1c/d00762b399e7726d68d0a088cc946e3a4c60f1c6176f557608f672f627f3/ast_serialize-0.8.0-cp314-cp314t-win_arm64.whl", hash = "sha256:ac4f0a83c55a9b782f79ad55a5247b7db123c1db405959791c2ef886e9710c9f", size = 1076021, upload-time = "2026-08-07T11:28:02.947Z" }, + { url = "https://files.pythonhosted.org/packages/4c/11/911210c3c78923273a9211a2b6cfc4c8aa723b30dab3e1c8d19afb983b40/ast_serialize-0.8.0-cp315-abi3.abi3t-macosx_10_12_x86_64.whl", hash = "sha256:86b8a1e6d90467345356098b040150e82fbc26d24a7a202224b13dc1f6264ca0", size = 1177715, upload-time = "2026-08-07T11:28:04.654Z" }, + { url = "https://files.pythonhosted.org/packages/77/89/6282881c8587606638db153cbe21e1e0c4d1f3970dee1aa0610a1c62a026/ast_serialize-0.8.0-cp315-abi3.abi3t-macosx_11_0_arm64.whl", hash = "sha256:39e92ff8e8cb45947fe9007174b2950e1fb098e6abd00266a13cd3bcf6675068", size = 1169347, upload-time = "2026-08-07T11:28:06.1Z" }, + { url = "https://files.pythonhosted.org/packages/97/78/a9f846a03a340ff3728c915f23338ca742742f3292700559cdb3ad999b1e/ast_serialize-0.8.0-cp315-abi3.abi3t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c85d8d18db5b2dfcb3b7e38a4d600ca35504c0ed8a6f75cd1c811e4ffe248a15", size = 1225916, upload-time = "2026-08-07T11:28:07.654Z" }, + { url = "https://files.pythonhosted.org/packages/c0/15/aba6ef8a988a6eceb6f0359589aac509e29ae2dba67fd9bfd5af0c3f13e7/ast_serialize-0.8.0-cp315-abi3.abi3t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9830ff7e764f74d9eefb01170c61a9f0fd2c027dac5fcb72e064decd57d56371", size = 1227135, upload-time = "2026-08-07T11:28:09.504Z" }, + { url = "https://files.pythonhosted.org/packages/94/29/3f63d696ea7c5b8abadcecc3505be51bd900daaccc522ed8322fa5b05a93/ast_serialize-0.8.0-cp315-abi3.abi3t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6479d9722a4cd21b578f5478074c41e6169f04811996ec881655560f703a5bba", size = 1425040, upload-time = "2026-08-07T11:28:11.044Z" }, + { url = "https://files.pythonhosted.org/packages/e2/5d/0aac338604ff59df5774d4304307898982252f325ff7cafe31d52fedcb65/ast_serialize-0.8.0-cp315-abi3.abi3t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a63bed264e818cd83eec11feed0f50aa162542b91132ef58afebc857182763a5", size = 1246278, upload-time = "2026-08-07T11:28:12.519Z" }, + { url = "https://files.pythonhosted.org/packages/23/ca/9f1ef795bb724719532bd86dbec11e5b66857d3fbe9b6772baec0191a6ed/ast_serialize-0.8.0-cp315-abi3.abi3t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d187197d234aa45d6cfa2b096be5f666e8cc2e7eb3722d0ab8926293cf5720c", size = 1250029, upload-time = "2026-08-07T11:28:13.896Z" }, + { url = "https://files.pythonhosted.org/packages/dc/25/5e061372d2ed953b9ba3b9c4f73de3b8e9234cda3f6c088db4686801d0e1/ast_serialize-0.8.0-cp315-abi3.abi3t-manylinux_2_31_riscv64.whl", hash = "sha256:2d39a56282cfcc0d8eeea37267c754be59c98d48505c23b1dae5c6011f3813dd", size = 1243575, upload-time = "2026-08-07T11:28:15.37Z" }, + { url = "https://files.pythonhosted.org/packages/a8/c1/ae7da218053120635a4ca802366c69f707203641af95372eeb83f70dfd52/ast_serialize-0.8.0-cp315-abi3.abi3t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f7cc5f10386994c0f4844f1e6d6a97127e9b478660eb6dec2b257644f0acab64", size = 1294396, upload-time = "2026-08-07T11:28:16.813Z" }, + { url = "https://files.pythonhosted.org/packages/2e/89/271d1f49c5269fcddcc789ea3f25be401f6723fc1138aeda539f4d05516d/ast_serialize-0.8.0-cp315-abi3.abi3t-musllinux_1_2_aarch64.whl", hash = "sha256:6102f2f985c2e542be85cd857678ec9356fefa792b93cadfadd31139f5696f27", size = 1401987, upload-time = "2026-08-07T11:28:18.333Z" }, + { url = "https://files.pythonhosted.org/packages/55/be/4e7d77fcf571ac7cb5cf7115a20c36642bd7d29473b45dfaaefeb9618f90/ast_serialize-0.8.0-cp315-abi3.abi3t-musllinux_1_2_armv7l.whl", hash = "sha256:3a8660fe66667b76a6e9dccd1d33e66b229fde3b308db991c041609226c005b6", size = 1502904, upload-time = "2026-08-07T11:28:20.039Z" }, + { url = "https://files.pythonhosted.org/packages/8b/ae/ed1de2db7e019d4236fbc164ffa5ef9a6022a300a342bbf142d21b7c141e/ast_serialize-0.8.0-cp315-abi3.abi3t-musllinux_1_2_i686.whl", hash = "sha256:e7266307e5fba39836edb79def8608887af48820508bff3c5f2941e1e04d1534", size = 1496967, upload-time = "2026-08-07T11:28:21.734Z" }, + { url = "https://files.pythonhosted.org/packages/92/89/5fea507fae5c5f18b7dc7f95e5c00956574b8c717b8fd2049c504fab0b18/ast_serialize-0.8.0-cp315-abi3.abi3t-musllinux_1_2_ppc64le.whl", hash = "sha256:4ca7e6fd1ad845d1cc649dc2ecd499db2f8f46af5bf8da7b70dd858774cc038b", size = 1559041, upload-time = "2026-08-07T11:28:23.194Z" }, + { url = "https://files.pythonhosted.org/packages/42/71/478d69df21b64e064554a68134c94be304270316ca676a94e63c389a636a/ast_serialize-0.8.0-cp315-abi3.abi3t-musllinux_1_2_riscv64.whl", hash = "sha256:2880350b13d3eae69a0d70bc1fb6c9bfaca4dbd0e20ba8cd1aa483080b56ff06", size = 1417367, upload-time = "2026-08-07T11:28:24.601Z" }, + { url = "https://files.pythonhosted.org/packages/5e/2d/8962dc8d5b3a9dc27b36f9db199afa25264c741505469d9ec10ffbfd2ba7/ast_serialize-0.8.0-cp315-abi3.abi3t-musllinux_1_2_x86_64.whl", hash = "sha256:ab0f9a59f7d63d0d441b56b9a818b273705264352d5115cfee12e940e816d958", size = 1446178, upload-time = "2026-08-07T11:28:26.152Z" }, + { url = "https://files.pythonhosted.org/packages/4f/22/14d2ad4fd1d1bcd0dc687ca268e0630069f45162496260c0efb70ee0ea72/ast_serialize-0.8.0-cp315-abi3.abi3t-win32.whl", hash = "sha256:0485a25ef519c62e749ee3c1ad8070e591b380d67226349eb5a70b228dc1ac4a", size = 1063811, upload-time = "2026-08-07T11:28:27.864Z" }, + { url = "https://files.pythonhosted.org/packages/18/1d/84a327c0202a41aa5fdba3ade33904d6d8f3b9e6806fa83568d835395850/ast_serialize-0.8.0-cp315-abi3.abi3t-win_amd64.whl", hash = "sha256:bd84d60bca7079e741be4ac5dbe237751a59d7f6f9f0126b11880d63822cbe16", size = 1105518, upload-time = "2026-08-07T11:28:29.691Z" }, + { url = "https://files.pythonhosted.org/packages/8c/92/74556dec52fde85a2ad84ed159991b916241043788609c15d8b77e14570b/ast_serialize-0.8.0-cp315-abi3.abi3t-win_arm64.whl", hash = "sha256:057769b5921336eb2d9124f2a731b42ed05ffdac559b840dbdf6f3937cf153dc", size = 1076319, upload-time = "2026-08-07T11:28:31.282Z" }, + { url = "https://files.pythonhosted.org/packages/d1/5d/c650b1f2cc1e75193358da95a080261422e8cd10b66d7370b1688c9915c5/ast_serialize-0.8.0-cp315-cp315-pyemscripten_2026_5_wasm32.whl", hash = "sha256:a02cbed7d8bfdcdee88edaac12bd50d53d9953aaa2e1852ef078625be5f1c0b5", size = 852914, upload-time = "2026-08-07T11:28:32.929Z" }, + { url = "https://files.pythonhosted.org/packages/d9/e3/6142e920fec6ef7bccabd8c24ed8ed99f8bdc6cb8b065e1df7c6a3b2d667/ast_serialize-0.8.0-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:e1bd223df0f6c96b396975fa604cb33bce53d9b4a0185490be4c4a289f7c9c87", size = 1184007, upload-time = "2026-08-07T11:28:34.654Z" }, + { url = "https://files.pythonhosted.org/packages/a6/e9/6e8be8df02b35d85e2b8809f7f1cfa290bdf5882b55127a539d049482db0/ast_serialize-0.8.0-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:ddd3b61f45c132da66c5476b281891e08c1fd87fbdabe8a6973e1622efc85f06", size = 1177588, upload-time = "2026-08-07T11:28:36.318Z" }, + { url = "https://files.pythonhosted.org/packages/8c/80/7e0fd2e2e2aba257820db4a8657c4c356844d36b914b20a4af294bcfb902/ast_serialize-0.8.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f9caa63fad8241257ae401b5ff0a64026c6adb36b8e86cbe8782d9ea505daf6", size = 1234575, upload-time = "2026-08-07T11:28:37.772Z" }, + { url = "https://files.pythonhosted.org/packages/b0/6a/3bae0af06f9b1bae3001c44d64215f5b567877e7aae9ffd45db11c3a7647/ast_serialize-0.8.0-cp39-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3926fa117b5e65019853a2969966d11c7175af377a3425991f3fe73784412405", size = 1236015, upload-time = "2026-08-07T11:28:39.14Z" }, + { url = "https://files.pythonhosted.org/packages/6f/c4/ce2d41a1bc22508e82618901f7e10f2a5e2f9556553fea90624daf9875e2/ast_serialize-0.8.0-cp39-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:485f1113af805e9e170b95ef993ca3fbd4f89c04bab25c58b4fc632d854801ab", size = 1432808, upload-time = "2026-08-07T11:28:40.664Z" }, + { url = "https://files.pythonhosted.org/packages/1a/90/f5058f209756dd70e958b7538aaa82d25d24944baf9ec8ae6f27b06fcacc/ast_serialize-0.8.0-cp39-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3ccebbed24f1281062d5852353c72c47502955926cfcb8345ffb3a44d87ff3d3", size = 1256251, upload-time = "2026-08-07T11:28:42.223Z" }, + { url = "https://files.pythonhosted.org/packages/bf/32/7f77ea87fa0836daab706ed5cb7f903bb25fa26a77439011aee626af11d8/ast_serialize-0.8.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:252f883290d1cdb728eb7fe1d9a7221b88af5a329aae0bc91ddee4dafb820331", size = 1258574, upload-time = "2026-08-07T11:28:43.751Z" }, + { url = "https://files.pythonhosted.org/packages/eb/5a/75b82ad2725b5e8e8c742732f9e76c6738a292d0709e1f60d10a973730b4/ast_serialize-0.8.0-cp39-abi3-manylinux_2_31_riscv64.whl", hash = "sha256:96abc072ad29db8d02194afd47d68987322622787daceae82398d7b69f3ba2e6", size = 1254075, upload-time = "2026-08-07T11:28:45.28Z" }, + { url = "https://files.pythonhosted.org/packages/4e/54/8c20ed4eea805516a3fd23dd4a721ce28c64f50f0e4b359969f60a8c97a6/ast_serialize-0.8.0-cp39-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9118ad3e369727060b2696fc4078f250ecffca4248ba87f537f55cea9f9dce06", size = 1301018, upload-time = "2026-08-07T11:28:46.851Z" }, + { url = "https://files.pythonhosted.org/packages/cb/5b/9f14430f12fe830b656fb38f8e2e05ee13b02a88967660bef46af0ab22a8/ast_serialize-0.8.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:f359df4bd921918af8bebd142a376c77511d7151cc8ba852760b587b5a4a54f3", size = 1409951, upload-time = "2026-08-07T11:28:48.312Z" }, + { url = "https://files.pythonhosted.org/packages/2d/3d/084882eca93c842bd4262591a071ec7f825340644035e51501208cc5a8d4/ast_serialize-0.8.0-cp39-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:e94f9121d13fa36cbf21314783c77d05ae3a0868decd18cf5233fdcc6de49ac8", size = 1509544, upload-time = "2026-08-07T11:28:49.847Z" }, + { url = "https://files.pythonhosted.org/packages/ce/73/ea84852096c2036c61cc0b2f97b90242207419f534dc671060ee1c8e05cb/ast_serialize-0.8.0-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:54f95b486018d262bcb387a9afd96f0da74508b442762b80c769454a6fbb3ee3", size = 1505671, upload-time = "2026-08-07T11:28:51.239Z" }, + { url = "https://files.pythonhosted.org/packages/cb/88/287b9a5300c1f2f651d259f670931b63110adc265b7613c885b44c5bc53d/ast_serialize-0.8.0-cp39-abi3-musllinux_1_2_ppc64le.whl", hash = "sha256:4c38b915511e32bc718c49dbce98ff9af36bac0ad6a604f58000cd5e3aecdba7", size = 1563685, upload-time = "2026-08-07T11:28:53.112Z" }, + { url = "https://files.pythonhosted.org/packages/ee/f3/1bc3a79afcf0c2a8d2c37182d0d659d1545a9d7f7f6dc9cf3e63d6c17135/ast_serialize-0.8.0-cp39-abi3-musllinux_1_2_riscv64.whl", hash = "sha256:9a2ef9cf12f2de4f1028c42c1dd7d775255e0fb3e5bb48896c97e35ef52366fe", size = 1427977, upload-time = "2026-08-07T11:28:54.418Z" }, + { url = "https://files.pythonhosted.org/packages/5c/cd/440c798957e14e31776bfeb024d8fafe0bb1d5b89c51c2f067e69938f7b0/ast_serialize-0.8.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:6f18048fe9f6dd266bd577cdec48bdcecb74faaa01fe941324435483b013ed2a", size = 1454335, upload-time = "2026-08-07T11:28:55.968Z" }, + { url = "https://files.pythonhosted.org/packages/4f/4a/587eb36dcc240a54c8660f599464516b469ecad96f0dbdb6bccbedb50745/ast_serialize-0.8.0-cp39-abi3-win32.whl", hash = "sha256:31883542dd6c94d178f5db3d32fbd69c5eb88b3a7c018e7ac8cc0c45195ddbed", size = 1068858, upload-time = "2026-08-07T11:28:57.541Z" }, + { url = "https://files.pythonhosted.org/packages/5f/a4/3e887bbd92164e183cb6e412c6a3e9198ddd446d7fe405958293ef5ef49c/ast_serialize-0.8.0-cp39-abi3-win_amd64.whl", hash = "sha256:861794565b06337005c1447ef23103a3d5a627d08bdc827870d00d0b28ef5f51", size = 1111839, upload-time = "2026-08-07T11:28:59Z" }, + { url = "https://files.pythonhosted.org/packages/25/6c/b400476d3ceba681ab929787edc9554f6d88fcc69435eb681b00fc0457a5/ast_serialize-0.8.0-cp39-abi3-win_arm64.whl", hash = "sha256:b2a5978662fd4db463dfb4b974d2b10ac6430b98f5333aabc7051909df3561d0", size = 1083655, upload-time = "2026-08-07T11:29:00.349Z" }, +] + +[[package]] +name = "babel" +version = "2.18.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/b2/51899539b6ceeeb420d40ed3cd4b7a40519404f9baf3d4ac99dc413a834b/babel-2.18.0.tar.gz", hash = "sha256:b80b99a14bd085fcacfa15c9165f651fbb3406e66cc603abf11c5750937c992d", size = 9959554, upload-time = "2026-02-01T12:30:56.078Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/77/f5/21d2de20e8b8b0408f0681956ca2c69f1320a3848ac50e6e7f39c6159675/babel-2.18.0-py3-none-any.whl", hash = "sha256:e2b422b277c2b9a9630c1d7903c2a00d0830c409c59ac8cae9081c92f1aeba35", size = 10196845, upload-time = "2026-02-01T12:30:53.445Z" }, +] + +[[package]] +name = "backrefs" +version = "8.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ec/56/4744bcd0c82184e80c52b0ac4076c261a8ffa1f1b343ff2f6e89ce0e1cef/backrefs-8.0.tar.gz", hash = "sha256:b556cd7d36c3a3a2f256b89590b176b8eddfb73bcfaee3a3ddd84ea66d21ce50", size = 7013081, upload-time = "2026-07-26T19:54:24.638Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e3/fd/9bf53b6a6f6f519ffaac765df2f2a25e5c2fc6d32cfd2b2747099e72c911/backrefs-8.0-py310-none-any.whl", hash = "sha256:4a627b817fd2dce43b79ab48da63613340509381cd8ce0897078a0bce79a2ab8", size = 380377, upload-time = "2026-07-26T19:54:17.457Z" }, + { url = "https://files.pythonhosted.org/packages/e1/29/4bd7ae72a2634da00379c2b3bcc5439e7c94620235c6afea8af15229a973/backrefs-8.0-py311-none-any.whl", hash = "sha256:f0c35cf0102ba6b6070c12a492be3c1c1d3f5839529784b9a9565d6d04569a01", size = 392169, upload-time = "2026-07-26T19:54:18.782Z" }, + { url = "https://files.pythonhosted.org/packages/29/13/232505664e8e2a0c7a2eb0c505cfade9d715538f89a5d62bc4c272968f62/backrefs-8.0-py312-none-any.whl", hash = "sha256:87f0fae8c5f207fe9f4b2887efc71d42f4900ac78faa1af08d675ef303692dc5", size = 398084, upload-time = "2026-07-26T19:54:19.954Z" }, + { url = "https://files.pythonhosted.org/packages/8a/69/47a3dc20abc4fa5486655fde681bd55e63211b46c886d8c02223d6468431/backrefs-8.0-py313-none-any.whl", hash = "sha256:601ce68ca12385dbda06ce264406b4c4210cf5b79fd0fd627592365c92f29a88", size = 400040, upload-time = "2026-07-26T19:54:21.194Z" }, + { url = "https://files.pythonhosted.org/packages/1c/cf/e5f9b68a5b0e939a2fb933a66c20180d0c9241bf8927f7a47fa48c1675e9/backrefs-8.0-py314-none-any.whl", hash = "sha256:9ec96efa080938be92323e8e730e57718c9c88eb15ad70bbef4e1766df591408", size = 411903, upload-time = "2026-07-26T19:54:23.221Z" }, +] + +[[package]] +name = "certifi" +version = "2026.7.22" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a3/c2/24167ea9858356b47a87a50d39908bfdb72ceeefe0041586e704e5376b3a/certifi-2026.7.22.tar.gz", hash = "sha256:741e2c3b351ddf169a738da9f2c048608ff7f2c5cc02f1ebc6b118bb090d5d55", size = 138112, upload-time = "2026-07-22T03:35:12.644Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0b/a7/71ac2cff56fec219ed242bb11b8efb69fcc4bec75db06fb7bfe35de520e6/certifi-2026.7.22-py3-none-any.whl", hash = "sha256:62f22742b58a1a33014a2b6b706588a8d7e2a88ae7bd1a6ebe8c992928483775", size = 136983, upload-time = "2026-07-22T03:35:11.276Z" }, +] + +[[package]] +name = "charset-normalizer" +version = "3.4.9" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/bd/2a/23f34ec9d04624958e137efdc394888716353190e75f25dd22c7a2c7a8aa/charset_normalizer-3.4.9.tar.gz", hash = "sha256:673611bbd43f0810bec0b0f028ddeaaa501190339cac411f347ac76917c3ae7b", size = 152439, upload-time = "2026-07-07T14:34:58.454Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ad/81/8e983840c6e5b93b33c2ba81aa3d52c2e42f0e9a690ce7607a2e61da4a5c/charset_normalizer-3.4.9-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cd6280cf040f233bd7d3407b743b4b4c74f70e8e1c4199cb112a62c941c0772a", size = 322240, upload-time = "2026-07-07T14:32:36.236Z" }, + { url = "https://files.pythonhosted.org/packages/de/d1/b4319dc3229d8272fba305e206fc0a148e2de8d4087917ce62ae6382f359/charset_normalizer-3.4.9-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:aa99adc8f081b475a12843953db36831eaf83ec33eb46a90629ca6a5de45a616", size = 216475, upload-time = "2026-07-07T14:32:38.142Z" }, + { url = "https://files.pythonhosted.org/packages/80/33/6c99c1b3e6b8bf730e1bc809b9a2608f224145069114c479a2e9e1494346/charset_normalizer-3.4.9-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c1225416b463483160e4af85d5fc3a9690ccb53fd4b1865a6437825f5ede3209", size = 238670, upload-time = "2026-07-07T14:32:39.658Z" }, + { url = "https://files.pythonhosted.org/packages/7f/f4/ffbb83546e1f198ecc70ecd372b65cf2b50f9068b380abd67640f17a8e18/charset_normalizer-3.4.9-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:16d10d789dd9bcca1173c95af82c58433122564b7bc39385124be735a35cbe99", size = 233476, upload-time = "2026-07-07T14:32:41.155Z" }, + { url = "https://files.pythonhosted.org/packages/e8/5f/b98b8da398637b551e427e7be922bdec19177dc54d6811dcdaa503f23aac/charset_normalizer-3.4.9-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9bb41182d93ea91f60b4bc8fbf4c820c69ef8a12ab2d917f3f1834f1acad07e8", size = 223817, upload-time = "2026-07-07T14:32:42.592Z" }, + { url = "https://files.pythonhosted.org/packages/36/31/a276bb2e66243072a3fd06fdcab9cbb61a305b02143d70d2bda21d888fa8/charset_normalizer-3.4.9-cp310-cp310-manylinux_2_31_armv7l.whl", hash = "sha256:bcf74c1df76758a395bf0af608c04c82257523f55c9868b334f06270d0f2112b", size = 207974, upload-time = "2026-07-07T14:32:44.258Z" }, + { url = "https://files.pythonhosted.org/packages/5e/be/7ee4453d7e88dfbc4104ccd34900b9f2c7c17dac22881865fe0e82424a25/charset_normalizer-3.4.9-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b5314963fce9b0b12743891de876e724997864ee22aa496f903f426c7e2fa5b2", size = 221655, upload-time = "2026-07-07T14:32:45.64Z" }, + { url = "https://files.pythonhosted.org/packages/1d/85/181c652953eb5276d198f375b1dd641047392050098100a3a02d6534f657/charset_normalizer-3.4.9-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e9701d0049d92c16703a42771b98d560b95248949f23f8cf7b4eddd201814fb9", size = 219229, upload-time = "2026-07-07T14:32:47.376Z" }, + { url = "https://files.pythonhosted.org/packages/0c/e7/aaf6da33fc9f4691cda8f7efbc9f69179d3d39ec8a4799baf273ee1d8db0/charset_normalizer-3.4.9-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:65a7ff3f705e57d392f7261b6d0550fe137c3019477431f1c355e0db0a7d3e15", size = 209704, upload-time = "2026-07-07T14:32:48.855Z" }, + { url = "https://files.pythonhosted.org/packages/63/01/f2fb3bd3a73be48b173ee0c6aa8d2497af97d5663a8c4c4b491de4c62f7a/charset_normalizer-3.4.9-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:79580094b00d1789d1f93ea55bc43cb2f611910c72235b7657f3482ddcc1b22d", size = 226243, upload-time = "2026-07-07T14:32:50.239Z" }, + { url = "https://files.pythonhosted.org/packages/c4/02/c57a22739fe05246b0b5783b3bfb6afaac4eebb46f3ececdfb2f048f780e/charset_normalizer-3.4.9-cp310-cp310-win32.whl", hash = "sha256:432786d3561e69aeeae6c7e8648964ce0ad05736120135601f87ac26b9c83381", size = 150935, upload-time = "2026-07-07T14:32:51.676Z" }, + { url = "https://files.pythonhosted.org/packages/37/8d/ca39a7559a4797505530d084fd3a49a2c959efbbbff146302fb7be4e3b35/charset_normalizer-3.4.9-cp310-cp310-win_amd64.whl", hash = "sha256:8c041122946b7ba21bb32c45b1aa57b1be35527690aeb3c5c234521085632eee", size = 162314, upload-time = "2026-07-07T14:32:53.193Z" }, + { url = "https://files.pythonhosted.org/packages/01/da/a44bd7a13d426e69e4894557106cd58669097bfad4a8681123b618fbfc5d/charset_normalizer-3.4.9-cp310-cp310-win_arm64.whl", hash = "sha256:375b83ed0aecfce76c16d198fbc21f3b11b337d68662bea0a995046682a11419", size = 153075, upload-time = "2026-07-07T14:32:54.554Z" }, + { url = "https://files.pythonhosted.org/packages/0b/e3/85ec501f206fb049259288c1f3506e53876937fb00edb47009348e66756b/charset_normalizer-3.4.9-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0e94703ec9684807f20cfb5eed95c70f67f2a8f21ad620146d7b5a13677b93e5", size = 317075, upload-time = "2026-07-07T14:32:56.021Z" }, + { url = "https://files.pythonhosted.org/packages/c3/69/2a5385192e67175f7d8bd5ce4f57c24bc956439adeae5c13a99aa28a53d1/charset_normalizer-3.4.9-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2a441ea71902098ffe78c5abe6c494f44160b4af614ed16c3d9a3b1d17fd8ee2", size = 213837, upload-time = "2026-07-07T14:32:57.78Z" }, + { url = "https://files.pythonhosted.org/packages/b3/46/03ddc7da576d814fe0a36dd1f0fd3258e95404b4b2e3c026b7923d7e133f/charset_normalizer-3.4.9-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:304b13570067b2547562e308af560b3963857b1fa90bd6afd978130130fe2d6a", size = 235503, upload-time = "2026-07-07T14:32:59.205Z" }, + { url = "https://files.pythonhosted.org/packages/4e/6e/de0229a7ef40f6f9d28a837eebf4ec47bdca5dab4e900c84f22919af636a/charset_normalizer-3.4.9-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:4773092f8019072343a7447203308b176e10199920eb02d6195e81bbb3274c29", size = 229944, upload-time = "2026-07-07T14:33:00.803Z" }, + { url = "https://files.pythonhosted.org/packages/a5/34/49b9060e8418b14fb5cba9cf6bfb383111e2538a03a1fb18e66a95aeb3d5/charset_normalizer-3.4.9-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:04ce310cb89c15df659582aee80a0603788732a5e017d5bd5c81158106ce249c", size = 221276, upload-time = "2026-07-07T14:33:02.199Z" }, + { url = "https://files.pythonhosted.org/packages/44/95/80282cce0fae9c3061203d723ee87da996aed79679e65d8935050ee7ca1f/charset_normalizer-3.4.9-cp311-cp311-manylinux_2_31_armv7l.whl", hash = "sha256:c0323c9daef75ef2e5083624b4585018a0c9d5e3b40f607eed81a311270b934b", size = 205260, upload-time = "2026-07-07T14:33:03.698Z" }, + { url = "https://files.pythonhosted.org/packages/0c/74/2f62c8821b969ea3bd67cc2e6976834f48ca5d12664d2559ebcd9bcfbed7/charset_normalizer-3.4.9-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:871ff67ea1aad4dfd91736464934d56b32dac49f9fbe16cddba36198a7b3a0db", size = 217786, upload-time = "2026-07-07T14:33:05.12Z" }, + { url = "https://files.pythonhosted.org/packages/d9/8d/feabb82cb49fcad14515b1d7d1ca4787b0da7fc723a212bf89bc9e0fac52/charset_normalizer-3.4.9-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:67830fc78e67501f47bb950471b2dcb9b35b140084429318e862895a8e89c993", size = 216798, upload-time = "2026-07-07T14:33:06.629Z" }, + { url = "https://files.pythonhosted.org/packages/a5/ff/c946d63bc3786d5b84d960b0f7ab7e25b828486a946b5aa997625bcaf6a6/charset_normalizer-3.4.9-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:3d92613ec25e43b05f042302531ec0f00b8445190e43325880cbd6ab7c2581da", size = 206429, upload-time = "2026-07-07T14:33:08.006Z" }, + { url = "https://files.pythonhosted.org/packages/af/ba/5e5007c370702f85d2ef75791fac7943ed41e080364a673b20142e430e3e/charset_normalizer-3.4.9-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:280081916dc341820640489a66e4696049401ef1cf6dd672f672e70ad915aca3", size = 223066, upload-time = "2026-07-07T14:33:09.783Z" }, + { url = "https://files.pythonhosted.org/packages/83/d5/9096aa3cf532dfad237861544eb47a0f20d5adbf1039760fed8eaae935d9/charset_normalizer-3.4.9-cp311-cp311-win32.whl", hash = "sha256:ac351b3b8014eead140e77e9717e2992c6bbe30b63bc3422422eb84865412e3d", size = 150456, upload-time = "2026-07-07T14:33:11.217Z" }, + { url = "https://files.pythonhosted.org/packages/ed/a1/e29995109e455dc8eff8d0fac6ae509be39561318a7cfeac5d33ad029213/charset_normalizer-3.4.9-cp311-cp311-win_amd64.whl", hash = "sha256:6366a16e1a25018694d6a5d784d09b046edc9eac40ea2b54065c3052672516a1", size = 161410, upload-time = "2026-07-07T14:33:12.743Z" }, + { url = "https://files.pythonhosted.org/packages/4f/8d/1569f4d0032d6ba2a4fe4591c35bf87868c600c41a71eb5c2e1ffa8464c2/charset_normalizer-3.4.9-cp311-cp311-win_arm64.whl", hash = "sha256:1d22856ffbe153a602df38e4a5464f0b748a54002e0d69ac6d2ad0a197cc99ec", size = 152649, upload-time = "2026-07-07T14:33:14.173Z" }, + { url = "https://files.pythonhosted.org/packages/70/4a/ecbd131485c07fcdfad54e28946d513e3da22ef3b4bd854dcafae54ec739/charset_normalizer-3.4.9-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:45b0cc4e3556cd875e09102988d1ab8356c998b596c9fced84547c8138b487a0", size = 319300, upload-time = "2026-07-07T14:33:15.666Z" }, + { url = "https://files.pythonhosted.org/packages/ec/96/5d9364e3342d69f3a045e1777bc47c85c383e6e9466d561b33fdb419d1f9/charset_normalizer-3.4.9-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9b2aff1c7b3884512b9512c3eaadd9bab39fb45042ffaaa1dd08ff2b9f8109d9", size = 215802, upload-time = "2026-07-07T14:33:17.031Z" }, + { url = "https://files.pythonhosted.org/packages/4b/4c/5361f9aa7f2cb58d94f2ab831b3d493f69efb1d239654b4744e3c09527cb/charset_normalizer-3.4.9-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9104ed0bd76a429d46f9ec0dbc9b08ad1d2dcdf2b00a5a0daa1c145329b35b44", size = 237171, upload-time = "2026-07-07T14:33:18.576Z" }, + { url = "https://files.pythonhosted.org/packages/50/78/ce342ca4ff30b2eb49fe6d9578df85974f90c67d294113e94efdd9664cbd/charset_normalizer-3.4.9-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7b86a2b16095d250c6f58b3d9b2eee6f4147754344f3dab0922f7c9bf7d226c9", size = 233075, upload-time = "2026-07-07T14:33:20.084Z" }, + { url = "https://files.pythonhosted.org/packages/01/c4/4fa4c8b3097a11f3c5f09a35b72ed6855fb1d332469504962ab7bafcc702/charset_normalizer-3.4.9-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5e226f6218febc71f6c1fc2fafb91c226f75bdc1d8fb12d66823716e891608fd", size = 224256, upload-time = "2026-07-07T14:33:21.747Z" }, + { url = "https://files.pythonhosted.org/packages/87/3a/ad914516df7e358a81aae018caa5e0470ba827fa6d763b1d2e87d920a5f6/charset_normalizer-3.4.9-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:90c44bc373b7687f6948b693cceaea1348ae0975d7474746559494468e3c1d84", size = 208784, upload-time = "2026-07-07T14:33:23.313Z" }, + { url = "https://files.pythonhosted.org/packages/d7/74/3c12f9755717dfe5c5c87da63f35d765fa0c00382ec26bf23f7fae34f2ba/charset_normalizer-3.4.9-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:9cdef90ae47919cae358d8ab15797a800ed41da7aba5d72419fb510729e2ed4b", size = 219928, upload-time = "2026-07-07T14:33:24.814Z" }, + { url = "https://files.pythonhosted.org/packages/33/9a/895095b83e7907abd6d3d99aad3a38ad0d9686cc186cb0c94c24320fe63e/charset_normalizer-3.4.9-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:60f44ade2cf573dad7a277e6f8ca9a51a21dda572b13bd7d8539bb3cd5dbedde", size = 218489, upload-time = "2026-07-07T14:33:26.42Z" }, + { url = "https://files.pythonhosted.org/packages/a1/34/ef5c05f412f42520d7709b7d3784d19640839eb7366ded1755511585429f/charset_normalizer-3.4.9-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:a1786910334ed46ab1dd73222f2cd1e05c2c3bb39f6dddb4f8b36fc382058a39", size = 210267, upload-time = "2026-07-07T14:33:27.952Z" }, + { url = "https://files.pythonhosted.org/packages/83/dc/9b29fa4412b318bf3bfea985c35d67eb55e04b59a7c3f2237168b0e0be6f/charset_normalizer-3.4.9-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:03d07803992c6c7bbc976327f34b18b6160327fc81cb82c9d504720ac0be3b62", size = 226030, upload-time = "2026-07-07T14:33:29.397Z" }, + { url = "https://files.pythonhosted.org/packages/0e/42/6dbc00b8cd16011691203e33570fa42ed5746599a2e878112d16eab403a3/charset_normalizer-3.4.9-cp312-cp312-win32.whl", hash = "sha256:78841cccf1af7b40f6f716338d50c0902dbe88d9f800b3c973b7a9a0a693a642", size = 151185, upload-time = "2026-07-07T14:33:30.781Z" }, + { url = "https://files.pythonhosted.org/packages/80/cc/f920afd1a23c58ccd53c1d36085a71893a4737ff5e66e0371efab6809850/charset_normalizer-3.4.9-cp312-cp312-win_amd64.whl", hash = "sha256:4b3dac63058cc36820b0dd072f89898604e2d39686fe05321729d00d8ac185a0", size = 162557, upload-time = "2026-07-07T14:33:32.176Z" }, + { url = "https://files.pythonhosted.org/packages/f0/e6/0386d43a261ff4e4b30c5857af7df877254b46bec7b9d1b74b6bf969a90b/charset_normalizer-3.4.9-cp312-cp312-win_arm64.whl", hash = "sha256:78fa18e436a1a0e58dbd7e02fc4473f3f32cceb12df9dfca542d075961c307d2", size = 152665, upload-time = "2026-07-07T14:33:33.711Z" }, + { url = "https://files.pythonhosted.org/packages/b2/06/97ec2aeae780b31d742b6352218b43841a6871e2564578ca522dce4a45c3/charset_normalizer-3.4.9-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:440eede837960000d74978f0eba527be106b5b9aee0daf779d395276ed0b0614", size = 317688, upload-time = "2026-07-07T14:33:35.408Z" }, + { url = "https://files.pythonhosted.org/packages/d0/39/8ff066c672434225f8d25f8b739f992af250944392173dcc88362681c9bf/charset_normalizer-3.4.9-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:21e764fd1e70b6a3e205a0e46f3051701f98a8cb3fad66eeb80e48bb502f8698", size = 214982, upload-time = "2026-07-07T14:33:36.996Z" }, + { url = "https://files.pythonhosted.org/packages/92/8f/3a47a3667c83c2df9483d91644c6c107de3bf8874aa1793da9d3012eb986/charset_normalizer-3.4.9-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e4fd89cc178bced6ad29cb3e6dd4aa63fa5017c3524dbd0b25998fb64a87cc8b", size = 236460, upload-time = "2026-07-07T14:33:38.536Z" }, + { url = "https://files.pythonhosted.org/packages/f1/60/b22cdbee7e4013dab8b0d7647fc6181120fbbbc8f7025c226d15bd5a47fc/charset_normalizer-3.4.9-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:bd47ba7fc3ca94896759ea0109775132d3e7ab921fbf54038e1bab2e46c313c9", size = 232003, upload-time = "2026-07-07T14:33:40.059Z" }, + { url = "https://files.pythonhosted.org/packages/ea/f8/72eb13dcabe7257035cea8aefd922caad2f110d252bf9f67c4c2ca763aee/charset_normalizer-3.4.9-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:84fd18bcc17526fc2b3c1af7d2b9217d32c9c04448c16ec693b9b4f1985c3d33", size = 223149, upload-time = "2026-07-07T14:33:41.631Z" }, + { url = "https://files.pythonhosted.org/packages/b0/3e/faee8f9de92b14ee1198e9163252bb15efee7301b31256a3b6d9ebfdd0dd/charset_normalizer-3.4.9-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:5b10cd92fc5c498b35a8635df6d5a100207f88b63a4dc1de7ef9a548e1e2cd63", size = 207901, upload-time = "2026-07-07T14:33:43.209Z" }, + { url = "https://files.pythonhosted.org/packages/3a/25/45f30093ae27dd7b92a793b61882a38685f993700113ca36e0c9c14965e1/charset_normalizer-3.4.9-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a4fbdde9dd4a9ce5fd52c2b3a347bb50cc89483ef783f1cb00d408c13f7a96c0", size = 219176, upload-time = "2026-07-07T14:33:44.725Z" }, + { url = "https://files.pythonhosted.org/packages/48/18/c8f397329c35e32f6a837e488986f4ae03bd2abebc453b48714991630c2f/charset_normalizer-3.4.9-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:416c229f77e5ea25b3dfd4b582f8d73d7e43c22320302b9ab128a2d3a0b38efe", size = 217356, upload-time = "2026-07-07T14:33:46.192Z" }, + { url = "https://files.pythonhosted.org/packages/86/7e/5ce0bba863470fd1902d5e5843968951bddf38abe4742fc97116ef4598b3/charset_normalizer-3.4.9-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:75286256590a6320cf106a0d28970d3560aad9ee09aa7b34fb40524792436d35", size = 209614, upload-time = "2026-07-07T14:33:47.705Z" }, + { url = "https://files.pythonhosted.org/packages/6c/ef/2473d3c4d869155be4af1191111d59c4d5c4e0173026f7e85b176e23bf65/charset_normalizer-3.4.9-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:69b157c5d3292bcd443faca052f3096f637f1e074b98212a933c074ae23dc3b8", size = 224991, upload-time = "2026-07-07T14:33:49.238Z" }, + { url = "https://files.pythonhosted.org/packages/d0/a3/53ddae3db108a088156aa8ddfafd411ebbc1340f48c5573f697b27f69a39/charset_normalizer-3.4.9-cp313-cp313-win32.whl", hash = "sha256:51307f5c71007673a2bf8232ad973483d281e74cb99c8c5a990af1eefa6277d9", size = 150622, upload-time = "2026-07-07T14:33:50.711Z" }, + { url = "https://files.pythonhosted.org/packages/e8/ef/6953a77c7cf2c2ff9998e6f575ab3e380119f100223381565a4f94c1f836/charset_normalizer-3.4.9-cp313-cp313-win_amd64.whl", hash = "sha256:fe2c7201c642b7c308f1675355ad7ff7b66acfe3541625efe5a3ad38f29d6115", size = 161947, upload-time = "2026-07-07T14:33:52.197Z" }, + { url = "https://files.pythonhosted.org/packages/6e/fb/d560d1d1555debbfe7849d9cac6145c1b537709d79576bf22557ed803b82/charset_normalizer-3.4.9-cp313-cp313-win_arm64.whl", hash = "sha256:611057cc5d5c0afc743ba8be6bd828c17e0aaa8643f9d0a9b9bb7dea80eb8012", size = 152594, upload-time = "2026-07-07T14:33:53.486Z" }, + { url = "https://files.pythonhosted.org/packages/7e/8d/496817fa0944239ecae662dd57ea765cfeaec6a735f9f025d4b7b72e7143/charset_normalizer-3.4.9-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:0327fcd59a935777d83410750c50600ee9571af2846f71ce40f25b13da1ef380", size = 317253, upload-time = "2026-07-07T14:33:54.994Z" }, + { url = "https://files.pythonhosted.org/packages/2b/f9/ef4a69ea338ad3c0deceea0f5f7d2380ae8b52132b06d652cb0d2cd86706/charset_normalizer-3.4.9-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8a79d9f4d8001473a30c163556b3c3bfebec837495a412dde78b51672f6134f9", size = 215898, upload-time = "2026-07-07T14:33:56.334Z" }, + { url = "https://files.pythonhosted.org/packages/8c/e7/5ddfd76fc061eb52de219658a4aa431cbacadf0a0219c8854f00da50d289/charset_normalizer-3.4.9-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:33bdcc2a32c0a0e861f60841a512c8acc658c87c2ac59d89e3a46dacf7d866e4", size = 236718, upload-time = "2026-07-07T14:33:57.9Z" }, + { url = "https://files.pythonhosted.org/packages/49/ba/768fa3f36048d81c477a0ce61f813bc1454d80917ccfe550abd9f44f5e24/charset_normalizer-3.4.9-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f840ed6d8ecba8255df8c42b87fadeda98ddfc6eeec05e2dc66e26d46dd6f58a", size = 232519, upload-time = "2026-07-07T14:33:59.811Z" }, + { url = "https://files.pythonhosted.org/packages/f4/c4/b3e049d2aa3766180c78507110543d9d50894cc97f57de543f1be521dcdc/charset_normalizer-3.4.9-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c25fe15c70c59eb7c5ce8c06a1f3fa1da0ecc5ea1e7a5922c40fd2fa9b0d5046", size = 223143, upload-time = "2026-07-07T14:34:01.517Z" }, + { url = "https://files.pythonhosted.org/packages/19/79/55c32d06d76ae4feafe053f061f3e3ab70bcf19f4007797ce8c3efda7830/charset_normalizer-3.4.9-cp314-cp314-manylinux_2_31_armv7l.whl", hash = "sha256:f7fb7d750cfa0a070d2c24e831fd3481019a60dd317ea2b39acbcebc08b6ed81", size = 206742, upload-time = "2026-07-07T14:34:03.04Z" }, + { url = "https://files.pythonhosted.org/packages/10/e0/47c079dd82d217c807479cd59ffd30af56307ea31c108b75758970459ad3/charset_normalizer-3.4.9-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:4d1c96a7a18b9690a4d46df09e3e3382406ae3213727cd1019ebade1c4a81917", size = 219191, upload-time = "2026-07-07T14:34:04.657Z" }, + { url = "https://files.pythonhosted.org/packages/42/ab/b9bc2e77d6b44a7e46ef62ec5cac1c9a6ba7b9135a5d560f002696ec9995/charset_normalizer-3.4.9-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:a4cfde78a9f2880208d16a93b795726a3017d5977e08d1e162a7a31322479c41", size = 218328, upload-time = "2026-07-07T14:34:06.115Z" }, + { url = "https://files.pythonhosted.org/packages/f1/78/c9c71d599f5aa2d42bcdd35cbbd46d7f535351a57e40ff7d8e5a7e219401/charset_normalizer-3.4.9-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:d4d6fcde76f94f5cb9e43e9e9a61f16dacefd228cbbf6f1a09bd9b219a92f1a1", size = 207406, upload-time = "2026-07-07T14:34:07.554Z" }, + { url = "https://files.pythonhosted.org/packages/f6/39/c914445c321a845097ce4f6ac7de9a18228a77b766272125a1ce00d851eb/charset_normalizer-3.4.9-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:898f0e9068ca27d37f8e83a5b962821df851532e6c4a7d615c1c033f9da6eedf", size = 225157, upload-time = "2026-07-07T14:34:09.061Z" }, + { url = "https://files.pythonhosted.org/packages/9b/f2/c0d4b8508565a36bc5c624e88ed297f5b0b1095011034d7f5b83a69908b5/charset_normalizer-3.4.9-cp314-cp314-win32.whl", hash = "sha256:c1c948747b03be832dceed96ca815cef7360de9aa19d37c730f8e3f6101aca48", size = 151095, upload-time = "2026-07-07T14:34:10.901Z" }, + { url = "https://files.pythonhosted.org/packages/49/fd/a1d26144398c67486422a72bf5812cda22cb4ccfcd95a290fb41ceb4b8e2/charset_normalizer-3.4.9-cp314-cp314-win_amd64.whl", hash = "sha256:16b65ea0f2465b6fb52aa22de5eca612aa964ddfec00a912e26f4656cbef890b", size = 162796, upload-time = "2026-07-07T14:34:12.47Z" }, + { url = "https://files.pythonhosted.org/packages/20/95/d75e82f8ce9fd323ebf059c16c9aadefb22a1ecde13b7840b35835e4886c/charset_normalizer-3.4.9-cp314-cp314-win_arm64.whl", hash = "sha256:40a126142a56b2dfc0aacbad1de8310cbf60da7656db0e6b16eebd48e3e93519", size = 153334, upload-time = "2026-07-07T14:34:14.044Z" }, + { url = "https://files.pythonhosted.org/packages/00/5e/17398df3a139985ba9d11ed072531986f408c8fca952835ef1ab1820c02b/charset_normalizer-3.4.9-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:609b3ba8fcc0fb5ab7af00719d0fb6ad0cb518e48e7712d12fd68f1327951198", size = 338848, upload-time = "2026-07-07T14:34:15.688Z" }, + { url = "https://files.pythonhosted.org/packages/cd/91/7253a32e86b7e1d1239b1b36ba6dd0f021a21107ab33054b53119cc083b9/charset_normalizer-3.4.9-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:51447e9aa2684679af07ca5021c3db526e0284347ebf4ffcec1154c3350cfe32", size = 223022, upload-time = "2026-07-07T14:34:17.248Z" }, + { url = "https://files.pythonhosted.org/packages/cb/32/2e64bd2be10e89c61e57ebe6a93fd98ae88eb7ebe414b5121f22c96c69eb/charset_normalizer-3.4.9-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:cc1b0fff8ead343dae06305f954eb8468ba0ec1a97881f42489d198e4ce3c632", size = 241590, upload-time = "2026-07-07T14:34:18.813Z" }, + { url = "https://files.pythonhosted.org/packages/3d/ef/d96ec496cfea0c21db43b0ad03891308b02388d054cc902cf0e5a1ad6a88/charset_normalizer-3.4.9-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:fa36ec09ef71d158186bc79e359ff5fdd6e7996fe8ab638f00d6b93139ba4fcf", size = 239584, upload-time = "2026-07-07T14:34:20.52Z" }, + { url = "https://files.pythonhosted.org/packages/d4/ce/9af95f7876194bd7a14e3dfe4a4de2e0bff02666a3910d72beafd06cc297/charset_normalizer-3.4.9-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:df115d4d83168fdf2cae48ef1ff6d1cb4c466364e30861b37121de0f3bf1b990", size = 230224, upload-time = "2026-07-07T14:34:22.189Z" }, + { url = "https://files.pythonhosted.org/packages/52/94/af74dde74a3996bd959c350709bfe50e297823d70a8c1cbd54b838880863/charset_normalizer-3.4.9-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:f86c6358749bd4fda175388691e3ba8c46e24c5347d0afd20f9b7edfc9faf07d", size = 212667, upload-time = "2026-07-07T14:34:23.857Z" }, + { url = "https://files.pythonhosted.org/packages/ee/f0/f1c4fe746c395922961b5916ed1d7d6e7d4c84851d19ed43cc89980ec953/charset_normalizer-3.4.9-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:32286a2c8d167e897177b673176c1e3e00d4057caf5d2b64eef9a3666b03018e", size = 227179, upload-time = "2026-07-07T14:34:25.586Z" }, + { url = "https://files.pythonhosted.org/packages/e4/56/6c745619ac397e8871e2bcd3cea1eec86b877488f33888b3aef5c3ed506e/charset_normalizer-3.4.9-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:83aed2c10721ddd90f68140685391b50811a880af20654c59af6b6c66c40513c", size = 225372, upload-time = "2026-07-07T14:34:27.212Z" }, + { url = "https://files.pythonhosted.org/packages/78/ad/98aae8630ac71f16711968e38a5acfecce41b778bf2f0312851020f565a8/charset_normalizer-3.4.9-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:cd6c3d4b783c556fa00bf540854e42f135e2f256abd29669fcd0da0f2dec79c2", size = 215222, upload-time = "2026-07-07T14:34:28.774Z" }, + { url = "https://files.pythonhosted.org/packages/f7/40/9593d54209765207a7f11073c06494c1721e4ca4a0a426c597679bf7f91e/charset_normalizer-3.4.9-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ee2f2a527e3c1a6e6411eb4209642e138b544a2d72fe5d0d76daf77b24063534", size = 231958, upload-time = "2026-07-07T14:34:30.345Z" }, + { url = "https://files.pythonhosted.org/packages/b1/27/693ee5e8a18191eb38647360c51cd505013e2bd3b366aa43fd5344c21e3c/charset_normalizer-3.4.9-cp314-cp314t-win32.whl", hash = "sha256:0d861473f743244d349b50f850d10eb87aeb22bbdcc8e64f79273c94af5a8226", size = 155580, upload-time = "2026-07-07T14:34:31.884Z" }, + { url = "https://files.pythonhosted.org/packages/80/3f/bd97d3d9c613013d07cb7733d299385b41df37f0471310f5a73dc359f0b8/charset_normalizer-3.4.9-cp314-cp314t-win_amd64.whl", hash = "sha256:9b8e0f3107e2200b76f6054de99016eac3ee6762713587b36baaa7e4bd2ae177", size = 167620, upload-time = "2026-07-07T14:34:33.438Z" }, + { url = "https://files.pythonhosted.org/packages/3d/c6/eee9dca4439b1061f76373f06ea855678cc4a64c1c3c90b50e479edbb8eb/charset_normalizer-3.4.9-cp314-cp314t-win_arm64.whl", hash = "sha256:19ac87f93086ce37b86e098888555c4b4bc48102279bae3350098c0ed664b501", size = 158037, upload-time = "2026-07-07T14:34:35.018Z" }, + { url = "https://files.pythonhosted.org/packages/98/2b/f97f1c193fb855c345d678f5077d6926034db0722df74c8f057020e05a25/charset_normalizer-3.4.9-py3-none-any.whl", hash = "sha256:68e5f26a1ad57ded6d1cfb85331d1c1a195314756471d97758c48498bb4dcdf5", size = 64538, upload-time = "2026-07-07T14:34:56.993Z" }, +] + +[[package]] +name = "click" +version = "8.4.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/76/d4/81420972a676e8ffea40450d8c8c92943e7218a78fe9b64359836cc9876b/click-8.4.2.tar.gz", hash = "sha256:9a6cea6e60b17ebe0a44c5cc636d94f09bd66142c1cd7d8b4cd731c4917a15f6", size = 338000, upload-time = "2026-06-24T17:45:15.148Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fb/e2/79c688af8b210d232694e31e59da9f6ec747bae31c3f5946e4e9b98860d5/click-8.4.2-py3-none-any.whl", hash = "sha256:e6f9f66136c816745b9d65817da91d61d957fb16e02e4dcd0552553c5a197b76", size = 119243, upload-time = "2026-06-24T17:45:13.73Z" }, +] + +[[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, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "exceptiongroup" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8a/0e/97c33bf5009bdbac74fd2beace167cab3f978feb69cc36f1ef79360d6c4e/exceptiongroup-1.3.1-py3-none-any.whl", hash = "sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598", size = 16740, upload-time = "2025-11-21T23:01:53.443Z" }, +] + +[[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, upload-time = "2022-05-02T15:47:16.11Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl", hash = "sha256:8337dd7b50877f163d4c0289bc1f1c7f127550241988d568c1db512c4324a619", size = 11034, upload-time = "2022-05-02T15:47:14.552Z" }, +] + +[[package]] +name = "griffelib" +version = "2.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/33/e4/8d187ea29c2e30b3a09505c567513077d6117861bde1fbd997a167f262ec/griffelib-2.1.0.tar.gz", hash = "sha256:762a186d2c6fd6794d4ea20d428d597ffb857cb56b66421651cbba15bdd5e813", size = 216234, upload-time = "2026-06-19T12:05:42.278Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e4/d3/5268aeabf2ad82658c4e2ff3a060648d0f02f3926cb53247c0e4d0dab49e/griffelib-2.1.0-py3-none-any.whl", hash = "sha256:cc7b3d2d2865ad0b909fcc38086e3f554b5ea7acbaa7bbb7ecaa3f5dfb7d9f00", size = 142560, upload-time = "2026-06-19T12:05:38.742Z" }, +] + +[[package]] +name = "idna" +version = "3.18" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cd/63/9496c57188a2ee585e0f1db071d75089a11e98aa86eb99d9d7618fc1edce/idna-3.18.tar.gz", hash = "sha256:ffb385a7e039654cef1ab9ef32c6fafe283c0c0467bba1d9029738ce4a14a848", size = 196711, upload-time = "2026-06-02T14:34:07.794Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/5e/d4e9f1a599fb8e573b7b87160658329fbf28d19eac2718f51fc3def3aa5a/idna-3.18-py3-none-any.whl", hash = "sha256:7f952cbe720b688055e3f87de14f5c3e5fdaa8bc3928985c4077ca689de849a2", size = 65455, upload-time = "2026-06-02T14:34:06.319Z" }, +] + +[[package]] +name = "iniconfig" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" }, +] + +[[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, upload-time = "2025-03-05T20:05:02.478Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload-time = "2025-03-05T20:05:00.369Z" }, +] + +[[package]] +name = "librt" +version = "0.15.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/36/9b/356320fbae2ac8467e21c5e73e1389c80468e4998c62cc7d3536cc51b614/librt-0.15.0.tar.gz", hash = "sha256:4e66cbe84437497d951b799d3e1551291b6fb3d643820a7014b3655d57a59162", size = 214338, upload-time = "2026-08-07T10:49:42.663Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/48/12/e2e9ca532cf5a0e08c9489826c4a35c6958c92ba0313fda70e8c6c3912be/librt-0.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e1a49adf16a7c9d9646816c2946135527197b6fcf4347c7b8b761cf1bfbf4489", size = 148673, upload-time = "2026-08-07T10:46:22.569Z" }, + { url = "https://files.pythonhosted.org/packages/6d/7c/02005e23478bd5950618d9712e0fd2b4c511657857f3efd8ba6a5feabcdd/librt-0.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:81a398f45b45a59200e13cd5ad1ae1d3f44334de98b148331afe2cdfee701c52", size = 153547, upload-time = "2026-08-07T10:46:23.931Z" }, + { url = "https://files.pythonhosted.org/packages/a0/90/d8848a735f5642077fc4b3b4bebcdb08edf10178e3add45597f5201a368f/librt-0.15.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4eafbaff06b9563f8b1c850621ce51605de05208e09d4d71ce490bc972b7b9e8", size = 494355, upload-time = "2026-08-07T10:46:25.122Z" }, + { url = "https://files.pythonhosted.org/packages/e1/0b/8604f41ea02feace490e9e405a338a15f9905369f55b239a9ce31c946f24/librt-0.15.0-cp310-cp310-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:b0411b4066db926b80258c60dcb0e6db4c9cee312eab45b7e8866b17ddf9ada1", size = 485459, upload-time = "2026-08-07T10:46:26.447Z" }, + { url = "https://files.pythonhosted.org/packages/a0/ac/84153bda1ce0da609182527ab92b40d961809e544eefdc5a1c2422971416/librt-0.15.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:febb1ce6cac545a54e6b769982824e955a700fdd9fbf3a08a3d82c990968b57d", size = 498398, upload-time = "2026-08-07T10:46:27.701Z" }, + { url = "https://files.pythonhosted.org/packages/2c/3a/5ca6cd282b2c244bec8ec84102e09773264e9c02891d56ab3a8f0e4d7083/librt-0.15.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b230acc1c3bfe2d6f2627ba2b95dc92e58aa494600e9722d0e6ccbc931e59702", size = 515474, upload-time = "2026-08-07T10:46:28.9Z" }, + { url = "https://files.pythonhosted.org/packages/73/d3/bd34110234779eb843c6ed66aba7c9b2091d3dd85989f1fb9922f564cb7a/librt-0.15.0-cp310-cp310-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:6da110e5f314c19ab8478464d02ae18808ae73d522c15260fa4918acdcd64da9", size = 509484, upload-time = "2026-08-07T10:46:30.124Z" }, + { url = "https://files.pythonhosted.org/packages/1b/6c/43c3f7f071d71631a7daa3b835ef2168ea39f20692d81464d4e47fbaa6d6/librt-0.15.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:eab9208b00ca55bf75983ec99f7bf13acc746a36102e98953addaad7f7ea1e1b", size = 532534, upload-time = "2026-08-07T10:46:31.511Z" }, + { url = "https://files.pythonhosted.org/packages/c5/1c/b854adf036ea817c40408873a5b794d65a91d9f0f39826f2ad2a2d5d7f48/librt-0.15.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:6c013cd3a1721e69e14380ada97eaa4b7b0cdf1c6b96fa765d4ea47c875088db", size = 537087, upload-time = "2026-08-07T10:46:32.734Z" }, + { url = "https://files.pythonhosted.org/packages/25/5c/c9a890e244e7dd725d3bd8b560e41f0aec787eaf343b46956a290ab7b841/librt-0.15.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:567b1c430f8bd560e689421468278ac5941bab4a05303b5d95b6ae10db03f451", size = 536575, upload-time = "2026-08-07T10:46:33.965Z" }, + { url = "https://files.pythonhosted.org/packages/5f/c5/c8e70b60b704299555f55db468eb46b1c81bfc60201ffbfe20407d89870c/librt-0.15.0-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:29c4cab9df457b19672c39be7f384ebb2bc925c4e2684b8780c222b43eb36389", size = 517142, upload-time = "2026-08-07T10:46:35.577Z" }, + { url = "https://files.pythonhosted.org/packages/56/d1/767a90c41f5d381b3195bc88ac0ec4afda35777c9c781e1f9848fedd965e/librt-0.15.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:bccbd8e5b0bffb7106cf18eb1baa3d7194b1cebb3b4b1cdbd4bdb19382a6ee6c", size = 558714, upload-time = "2026-08-07T10:46:36.829Z" }, + { url = "https://files.pythonhosted.org/packages/f9/b4/3c0624b8dc8301ab808f2b3a910995bcabe28df070fb9a0e5505ae997dae/librt-0.15.0-cp310-cp310-win32.whl", hash = "sha256:8ae493ed5f659a7761c43d42f183db514536073ded9bcf671d2d1df47e29a07e", size = 104426, upload-time = "2026-08-07T10:46:38.594Z" }, + { url = "https://files.pythonhosted.org/packages/31/98/e91c0382304bedb2db9c6801897319a9dcb68daac5e975819b562362f20d/librt-0.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:bc25fb356d0c7810bb49ff3df908ad1fda6995d660ab099ded69244ed7ab6053", size = 125057, upload-time = "2026-08-07T10:46:40.052Z" }, + { url = "https://files.pythonhosted.org/packages/59/52/06790ced2ac7117f890c21bda43c39c958ec82aa665c0718e821d33ff939/librt-0.15.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:823b92cf3c18ecd08afc70c42473888b41b6e8ef5046f3b82c05c154a2fa3d22", size = 148039, upload-time = "2026-08-07T10:46:41.165Z" }, + { url = "https://files.pythonhosted.org/packages/e7/1d/8e150b7fc449a1f33c8a760965cc1f43b14fc1577d9d0b50ab2701420e74/librt-0.15.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c70bc1b602cf59917e8f0c7a2cbc8bcc6fbc14d5486136b00707a79619121d63", size = 153067, upload-time = "2026-08-07T10:46:42.418Z" }, + { url = "https://files.pythonhosted.org/packages/51/87/a162bc5a66a35599dc619ecb215145f4de7d68e886b479b6d12593139f7c/librt-0.15.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:814ff83a25b5fce8b9c80c4dd803153fb5c5599fc74db9e022466938368957ef", size = 493087, upload-time = "2026-08-07T10:46:43.657Z" }, + { url = "https://files.pythonhosted.org/packages/e5/3a/aeea1fc620cf48060d3065b37614edbf97043c099d0f50782bc8ca61d897/librt-0.15.0-cp311-cp311-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:57f5eeb6ad4c180de583b1038e61fe5fbd9796bb69a8a1c1a0c7ddbec4c8c60f", size = 485608, upload-time = "2026-08-07T10:46:45.038Z" }, + { url = "https://files.pythonhosted.org/packages/52/ff/fe571ad416f0856fd0d5578ffc2e6dc531891e586e36b647bcf50569cab8/librt-0.15.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:82909c8f7eb9952656b65d3147afde4cf8e6d5a991eebc86418b5e65843b0ab8", size = 498723, upload-time = "2026-08-07T10:46:46.35Z" }, + { url = "https://files.pythonhosted.org/packages/0f/e1/7a65eb5dedb1f00aebd948cdd8e17add48bf066cab3514e9daf84ab45a6c/librt-0.15.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f779070399f991400fc451719e0ea388eb7de313388bada2c127a35de05f798a", size = 516002, upload-time = "2026-08-07T10:46:47.599Z" }, + { url = "https://files.pythonhosted.org/packages/5f/45/59832b0ebfbd08c2742e6ece372ceb53f18bf1faef5d33c8daf3abebf749/librt-0.15.0-cp311-cp311-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bac89069bc496ebdf4f79ebb57bbd10d0b214c8454225deb672d91002bd17e18", size = 508607, upload-time = "2026-08-07T10:46:48.873Z" }, + { url = "https://files.pythonhosted.org/packages/ea/0d/37fa73f3b43ebd8259f91ae9102a15e5a54e65d581e48dea72df3e81d7a4/librt-0.15.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e0d00c708fb2f5822b152429b1ac80a58dbbbc3f6c232c4d13a3f7fcf2ea5b4c", size = 530422, upload-time = "2026-08-07T10:46:50.45Z" }, + { url = "https://files.pythonhosted.org/packages/26/02/e046c6fe7a5881ac34623242192f484426ba8a75595fd18f22c53a3f530f/librt-0.15.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:6c6624fe268625869485553dd7cc1daf30d22558215bb2a4ff16f67a9801a31a", size = 534303, upload-time = "2026-08-07T10:46:51.693Z" }, + { url = "https://files.pythonhosted.org/packages/95/32/d5e6d861ab0366f3edf74f887ab0c9eb9f535aaf01d32b80b4f734daa179/librt-0.15.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f56b397858a23dacf35ede366ed2212fdc03a6a57a1ad36468ad6e9dc5fac091", size = 536084, upload-time = "2026-08-07T10:46:52.951Z" }, + { url = "https://files.pythonhosted.org/packages/2a/de/d69d725513fe53fc90c6d7a1f86e4428939bad2fb905b17fe4c18d413dde/librt-0.15.0-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:4388184646efe2054911c5b00a1077d6d1ee86a95b7e8ba96dc7850a809f3f40", size = 514307, upload-time = "2026-08-07T10:46:54.194Z" }, + { url = "https://files.pythonhosted.org/packages/36/93/f8aded0d6682b4f25820fa86e0690f87f01df9fd7bd09ddb04d9167ad021/librt-0.15.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:97335f59082f9fe2ce6c2a9cc6433a0114bbb6cd4d5c09dd76c95c68b9f9a8b0", size = 557686, upload-time = "2026-08-07T10:46:55.443Z" }, + { url = "https://files.pythonhosted.org/packages/74/09/ffeb6bdeb6cd862b4272fddc8ad05f938dd25d020ed517e631813917d80a/librt-0.15.0-cp311-cp311-win32.whl", hash = "sha256:83380ffde38062a2e9bb55d83e74474f6614665528b98a6928720fc006dfffbb", size = 104917, upload-time = "2026-08-07T10:46:56.605Z" }, + { url = "https://files.pythonhosted.org/packages/96/28/7e2313a3ffbf0b4de7ba3da58a09e488507b4bd1ea2b5e69378354a23415/librt-0.15.0-cp311-cp311-win_amd64.whl", hash = "sha256:f75720477ee05d509a310e856cacc8d909adc182f7b91193c207bcc26d7ee6db", size = 125886, upload-time = "2026-08-07T10:46:57.729Z" }, + { url = "https://files.pythonhosted.org/packages/39/9e/04b8c3cde014ef255ee785730425268354543acc38902093a40afa0dc164/librt-0.15.0-cp311-cp311-win_arm64.whl", hash = "sha256:256237037a3ab001ae8d9803b2d43562a4c3aa38739843694349e4d5ebb0fd56", size = 111885, upload-time = "2026-08-07T10:46:58.787Z" }, + { url = "https://files.pythonhosted.org/packages/ba/39/99c25030e782bdfb7a21be8c05254806a2e4bbb05c8d50c2a2130acbfa05/librt-0.15.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:e87bc679f86a99aa3b26e3c78eeb821a247c9a28eae48eaafcc32c3bf4c3bb9e", size = 151021, upload-time = "2026-08-07T10:47:00.057Z" }, + { url = "https://files.pythonhosted.org/packages/14/43/f4b1bd1b2888798a1409808889a25ea1ba49eaabce7d681ed27734c2df9d/librt-0.15.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:71599e011ac880e8e45d46047d714871894c7d4ab6f25626f8d4f89da21f368d", size = 155267, upload-time = "2026-08-07T10:47:01.311Z" }, + { url = "https://files.pythonhosted.org/packages/0c/db/3ad9c965c72f1e1d6beeec44ec10a54e17be8ae042fbb4baade16cbadced/librt-0.15.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c802434092b769b1d613ed2e13fac15fbfce1934a74bd10283b03c0fae231cd1", size = 503136, upload-time = "2026-08-07T10:47:02.45Z" }, + { url = "https://files.pythonhosted.org/packages/4b/07/5888a6d76acd62ebce66c61b74d94e9370b9c32929f111e487bb6546f8ed/librt-0.15.0-cp312-cp312-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:5500eeae393a184d14e1f35645962c27129d20c81afa4069e6ef826ebc2b3aaa", size = 496670, upload-time = "2026-08-07T10:47:03.675Z" }, + { url = "https://files.pythonhosted.org/packages/29/39/ab57cc2f5b276156da02bb7f5a8921bada1cb1993ffec99acf811c602c23/librt-0.15.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6ecfc32dfb46fb7b565bcd6abf9412acf978775a998273d22888a6d7953730dd", size = 513688, upload-time = "2026-08-07T10:47:04.981Z" }, + { url = "https://files.pythonhosted.org/packages/a7/b9/bdbb0b648b5c2befb031f4c6f3b1dd857415e8fb492a25a3c764a6681e6c/librt-0.15.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:89cc46cfd15022e35084355478c9ac809d90b1152222706ac9a7655ec21df6fa", size = 531904, upload-time = "2026-08-07T10:47:06.211Z" }, + { url = "https://files.pythonhosted.org/packages/93/26/473c2e4b6c104e9e58e27ce95fc8005c8bd4fc36cae4f254371125a92db8/librt-0.15.0-cp312-cp312-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d5f51401d102c885b9ca509e62c79b1dbff286e1b9b047fde6f763780789356d", size = 524427, upload-time = "2026-08-07T10:47:07.592Z" }, + { url = "https://files.pythonhosted.org/packages/26/60/03b3abb82b41714671b907bf6989b228e31e6a8af52dec82b5b0728dc250/librt-0.15.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:cc30523e3f1a23fb7511cc659834a0d01a1042bb9de359bc1c131cc4ec6c9656", size = 543155, upload-time = "2026-08-07T10:47:08.866Z" }, + { url = "https://files.pythonhosted.org/packages/f2/0e/9bb1f0a4affbd0a1888f4f79dc03ed2a299d9a2c26c59ab2a97dcbf11903/librt-0.15.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:59fe030d8ae4a57e3fb7756bf35a858de74e04066fc8555c53d0af979132af81", size = 546890, upload-time = "2026-08-07T10:47:10.327Z" }, + { url = "https://files.pythonhosted.org/packages/dc/84/6937a280d461f7de6e031ffb02edc2b7c3c90d49d630565ce8ff27cbc5f2/librt-0.15.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5a6526a2a956bbb1e4ae3568c82e650fc99119c66bb011ea60715744955a2b4d", size = 555163, upload-time = "2026-08-07T10:47:11.798Z" }, + { url = "https://files.pythonhosted.org/packages/bc/95/2a2853c1ee014bf102116e7f897a04beeaeb2461b45b79af98bdfb95f1ef/librt-0.15.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:85ea21ec6730194d67156b0e0b5430ccb1d61f8b8b907e39b37f9812b74a13f0", size = 535812, upload-time = "2026-08-07T10:47:13.279Z" }, + { url = "https://files.pythonhosted.org/packages/c9/4c/cf9601c1b4c5f09280acd5d83abdb2e68527a2be8257136eb42304218622/librt-0.15.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1e47b8ba865d7ede071a91a7163073bbaeb72541f1ef8a07d512c45c7b5007f2", size = 573688, upload-time = "2026-08-07T10:47:14.727Z" }, + { url = "https://files.pythonhosted.org/packages/47/6d/9ac7cbec46189a7625af4b5acbd25f10d827f4141b2002181848c8418923/librt-0.15.0-cp312-cp312-win32.whl", hash = "sha256:a5207ec414d1c4a2a7231b2086970dc036f94293cdf338190984958a013a42f1", size = 106138, upload-time = "2026-08-07T10:47:15.973Z" }, + { url = "https://files.pythonhosted.org/packages/38/d0/2ae99c83be86ce23f925ac1aeeedc777e97f427c4a8d190c70d0a16e9a87/librt-0.15.0-cp312-cp312-win_amd64.whl", hash = "sha256:73b30cfa976659b3917c8f6153bdb0591c6a9ec6583599fd24a689b690622022", size = 126974, upload-time = "2026-08-07T10:47:17.049Z" }, + { url = "https://files.pythonhosted.org/packages/5d/ef/dd24f9635c730b86b87587967dda7516b1845e8b17684603d31607fed598/librt-0.15.0-cp312-cp312-win_arm64.whl", hash = "sha256:a54cf9e0ef47b96af580849db5471142200568ce1e02cbf416addab551369570", size = 112292, upload-time = "2026-08-07T10:47:18.222Z" }, + { url = "https://files.pythonhosted.org/packages/e7/42/467b53a601b406ccd7b97c1fd54b59cb34f9185ad5ce7e9d5c3c4e8961c8/librt-0.15.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:db13ca398005abcbe538deda87b686d9bd08b7001cf40c4c06b444960ae10a26", size = 151029, upload-time = "2026-08-07T10:47:19.312Z" }, + { url = "https://files.pythonhosted.org/packages/3e/e6/36c2299b7a94b84fdd01220d8a777a71be5be0925bb0dbdf71c0a06a34d9/librt-0.15.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:aa1f1995789dca3698bc550aaceb09a51bd5df0a057ff84ff15296cd1975b801", size = 155194, upload-time = "2026-08-07T10:47:20.398Z" }, + { url = "https://files.pythonhosted.org/packages/c9/b6/ed5071f9325845e670bd36012757419767fbf56af77ed483077b9e4db541/librt-0.15.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:55456ea87d8df21808446d03817be2f65e20391c1c615d9187440dff28cd08dc", size = 502568, upload-time = "2026-08-07T10:47:21.652Z" }, + { url = "https://files.pythonhosted.org/packages/7f/81/6450c67c3615d87704bcbc21323fafc69c799b06a044c447529f725d4b01/librt-0.15.0-cp313-cp313-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:5a86a5a08c2235316bdb359d5dbb6ce0abfca7fac06363103e2c5af571d92f95", size = 496153, upload-time = "2026-08-07T10:47:22.925Z" }, + { url = "https://files.pythonhosted.org/packages/e1/d6/5f52b722bc75076954b3bfd49be15ea362df4d580c6fb315d0f617100d30/librt-0.15.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e56b6a368529bed262da40ce13f8fef590db0479819cca84f16a1f01ac356d0b", size = 513336, upload-time = "2026-08-07T10:47:24.213Z" }, + { url = "https://files.pythonhosted.org/packages/8d/e2/c08fd1d36ce63ea5a12b85c5d37f4550b5f86a692167e41e5a74222607ae/librt-0.15.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:234d8d394721fa0d786af15ebf1f3fb7f3ed82fd1cd0cde45c2f247b5d4281d2", size = 531661, upload-time = "2026-08-07T10:47:25.507Z" }, + { url = "https://files.pythonhosted.org/packages/3f/d8/d9482fcbeb177b9eb87bb3899eeb3b42be690313c652f9e146b1d0681fb2/librt-0.15.0-cp313-cp313-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d8363d7accb0286ac3a0e633f396e93800dafb8150494505daf9515bbda591f3", size = 524487, upload-time = "2026-08-07T10:47:26.79Z" }, + { url = "https://files.pythonhosted.org/packages/10/cc/075171517b41f861753034fbb151b42cfc83bcc853849f24f5e66fd60ccf/librt-0.15.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0f0ee3644d951f31055ad07d77d92520e84505dd7a432cc4cd501dd70ee06785", size = 543201, upload-time = "2026-08-07T10:47:27.999Z" }, + { url = "https://files.pythonhosted.org/packages/b0/03/42c2330f37eeb475b6affeedd06518f60035f323af3a839335e3fc9fef2d/librt-0.15.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2cfd1a81a648806e6a7717be4cc4d1bb392fa229752bf8444ba365e381e984d6", size = 546467, upload-time = "2026-08-07T10:47:29.396Z" }, + { url = "https://files.pythonhosted.org/packages/57/1e/1ad4c5638f7e64d8560328bd25c54b409a661bdb6ff254b38ff90744288d/librt-0.15.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:a6cd22c9da0d866558e46a041f1cc0c2bbb26b61b137b2347fa834c332e1d101", size = 555139, upload-time = "2026-08-07T10:47:30.815Z" }, + { url = "https://files.pythonhosted.org/packages/49/41/39fa7d15db1204cd1cbe6514680fbdc243adf754a0885061308f43afc013/librt-0.15.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:6d5225ef8801e4ea5e482fa9b5dfb891dd9ef6f6d870f1f25d449ca2c70ac218", size = 536050, upload-time = "2026-08-07T10:47:32.222Z" }, + { url = "https://files.pythonhosted.org/packages/1e/88/c6dcf0dd8e26dc0c9a499a2abab8646c86dcaf9ecea9524cb46d3686331a/librt-0.15.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6d28a05796b99f749bf8794f17ba9ba1612d0076b802e9cfc62c554634e9ce3b", size = 573700, upload-time = "2026-08-07T10:47:33.527Z" }, + { url = "https://files.pythonhosted.org/packages/1b/9b/ab54c71a7918a7c34fa5327fb61390a77446a07a146fbfb1165250a61035/librt-0.15.0-cp313-cp313-pyemscripten_2025_0_wasm32.whl", hash = "sha256:2067ff438048cead9d223ca5675bae2a25e520a7c3e6c1498bf9c6892d22caab", size = 82194, upload-time = "2026-08-07T10:47:34.835Z" }, + { url = "https://files.pythonhosted.org/packages/8d/b2/4f9a243bb892395f3becb80789ade13771701091f9f07ab8230247953ba8/librt-0.15.0-cp313-cp313-win32.whl", hash = "sha256:1cd3b721f24c206398b9e26da3c3a9c011e6e89d06f318ba8ebefc30f1003890", size = 106231, upload-time = "2026-08-07T10:47:36.251Z" }, + { url = "https://files.pythonhosted.org/packages/bf/af/64aff4885a40b93132382f2c314647d722574605416504379184ef3045ea/librt-0.15.0-cp313-cp313-win_amd64.whl", hash = "sha256:f395a4a9a03ac062dbe9a9f82e0c720502e590a38feee6a757bc82e9c63afbd8", size = 126996, upload-time = "2026-08-07T10:47:37.453Z" }, + { url = "https://files.pythonhosted.org/packages/27/83/335bccf6c7cb9028cb0b54aead27d9ece3f01f83bc6baa2abace5da655c1/librt-0.15.0-cp313-cp313-win_arm64.whl", hash = "sha256:0a15cb554761247d84a3ec0cbdf4078d70725384f0e4662c0fa3b26266eb60ad", size = 112188, upload-time = "2026-08-07T10:47:38.729Z" }, + { url = "https://files.pythonhosted.org/packages/a8/93/949053fb462eecc4a9a5ee770a81f4b40be7b79538b245545d4aebc6b58b/librt-0.15.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:f5de7feedc56337a088eb15cd9fafa9938367362221d8cc62c642b7f94821993", size = 149833, upload-time = "2026-08-07T10:47:39.86Z" }, + { url = "https://files.pythonhosted.org/packages/61/ca/8281aa6cd560a3420e4497729f6b704b53be3eeaaef82d5aeadddaf7441f/librt-0.15.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:6c0eb900c0e91f4aebe680845242e614f1864edfd44106380d0752ac29522bf8", size = 154088, upload-time = "2026-08-07T10:47:41.065Z" }, + { url = "https://files.pythonhosted.org/packages/dd/02/1a1662dceaba6a086360891448d5ce9a7d3555976cae59a31a39d744b9c7/librt-0.15.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e8c9a650a188e38bac005048cbe6342e81407782944d01934540ab75e417df21", size = 494215, upload-time = "2026-08-07T10:47:42.388Z" }, + { url = "https://files.pythonhosted.org/packages/69/84/99211619dc656370a3740c33d2b0b6d5a3fb1e73689314f6ed477a397dc4/librt-0.15.0-cp314-cp314-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:92bfed8deec93df30286b9fe9e3b1dd17329cc076a192b4ee5ec223841d54953", size = 491173, upload-time = "2026-08-07T10:47:43.683Z" }, + { url = "https://files.pythonhosted.org/packages/d4/aa/5448d0b05f4579b635d3899176817ebf561af0e57bacd425b5b1887264c1/librt-0.15.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ec4b19788f835711a2072f9dbe6b03b3bf32ed1f0fb30cf399bdd59d9f0c33fa", size = 505512, upload-time = "2026-08-07T10:47:45.314Z" }, + { url = "https://files.pythonhosted.org/packages/95/82/01940e40b83c43a546c4a3c896cf34ca272a9690899d55914e4827b3dcce/librt-0.15.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d4c7bacb70930f3d0a56f4ecf1be474a1f0d941b01dd73b756f3c256d42cb879", size = 523073, upload-time = "2026-08-07T10:47:46.66Z" }, + { url = "https://files.pythonhosted.org/packages/88/fa/759c0030f3ee371439eb26de34fc745807caf0abb878af7af4b8b7c3dd3d/librt-0.15.0-cp314-cp314-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3e79f05e4a08b4d880342673312bbc895b56df7765605796f15902eb5367d3ae", size = 515080, upload-time = "2026-08-07T10:47:48.319Z" }, + { url = "https://files.pythonhosted.org/packages/0b/27/894e072228fcb159703c655da69f8cd10dbed489c36e3df7dd032a2483be/librt-0.15.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:a417149c0cba4d50b61e992e5a15e69eaf96746609b461cc4ed168aeef6b79dd", size = 534164, upload-time = "2026-08-07T10:47:49.875Z" }, + { url = "https://files.pythonhosted.org/packages/98/a3/0078e91c1f36f8815db17827de15650b9a3fe56c55fbf998c854b34e40d3/librt-0.15.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:da7a94d6a3411f579d72aa3e3bc5fbca7ed4549f3dbd7e5de3aa567333374285", size = 540616, upload-time = "2026-08-07T10:47:51.408Z" }, + { url = "https://files.pythonhosted.org/packages/86/33/81a29b796dd52a45e9ef7974c7732926e8f10f15b8d2be505665979f896d/librt-0.15.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:856f743ae607f2c1380eccb566c0038a9fb3eabf0fc2be2704d76d9f73557239", size = 545890, upload-time = "2026-08-07T10:47:52.818Z" }, + { url = "https://files.pythonhosted.org/packages/05/82/8be1baa1350e5d30cfd70ae79d0a6f4dc5862ef47f7bb2808aabc9bb86e5/librt-0.15.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:779a6e7c894737e5983e7790a9c78c4000c30e23c9aada08081bdbea53b0fa60", size = 523287, upload-time = "2026-08-07T10:47:54.165Z" }, + { url = "https://files.pythonhosted.org/packages/c6/4f/d1be6a01a35c20ef734e0e44113f87d4af756a9354a89dcfbe3b4f8af5e1/librt-0.15.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:96bb17dbe8bab3c0954fbebfc69ed395599de75b6bbc35e3270a878e15d4dd65", size = 565868, upload-time = "2026-08-07T10:47:55.566Z" }, + { url = "https://files.pythonhosted.org/packages/67/88/649cfa33f5825927b160610f670bdab012a64d627eddb94fa795ea4292fd/librt-0.15.0-cp314-cp314-pyemscripten_2026_0_wasm32.whl", hash = "sha256:7220697efaa6e5348fc3d18ee7f8563d4bfecd9872b37ffb915bfc1d08840622", size = 81619, upload-time = "2026-08-07T10:47:56.886Z" }, + { url = "https://files.pythonhosted.org/packages/22/31/8e88a8d5e48fc8d1a817787fb6811dfff6499acd6c8683dd83934aa6ede0/librt-0.15.0-cp314-cp314-win32.whl", hash = "sha256:f54598964d357b1c5ab77cf5d92f21e598fe0e23cdbe9618480807f81b4eba15", size = 100138, upload-time = "2026-08-07T10:47:58.093Z" }, + { url = "https://files.pythonhosted.org/packages/80/92/20fd6c4b6a1b1a564b076d55cd3d427d8428217d7638dc25a654cc4791d4/librt-0.15.0-cp314-cp314-win_amd64.whl", hash = "sha256:3ff5893a2c23d886aa9ce786de5ac6ddc74aeeaf90743682b74d920e117d2e28", size = 121258, upload-time = "2026-08-07T10:47:59.564Z" }, + { url = "https://files.pythonhosted.org/packages/fc/28/6af430b44d9ebb897b865a3c363b6dcace51357be2347cc0f8f869656a86/librt-0.15.0-cp314-cp314-win_arm64.whl", hash = "sha256:3722a099730704c9a3d70c879fc0f51daec25fe5f1555672d97bc595abeafb95", size = 106467, upload-time = "2026-08-07T10:48:01.097Z" }, + { url = "https://files.pythonhosted.org/packages/7e/aa/b42bb798942ced219f6d63b27e07f91237887a8d0bd0921666db79a13790/librt-0.15.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:38c0c7d4b6fc06c3324b3f9162c8391bfc4fd9dde53afe1033ce7edb48d5a714", size = 159523, upload-time = "2026-08-07T10:48:02.442Z" }, + { url = "https://files.pythonhosted.org/packages/75/03/1b53cd4ef904e73b1d828a5f90143bf94a2967d7cfff0b9ccf93e12aa9b4/librt-0.15.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:8b2fdd7ead3c995c37940a790690660d0ca006c302db26cc51933f6766866fc3", size = 161638, upload-time = "2026-08-07T10:48:03.725Z" }, + { url = "https://files.pythonhosted.org/packages/ac/c4/9f9c9fba097d49e9e694c2b4dc331df31884645ecbc58a93b4b5fc69d2c5/librt-0.15.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2fde98cf1fc4bac144ce23c2c4c017b924ba714509ea9334977b0b27050c837d", size = 701795, upload-time = "2026-08-07T10:48:05.135Z" }, + { url = "https://files.pythonhosted.org/packages/4c/05/0966840bda0380c8ae167b9043c6230202941cc90ea29c48e096964c765e/librt-0.15.0-cp314-cp314t-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:e3b461183c5fa7681b48560f91515f53a953122fb30c71e07abc67d7ddf58c38", size = 682147, upload-time = "2026-08-07T10:48:06.555Z" }, + { url = "https://files.pythonhosted.org/packages/18/af/1c47ca573c30ea47d195aec26133af522fea1104afaace028d7b32247ea8/librt-0.15.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4bbcc257e3babea20a91715c361b24554ec4e8f51aa578568afc230799fe1a19", size = 696397, upload-time = "2026-08-07T10:48:08.03Z" }, + { url = "https://files.pythonhosted.org/packages/2e/0f/1aed6223d4f9f9d1171a8596ff100ea4c3f7699fea7a4ba657c3e60daa6c/librt-0.15.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b845b8d48088fad0cadc84be4b8fda63203be7e9237b71015b3925443c1f35ab", size = 722542, upload-time = "2026-08-07T10:48:09.569Z" }, + { url = "https://files.pythonhosted.org/packages/c6/22/9e3a929aea456c97d69e6ef3884efea56d4807f97399471cc946baebd8af/librt-0.15.0-cp314-cp314t-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b30e600e8f337b9bd7f39b86d9fdfedc73cc46e3d0f745931a23a234220bb7e2", size = 729709, upload-time = "2026-08-07T10:48:11.129Z" }, + { url = "https://files.pythonhosted.org/packages/e9/1b/c327ef6018e3a9ca0b8e7c5eddeeb331ba8f9b76c24e126d37d0f6d62faf/librt-0.15.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:64b0c8c35aa4c4ed79896359f3e0b285cbe4e610042106500da4811c322cc108", size = 752891, upload-time = "2026-08-07T10:48:12.558Z" }, + { url = "https://files.pythonhosted.org/packages/d7/d1/d5f1ea02c56930087009e39db9b70660a663e76c730b27b925d786718457/librt-0.15.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:0da0d94cb802f32a0524653e7201f2cef72d5f700a5407678f5290483d4fcd08", size = 745301, upload-time = "2026-08-07T10:48:14.55Z" }, + { url = "https://files.pythonhosted.org/packages/d9/3c/5f7c585d15ebb2250c73e7c0ee4e9e47be72c65d520c07ddbcdc62037674/librt-0.15.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:4a6369168d371207339b1e50d4532b06a7121586141f82599505a3f315751d47", size = 747921, upload-time = "2026-08-07T10:48:16.453Z" }, + { url = "https://files.pythonhosted.org/packages/7f/52/1443a446486eba966bcbca1696b472e4f210320ec42f490a47f48fbf0fdc/librt-0.15.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:c434e072557ade9cbc642d052c89d031efe47d5c9614523619d0d74a02378e81", size = 727561, upload-time = "2026-08-07T10:48:18.089Z" }, + { url = "https://files.pythonhosted.org/packages/79/91/2270a9380f11725cf83ce1925a5e32dd1dde2be9bba597f25c10a38644e7/librt-0.15.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:c7eec6a42018bc1d45763b1c162d3d2bf7c3b9a1b0ed30d3e91dcba390efefcc", size = 774417, upload-time = "2026-08-07T10:48:19.611Z" }, + { url = "https://files.pythonhosted.org/packages/9e/3b/f4b1548d4f5b99186737fe27aec238e9823e8d5d23bf4df007c030689dc5/librt-0.15.0-cp314-cp314t-win32.whl", hash = "sha256:6912fa5e635d74529ac7cdb1bdf6ca3af4453da8d1edbe0110ee1cb4ad407ebf", size = 104381, upload-time = "2026-08-07T10:48:21.048Z" }, + { url = "https://files.pythonhosted.org/packages/80/b6/134afad262def1de04c0843c376d02135f1168af43f22e09a52bd8394727/librt-0.15.0-cp314-cp314t-win_amd64.whl", hash = "sha256:8e11699ed745931c395acd3621b07062e0f840efa6935aad87a64ed0995f0915", size = 127034, upload-time = "2026-08-07T10:48:22.561Z" }, + { url = "https://files.pythonhosted.org/packages/99/5f/1b6846b20572bd699c9e9ec321a5f781845bee477df2aa2a43b28bc40119/librt-0.15.0-cp314-cp314t-win_arm64.whl", hash = "sha256:5d2a91724463bfed4f573cd7a9fdc856d2e230d0c0e5a61416a93481dccd8605", size = 110827, upload-time = "2026-08-07T10:48:23.804Z" }, + { url = "https://files.pythonhosted.org/packages/c6/44/4de9f4ddadb009a55c7758eb5736d62534a7daaf27bd71bc50e64b606b06/librt-0.15.0-cp315-cp315-macosx_10_15_x86_64.whl", hash = "sha256:8443e38dcfcfdbcf5add5118c623efd788d65ac2e25756d6251a54a06a4d0aca", size = 149843, upload-time = "2026-08-07T10:48:25.148Z" }, + { url = "https://files.pythonhosted.org/packages/1f/eb/5d9ab71e30119c44094e0275f38b47dd327aea0f843a080396677029d508/librt-0.15.0-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:6d15a29033c57490cfe2069097c6fc4049e4e65ffbb749be7dc453b7c4c68965", size = 154510, upload-time = "2026-08-07T10:48:26.485Z" }, + { url = "https://files.pythonhosted.org/packages/d0/9c/8505d1b8f5e8c19587bd03f7429993b3e9ce5c06819d856bfb11d919374c/librt-0.15.0-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d2c05c729b589e734c09578bf5964be48a911765484840d017bbc84f49d4c4ad", size = 497543, upload-time = "2026-08-07T10:48:28.045Z" }, + { url = "https://files.pythonhosted.org/packages/1d/9a/3a8390775cb095765aded027ac9c63e7c8ea74e731498607544c6505de0e/librt-0.15.0-cp315-cp315-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:fa60887537e1d0cd2d9982269d33a709bf54b195cd2b9364fc0a758022af5bd9", size = 480452, upload-time = "2026-08-07T10:48:29.531Z" }, + { url = "https://files.pythonhosted.org/packages/e7/40/258a4a7117ee915d66de5cd9b8ade65a440993161107ce3a686f1859955c/librt-0.15.0-cp315-cp315-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d8bc24219b24c0af375718942ab75e3544b2763085f40f965be4326734ae8328", size = 507768, upload-time = "2026-08-07T10:48:31.007Z" }, + { url = "https://files.pythonhosted.org/packages/6b/c6/2f4dd296c97a0b85b98894519b279408ec9dd602d4f692b1ea0e25dee670/librt-0.15.0-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:86a21a7bd3fe3a419512ef424cc1c020f6771d0b29cfddff36d1635a855e63f0", size = 525122, upload-time = "2026-08-07T10:48:32.7Z" }, + { url = "https://files.pythonhosted.org/packages/49/dd/29eab42be13b2bf0ea8cb227135a45d44693e30a7e8b92871981ff56b82b/librt-0.15.0-cp315-cp315-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:dbab647e88d90b3167b91efe7091e248653688ed4337e4f90907a722c7361bb9", size = 520371, upload-time = "2026-08-07T10:48:34.294Z" }, + { url = "https://files.pythonhosted.org/packages/91/ed/4bad71adeca8fe208b775c2a35417fa5a2584c8f4791daaf89a89450fea1/librt-0.15.0-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:d8edcf6f550e918dca779c069b9e156385c60b406f99fc7641f32c52f7193659", size = 537258, upload-time = "2026-08-07T10:48:35.88Z" }, + { url = "https://files.pythonhosted.org/packages/4c/63/59dba6143fdcc7240c54458b629f3250000a61b8945890fc9efd451b19c5/librt-0.15.0-cp315-cp315-musllinux_1_2_i686.whl", hash = "sha256:8b62076030baa2d8b1501a46bf0e19c27a489aa90671c55665bff7887f7660b0", size = 527432, upload-time = "2026-08-07T10:48:37.466Z" }, + { url = "https://files.pythonhosted.org/packages/ec/21/21a24c6a2327d8362580efebe77286bf47b0f4062ec5ea41766e609d3c7d/librt-0.15.0-cp315-cp315-musllinux_1_2_ppc64le.whl", hash = "sha256:d00d20d1818e82a07a0ee0aa89a98b17ed7916b92441090b683719cb20a59b6d", size = 548108, upload-time = "2026-08-07T10:48:39.384Z" }, + { url = "https://files.pythonhosted.org/packages/5a/6d/fc68c89a7971418b41f9a873623ff935cb864097544c6a2f8ce491c8ef5d/librt-0.15.0-cp315-cp315-musllinux_1_2_riscv64.whl", hash = "sha256:4e6ee93fc3cf848dcbf0cce2eca73d8e7dcd0cc2b6df3a529d57750b30a4c55c", size = 529681, upload-time = "2026-08-07T10:48:41.392Z" }, + { url = "https://files.pythonhosted.org/packages/65/7e/c2d98766124400d722063a630b0fde38a9fc768705d37eecca15c47dc192/librt-0.15.0-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:32896a0af72508ea979e0acb4e4c04cbeeae04938167950d535c83c45597167d", size = 567736, upload-time = "2026-08-07T10:48:43.124Z" }, + { url = "https://files.pythonhosted.org/packages/55/6c/f8c34a95e3a515c6e1c192b89511e7253c89a7760c6b500d57ffdb8d2dc8/librt-0.15.0-cp315-cp315-pyemscripten_2026_5_wasm32.whl", hash = "sha256:ec3ba415afaf951f6951b1dd16d3c8e4f540065fc382d7e70b823a79567ca374", size = 81673, upload-time = "2026-08-07T10:48:44.645Z" }, + { url = "https://files.pythonhosted.org/packages/c9/9e/e23fa8e78679ec45728188650b39e8ff476c83b691c96f749217df3b1b7c/librt-0.15.0-cp315-cp315-win32.whl", hash = "sha256:d2813ba2503764f0450680c533d13df7cff9b49df1411062eded5f67db4195b9", size = 100081, upload-time = "2026-08-07T10:48:46.171Z" }, + { url = "https://files.pythonhosted.org/packages/e1/dc/3eb4c5e297343f0620a55532cd7c8d764d3001fa2159212dadf480464827/librt-0.15.0-cp315-cp315-win_amd64.whl", hash = "sha256:b87d67e33afaf265262f2a66db578284b88ee2e6fcd224579cb5c15518677ad8", size = 121228, upload-time = "2026-08-07T10:48:47.631Z" }, + { url = "https://files.pythonhosted.org/packages/97/70/43abce19f04e49762f8ec834c8fafee13cc40fd6b94a72a24e534febfcd0/librt-0.15.0-cp315-cp315-win_arm64.whl", hash = "sha256:713bd7df21170b982e729e46870f31d6b437bd1a9b4648cffb529bd3c2ec5c4b", size = 106487, upload-time = "2026-08-07T10:48:49.095Z" }, + { url = "https://files.pythonhosted.org/packages/de/15/83f2deddb9368b8951ec8c9477269b5b9b8bd9bbf15e57402d0f38817dca/librt-0.15.0-cp315-cp315t-macosx_10_15_x86_64.whl", hash = "sha256:3de789c82752730f94782a5ee518baf9c05edf85733aeaf73bb6e518755cdf54", size = 159448, upload-time = "2026-08-07T10:48:50.649Z" }, + { url = "https://files.pythonhosted.org/packages/06/bf/043097353f9b3c73b583d07f6b8e552795463f4bfc8caf85e42eee50c26a/librt-0.15.0-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:e0b5deec9a8664eb722c797241970fd4aa1894d25fda36a1ddac0f7407606bd6", size = 161686, upload-time = "2026-08-07T10:48:52.174Z" }, + { url = "https://files.pythonhosted.org/packages/f4/2a/8ae77f9719d42ce71cd708560a3557b38ac3c17a0383e57f87084de45bbe/librt-0.15.0-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5563302a8359bc2295bb7084d1a8ed1519df96afb30eb2aa4e0bff7b54228988", size = 710668, upload-time = "2026-08-07T10:48:53.782Z" }, + { url = "https://files.pythonhosted.org/packages/61/34/c0436ea134deb9a0d6da80a396a2739a81cb31e0418f7227239e23140898/librt-0.15.0-cp315-cp315t-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:22d6263b9d39d7bbb286fa791945646e3218f1be2d693e36fb630f1d0e59cd13", size = 679396, upload-time = "2026-08-07T10:48:55.645Z" }, + { url = "https://files.pythonhosted.org/packages/4a/9f/001e0d99aa9250d5cd5715a9081291a20656083459f9019cda15255329e1/librt-0.15.0-cp315-cp315t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:39ffd14646190c454f0d86e0d256b33f00a87a26ab410e619773b841d0e41416", size = 704313, upload-time = "2026-08-07T10:48:57.46Z" }, + { url = "https://files.pythonhosted.org/packages/2d/53/b34fa9d0ff00f136f4d58ebb4c411ff634baed1eb412bb602a2bc8dcafcb/librt-0.15.0-cp315-cp315t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c47318cd3a61401452de11282242937e3e057c4fd3dbaf601e269d0928a06c0a", size = 729847, upload-time = "2026-08-07T10:48:59.231Z" }, + { url = "https://files.pythonhosted.org/packages/86/ac/fa4d7a424665040e95baf480a6d523446057684b6758624c85338e8a23b2/librt-0.15.0-cp315-cp315t-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a56a1d4f859a82ca5b99fc4b82c9b027b15e3c455c5cd99e7d0719f27bb20b6c", size = 742736, upload-time = "2026-08-07T10:49:01.151Z" }, + { url = "https://files.pythonhosted.org/packages/8a/f1/e17a9bb5de6fb8c3186ed1a7d68d21618b027ac2d3633e03d3b6109c67ae/librt-0.15.0-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:077471b3182db4e17c36ae91555f36a4d2c00080b267f749bcad34a478a9a302", size = 763454, upload-time = "2026-08-07T10:49:03.039Z" }, + { url = "https://files.pythonhosted.org/packages/1d/ec/ecd02cd30935b931b9cdbfed6ab5a099c51b280b4e7baa274da80978ed27/librt-0.15.0-cp315-cp315t-musllinux_1_2_i686.whl", hash = "sha256:411ca4d1b905b860ceba7570dd6717a71dedaddcc4b0f77ece710aa41ee11f8d", size = 743296, upload-time = "2026-08-07T10:49:04.941Z" }, + { url = "https://files.pythonhosted.org/packages/e6/b5/b3c2b8353ce820a4854f78d19321344242f89fa71c975b71132ba9bf242a/librt-0.15.0-cp315-cp315t-musllinux_1_2_ppc64le.whl", hash = "sha256:1256589e0b0adb31751d685a68bce29d73407ddf4ef05d4188f49d5dcf9566d9", size = 756217, upload-time = "2026-08-07T10:49:06.825Z" }, + { url = "https://files.pythonhosted.org/packages/3c/52/6cc22542ba59146b05cca2a656f9ff8bb67e38e63d12c3b0cc183d837bf1/librt-0.15.0-cp315-cp315t-musllinux_1_2_riscv64.whl", hash = "sha256:f42b74a53e5f26a0ba0007411a7455b66c67ce4022a39cc1f56fc4efd65bcbab", size = 741934, upload-time = "2026-08-07T10:49:08.839Z" }, + { url = "https://files.pythonhosted.org/packages/40/32/a04b72b1aa86e3be23b2ecff8c1aad2dcc955bd3956d6d26e7e34267e57a/librt-0.15.0-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:291bf73caf78b9e88d6fae9bfd693207ff7d832e2fdbe2cf8e746bc13f5f892b", size = 783763, upload-time = "2026-08-07T10:49:10.661Z" }, + { url = "https://files.pythonhosted.org/packages/6c/f0/89eb11dffbe9279ff37144dec786927314502ae0b114f1449dc78c458aab/librt-0.15.0-cp315-cp315t-win32.whl", hash = "sha256:c16d15ee371643ab48dc8248a3e680ebbeca573a13af2c3dd0c985b142d77162", size = 104313, upload-time = "2026-08-07T10:49:12.305Z" }, + { url = "https://files.pythonhosted.org/packages/6d/4a/1f1978c200f563beda63c36adff2d65bbecb81e365e8e69e572f5f70fbc6/librt-0.15.0-cp315-cp315t-win_amd64.whl", hash = "sha256:dbd605739f228912dc49027cb764456b9757750bdc2b6b7773164db7096c6fd1", size = 126889, upload-time = "2026-08-07T10:49:13.881Z" }, + { url = "https://files.pythonhosted.org/packages/38/a6/800800bfed7b1fb10fc3f3d557785c3854e80d3f7a9800d784b176a1fc2d/librt-0.15.0-cp315-cp315t-win_arm64.whl", hash = "sha256:84d244b00604d17df3fc7736c327892d6bba66181254aa4087be807b6c342bdc", size = 110700, upload-time = "2026-08-07T10:49:15.499Z" }, +] + +[[package]] +name = "markdown" +version = "3.10.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/29/6f/da4c6aea59b3001f2e8c0ec7497475aadaf3b021c10cab5b2858f0f32b26/markdown-3.10.3.tar.gz", hash = "sha256:3589362618f743188b4d955b874402bc814f4f83f544dc207719f4baa7d9c45f", size = 372596, upload-time = "2026-07-30T19:05:29.005Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/64/69/4a5af2bc115a9a33fefe51709749de8262be3f9ba063d1753a837cdbc49c/markdown-3.10.3-py3-none-any.whl", hash = "sha256:fa6c92a00a4a3c98b22728c64a935ae1928250ae65058a6ded814d2cc29a4cea", size = 110757, upload-time = "2026-07-30T19:05:27.883Z" }, +] + +[[package]] +name = "markupsafe" +version = "3.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7e/99/7690b6d4034fffd95959cbe0c02de8deb3098cc577c67bb6a24fe5d7caa7/markupsafe-3.0.3.tar.gz", hash = "sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698", size = 80313, upload-time = "2025-09-27T18:37:40.426Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e8/4b/3541d44f3937ba468b75da9eebcae497dcf67adb65caa16760b0a6807ebb/markupsafe-3.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2f981d352f04553a7171b8e44369f2af4055f888dfb147d55e42d29e29e74559", size = 11631, upload-time = "2025-09-27T18:36:05.558Z" }, + { url = "https://files.pythonhosted.org/packages/98/1b/fbd8eed11021cabd9226c37342fa6ca4e8a98d8188a8d9b66740494960e4/markupsafe-3.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e1c1493fb6e50ab01d20a22826e57520f1284df32f2d8601fdd90b6304601419", size = 12057, upload-time = "2025-09-27T18:36:07.165Z" }, + { url = "https://files.pythonhosted.org/packages/40/01/e560d658dc0bb8ab762670ece35281dec7b6c1b33f5fbc09ebb57a185519/markupsafe-3.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1ba88449deb3de88bd40044603fafffb7bc2b055d626a330323a9ed736661695", size = 22050, upload-time = "2025-09-27T18:36:08.005Z" }, + { url = "https://files.pythonhosted.org/packages/af/cd/ce6e848bbf2c32314c9b237839119c5a564a59725b53157c856e90937b7a/markupsafe-3.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f42d0984e947b8adf7dd6dde396e720934d12c506ce84eea8476409563607591", size = 20681, upload-time = "2025-09-27T18:36:08.881Z" }, + { url = "https://files.pythonhosted.org/packages/c9/2a/b5c12c809f1c3045c4d580b035a743d12fcde53cf685dbc44660826308da/markupsafe-3.0.3-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c0c0b3ade1c0b13b936d7970b1d37a57acde9199dc2aecc4c336773e1d86049c", size = 20705, upload-time = "2025-09-27T18:36:10.131Z" }, + { url = "https://files.pythonhosted.org/packages/cf/e3/9427a68c82728d0a88c50f890d0fc072a1484de2f3ac1ad0bfc1a7214fd5/markupsafe-3.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0303439a41979d9e74d18ff5e2dd8c43ed6c6001fd40e5bf2e43f7bd9bbc523f", size = 21524, upload-time = "2025-09-27T18:36:11.324Z" }, + { url = "https://files.pythonhosted.org/packages/bc/36/23578f29e9e582a4d0278e009b38081dbe363c5e7165113fad546918a232/markupsafe-3.0.3-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:d2ee202e79d8ed691ceebae8e0486bd9a2cd4794cec4824e1c99b6f5009502f6", size = 20282, upload-time = "2025-09-27T18:36:12.573Z" }, + { url = "https://files.pythonhosted.org/packages/56/21/dca11354e756ebd03e036bd8ad58d6d7168c80ce1fe5e75218e4945cbab7/markupsafe-3.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:177b5253b2834fe3678cb4a5f0059808258584c559193998be2601324fdeafb1", size = 20745, upload-time = "2025-09-27T18:36:13.504Z" }, + { url = "https://files.pythonhosted.org/packages/87/99/faba9369a7ad6e4d10b6a5fbf71fa2a188fe4a593b15f0963b73859a1bbd/markupsafe-3.0.3-cp310-cp310-win32.whl", hash = "sha256:2a15a08b17dd94c53a1da0438822d70ebcd13f8c3a95abe3a9ef9f11a94830aa", size = 14571, upload-time = "2025-09-27T18:36:14.779Z" }, + { url = "https://files.pythonhosted.org/packages/d6/25/55dc3ab959917602c96985cb1253efaa4ff42f71194bddeb61eb7278b8be/markupsafe-3.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:c4ffb7ebf07cfe8931028e3e4c85f0357459a3f9f9490886198848f4fa002ec8", size = 15056, upload-time = "2025-09-27T18:36:16.125Z" }, + { url = "https://files.pythonhosted.org/packages/d0/9e/0a02226640c255d1da0b8d12e24ac2aa6734da68bff14c05dd53b94a0fc3/markupsafe-3.0.3-cp310-cp310-win_arm64.whl", hash = "sha256:e2103a929dfa2fcaf9bb4e7c091983a49c9ac3b19c9061b6d5427dd7d14d81a1", size = 13932, upload-time = "2025-09-27T18:36:17.311Z" }, + { url = "https://files.pythonhosted.org/packages/08/db/fefacb2136439fc8dd20e797950e749aa1f4997ed584c62cfb8ef7c2be0e/markupsafe-3.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1cc7ea17a6824959616c525620e387f6dd30fec8cb44f649e31712db02123dad", size = 11631, upload-time = "2025-09-27T18:36:18.185Z" }, + { url = "https://files.pythonhosted.org/packages/e1/2e/5898933336b61975ce9dc04decbc0a7f2fee78c30353c5efba7f2d6ff27a/markupsafe-3.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4bd4cd07944443f5a265608cc6aab442e4f74dff8088b0dfc8238647b8f6ae9a", size = 12058, upload-time = "2025-09-27T18:36:19.444Z" }, + { url = "https://files.pythonhosted.org/packages/1d/09/adf2df3699d87d1d8184038df46a9c80d78c0148492323f4693df54e17bb/markupsafe-3.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b5420a1d9450023228968e7e6a9ce57f65d148ab56d2313fcd589eee96a7a50", size = 24287, upload-time = "2025-09-27T18:36:20.768Z" }, + { url = "https://files.pythonhosted.org/packages/30/ac/0273f6fcb5f42e314c6d8cd99effae6a5354604d461b8d392b5ec9530a54/markupsafe-3.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0bf2a864d67e76e5c9a34dc26ec616a66b9888e25e7b9460e1c76d3293bd9dbf", size = 22940, upload-time = "2025-09-27T18:36:22.249Z" }, + { url = "https://files.pythonhosted.org/packages/19/ae/31c1be199ef767124c042c6c3e904da327a2f7f0cd63a0337e1eca2967a8/markupsafe-3.0.3-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc51efed119bc9cfdf792cdeaa4d67e8f6fcccab66ed4bfdd6bde3e59bfcbb2f", size = 21887, upload-time = "2025-09-27T18:36:23.535Z" }, + { url = "https://files.pythonhosted.org/packages/b2/76/7edcab99d5349a4532a459e1fe64f0b0467a3365056ae550d3bcf3f79e1e/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:068f375c472b3e7acbe2d5318dea141359e6900156b5b2ba06a30b169086b91a", size = 23692, upload-time = "2025-09-27T18:36:24.823Z" }, + { url = "https://files.pythonhosted.org/packages/a4/28/6e74cdd26d7514849143d69f0bf2399f929c37dc2b31e6829fd2045b2765/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:7be7b61bb172e1ed687f1754f8e7484f1c8019780f6f6b0786e76bb01c2ae115", size = 21471, upload-time = "2025-09-27T18:36:25.95Z" }, + { url = "https://files.pythonhosted.org/packages/62/7e/a145f36a5c2945673e590850a6f8014318d5577ed7e5920a4b3448e0865d/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f9e130248f4462aaa8e2552d547f36ddadbeaa573879158d721bbd33dfe4743a", size = 22923, upload-time = "2025-09-27T18:36:27.109Z" }, + { url = "https://files.pythonhosted.org/packages/0f/62/d9c46a7f5c9adbeeeda52f5b8d802e1094e9717705a645efc71b0913a0a8/markupsafe-3.0.3-cp311-cp311-win32.whl", hash = "sha256:0db14f5dafddbb6d9208827849fad01f1a2609380add406671a26386cdf15a19", size = 14572, upload-time = "2025-09-27T18:36:28.045Z" }, + { url = "https://files.pythonhosted.org/packages/83/8a/4414c03d3f891739326e1783338e48fb49781cc915b2e0ee052aa490d586/markupsafe-3.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:de8a88e63464af587c950061a5e6a67d3632e36df62b986892331d4620a35c01", size = 15077, upload-time = "2025-09-27T18:36:29.025Z" }, + { url = "https://files.pythonhosted.org/packages/35/73/893072b42e6862f319b5207adc9ae06070f095b358655f077f69a35601f0/markupsafe-3.0.3-cp311-cp311-win_arm64.whl", hash = "sha256:3b562dd9e9ea93f13d53989d23a7e775fdfd1066c33494ff43f5418bc8c58a5c", size = 13876, upload-time = "2025-09-27T18:36:29.954Z" }, + { url = "https://files.pythonhosted.org/packages/5a/72/147da192e38635ada20e0a2e1a51cf8823d2119ce8883f7053879c2199b5/markupsafe-3.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d53197da72cc091b024dd97249dfc7794d6a56530370992a5e1a08983ad9230e", size = 11615, upload-time = "2025-09-27T18:36:30.854Z" }, + { url = "https://files.pythonhosted.org/packages/9a/81/7e4e08678a1f98521201c3079f77db69fb552acd56067661f8c2f534a718/markupsafe-3.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1872df69a4de6aead3491198eaf13810b565bdbeec3ae2dc8780f14458ec73ce", size = 12020, upload-time = "2025-09-27T18:36:31.971Z" }, + { url = "https://files.pythonhosted.org/packages/1e/2c/799f4742efc39633a1b54a92eec4082e4f815314869865d876824c257c1e/markupsafe-3.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a7e8ae81ae39e62a41ec302f972ba6ae23a5c5396c8e60113e9066ef893da0d", size = 24332, upload-time = "2025-09-27T18:36:32.813Z" }, + { url = "https://files.pythonhosted.org/packages/3c/2e/8d0c2ab90a8c1d9a24f0399058ab8519a3279d1bd4289511d74e909f060e/markupsafe-3.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d6dd0be5b5b189d31db7cda48b91d7e0a9795f31430b7f271219ab30f1d3ac9d", size = 22947, upload-time = "2025-09-27T18:36:33.86Z" }, + { url = "https://files.pythonhosted.org/packages/2c/54/887f3092a85238093a0b2154bd629c89444f395618842e8b0c41783898ea/markupsafe-3.0.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:94c6f0bb423f739146aec64595853541634bde58b2135f27f61c1ffd1cd4d16a", size = 21962, upload-time = "2025-09-27T18:36:35.099Z" }, + { url = "https://files.pythonhosted.org/packages/c9/2f/336b8c7b6f4a4d95e91119dc8521402461b74a485558d8f238a68312f11c/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:be8813b57049a7dc738189df53d69395eba14fb99345e0a5994914a3864c8a4b", size = 23760, upload-time = "2025-09-27T18:36:36.001Z" }, + { url = "https://files.pythonhosted.org/packages/32/43/67935f2b7e4982ffb50a4d169b724d74b62a3964bc1a9a527f5ac4f1ee2b/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:83891d0e9fb81a825d9a6d61e3f07550ca70a076484292a70fde82c4b807286f", size = 21529, upload-time = "2025-09-27T18:36:36.906Z" }, + { url = "https://files.pythonhosted.org/packages/89/e0/4486f11e51bbba8b0c041098859e869e304d1c261e59244baa3d295d47b7/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:77f0643abe7495da77fb436f50f8dab76dbc6e5fd25d39589a0f1fe6548bfa2b", size = 23015, upload-time = "2025-09-27T18:36:37.868Z" }, + { url = "https://files.pythonhosted.org/packages/2f/e1/78ee7a023dac597a5825441ebd17170785a9dab23de95d2c7508ade94e0e/markupsafe-3.0.3-cp312-cp312-win32.whl", hash = "sha256:d88b440e37a16e651bda4c7c2b930eb586fd15ca7406cb39e211fcff3bf3017d", size = 14540, upload-time = "2025-09-27T18:36:38.761Z" }, + { url = "https://files.pythonhosted.org/packages/aa/5b/bec5aa9bbbb2c946ca2733ef9c4ca91c91b6a24580193e891b5f7dbe8e1e/markupsafe-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:26a5784ded40c9e318cfc2bdb30fe164bdb8665ded9cd64d500a34fb42067b1c", size = 15105, upload-time = "2025-09-27T18:36:39.701Z" }, + { url = "https://files.pythonhosted.org/packages/e5/f1/216fc1bbfd74011693a4fd837e7026152e89c4bcf3e77b6692fba9923123/markupsafe-3.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:35add3b638a5d900e807944a078b51922212fb3dedb01633a8defc4b01a3c85f", size = 13906, upload-time = "2025-09-27T18:36:40.689Z" }, + { url = "https://files.pythonhosted.org/packages/38/2f/907b9c7bbba283e68f20259574b13d005c121a0fa4c175f9bed27c4597ff/markupsafe-3.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e1cf1972137e83c5d4c136c43ced9ac51d0e124706ee1c8aa8532c1287fa8795", size = 11622, upload-time = "2025-09-27T18:36:41.777Z" }, + { url = "https://files.pythonhosted.org/packages/9c/d9/5f7756922cdd676869eca1c4e3c0cd0df60ed30199ffd775e319089cb3ed/markupsafe-3.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:116bb52f642a37c115f517494ea5feb03889e04df47eeff5b130b1808ce7c219", size = 12029, upload-time = "2025-09-27T18:36:43.257Z" }, + { url = "https://files.pythonhosted.org/packages/00/07/575a68c754943058c78f30db02ee03a64b3c638586fba6a6dd56830b30a3/markupsafe-3.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:133a43e73a802c5562be9bbcd03d090aa5a1fe899db609c29e8c8d815c5f6de6", size = 24374, upload-time = "2025-09-27T18:36:44.508Z" }, + { url = "https://files.pythonhosted.org/packages/a9/21/9b05698b46f218fc0e118e1f8168395c65c8a2c750ae2bab54fc4bd4e0e8/markupsafe-3.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ccfcd093f13f0f0b7fdd0f198b90053bf7b2f02a3927a30e63f3ccc9df56b676", size = 22980, upload-time = "2025-09-27T18:36:45.385Z" }, + { url = "https://files.pythonhosted.org/packages/7f/71/544260864f893f18b6827315b988c146b559391e6e7e8f7252839b1b846a/markupsafe-3.0.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:509fa21c6deb7a7a273d629cf5ec029bc209d1a51178615ddf718f5918992ab9", size = 21990, upload-time = "2025-09-27T18:36:46.916Z" }, + { url = "https://files.pythonhosted.org/packages/c2/28/b50fc2f74d1ad761af2f5dcce7492648b983d00a65b8c0e0cb457c82ebbe/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4afe79fb3de0b7097d81da19090f4df4f8d3a2b3adaa8764138aac2e44f3af1", size = 23784, upload-time = "2025-09-27T18:36:47.884Z" }, + { url = "https://files.pythonhosted.org/packages/ed/76/104b2aa106a208da8b17a2fb72e033a5a9d7073c68f7e508b94916ed47a9/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:795e7751525cae078558e679d646ae45574b47ed6e7771863fcc079a6171a0fc", size = 21588, upload-time = "2025-09-27T18:36:48.82Z" }, + { url = "https://files.pythonhosted.org/packages/b5/99/16a5eb2d140087ebd97180d95249b00a03aa87e29cc224056274f2e45fd6/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8485f406a96febb5140bfeca44a73e3ce5116b2501ac54fe953e488fb1d03b12", size = 23041, upload-time = "2025-09-27T18:36:49.797Z" }, + { url = "https://files.pythonhosted.org/packages/19/bc/e7140ed90c5d61d77cea142eed9f9c303f4c4806f60a1044c13e3f1471d0/markupsafe-3.0.3-cp313-cp313-win32.whl", hash = "sha256:bdd37121970bfd8be76c5fb069c7751683bdf373db1ed6c010162b2a130248ed", size = 14543, upload-time = "2025-09-27T18:36:51.584Z" }, + { url = "https://files.pythonhosted.org/packages/05/73/c4abe620b841b6b791f2edc248f556900667a5a1cf023a6646967ae98335/markupsafe-3.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:9a1abfdc021a164803f4d485104931fb8f8c1efd55bc6b748d2f5774e78b62c5", size = 15113, upload-time = "2025-09-27T18:36:52.537Z" }, + { url = "https://files.pythonhosted.org/packages/f0/3a/fa34a0f7cfef23cf9500d68cb7c32dd64ffd58a12b09225fb03dd37d5b80/markupsafe-3.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:7e68f88e5b8799aa49c85cd116c932a1ac15caaa3f5db09087854d218359e485", size = 13911, upload-time = "2025-09-27T18:36:53.513Z" }, + { url = "https://files.pythonhosted.org/packages/e4/d7/e05cd7efe43a88a17a37b3ae96e79a19e846f3f456fe79c57ca61356ef01/markupsafe-3.0.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:218551f6df4868a8d527e3062d0fb968682fe92054e89978594c28e642c43a73", size = 11658, upload-time = "2025-09-27T18:36:54.819Z" }, + { url = "https://files.pythonhosted.org/packages/99/9e/e412117548182ce2148bdeacdda3bb494260c0b0184360fe0d56389b523b/markupsafe-3.0.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3524b778fe5cfb3452a09d31e7b5adefeea8c5be1d43c4f810ba09f2ceb29d37", size = 12066, upload-time = "2025-09-27T18:36:55.714Z" }, + { url = "https://files.pythonhosted.org/packages/bc/e6/fa0ffcda717ef64a5108eaa7b4f5ed28d56122c9a6d70ab8b72f9f715c80/markupsafe-3.0.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4e885a3d1efa2eadc93c894a21770e4bc67899e3543680313b09f139e149ab19", size = 25639, upload-time = "2025-09-27T18:36:56.908Z" }, + { url = "https://files.pythonhosted.org/packages/96/ec/2102e881fe9d25fc16cb4b25d5f5cde50970967ffa5dddafdb771237062d/markupsafe-3.0.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8709b08f4a89aa7586de0aadc8da56180242ee0ada3999749b183aa23df95025", size = 23569, upload-time = "2025-09-27T18:36:57.913Z" }, + { url = "https://files.pythonhosted.org/packages/4b/30/6f2fce1f1f205fc9323255b216ca8a235b15860c34b6798f810f05828e32/markupsafe-3.0.3-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b8512a91625c9b3da6f127803b166b629725e68af71f8184ae7e7d54686a56d6", size = 23284, upload-time = "2025-09-27T18:36:58.833Z" }, + { url = "https://files.pythonhosted.org/packages/58/47/4a0ccea4ab9f5dcb6f79c0236d954acb382202721e704223a8aafa38b5c8/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9b79b7a16f7fedff2495d684f2b59b0457c3b493778c9eed31111be64d58279f", size = 24801, upload-time = "2025-09-27T18:36:59.739Z" }, + { url = "https://files.pythonhosted.org/packages/6a/70/3780e9b72180b6fecb83a4814d84c3bf4b4ae4bf0b19c27196104149734c/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:12c63dfb4a98206f045aa9563db46507995f7ef6d83b2f68eda65c307c6829eb", size = 22769, upload-time = "2025-09-27T18:37:00.719Z" }, + { url = "https://files.pythonhosted.org/packages/98/c5/c03c7f4125180fc215220c035beac6b9cb684bc7a067c84fc69414d315f5/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8f71bc33915be5186016f675cd83a1e08523649b0e33efdb898db577ef5bb009", size = 23642, upload-time = "2025-09-27T18:37:01.673Z" }, + { url = "https://files.pythonhosted.org/packages/80/d6/2d1b89f6ca4bff1036499b1e29a1d02d282259f3681540e16563f27ebc23/markupsafe-3.0.3-cp313-cp313t-win32.whl", hash = "sha256:69c0b73548bc525c8cb9a251cddf1931d1db4d2258e9599c28c07ef3580ef354", size = 14612, upload-time = "2025-09-27T18:37:02.639Z" }, + { url = "https://files.pythonhosted.org/packages/2b/98/e48a4bfba0a0ffcf9925fe2d69240bfaa19c6f7507b8cd09c70684a53c1e/markupsafe-3.0.3-cp313-cp313t-win_amd64.whl", hash = "sha256:1b4b79e8ebf6b55351f0d91fe80f893b4743f104bff22e90697db1590e47a218", size = 15200, upload-time = "2025-09-27T18:37:03.582Z" }, + { url = "https://files.pythonhosted.org/packages/0e/72/e3cc540f351f316e9ed0f092757459afbc595824ca724cbc5a5d4263713f/markupsafe-3.0.3-cp313-cp313t-win_arm64.whl", hash = "sha256:ad2cf8aa28b8c020ab2fc8287b0f823d0a7d8630784c31e9ee5edea20f406287", size = 13973, upload-time = "2025-09-27T18:37:04.929Z" }, + { url = "https://files.pythonhosted.org/packages/33/8a/8e42d4838cd89b7dde187011e97fe6c3af66d8c044997d2183fbd6d31352/markupsafe-3.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:eaa9599de571d72e2daf60164784109f19978b327a3910d3e9de8c97b5b70cfe", size = 11619, upload-time = "2025-09-27T18:37:06.342Z" }, + { url = "https://files.pythonhosted.org/packages/b5/64/7660f8a4a8e53c924d0fa05dc3a55c9cee10bbd82b11c5afb27d44b096ce/markupsafe-3.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c47a551199eb8eb2121d4f0f15ae0f923d31350ab9280078d1e5f12b249e0026", size = 12029, upload-time = "2025-09-27T18:37:07.213Z" }, + { url = "https://files.pythonhosted.org/packages/da/ef/e648bfd021127bef5fa12e1720ffed0c6cbb8310c8d9bea7266337ff06de/markupsafe-3.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f34c41761022dd093b4b6896d4810782ffbabe30f2d443ff5f083e0cbbb8c737", size = 24408, upload-time = "2025-09-27T18:37:09.572Z" }, + { url = "https://files.pythonhosted.org/packages/41/3c/a36c2450754618e62008bf7435ccb0f88053e07592e6028a34776213d877/markupsafe-3.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:457a69a9577064c05a97c41f4e65148652db078a3a509039e64d3467b9e7ef97", size = 23005, upload-time = "2025-09-27T18:37:10.58Z" }, + { url = "https://files.pythonhosted.org/packages/bc/20/b7fdf89a8456b099837cd1dc21974632a02a999ec9bf7ca3e490aacd98e7/markupsafe-3.0.3-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e8afc3f2ccfa24215f8cb28dcf43f0113ac3c37c2f0f0806d8c70e4228c5cf4d", size = 22048, upload-time = "2025-09-27T18:37:11.547Z" }, + { url = "https://files.pythonhosted.org/packages/9a/a7/591f592afdc734f47db08a75793a55d7fbcc6902a723ae4cfbab61010cc5/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ec15a59cf5af7be74194f7ab02d0f59a62bdcf1a537677ce67a2537c9b87fcda", size = 23821, upload-time = "2025-09-27T18:37:12.48Z" }, + { url = "https://files.pythonhosted.org/packages/7d/33/45b24e4f44195b26521bc6f1a82197118f74df348556594bd2262bda1038/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:0eb9ff8191e8498cca014656ae6b8d61f39da5f95b488805da4bb029cccbfbaf", size = 21606, upload-time = "2025-09-27T18:37:13.485Z" }, + { url = "https://files.pythonhosted.org/packages/ff/0e/53dfaca23a69fbfbbf17a4b64072090e70717344c52eaaaa9c5ddff1e5f0/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2713baf880df847f2bece4230d4d094280f4e67b1e813eec43b4c0e144a34ffe", size = 23043, upload-time = "2025-09-27T18:37:14.408Z" }, + { url = "https://files.pythonhosted.org/packages/46/11/f333a06fc16236d5238bfe74daccbca41459dcd8d1fa952e8fbd5dccfb70/markupsafe-3.0.3-cp314-cp314-win32.whl", hash = "sha256:729586769a26dbceff69f7a7dbbf59ab6572b99d94576a5592625d5b411576b9", size = 14747, upload-time = "2025-09-27T18:37:15.36Z" }, + { url = "https://files.pythonhosted.org/packages/28/52/182836104b33b444e400b14f797212f720cbc9ed6ba34c800639d154e821/markupsafe-3.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:bdc919ead48f234740ad807933cdf545180bfbe9342c2bb451556db2ed958581", size = 15341, upload-time = "2025-09-27T18:37:16.496Z" }, + { url = "https://files.pythonhosted.org/packages/6f/18/acf23e91bd94fd7b3031558b1f013adfa21a8e407a3fdb32745538730382/markupsafe-3.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:5a7d5dc5140555cf21a6fefbdbf8723f06fcd2f63ef108f2854de715e4422cb4", size = 14073, upload-time = "2025-09-27T18:37:17.476Z" }, + { url = "https://files.pythonhosted.org/packages/3c/f0/57689aa4076e1b43b15fdfa646b04653969d50cf30c32a102762be2485da/markupsafe-3.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:1353ef0c1b138e1907ae78e2f6c63ff67501122006b0f9abad68fda5f4ffc6ab", size = 11661, upload-time = "2025-09-27T18:37:18.453Z" }, + { url = "https://files.pythonhosted.org/packages/89/c3/2e67a7ca217c6912985ec766c6393b636fb0c2344443ff9d91404dc4c79f/markupsafe-3.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1085e7fbddd3be5f89cc898938f42c0b3c711fdcb37d75221de2666af647c175", size = 12069, upload-time = "2025-09-27T18:37:19.332Z" }, + { url = "https://files.pythonhosted.org/packages/f0/00/be561dce4e6ca66b15276e184ce4b8aec61fe83662cce2f7d72bd3249d28/markupsafe-3.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1b52b4fb9df4eb9ae465f8d0c228a00624de2334f216f178a995ccdcf82c4634", size = 25670, upload-time = "2025-09-27T18:37:20.245Z" }, + { url = "https://files.pythonhosted.org/packages/50/09/c419f6f5a92e5fadde27efd190eca90f05e1261b10dbd8cbcb39cd8ea1dc/markupsafe-3.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fed51ac40f757d41b7c48425901843666a6677e3e8eb0abcff09e4ba6e664f50", size = 23598, upload-time = "2025-09-27T18:37:21.177Z" }, + { url = "https://files.pythonhosted.org/packages/22/44/a0681611106e0b2921b3033fc19bc53323e0b50bc70cffdd19f7d679bb66/markupsafe-3.0.3-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f190daf01f13c72eac4efd5c430a8de82489d9cff23c364c3ea822545032993e", size = 23261, upload-time = "2025-09-27T18:37:22.167Z" }, + { url = "https://files.pythonhosted.org/packages/5f/57/1b0b3f100259dc9fffe780cfb60d4be71375510e435efec3d116b6436d43/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e56b7d45a839a697b5eb268c82a71bd8c7f6c94d6fd50c3d577fa39a9f1409f5", size = 24835, upload-time = "2025-09-27T18:37:23.296Z" }, + { url = "https://files.pythonhosted.org/packages/26/6a/4bf6d0c97c4920f1597cc14dd720705eca0bf7c787aebc6bb4d1bead5388/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:f3e98bb3798ead92273dc0e5fd0f31ade220f59a266ffd8a4f6065e0a3ce0523", size = 22733, upload-time = "2025-09-27T18:37:24.237Z" }, + { url = "https://files.pythonhosted.org/packages/14/c7/ca723101509b518797fedc2fdf79ba57f886b4aca8a7d31857ba3ee8281f/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5678211cb9333a6468fb8d8be0305520aa073f50d17f089b5b4b477ea6e67fdc", size = 23672, upload-time = "2025-09-27T18:37:25.271Z" }, + { url = "https://files.pythonhosted.org/packages/fb/df/5bd7a48c256faecd1d36edc13133e51397e41b73bb77e1a69deab746ebac/markupsafe-3.0.3-cp314-cp314t-win32.whl", hash = "sha256:915c04ba3851909ce68ccc2b8e2cd691618c4dc4c4232fb7982bca3f41fd8c3d", size = 14819, upload-time = "2025-09-27T18:37:26.285Z" }, + { url = "https://files.pythonhosted.org/packages/1a/8a/0402ba61a2f16038b48b39bccca271134be00c5c9f0f623208399333c448/markupsafe-3.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4faffd047e07c38848ce017e8725090413cd80cbc23d86e55c587bf979e579c9", size = 15426, upload-time = "2025-09-27T18:37:27.316Z" }, + { url = "https://files.pythonhosted.org/packages/70/bc/6f1c2f612465f5fa89b95bead1f44dcb607670fd42891d8fdcd5d039f4f4/markupsafe-3.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:32001d6a8fc98c8cb5c947787c5d08b0a50663d139f1305bac5885d98d9b40fa", size = 14146, upload-time = "2025-09-27T18:37:28.327Z" }, +] + +[[package]] +name = "maya-stubs" +version = "0.4.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/83/ac/cb12a396f8dad98fa15dae801899e8d1ff39debdaa66fe81cd8d93e4d666/maya_stubs-0.4.2.tar.gz", hash = "sha256:86eb6901b4e341895c572a94c055d0248903720a42c22a9a507bdcfda52e9da0", size = 313929, upload-time = "2025-10-30T21:43:30.561Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fd/39/df15b423c029fe7dcdf43814f4776fb689c86e6fc48ab36af3cae63b2732/maya_stubs-0.4.2-py3-none-any.whl", hash = "sha256:2dd28457af1877293f5b7544eea5a14384ad89b5a59796847c6c68c1a44f0db9", size = 258974, upload-time = "2025-10-30T21:43:28.101Z" }, +] + +[[package]] +name = "mayapythonprojecttemplate" +version = "0.0.0" +source = { editable = "." } + +[package.dev-dependencies] +dev = [ + { name = "maya-stubs" }, + { name = "mypy" }, + { name = "ruff" }, +] +docs = [ + { name = "mkdocs-material" }, + { name = "mkdocstrings", extra = ["python"] }, +] +test = [ + { name = "pytest" }, +] + +[package.metadata] + +[package.metadata.requires-dev] +dev = [ + { name = "maya-stubs" }, + { name = "mypy" }, + { name = "ruff" }, +] +docs = [ + { name = "mkdocs-material" }, + { name = "mkdocstrings", extras = ["python"] }, +] +test = [{ name = "pytest" }] + +[[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, upload-time = "2021-02-05T18:55:30.623Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2c/19/04f9b178c2d8a15b076c8b5140708fa6ffc5601fb6f1e975537072df5b2a/mergedeep-1.3.4-py3-none-any.whl", hash = "sha256:70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307", size = 6354, upload-time = "2021-02-05T18:55:29.583Z" }, +] + +[[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, upload-time = "2024-08-30T12:24:06.899Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/22/5b/dbc6a8cddc9cfa9c4971d59fb12bb8d42e161b7e7f8cc89e49137c5b279c/mkdocs-1.6.1-py3-none-any.whl", hash = "sha256:db91759624d1647f3f34aa0c3f327dd2601beae39a366d6e064c03468d35c20e", size = 3864451, upload-time = "2024-08-30T12:24:05.054Z" }, +] + +[[package]] +name = "mkdocs-autorefs" +version = "1.4.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown" }, + { name = "markupsafe" }, + { name = "mkdocs" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/52/c0/f641843de3f612a6b48253f39244165acff36657a91cc903633d456ae1ac/mkdocs_autorefs-1.4.4.tar.gz", hash = "sha256:d54a284f27a7346b9c38f1f852177940c222da508e66edc816a0fa55fc6da197", size = 56588, upload-time = "2026-02-10T15:23:55.105Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/28/de/a3e710469772c6a89595fc52816da05c1e164b4c866a89e3cb82fb1b67c5/mkdocs_autorefs-1.4.4-py3-none-any.whl", hash = "sha256:834ef5408d827071ad1bc69e0f39704fa34c7fc05bc8e1c72b227dfdc5c76089", size = 25530, upload-time = "2026-02-10T15:23:53.817Z" }, +] + +[[package]] +name = "mkdocs-get-deps" +version = "0.2.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mergedeep" }, + { name = "platformdirs" }, + { name = "pyyaml" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ce/25/b3cccb187655b9393572bde9b09261d267c3bf2f2cdabe347673be5976a6/mkdocs_get_deps-0.2.2.tar.gz", hash = "sha256:8ee8d5f316cdbbb2834bc1df6e69c08fe769a83e040060de26d3c19fad3599a1", size = 11047, upload-time = "2026-03-10T02:46:33.632Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/88/29/744136411e785c4b0b744d5413e56555265939ab3a104c6a4b719dad33fd/mkdocs_get_deps-0.2.2-py3-none-any.whl", hash = "sha256:e7878cbeac04860b8b5e0ca31d3abad3df9411a75a32cde82f8e44b6c16ff650", size = 9555, upload-time = "2026-03-10T02:46:32.256Z" }, +] + +[[package]] +name = "mkdocs-material" +version = "9.7.7" +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/f1/cd/c05d3a530ba7934f144fb45f7203cd236adc25c7bdcc34673d202f4b0278/mkdocs_material-9.7.7.tar.gz", hash = "sha256:c0649c065b1b0512d60aad8c10f947f8e455284475239b364b610f2deb4d0855", size = 4097923, upload-time = "2026-07-17T16:21:33.156Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ad/21/17c1bc9e6f47c972ad66fb2ac2568f99f90f1207eeb6fc3b34d094dba7b5/mkdocs_material-9.7.7-py3-none-any.whl", hash = "sha256:8ea9bb1737a5b524a5f9dcf2e1b4ebda8274ae3008aa7845720a97083bef708f", size = 9305438, upload-time = "2026-07-17T16:21:30.017Z" }, +] + +[[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, upload-time = "2023-11-22T19:09:45.208Z" } +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, upload-time = "2023-11-22T19:09:43.465Z" }, +] + +[[package]] +name = "mkdocstrings" +version = "1.0.6" +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/53/71/f85bdf13355073ae15a7375f09879375a830553552e58c1c4b7e0bbc5c8b/mkdocstrings-1.0.6.tar.gz", hash = "sha256:a0b8c2bdd29a6416c80d717aa369bbf7831946bd9f23c2a66db1b1dbe7693dbd", size = 100649, upload-time = "2026-07-11T19:38:05.732Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5d/5b/4c1902e8bdd5c4db63284e9d101dece4038d4025d6d88850ffe0a1578980/mkdocstrings-1.0.6-py3-none-any.whl", hash = "sha256:2703708697487d1b6d6d7b412e176fa436edf120c1bf81dc9e126b12d00893c7", size = 35787, upload-time = "2026-07-11T19:38:04.417Z" }, +] + +[package.optional-dependencies] +python = [ + { name = "mkdocstrings-python" }, +] + +[[package]] +name = "mkdocstrings-python" +version = "2.0.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "griffelib" }, + { name = "mkdocs-autorefs" }, + { name = "mkdocstrings" }, + { name = "typing-extensions", marker = "python_full_version < '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b1/b6/e858701499d57eee8b3fd8e78168083956c6683ddbe727b46758b19e1119/mkdocstrings_python-2.0.5.tar.gz", hash = "sha256:3a4d92556ad39637e88af94a5374213af9a8e3040c3824ceaed04b486c017594", size = 199578, upload-time = "2026-06-19T10:41:08.868Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/fc/10ab7e80650a9c9e8f4f1105f8c8e73567f88ed0c06ada589ab81d38687c/mkdocstrings_python-2.0.5-py3-none-any.whl", hash = "sha256:30c837bbff016549f659fcba6539ac351303f0fd7e713c89a040611072236e9d", size = 104951, upload-time = "2026-06-19T10:41:07.378Z" }, +] + +[[package]] +name = "mypy" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ast-serialize" }, + { name = "librt", marker = "platform_python_implementation != 'PyPy'" }, + { name = "mypy-extensions" }, + { name = "pathspec" }, + { name = "tomli", marker = "python_full_version < '3.11'" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/12/af/4e516a05d3ca2eb9283e9ec45b2c02225c1514dd6da49fd3c9eaa6639370/mypy-2.3.0.tar.gz", hash = "sha256:465965d41cd9a2726694e983e8ce7113259327bec798115d1e1dfa2a52fb666e", size = 3988104, upload-time = "2026-07-13T11:34:53.387Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a9/09/f2f5f45dae0c9a0891e4751a73312730e009395102e5d72a22a976cca41f/mypy-2.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1fa8d916ac3b705af733c4c1e6c9ebe38fd0d52beb15b105c3e8355b55e6ecdc", size = 14927774, upload-time = "2026-07-13T11:28:38.224Z" }, + { url = "https://files.pythonhosted.org/packages/56/b9/345367effd3a6877275a94d481614bfca983f45e028c6290e2cc54603811/mypy-2.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:28e1e2af8cd8fff551fd30f2fe4b03fb76764ac8b1ba6c6a1bd00ad32b412db3", size = 14000127, upload-time = "2026-07-13T11:30:19.57Z" }, + { url = "https://files.pythonhosted.org/packages/99/6c/a10b7a7b9f0a755fb94e27ae834d4cea9ad6c5221f9325eef8f182641feb/mypy-2.3.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3e77244df3843048c3f927182916730e40c124cbaa43905c1fb86cb382aa0805", size = 14229437, upload-time = "2026-07-13T11:28:17.765Z" }, + { url = "https://files.pythonhosted.org/packages/d9/bd/a26a602acb1bbf849fa4bdac4bc657ee2f11c0c2a764a2cc87a5304e865c/mypy-2.3.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9559ab18a9c9957dfa3004ab57cd4bac5f26a724329a9584e583367f0c2e1117", size = 15171457, upload-time = "2026-07-13T11:29:01.834Z" }, + { url = "https://files.pythonhosted.org/packages/7f/14/124f462bef69bcbc90b9358088460b6091954a3e004852fcd9948db617a5/mypy-2.3.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:09abd66d8685e73f8f7d17b847c3e104d9a7b164a8706ea87d6c96a3d45816d5", size = 15478281, upload-time = "2026-07-13T11:32:23.413Z" }, + { url = "https://files.pythonhosted.org/packages/db/a4/8bdca6a8ac8d856d82ed049144af2721245a135c2e8001d3890c93975852/mypy-2.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:5e91adad1ca81742ac7ef9893959911df867752206b37135185e88dfb3c89494", size = 11148008, upload-time = "2026-07-13T11:34:17.332Z" }, + { url = "https://files.pythonhosted.org/packages/83/41/490eea348e60ba50decec20bc750605444149a5d7a8cc560042f90ba2c75/mypy-2.3.0-cp310-cp310-win_arm64.whl", hash = "sha256:6f99ec626e3c3a2f7c0b22c5b90ddb5dabb1c18729c971e9bdaca1f1766d2cee", size = 10142329, upload-time = "2026-07-13T11:32:52.116Z" }, + { url = "https://files.pythonhosted.org/packages/e6/b9/d75b3082b05f1b3028828aeb18e74ae5ab0a0936051bbf1f32f59f654747/mypy-2.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3419d00717afbc5265b50dd14b1278f29ea4884dd398ab67873489ac093fd329", size = 14838725, upload-time = "2026-07-13T11:32:44.655Z" }, + { url = "https://files.pythonhosted.org/packages/a9/50/79a65c6ea6e115bc73296038a4543b2d5c91f07912b918a2c616a2514bba/mypy-2.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:cfca8ee88544090f86b6dcce05ec55d66eb48a762412ac2507810ba4bd793b6f", size = 13911128, upload-time = "2026-07-13T11:32:02.021Z" }, + { url = "https://files.pythonhosted.org/packages/90/48/e11ed7716c26953ca321f726e452e374dbf81a6f2b8b212ec02af29b6b8f/mypy-2.3.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:75cbb4b9ef04a0c84a957f07abc4504fbf64b8dcc145675101f2d3a78a4b1d6a", size = 14146742, upload-time = "2026-07-13T11:33:03.313Z" }, + { url = "https://files.pythonhosted.org/packages/06/72/6807565b1c4861ef66f7fdd98b51c61556356eab80235717b46c53bb8627/mypy-2.3.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:982e3d53dd23d0a4cef67dd66791fdbede0cf38f9eb617bf47663554c51e1e36", size = 15081418, upload-time = "2026-07-13T11:31:13.899Z" }, + { url = "https://files.pythonhosted.org/packages/00/80/1ea14c5d80e589e415973db3e47c78c2219a305b808b2b506395342c1d79/mypy-2.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:85c5385b93012ffa3b31479ab579aef5415f4f3a32c6cf1ae07a984d2a0ff461", size = 15328164, upload-time = "2026-07-13T11:31:35.723Z" }, + { url = "https://files.pythonhosted.org/packages/37/28/8223157404a3d51920078459c37f80fbdc590e1d8ea049dc5ce48643022a/mypy-2.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:13b1b16e2fa39f3b2e33fb1c468abc7a69369fa2e886b4b87b5afc81472325cd", size = 11136472, upload-time = "2026-07-13T11:27:37.018Z" }, + { url = "https://files.pythonhosted.org/packages/6f/cc/ea27e5959c5f258585a756b252031f3b313583d81b5064b2bebc41d3706b/mypy-2.3.0-cp311-cp311-win_arm64.whl", hash = "sha256:b5cd2f027a972a4a5f2278a11fac9747f5f81a53a30b714d74950b6807e55568", size = 10135800, upload-time = "2026-07-13T11:30:08.92Z" }, + { url = "https://files.pythonhosted.org/packages/dc/94/0e7e592619e2133596a47cdd642534b0456545c218430bd3b9d8fefdd1b1/mypy-2.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2d53fc67b9d28a43c6199077f49fea0f05839e36cf6158500331c9549225e5a5", size = 15026523, upload-time = "2026-07-13T11:34:49.206Z" }, + { url = "https://files.pythonhosted.org/packages/f6/d2/1e1731df090a857df2807177a4626863e5ac0f0256513c35780efe53986f/mypy-2.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fbc00cee7bdbb9291979ddc9d08034a29dfcda4932628c9bbc28c1edd589df0c", size = 14032189, upload-time = "2026-07-13T11:33:57.168Z" }, + { url = "https://files.pythonhosted.org/packages/44/95/cab921f4a806e171f34113e6181dd23c55358ccf6a80741269ef594a410e/mypy-2.3.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:04e617030eca5221909c8b7d8d7fd1c637948199aa2100b2ad9813feb07e1491", size = 14198696, upload-time = "2026-07-13T11:32:12.767Z" }, + { url = "https://files.pythonhosted.org/packages/66/80/e6d008bb19fe446e3662d85e0e2717bf9f2d611a2164fb29d6e067dbf46c/mypy-2.3.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:56c184d2c20ca6b6378d58d1960270a767f41f5e44acbbd27f05effef4f4e1d7", size = 15286904, upload-time = "2026-07-13T11:34:27.594Z" }, + { url = "https://files.pythonhosted.org/packages/db/83/94397c9293608a364aa03e8084fb34ede4ae976a260384b9b52929308135/mypy-2.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3961a4a34b05f7c74b0f05aa51fbfe99a2d1e126038df40318d15c8f558b7ef3", size = 15528342, upload-time = "2026-07-13T11:34:07.819Z" }, + { url = "https://files.pythonhosted.org/packages/cf/96/d8b37d819adec6cfccfb1fd3afc1735d94717ddeafb45536db9c6943e09b/mypy-2.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:b1942b9314d4c784b8ea1dbab4972603290e5dd5630f06675f13aec97526bc4c", size = 11218346, upload-time = "2026-07-13T11:28:27.745Z" }, + { url = "https://files.pythonhosted.org/packages/2b/cd/cd9f725b19b19e5b530a154cf9bcf9e94279c5d55b3c34fb42b3aa48ea1b/mypy-2.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:be51653d7669d7d7955d613b8d0bb57d5b652eaf71a873ddf65ac87254dd2595", size = 10204525, upload-time = "2026-07-13T11:31:02.552Z" }, + { url = "https://files.pythonhosted.org/packages/6e/ae/f7d056eb0294586a572d0d0d89580ec633c064db520f11d37d5a2fb833bd/mypy-2.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:91ad22a52ae2c7e621c2f67c94d5a17f66b3209a4cff5cf8a573579835c69e97", size = 14947298, upload-time = "2026-07-13T11:27:47.734Z" }, + { url = "https://files.pythonhosted.org/packages/32/d5/db3e7af01e7844d21662c6ddc1f7825ec7cb4053f0391ac02faf3638396f/mypy-2.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:99ac767cc5d3b64c8d0ae226ead10c96694f94e4e7da1668642225dcd4e75aac", size = 13950768, upload-time = "2026-07-13T11:27:57.726Z" }, + { url = "https://files.pythonhosted.org/packages/d9/fb/43c031f0190513d1ec248ed037eceb742ddd2a4d74bbf406658a28173837/mypy-2.3.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:de6d2c484742a4d7b0ed6d07b143375624d3b899c5749c7b3c947f56261f48a6", size = 14151586, upload-time = "2026-07-13T11:29:18.615Z" }, + { url = "https://files.pythonhosted.org/packages/ec/c3/f8b2ffc60883084da91be51af58e88a7ffd4ff9795acb7d902ff88d31eb1/mypy-2.3.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7da939dd335cfd2ad788bdfd081c9f4e47634ab995e5a45eb15fd1e5bc052f8b", size = 15227411, upload-time = "2026-07-13T11:30:29.904Z" }, + { url = "https://files.pythonhosted.org/packages/83/2e/16b917fc7adcf03f1aadddfc93aab804ffb234b1ab09c0ffd6d92a5d34a2/mypy-2.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7247eb2824f996722a949530183394921ca71deb9680052a338cf53cff7925c2", size = 15478790, upload-time = "2026-07-13T11:33:14.686Z" }, + { url = "https://files.pythonhosted.org/packages/c0/88/aaa65a93c73d0cdae7e42f8adb302bf6885bb281302084f99d0290a35347/mypy-2.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:75b0984bb3cbd76bb5c9291a8671f7ae66ca3b51c7584c358fc2e923259f0757", size = 11234919, upload-time = "2026-07-13T11:33:39.28Z" }, + { url = "https://files.pythonhosted.org/packages/35/19/b40de63f1a80e63bc2d40f0679a6a8dbd34e95176c8122119bdf406aa552/mypy-2.3.0-cp313-cp313-win_arm64.whl", hash = "sha256:d78fcf900b59cb7e82cb7e3a235e31b462d9333d92285bd1e4952d355b8ffba1", size = 10201510, upload-time = "2026-07-13T11:31:52.619Z" }, + { url = "https://files.pythonhosted.org/packages/a4/58/fa0ae047da911f540284009b4f44b96fe09d83c076d7c103e9d645f46303/mypy-2.3.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:ea317b060ce83e26050f8f9e4d7d6bf44ed7597c8ff9990bccffbb9d1d8522db", size = 14941909, upload-time = "2026-07-13T11:32:34.332Z" }, + { url = "https://files.pythonhosted.org/packages/15/14/2ba1d61452d7c2a7fe12741e8d374e52b183476b07aa7f9e2a0d02b0720a/mypy-2.3.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:094af99f92638aa92852326188b85a89e50f4a472f44827c03362228482f0762", size = 13967581, upload-time = "2026-07-13T11:30:00.587Z" }, + { url = "https://files.pythonhosted.org/packages/ed/5a/483fb9e5ffbbb1a28dccc7b0a13d141b17ac769b6c9f488c0a0c63698962/mypy-2.3.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:de121747278144fc9ae7caa2e978cf5df12aebc82933182f5b3b86081a30baef", size = 14168807, upload-time = "2026-07-13T11:28:48.6Z" }, + { url = "https://files.pythonhosted.org/packages/ae/77/70d7a10732063beb74ad713682cf871e88f5c5fa39bfc8beff8a524bf9cb/mypy-2.3.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:37fa4de896a84e2dc9200d91e614c22563b43d1a266789d4bbac7b22ebe6192b", size = 15200144, upload-time = "2026-07-13T11:31:25.283Z" }, + { url = "https://files.pythonhosted.org/packages/56/72/766218ac783be4fdfcd699b90037b63017348a3e86fb2c1fbfb18302637d/mypy-2.3.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:f1b3a98dfd21058bc759bb3337d5d1f61d0fdf9f3cf9c00f4291790fb5427bff", size = 15460389, upload-time = "2026-07-13T11:29:29.077Z" }, + { url = "https://files.pythonhosted.org/packages/38/4e/8a9db7411ecb8ec0cb1fd05dba432f28bafffcd38b4e887714a4a0506689/mypy-2.3.0-cp314-cp314-pyemscripten_2026_0_wasm32.whl", hash = "sha256:944c665d984157cb96a679dfb7a4a81dd1d36b24b9c284b699514e6e626b82d4", size = 7753664, upload-time = "2026-07-13T11:29:08.147Z" }, + { url = "https://files.pythonhosted.org/packages/65/4c/c3f8bfd6ed0e5e38b5a244403b27f821d433443df5a15a278417c10a3a3c/mypy-2.3.0-cp314-cp314-win_amd64.whl", hash = "sha256:4359424140d985192c778c1ce2c114a10c1ca58a381ed79cfa70d37df94b299f", size = 11417237, upload-time = "2026-07-13T11:33:47.467Z" }, + { url = "https://files.pythonhosted.org/packages/3c/00/89a32eaf5ccf174bc4f90db0eaea5d70636c01b8d49f384bdab2e8834390/mypy-2.3.0-cp314-cp314-win_arm64.whl", hash = "sha256:3dd0bed92c4bdec57c42505b96416fb9e6a5aa7be84d2809bcd5f2ecec2860d7", size = 10389252, upload-time = "2026-07-13T11:31:43.81Z" }, + { url = "https://files.pythonhosted.org/packages/31/56/104f93d69aa9f339b6b9d3b0a7faa699b8b466c942cf3ae86cc2a2ec0915/mypy-2.3.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:691fdc37132b1ae628d834f672e74de83462d9fb4aff621835767fb43a8dd373", size = 16385495, upload-time = "2026-07-13T11:29:49.818Z" }, + { url = "https://files.pythonhosted.org/packages/d2/03/f1d2123313f55efafdd27706960f43a771c62f1b68426c76043f3ab9ebf3/mypy-2.3.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:aec15d465d477558fd842757b487849007311cf3897849cdda0e3162ac0ac556", size = 15098155, upload-time = "2026-07-13T11:30:40.301Z" }, + { url = "https://files.pythonhosted.org/packages/e5/5d/d5f9200399b445e81726c4f23becee33f233aee81c72680b1ef3a258b641/mypy-2.3.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b352b7e49f5e6576009e8df730e1ff4f915cb565b851b396d2ffe2f5a6f5da88", size = 15514155, upload-time = "2026-07-13T11:34:38.569Z" }, + { url = "https://files.pythonhosted.org/packages/cd/ce/69977c555f08faa3190cfde44189b89dbd56861b1ab97aa18fc5f3a2e4a3/mypy-2.3.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1c6c6bf687b17f90dbfcad95b960d32eaa0154c00da45f03ab50bf8952e047fe", size = 16766351, upload-time = "2026-07-13T11:33:29.195Z" }, + { url = "https://files.pythonhosted.org/packages/bc/92/6648b6caa3ab9e00f9ac0c2a78307805f873dd48139b24a6f6f7c3667bbf/mypy-2.3.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:f4ed18f111bfe2d599bca7468e7f9251042c1c2118f762c8de2766a56d773c60", size = 17043490, upload-time = "2026-07-13T11:30:53.927Z" }, + { url = "https://files.pythonhosted.org/packages/7c/ab/0dc91d80f3f016634c68d451f294a97320fe903a9b6f90b9e57b3f7f1717/mypy-2.3.0-cp314-cp314t-win_amd64.whl", hash = "sha256:0b025a93cffb9781d231f232be07a17912f35f10a313c24f301c81e842870654", size = 12146869, upload-time = "2026-07-13T11:29:38.874Z" }, + { url = "https://files.pythonhosted.org/packages/85/b5/4c964d02634ba81f4d1c84838e5c5b18ab06d13ed568960f5d6318495ccc/mypy-2.3.0-cp314-cp314t-win_arm64.whl", hash = "sha256:adebc76aab4f3495a88b41d48aa4aff0c03f2822501da76625afcca5975f19e5", size = 10965113, upload-time = "2026-07-13T11:28:07.056Z" }, + { url = "https://files.pythonhosted.org/packages/2c/fa/fdc54fe583ba3cafbcedfb70eeeaf03849f75b1827a07096c7bd996f582d/mypy-2.3.0-py3-none-any.whl", hash = "sha256:6b1cdb579446b60432432b2b2403a6201b4b475a004d7f488511c9ba177c9e88", size = 2753292, upload-time = "2026-07-13T11:33:18.48Z" }, +] + +[[package]] +name = "mypy-extensions" +version = "1.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/6e/371856a3fb9d31ca8dac321cda606860fa4548858c0cc45d9d1d4ca2628b/mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558", size = 6343, upload-time = "2025-04-22T14:54:24.164Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/79/7b/2c79738432f5c924bef5071f933bcc9efd0473bac3b4aa584a6f7c1c8df8/mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505", size = 4963, upload-time = "2025-04-22T14:54:22.983Z" }, +] + +[[package]] +name = "packaging" +version = "26.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/fa/3944b40b07da9ce895c0e6303a5ab7d53da063554f534556b134a54d6093/packaging-26.3.tar.gz", hash = "sha256:94edc256424af38762eb31306eed28beb9f0efc50a8837492c9d6fd6004aed79", size = 313412, upload-time = "2026-08-04T18:15:28.737Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/63/34/ba1c580383c9eada3711951fef0795c80b829a078d72188184bcab9dd527/packaging-26.3-py3-none-any.whl", hash = "sha256:d7193f7c8e4e93f444fde0262bf90af30e16fa0ad0ad44cb553c87339b23cd1c", size = 129956, upload-time = "2026-08-04T18:15:27.159Z" }, +] + +[[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, upload-time = "2024-08-25T14:17:24.139Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/90/96/04b8e52da071d28f5e21a805b19cb9390aa17a47462ac87f5e2696b9566d/paginate-0.5.7-py2.py3-none-any.whl", hash = "sha256:b885e2af73abcf01d9559fd5216b57ef722f8c42affbb63942377668e35c7591", size = 13746, upload-time = "2024-08-25T14:17:22.55Z" }, +] + +[[package]] +name = "pathspec" +version = "1.1.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5a/82/42f767fc1c1143d6fd36efb827202a2d997a375e160a71eb2888a925aac1/pathspec-1.1.1.tar.gz", hash = "sha256:17db5ecd524104a120e173814c90367a96a98d07c45b2e10c2f3919fff91bf5a", size = 135180, upload-time = "2026-04-27T01:46:08.907Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f1/d9/7fb5aa316bc299258e68c73ba3bddbc499654a07f151cba08f6153988714/pathspec-1.1.1-py3-none-any.whl", hash = "sha256:a00ce642f577bf7f473932318056212bc4f8bfdf53128c78bbd5af0b9b20b189", size = 57328, upload-time = "2026-04-27T01:46:07.06Z" }, +] + +[[package]] +name = "platformdirs" +version = "4.11.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e5/98/0bf930c4f97d0266b58a89e36c015f56232c52b5d2f207215d48cca9e8f7/platformdirs-4.11.2.tar.gz", hash = "sha256:3a2ae5fca3520a01ab1be8b45613537f52ddf5b5f6f53d88233892dfbf0cd82d", size = 32716, upload-time = "2026-08-10T15:48:06.092Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/49/e2/4e6eee633809c376c024821b91ade709cbfd040ec53939ffbcc292aa7eee/platformdirs-4.11.2-py3-none-any.whl", hash = "sha256:7f89089b6ea71bda7962953edcf784b2e2d9d285b40ad88be2bb75c6e9d82ab4", size = 23361, upload-time = "2026-08-10T15:48:04.855Z" }, +] + +[[package]] +name = "pluggy" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, +] + +[[package]] +name = "pygments" +version = "2.20.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c3/b2/bc9c9196916376152d655522fdcebac55e66de6603a76a02bca1b6414f6c/pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f", size = 4955991, upload-time = "2026-03-29T13:29:33.898Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176", size = 1231151, upload-time = "2026-03-29T13:29:30.038Z" }, +] + +[[package]] +name = "pymdown-extensions" +version = "11.0.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown" }, + { name = "pyyaml" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/21/a9/5f0c535ba3b08fe09270c16808e053a968868242ecbd5676d4e3a488bf28/pymdown_extensions-11.0.1.tar.gz", hash = "sha256:dd2905ae6fc5b75582fafb139a1266ffc754705efa902aa50067fa7ff4f94ec0", size = 857113, upload-time = "2026-07-02T17:59:22.955Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d6/54/da572c98c0b77626a91b5d3b89f0231d8bff5125c225420908632f8b342d/pymdown_extensions-11.0.1-py3-none-any.whl", hash = "sha256:db3943a62bab7e03af1364f0c4083e64b91fb097675a4b6cceccfbe9a77e5eb2", size = 269455, upload-time = "2026-07-02T17:59:21.271Z" }, +] + +[[package]] +name = "pytest" +version = "9.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, + { name = "iniconfig" }, + { name = "packaging" }, + { name = "pluggy" }, + { name = "pygments" }, + { name = "tomli", marker = "python_full_version < '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e4/47/b9efed96c114afcfa3c9d3fe98a76a1d14c74a9e266d397cf6eb64be5e01/pytest-9.1.1.tar.gz", hash = "sha256:1088fbde8f2b49d95a549a195707afa7a76a3ce9bcadc26b6d71f0ffda5fe313", size = 1636369, upload-time = "2026-06-19T10:58:32.857Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/24/25/1de2678b631f5a49215c6c96fff41ba892b0a34df68d6d80292b1b48aa7f/pytest-9.1.1-py3-none-any.whl", hash = "sha256:37a86b45efb9a47a61a36449063e8e18d0cab3161329fc099eb21783169c4f0c", size = 386536, upload-time = "2026-06-19T10:58:31.347Z" }, +] + +[[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, upload-time = "2024-03-01T18:36:20.211Z" } +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, upload-time = "2024-03-01T18:36:18.57Z" }, +] + +[[package]] +name = "pyyaml" +version = "6.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", size = 130960, upload-time = "2025-09-25T21:33:16.546Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/a0/39350dd17dd6d6c6507025c0e53aef67a9293a6d37d3511f23ea510d5800/pyyaml-6.0.3-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:214ed4befebe12df36bcc8bc2b64b396ca31be9304b8f59e25c11cf94a4c033b", size = 184227, upload-time = "2025-09-25T21:31:46.04Z" }, + { url = "https://files.pythonhosted.org/packages/05/14/52d505b5c59ce73244f59c7a50ecf47093ce4765f116cdb98286a71eeca2/pyyaml-6.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:02ea2dfa234451bbb8772601d7b8e426c2bfa197136796224e50e35a78777956", size = 174019, upload-time = "2025-09-25T21:31:47.706Z" }, + { url = "https://files.pythonhosted.org/packages/43/f7/0e6a5ae5599c838c696adb4e6330a59f463265bfa1e116cfd1fbb0abaaae/pyyaml-6.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b30236e45cf30d2b8e7b3e85881719e98507abed1011bf463a8fa23e9c3e98a8", size = 740646, upload-time = "2025-09-25T21:31:49.21Z" }, + { url = "https://files.pythonhosted.org/packages/2f/3a/61b9db1d28f00f8fd0ae760459a5c4bf1b941baf714e207b6eb0657d2578/pyyaml-6.0.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:66291b10affd76d76f54fad28e22e51719ef9ba22b29e1d7d03d6777a9174198", size = 840793, upload-time = "2025-09-25T21:31:50.735Z" }, + { url = "https://files.pythonhosted.org/packages/7a/1e/7acc4f0e74c4b3d9531e24739e0ab832a5edf40e64fbae1a9c01941cabd7/pyyaml-6.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9c7708761fccb9397fe64bbc0395abcae8c4bf7b0eac081e12b809bf47700d0b", size = 770293, upload-time = "2025-09-25T21:31:51.828Z" }, + { url = "https://files.pythonhosted.org/packages/8b/ef/abd085f06853af0cd59fa5f913d61a8eab65d7639ff2a658d18a25d6a89d/pyyaml-6.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:418cf3f2111bc80e0933b2cd8cd04f286338bb88bdc7bc8e6dd775ebde60b5e0", size = 732872, upload-time = "2025-09-25T21:31:53.282Z" }, + { url = "https://files.pythonhosted.org/packages/1f/15/2bc9c8faf6450a8b3c9fc5448ed869c599c0a74ba2669772b1f3a0040180/pyyaml-6.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5e0b74767e5f8c593e8c9b5912019159ed0533c70051e9cce3e8b6aa699fcd69", size = 758828, upload-time = "2025-09-25T21:31:54.807Z" }, + { url = "https://files.pythonhosted.org/packages/a3/00/531e92e88c00f4333ce359e50c19b8d1de9fe8d581b1534e35ccfbc5f393/pyyaml-6.0.3-cp310-cp310-win32.whl", hash = "sha256:28c8d926f98f432f88adc23edf2e6d4921ac26fb084b028c733d01868d19007e", size = 142415, upload-time = "2025-09-25T21:31:55.885Z" }, + { url = "https://files.pythonhosted.org/packages/2a/fa/926c003379b19fca39dd4634818b00dec6c62d87faf628d1394e137354d4/pyyaml-6.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:bdb2c67c6c1390b63c6ff89f210c8fd09d9a1217a465701eac7316313c915e4c", size = 158561, upload-time = "2025-09-25T21:31:57.406Z" }, + { url = "https://files.pythonhosted.org/packages/6d/16/a95b6757765b7b031c9374925bb718d55e0a9ba8a1b6a12d25962ea44347/pyyaml-6.0.3-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:44edc647873928551a01e7a563d7452ccdebee747728c1080d881d68af7b997e", size = 185826, upload-time = "2025-09-25T21:31:58.655Z" }, + { url = "https://files.pythonhosted.org/packages/16/19/13de8e4377ed53079ee996e1ab0a9c33ec2faf808a4647b7b4c0d46dd239/pyyaml-6.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:652cb6edd41e718550aad172851962662ff2681490a8a711af6a4d288dd96824", size = 175577, upload-time = "2025-09-25T21:32:00.088Z" }, + { url = "https://files.pythonhosted.org/packages/0c/62/d2eb46264d4b157dae1275b573017abec435397aa59cbcdab6fc978a8af4/pyyaml-6.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:10892704fc220243f5305762e276552a0395f7beb4dbf9b14ec8fd43b57f126c", size = 775556, upload-time = "2025-09-25T21:32:01.31Z" }, + { url = "https://files.pythonhosted.org/packages/10/cb/16c3f2cf3266edd25aaa00d6c4350381c8b012ed6f5276675b9eba8d9ff4/pyyaml-6.0.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:850774a7879607d3a6f50d36d04f00ee69e7fc816450e5f7e58d7f17f1ae5c00", size = 882114, upload-time = "2025-09-25T21:32:03.376Z" }, + { url = "https://files.pythonhosted.org/packages/71/60/917329f640924b18ff085ab889a11c763e0b573da888e8404ff486657602/pyyaml-6.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b8bb0864c5a28024fac8a632c443c87c5aa6f215c0b126c449ae1a150412f31d", size = 806638, upload-time = "2025-09-25T21:32:04.553Z" }, + { url = "https://files.pythonhosted.org/packages/dd/6f/529b0f316a9fd167281a6c3826b5583e6192dba792dd55e3203d3f8e655a/pyyaml-6.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d37d57ad971609cf3c53ba6a7e365e40660e3be0e5175fa9f2365a379d6095a", size = 767463, upload-time = "2025-09-25T21:32:06.152Z" }, + { url = "https://files.pythonhosted.org/packages/f2/6a/b627b4e0c1dd03718543519ffb2f1deea4a1e6d42fbab8021936a4d22589/pyyaml-6.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:37503bfbfc9d2c40b344d06b2199cf0e96e97957ab1c1b546fd4f87e53e5d3e4", size = 794986, upload-time = "2025-09-25T21:32:07.367Z" }, + { url = "https://files.pythonhosted.org/packages/45/91/47a6e1c42d9ee337c4839208f30d9f09caa9f720ec7582917b264defc875/pyyaml-6.0.3-cp311-cp311-win32.whl", hash = "sha256:8098f252adfa6c80ab48096053f512f2321f0b998f98150cea9bd23d83e1467b", size = 142543, upload-time = "2025-09-25T21:32:08.95Z" }, + { url = "https://files.pythonhosted.org/packages/da/e3/ea007450a105ae919a72393cb06f122f288ef60bba2dc64b26e2646fa315/pyyaml-6.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:9f3bfb4965eb874431221a3ff3fdcddc7e74e3b07799e0e84ca4a0f867d449bf", size = 158763, upload-time = "2025-09-25T21:32:09.96Z" }, + { url = "https://files.pythonhosted.org/packages/d1/33/422b98d2195232ca1826284a76852ad5a86fe23e31b009c9886b2d0fb8b2/pyyaml-6.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196", size = 182063, upload-time = "2025-09-25T21:32:11.445Z" }, + { url = "https://files.pythonhosted.org/packages/89/a0/6cf41a19a1f2f3feab0e9c0b74134aa2ce6849093d5517a0c550fe37a648/pyyaml-6.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0", size = 173973, upload-time = "2025-09-25T21:32:12.492Z" }, + { url = "https://files.pythonhosted.org/packages/ed/23/7a778b6bd0b9a8039df8b1b1d80e2e2ad78aa04171592c8a5c43a56a6af4/pyyaml-6.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28", size = 775116, upload-time = "2025-09-25T21:32:13.652Z" }, + { url = "https://files.pythonhosted.org/packages/65/30/d7353c338e12baef4ecc1b09e877c1970bd3382789c159b4f89d6a70dc09/pyyaml-6.0.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c", size = 844011, upload-time = "2025-09-25T21:32:15.21Z" }, + { url = "https://files.pythonhosted.org/packages/8b/9d/b3589d3877982d4f2329302ef98a8026e7f4443c765c46cfecc8858c6b4b/pyyaml-6.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc", size = 807870, upload-time = "2025-09-25T21:32:16.431Z" }, + { url = "https://files.pythonhosted.org/packages/05/c0/b3be26a015601b822b97d9149ff8cb5ead58c66f981e04fedf4e762f4bd4/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e", size = 761089, upload-time = "2025-09-25T21:32:17.56Z" }, + { url = "https://files.pythonhosted.org/packages/be/8e/98435a21d1d4b46590d5459a22d88128103f8da4c2d4cb8f14f2a96504e1/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea", size = 790181, upload-time = "2025-09-25T21:32:18.834Z" }, + { url = "https://files.pythonhosted.org/packages/74/93/7baea19427dcfbe1e5a372d81473250b379f04b1bd3c4c5ff825e2327202/pyyaml-6.0.3-cp312-cp312-win32.whl", hash = "sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5", size = 137658, upload-time = "2025-09-25T21:32:20.209Z" }, + { url = "https://files.pythonhosted.org/packages/86/bf/899e81e4cce32febab4fb42bb97dcdf66bc135272882d1987881a4b519e9/pyyaml-6.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b", size = 154003, upload-time = "2025-09-25T21:32:21.167Z" }, + { url = "https://files.pythonhosted.org/packages/1a/08/67bd04656199bbb51dbed1439b7f27601dfb576fb864099c7ef0c3e55531/pyyaml-6.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd", size = 140344, upload-time = "2025-09-25T21:32:22.617Z" }, + { url = "https://files.pythonhosted.org/packages/d1/11/0fd08f8192109f7169db964b5707a2f1e8b745d4e239b784a5a1dd80d1db/pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8", size = 181669, upload-time = "2025-09-25T21:32:23.673Z" }, + { url = "https://files.pythonhosted.org/packages/b1/16/95309993f1d3748cd644e02e38b75d50cbc0d9561d21f390a76242ce073f/pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1", size = 173252, upload-time = "2025-09-25T21:32:25.149Z" }, + { url = "https://files.pythonhosted.org/packages/50/31/b20f376d3f810b9b2371e72ef5adb33879b25edb7a6d072cb7ca0c486398/pyyaml-6.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c", size = 767081, upload-time = "2025-09-25T21:32:26.575Z" }, + { url = "https://files.pythonhosted.org/packages/49/1e/a55ca81e949270d5d4432fbbd19dfea5321eda7c41a849d443dc92fd1ff7/pyyaml-6.0.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5", size = 841159, upload-time = "2025-09-25T21:32:27.727Z" }, + { url = "https://files.pythonhosted.org/packages/74/27/e5b8f34d02d9995b80abcef563ea1f8b56d20134d8f4e5e81733b1feceb2/pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6", size = 801626, upload-time = "2025-09-25T21:32:28.878Z" }, + { url = "https://files.pythonhosted.org/packages/f9/11/ba845c23988798f40e52ba45f34849aa8a1f2d4af4b798588010792ebad6/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6", size = 753613, upload-time = "2025-09-25T21:32:30.178Z" }, + { url = "https://files.pythonhosted.org/packages/3d/e0/7966e1a7bfc0a45bf0a7fb6b98ea03fc9b8d84fa7f2229e9659680b69ee3/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be", size = 794115, upload-time = "2025-09-25T21:32:31.353Z" }, + { url = "https://files.pythonhosted.org/packages/de/94/980b50a6531b3019e45ddeada0626d45fa85cbe22300844a7983285bed3b/pyyaml-6.0.3-cp313-cp313-win32.whl", hash = "sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26", size = 137427, upload-time = "2025-09-25T21:32:32.58Z" }, + { url = "https://files.pythonhosted.org/packages/97/c9/39d5b874e8b28845e4ec2202b5da735d0199dbe5b8fb85f91398814a9a46/pyyaml-6.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c", size = 154090, upload-time = "2025-09-25T21:32:33.659Z" }, + { url = "https://files.pythonhosted.org/packages/73/e8/2bdf3ca2090f68bb3d75b44da7bbc71843b19c9f2b9cb9b0f4ab7a5a4329/pyyaml-6.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb", size = 140246, upload-time = "2025-09-25T21:32:34.663Z" }, + { url = "https://files.pythonhosted.org/packages/9d/8c/f4bd7f6465179953d3ac9bc44ac1a8a3e6122cf8ada906b4f96c60172d43/pyyaml-6.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac", size = 181814, upload-time = "2025-09-25T21:32:35.712Z" }, + { url = "https://files.pythonhosted.org/packages/bd/9c/4d95bb87eb2063d20db7b60faa3840c1b18025517ae857371c4dd55a6b3a/pyyaml-6.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310", size = 173809, upload-time = "2025-09-25T21:32:36.789Z" }, + { url = "https://files.pythonhosted.org/packages/92/b5/47e807c2623074914e29dabd16cbbdd4bf5e9b2db9f8090fa64411fc5382/pyyaml-6.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7", size = 766454, upload-time = "2025-09-25T21:32:37.966Z" }, + { url = "https://files.pythonhosted.org/packages/02/9e/e5e9b168be58564121efb3de6859c452fccde0ab093d8438905899a3a483/pyyaml-6.0.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788", size = 836355, upload-time = "2025-09-25T21:32:39.178Z" }, + { url = "https://files.pythonhosted.org/packages/88/f9/16491d7ed2a919954993e48aa941b200f38040928474c9e85ea9e64222c3/pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5", size = 794175, upload-time = "2025-09-25T21:32:40.865Z" }, + { url = "https://files.pythonhosted.org/packages/dd/3f/5989debef34dc6397317802b527dbbafb2b4760878a53d4166579111411e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764", size = 755228, upload-time = "2025-09-25T21:32:42.084Z" }, + { url = "https://files.pythonhosted.org/packages/d7/ce/af88a49043cd2e265be63d083fc75b27b6ed062f5f9fd6cdc223ad62f03e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35", size = 789194, upload-time = "2025-09-25T21:32:43.362Z" }, + { url = "https://files.pythonhosted.org/packages/23/20/bb6982b26a40bb43951265ba29d4c246ef0ff59c9fdcdf0ed04e0687de4d/pyyaml-6.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac", size = 156429, upload-time = "2025-09-25T21:32:57.844Z" }, + { url = "https://files.pythonhosted.org/packages/f4/f4/a4541072bb9422c8a883ab55255f918fa378ecf083f5b85e87fc2b4eda1b/pyyaml-6.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3", size = 143912, upload-time = "2025-09-25T21:32:59.247Z" }, + { url = "https://files.pythonhosted.org/packages/7c/f9/07dd09ae774e4616edf6cda684ee78f97777bdd15847253637a6f052a62f/pyyaml-6.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3", size = 189108, upload-time = "2025-09-25T21:32:44.377Z" }, + { url = "https://files.pythonhosted.org/packages/4e/78/8d08c9fb7ce09ad8c38ad533c1191cf27f7ae1effe5bb9400a46d9437fcf/pyyaml-6.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba", size = 183641, upload-time = "2025-09-25T21:32:45.407Z" }, + { url = "https://files.pythonhosted.org/packages/7b/5b/3babb19104a46945cf816d047db2788bcaf8c94527a805610b0289a01c6b/pyyaml-6.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c", size = 831901, upload-time = "2025-09-25T21:32:48.83Z" }, + { url = "https://files.pythonhosted.org/packages/8b/cc/dff0684d8dc44da4d22a13f35f073d558c268780ce3c6ba1b87055bb0b87/pyyaml-6.0.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702", size = 861132, upload-time = "2025-09-25T21:32:50.149Z" }, + { url = "https://files.pythonhosted.org/packages/b1/5e/f77dc6b9036943e285ba76b49e118d9ea929885becb0a29ba8a7c75e29fe/pyyaml-6.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c", size = 839261, upload-time = "2025-09-25T21:32:51.808Z" }, + { url = "https://files.pythonhosted.org/packages/ce/88/a9db1376aa2a228197c58b37302f284b5617f56a5d959fd1763fb1675ce6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065", size = 805272, upload-time = "2025-09-25T21:32:52.941Z" }, + { url = "https://files.pythonhosted.org/packages/da/92/1446574745d74df0c92e6aa4a7b0b3130706a4142b2d1a5869f2eaa423c6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65", size = 829923, upload-time = "2025-09-25T21:32:54.537Z" }, + { url = "https://files.pythonhosted.org/packages/f0/7a/1c7270340330e575b92f397352af856a8c06f230aa3e76f86b39d01b416a/pyyaml-6.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9", size = 174062, upload-time = "2025-09-25T21:32:55.767Z" }, + { url = "https://files.pythonhosted.org/packages/f1/12/de94a39c2ef588c7e6455cfbe7343d3b2dc9d6b6b2f40c4c6565744c873d/pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b", size = 149341, upload-time = "2025-09-25T21:32:56.828Z" }, +] + +[[package]] +name = "pyyaml-env-tag" +version = "1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyyaml" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/eb/2e/79c822141bfd05a853236b504869ebc6b70159afc570e1d5a20641782eaa/pyyaml_env_tag-1.1.tar.gz", hash = "sha256:2eb38b75a2d21ee0475d6d97ec19c63287a7e140231e4214969d0eac923cd7ff", size = 5737, upload-time = "2025-05-13T15:24:01.64Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/11/432f32f8097b03e3cd5fe57e88efb685d964e2e5178a48ed61e841f7fdce/pyyaml_env_tag-1.1-py3-none-any.whl", hash = "sha256:17109e1a528561e32f026364712fee1264bc2ea6715120891174ed1b980d2e04", size = 4722, upload-time = "2025-05-13T15:23:59.629Z" }, +] + +[[package]] +name = "requests" +version = "2.34.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "charset-normalizer" }, + { name = "idna" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ac/c3/e2a2b89f2d3e2179abd6d00ebd70bff6273f37fb3e0cc209f48b39d00cbf/requests-2.34.2.tar.gz", hash = "sha256:f288924cae4e29463698d6d60bc6a4da69c89185ad1e0bcc4104f584e960b9ed", size = 142856, upload-time = "2026-05-14T19:25:27.735Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/f4/c67b0b3f1b9245e8d266f0f112c500d50e5b4e83cb6f3b71b6528104182a/requests-2.34.2-py3-none-any.whl", hash = "sha256:2a0d60c172f83ac6ab31e4554906c0f3b3588d37b5cb939b1c061f4907e278e0", size = 73075, upload-time = "2026-05-14T19:25:26.443Z" }, +] + +[[package]] +name = "ruff" +version = "0.16.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/73/e1/4508a569211b35599016e84ba65c1a992b7a4004b4b6c4bea02a851cba1b/ruff-0.16.2.tar.gz", hash = "sha256:c3d7828d12e8927a6fc65fe38e2c2541b9e762d360a1786d752cb1b8883b3c9c", size = 4885811, upload-time = "2026-08-07T13:31:01.432Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/14/57/db19951540f98859c956b50bdb4d31089b4d91e9f15e2968e7d5193806d5/ruff-0.16.2-py3-none-linux_armv6l.whl", hash = "sha256:3c8de4cf2181f01d57946d87d777aa52916976fc09942aed89938fab5e013318", size = 10847925, upload-time = "2026-08-07T13:30:14.468Z" }, + { url = "https://files.pythonhosted.org/packages/13/5a/995fe85a8470d3e391ac0f7fa8054bb454eaf33ee138196d6172ed1079c0/ruff-0.16.2-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:9a48cc05c6fbc811ca81b5d7ba95375affea6582d1b8024e455e41afbbf55344", size = 11072662, upload-time = "2026-08-07T13:30:18.143Z" }, + { url = "https://files.pythonhosted.org/packages/32/53/370d767c61c71a971a4ace36703a7ecd8c393956349a7325d7fab2b56827/ruff-0.16.2-py3-none-macosx_11_0_arm64.whl", hash = "sha256:a2c0d14fcbb26c91f0f867a6dc9bd71bbc30b1b6151829c884f23faeab2e5700", size = 10566771, upload-time = "2026-08-07T13:30:20.899Z" }, + { url = "https://files.pythonhosted.org/packages/85/d6/9d96948caf5a632be62d62202d5ec914d6856f204fd79eb036e5915e79ea/ruff-0.16.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:335c621622c4650330be50842561c6586ac6971bb8ab5407fe34dcc9efb16bbe", size = 10975825, upload-time = "2026-08-07T13:30:23.517Z" }, + { url = "https://files.pythonhosted.org/packages/3b/92/ea87129b3414acb0b5770563779c51804d37ac67675c7ba35447ddb14773/ruff-0.16.2-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:20e66910f2c37cc753f9ef6580c914a621b80c4fa3549d3e3521e29d0f5bfc3f", size = 10649437, upload-time = "2026-08-07T13:30:26.097Z" }, + { url = "https://files.pythonhosted.org/packages/ac/43/f8f291dcd4af5bb7872b74fdfa41a7cd7c856ca1d4069670971cf1b9f5cb/ruff-0.16.2-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c7e36fbfba65510548156902bcf1350a979a958ce0347ce0f90d73894036b39f", size = 11446761, upload-time = "2026-08-07T13:30:28.752Z" }, + { url = "https://files.pythonhosted.org/packages/71/4a/ef991fb2fcf516ab71f0808adcdd8da5e18c8cde447f4ceaf5f47a5132a5/ruff-0.16.2-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f0eab35f80df8f134aae5d1630e751901321d317cc8e50dc39e36fa3ed34cd12", size = 12336364, upload-time = "2026-08-07T13:30:31.468Z" }, + { url = "https://files.pythonhosted.org/packages/f3/24/f615e74f307e6ca0e56a482872477b856c70d530aa356abfb6dfe5ca8a80/ruff-0.16.2-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:40ea8c0594feb894e89c8c61ab9c103d38b0ea72dfde6c594107147ca31b1140", size = 11630720, upload-time = "2026-08-07T13:30:34.426Z" }, + { url = "https://files.pythonhosted.org/packages/c5/d3/8ef50149e8412a77f7ab409efdef0e2b23803707a3863da4fc64cb23d459/ruff-0.16.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ab3d62dde0b19facdd632008cc4827fc28ada7736c6bd35ab6f1050f0bfed53f", size = 11466130, upload-time = "2026-08-07T13:30:36.958Z" }, + { url = "https://files.pythonhosted.org/packages/dd/a7/a19334985c4dea8c381981fa252cd854c7ee52dc4b1686dc16f4a911c702/ruff-0.16.2-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:e43e1f5b8388da9eca1b9e88328d47a5cec794633ccf6f7484ac2dd15eee92c0", size = 11523634, upload-time = "2026-08-07T13:30:39.822Z" }, + { url = "https://files.pythonhosted.org/packages/6e/6c/96d192b0e742412ceda08c0a50f9669b253dde9fd6a60ea1a10c9fa79a63/ruff-0.16.2-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:c24788a980581e1d7ea3a0cbe4344c4fbeb0a6a9b1f4713aa46bb104f8294690", size = 10949807, upload-time = "2026-08-07T13:30:42.745Z" }, + { url = "https://files.pythonhosted.org/packages/fa/51/e26599ceca11e79ee255c7df515995561edf87e9ca1893284e44d98f5a86/ruff-0.16.2-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:81806b08329130005dd4a8a8394a0c9da8c6f4cafb16ba438d2a2ee6a18bedf1", size = 10646891, upload-time = "2026-08-07T13:30:45.522Z" }, + { url = "https://files.pythonhosted.org/packages/68/01/800c4b1f97bc8d7c6029e06b1f20473a3cf1e13c4933d8f3342add83fc55/ruff-0.16.2-py3-none-musllinux_1_2_i686.whl", hash = "sha256:4ce4e02bad779bef557f541a1b31f20d6abeae1cc05ed1b1ac019d4ffd1044c8", size = 11162063, upload-time = "2026-08-07T13:30:48.131Z" }, + { url = "https://files.pythonhosted.org/packages/e4/d0/1477ea50fc5a0d4b0b71d1d63d50770bdd794d90b43e37a7618e63ec9894/ruff-0.16.2-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:e0422abdf70070255fc4073ce9dfc814cc03db577013761ddd09bc1e4a9a4fbd", size = 11556038, upload-time = "2026-08-07T13:30:50.686Z" }, + { url = "https://files.pythonhosted.org/packages/b8/76/a7776f32048d991e16d4fa8ff91790b877342d3596cc3ed04acdbf1aaedc/ruff-0.16.2-py3-none-win32.whl", hash = "sha256:bf3a63d78fb39f4bf5ac8ae52051c5520505301abe19ba4e204c453b3f09bb0b", size = 10872850, upload-time = "2026-08-07T13:30:53.471Z" }, + { url = "https://files.pythonhosted.org/packages/00/0d/929c800d920e61397d82a01b60bffc68da3052c17d31de59efaad2e4ed75/ruff-0.16.2-py3-none-win_amd64.whl", hash = "sha256:bcabe2f6d0fc7819f1431793005af4e4de7371927d037345bf941252b195b9fa", size = 12023338, upload-time = "2026-08-07T13:30:56.193Z" }, + { url = "https://files.pythonhosted.org/packages/5b/6c/93e26c22c5f78ff87363e07da49c84955affbeb1098bd1936bf3b3f293bf/ruff-0.16.2-py3-none-win_arm64.whl", hash = "sha256:d614e95cedf38a2053fd351c55b103ba30d017d61688fdbfd40ee0412852a99f", size = 11374065, upload-time = "2026-08-07T13:30:58.775Z" }, +] + +[[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, upload-time = "2024-12-04T17:35:28.174Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" }, +] + +[[package]] +name = "tomli" +version = "2.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/22/de/48c59722572767841493b26183a0d1cc411d54fd759c5607c4590b6563a6/tomli-2.4.1.tar.gz", hash = "sha256:7c7e1a961a0b2f2472c1ac5b69affa0ae1132c39adcb67aba98568702b9cc23f", size = 17543, upload-time = "2026-03-25T20:22:03.828Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/11/db3d5885d8528263d8adc260bb2d28ebf1270b96e98f0e0268d32b8d9900/tomli-2.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f8f0fc26ec2cc2b965b7a3b87cd19c5c6b8c5e5f436b984e85f486d652285c30", size = 154704, upload-time = "2026-03-25T20:21:10.473Z" }, + { url = "https://files.pythonhosted.org/packages/6d/f7/675db52c7e46064a9aa928885a9b20f4124ecb9bc2e1ce74c9106648d202/tomli-2.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4ab97e64ccda8756376892c53a72bd1f964e519c77236368527f758fbc36a53a", size = 149454, upload-time = "2026-03-25T20:21:12.036Z" }, + { url = "https://files.pythonhosted.org/packages/61/71/81c50943cf953efa35bce7646caab3cf457a7d8c030b27cfb40d7235f9ee/tomli-2.4.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:96481a5786729fd470164b47cdb3e0e58062a496f455ee41b4403be77cb5a076", size = 237561, upload-time = "2026-03-25T20:21:13.098Z" }, + { url = "https://files.pythonhosted.org/packages/48/c1/f41d9cb618acccca7df82aaf682f9b49013c9397212cb9f53219e3abac37/tomli-2.4.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5a881ab208c0baf688221f8cecc5401bd291d67e38a1ac884d6736cbcd8247e9", size = 243824, upload-time = "2026-03-25T20:21:14.569Z" }, + { url = "https://files.pythonhosted.org/packages/22/e4/5a816ecdd1f8ca51fb756ef684b90f2780afc52fc67f987e3c61d800a46d/tomli-2.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:47149d5bd38761ac8be13a84864bf0b7b70bc051806bc3669ab1cbc56216b23c", size = 242227, upload-time = "2026-03-25T20:21:15.712Z" }, + { url = "https://files.pythonhosted.org/packages/6b/49/2b2a0ef529aa6eec245d25f0c703e020a73955ad7edf73e7f54ddc608aa5/tomli-2.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ec9bfaf3ad2df51ace80688143a6a4ebc09a248f6ff781a9945e51937008fcbc", size = 247859, upload-time = "2026-03-25T20:21:17.001Z" }, + { url = "https://files.pythonhosted.org/packages/83/bd/6c1a630eaca337e1e78c5903104f831bda934c426f9231429396ce3c3467/tomli-2.4.1-cp311-cp311-win32.whl", hash = "sha256:ff2983983d34813c1aeb0fa89091e76c3a22889ee83ab27c5eeb45100560c049", size = 97204, upload-time = "2026-03-25T20:21:18.079Z" }, + { url = "https://files.pythonhosted.org/packages/42/59/71461df1a885647e10b6bb7802d0b8e66480c61f3f43079e0dcd315b3954/tomli-2.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:5ee18d9ebdb417e384b58fe414e8d6af9f4e7a0ae761519fb50f721de398dd4e", size = 108084, upload-time = "2026-03-25T20:21:18.978Z" }, + { url = "https://files.pythonhosted.org/packages/b8/83/dceca96142499c069475b790e7913b1044c1a4337e700751f48ed723f883/tomli-2.4.1-cp311-cp311-win_arm64.whl", hash = "sha256:c2541745709bad0264b7d4705ad453b76ccd191e64aa6f0fc66b69a293a45ece", size = 95285, upload-time = "2026-03-25T20:21:20.309Z" }, + { url = "https://files.pythonhosted.org/packages/c1/ba/42f134a3fe2b370f555f44b1d72feebb94debcab01676bf918d0cb70e9aa/tomli-2.4.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c742f741d58a28940ce01d58f0ab2ea3ced8b12402f162f4d534dfe18ba1cd6a", size = 155924, upload-time = "2026-03-25T20:21:21.626Z" }, + { url = "https://files.pythonhosted.org/packages/dc/c7/62d7a17c26487ade21c5422b646110f2162f1fcc95980ef7f63e73c68f14/tomli-2.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7f86fd587c4ed9dd76f318225e7d9b29cfc5a9d43de44e5754db8d1128487085", size = 150018, upload-time = "2026-03-25T20:21:23.002Z" }, + { url = "https://files.pythonhosted.org/packages/5c/05/79d13d7c15f13bdef410bdd49a6485b1c37d28968314eabee452c22a7fda/tomli-2.4.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ff18e6a727ee0ab0388507b89d1bc6a22b138d1e2fa56d1ad494586d61d2eae9", size = 244948, upload-time = "2026-03-25T20:21:24.04Z" }, + { url = "https://files.pythonhosted.org/packages/10/90/d62ce007a1c80d0b2c93e02cab211224756240884751b94ca72df8a875ca/tomli-2.4.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:136443dbd7e1dee43c68ac2694fde36b2849865fa258d39bf822c10e8068eac5", size = 253341, upload-time = "2026-03-25T20:21:25.177Z" }, + { url = "https://files.pythonhosted.org/packages/1a/7e/caf6496d60152ad4ed09282c1885cca4eea150bfd007da84aea07bcc0a3e/tomli-2.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5e262d41726bc187e69af7825504c933b6794dc3fbd5945e41a79bb14c31f585", size = 248159, upload-time = "2026-03-25T20:21:26.364Z" }, + { url = "https://files.pythonhosted.org/packages/99/e7/c6f69c3120de34bbd882c6fba7975f3d7a746e9218e56ab46a1bc4b42552/tomli-2.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5cb41aa38891e073ee49d55fbc7839cfdb2bc0e600add13874d048c94aadddd1", size = 253290, upload-time = "2026-03-25T20:21:27.46Z" }, + { url = "https://files.pythonhosted.org/packages/d6/2f/4a3c322f22c5c66c4b836ec58211641a4067364f5dcdd7b974b4c5da300c/tomli-2.4.1-cp312-cp312-win32.whl", hash = "sha256:da25dc3563bff5965356133435b757a795a17b17d01dbc0f42fb32447ddfd917", size = 98141, upload-time = "2026-03-25T20:21:28.492Z" }, + { url = "https://files.pythonhosted.org/packages/24/22/4daacd05391b92c55759d55eaee21e1dfaea86ce5c571f10083360adf534/tomli-2.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:52c8ef851d9a240f11a88c003eacb03c31fc1c9c4ec64a99a0f922b93874fda9", size = 108847, upload-time = "2026-03-25T20:21:29.386Z" }, + { url = "https://files.pythonhosted.org/packages/68/fd/70e768887666ddd9e9f5d85129e84910f2db2796f9096aa02b721a53098d/tomli-2.4.1-cp312-cp312-win_arm64.whl", hash = "sha256:f758f1b9299d059cc3f6546ae2af89670cb1c4d48ea29c3cacc4fe7de3058257", size = 95088, upload-time = "2026-03-25T20:21:30.677Z" }, + { url = "https://files.pythonhosted.org/packages/07/06/b823a7e818c756d9a7123ba2cda7d07bc2dd32835648d1a7b7b7a05d848d/tomli-2.4.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:36d2bd2ad5fb9eaddba5226aa02c8ec3fa4f192631e347b3ed28186d43be6b54", size = 155866, upload-time = "2026-03-25T20:21:31.65Z" }, + { url = "https://files.pythonhosted.org/packages/14/6f/12645cf7f08e1a20c7eb8c297c6f11d31c1b50f316a7e7e1e1de6e2e7b7e/tomli-2.4.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:eb0dc4e38e6a1fd579e5d50369aa2e10acfc9cace504579b2faabb478e76941a", size = 149887, upload-time = "2026-03-25T20:21:33.028Z" }, + { url = "https://files.pythonhosted.org/packages/5c/e0/90637574e5e7212c09099c67ad349b04ec4d6020324539297b634a0192b0/tomli-2.4.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c7f2c7f2b9ca6bdeef8f0fa897f8e05085923eb091721675170254cbc5b02897", size = 243704, upload-time = "2026-03-25T20:21:34.51Z" }, + { url = "https://files.pythonhosted.org/packages/10/8f/d3ddb16c5a4befdf31a23307f72828686ab2096f068eaf56631e136c1fdd/tomli-2.4.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f3c6818a1a86dd6dca7ddcaaf76947d5ba31aecc28cb1b67009a5877c9a64f3f", size = 251628, upload-time = "2026-03-25T20:21:36.012Z" }, + { url = "https://files.pythonhosted.org/packages/e3/f1/dbeeb9116715abee2485bf0a12d07a8f31af94d71608c171c45f64c0469d/tomli-2.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d312ef37c91508b0ab2cee7da26ec0b3ed2f03ce12bd87a588d771ae15dcf82d", size = 247180, upload-time = "2026-03-25T20:21:37.136Z" }, + { url = "https://files.pythonhosted.org/packages/d3/74/16336ffd19ed4da28a70959f92f506233bd7cfc2332b20bdb01591e8b1d1/tomli-2.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:51529d40e3ca50046d7606fa99ce3956a617f9b36380da3b7f0dd3dd28e68cb5", size = 251674, upload-time = "2026-03-25T20:21:38.298Z" }, + { url = "https://files.pythonhosted.org/packages/16/f9/229fa3434c590ddf6c0aa9af64d3af4b752540686cace29e6281e3458469/tomli-2.4.1-cp313-cp313-win32.whl", hash = "sha256:2190f2e9dd7508d2a90ded5ed369255980a1bcdd58e52f7fe24b8162bf9fedbd", size = 97976, upload-time = "2026-03-25T20:21:39.316Z" }, + { url = "https://files.pythonhosted.org/packages/6a/1e/71dfd96bcc1c775420cb8befe7a9d35f2e5b1309798f009dca17b7708c1e/tomli-2.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:8d65a2fbf9d2f8352685bc1364177ee3923d6baf5e7f43ea4959d7d8bc326a36", size = 108755, upload-time = "2026-03-25T20:21:40.248Z" }, + { url = "https://files.pythonhosted.org/packages/83/7a/d34f422a021d62420b78f5c538e5b102f62bea616d1d75a13f0a88acb04a/tomli-2.4.1-cp313-cp313-win_arm64.whl", hash = "sha256:4b605484e43cdc43f0954ddae319fb75f04cc10dd80d830540060ee7cd0243cd", size = 95265, upload-time = "2026-03-25T20:21:41.219Z" }, + { url = "https://files.pythonhosted.org/packages/3c/fb/9a5c8d27dbab540869f7c1f8eb0abb3244189ce780ba9cd73f3770662072/tomli-2.4.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:fd0409a3653af6c147209d267a0e4243f0ae46b011aa978b1080359fddc9b6cf", size = 155726, upload-time = "2026-03-25T20:21:42.23Z" }, + { url = "https://files.pythonhosted.org/packages/62/05/d2f816630cc771ad836af54f5001f47a6f611d2d39535364f148b6a92d6b/tomli-2.4.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:a120733b01c45e9a0c34aeef92bf0cf1d56cfe81ed9d47d562f9ed591a9828ac", size = 149859, upload-time = "2026-03-25T20:21:43.386Z" }, + { url = "https://files.pythonhosted.org/packages/ce/48/66341bdb858ad9bd0ceab5a86f90eddab127cf8b046418009f2125630ecb/tomli-2.4.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:559db847dc486944896521f68d8190be1c9e719fced785720d2216fe7022b662", size = 244713, upload-time = "2026-03-25T20:21:44.474Z" }, + { url = "https://files.pythonhosted.org/packages/df/6d/c5fad00d82b3c7a3ab6189bd4b10e60466f22cfe8a08a9394185c8a8111c/tomli-2.4.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:01f520d4f53ef97964a240a035ec2a869fe1a37dde002b57ebc4417a27ccd853", size = 252084, upload-time = "2026-03-25T20:21:45.62Z" }, + { url = "https://files.pythonhosted.org/packages/00/71/3a69e86f3eafe8c7a59d008d245888051005bd657760e96d5fbfb0b740c2/tomli-2.4.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7f94b27a62cfad8496c8d2513e1a222dd446f095fca8987fceef261225538a15", size = 247973, upload-time = "2026-03-25T20:21:46.937Z" }, + { url = "https://files.pythonhosted.org/packages/67/50/361e986652847fec4bd5e4a0208752fbe64689c603c7ae5ea7cb16b1c0ca/tomli-2.4.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:ede3e6487c5ef5d28634ba3f31f989030ad6af71edfb0055cbbd14189ff240ba", size = 256223, upload-time = "2026-03-25T20:21:48.467Z" }, + { url = "https://files.pythonhosted.org/packages/8c/9a/b4173689a9203472e5467217e0154b00e260621caa227b6fa01feab16998/tomli-2.4.1-cp314-cp314-win32.whl", hash = "sha256:3d48a93ee1c9b79c04bb38772ee1b64dcf18ff43085896ea460ca8dec96f35f6", size = 98973, upload-time = "2026-03-25T20:21:49.526Z" }, + { url = "https://files.pythonhosted.org/packages/14/58/640ac93bf230cd27d002462c9af0d837779f8773bc03dee06b5835208214/tomli-2.4.1-cp314-cp314-win_amd64.whl", hash = "sha256:88dceee75c2c63af144e456745e10101eb67361050196b0b6af5d717254dddf7", size = 109082, upload-time = "2026-03-25T20:21:50.506Z" }, + { url = "https://files.pythonhosted.org/packages/d5/2f/702d5e05b227401c1068f0d386d79a589bb12bf64c3d2c72ce0631e3bc49/tomli-2.4.1-cp314-cp314-win_arm64.whl", hash = "sha256:b8c198f8c1805dc42708689ed6864951fd2494f924149d3e4bce7710f8eb5232", size = 96490, upload-time = "2026-03-25T20:21:51.474Z" }, + { url = "https://files.pythonhosted.org/packages/45/4b/b877b05c8ba62927d9865dd980e34a755de541eb65fffba52b4cc495d4d2/tomli-2.4.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:d4d8fe59808a54658fcc0160ecfb1b30f9089906c50b23bcb4c69eddc19ec2b4", size = 164263, upload-time = "2026-03-25T20:21:52.543Z" }, + { url = "https://files.pythonhosted.org/packages/24/79/6ab420d37a270b89f7195dec5448f79400d9e9c1826df982f3f8e97b24fd/tomli-2.4.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7008df2e7655c495dd12d2a4ad038ff878d4ca4b81fccaf82b714e07eae4402c", size = 160736, upload-time = "2026-03-25T20:21:53.674Z" }, + { url = "https://files.pythonhosted.org/packages/02/e0/3630057d8eb170310785723ed5adcdfb7d50cb7e6455f85ba8a3deed642b/tomli-2.4.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1d8591993e228b0c930c4bb0db464bdad97b3289fb981255d6c9a41aedc84b2d", size = 270717, upload-time = "2026-03-25T20:21:55.129Z" }, + { url = "https://files.pythonhosted.org/packages/7a/b4/1613716072e544d1a7891f548d8f9ec6ce2faf42ca65acae01d76ea06bb0/tomli-2.4.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:734e20b57ba95624ecf1841e72b53f6e186355e216e5412de414e3c51e5e3c41", size = 278461, upload-time = "2026-03-25T20:21:56.228Z" }, + { url = "https://files.pythonhosted.org/packages/05/38/30f541baf6a3f6df77b3df16b01ba319221389e2da59427e221ef417ac0c/tomli-2.4.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8a650c2dbafa08d42e51ba0b62740dae4ecb9338eefa093aa5c78ceb546fcd5c", size = 274855, upload-time = "2026-03-25T20:21:57.653Z" }, + { url = "https://files.pythonhosted.org/packages/77/a3/ec9dd4fd2c38e98de34223b995a3b34813e6bdadf86c75314c928350ed14/tomli-2.4.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:504aa796fe0569bb43171066009ead363de03675276d2d121ac1a4572397870f", size = 283144, upload-time = "2026-03-25T20:21:59.089Z" }, + { url = "https://files.pythonhosted.org/packages/ef/be/605a6261cac79fba2ec0c9827e986e00323a1945700969b8ee0b30d85453/tomli-2.4.1-cp314-cp314t-win32.whl", hash = "sha256:b1d22e6e9387bf4739fbe23bfa80e93f6b0373a7f1b96c6227c32bef95a4d7a8", size = 108683, upload-time = "2026-03-25T20:22:00.214Z" }, + { url = "https://files.pythonhosted.org/packages/12/64/da524626d3b9cc40c168a13da8335fe1c51be12c0a63685cc6db7308daae/tomli-2.4.1-cp314-cp314t-win_amd64.whl", hash = "sha256:2c1c351919aca02858f740c6d33adea0c5deea37f9ecca1cc1ef9e884a619d26", size = 121196, upload-time = "2026-03-25T20:22:01.169Z" }, + { url = "https://files.pythonhosted.org/packages/5a/cd/e80b62269fc78fc36c9af5a6b89c835baa8af28ff5ad28c7028d60860320/tomli-2.4.1-cp314-cp314t-win_arm64.whl", hash = "sha256:eab21f45c7f66c13f2a9e0e1535309cee140182a9cdae1e041d02e47291e8396", size = 100393, upload-time = "2026-03-25T20:22:02.137Z" }, + { url = "https://files.pythonhosted.org/packages/7b/61/cceae43728b7de99d9b847560c262873a1f6c98202171fd5ed62640b494b/tomli-2.4.1-py3-none-any.whl", hash = "sha256:0d85819802132122da43cb86656f8d1f8c6587d54ae7dcaf30e90533028b49fe", size = 14583, upload-time = "2026-03-25T20:22:03.012Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f6/cc/6253133b5bb138fc3306cebfbda2c520f545d36b5be2c7255cc528bb45d6/typing_extensions-4.16.0.tar.gz", hash = "sha256:dc983d19a509c94dba722ee6abd33940f7c05a89e243c47e907eb4db6f1a43e5", size = 113555, upload-time = "2026-07-02T08:40:05.92Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/49/d3/b8441a820a491ddfc024b0b0cf0393375b75ea13866d9c66727e54c2fc80/typing_extensions-4.16.0-py3-none-any.whl", hash = "sha256:481caa481374e813c1b176ada14e97f1f67a4539ce9cfeb3f350d78d6370c2e8", size = 45571, upload-time = "2026-07-02T08:40:04.659Z" }, +] + +[[package]] +name = "urllib3" +version = "2.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/53/0c/06f8b233b8fd13b9e5ee11424ef85419ba0d8ba0b3138bf360be2ff56953/urllib3-2.7.0.tar.gz", hash = "sha256:231e0ec3b63ceb14667c67be60f2f2c40a518cb38b03af60abc813da26505f4c", size = 433602, upload-time = "2026-05-07T16:13:18.596Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl", hash = "sha256:9fb4c81ebbb1ce9531cce37674bbc6f1360472bc18ca9a553ede278ef7276897", size = 131087, upload-time = "2026-05-07T16:13:17.151Z" }, +] + +[[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, upload-time = "2024-11-01T14:07:13.037Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0c/56/90994d789c61df619bfc5ce2ecdabd5eeff564e1eb47512bd01b5e019569/watchdog-6.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d1cdb490583ebd691c012b3d6dae011000fe42edb7a82ece80965b42abd61f26", size = 96390, upload-time = "2024-11-01T14:06:24.793Z" }, + { url = "https://files.pythonhosted.org/packages/55/46/9a67ee697342ddf3c6daa97e3a587a56d6c4052f881ed926a849fcf7371c/watchdog-6.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bc64ab3bdb6a04d69d4023b29422170b74681784ffb9463ed4870cf2f3e66112", size = 88389, upload-time = "2024-11-01T14:06:27.112Z" }, + { url = "https://files.pythonhosted.org/packages/44/65/91b0985747c52064d8701e1075eb96f8c40a79df889e59a399453adfb882/watchdog-6.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c897ac1b55c5a1461e16dae288d22bb2e412ba9807df8397a635d88f671d36c3", size = 89020, upload-time = "2024-11-01T14:06:29.876Z" }, + { 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, upload-time = "2024-11-01T14:06:31.756Z" }, + { 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, upload-time = "2024-11-01T14:06:32.99Z" }, + { 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, upload-time = "2024-11-01T14:06:34.963Z" }, + { 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, upload-time = "2024-11-01T14:06:37.745Z" }, + { 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, upload-time = "2024-11-01T14:06:39.748Z" }, + { 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, upload-time = "2024-11-01T14:06:41.009Z" }, + { 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, upload-time = "2024-11-01T14:06:42.952Z" }, + { 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, upload-time = "2024-11-01T14:06:45.084Z" }, + { 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, upload-time = "2024-11-01T14:06:47.324Z" }, + { url = "https://files.pythonhosted.org/packages/30/ad/d17b5d42e28a8b91f8ed01cb949da092827afb9995d4559fd448d0472763/watchdog-6.0.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:c7ac31a19f4545dd92fc25d200694098f42c9a8e391bc00bdd362c5736dbf881", size = 87902, upload-time = "2024-11-01T14:06:53.119Z" }, + { url = "https://files.pythonhosted.org/packages/5c/ca/c3649991d140ff6ab67bfc85ab42b165ead119c9e12211e08089d763ece5/watchdog-6.0.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:9513f27a1a582d9808cf21a07dae516f0fab1cf2d7683a742c498b93eedabb11", size = 88380, upload-time = "2024-11-01T14:06:55.19Z" }, + { url = "https://files.pythonhosted.org/packages/a9/c7/ca4bf3e518cb57a686b2feb4f55a1892fd9a3dd13f470fca14e00f80ea36/watchdog-6.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:7607498efa04a3542ae3e05e64da8202e58159aa1fa4acddf7678d34a35d4f13", size = 79079, upload-time = "2024-11-01T14:06:59.472Z" }, + { url = "https://files.pythonhosted.org/packages/5c/51/d46dc9332f9a647593c947b4b88e2381c8dfc0942d15b8edc0310fa4abb1/watchdog-6.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:9041567ee8953024c83343288ccc458fd0a2d811d6a0fd68c4c22609e3490379", size = 79078, upload-time = "2024-11-01T14:07:01.431Z" }, + { url = "https://files.pythonhosted.org/packages/d4/57/04edbf5e169cd318d5f07b4766fee38e825d64b6913ca157ca32d1a42267/watchdog-6.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:82dc3e3143c7e38ec49d61af98d6558288c415eac98486a5c581726e0737c00e", size = 79076, upload-time = "2024-11-01T14:07:02.568Z" }, + { url = "https://files.pythonhosted.org/packages/ab/cc/da8422b300e13cb187d2203f20b9253e91058aaf7db65b74142013478e66/watchdog-6.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:212ac9b8bf1161dc91bd09c048048a95ca3a4c4f5e5d4a7d1b1a7d5752a7f96f", size = 79077, upload-time = "2024-11-01T14:07:03.893Z" }, + { url = "https://files.pythonhosted.org/packages/2c/3b/b8964e04ae1a025c44ba8e4291f86e97fac443bca31de8bd98d3263d2fcf/watchdog-6.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:e3df4cbb9a450c6d49318f6d14f4bbc80d763fa587ba46ec86f99f9e6876bb26", size = 79078, upload-time = "2024-11-01T14:07:05.189Z" }, + { url = "https://files.pythonhosted.org/packages/62/ae/a696eb424bedff7407801c257d4b1afda455fe40821a2be430e173660e81/watchdog-6.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:2cce7cfc2008eb51feb6aab51251fd79b85d9894e98ba847408f662b3395ca3c", size = 79077, upload-time = "2024-11-01T14:07:06.376Z" }, + { url = "https://files.pythonhosted.org/packages/b5/e8/dbf020b4d98251a9860752a094d09a65e1b436ad181faf929983f697048f/watchdog-6.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:20ffe5b202af80ab4266dcd3e91aae72bf2da48c0d33bdb15c66658e685e94e2", size = 79078, upload-time = "2024-11-01T14:07:07.547Z" }, + { url = "https://files.pythonhosted.org/packages/07/f6/d0e5b343768e8bcb4cda79f0f2f55051bf26177ecd5651f84c07567461cf/watchdog-6.0.0-py3-none-win32.whl", hash = "sha256:07df1fdd701c5d4c8e55ef6cf55b8f0120fe1aef7ef39a1c6fc6bc2e606d517a", size = 79065, upload-time = "2024-11-01T14:07:09.525Z" }, + { url = "https://files.pythonhosted.org/packages/db/d9/c495884c6e548fce18a8f40568ff120bc3a4b7b99813081c8ac0c936fa64/watchdog-6.0.0-py3-none-win_amd64.whl", hash = "sha256:cbafb470cf848d93b5d013e2ecb245d4aa1c8fd0504e863ccefa32445359d680", size = 79070, upload-time = "2024-11-01T14:07:10.686Z" }, + { url = "https://files.pythonhosted.org/packages/33/e8/e40370e6d74ddba47f002a32919d91310d6074130fe4e17dabcafc15cbf1/watchdog-6.0.0-py3-none-win_ia64.whl", hash = "sha256:a1914259fa9e1454315171103c6a30961236f508b9b623eae470268bbcc6a22f", size = 79067, upload-time = "2024-11-01T14:07:11.845Z" }, +] From 798bd9fde7a8198b5ac9c5aaa9e5362a9d9162b5 Mon Sep 17 00:00:00 2001 From: Matthew Lee <{ID} {username}@users.noreply.github.com> Date: Tue, 11 Aug 2026 21:40:18 +1200 Subject: [PATCH 02/14] Fix Maya CI disk exhaustion, add Maya 2027, replace semantic-release with manual versioning - Manually docker pull/run Maya tests (after freeing disk) instead of a job-level container, fixing pulls failing on larger Maya images - Add Maya 2027 support; slim default matrix to 2024 only - Bump setup-uv, cache, and checkout action pins - Replace python-semantic-release (silently no-op'd on non-main branches) with a manual `version` input that bumps, tags, and creates a GitHub release - Pin mkdocs<2; doc/comment cleanup --- .github/workflows/ci-release.yml | 10 ++++- .github/workflows/initial-setup.yml | 2 +- .../reusable-build-and-deploy-docs.yml | 4 +- .github/workflows/reusable-maya-tests.yml | 44 +++++++++++------- .github/workflows/reusable-release.yml | 45 +++++++++++++++++++ .../workflows/reusable-semantic-release.yml | 22 --------- .../workflows/reusable-static-analysis.yml | 4 +- AGENTS.md | 23 +++++----- CONTRIBUTING.md | 36 +++++++-------- README.md | 21 ++------- _AGENTS.md | 36 ++++++--------- pyproject.toml | 7 +-- uv.lock | 2 + 13 files changed, 135 insertions(+), 121 deletions(-) create mode 100644 .github/workflows/reusable-release.yml delete mode 100644 .github/workflows/reusable-semantic-release.yml diff --git a/.github/workflows/ci-release.yml b/.github/workflows/ci-release.yml index 5917a9f..e126269 100644 --- a/.github/workflows/ci-release.yml +++ b/.github/workflows/ci-release.yml @@ -2,6 +2,11 @@ name: Release on: workflow_dispatch: + inputs: + version: + description: "Version to release (e.g. 1.2.3, no leading v)" + required: true + type: string jobs: @@ -16,10 +21,11 @@ jobs: do_release: if: github.repository != 'matthewlee-dev/MayaPythonProjectTemplate' needs: [tests] - uses: ./.github/workflows/reusable-semantic-release.yml + uses: ./.github/workflows/reusable-release.yml + with: + version: ${{ inputs.version }} permissions: contents: write - id-token: write docs: if: github.repository != 'matthewlee-dev/MayaPythonProjectTemplate' diff --git a/.github/workflows/initial-setup.yml b/.github/workflows/initial-setup.yml index 7089414..8ba5e4d 100644 --- a/.github/workflows/initial-setup.yml +++ b/.github/workflows/initial-setup.yml @@ -49,7 +49,7 @@ jobs: python-version: '3.x' - name: Install uv - uses: astral-sh/setup-uv@v5 + uses: astral-sh/setup-uv@v7 - name: Run initial setup script run: | diff --git a/.github/workflows/reusable-build-and-deploy-docs.yml b/.github/workflows/reusable-build-and-deploy-docs.yml index 21ad94f..568e5b4 100644 --- a/.github/workflows/reusable-build-and-deploy-docs.yml +++ b/.github/workflows/reusable-build-and-deploy-docs.yml @@ -16,11 +16,11 @@ jobs: uses: actions/checkout@v5 - name: Install uv - uses: astral-sh/setup-uv@v5 + uses: astral-sh/setup-uv@v7 with: python-version: '3.13' - - uses: actions/cache@v4 + - uses: actions/cache@v6 with: key: ${{ github.ref }} path: .cache diff --git a/.github/workflows/reusable-maya-tests.yml b/.github/workflows/reusable-maya-tests.yml index dd8df60..cbbb9c3 100644 --- a/.github/workflows/reusable-maya-tests.yml +++ b/.github/workflows/reusable-maya-tests.yml @@ -13,7 +13,7 @@ jobs: - uses: actions/checkout@v5 - name: Install uv - uses: astral-sh/setup-uv@v5 + uses: astral-sh/setup-uv@v7 with: python-version: '3.13' @@ -57,26 +57,38 @@ jobs: fail-fast: false matrix: - # add or remove versions as needed, a job per version will be created - # supported tags here: https://github.com/mottosso/docker-maya/ - maya_version: ["2024", "2025", "2026"] - - container: mottosso/maya:${{ matrix.maya_version }} # ty mottosso! + # add/remove versions to match what you target; tags: https://github.com/mottosso/docker-maya/ + maya_version: ["2024"] steps: - name: Checkout code uses: actions/checkout@v5 - - name: Install uv - uses: astral-sh/setup-uv@v5 + # No job-level `container:`: that pulls before any step can free disk space first, + # and large Maya images can exceed the runner's free disk mid-pull. + - name: Free disk space + run: | + sudo rm -rf /usr/local/lib/android /usr/share/dotnet /opt/ghc \ + /usr/local/share/powershell /usr/share/swift /opt/hostedtoolcache/CodeQL + df -h / - - name: Install test dependencies into mayapy - run: uv pip install --python "$(command -v mayapy)" --group test . + - name: Pull Maya image + run: docker pull mottosso/maya:${{ matrix.maya_version }} # ty mottosso! - - name: Set Maya environment variables + - name: Install test dependencies and run tests in Maya container run: | - echo "XDG_RUNTIME_DIR=/var/tmp/runtime-root" >> $GITHUB_ENV - echo "MAYA_DISABLE_ADP=1" >> $GITHUB_ENV - - - name: Run tests - run: mayapy -m pytest tests + docker run --rm \ + -e XDG_RUNTIME_DIR=/var/tmp/runtime-root \ + -e MAYA_DISABLE_ADP=1 \ + -v "${{ github.workspace }}:/workspace" \ + -w /workspace \ + mottosso/maya:${{ matrix.maya_version }} \ + bash -c ' + set -e + if command -v curl >/dev/null; then curl -LsSf https://astral.sh/uv/install.sh | sh + else wget -qO- https://astral.sh/uv/install.sh | sh + fi + export PATH="$HOME/.local/bin:$PATH" + uv pip install --python "$(command -v mayapy)" --group test . + mayapy -m pytest tests + ' diff --git a/.github/workflows/reusable-release.yml b/.github/workflows/reusable-release.yml new file mode 100644 index 0000000..d7b9951 --- /dev/null +++ b/.github/workflows/reusable-release.yml @@ -0,0 +1,45 @@ +name: release + +on: + workflow_call: + inputs: + version: + description: "Version to release (e.g. 1.2.3, no leading v)" + required: true + type: string + +jobs: + release: + runs-on: ubuntu-latest + concurrency: release + permissions: + contents: write + + steps: + - uses: actions/checkout@v5 + with: + fetch-depth: 0 + + - name: Set version in pyproject.toml + run: sed -i "s/^version = \".*\"/version = \"${{ inputs.version }}\"/" pyproject.toml + + - name: Commit version bump + run: | + git config user.name 'github-actions[bot]' + git config user.email 'github-actions[bot]@users.noreply.github.com' + git add pyproject.toml + git commit -m "chore: release v${{ inputs.version }}" + git push + + - name: Tag release + run: | + git tag "v${{ inputs.version }}" + git push origin "v${{ inputs.version }}" + + - name: Create GitHub release + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + gh release create "v${{ inputs.version }}" \ + --title "v${{ inputs.version }}" \ + --generate-notes diff --git a/.github/workflows/reusable-semantic-release.yml b/.github/workflows/reusable-semantic-release.yml deleted file mode 100644 index eccb799..0000000 --- a/.github/workflows/reusable-semantic-release.yml +++ /dev/null @@ -1,22 +0,0 @@ -name: semantic release - -on: - workflow_call: - -jobs: - release: - runs-on: ubuntu-latest - concurrency: release - permissions: - id-token: write - contents: write - - steps: - - uses: actions/checkout@v5 - with: - fetch-depth: 0 - - - name: Python Semantic Release - uses: python-semantic-release/python-semantic-release@v10.6.1 - with: - github_token: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file diff --git a/.github/workflows/reusable-static-analysis.yml b/.github/workflows/reusable-static-analysis.yml index 9496780..be465de 100644 --- a/.github/workflows/reusable-static-analysis.yml +++ b/.github/workflows/reusable-static-analysis.yml @@ -13,13 +13,13 @@ jobs: fail-fast: false matrix: - python-version: ["3.10", "3.11"] # maya 2024/2025, maya 2026 + python-version: ["3.10"] # maya 2024 steps: - uses: actions/checkout@v5 - name: Install uv - uses: astral-sh/setup-uv@v5 + uses: astral-sh/setup-uv@v7 with: enable-cache: true python-version: ${{ matrix.python-version }} diff --git a/AGENTS.md b/AGENTS.md index 5330389..38b83bd 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,10 +1,10 @@ -# AGENTS.md — MayaPythonProjectTemplate +# AGENTS.md: MayaPythonProjectTemplate This repository is a **GitHub template** for Autodesk Maya Python tools. If you are an agent helping a user start a new Maya tool, create their project **from this template** -instead of scaffolding from scratch — they get CI that runs tests inside real Maya -(Docker), Ruff + mypy static analysis, mkdocs docs deployment, and semantic-release, -all preconfigured. +instead of scaffolding from scratch. They get CI that runs tests inside real Maya +(Docker), Ruff + mypy static analysis, mkdocs docs deployment, and a manually triggered +release workflow, all preconfigured. ## Create a new project from this template (non-interactive) @@ -29,7 +29,7 @@ gh run watch --repo / \ gh repo clone / ``` -Then work inside the new repo — it contains its own `AGENTS.md` with day-to-day +Then work inside the new repo; it contains its own `AGENTS.md` with day-to-day commands (generated from `_AGENTS.md` in this template). ## Working on the template itself @@ -39,15 +39,16 @@ commands (generated from `_AGENTS.md` in this template). - Lint/format/typecheck: `uv run ruff check src`, `uv run ruff format --check src`, `uv run mypy src`. - Maya tests run under `mayapy` (Maya's bundled interpreter), not a uv-managed Python. - CI installs into it with `uv pip install --python "$(command -v mayapy)" --group test .` - inside `mottosso/maya:` containers (`.github/workflows/reusable-maya-tests.yml`) — - direct install is fine there because the container is ephemeral. For local runs - against a real Maya install, use the `PYTHONPATH` + disposable-venv pattern documented - in [CONTRIBUTING.md](CONTRIBUTING.md#tests) instead of installing into Maya. + CI frees runner disk space, `docker pull`s `mottosso/maya:`, then runs a + single `docker run` that installs `uv` and the test group into `mayapy` and runs + pytest (`.github/workflows/reusable-maya-tests.yml`); direct install is fine there + because the container is ephemeral. For local runs against a real Maya install, use + the `PYTHONPATH` + disposable-venv pattern documented in + [CONTRIBUTING.md](CONTRIBUTING.md#tests) instead of installing into Maya. - `pyproject.toml` deliberately contains the **real** values (`name = "mayapythonprojecttemplate"`, real description, real wheel path) rather than `{{...}}` placeholders, so the file stays valid TOML and uv works on a clone of the - template. `initial_setup.py` string-replaces those literals during setup — if you + template. `initial_setup.py` string-replaces those literals during setup; if you change them in `pyproject.toml`, update the matching literals in `initial_setup.py`. - Other templated files (`_README.md`, `_AGENTS.md`, `CONTRIBUTING.md`, `mkdocs.yml`, `tests/maya/test_example.py`) use `{{PROJECT_OWNER}}` / `{{PROJECT_NAME}}` / diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 0b77529..ee25d64 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -25,9 +25,6 @@ Table of Contents
  1. Contributing
  2. -
  3. Project Dependencies
  4. Tests
  5. Linting and Type Hinting
  6. @@ -46,19 +43,6 @@ 4. Push to the Branch (`git push origin feature_name`). 5. Open a Pull Request. -### Commit Messages: -This project (optionally) uses [Python Semantic Release](https://python-semantic-release.readthedocs.io/en/latest/). To use this feature, please follow the [commit message convention](https://github.com/angular/angular.js/blob/master/DEVELOPERS.md#commits) to ensure changes are correctly versioned in any future releases. - -Cheat sheet: - -- Patch release, backwards-compatible bug `fix` _in git commit message title_. - - `git commit -a -m "fix: a great fix"` -- Minor release, backwards-compatible `feat` _in git commit message title_. - - `git commit -a -m "feat: a wonderful new feature"` -- Major release, incompatible API change `BREAKING CHANGE` _in git commit message footer (use `fix` or `feat` for message title)_. - - `git commit -a -m "feat: total refactor" -m "BREAKING CHANGE: breaks api"` - -

    (back to top)

    @@ -76,7 +60,7 @@ Cheat sheet: ```sh uv sync --all-groups ``` -4. To run tests against a local Maya, don't install into Maya's own environment — +4. To run tests against a local Maya, don't install into Maya's own environment: keep test dependencies in a disposable venv and expose them to `mayapy` via `PYTHONPATH` (see [Tests](#tests) below). CI installs directly into `mayapy` instead, which is fine there because the Docker container is ephemeral. @@ -88,19 +72,25 @@ Cheat sheet: Tests are written with [Pytest](https://docs.pytest.org/) and should adhere to the ["Arrange, Act, Assert" pattern](https://docs.pytest.org/en/stable/explanation/anatomy.html). -Tests must run under `mayapy` (Maya's bundled interpreter) — a plain Python can't +Tests must run under `mayapy` (Maya's bundled interpreter): a plain Python can't import `maya`. To run them against a local Maya install without touching Maya's own site-packages, put the test dependencies in a disposable venv and point `mayapy` at it: +> This assumes `mayapy` is on your `PATH` (e.g. via a shell alias to your Maya install's +> `mayapy` binary, such as `/Applications/Autodesk/maya2026/Maya.app/Contents/bin/mayapy` +> on macOS). Otherwise, use the full path to `mayapy` in place of the bare command below. + - ```sh + # --managed-python forces a real standalone interpreter; without it, uv can pick up + # Maya's own bundled Python from PATH, which can't run outside Maya's process. # match the venv's Python to your Maya version (2024 = 3.10, 2025/2026 = 3.11) - uv venv --python 3.11 .venv-maya + uv venv --managed-python --python 3.11 .venv-maya uv pip install --python .venv-maya --group test . PYTHONPATH=.venv-maya/lib/python3.11/site-packages mayapy -m pytest tests ``` Maya's own modules still come from `mayapy`; only the test dependencies come from the -venv, so your Maya installation stays untouched. Keep this venv minimal — `PYTHONPATH` +venv, so your Maya installation stays untouched. Keep this venv minimal: `PYTHONPATH` entries take precedence over Maya's site-packages, so extra packages there can shadow ones Maya ships. @@ -132,6 +122,10 @@ Run [mypy](https://mypy.readthedocs.io/en/stable/) checks locally with: uv run mypy src/ ``` - `[tool.mypy]` in [pyproject.toml](pyproject.toml) ignores Maya import errors. Append to this section as needed. + - [maya-stubs](https://pypi.org/project/maya-stubs/) only types each `cmds` flag's + long-form name (e.g. `name`, `empty`, `parent`), not Maya's short aliases (`n`, + `em`, `p`, ...). Use long-form flags so mypy can check them; short flags raise a + spurious `call-arg` error even though they work fine at runtime.

    (back to top)

    @@ -155,7 +149,7 @@ Continuous integration is set up with [GitHub Actions][github-actions-url], work 1. [ci-main.yml](.github/workflows/ci-main.yml): This workflow is intended to be a fast check to ensure the code is in a good state, and code standards are met. It runs automatically on every push and pull request to main or can be triggered from the `Run workflow` button on the [actions menu](https://github.com/{{PROJECT_OWNER}}/{{PROJECT_NAME}}/actions/workflows/ci-main.yml). It runs tests (if they exist), and performs linting, formatting, and type hinting checks.
    drawing
    -2. [ci-release.yml](.github/workflows/ci-release.yml): This workflow will do all the above, create a release version of the repo and deploy the documentation to GitHub pages. It can be run from the `Run workflow` button on the [actions menu](https://github.com/{{PROJECT_OWNER}}/{{PROJECT_NAME}}/actions/workflows/ci-release.yml). +2. [ci-release.yml](.github/workflows/ci-release.yml): This workflow will do all the above, then bump `pyproject.toml` to a version you specify, tag it, create a GitHub release, and deploy the documentation to GitHub pages. Run it from the `Run workflow` button on the [actions menu](https://github.com/{{PROJECT_OWNER}}/{{PROJECT_NAME}}/actions/workflows/ci-release.yml) (enter the version, e.g. `1.2.3`, when prompted), or via CLI: `gh workflow run ci-release.yml -f version=1.2.3`.
    drawing
    diff --git a/README.md b/README.md index 66b1458..e31d781 100644 --- a/README.md +++ b/README.md @@ -38,26 +38,13 @@ ### CLI / agent quickstart -No browser needed — this works for humans and coding agents (Claude Code, Codex, Cursor, etc.): +No browser needed: ```sh -# 1. Create a new repo from this template (use lowercase_with_underscores for the name) -gh repo create my_cool_tool \ - --template matthewlee-dev/MayaPythonProjectTemplate \ - --public \ - --description "My cool Maya tool" - -# 2. Wait for the automated initial-setup workflow to rewrite the template and push -sleep 20 # give the workflow a moment to appear -gh run watch --repo /my_cool_tool \ - $(gh run list --repo /my_cool_tool --limit 1 --json databaseId -q '.[0].databaseId') \ - --exit-status - -# 3. Clone and start coding -gh repo clone /my_cool_tool +gh repo create my_cool_tool --template matthewlee-dev/MayaPythonProjectTemplate --public ``` -Generated projects include an `AGENTS.md` describing the layout, uv commands, and the mayapy test workflow, so coding agents are productive in them immediately. See [AGENTS.md](AGENTS.md) in this repo for agent-facing template instructions. +Wait for the `initial repository setup` workflow to finish before cloning. See [AGENTS.md](AGENTS.md) for the full non-interactive flow; coding agents should read that file directly. ## What is included in this template? * Basic project structure. @@ -69,7 +56,7 @@ Generated projects include an `AGENTS.md` describing the layout, uv commands, an * `Note: You should hold a valid Maya license.` * [Enforce coding standards](.github/workflows/reusable-static-analysis.yml) with [ruff](https://github.com/astral-sh/ruff) and [mypy](https://mypy.readthedocs.io/en/stable/). * [Build and deploy documentation](.github/workflows/reusable-build-and-deploy-docs.yml) to GitHub pages with [mkdocs](https://www.mkdocs.org/). - * [Automated releases](.github/workflows/ci-release.yml) using Python Semantic Versioning (optional). + * [Manually triggered releases](.github/workflows/ci-release.yml): pick a version number and it tags, releases, and deploys docs (optional). diff --git a/_AGENTS.md b/_AGENTS.md index 35898d5..6262dc7 100644 --- a/_AGENTS.md +++ b/_AGENTS.md @@ -5,11 +5,11 @@ This is an Autodesk Maya Python tool, created from ## Layout -- `src//` — the tool's Python package (src layout). -- `tests/maya/` — pytest tests that run **inside Maya** via `mayapy` (Maya's bundled +- `src//`: the tool's Python package (src layout). +- `tests/maya/`: pytest tests that run **inside Maya** via `mayapy` (Maya's bundled Python). `tests/maya/conftest.py` boots `maya.standalone` once per session. -- `pyproject.toml` — single source of truth: metadata, dependency groups - (`test`, `dev`, `docs`), and all tool config (ruff, mypy, semantic-release, hatchling). +- `pyproject.toml`: single source of truth for metadata, dependency groups + (`test`, `dev`, `docs`), and all tool config (ruff, mypy, hatchling). - Dependencies are managed with **uv**; `uv.lock` is committed. ## Commands @@ -18,26 +18,18 @@ This is an Autodesk Maya Python tool, created from - Lint: `uv run ruff check src` - Format: `uv run ruff format src` (CI enforces `ruff format --check`) - Typecheck: `uv run mypy src` -- Tests: must run under mayapy, not plain Python. Don't install into Maya's own - environment — stage test deps in a disposable venv and expose them via `PYTHONPATH`: - ```sh - # match the venv's Python to the local Maya version (2024 = 3.10, 2025/2026 = 3.11) - uv venv --python 3.11 .venv-maya - uv pip install --python .venv-maya --group test . - PYTHONPATH=.venv-maya/lib/python3.11/site-packages mayapy -m pytest tests - ``` - Keep that venv minimal (`PYTHONPATH` shadows Maya's site-packages). Without Maya - locally, rely on CI — it runs the suite in `mottosso/maya` Docker containers across - Maya versions, installing directly into the container's mayapy (fine there: the - container is ephemeral). +- Tests: must run under `mayapy`, not plain Python. Don't install directly into Maya's + own environment; use the `PYTHONPATH` + disposable-venv pattern in + [CONTRIBUTING.md](CONTRIBUTING.md#tests). Without Maya locally, rely on CI, which runs + the suite in `mottosso/maya` Docker containers. - Docs: `uv run mkdocs serve` (mkdocs-material + mkdocstrings, reads `src/` directly). ## Conventions -- `from maya import cmds` for Maya commands; mypy ignores missing imports for `maya.*` - and `maya-stubs` provides type stubs. -- Releases use python-semantic-release driven by **Conventional Commits** - (`feat:`, `fix:`, …) — commit messages determine version bumps. Releases are cut - manually via the `Release` workflow (workflow_dispatch), which also deploys docs to - GitHub Pages. +- `from maya import cmds` for Maya commands; `maya-stubs` provides type stubs, but only + for long-form flag names (e.g. `name`, not `n`); see + [CONTRIBUTING.md](CONTRIBUTING.md#linting-and-type-hinting). +- Releases are manual: `gh workflow run ci-release.yml -f version=1.2.3`. It bumps + `version` in `pyproject.toml`, tags `v`, creates a GitHub release, and + deploys docs to GitHub Pages. - CI on push/PR runs static analysis (ruff, mypy) and the Maya test matrix. diff --git a/pyproject.toml b/pyproject.toml index 0604815..d23a32d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -8,7 +8,8 @@ dependencies = [] [dependency-groups] test = ["pytest"] dev = ["mypy", "maya-stubs", "ruff"] -docs = ["mkdocs-material", "mkdocstrings[python]"] +# mkdocs<2 pinned: 2.0 drops the plugin system, breaking mkdocs-material/mkdocstrings. +docs = ["mkdocs<2", "mkdocs-material", "mkdocstrings[python]"] [tool.mypy] @@ -22,10 +23,6 @@ line-length = 88 [tool.ruff.lint] select = ["E", "F", "I", "UP", "B"] -[tool.semantic_release] -version_toml = ["pyproject.toml:project.version"] -allow_zero_version = true - [build-system] requires = ["hatchling"] build-backend = "hatchling.build" diff --git a/uv.lock b/uv.lock index c39bc12..9baec0c 100644 --- a/uv.lock +++ b/uv.lock @@ -517,6 +517,7 @@ dev = [ { name = "ruff" }, ] docs = [ + { name = "mkdocs" }, { name = "mkdocs-material" }, { name = "mkdocstrings", extra = ["python"] }, ] @@ -533,6 +534,7 @@ dev = [ { name = "ruff" }, ] docs = [ + { name = "mkdocs", specifier = "<2" }, { name = "mkdocs-material" }, { name = "mkdocstrings", extras = ["python"] }, ] From 9e9f9d1ee5de55e351f80cde097a6094d51bf80f Mon Sep 17 00:00:00 2001 From: Matthew Lee <{ID} {username}@users.noreply.github.com> Date: Wed, 12 Aug 2026 10:00:03 +1200 Subject: [PATCH 03/14] Add Maya module release pipeline (build/install/publish) Adds scripts/build_module.py to stage a shippable .mod tree from src/, install_module.py to install it locally, release.py to drive publishing, and wires reusable-release.yml to the new flow. Also switches the repo naming convention example from underscore to hyphen and drops the redundant PYTHONPATH row from the generated .mod (Maya auto-adds /scripts). --- .github/workflows/reusable-release.yml | 30 ++- README.md | 15 +- install_module.py | 251 ++++++++++++++++++++++ release.py | 154 +++++++++++++ scripts/build_module.py | 139 ++++++++++++ src/mayapythonprojecttemplate/__init__.py | 0 6 files changed, 584 insertions(+), 5 deletions(-) create mode 100644 install_module.py create mode 100644 release.py create mode 100644 scripts/build_module.py create mode 100644 src/mayapythonprojecttemplate/__init__.py diff --git a/.github/workflows/reusable-release.yml b/.github/workflows/reusable-release.yml index d7b9951..3a847ea 100644 --- a/.github/workflows/reusable-release.yml +++ b/.github/workflows/reusable-release.yml @@ -20,6 +20,18 @@ jobs: with: fetch-depth: 0 + - name: Guard version + tag + run: | + VERSION="${{ inputs.version }}" + if [[ ! "$VERSION" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then + echo "::error::version '$VERSION' is not x.y.z" + exit 1 + fi + if git rev-parse -q --verify "refs/tags/v$VERSION" >/dev/null; then + echo "::error::tag v$VERSION already exists" + exit 1 + fi + - name: Set version in pyproject.toml run: sed -i "s/^version = \".*\"/version = \"${{ inputs.version }}\"/" pyproject.toml @@ -36,10 +48,24 @@ jobs: git tag "v${{ inputs.version }}" git push origin "v${{ inputs.version }}" + - name: Build Maya module + run: python3 scripts/build_module.py --clean --version "${{ inputs.version }}" + + - name: Zip module (dot-free name) + # Hyphenate dots: macOS Archive Utility truncates the extracted folder + # name at the first '.'. + run: | + NAME=$(python3 -c "import tomllib; print(tomllib.load(open('pyproject.toml','rb'))['project']['name'])") + VERSION_SAFE="${{ inputs.version }}" + VERSION_SAFE="${VERSION_SAFE//./-}" + echo "ZIP_PATH=/tmp/${NAME}-${VERSION_SAFE}.zip" >> "$GITHUB_ENV" + (cd dist && zip -rq "/tmp/${NAME}-${VERSION_SAFE}.zip" .) + - name: Create GitHub release env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | - gh release create "v${{ inputs.version }}" \ + gh release create "v${{ inputs.version }}" "$ZIP_PATH" \ --title "v${{ inputs.version }}" \ - --generate-notes + --generate-notes \ + --notes "Download the zip, extract it, and drag \`install_module.py\` into a Maya viewport (or extract into your Maya modules dir manually)." diff --git a/README.md b/README.md index e31d781..73798bf 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ ### DO NOT FORK this is meant to be used from [Use this template][use-template-link] feature. 1. Click on [Use this template][use-template-link] button. -2. Give a name and description to the new project (e.g. my_awesome_project, please use all lowercase and underscores separation for repo names). +2. Give a name and description to the new project (e.g. my-awesome-project, please use all lowercase and hyphen separation for repo names). 3. GitHub Actions will process the template and commit to the new repo, this may take a few minutes. Check the progress in the Actions tab of the new repository. 4. Once setup is complete, clone the new project and start coding! @@ -41,7 +41,7 @@ No browser needed: ```sh -gh repo create my_cool_tool --template matthewlee-dev/MayaPythonProjectTemplate --public +gh repo create my-cool-tool --template matthewlee-dev/MayaPythonProjectTemplate --public ``` Wait for the `initial repository setup` workflow to finish before cloning. See [AGENTS.md](AGENTS.md) for the full non-interactive flow; coding agents should read that file directly. @@ -56,8 +56,17 @@ Wait for the `initial repository setup` workflow to finish before cloning. See [ * `Note: You should hold a valid Maya license.` * [Enforce coding standards](.github/workflows/reusable-static-analysis.yml) with [ruff](https://github.com/astral-sh/ruff) and [mypy](https://mypy.readthedocs.io/en/stable/). * [Build and deploy documentation](.github/workflows/reusable-build-and-deploy-docs.yml) to GitHub pages with [mkdocs](https://www.mkdocs.org/). - * [Manually triggered releases](.github/workflows/ci-release.yml): pick a version number and it tags, releases, and deploys docs (optional). + * [Manually triggered releases](.github/workflows/ci-release.yml): pick a version number and it tags, releases, and deploys docs (optional). The release also builds an installable Maya module zip (`.mod` + `install_module.py`) and attaches it to the GitHub Release. +### Cutting a release + +```sh +python3 release.py --bump patch # or --bump minor / --bump major +``` + +This dispatches the Release workflow, which bumps `pyproject.toml`, runs the test +suite, tags, builds the Maya module zip, and publishes the GitHub Release. You can +also trigger it manually from the Actions tab with an explicit version. ## Acknowledgments diff --git a/install_module.py b/install_module.py new file mode 100644 index 0000000..fbe0fd9 --- /dev/null +++ b/install_module.py @@ -0,0 +1,251 @@ +"""Maya module installer. + +Extract the release zip, then drag this file into a Maya viewport. It copies +the ``.mod`` file and module folder sitting next to it into your Maya modules +directory. + +Modules directory: + + macOS ~/Library/Preferences/Autodesk/maya/modules/ + Linux ~/maya/modules/ + Windows %USERPROFILE%/Documents/maya/modules/ +""" + +from __future__ import annotations + +import os +import shutil +import stat +import sys +import time +import traceback +from pathlib import Path + +# Maya may both exec this file and call onMayaDroppedPythonFile for one drop, +# depending on version; the flag keeps that from installing twice. +_ALREADY_RAN = False + + +def _dialog( + message: str, *, buttons: tuple[str, ...] = ("OK",), icon: str = "information" +) -> str: + from maya import cmds + + return cmds.confirmDialog( + title="Module Install", + message=message, + button=list(buttons), + defaultButton=buttons[0], + cancelButton=buttons[-1], + dismissString=buttons[-1], + icon=icon, + ) + + +def _find_mod_file(next_to: Path) -> Path | None: + """Find the single ``.mod`` file sitting next to this script.""" + candidates = sorted(next_to.glob("*.mod")) + return candidates[0] if len(candidates) == 1 else None + + +def _mod_version(mod_file: Path) -> str | None: + """Version token from the first ``+`` row of a .mod file. + + Row shape: ``+ ``. + """ + try: + for line in mod_file.read_text(encoding="utf-8", errors="replace").splitlines(): + tokens = line.split() + if len(tokens) >= 3 and tokens[0] == "+": + return tokens[-2] + except OSError: + pass + return None + + +def _version_key(version: str) -> tuple[int, ...] | None: + """Numeric sort key for ``X.Y.Z`` (a ``-prerelease`` suffix is ignored).""" + try: + return tuple(int(part) for part in version.split("-", 1)[0].split(".")) + except ValueError: + return None + + +def _modules_dir() -> Path: + from maya import cmds + + return (Path(cmds.internalVar(userAppDir=True)) / "modules").resolve() + + +class RemoveBlockedError(OSError): + """The old install couldn't be removed (typically a OneDrive lock).""" + + +def _clear_readonly(func, path, _exc_info) -> None: + """rmtree onerror hook: OneDrive sets the read-only attribute on synced + folders, which makes RemoveDirectory fail with WinError 5.""" + os.chmod(path, stat.S_IWRITE) + func(path) + + +def _rmtree(path: Path) -> None: + """Remove a tree, retrying past transient sync/AV file locks.""" + last_error: OSError | None = None + for delay in (0.0, 0.2, 0.5, 1.0, 2.0): + if delay: + time.sleep(delay) + try: + shutil.rmtree(path, onerror=_clear_readonly) + return + except OSError as exc: + last_error = exc + assert last_error is not None + raise last_error + + +def _remove_existing(dest_mod: Path, dest_dir: Path) -> None: + """Remove the installed module; raises RemoveBlockedError if it's locked.""" + if dest_dir.is_dir(): + try: + _rmtree(dest_dir) + except OSError: + # Last resort: move the old install aside so the fresh copy isn't + # blocked, then delete the leftovers best-effort. + stale = dest_dir.with_name(f"{dest_dir.name}_old_{os.getpid()}") + try: + dest_dir.rename(stale) + except OSError as exc: + raise RemoveBlockedError( + f"Couldn't remove the old install at {dest_dir}" + ) from exc + shutil.rmtree(stale, ignore_errors=True) + if dest_mod.exists(): + try: + dest_mod.unlink() + except PermissionError: + os.chmod(dest_mod, stat.S_IWRITE) + dest_mod.unlink() + + +def install() -> None: + src = Path(__file__).resolve().parent + src_mod = _find_mod_file(src) + if src_mod is None: + _dialog( + "Couldn't find a single .mod file next to this script.\n\n" + "Extract the full release zip first, then drag this file in " + "from the extracted folder.", + icon="critical", + ) + return + module_name = src_mod.stem + src_dir = src / module_name + if not src_dir.is_dir(): + _dialog( + f"Found {src_mod.name} but no matching '{module_name}' folder " + "next to this script.\n\nExtract the full release zip first, " + "then drag this file in from the extracted folder.", + icon="critical", + ) + return + + dest = _modules_dir() + if src == dest: + _dialog( + f"{module_name} is already sitting in the Maya modules folder:\n\n" + + str(dest) + ) + return + dest.mkdir(parents=True, exist_ok=True) + + dest_mod = dest / src_mod.name + dest_dir = dest / module_name + if dest_mod.exists() or dest_dir.exists(): + new_ver = _mod_version(src_mod) + old_ver = _mod_version(dest_mod) if dest_mod.exists() else None + new_key = _version_key(new_ver) if new_ver else None + old_key = _version_key(old_ver) if old_ver else None + if new_key and old_key and new_key > old_key: + message = ( + f"{module_name} {old_ver} is already installed in:\n\n{dest}\n\n" + f"Update to {new_ver}?" + ) + confirm = "Update" + elif new_key and old_key and new_key < old_key: + message = ( + f"The installed {module_name} ({old_ver}) is NEWER than this " + f"package ({new_ver}).\n\nInstalled in:\n{dest}\n\n" + "Downgrade anyway?" + ) + confirm = "Downgrade" + elif new_ver and old_ver and new_ver == old_ver: + message = ( + f"{module_name} {old_ver} is already installed in:\n\n{dest}\n\n" + "Reinstall it?" + ) + confirm = "Reinstall" + else: + # Version unreadable on one side (partial/hand-rolled install). + message = ( + f"An existing {module_name} install was found in:\n\n{dest}\n\n" + "Replace it?" + ) + confirm = "Replace" + choice = _dialog(message, buttons=(confirm, "Cancel"), icon="question") + if choice != confirm: + return + try: + _remove_existing(dest_mod, dest_dir) + except RemoveBlockedError: + traceback.print_exc() + _dialog( + "Windows blocked removing the old install:\n\n" + f"{dest_dir}\n\n" + "This is usually OneDrive syncing the folder. Pause OneDrive " + "syncing (cloud icon in the taskbar > Pause), close any " + "Explorer windows showing that folder, then run this " + "installer again.", + icon="critical", + ) + return + + shutil.copy2(src_mod, dest_mod) + shutil.copytree(src_dir, dest_dir) + + _dialog( + f"{module_name} installed.\n\nInstalled to:\n{dest}\n\n" + "Restart Maya to complete setup." + ) + + +def _run_once() -> None: + global _ALREADY_RAN + if _ALREADY_RAN: + return + _ALREADY_RAN = True + try: + install() + except Exception: + traceback.print_exc() + try: + _dialog( + "Installation failed:\n\n" + traceback.format_exc(), + icon="critical", + ) + except Exception: + pass + + +def onMayaDroppedPythonFile(*_args: object) -> None: + """Maya's drag-and-drop entry point.""" + _run_once() + + +if __name__ == "__main__": + try: + import maya.cmds # noqa: F401 + except ImportError: + print(__doc__) + sys.exit(0) + # Run from Maya's Script Editor rather than dropped: install directly. + _run_once() diff --git a/release.py b/release.py new file mode 100644 index 0000000..b126265 --- /dev/null +++ b/release.py @@ -0,0 +1,154 @@ +#!/usr/bin/env python3 +"""Cut a release. + +Computes the next version from ``pyproject.toml`` and dispatches the Release +workflow, which does the actual work (bump, test, tag, build, publish). + +Lives at the repo root, not under ``scripts/``, so ``build_module.py`` never +sweeps it into the shipped module tree. + +Usage: + python3 release.py --bump patch # 0.0.1 -> 0.0.2 + python3 release.py --bump minor # 0.1.0 + python3 release.py --bump major # 1.0.0 + python3 release.py --bump patch --dry-run +""" + +from __future__ import annotations + +import argparse +import re +import subprocess +import sys +from pathlib import Path +from typing import NoReturn + +import tomllib + +REPO_ROOT = Path(__file__).resolve().parent +PYPROJECT = REPO_ROOT / "pyproject.toml" +WORKFLOW = "ci-release.yml" +REMOTE = "origin" +MAIN_BRANCH = "main" + + +def _die(msg: str) -> NoReturn: + sys.exit(f"release: {msg}") + + +def _capture(cmd: list[str]) -> str: + """Run a command in the repo and return stripped stdout (raises on failure).""" + return subprocess.run( + cmd, cwd=REPO_ROOT, check=True, text=True, capture_output=True + ).stdout.strip() + + +def _run(cmd: list[str]) -> None: + """Run a command in the repo, streaming output; raises on failure.""" + subprocess.run(cmd, cwd=REPO_ROOT, check=True, text=True) + + +def _read_version() -> tuple[int, int, int]: + with PYPROJECT.open("rb") as f: + data = tomllib.load(f) + raw = data.get("project", {}).get("version") + if not raw: + _die("pyproject.toml missing [project].version") + m = re.fullmatch(r"(\d+)\.(\d+)\.(\d+)", raw) + if not m: + _die(f"pyproject.toml version is not x.y.z: {raw!r}") + return int(m.group(1)), int(m.group(2)), int(m.group(3)) + + +def _bump(version: tuple[int, int, int], kind: str) -> tuple[int, int, int]: + major, minor, patch = version + if kind == "major": + return major + 1, 0, 0 + if kind == "minor": + return major, minor + 1, 0 + return major, minor, patch + 1 + + +def _preflight() -> None: + """Ensure gh is usable and we're on a clean, in-sync ``main``.""" + try: + _capture(["gh", "auth", "status"]) + except (subprocess.CalledProcessError, FileNotFoundError): + _die("gh CLI not found or not authenticated — run `gh auth login`.") + + branch = _capture(["git", "rev-parse", "--abbrev-ref", "HEAD"]) + if branch != MAIN_BRANCH: + _die( + f"on '{branch}', not '{MAIN_BRANCH}'. The release workflow bumps " + f"and commits to '{MAIN_BRANCH}', so check it out first." + ) + + # Untracked junk (build artifacts, .idea/, etc.) doesn't block the release. + if _capture(["git", "status", "--porcelain", "--untracked-files=no"]): + _die( + "tracked files have uncommitted changes — commit or stash before releasing." + ) + + _run(["git", "fetch", REMOTE, MAIN_BRANCH]) + behind = _capture(["git", "rev-list", "--count", f"HEAD..{REMOTE}/{MAIN_BRANCH}"]) + if behind != "0": + _die(f"local {MAIN_BRANCH} is {behind} commit(s) behind {REMOTE} — pull first.") + + +def _confirm(prompt: str, assume_yes: bool) -> None: + if assume_yes: + return + if input(f"{prompt} [y/N] ").strip().lower() not in ("y", "yes"): + _die("aborted.") + + +def _dispatch(version: str, dry_run: bool) -> None: + cmd = ["gh", "workflow", "run", WORKFLOW, "-f", f"version={version}"] + if dry_run: + print(f"[dry-run] would dispatch: {' '.join(cmd)}") + return + _run(cmd) + + +def main(argv: list[str]) -> int: + parser = argparse.ArgumentParser(description="Cut a release.") + parser.add_argument( + "--bump", + required=True, + choices=("patch", "minor", "major"), + help="Which semver field to increment.", + ) + parser.add_argument( + "--yes", action="store_true", help="Skip the confirmation prompt." + ) + parser.add_argument( + "--dry-run", action="store_true", help="Show actions without dispatching." + ) + args = parser.parse_args(argv) + + _preflight() + + old = _read_version() + new = _bump(old, args.bump) + old_str = ".".join(map(str, old)) + new_str = ".".join(map(str, new)) + + _confirm( + f"Dispatch release {old_str} -> {new_str} (workflow bumps, tests, " + "tags, and publishes)?", + args.yes, + ) + + _dispatch(new_str, args.dry_run) + + if not args.dry_run: + print( + f"\nDispatched release {new_str}. The workflow will run tests, bump " + "pyproject.toml, tag, build the module zip, and create the GitHub " + "Release. Watch it under the Actions tab." + ) + return 0 + + +if __name__ == "__main__": + sys.exit(main(sys.argv[1:])) diff --git a/scripts/build_module.py b/scripts/build_module.py new file mode 100644 index 0000000..d3fb2e9 --- /dev/null +++ b/scripts/build_module.py @@ -0,0 +1,139 @@ +"""Stage a shippable Maya module tree under ``dist/``. + +Stdlib-only. Copies ``src//`` into a Maya module layout and generates +a matching single-row ``.mod`` file. Name-agnostic: reads the package name +from ``pyproject.toml`` at build time, so this needs no changes when +``initial_setup.py`` renames ``src/mayapythonprojecttemplate/``. + +Output layout:: + + dist/ + .mod # generated + install_module.py # copied from repo root + / + scripts// # copied from src// + LICENSE + icons/ # only if the repo has one + +Usage: + python3 scripts/build_module.py # use pyproject.toml's version + python3 scripts/build_module.py --version 1.2.3 # override the version + python3 scripts/build_module.py --clean # wipe dist/ first +""" + +from __future__ import annotations + +import argparse +import shutil +import sys +from pathlib import Path + +import tomllib + +REPO_ROOT = Path(__file__).resolve().parent.parent +SRC_ROOT = REPO_ROOT / "src" +DIST_ROOT = REPO_ROOT / "dist" +INSTALLER = "install_module.py" + + +def _read_project(pyproject: Path) -> tuple[str, str]: + """Return ``(name, version)`` from ``[project]`` in ``pyproject.toml``.""" + with pyproject.open("rb") as f: + data = tomllib.load(f) + project = data.get("project", {}) + name = project.get("name") + version = project.get("version") + if not name or not version: + raise SystemExit( + f"[build] pyproject.toml missing [project].name or .version: {pyproject}" + ) + return name, version + + +def _find_package_dir(src_root: Path) -> Path: + """Locate the single package directory under ``src/``. + + Doesn't require ``__init__.py`` — the template ships an implicit + namespace package. + """ + if not src_root.is_dir(): + raise SystemExit(f"[build] src/ directory not found: {src_root}") + candidates = [ + p + for p in src_root.iterdir() + if p.is_dir() and not p.name.startswith(".") and p.name != "__pycache__" + ] + if not candidates: + raise SystemExit(f"[build] no Python package found under {src_root}") + if len(candidates) > 1: + names = ", ".join(sorted(p.name for p in candidates)) + raise SystemExit( + f"[build] expected exactly one package under {src_root}, found: {names}" + ) + return candidates[0] + + +def _copy_package(package_dir: Path, dest: Path) -> None: + shutil.copytree( + package_dir, + dest, + ignore=shutil.ignore_patterns("__pycache__", "*.pyc"), + ) + + +def _write_mod_file(dest: Path, name: str, version: str) -> None: + contents = f"+ {name} {version} {name}\n" + dest.write_text(contents, encoding="utf-8") + + +def build(*, version_override: str | None, clean: bool) -> Path: + pyproject = REPO_ROOT / "pyproject.toml" + name, version = _read_project(pyproject) + version = version_override or version + package_dir = _find_package_dir(SRC_ROOT) + + if clean and DIST_ROOT.exists(): + shutil.rmtree(DIST_ROOT) + DIST_ROOT.mkdir(parents=True, exist_ok=True) + + module_dir = DIST_ROOT / name + module_dir.mkdir(parents=True, exist_ok=True) + + _copy_package(package_dir, module_dir / "scripts" / package_dir.name) + + license_src = REPO_ROOT / "LICENSE" + if license_src.is_file(): + shutil.copy2(license_src, module_dir / "LICENSE") + + icons_src = REPO_ROOT / "icons" + if icons_src.is_dir(): + shutil.copytree(icons_src, module_dir / "icons", dirs_exist_ok=True) + + installer_src = REPO_ROOT / INSTALLER + if installer_src.is_file(): + shutil.copy2(installer_src, DIST_ROOT / INSTALLER) + + _write_mod_file(DIST_ROOT / f"{name}.mod", name, version) + + print(f"[build] staged {name} {version} at {DIST_ROOT}") + return DIST_ROOT + + +def main(argv: list[str]) -> int: + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument( + "--version", + dest="version_override", + default=None, + help="Override the version read from pyproject.toml.", + ) + parser.add_argument( + "--clean", action="store_true", help="Wipe dist/ before staging." + ) + args = parser.parse_args(argv) + build(version_override=args.version_override, clean=args.clean) + return 0 + + +if __name__ == "__main__": + sys.exit(main(sys.argv[1:])) diff --git a/src/mayapythonprojecttemplate/__init__.py b/src/mayapythonprojecttemplate/__init__.py new file mode 100644 index 0000000..e69de29 From 5da7e63811d0b39d943429248f45aa5360f899e0 Mon Sep 17 00:00:00 2001 From: Matthew Lee <{ID} {username}@users.noreply.github.com> Date: Wed, 12 Aug 2026 10:30:14 +1200 Subject: [PATCH 04/14] Rename generated Maya installer, add PROJECT_TITLE placeholder The zip now ships _drag_and_drop_installer.py instead of a bare install_module.py, and reusable-release.yml's release notes reference it by the resolved package name. Also adds a {{PROJECT_TITLE}} placeholder (hyphens/underscores replaced with spaces) for the h3 headings in _README.md/CONTRIBUTING.md, distinct from {{PROJECT_NAME}} which still needs to stay a raw URL-safe slug. --- .github/workflows/reusable-release.yml | 3 ++- CONTRIBUTING.md | 2 +- README.md | 2 +- _README.md | 2 +- initial_setup.py | 3 +++ scripts/build_module.py | 6 +++--- 6 files changed, 11 insertions(+), 7 deletions(-) diff --git a/.github/workflows/reusable-release.yml b/.github/workflows/reusable-release.yml index 3a847ea..2fa2369 100644 --- a/.github/workflows/reusable-release.yml +++ b/.github/workflows/reusable-release.yml @@ -59,6 +59,7 @@ jobs: VERSION_SAFE="${{ inputs.version }}" VERSION_SAFE="${VERSION_SAFE//./-}" echo "ZIP_PATH=/tmp/${NAME}-${VERSION_SAFE}.zip" >> "$GITHUB_ENV" + echo "NAME=${NAME}" >> "$GITHUB_ENV" (cd dist && zip -rq "/tmp/${NAME}-${VERSION_SAFE}.zip" .) - name: Create GitHub release @@ -68,4 +69,4 @@ jobs: gh release create "v${{ inputs.version }}" "$ZIP_PATH" \ --title "v${{ inputs.version }}" \ --generate-notes \ - --notes "Download the zip, extract it, and drag \`install_module.py\` into a Maya viewport (or extract into your Maya modules dir manually)." + --notes "Download the zip, extract it, and drag \`${NAME}_drag_and_drop_installer.py\` into a Maya viewport (or extract into your Maya modules dir manually)." diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index ee25d64..342ad60 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -9,7 +9,7 @@ MayaPythonLogo -

    {{PROJECT_NAME}}

    +

    {{PROJECT_TITLE}}

    Development and Contributing Guidelines diff --git a/README.md b/README.md index 73798bf..33303cc 100644 --- a/README.md +++ b/README.md @@ -56,7 +56,7 @@ Wait for the `initial repository setup` workflow to finish before cloning. See [ * `Note: You should hold a valid Maya license.` * [Enforce coding standards](.github/workflows/reusable-static-analysis.yml) with [ruff](https://github.com/astral-sh/ruff) and [mypy](https://mypy.readthedocs.io/en/stable/). * [Build and deploy documentation](.github/workflows/reusable-build-and-deploy-docs.yml) to GitHub pages with [mkdocs](https://www.mkdocs.org/). - * [Manually triggered releases](.github/workflows/ci-release.yml): pick a version number and it tags, releases, and deploys docs (optional). The release also builds an installable Maya module zip (`.mod` + `install_module.py`) and attaches it to the GitHub Release. + * [Manually triggered releases](.github/workflows/ci-release.yml): pick a version number and it tags, releases, and deploys docs (optional). The release also builds an installable Maya module zip (`.mod` + `_drag_and_drop_installer.py`) and attaches it to the GitHub Release. ### Cutting a release diff --git a/_README.md b/_README.md index 857b731..3f4714f 100644 --- a/_README.md +++ b/_README.md @@ -20,7 +20,7 @@ [![Maya][maya-2024-2027-shield]][maya-2027-url] [![Maya][maya-cmds-shield]][maya-cmds-url] -

    {{PROJECT_NAME}}

    +

    {{PROJECT_TITLE}}

    {{PROJECT_DESC}}

    diff --git a/initial_setup.py b/initial_setup.py index ed00503..1db6be5 100644 --- a/initial_setup.py +++ b/initial_setup.py @@ -27,11 +27,14 @@ def rename_python_src_directory(project_name): user_name = os.getenv('USER_NAME') project_name = os.getenv('PROJECT_NAME') project_description = os.getenv('PROJECT_DESC') + project_title = project_name.replace('-', ' ').replace('_', ' ') if project_name else project_name replace_text_in_file("README.md", "{{PROJECT_OWNER}}", user_name) + replace_text_in_file("README.md", "{{PROJECT_TITLE}}", project_title) replace_text_in_file("README.md", "{{PROJECT_NAME}}", project_name) replace_text_in_file("README.md", "{{PROJECT_DESC}}", project_description) replace_text_in_file("CONTRIBUTING.md", "{{PROJECT_OWNER}}", user_name) + replace_text_in_file("CONTRIBUTING.md", "{{PROJECT_TITLE}}", project_title) replace_text_in_file("CONTRIBUTING.md", "{{PROJECT_NAME}}", project_name) replace_text_in_file("mkdocs.yml", "{{SITE_NAME}}", project_name) new_project_name = rename_python_src_directory(project_name) diff --git a/scripts/build_module.py b/scripts/build_module.py index d3fb2e9..a2561bd 100644 --- a/scripts/build_module.py +++ b/scripts/build_module.py @@ -8,8 +8,8 @@ Output layout:: dist/ - .mod # generated - install_module.py # copied from repo root + .mod # generated + _drag_and_drop_installer.py # copied from install_module.py at repo root / scripts// # copied from src// LICENSE @@ -111,7 +111,7 @@ def build(*, version_override: str | None, clean: bool) -> Path: installer_src = REPO_ROOT / INSTALLER if installer_src.is_file(): - shutil.copy2(installer_src, DIST_ROOT / INSTALLER) + shutil.copy2(installer_src, DIST_ROOT / f"{name}_drag_and_drop_installer.py") _write_mod_file(DIST_ROOT / f"{name}.mod", name, version) From 54070d093df7bec22cd0fcf5488a517dedd985f6 Mon Sep 17 00:00:00 2001 From: Matthew Lee <{ID} {username}@users.noreply.github.com> Date: Wed, 12 Aug 2026 10:51:22 +1200 Subject: [PATCH 05/14] docs update --- AGENTS.md | 14 +++++++++++--- CONTRIBUTING.md | 2 +- _AGENTS.md | 8 +++++--- 3 files changed, 17 insertions(+), 7 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index 38b83bd..8e57844 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -15,7 +15,7 @@ gh repo create \ --description "" ``` -Use all-lowercase with underscores for `` (e.g. `my_cool_tool`). +Use all-lowercase with hyphens for `` (e.g. `my-cool-tool`). Creating the repo triggers the `initial repository setup` workflow, which rewrites placeholders, renames `src/mayapythonprojecttemplate/`, regenerates `uv.lock`, and @@ -52,8 +52,16 @@ commands (generated from `_AGENTS.md` in this template). change them in `pyproject.toml`, update the matching literals in `initial_setup.py`. - Other templated files (`_README.md`, `_AGENTS.md`, `CONTRIBUTING.md`, `mkdocs.yml`, `tests/maya/test_example.py`) use `{{PROJECT_OWNER}}` / `{{PROJECT_NAME}}` / - `{{PROJECT_DESC}}` / `{{SITE_NAME}}` placeholders handled by `initial_setup.py` and - `.github/workflows/initial-setup.yml`. + `{{PROJECT_TITLE}}` / `{{PROJECT_DESC}}` / `{{SITE_NAME}}` placeholders handled by + `initial_setup.py` and `.github/workflows/initial-setup.yml`. `{{PROJECT_TITLE}}` is + `{{PROJECT_NAME}}` with `-`/`_` replaced by spaces, for display headings only — + `{{PROJECT_NAME}}` itself must stay a raw URL-safe slug. +- Release pipeline: `scripts/build_module.py` stages `src//` into a Maya + module tree under `dist/` (name/version read from `pyproject.toml`) and copies + `install_module.py` in as `_drag_and_drop_installer.py`. `release.py` + (repo root) dispatches `ci-release.yml`, which runs `reusable-release.yml` to zip + `dist/` and attach it to the GitHub Release. `release.py` lives at the repo root, + not under `scripts/`, so `build_module.py` never sweeps it into the shipped module. - CI workflows are guarded with `if: github.repository != 'matthewlee-dev/MayaPythonProjectTemplate'` so they run only in generated repos. Keep those guards. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 342ad60..05c7333 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -149,7 +149,7 @@ Continuous integration is set up with [GitHub Actions][github-actions-url], work 1. [ci-main.yml](.github/workflows/ci-main.yml): This workflow is intended to be a fast check to ensure the code is in a good state, and code standards are met. It runs automatically on every push and pull request to main or can be triggered from the `Run workflow` button on the [actions menu](https://github.com/{{PROJECT_OWNER}}/{{PROJECT_NAME}}/actions/workflows/ci-main.yml). It runs tests (if they exist), and performs linting, formatting, and type hinting checks.

    drawing
    -2. [ci-release.yml](.github/workflows/ci-release.yml): This workflow will do all the above, then bump `pyproject.toml` to a version you specify, tag it, create a GitHub release, and deploy the documentation to GitHub pages. Run it from the `Run workflow` button on the [actions menu](https://github.com/{{PROJECT_OWNER}}/{{PROJECT_NAME}}/actions/workflows/ci-release.yml) (enter the version, e.g. `1.2.3`, when prompted), or via CLI: `gh workflow run ci-release.yml -f version=1.2.3`. +2. [ci-release.yml](.github/workflows/ci-release.yml): This workflow will do all the above, then bump `pyproject.toml` to a version you specify, tag it, build an installable Maya module zip (`.mod` + `_drag_and_drop_installer.py`), create a GitHub release with the zip attached, and deploy the documentation to GitHub pages. Trigger it with `python3 release.py --bump patch` (or `minor`/`major`), or run it from the `Run workflow` button on the [actions menu](https://github.com/{{PROJECT_OWNER}}/{{PROJECT_NAME}}/actions/workflows/ci-release.yml) (enter the version, e.g. `1.2.3`, when prompted), or via CLI: `gh workflow run ci-release.yml -f version=1.2.3`.
    drawing
    diff --git a/_AGENTS.md b/_AGENTS.md index 6262dc7..e35afed 100644 --- a/_AGENTS.md +++ b/_AGENTS.md @@ -29,7 +29,9 @@ This is an Autodesk Maya Python tool, created from - `from maya import cmds` for Maya commands; `maya-stubs` provides type stubs, but only for long-form flag names (e.g. `name`, not `n`); see [CONTRIBUTING.md](CONTRIBUTING.md#linting-and-type-hinting). -- Releases are manual: `gh workflow run ci-release.yml -f version=1.2.3`. It bumps - `version` in `pyproject.toml`, tags `v`, creates a GitHub release, and - deploys docs to GitHub Pages. +- Releases are manual: `python3 release.py --bump patch` (or `minor`/`major`), or + `gh workflow run ci-release.yml -f version=1.2.3`. It bumps `version` in + `pyproject.toml`, tags `v`, builds an installable Maya module zip + (`.mod` + `_drag_and_drop_installer.py`) and attaches it to a GitHub + release, and deploys docs to GitHub Pages. - CI on push/PR runs static analysis (ruff, mypy) and the Maya test matrix. From 715f7d235751ade2096015169bf961d69d920fd8 Mon Sep 17 00:00:00 2001 From: Matthew Lee <{ID} {username}@users.noreply.github.com> Date: Wed, 12 Aug 2026 15:42:08 +1200 Subject: [PATCH 06/14] Fix duplicate pytest collection run in Maya tests gate --- .github/workflows/reusable-maya-tests.yml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/reusable-maya-tests.yml b/.github/workflows/reusable-maya-tests.yml index cbbb9c3..63e088c 100644 --- a/.github/workflows/reusable-maya-tests.yml +++ b/.github/workflows/reusable-maya-tests.yml @@ -5,6 +5,8 @@ on: workflow_dispatch: # Manual trigger jobs: + # Cheap gate: skips the disk purge + multi-GB Maya image pull when there are + # no tests, the common case for freshly created template projects. collect_tests: runs-on: ubuntu-latest outputs: @@ -25,15 +27,16 @@ jobs: run: | #!/bin/bash set +e # Disable exit on error - uv run --no-sync pytest --collect-only + output=$(uv run --no-sync pytest --collect-only) exit_code=$? set -e # Re-enable exit on error + echo "$output" if [ $exit_code -eq 5 ]; then echo "tests_collected=0" >> $GITHUB_OUTPUT echo "No tests were collected." else - collected=$(uv run --no-sync pytest --collect-only | grep -oP 'collected \K\d+') + collected=$(echo "$output" | grep -oP 'collected \K\d+') echo "tests_collected=$collected" >> $GITHUB_OUTPUT echo "Collected $collected tests." fi From e18c4acf57b7b88369e72419803b7524f1dd7ab1 Mon Sep 17 00:00:00 2001 From: Matthew Lee <{ID} {username}@users.noreply.github.com> Date: Wed, 12 Aug 2026 15:42:08 +1200 Subject: [PATCH 07/14] Vendor runtime deps into the Maya module, harden release workflow build_module.py now vendors locked runtime deps (via uv, prebuilt wheels only) into per-platform/per-Python dirs with qualified .mod rows, when the project declares runtime dependencies. The release workflow builds before any push so failures are no-ops, passes inputs via env (shell-injection safety), keeps uv.lock in sync with the version bump, and tolerates re-dispatch after partial failure. --- .github/workflows/ci-release.yml | 16 +- .github/workflows/reusable-release.yml | 77 +++++-- install_module.py | 73 +++++- release.py | 78 ++++++- scripts/build_module.py | 295 ++++++++++++++++++++++--- 5 files changed, 477 insertions(+), 62 deletions(-) diff --git a/.github/workflows/ci-release.yml b/.github/workflows/ci-release.yml index e126269..3143145 100644 --- a/.github/workflows/ci-release.yml +++ b/.github/workflows/ci-release.yml @@ -1,3 +1,5 @@ +# Thin trigger wrapper, job logic lives in reusable-*.yml so ci-main and +# ci-release share it. name: Release on: @@ -7,6 +9,16 @@ on: description: "Version to release (e.g. 1.2.3, no leading v)" required: true type: string + platforms: + description: "Platforms to vendor runtime deps for (comma-separated: win64, linux, mac)" + required: false + type: string + default: "win64,linux,mac" + maya_versions: + description: "Maya versions to vendor runtime deps for (comma-separated)" + required: false + type: string + default: "2024,2025,2026,2027" jobs: @@ -20,10 +32,12 @@ jobs: do_release: if: github.repository != 'matthewlee-dev/MayaPythonProjectTemplate' - needs: [tests] + needs: [tests, static-analysis] uses: ./.github/workflows/reusable-release.yml with: version: ${{ inputs.version }} + platforms: ${{ inputs.platforms }} + maya_versions: ${{ inputs.maya_versions }} permissions: contents: write diff --git a/.github/workflows/reusable-release.yml b/.github/workflows/reusable-release.yml index 2fa2369..e158805 100644 --- a/.github/workflows/reusable-release.yml +++ b/.github/workflows/reusable-release.yml @@ -7,6 +7,16 @@ on: description: "Version to release (e.g. 1.2.3, no leading v)" required: true type: string + platforms: + description: "Comma-separated platforms to vendor runtime deps for (win64, linux, mac). Ignored if the project has no runtime deps." + required: false + type: string + default: "win64,linux,mac" + maya_versions: + description: "Comma-separated Maya versions to vendor runtime deps for. Ignored if the project has no runtime deps." + required: false + type: string + default: "2024,2025,2026,2027" jobs: release: @@ -20,9 +30,16 @@ jobs: with: fetch-depth: 0 + # Workflow inputs reach the shell through `env:`, never by `${{ }}` + # expansion inside `run:`. Direct expansion pastes the raw string into the + # script before bash parses it, so an input can close the quote and run + # arbitrary commands with this job's `contents: write` token, including in + # the guard step below, which would otherwise validate its input too late + # to matter. - name: Guard version + tag + env: + VERSION: ${{ inputs.version }} run: | - VERSION="${{ inputs.version }}" if [[ ! "$VERSION" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then echo "::error::version '$VERSION' is not x.y.z" exit 1 @@ -32,41 +49,63 @@ jobs: exit 1 fi - - name: Set version in pyproject.toml - run: sed -i "s/^version = \".*\"/version = \"${{ inputs.version }}\"/" pyproject.toml + - name: Install uv + uses: astral-sh/setup-uv@v7 - - name: Commit version bump - run: | - git config user.name 'github-actions[bot]' - git config user.email 'github-actions[bot]@users.noreply.github.com' - git add pyproject.toml - git commit -m "chore: release v${{ inputs.version }}" - git push - - - name: Tag release + - name: Set version in pyproject.toml + env: + VERSION: ${{ inputs.version }} run: | - git tag "v${{ inputs.version }}" - git push origin "v${{ inputs.version }}" + sed -i "s/^version = \".*\"/version = \"$VERSION\"/" pyproject.toml + uv lock # keep uv.lock's root-package version in sync with the bump + # Build and zip BEFORE any push: everything likely to fail (missing + # wheels, bad src/ layout) fails while the remote is untouched, so a + # failed release is a no-op that can simply be re-dispatched. - name: Build Maya module - run: python3 scripts/build_module.py --clean --version "${{ inputs.version }}" + env: + VERSION: ${{ inputs.version }} + PLATFORMS: ${{ inputs.platforms }} + MAYA_VERSIONS: ${{ inputs.maya_versions }} + run: | + python3 scripts/build_module.py --clean --version "$VERSION" \ + --platforms "$PLATFORMS" \ + --maya-versions "$MAYA_VERSIONS" - name: Zip module (dot-free name) # Hyphenate dots: macOS Archive Utility truncates the extracted folder # name at the first '.'. + env: + VERSION: ${{ inputs.version }} run: | NAME=$(python3 -c "import tomllib; print(tomllib.load(open('pyproject.toml','rb'))['project']['name'])") - VERSION_SAFE="${{ inputs.version }}" - VERSION_SAFE="${VERSION_SAFE//./-}" + VERSION_SAFE="${VERSION//./-}" echo "ZIP_PATH=/tmp/${NAME}-${VERSION_SAFE}.zip" >> "$GITHUB_ENV" echo "NAME=${NAME}" >> "$GITHUB_ENV" (cd dist && zip -rq "/tmp/${NAME}-${VERSION_SAFE}.zip" .) + - name: Commit version bump + env: + VERSION: ${{ inputs.version }} + run: | + git config user.name 'github-actions[bot]' + git config user.email 'github-actions[bot]@users.noreply.github.com' + git add pyproject.toml uv.lock + # Skip the commit on a re-run where the bump already landed, so a + # release that failed after pushing can be re-dispatched. + git diff --cached --quiet || git commit -m "chore: release v$VERSION" + git push + + # gh creates the tag along with the release, pointing at the bump + # commit; tag + release are one final step, so the guard's "tag + # exists" check really means "this release already happened". - name: Create GitHub release env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + VERSION: ${{ inputs.version }} run: | - gh release create "v${{ inputs.version }}" "$ZIP_PATH" \ - --title "v${{ inputs.version }}" \ + gh release create "v$VERSION" "$ZIP_PATH" \ + --target "$(git rev-parse HEAD)" \ + --title "v$VERSION" \ --generate-notes \ --notes "Download the zip, extract it, and drag \`${NAME}_drag_and_drop_installer.py\` into a Maya viewport (or extract into your Maya modules dir manually)." diff --git a/install_module.py b/install_module.py index fbe0fd9..d11e3da 100644 --- a/install_module.py +++ b/install_module.py @@ -4,6 +4,9 @@ the ``.mod`` file and module folder sitting next to it into your Maya modules directory. +Deliberately defensive: each guard here maps to a real end-user failure +(OneDrive locks, double-fired drop callbacks, partial installs). + Modules directory: macOS ~/Library/Preferences/Autodesk/maya/modules/ @@ -29,6 +32,16 @@ def _dialog( message: str, *, buttons: tuple[str, ...] = ("OK",), icon: str = "information" ) -> str: + """Show a Maya confirm dialog and return the label of the clicked button. + + Args: + message: Dialog body text. + buttons: Button labels; the first is the default, the last is Cancel. + icon: Dialog icon name. + + Returns: + The clicked button's label. + """ from maya import cmds return cmds.confirmDialog( @@ -43,7 +56,14 @@ def _dialog( def _find_mod_file(next_to: Path) -> Path | None: - """Find the single ``.mod`` file sitting next to this script.""" + """Find the single ``.mod`` file sitting next to this script. + + Args: + next_to: Directory to search. + + Returns: + The ``.mod`` file, or None if there isn't exactly one. + """ candidates = sorted(next_to.glob("*.mod")) return candidates[0] if len(candidates) == 1 else None @@ -52,6 +72,12 @@ def _mod_version(mod_file: Path) -> str | None: """Version token from the first ``+`` row of a .mod file. Row shape: ``+ ``. + + Args: + mod_file: Path to the ``.mod`` file. + + Returns: + The version token, or None if it couldn't be read. """ try: for line in mod_file.read_text(encoding="utf-8", errors="replace").splitlines(): @@ -64,7 +90,14 @@ def _mod_version(mod_file: Path) -> str | None: def _version_key(version: str) -> tuple[int, ...] | None: - """Numeric sort key for ``X.Y.Z`` (a ``-prerelease`` suffix is ignored).""" + """Numeric sort key for ``X.Y.Z`` (a ``-prerelease`` suffix is ignored). + + Args: + version: Version string to parse. + + Returns: + A tuple of ints to compare, or None if unparseable. + """ try: return tuple(int(part) for part in version.split("-", 1)[0].split(".")) except ValueError: @@ -72,6 +105,11 @@ def _version_key(version: str) -> tuple[int, ...] | None: def _modules_dir() -> Path: + """Return the current user's Maya modules directory. + + Returns: + Absolute path to the modules directory. + """ from maya import cmds return (Path(cmds.internalVar(userAppDir=True)) / "modules").resolve() @@ -82,14 +120,27 @@ class RemoveBlockedError(OSError): def _clear_readonly(func, path, _exc_info) -> None: - """rmtree onerror hook: OneDrive sets the read-only attribute on synced - folders, which makes RemoveDirectory fail with WinError 5.""" + """rmtree onerror hook clearing the read-only bit OneDrive sets on synced + folders, which makes RemoveDirectory fail with WinError 5. + + Args: + func: The failed removal function; retried after clearing the bit. + path: Path that failed to remove. + _exc_info: Unused exception info from rmtree. + """ os.chmod(path, stat.S_IWRITE) func(path) def _rmtree(path: Path) -> None: - """Remove a tree, retrying past transient sync/AV file locks.""" + """Remove a tree, retrying past transient sync/AV file locks. + + Args: + path: Directory tree to remove. + + Raises: + OSError: If removal still fails after all retries. + """ last_error: OSError | None = None for delay in (0.0, 0.2, 0.5, 1.0, 2.0): if delay: @@ -104,7 +155,15 @@ def _rmtree(path: Path) -> None: def _remove_existing(dest_mod: Path, dest_dir: Path) -> None: - """Remove the installed module; raises RemoveBlockedError if it's locked.""" + """Remove the installed module. + + Args: + dest_mod: Installed ``.mod`` file to remove. + dest_dir: Installed module directory to remove. + + Raises: + RemoveBlockedError: If the old install is locked and can't be moved. + """ if dest_dir.is_dir(): try: _rmtree(dest_dir) @@ -128,6 +187,7 @@ def _remove_existing(dest_mod: Path, dest_dir: Path) -> None: def install() -> None: + """Install the module sitting next to this script into Maya's modules dir.""" src = Path(__file__).resolve().parent src_mod = _find_mod_file(src) if src_mod is None: @@ -219,6 +279,7 @@ def install() -> None: def _run_once() -> None: + """Run ``install()`` at most once, reporting failures via dialog.""" global _ALREADY_RAN if _ALREADY_RAN: return diff --git a/release.py b/release.py index b126265..5b18d20 100644 --- a/release.py +++ b/release.py @@ -33,22 +33,52 @@ def _die(msg: str) -> NoReturn: + """Print an error prefixed with ``release:`` and exit. + + Args: + msg: Error message. + """ sys.exit(f"release: {msg}") def _capture(cmd: list[str]) -> str: - """Run a command in the repo and return stripped stdout (raises on failure).""" + """Run a command in the repo and return stripped stdout. + + Args: + cmd: Command and arguments. + + Returns: + Stripped stdout. + + Raises: + subprocess.CalledProcessError: If the command exits non-zero. + """ return subprocess.run( cmd, cwd=REPO_ROOT, check=True, text=True, capture_output=True ).stdout.strip() def _run(cmd: list[str]) -> None: - """Run a command in the repo, streaming output; raises on failure.""" + """Run a command in the repo, streaming output. + + Args: + cmd: Command and arguments. + + Raises: + subprocess.CalledProcessError: If the command exits non-zero. + """ subprocess.run(cmd, cwd=REPO_ROOT, check=True, text=True) def _read_version() -> tuple[int, int, int]: + """Read and parse the current version from ``pyproject.toml``. + + Returns: + The ``(major, minor, patch)`` version. + + Raises: + SystemExit: If the version is missing or not ``x.y.z``. + """ with PYPROJECT.open("rb") as f: data = tomllib.load(f) raw = data.get("project", {}).get("version") @@ -61,6 +91,15 @@ def _read_version() -> tuple[int, int, int]: def _bump(version: tuple[int, int, int], kind: str) -> tuple[int, int, int]: + """Increment one semver field, resetting the fields below it. + + Args: + version: The ``(major, minor, patch)`` version to bump. + kind: Which field to bump: ``"major"``, ``"minor"``, or ``"patch"``. + + Returns: + The bumped version. + """ major, minor, patch = version if kind == "major": return major + 1, 0, 0 @@ -70,11 +109,15 @@ def _bump(version: tuple[int, int, int], kind: str) -> tuple[int, int, int]: def _preflight() -> None: - """Ensure gh is usable and we're on a clean, in-sync ``main``.""" + """Ensure gh is usable and we're on a clean, in-sync ``main``. + + Raises: + SystemExit: If any of those conditions aren't met. + """ try: _capture(["gh", "auth", "status"]) except (subprocess.CalledProcessError, FileNotFoundError): - _die("gh CLI not found or not authenticated — run `gh auth login`.") + _die("gh CLI not found or not authenticated, run `gh auth login`.") branch = _capture(["git", "rev-parse", "--abbrev-ref", "HEAD"]) if branch != MAIN_BRANCH: @@ -86,16 +129,25 @@ def _preflight() -> None: # Untracked junk (build artifacts, .idea/, etc.) doesn't block the release. if _capture(["git", "status", "--porcelain", "--untracked-files=no"]): _die( - "tracked files have uncommitted changes — commit or stash before releasing." + "tracked files have uncommitted changes, commit or stash before releasing." ) _run(["git", "fetch", REMOTE, MAIN_BRANCH]) behind = _capture(["git", "rev-list", "--count", f"HEAD..{REMOTE}/{MAIN_BRANCH}"]) if behind != "0": - _die(f"local {MAIN_BRANCH} is {behind} commit(s) behind {REMOTE} — pull first.") + _die(f"local {MAIN_BRANCH} is {behind} commit(s) behind {REMOTE}, pull first.") def _confirm(prompt: str, assume_yes: bool) -> None: + """Prompt for y/N confirmation, exiting if the user declines. + + Args: + prompt: Question to show. + assume_yes: If True, skip the prompt and proceed. + + Raises: + SystemExit: If the user declines. + """ if assume_yes: return if input(f"{prompt} [y/N] ").strip().lower() not in ("y", "yes"): @@ -103,6 +155,12 @@ def _confirm(prompt: str, assume_yes: bool) -> None: def _dispatch(version: str, dry_run: bool) -> None: + """Dispatch the release workflow for the given version. + + Args: + version: Version to release, ``x.y.z``. + dry_run: If True, print the command instead of running it. + """ cmd = ["gh", "workflow", "run", WORKFLOW, "-f", f"version={version}"] if dry_run: print(f"[dry-run] would dispatch: {' '.join(cmd)}") @@ -111,6 +169,14 @@ def _dispatch(version: str, dry_run: bool) -> None: def main(argv: list[str]) -> int: + """CLI entry point: bump the version and dispatch the release workflow. + + Args: + argv: Command-line arguments (excluding the program name). + + Returns: + Process exit code. + """ parser = argparse.ArgumentParser(description="Cut a release.") parser.add_argument( "--bump", diff --git a/scripts/build_module.py b/scripts/build_module.py index a2561bd..5bfd5d2 100644 --- a/scripts/build_module.py +++ b/scripts/build_module.py @@ -1,17 +1,26 @@ """Stage a shippable Maya module tree under ``dist/``. -Stdlib-only. Copies ``src//`` into a Maya module layout and generates -a matching single-row ``.mod`` file. Name-agnostic: reads the package name -from ``pyproject.toml`` at build time, so this needs no changes when -``initial_setup.py`` renames ``src/mayapythonprojecttemplate/``. +Copies ``src//`` into a Maya module layout and generates a matching +``.mod`` file. Name-agnostic: reads the package name from ``pyproject.toml`` +at build time, so this needs no changes when ``initial_setup.py`` renames +``src/mayapythonprojecttemplate/``. + +Runtime deps are vendored (not pip-installed at install time) because end +users can't be assumed able (or allowed) to install into their studio's +mayapy. If ``[project].dependencies`` is non-empty, the locked runtime deps are +vendored into per-platform/per-Python dirs (resolved from ``uv.lock`` via +``uv``, prebuilt wheels only) and the ``.mod`` file gains one qualified row +per (Maya version, platform) that puts the right vendor dir on PYTHONPATH. +Maya versions/platforms without a row will not load the module. Output layout:: dist/ .mod # generated - _drag_and_drop_installer.py # copied from install_module.py at repo root + _drag_and_drop_installer.py # copied from install_module.py / - scripts// # copied from src// + scripts// # copied from src// + vendor/_/ # only if the project has runtime deps LICENSE icons/ # only if the repo has one @@ -19,13 +28,17 @@ python3 scripts/build_module.py # use pyproject.toml's version python3 scripts/build_module.py --version 1.2.3 # override the version python3 scripts/build_module.py --clean # wipe dist/ first + python3 scripts/build_module.py \ + --platforms win64,linux,mac --maya-versions 2024,2025,2026,2027 """ from __future__ import annotations import argparse import shutil +import subprocess import sys +import tempfile from pathlib import Path import tomllib @@ -35,9 +48,36 @@ DIST_ROOT = REPO_ROOT / "dist" INSTALLER = "install_module.py" +# Which Python each Maya ships with. Wheels target the Python ABI, not the +# Maya version, so Mayas sharing a Python share a vendor dir. +MAYA_PYTHON = { + "2024": "3.10", + "2025": "3.11", + "2026": "3.11", + "2027": "3.13", +} + +# uv --python-platform triples per .mod PLATFORM tag. mac is Apple Silicon +# only: this template targets Maya 2024+ and doesn't ship Intel macOS builds. +PLATFORM_TRIPLES = { + "win64": "x86_64-pc-windows-msvc", + "linux": "x86_64-unknown-linux-gnu", + "mac": "aarch64-apple-darwin", +} + + +def _read_project(pyproject: Path) -> tuple[str, str, list[str]]: + """Return ``(name, version, dependencies)`` from ``[project]``. + + Args: + pyproject: Path to ``pyproject.toml``. -def _read_project(pyproject: Path) -> tuple[str, str]: - """Return ``(name, version)`` from ``[project]`` in ``pyproject.toml``.""" + Returns: + The project name, version, and runtime dependencies. + + Raises: + SystemExit: If name or version is missing. + """ with pyproject.open("rb") as f: data = tomllib.load(f) project = data.get("project", {}) @@ -47,14 +87,24 @@ def _read_project(pyproject: Path) -> tuple[str, str]: raise SystemExit( f"[build] pyproject.toml missing [project].name or .version: {pyproject}" ) - return name, version + return name, version, project.get("dependencies", []) def _find_package_dir(src_root: Path) -> Path: """Locate the single package directory under ``src/``. - Doesn't require ``__init__.py`` — the template ships an implicit + Doesn't require ``__init__.py``; the template ships an implicit namespace package. + + Args: + src_root: The ``src/`` directory to search. + + Returns: + Path to the single package directory. + + Raises: + SystemExit: If ``src/`` is missing, or doesn't contain exactly one + package. """ if not src_root.is_dir(): raise SystemExit(f"[build] src/ directory not found: {src_root}") @@ -74,6 +124,12 @@ def _find_package_dir(src_root: Path) -> Path: def _copy_package(package_dir: Path, dest: Path) -> None: + """Copy a package directory into the module tree, excluding caches. + + Args: + package_dir: Source package directory. + dest: Destination directory. + """ shutil.copytree( package_dir, dest, @@ -81,45 +137,205 @@ def _copy_package(package_dir: Path, dest: Path) -> None: ) -def _write_mod_file(dest: Path, name: str, version: str) -> None: - contents = f"+ {name} {version} {name}\n" - dest.write_text(contents, encoding="utf-8") +def _vendor_deps( + module_dir: Path, + platforms: list[str], + maya_versions: list[str], + *, + root: Path = REPO_ROOT, +) -> list[tuple[str, str, str]]: + """Install locked runtime deps into ``vendor/_`` dirs. + + ``--only-binary :all:`` makes the build fail loudly if any dep lacks a + prebuilt wheel for a target, instead of shipping a broken zip. + + Args: + module_dir: Module directory to vendor deps into. + platforms: Target platforms (keys of ``PLATFORM_TRIPLES``). + maya_versions: Target Maya versions (keys of ``MAYA_PYTHON``). + root: Repo root to resolve ``uv export`` against. + + Returns: + ``(maya_version, platform, vendor_relpath)`` rows for the .mod file. + + Raises: + SystemExit: If a platform/Maya version is unknown, or ``uv`` isn't + on PATH. + """ + for platform in platforms: + if platform not in PLATFORM_TRIPLES: + raise SystemExit( + f"[build] unknown platform '{platform}'; " + f"known: {', '.join(PLATFORM_TRIPLES)}" + ) + for maya in maya_versions: + if maya not in MAYA_PYTHON: + raise SystemExit( + f"[build] no Python mapping for Maya {maya}; " + f"add it to MAYA_PYTHON in {Path(__file__).name}" + ) + + rows: list[tuple[str, str, str]] = [] + built: dict[tuple[str, str], str] = {} + with tempfile.TemporaryDirectory() as tmp: + requirements = Path(tmp) / "requirements.txt" + try: + subprocess.run( + [ + "uv", + "export", + "--no-dev", + "--no-emit-project", + "--no-hashes", + "--output-file", + str(requirements), + ], + cwd=root, + check=True, + ) + for maya in maya_versions: + py = MAYA_PYTHON[maya] + for platform in platforms: + if (platform, py) not in built: + dirname = f"{platform}_{py.replace('.', '')}" + target = module_dir / "vendor" / dirname + print(f"[build] vendoring deps for {platform} / Python {py}") + subprocess.run( + [ + "uv", + "pip", + "install", + "--target", + str(target), + "--python-platform", + PLATFORM_TRIPLES[platform], + "--python-version", + py, + "--only-binary", + ":all:", + "--requirements", + str(requirements), + ], + check=True, + ) + built[(platform, py)] = dirname + rows.append((maya, platform, f"vendor/{built[(platform, py)]}")) + except FileNotFoundError: + raise SystemExit( + "[build] uv is required to vendor dependencies but wasn't " + "found on PATH: https://docs.astral.sh/uv/" + ) from None + return rows + +def _write_mod_file( + dest: Path, name: str, version: str, vendor_rows: list[tuple[str, str, str]] +) -> None: + """Write the ``.mod`` file, one row per vendored (Maya version, platform). -def build(*, version_override: str | None, clean: bool) -> Path: - pyproject = REPO_ROOT / "pyproject.toml" - name, version = _read_project(pyproject) + Args: + dest: Path to write the ``.mod`` file to. + name: Module name. + version: Module version. + vendor_rows: Rows from ``_vendor_deps``, or empty if no runtime deps. + """ + if not vendor_rows: + dest.write_text(f"+ {name} {version} {name}\n", encoding="utf-8") + return + # One row per (Maya version, platform); Maya picks the matching row at + # startup and prepends that row's vendor dir to PYTHONPATH. + blocks = [ + f"+ MAYAVERSION:{maya} PLATFORM:{platform} {name} {version} {name}\n" + f"PYTHONPATH +:= {vendor_rel}\n" + for maya, platform, vendor_rel in vendor_rows + ] + dest.write_text("\n".join(blocks), encoding="utf-8") + + +def build( + *, + version_override: str | None, + clean: bool, + platforms: list[str], + maya_versions: list[str], + root: Path = REPO_ROOT, +) -> Path: + """Stage the module tree under ``root/dist``. + + ``root`` defaults to this repo's root; tests pass a tmp project fixture. + + Args: + version_override: Version to use instead of ``pyproject.toml``'s. + clean: If True, wipe ``dist/`` before staging. + platforms: Platforms to vendor runtime deps for. + maya_versions: Maya versions to vendor runtime deps for. + root: Project root to build from. + + Returns: + Path to the ``dist/`` directory. + + Raises: + SystemExit: If the project has runtime dependencies but no + ``platforms``/``maya_versions`` were given. + """ + src_root = root / "src" + dist_root = root / "dist" + + pyproject = root / "pyproject.toml" + name, version, dependencies = _read_project(pyproject) version = version_override or version - package_dir = _find_package_dir(SRC_ROOT) + package_dir = _find_package_dir(src_root) - if clean and DIST_ROOT.exists(): - shutil.rmtree(DIST_ROOT) - DIST_ROOT.mkdir(parents=True, exist_ok=True) + if clean and dist_root.exists(): + shutil.rmtree(dist_root) + dist_root.mkdir(parents=True, exist_ok=True) - module_dir = DIST_ROOT / name - module_dir.mkdir(parents=True, exist_ok=True) + # Rebuild from scratch so a re-run without --clean doesn't crash in copytree. + module_dir = dist_root / name + if module_dir.exists(): + shutil.rmtree(module_dir) + module_dir.mkdir(parents=True) _copy_package(package_dir, module_dir / "scripts" / package_dir.name) - license_src = REPO_ROOT / "LICENSE" + license_src = root / "LICENSE" if license_src.is_file(): shutil.copy2(license_src, module_dir / "LICENSE") - icons_src = REPO_ROOT / "icons" + icons_src = root / "icons" if icons_src.is_dir(): shutil.copytree(icons_src, module_dir / "icons", dirs_exist_ok=True) - installer_src = REPO_ROOT / INSTALLER + installer_src = root / INSTALLER if installer_src.is_file(): - shutil.copy2(installer_src, DIST_ROOT / f"{name}_drag_and_drop_installer.py") + shutil.copy2(installer_src, dist_root / f"{name}_drag_and_drop_installer.py") - _write_mod_file(DIST_ROOT / f"{name}.mod", name, version) + if dependencies: + if not platforms or not maya_versions: + raise SystemExit( + "[build] the project has runtime dependencies; pass --platforms " + "and --maya-versions so they can be vendored, e.g.\n" + " --platforms win64,linux,mac --maya-versions 2024,2025,2026,2027" + ) + vendor_rows = _vendor_deps(module_dir, platforms, maya_versions, root=root) + else: + vendor_rows = [] - print(f"[build] staged {name} {version} at {DIST_ROOT}") - return DIST_ROOT + _write_mod_file(dist_root / f"{name}.mod", name, version, vendor_rows) + + print(f"[build] staged {name} {version} at {dist_root}") + return dist_root def main(argv: list[str]) -> int: + """CLI entry point: parse args and stage the module tree. + + Args: + argv: Command-line arguments (excluding the program name). + + Returns: + Process exit code. + """ parser = argparse.ArgumentParser(description=__doc__) parser.add_argument( "--version", @@ -130,8 +346,27 @@ def main(argv: list[str]) -> int: parser.add_argument( "--clean", action="store_true", help="Wipe dist/ before staging." ) + parser.add_argument( + "--platforms", + default="", + help="Comma-separated platforms to vendor runtime deps for " + f"({', '.join(PLATFORM_TRIPLES)}). Required if the project has " + "runtime dependencies.", + ) + parser.add_argument( + "--maya-versions", + default="", + help="Comma-separated Maya versions to vendor runtime deps for " + f"({', '.join(MAYA_PYTHON)}). Required if the project has " + "runtime dependencies.", + ) args = parser.parse_args(argv) - build(version_override=args.version_override, clean=args.clean) + build( + version_override=args.version_override, + clean=args.clean, + platforms=[p.strip() for p in args.platforms.split(",") if p.strip()], + maya_versions=[m.strip() for m in args.maya_versions.split(",") if m.strip()], + ) return 0 From 83cd7263f111738d18a38552669e887cd6b5c930 Mon Sep 17 00:00:00 2001 From: Matthew Lee <{ID} {username}@users.noreply.github.com> Date: Wed, 12 Aug 2026 15:42:17 +1200 Subject: [PATCH 08/14] Fix mkdocs plugins config, replace {{SITE_NAME}} with a real value plugins: was nested under theme:, so search and mkdocstrings never loaded; mkdocstrings options also updated from the old rendering/watch keys. mkdocs.yml now carries a real site_name (same contract as pyproject.toml) so mkdocs build works on the template repo itself; initial_setup.py string-replaces the literal during setup. initial_setup also gains a root parameter and docstrings so its logic is testable. --- initial_setup.py | 91 ++++++++++++++++++++++++++++++++++++++++-------- mkdocs.yml | 23 ++++++------ 2 files changed, 89 insertions(+), 25 deletions(-) diff --git a/initial_setup.py b/initial_setup.py index 1db6be5..7ba1696 100644 --- a/initial_setup.py +++ b/initial_setup.py @@ -1,33 +1,87 @@ -from pathlib import Path import json import os import re +from pathlib import Path + -def replace_text_in_file(file_name, placeholder, replacement_text): +def replace_text_in_file(file_name, placeholder, replacement_text, root=None): + """Replace text in ``root / file_name`` (default: this file's directory). - to_process = Path(__file__).parent / file_name + Args: + file_name: Path of the file to edit, relative to ``root``. + placeholder: Text to find. + replacement_text: Text to replace it with. + root: Base directory to resolve ``file_name`` against. + """ - with open(to_process, 'r') as file: + to_process = (root or Path(__file__).parent) / file_name + + with open(to_process) as file: content = file.read() updated_content = content.replace(placeholder, replacement_text) - with open(to_process, 'w') as file: + with open(to_process, "w") as file: file.write(updated_content) + +def package_name_from(project_name): + """Derive an importable package name from the repo name. + + Separators are squashed out (e.g. 'my-cool-tool' -> 'mycooltool'); digits + are kept; a leading digit is prefixed with '_' since 'import 2dtoolkit' is + a SyntaxError. + + Args: + project_name: Repo name, lowercase-with-hyphens. + + Returns: + The derived package name. + + Raises: + SystemExit: If no letters or digits remain to build a name from. + """ + + formatted_project_name = re.sub(r"[^a-z0-9]", "", project_name.lower()) + + if not formatted_project_name: + raise SystemExit( + f"initial_setup: repo name {project_name!r} has no letters or digits " + "to build a Python package name from; rename the repo and re-run." + ) + + if formatted_project_name[0].isdigit(): + formatted_project_name = f"_{formatted_project_name}" + + return formatted_project_name + + def rename_python_src_directory(project_name): + """Rename ``src/mayapythonprojecttemplate`` to the derived package name. + + Args: + project_name: Repo name, lowercase-with-hyphens. + + Returns: + The derived package name. + """ - formatted_project_name = re.sub(r'[^a-z]', '', project_name.lower()) + formatted_project_name = package_name_from(project_name) - python_src = Path(__file__).parent / 'src' / 'mayapythonprojecttemplate' - python_src.rename(Path(__file__).parent / 'src' / formatted_project_name) + python_src = Path(__file__).parent / "src" / "mayapythonprojecttemplate" + python_src.rename(Path(__file__).parent / "src" / formatted_project_name) return formatted_project_name + if __name__ == "__main__": - user_name = os.getenv('USER_NAME') - project_name = os.getenv('PROJECT_NAME') - project_description = os.getenv('PROJECT_DESC') - project_title = project_name.replace('-', ' ').replace('_', ' ') if project_name else project_name + user_name = os.getenv("USER_NAME") + project_name = os.getenv("PROJECT_NAME") + project_description = os.getenv("PROJECT_DESC") + project_title = ( + project_name.replace("-", " ").replace("_", " ") + if project_name + else project_name + ) replace_text_in_file("README.md", "{{PROJECT_OWNER}}", user_name) replace_text_in_file("README.md", "{{PROJECT_TITLE}}", project_title) @@ -36,9 +90,18 @@ def rename_python_src_directory(project_name): replace_text_in_file("CONTRIBUTING.md", "{{PROJECT_OWNER}}", user_name) replace_text_in_file("CONTRIBUTING.md", "{{PROJECT_TITLE}}", project_title) replace_text_in_file("CONTRIBUTING.md", "{{PROJECT_NAME}}", project_name) - replace_text_in_file("mkdocs.yml", "{{SITE_NAME}}", project_name) + # mkdocs.yml carries a real site_name (not a {{...}} placeholder), same + # reasoning as pyproject.toml below: `mkdocs build` needs valid YAML with a + # real value to work on the template repo itself. + replace_text_in_file( + "mkdocs.yml", + "site_name: MayaPythonProjectTemplate", + f"site_name: {project_name}", + ) new_project_name = rename_python_src_directory(project_name) - replace_text_in_file("tests/maya/test_example.py", "{{PROJECT_NAME}}", new_project_name) + replace_text_in_file( + "tests/maya/test_example.py", "{{PROJECT_NAME}}", new_project_name + ) # pyproject.toml carries real values (not {{...}} placeholders) so the template # repo itself stays valid TOML for uv. Replace the wheel path before the project # name, as both contain the same literal. json.dumps produces TOML-safe strings. diff --git a/mkdocs.yml b/mkdocs.yml index b73aafb..155f184 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -1,4 +1,4 @@ -site_name: {{SITE_NAME}} +site_name: MayaPythonProjectTemplate theme: name: material language: en @@ -7,16 +7,17 @@ theme: primary: blue accent: teal - plugins: - - search: - - mkdocstrings: - default_handler: python - handlers: - python: - rendering: - show_source: true - watch: - - src +plugins: +- search: +- mkdocstrings: + default_handler: python + handlers: + python: + options: + show_source: true + +watch: + - src nav: - index.md From a5b99048dbbe5a88a1372f93a65d8704a83436e0 Mon Sep 17 00:00:00 2001 From: Matthew Lee <{ID} {username}@users.noreply.github.com> Date: Wed, 12 Aug 2026 15:42:27 +1200 Subject: [PATCH 09/14] Run CI on the template repo itself, add template machinery tests Static analysis and a new template-tests job now run unguarded (on this repo too); only Maya Docker tests, release, and initial-setup stay generated-repo-only. Static analysis widens from src/ to the whole repo. tests/template/ covers initial_setup, build_module staging, and release.py's version-bump logic with plain pytest; initial-setup.yml deletes it in generated repos. Includes ruff cleanup of existing files. --- .github/workflows/ci-main.yml | 6 +- .github/workflows/initial-setup.yml | 2 + .../workflows/reusable-static-analysis.yml | 11 +-- .github/workflows/reusable-template-tests.yml | 25 +++++ src/mayapythonprojecttemplate/example.py | 1 + tests/conftest.py | 2 +- tests/maya/conftest.py | 2 +- tests/maya/test_example.py | 3 - tests/template/conftest.py | 6 ++ tests/template/test_build_module.py | 95 +++++++++++++++++++ tests/template/test_initial_setup.py | 72 ++++++++++++++ tests/template/test_release.py | 69 ++++++++++++++ 12 files changed, 282 insertions(+), 12 deletions(-) create mode 100644 .github/workflows/reusable-template-tests.yml create mode 100644 tests/template/conftest.py create mode 100644 tests/template/test_build_module.py create mode 100644 tests/template/test_initial_setup.py create mode 100644 tests/template/test_release.py diff --git a/.github/workflows/ci-main.yml b/.github/workflows/ci-main.yml index 2525f48..d0ecd4f 100644 --- a/.github/workflows/ci-main.yml +++ b/.github/workflows/ci-main.yml @@ -1,3 +1,5 @@ +# Thin trigger wrapper, job logic lives in reusable-*.yml so ci-main and +# ci-release share it. name: CI on: @@ -10,9 +12,11 @@ on: jobs: static-analysis: - if: github.repository != 'matthewlee-dev/MayaPythonProjectTemplate' uses: ./.github/workflows/reusable-static-analysis.yml + template-tests: + uses: ./.github/workflows/reusable-template-tests.yml + tests: if: github.repository != 'matthewlee-dev/MayaPythonProjectTemplate' uses: ./.github/workflows/reusable-maya-tests.yml diff --git a/.github/workflows/initial-setup.yml b/.github/workflows/initial-setup.yml index 8ba5e4d..50d7d5d 100644 --- a/.github/workflows/initial-setup.yml +++ b/.github/workflows/initial-setup.yml @@ -62,6 +62,8 @@ jobs: run: | rm -f initial_setup.py rm -f .github/workflows/initial-setup.yml + rm -rf tests/template + rm -f PLAN.md - name: Commit and push changes run: | diff --git a/.github/workflows/reusable-static-analysis.yml b/.github/workflows/reusable-static-analysis.yml index be465de..02e4ced 100644 --- a/.github/workflows/reusable-static-analysis.yml +++ b/.github/workflows/reusable-static-analysis.yml @@ -13,7 +13,9 @@ jobs: fail-fast: false matrix: - python-version: ["3.10"] # maya 2024 + # Ruff's lint/format targets come from requires-python in + # pyproject.toml, not this interpreter version. + python-version: ["3.13"] steps: - uses: actions/checkout@v5 @@ -28,10 +30,7 @@ jobs: run: uv sync --only-group dev - name: Analysing the code with ruff - run: uv run --no-sync ruff check src + run: uv run --no-sync ruff check . - name: Checking formatting with ruff - run: uv run --no-sync ruff format --check src - - - name: Analysing the code with mypy - run: uv run --no-sync mypy src \ No newline at end of file + run: uv run --no-sync ruff format --check . diff --git a/.github/workflows/reusable-template-tests.yml b/.github/workflows/reusable-template-tests.yml new file mode 100644 index 0000000..dedf26d --- /dev/null +++ b/.github/workflows/reusable-template-tests.yml @@ -0,0 +1,25 @@ +name: template tests + +on: + workflow_call: + workflow_dispatch: # Manual trigger + +jobs: + + template-tests: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v5 + + - name: Install uv + uses: astral-sh/setup-uv@v7 + with: + enable-cache: true + python-version: "3.13" + + - name: Install dependencies + run: uv sync --only-group test + + - name: Run template tests + run: uv run --no-sync pytest tests/template diff --git a/src/mayapythonprojecttemplate/example.py b/src/mayapythonprojecttemplate/example.py index 5c64f92..7cb077a 100644 --- a/src/mayapythonprojecttemplate/example.py +++ b/src/mayapythonprojecttemplate/example.py @@ -5,6 +5,7 @@ def create_locator(name: str = ""): """Create a locator with the given name. + Args: name (str): The name to give the locator. diff --git a/tests/conftest.py b/tests/conftest.py index 543c6b8..fca2882 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,5 +1,5 @@ -from pathlib import Path import sys +from pathlib import Path import pytest diff --git a/tests/maya/conftest.py b/tests/maya/conftest.py index 4d196a4..0d38bba 100644 --- a/tests/maya/conftest.py +++ b/tests/maya/conftest.py @@ -3,7 +3,7 @@ @pytest.fixture(scope="session", autouse=True) def run_in_maya(): - from maya import standalone, cmds + from maya import cmds, standalone standalone.initialize() cmds.scriptEditorInfo(e=True, sw=True, se=True, si=True) diff --git a/tests/maya/test_example.py b/tests/maya/test_example.py index 4f92c6e..9abcc50 100644 --- a/tests/maya/test_example.py +++ b/tests/maya/test_example.py @@ -1,6 +1,3 @@ -import pytest - - # def test_create_locator_expects_locator_created(): # # Arrange # from {{PROJECT_NAME}}.example import create_locator diff --git a/tests/template/conftest.py b/tests/template/conftest.py new file mode 100644 index 0000000..15103fe --- /dev/null +++ b/tests/template/conftest.py @@ -0,0 +1,6 @@ +import sys +from pathlib import Path + +REPO_ROOT = Path(__file__).resolve().parent.parent.parent +if str(REPO_ROOT) not in sys.path: + sys.path.insert(0, str(REPO_ROOT)) diff --git a/tests/template/test_build_module.py b/tests/template/test_build_module.py new file mode 100644 index 0000000..5c16589 --- /dev/null +++ b/tests/template/test_build_module.py @@ -0,0 +1,95 @@ +from pathlib import Path + +from scripts.build_module import build + + +def _make_project(tmp_path: Path, *, name="footool", version="1.2.3") -> Path: + """Write a minimal project fixture (pyproject, src package, installer). + + Args: + tmp_path: Directory to write the fixture into. + name: Package/project name. + version: Project version. + + Returns: + The fixture root (same as ``tmp_path``). + """ + (tmp_path / "src" / name).mkdir(parents=True) + (tmp_path / "src" / name / "__init__.py").write_text("") + (tmp_path / "pyproject.toml").write_text( + f'[project]\nname = "{name}"\nversion = "{version}"\ndependencies = []\n' + ) + (tmp_path / "install_module.py").write_text("# installer\n") + return tmp_path + + +class TestBuild: + def test_stages_dist_tree_expects_expected_layout(self, tmp_path): + # Arrange + root = _make_project(tmp_path) + + # Act + dist_root = build( + version_override=None, + clean=False, + platforms=[], + maya_versions=[], + root=root, + ) + + # Assert + assert dist_root == root / "dist" + assert (dist_root / "footool" / "scripts" / "footool" / "__init__.py").is_file() + assert (dist_root / "footool_drag_and_drop_installer.py").is_file() + + def test_writes_mod_file_expects_name_and_version(self, tmp_path): + # Arrange + root = _make_project(tmp_path, name="footool", version="1.2.3") + + # Act + dist_root = build( + version_override=None, + clean=False, + platforms=[], + maya_versions=[], + root=root, + ) + + # Assert + mod_contents = (dist_root / "footool.mod").read_text() + assert mod_contents == "+ footool 1.2.3 footool\n" + + def test_version_override_expects_override_used(self, tmp_path): + # Arrange + root = _make_project(tmp_path, name="footool", version="1.2.3") + + # Act + dist_root = build( + version_override="9.9.9", + clean=False, + platforms=[], + maya_versions=[], + root=root, + ) + + # Assert + assert (dist_root / "footool.mod").read_text() == "+ footool 9.9.9 footool\n" + + def test_installer_copied_as_name_drag_and_drop_installer_expects_content_match( + self, tmp_path + ): + # Arrange + root = _make_project(tmp_path, name="footool") + + # Act + dist_root = build( + version_override=None, + clean=False, + platforms=[], + maya_versions=[], + root=root, + ) + + # Assert + installer = dist_root / "footool_drag_and_drop_installer.py" + assert installer.read_text() == "# installer\n" diff --git a/tests/template/test_initial_setup.py b/tests/template/test_initial_setup.py new file mode 100644 index 0000000..f2f4f6d --- /dev/null +++ b/tests/template/test_initial_setup.py @@ -0,0 +1,72 @@ +import pytest + +from initial_setup import package_name_from, replace_text_in_file + + +class TestPackageNameFrom: + def test_hyphens_are_squashed_expects_flat_name(self): + # Arrange + project_name = "my-cool-tool" + + # Act + result = package_name_from(project_name) + + # Assert + assert result == "mycooltool" + + def test_digits_are_kept_expects_digits_in_name(self): + # Arrange + project_name = "my-tool-2" + + # Act + result = package_name_from(project_name) + + # Assert + assert result == "mytool2" + + def test_leading_digit_expects_underscore_prefix(self): + # Arrange + project_name = "2dtoolkit" + + # Act + result = package_name_from(project_name) + + # Assert + assert result == "_2dtoolkit" + + def test_no_alphanumerics_expects_system_exit(self): + # Arrange + project_name = "---" + + # Act / Assert + with pytest.raises(SystemExit): + package_name_from(project_name) + + +class TestReplaceTextInFile: + def test_replaces_placeholder_expects_content_updated(self, tmp_path): + # Arrange + target = tmp_path / "file.txt" + target.write_text("hello {{NAME}}") + + # Act + replace_text_in_file("file.txt", "{{NAME}}", "world", root=tmp_path) + + # Assert + assert target.read_text() == "hello world" + + def test_replaces_real_literal_expects_mkdocs_site_name_updated(self, tmp_path): + # Arrange + target = tmp_path / "mkdocs.yml" + target.write_text("site_name: MayaPythonProjectTemplate\n") + + # Act + replace_text_in_file( + "mkdocs.yml", + "site_name: MayaPythonProjectTemplate", + "site_name: my-cool-tool", + root=tmp_path, + ) + + # Assert + assert target.read_text() == "site_name: my-cool-tool\n" diff --git a/tests/template/test_release.py b/tests/template/test_release.py new file mode 100644 index 0000000..6e3c855 --- /dev/null +++ b/tests/template/test_release.py @@ -0,0 +1,69 @@ +import pytest + +import release + + +class TestBump: + def test_patch_expects_patch_incremented(self): + # Arrange + version = (1, 2, 3) + + # Act + result = release._bump(version, "patch") + + # Assert + assert result == (1, 2, 4) + + def test_minor_expects_minor_incremented_and_patch_reset(self): + # Arrange + version = (1, 2, 3) + + # Act + result = release._bump(version, "minor") + + # Assert + assert result == (1, 3, 0) + + def test_major_expects_major_incremented_and_rest_reset(self): + # Arrange + version = (1, 2, 3) + + # Act + result = release._bump(version, "major") + + # Assert + assert result == (2, 0, 0) + + +class TestReadVersion: + def test_valid_version_expects_parsed_tuple(self, tmp_path, monkeypatch): + # Arrange + pyproject = tmp_path / "pyproject.toml" + pyproject.write_text('[project]\nversion = "4.5.6"\n') + monkeypatch.setattr(release, "PYPROJECT", pyproject) + + # Act + result = release._read_version() + + # Assert + assert result == (4, 5, 6) + + def test_missing_version_expects_system_exit(self, tmp_path, monkeypatch): + # Arrange + pyproject = tmp_path / "pyproject.toml" + pyproject.write_text("[project]\n") + monkeypatch.setattr(release, "PYPROJECT", pyproject) + + # Act / Assert + with pytest.raises(SystemExit): + release._read_version() + + def test_malformed_version_expects_system_exit(self, tmp_path, monkeypatch): + # Arrange + pyproject = tmp_path / "pyproject.toml" + pyproject.write_text('[project]\nversion = "not-a-version"\n') + monkeypatch.setattr(release, "PYPROJECT", pyproject) + + # Act / Assert + with pytest.raises(SystemExit): + release._read_version() From 949ca659063a46cbd5c810b6f67c5fc3f567ff16 Mon Sep 17 00:00:00 2001 From: Matthew Lee <{ID} {username}@users.noreply.github.com> Date: Wed, 12 Aug 2026 15:42:37 +1200 Subject: [PATCH 10/14] Drop mypy, keep maya-stubs for editor autocomplete Static analysis is ruff-only: mypy's value on cmds-heavy Maya code is low (stringly-typed, returns Any) and it caused most of the tooling friction. maya-stubs stays as a dev dep purely for IDE completion. --- pyproject.toml | 9 +- uv.lock | 265 ------------------------------------------------- 2 files changed, 2 insertions(+), 272 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index d23a32d..fbbc98b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -7,16 +7,11 @@ dependencies = [] [dependency-groups] test = ["pytest"] -dev = ["mypy", "maya-stubs", "ruff"] +# maya-stubs isn't used by CI; it gives editors cmds autocomplete/signatures. +dev = ["ruff", "maya-stubs"] # mkdocs<2 pinned: 2.0 drops the plugin system, breaking mkdocs-material/mkdocstrings. docs = ["mkdocs<2", "mkdocs-material", "mkdocstrings[python]"] -[tool.mypy] - -[[tool.mypy.overrides]] -module = "maya.*" -ignore_missing_imports = true - [tool.ruff] line-length = 88 diff --git a/uv.lock b/uv.lock index 9baec0c..8eb0187 100644 --- a/uv.lock +++ b/uv.lock @@ -6,70 +6,6 @@ resolution-markers = [ "python_full_version < '3.15'", ] -[[package]] -name = "ast-serialize" -version = "0.8.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e1/a9/11851c3e02a3fea2ddc9932d1fdc7d2edaeecc0d2e11bc5f2a7fde2b0934/ast_serialize-0.8.0.tar.gz", hash = "sha256:6c37c43e4004dfb42d321ddedc569dc17ff4259296f3af577c9ea46a809bc010", size = 845638, upload-time = "2026-08-07T11:29:02.152Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/34/16/6e520b57cd8c75914b38c670ad4593d13c22911e4306cc7165dab8b0789b/ast_serialize-0.8.0-cp314-cp314-pyemscripten_2026_0_wasm32.whl", hash = "sha256:3d822605fa7bb326ef868d25fafced7fc660fa46d9b90c02ea86d5e2f5d325f7", size = 863924, upload-time = "2026-08-07T11:27:34.579Z" }, - { url = "https://files.pythonhosted.org/packages/03/e1/48802de9b22a2bcad42ec80601a17e3f69172fe4f590e6311bcc2b323aeb/ast_serialize-0.8.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:2efa40b068197d5efb62655b43baadb842ed71c4958cccd3e8b86a35726f0119", size = 1177662, upload-time = "2026-08-07T11:27:36.196Z" }, - { url = "https://files.pythonhosted.org/packages/38/d4/323438db76bded3a1f3523a3167b8325916b2ddceb2107a330c6ec9fcf4d/ast_serialize-0.8.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:db1b957291bca08c7e72f43a12357b2948e20775d970e3fc3dac0aa3160ab725", size = 1167072, upload-time = "2026-08-07T11:27:37.646Z" }, - { url = "https://files.pythonhosted.org/packages/77/82/53c5400b54144b56de8ed7f957fd1ccd97e42482009292ab46121d15f8dd/ast_serialize-0.8.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fdc0d5b18ff8fb364e87923e47c0a91d0d69dbcaeaa274591f7fd26892cc3a3a", size = 1225497, upload-time = "2026-08-07T11:27:39.225Z" }, - { url = "https://files.pythonhosted.org/packages/44/5f/36c07327a8b91303fbf1382c7c3e8a2902072dbe1b9546138a5288e75ff0/ast_serialize-0.8.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9da7330f3e235bf7da89b8d39205c6350fc0c08a85379743f2df9fff87d6d980", size = 1227101, upload-time = "2026-08-07T11:27:40.799Z" }, - { url = "https://files.pythonhosted.org/packages/9d/48/5adf5c67addc7ddb328122208c6d375a84cf154984f412b4087330a157bd/ast_serialize-0.8.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f3186969ee66a9863b00acc6523ace44c56974eecb348a7ea4b228d9f0b80e19", size = 1424001, upload-time = "2026-08-07T11:27:42.708Z" }, - { url = "https://files.pythonhosted.org/packages/38/a1/70074dd3869d2b0e934f91891d8d6b734361cd3b80f85ca7ece2e668ecdd/ast_serialize-0.8.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:40a57b73731be45da4fa41430c4d5dc94a24b3a4faba7b9e069978c0402064ea", size = 1245545, upload-time = "2026-08-07T11:27:44.4Z" }, - { url = "https://files.pythonhosted.org/packages/e3/be/53b9c0a8a6399950c2e3546bdfab96d2b299d5b114b47eb94fd3c49c4054/ast_serialize-0.8.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5075b9da3ef807eda752502446dfecea3b381c4900b7e27a5d5f4f899eb39951", size = 1248961, upload-time = "2026-08-07T11:27:45.781Z" }, - { url = "https://files.pythonhosted.org/packages/eb/13/3651d3812548a2bda15e26e5dd51aadb48cf682d0865370255fcf0e367dd/ast_serialize-0.8.0-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:293cc1c5bfa741f8e3fbe8175b9c07beee487c9a6fdbb25a5acad9f1df2d30a9", size = 1243877, upload-time = "2026-08-07T11:27:47.325Z" }, - { url = "https://files.pythonhosted.org/packages/21/a0/521f0bf000f675e9312a4aae2c8ba7a992405d072a85c485e08fd59433b9/ast_serialize-0.8.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e0910c3442a75216dde0f102d854ba2aaa71d2482e0ee213630b9bf29584fba3", size = 1293903, upload-time = "2026-08-07T11:27:49.264Z" }, - { url = "https://files.pythonhosted.org/packages/b1/7e/402fc902568aa2ee65865a3e151f000db0153da8ce6b1be4c9c349025f8d/ast_serialize-0.8.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:43dd6d596879bb1cb8a12cc9dae7bb10090a39a35883026c24f82488a195619a", size = 1401070, upload-time = "2026-08-07T11:27:50.947Z" }, - { url = "https://files.pythonhosted.org/packages/ff/7c/97d4b66c057f1706fc8be6dd532cc77c988794357c8f4ffdb6adabb39562/ast_serialize-0.8.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:8c9d537f59e936392cfd3597789d1390304dd659efc3c486ce7f40fb6b8a9f53", size = 1502602, upload-time = "2026-08-07T11:27:52.364Z" }, - { url = "https://files.pythonhosted.org/packages/89/6f/72cc3b71562001bba46e898ccfbf1844f7939b3e28912736206102f2e5a8/ast_serialize-0.8.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:f0190a33d7f97c65e9069f7a7f40499eea6b5cbe260c558378109caf20ce934b", size = 1495848, upload-time = "2026-08-07T11:27:53.803Z" }, - { url = "https://files.pythonhosted.org/packages/a0/53/d6f629d1e49308b2f363dae028baa213ec222c9106fa1f7f0d1f7b41499a/ast_serialize-0.8.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:77308ae6c5cf5264cc0f01a7c556ec77a9e68eb1f61b093534d698139fdc3b14", size = 1556556, upload-time = "2026-08-07T11:27:55.342Z" }, - { url = "https://files.pythonhosted.org/packages/ee/22/340f35dd8dfc6d412d53dc20699ca014b8d228db923e8ed4759c512b162c/ast_serialize-0.8.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:8d53a23f27e1ed3a36b2d26fd2a1a6228c8e85a1ed62ff7cdb44bd610769f20a", size = 1417822, upload-time = "2026-08-07T11:27:56.712Z" }, - { url = "https://files.pythonhosted.org/packages/11/29/6dde5c13fbebc051d3a6df4ec0a6fd1d5359333cc1193f7f609f3410b4d8/ast_serialize-0.8.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ffa5e7cb08f96fed9121f77b224151e41caf88feab9d652bb46c78202b6fbeda", size = 1445153, upload-time = "2026-08-07T11:27:58.275Z" }, - { url = "https://files.pythonhosted.org/packages/62/c5/f473a8ed030f7a0ca24b9849cca184677a50c053867a7b808c2e1289bbd3/ast_serialize-0.8.0-cp314-cp314t-win32.whl", hash = "sha256:fa70ed4dea0bb18b30a1789c77baa701d0ef30c474f2ccabdea61e25623a8827", size = 1063711, upload-time = "2026-08-07T11:27:59.793Z" }, - { url = "https://files.pythonhosted.org/packages/23/63/39e171fcd38ca057c2e1979d5ee81ac7a3502784abe3d83df7454f7a0978/ast_serialize-0.8.0-cp314-cp314t-win_amd64.whl", hash = "sha256:d8b3c8eee4c1baef9d4e84d2a59a805501617127be42615cb48970b15b0892b6", size = 1103740, upload-time = "2026-08-07T11:28:01.405Z" }, - { url = "https://files.pythonhosted.org/packages/21/1c/d00762b399e7726d68d0a088cc946e3a4c60f1c6176f557608f672f627f3/ast_serialize-0.8.0-cp314-cp314t-win_arm64.whl", hash = "sha256:ac4f0a83c55a9b782f79ad55a5247b7db123c1db405959791c2ef886e9710c9f", size = 1076021, upload-time = "2026-08-07T11:28:02.947Z" }, - { url = "https://files.pythonhosted.org/packages/4c/11/911210c3c78923273a9211a2b6cfc4c8aa723b30dab3e1c8d19afb983b40/ast_serialize-0.8.0-cp315-abi3.abi3t-macosx_10_12_x86_64.whl", hash = "sha256:86b8a1e6d90467345356098b040150e82fbc26d24a7a202224b13dc1f6264ca0", size = 1177715, upload-time = "2026-08-07T11:28:04.654Z" }, - { url = "https://files.pythonhosted.org/packages/77/89/6282881c8587606638db153cbe21e1e0c4d1f3970dee1aa0610a1c62a026/ast_serialize-0.8.0-cp315-abi3.abi3t-macosx_11_0_arm64.whl", hash = "sha256:39e92ff8e8cb45947fe9007174b2950e1fb098e6abd00266a13cd3bcf6675068", size = 1169347, upload-time = "2026-08-07T11:28:06.1Z" }, - { url = "https://files.pythonhosted.org/packages/97/78/a9f846a03a340ff3728c915f23338ca742742f3292700559cdb3ad999b1e/ast_serialize-0.8.0-cp315-abi3.abi3t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c85d8d18db5b2dfcb3b7e38a4d600ca35504c0ed8a6f75cd1c811e4ffe248a15", size = 1225916, upload-time = "2026-08-07T11:28:07.654Z" }, - { url = "https://files.pythonhosted.org/packages/c0/15/aba6ef8a988a6eceb6f0359589aac509e29ae2dba67fd9bfd5af0c3f13e7/ast_serialize-0.8.0-cp315-abi3.abi3t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9830ff7e764f74d9eefb01170c61a9f0fd2c027dac5fcb72e064decd57d56371", size = 1227135, upload-time = "2026-08-07T11:28:09.504Z" }, - { url = "https://files.pythonhosted.org/packages/94/29/3f63d696ea7c5b8abadcecc3505be51bd900daaccc522ed8322fa5b05a93/ast_serialize-0.8.0-cp315-abi3.abi3t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6479d9722a4cd21b578f5478074c41e6169f04811996ec881655560f703a5bba", size = 1425040, upload-time = "2026-08-07T11:28:11.044Z" }, - { url = "https://files.pythonhosted.org/packages/e2/5d/0aac338604ff59df5774d4304307898982252f325ff7cafe31d52fedcb65/ast_serialize-0.8.0-cp315-abi3.abi3t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a63bed264e818cd83eec11feed0f50aa162542b91132ef58afebc857182763a5", size = 1246278, upload-time = "2026-08-07T11:28:12.519Z" }, - { url = "https://files.pythonhosted.org/packages/23/ca/9f1ef795bb724719532bd86dbec11e5b66857d3fbe9b6772baec0191a6ed/ast_serialize-0.8.0-cp315-abi3.abi3t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d187197d234aa45d6cfa2b096be5f666e8cc2e7eb3722d0ab8926293cf5720c", size = 1250029, upload-time = "2026-08-07T11:28:13.896Z" }, - { url = "https://files.pythonhosted.org/packages/dc/25/5e061372d2ed953b9ba3b9c4f73de3b8e9234cda3f6c088db4686801d0e1/ast_serialize-0.8.0-cp315-abi3.abi3t-manylinux_2_31_riscv64.whl", hash = "sha256:2d39a56282cfcc0d8eeea37267c754be59c98d48505c23b1dae5c6011f3813dd", size = 1243575, upload-time = "2026-08-07T11:28:15.37Z" }, - { url = "https://files.pythonhosted.org/packages/a8/c1/ae7da218053120635a4ca802366c69f707203641af95372eeb83f70dfd52/ast_serialize-0.8.0-cp315-abi3.abi3t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f7cc5f10386994c0f4844f1e6d6a97127e9b478660eb6dec2b257644f0acab64", size = 1294396, upload-time = "2026-08-07T11:28:16.813Z" }, - { url = "https://files.pythonhosted.org/packages/2e/89/271d1f49c5269fcddcc789ea3f25be401f6723fc1138aeda539f4d05516d/ast_serialize-0.8.0-cp315-abi3.abi3t-musllinux_1_2_aarch64.whl", hash = "sha256:6102f2f985c2e542be85cd857678ec9356fefa792b93cadfadd31139f5696f27", size = 1401987, upload-time = "2026-08-07T11:28:18.333Z" }, - { url = "https://files.pythonhosted.org/packages/55/be/4e7d77fcf571ac7cb5cf7115a20c36642bd7d29473b45dfaaefeb9618f90/ast_serialize-0.8.0-cp315-abi3.abi3t-musllinux_1_2_armv7l.whl", hash = "sha256:3a8660fe66667b76a6e9dccd1d33e66b229fde3b308db991c041609226c005b6", size = 1502904, upload-time = "2026-08-07T11:28:20.039Z" }, - { url = "https://files.pythonhosted.org/packages/8b/ae/ed1de2db7e019d4236fbc164ffa5ef9a6022a300a342bbf142d21b7c141e/ast_serialize-0.8.0-cp315-abi3.abi3t-musllinux_1_2_i686.whl", hash = "sha256:e7266307e5fba39836edb79def8608887af48820508bff3c5f2941e1e04d1534", size = 1496967, upload-time = "2026-08-07T11:28:21.734Z" }, - { url = "https://files.pythonhosted.org/packages/92/89/5fea507fae5c5f18b7dc7f95e5c00956574b8c717b8fd2049c504fab0b18/ast_serialize-0.8.0-cp315-abi3.abi3t-musllinux_1_2_ppc64le.whl", hash = "sha256:4ca7e6fd1ad845d1cc649dc2ecd499db2f8f46af5bf8da7b70dd858774cc038b", size = 1559041, upload-time = "2026-08-07T11:28:23.194Z" }, - { url = "https://files.pythonhosted.org/packages/42/71/478d69df21b64e064554a68134c94be304270316ca676a94e63c389a636a/ast_serialize-0.8.0-cp315-abi3.abi3t-musllinux_1_2_riscv64.whl", hash = "sha256:2880350b13d3eae69a0d70bc1fb6c9bfaca4dbd0e20ba8cd1aa483080b56ff06", size = 1417367, upload-time = "2026-08-07T11:28:24.601Z" }, - { url = "https://files.pythonhosted.org/packages/5e/2d/8962dc8d5b3a9dc27b36f9db199afa25264c741505469d9ec10ffbfd2ba7/ast_serialize-0.8.0-cp315-abi3.abi3t-musllinux_1_2_x86_64.whl", hash = "sha256:ab0f9a59f7d63d0d441b56b9a818b273705264352d5115cfee12e940e816d958", size = 1446178, upload-time = "2026-08-07T11:28:26.152Z" }, - { url = "https://files.pythonhosted.org/packages/4f/22/14d2ad4fd1d1bcd0dc687ca268e0630069f45162496260c0efb70ee0ea72/ast_serialize-0.8.0-cp315-abi3.abi3t-win32.whl", hash = "sha256:0485a25ef519c62e749ee3c1ad8070e591b380d67226349eb5a70b228dc1ac4a", size = 1063811, upload-time = "2026-08-07T11:28:27.864Z" }, - { url = "https://files.pythonhosted.org/packages/18/1d/84a327c0202a41aa5fdba3ade33904d6d8f3b9e6806fa83568d835395850/ast_serialize-0.8.0-cp315-abi3.abi3t-win_amd64.whl", hash = "sha256:bd84d60bca7079e741be4ac5dbe237751a59d7f6f9f0126b11880d63822cbe16", size = 1105518, upload-time = "2026-08-07T11:28:29.691Z" }, - { url = "https://files.pythonhosted.org/packages/8c/92/74556dec52fde85a2ad84ed159991b916241043788609c15d8b77e14570b/ast_serialize-0.8.0-cp315-abi3.abi3t-win_arm64.whl", hash = "sha256:057769b5921336eb2d9124f2a731b42ed05ffdac559b840dbdf6f3937cf153dc", size = 1076319, upload-time = "2026-08-07T11:28:31.282Z" }, - { url = "https://files.pythonhosted.org/packages/d1/5d/c650b1f2cc1e75193358da95a080261422e8cd10b66d7370b1688c9915c5/ast_serialize-0.8.0-cp315-cp315-pyemscripten_2026_5_wasm32.whl", hash = "sha256:a02cbed7d8bfdcdee88edaac12bd50d53d9953aaa2e1852ef078625be5f1c0b5", size = 852914, upload-time = "2026-08-07T11:28:32.929Z" }, - { url = "https://files.pythonhosted.org/packages/d9/e3/6142e920fec6ef7bccabd8c24ed8ed99f8bdc6cb8b065e1df7c6a3b2d667/ast_serialize-0.8.0-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:e1bd223df0f6c96b396975fa604cb33bce53d9b4a0185490be4c4a289f7c9c87", size = 1184007, upload-time = "2026-08-07T11:28:34.654Z" }, - { url = "https://files.pythonhosted.org/packages/a6/e9/6e8be8df02b35d85e2b8809f7f1cfa290bdf5882b55127a539d049482db0/ast_serialize-0.8.0-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:ddd3b61f45c132da66c5476b281891e08c1fd87fbdabe8a6973e1622efc85f06", size = 1177588, upload-time = "2026-08-07T11:28:36.318Z" }, - { url = "https://files.pythonhosted.org/packages/8c/80/7e0fd2e2e2aba257820db4a8657c4c356844d36b914b20a4af294bcfb902/ast_serialize-0.8.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f9caa63fad8241257ae401b5ff0a64026c6adb36b8e86cbe8782d9ea505daf6", size = 1234575, upload-time = "2026-08-07T11:28:37.772Z" }, - { url = "https://files.pythonhosted.org/packages/b0/6a/3bae0af06f9b1bae3001c44d64215f5b567877e7aae9ffd45db11c3a7647/ast_serialize-0.8.0-cp39-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3926fa117b5e65019853a2969966d11c7175af377a3425991f3fe73784412405", size = 1236015, upload-time = "2026-08-07T11:28:39.14Z" }, - { url = "https://files.pythonhosted.org/packages/6f/c4/ce2d41a1bc22508e82618901f7e10f2a5e2f9556553fea90624daf9875e2/ast_serialize-0.8.0-cp39-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:485f1113af805e9e170b95ef993ca3fbd4f89c04bab25c58b4fc632d854801ab", size = 1432808, upload-time = "2026-08-07T11:28:40.664Z" }, - { url = "https://files.pythonhosted.org/packages/1a/90/f5058f209756dd70e958b7538aaa82d25d24944baf9ec8ae6f27b06fcacc/ast_serialize-0.8.0-cp39-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3ccebbed24f1281062d5852353c72c47502955926cfcb8345ffb3a44d87ff3d3", size = 1256251, upload-time = "2026-08-07T11:28:42.223Z" }, - { url = "https://files.pythonhosted.org/packages/bf/32/7f77ea87fa0836daab706ed5cb7f903bb25fa26a77439011aee626af11d8/ast_serialize-0.8.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:252f883290d1cdb728eb7fe1d9a7221b88af5a329aae0bc91ddee4dafb820331", size = 1258574, upload-time = "2026-08-07T11:28:43.751Z" }, - { url = "https://files.pythonhosted.org/packages/eb/5a/75b82ad2725b5e8e8c742732f9e76c6738a292d0709e1f60d10a973730b4/ast_serialize-0.8.0-cp39-abi3-manylinux_2_31_riscv64.whl", hash = "sha256:96abc072ad29db8d02194afd47d68987322622787daceae82398d7b69f3ba2e6", size = 1254075, upload-time = "2026-08-07T11:28:45.28Z" }, - { url = "https://files.pythonhosted.org/packages/4e/54/8c20ed4eea805516a3fd23dd4a721ce28c64f50f0e4b359969f60a8c97a6/ast_serialize-0.8.0-cp39-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9118ad3e369727060b2696fc4078f250ecffca4248ba87f537f55cea9f9dce06", size = 1301018, upload-time = "2026-08-07T11:28:46.851Z" }, - { url = "https://files.pythonhosted.org/packages/cb/5b/9f14430f12fe830b656fb38f8e2e05ee13b02a88967660bef46af0ab22a8/ast_serialize-0.8.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:f359df4bd921918af8bebd142a376c77511d7151cc8ba852760b587b5a4a54f3", size = 1409951, upload-time = "2026-08-07T11:28:48.312Z" }, - { url = "https://files.pythonhosted.org/packages/2d/3d/084882eca93c842bd4262591a071ec7f825340644035e51501208cc5a8d4/ast_serialize-0.8.0-cp39-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:e94f9121d13fa36cbf21314783c77d05ae3a0868decd18cf5233fdcc6de49ac8", size = 1509544, upload-time = "2026-08-07T11:28:49.847Z" }, - { url = "https://files.pythonhosted.org/packages/ce/73/ea84852096c2036c61cc0b2f97b90242207419f534dc671060ee1c8e05cb/ast_serialize-0.8.0-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:54f95b486018d262bcb387a9afd96f0da74508b442762b80c769454a6fbb3ee3", size = 1505671, upload-time = "2026-08-07T11:28:51.239Z" }, - { url = "https://files.pythonhosted.org/packages/cb/88/287b9a5300c1f2f651d259f670931b63110adc265b7613c885b44c5bc53d/ast_serialize-0.8.0-cp39-abi3-musllinux_1_2_ppc64le.whl", hash = "sha256:4c38b915511e32bc718c49dbce98ff9af36bac0ad6a604f58000cd5e3aecdba7", size = 1563685, upload-time = "2026-08-07T11:28:53.112Z" }, - { url = "https://files.pythonhosted.org/packages/ee/f3/1bc3a79afcf0c2a8d2c37182d0d659d1545a9d7f7f6dc9cf3e63d6c17135/ast_serialize-0.8.0-cp39-abi3-musllinux_1_2_riscv64.whl", hash = "sha256:9a2ef9cf12f2de4f1028c42c1dd7d775255e0fb3e5bb48896c97e35ef52366fe", size = 1427977, upload-time = "2026-08-07T11:28:54.418Z" }, - { url = "https://files.pythonhosted.org/packages/5c/cd/440c798957e14e31776bfeb024d8fafe0bb1d5b89c51c2f067e69938f7b0/ast_serialize-0.8.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:6f18048fe9f6dd266bd577cdec48bdcecb74faaa01fe941324435483b013ed2a", size = 1454335, upload-time = "2026-08-07T11:28:55.968Z" }, - { url = "https://files.pythonhosted.org/packages/4f/4a/587eb36dcc240a54c8660f599464516b469ecad96f0dbdb6bccbedb50745/ast_serialize-0.8.0-cp39-abi3-win32.whl", hash = "sha256:31883542dd6c94d178f5db3d32fbd69c5eb88b3a7c018e7ac8cc0c45195ddbed", size = 1068858, upload-time = "2026-08-07T11:28:57.541Z" }, - { url = "https://files.pythonhosted.org/packages/5f/a4/3e887bbd92164e183cb6e412c6a3e9198ddd446d7fe405958293ef5ef49c/ast_serialize-0.8.0-cp39-abi3-win_amd64.whl", hash = "sha256:861794565b06337005c1447ef23103a3d5a627d08bdc827870d00d0b28ef5f51", size = 1111839, upload-time = "2026-08-07T11:28:59Z" }, - { url = "https://files.pythonhosted.org/packages/25/6c/b400476d3ceba681ab929787edc9554f6d88fcc69435eb681b00fc0457a5/ast_serialize-0.8.0-cp39-abi3-win_arm64.whl", hash = "sha256:b2a5978662fd4db463dfb4b974d2b10ac6430b98f5333aabc7051909df3561d0", size = 1083655, upload-time = "2026-08-07T11:29:00.349Z" }, -] - [[package]] name = "babel" version = "2.18.0" @@ -272,136 +208,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload-time = "2025-03-05T20:05:00.369Z" }, ] -[[package]] -name = "librt" -version = "0.15.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/36/9b/356320fbae2ac8467e21c5e73e1389c80468e4998c62cc7d3536cc51b614/librt-0.15.0.tar.gz", hash = "sha256:4e66cbe84437497d951b799d3e1551291b6fb3d643820a7014b3655d57a59162", size = 214338, upload-time = "2026-08-07T10:49:42.663Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/48/12/e2e9ca532cf5a0e08c9489826c4a35c6958c92ba0313fda70e8c6c3912be/librt-0.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e1a49adf16a7c9d9646816c2946135527197b6fcf4347c7b8b761cf1bfbf4489", size = 148673, upload-time = "2026-08-07T10:46:22.569Z" }, - { url = "https://files.pythonhosted.org/packages/6d/7c/02005e23478bd5950618d9712e0fd2b4c511657857f3efd8ba6a5feabcdd/librt-0.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:81a398f45b45a59200e13cd5ad1ae1d3f44334de98b148331afe2cdfee701c52", size = 153547, upload-time = "2026-08-07T10:46:23.931Z" }, - { url = "https://files.pythonhosted.org/packages/a0/90/d8848a735f5642077fc4b3b4bebcdb08edf10178e3add45597f5201a368f/librt-0.15.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4eafbaff06b9563f8b1c850621ce51605de05208e09d4d71ce490bc972b7b9e8", size = 494355, upload-time = "2026-08-07T10:46:25.122Z" }, - { url = "https://files.pythonhosted.org/packages/e1/0b/8604f41ea02feace490e9e405a338a15f9905369f55b239a9ce31c946f24/librt-0.15.0-cp310-cp310-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:b0411b4066db926b80258c60dcb0e6db4c9cee312eab45b7e8866b17ddf9ada1", size = 485459, upload-time = "2026-08-07T10:46:26.447Z" }, - { url = "https://files.pythonhosted.org/packages/a0/ac/84153bda1ce0da609182527ab92b40d961809e544eefdc5a1c2422971416/librt-0.15.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:febb1ce6cac545a54e6b769982824e955a700fdd9fbf3a08a3d82c990968b57d", size = 498398, upload-time = "2026-08-07T10:46:27.701Z" }, - { url = "https://files.pythonhosted.org/packages/2c/3a/5ca6cd282b2c244bec8ec84102e09773264e9c02891d56ab3a8f0e4d7083/librt-0.15.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b230acc1c3bfe2d6f2627ba2b95dc92e58aa494600e9722d0e6ccbc931e59702", size = 515474, upload-time = "2026-08-07T10:46:28.9Z" }, - { url = "https://files.pythonhosted.org/packages/73/d3/bd34110234779eb843c6ed66aba7c9b2091d3dd85989f1fb9922f564cb7a/librt-0.15.0-cp310-cp310-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:6da110e5f314c19ab8478464d02ae18808ae73d522c15260fa4918acdcd64da9", size = 509484, upload-time = "2026-08-07T10:46:30.124Z" }, - { url = "https://files.pythonhosted.org/packages/1b/6c/43c3f7f071d71631a7daa3b835ef2168ea39f20692d81464d4e47fbaa6d6/librt-0.15.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:eab9208b00ca55bf75983ec99f7bf13acc746a36102e98953addaad7f7ea1e1b", size = 532534, upload-time = "2026-08-07T10:46:31.511Z" }, - { url = "https://files.pythonhosted.org/packages/c5/1c/b854adf036ea817c40408873a5b794d65a91d9f0f39826f2ad2a2d5d7f48/librt-0.15.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:6c013cd3a1721e69e14380ada97eaa4b7b0cdf1c6b96fa765d4ea47c875088db", size = 537087, upload-time = "2026-08-07T10:46:32.734Z" }, - { url = "https://files.pythonhosted.org/packages/25/5c/c9a890e244e7dd725d3bd8b560e41f0aec787eaf343b46956a290ab7b841/librt-0.15.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:567b1c430f8bd560e689421468278ac5941bab4a05303b5d95b6ae10db03f451", size = 536575, upload-time = "2026-08-07T10:46:33.965Z" }, - { url = "https://files.pythonhosted.org/packages/5f/c5/c8e70b60b704299555f55db468eb46b1c81bfc60201ffbfe20407d89870c/librt-0.15.0-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:29c4cab9df457b19672c39be7f384ebb2bc925c4e2684b8780c222b43eb36389", size = 517142, upload-time = "2026-08-07T10:46:35.577Z" }, - { url = "https://files.pythonhosted.org/packages/56/d1/767a90c41f5d381b3195bc88ac0ec4afda35777c9c781e1f9848fedd965e/librt-0.15.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:bccbd8e5b0bffb7106cf18eb1baa3d7194b1cebb3b4b1cdbd4bdb19382a6ee6c", size = 558714, upload-time = "2026-08-07T10:46:36.829Z" }, - { url = "https://files.pythonhosted.org/packages/f9/b4/3c0624b8dc8301ab808f2b3a910995bcabe28df070fb9a0e5505ae997dae/librt-0.15.0-cp310-cp310-win32.whl", hash = "sha256:8ae493ed5f659a7761c43d42f183db514536073ded9bcf671d2d1df47e29a07e", size = 104426, upload-time = "2026-08-07T10:46:38.594Z" }, - { url = "https://files.pythonhosted.org/packages/31/98/e91c0382304bedb2db9c6801897319a9dcb68daac5e975819b562362f20d/librt-0.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:bc25fb356d0c7810bb49ff3df908ad1fda6995d660ab099ded69244ed7ab6053", size = 125057, upload-time = "2026-08-07T10:46:40.052Z" }, - { url = "https://files.pythonhosted.org/packages/59/52/06790ced2ac7117f890c21bda43c39c958ec82aa665c0718e821d33ff939/librt-0.15.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:823b92cf3c18ecd08afc70c42473888b41b6e8ef5046f3b82c05c154a2fa3d22", size = 148039, upload-time = "2026-08-07T10:46:41.165Z" }, - { url = "https://files.pythonhosted.org/packages/e7/1d/8e150b7fc449a1f33c8a760965cc1f43b14fc1577d9d0b50ab2701420e74/librt-0.15.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c70bc1b602cf59917e8f0c7a2cbc8bcc6fbc14d5486136b00707a79619121d63", size = 153067, upload-time = "2026-08-07T10:46:42.418Z" }, - { url = "https://files.pythonhosted.org/packages/51/87/a162bc5a66a35599dc619ecb215145f4de7d68e886b479b6d12593139f7c/librt-0.15.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:814ff83a25b5fce8b9c80c4dd803153fb5c5599fc74db9e022466938368957ef", size = 493087, upload-time = "2026-08-07T10:46:43.657Z" }, - { url = "https://files.pythonhosted.org/packages/e5/3a/aeea1fc620cf48060d3065b37614edbf97043c099d0f50782bc8ca61d897/librt-0.15.0-cp311-cp311-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:57f5eeb6ad4c180de583b1038e61fe5fbd9796bb69a8a1c1a0c7ddbec4c8c60f", size = 485608, upload-time = "2026-08-07T10:46:45.038Z" }, - { url = "https://files.pythonhosted.org/packages/52/ff/fe571ad416f0856fd0d5578ffc2e6dc531891e586e36b647bcf50569cab8/librt-0.15.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:82909c8f7eb9952656b65d3147afde4cf8e6d5a991eebc86418b5e65843b0ab8", size = 498723, upload-time = "2026-08-07T10:46:46.35Z" }, - { url = "https://files.pythonhosted.org/packages/0f/e1/7a65eb5dedb1f00aebd948cdd8e17add48bf066cab3514e9daf84ab45a6c/librt-0.15.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f779070399f991400fc451719e0ea388eb7de313388bada2c127a35de05f798a", size = 516002, upload-time = "2026-08-07T10:46:47.599Z" }, - { url = "https://files.pythonhosted.org/packages/5f/45/59832b0ebfbd08c2742e6ece372ceb53f18bf1faef5d33c8daf3abebf749/librt-0.15.0-cp311-cp311-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bac89069bc496ebdf4f79ebb57bbd10d0b214c8454225deb672d91002bd17e18", size = 508607, upload-time = "2026-08-07T10:46:48.873Z" }, - { url = "https://files.pythonhosted.org/packages/ea/0d/37fa73f3b43ebd8259f91ae9102a15e5a54e65d581e48dea72df3e81d7a4/librt-0.15.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e0d00c708fb2f5822b152429b1ac80a58dbbbc3f6c232c4d13a3f7fcf2ea5b4c", size = 530422, upload-time = "2026-08-07T10:46:50.45Z" }, - { url = "https://files.pythonhosted.org/packages/26/02/e046c6fe7a5881ac34623242192f484426ba8a75595fd18f22c53a3f530f/librt-0.15.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:6c6624fe268625869485553dd7cc1daf30d22558215bb2a4ff16f67a9801a31a", size = 534303, upload-time = "2026-08-07T10:46:51.693Z" }, - { url = "https://files.pythonhosted.org/packages/95/32/d5e6d861ab0366f3edf74f887ab0c9eb9f535aaf01d32b80b4f734daa179/librt-0.15.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f56b397858a23dacf35ede366ed2212fdc03a6a57a1ad36468ad6e9dc5fac091", size = 536084, upload-time = "2026-08-07T10:46:52.951Z" }, - { url = "https://files.pythonhosted.org/packages/2a/de/d69d725513fe53fc90c6d7a1f86e4428939bad2fb905b17fe4c18d413dde/librt-0.15.0-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:4388184646efe2054911c5b00a1077d6d1ee86a95b7e8ba96dc7850a809f3f40", size = 514307, upload-time = "2026-08-07T10:46:54.194Z" }, - { url = "https://files.pythonhosted.org/packages/36/93/f8aded0d6682b4f25820fa86e0690f87f01df9fd7bd09ddb04d9167ad021/librt-0.15.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:97335f59082f9fe2ce6c2a9cc6433a0114bbb6cd4d5c09dd76c95c68b9f9a8b0", size = 557686, upload-time = "2026-08-07T10:46:55.443Z" }, - { url = "https://files.pythonhosted.org/packages/74/09/ffeb6bdeb6cd862b4272fddc8ad05f938dd25d020ed517e631813917d80a/librt-0.15.0-cp311-cp311-win32.whl", hash = "sha256:83380ffde38062a2e9bb55d83e74474f6614665528b98a6928720fc006dfffbb", size = 104917, upload-time = "2026-08-07T10:46:56.605Z" }, - { url = "https://files.pythonhosted.org/packages/96/28/7e2313a3ffbf0b4de7ba3da58a09e488507b4bd1ea2b5e69378354a23415/librt-0.15.0-cp311-cp311-win_amd64.whl", hash = "sha256:f75720477ee05d509a310e856cacc8d909adc182f7b91193c207bcc26d7ee6db", size = 125886, upload-time = "2026-08-07T10:46:57.729Z" }, - { url = "https://files.pythonhosted.org/packages/39/9e/04b8c3cde014ef255ee785730425268354543acc38902093a40afa0dc164/librt-0.15.0-cp311-cp311-win_arm64.whl", hash = "sha256:256237037a3ab001ae8d9803b2d43562a4c3aa38739843694349e4d5ebb0fd56", size = 111885, upload-time = "2026-08-07T10:46:58.787Z" }, - { url = "https://files.pythonhosted.org/packages/ba/39/99c25030e782bdfb7a21be8c05254806a2e4bbb05c8d50c2a2130acbfa05/librt-0.15.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:e87bc679f86a99aa3b26e3c78eeb821a247c9a28eae48eaafcc32c3bf4c3bb9e", size = 151021, upload-time = "2026-08-07T10:47:00.057Z" }, - { url = "https://files.pythonhosted.org/packages/14/43/f4b1bd1b2888798a1409808889a25ea1ba49eaabce7d681ed27734c2df9d/librt-0.15.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:71599e011ac880e8e45d46047d714871894c7d4ab6f25626f8d4f89da21f368d", size = 155267, upload-time = "2026-08-07T10:47:01.311Z" }, - { url = "https://files.pythonhosted.org/packages/0c/db/3ad9c965c72f1e1d6beeec44ec10a54e17be8ae042fbb4baade16cbadced/librt-0.15.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c802434092b769b1d613ed2e13fac15fbfce1934a74bd10283b03c0fae231cd1", size = 503136, upload-time = "2026-08-07T10:47:02.45Z" }, - { url = "https://files.pythonhosted.org/packages/4b/07/5888a6d76acd62ebce66c61b74d94e9370b9c32929f111e487bb6546f8ed/librt-0.15.0-cp312-cp312-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:5500eeae393a184d14e1f35645962c27129d20c81afa4069e6ef826ebc2b3aaa", size = 496670, upload-time = "2026-08-07T10:47:03.675Z" }, - { url = "https://files.pythonhosted.org/packages/29/39/ab57cc2f5b276156da02bb7f5a8921bada1cb1993ffec99acf811c602c23/librt-0.15.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6ecfc32dfb46fb7b565bcd6abf9412acf978775a998273d22888a6d7953730dd", size = 513688, upload-time = "2026-08-07T10:47:04.981Z" }, - { url = "https://files.pythonhosted.org/packages/a7/b9/bdbb0b648b5c2befb031f4c6f3b1dd857415e8fb492a25a3c764a6681e6c/librt-0.15.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:89cc46cfd15022e35084355478c9ac809d90b1152222706ac9a7655ec21df6fa", size = 531904, upload-time = "2026-08-07T10:47:06.211Z" }, - { url = "https://files.pythonhosted.org/packages/93/26/473c2e4b6c104e9e58e27ce95fc8005c8bd4fc36cae4f254371125a92db8/librt-0.15.0-cp312-cp312-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d5f51401d102c885b9ca509e62c79b1dbff286e1b9b047fde6f763780789356d", size = 524427, upload-time = "2026-08-07T10:47:07.592Z" }, - { url = "https://files.pythonhosted.org/packages/26/60/03b3abb82b41714671b907bf6989b228e31e6a8af52dec82b5b0728dc250/librt-0.15.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:cc30523e3f1a23fb7511cc659834a0d01a1042bb9de359bc1c131cc4ec6c9656", size = 543155, upload-time = "2026-08-07T10:47:08.866Z" }, - { url = "https://files.pythonhosted.org/packages/f2/0e/9bb1f0a4affbd0a1888f4f79dc03ed2a299d9a2c26c59ab2a97dcbf11903/librt-0.15.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:59fe030d8ae4a57e3fb7756bf35a858de74e04066fc8555c53d0af979132af81", size = 546890, upload-time = "2026-08-07T10:47:10.327Z" }, - { url = "https://files.pythonhosted.org/packages/dc/84/6937a280d461f7de6e031ffb02edc2b7c3c90d49d630565ce8ff27cbc5f2/librt-0.15.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5a6526a2a956bbb1e4ae3568c82e650fc99119c66bb011ea60715744955a2b4d", size = 555163, upload-time = "2026-08-07T10:47:11.798Z" }, - { url = "https://files.pythonhosted.org/packages/bc/95/2a2853c1ee014bf102116e7f897a04beeaeb2461b45b79af98bdfb95f1ef/librt-0.15.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:85ea21ec6730194d67156b0e0b5430ccb1d61f8b8b907e39b37f9812b74a13f0", size = 535812, upload-time = "2026-08-07T10:47:13.279Z" }, - { url = "https://files.pythonhosted.org/packages/c9/4c/cf9601c1b4c5f09280acd5d83abdb2e68527a2be8257136eb42304218622/librt-0.15.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1e47b8ba865d7ede071a91a7163073bbaeb72541f1ef8a07d512c45c7b5007f2", size = 573688, upload-time = "2026-08-07T10:47:14.727Z" }, - { url = "https://files.pythonhosted.org/packages/47/6d/9ac7cbec46189a7625af4b5acbd25f10d827f4141b2002181848c8418923/librt-0.15.0-cp312-cp312-win32.whl", hash = "sha256:a5207ec414d1c4a2a7231b2086970dc036f94293cdf338190984958a013a42f1", size = 106138, upload-time = "2026-08-07T10:47:15.973Z" }, - { url = "https://files.pythonhosted.org/packages/38/d0/2ae99c83be86ce23f925ac1aeeedc777e97f427c4a8d190c70d0a16e9a87/librt-0.15.0-cp312-cp312-win_amd64.whl", hash = "sha256:73b30cfa976659b3917c8f6153bdb0591c6a9ec6583599fd24a689b690622022", size = 126974, upload-time = "2026-08-07T10:47:17.049Z" }, - { url = "https://files.pythonhosted.org/packages/5d/ef/dd24f9635c730b86b87587967dda7516b1845e8b17684603d31607fed598/librt-0.15.0-cp312-cp312-win_arm64.whl", hash = "sha256:a54cf9e0ef47b96af580849db5471142200568ce1e02cbf416addab551369570", size = 112292, upload-time = "2026-08-07T10:47:18.222Z" }, - { url = "https://files.pythonhosted.org/packages/e7/42/467b53a601b406ccd7b97c1fd54b59cb34f9185ad5ce7e9d5c3c4e8961c8/librt-0.15.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:db13ca398005abcbe538deda87b686d9bd08b7001cf40c4c06b444960ae10a26", size = 151029, upload-time = "2026-08-07T10:47:19.312Z" }, - { url = "https://files.pythonhosted.org/packages/3e/e6/36c2299b7a94b84fdd01220d8a777a71be5be0925bb0dbdf71c0a06a34d9/librt-0.15.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:aa1f1995789dca3698bc550aaceb09a51bd5df0a057ff84ff15296cd1975b801", size = 155194, upload-time = "2026-08-07T10:47:20.398Z" }, - { url = "https://files.pythonhosted.org/packages/c9/b6/ed5071f9325845e670bd36012757419767fbf56af77ed483077b9e4db541/librt-0.15.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:55456ea87d8df21808446d03817be2f65e20391c1c615d9187440dff28cd08dc", size = 502568, upload-time = "2026-08-07T10:47:21.652Z" }, - { url = "https://files.pythonhosted.org/packages/7f/81/6450c67c3615d87704bcbc21323fafc69c799b06a044c447529f725d4b01/librt-0.15.0-cp313-cp313-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:5a86a5a08c2235316bdb359d5dbb6ce0abfca7fac06363103e2c5af571d92f95", size = 496153, upload-time = "2026-08-07T10:47:22.925Z" }, - { url = "https://files.pythonhosted.org/packages/e1/d6/5f52b722bc75076954b3bfd49be15ea362df4d580c6fb315d0f617100d30/librt-0.15.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e56b6a368529bed262da40ce13f8fef590db0479819cca84f16a1f01ac356d0b", size = 513336, upload-time = "2026-08-07T10:47:24.213Z" }, - { url = "https://files.pythonhosted.org/packages/8d/e2/c08fd1d36ce63ea5a12b85c5d37f4550b5f86a692167e41e5a74222607ae/librt-0.15.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:234d8d394721fa0d786af15ebf1f3fb7f3ed82fd1cd0cde45c2f247b5d4281d2", size = 531661, upload-time = "2026-08-07T10:47:25.507Z" }, - { url = "https://files.pythonhosted.org/packages/3f/d8/d9482fcbeb177b9eb87bb3899eeb3b42be690313c652f9e146b1d0681fb2/librt-0.15.0-cp313-cp313-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d8363d7accb0286ac3a0e633f396e93800dafb8150494505daf9515bbda591f3", size = 524487, upload-time = "2026-08-07T10:47:26.79Z" }, - { url = "https://files.pythonhosted.org/packages/10/cc/075171517b41f861753034fbb151b42cfc83bcc853849f24f5e66fd60ccf/librt-0.15.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0f0ee3644d951f31055ad07d77d92520e84505dd7a432cc4cd501dd70ee06785", size = 543201, upload-time = "2026-08-07T10:47:27.999Z" }, - { url = "https://files.pythonhosted.org/packages/b0/03/42c2330f37eeb475b6affeedd06518f60035f323af3a839335e3fc9fef2d/librt-0.15.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2cfd1a81a648806e6a7717be4cc4d1bb392fa229752bf8444ba365e381e984d6", size = 546467, upload-time = "2026-08-07T10:47:29.396Z" }, - { url = "https://files.pythonhosted.org/packages/57/1e/1ad4c5638f7e64d8560328bd25c54b409a661bdb6ff254b38ff90744288d/librt-0.15.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:a6cd22c9da0d866558e46a041f1cc0c2bbb26b61b137b2347fa834c332e1d101", size = 555139, upload-time = "2026-08-07T10:47:30.815Z" }, - { url = "https://files.pythonhosted.org/packages/49/41/39fa7d15db1204cd1cbe6514680fbdc243adf754a0885061308f43afc013/librt-0.15.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:6d5225ef8801e4ea5e482fa9b5dfb891dd9ef6f6d870f1f25d449ca2c70ac218", size = 536050, upload-time = "2026-08-07T10:47:32.222Z" }, - { url = "https://files.pythonhosted.org/packages/1e/88/c6dcf0dd8e26dc0c9a499a2abab8646c86dcaf9ecea9524cb46d3686331a/librt-0.15.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6d28a05796b99f749bf8794f17ba9ba1612d0076b802e9cfc62c554634e9ce3b", size = 573700, upload-time = "2026-08-07T10:47:33.527Z" }, - { url = "https://files.pythonhosted.org/packages/1b/9b/ab54c71a7918a7c34fa5327fb61390a77446a07a146fbfb1165250a61035/librt-0.15.0-cp313-cp313-pyemscripten_2025_0_wasm32.whl", hash = "sha256:2067ff438048cead9d223ca5675bae2a25e520a7c3e6c1498bf9c6892d22caab", size = 82194, upload-time = "2026-08-07T10:47:34.835Z" }, - { url = "https://files.pythonhosted.org/packages/8d/b2/4f9a243bb892395f3becb80789ade13771701091f9f07ab8230247953ba8/librt-0.15.0-cp313-cp313-win32.whl", hash = "sha256:1cd3b721f24c206398b9e26da3c3a9c011e6e89d06f318ba8ebefc30f1003890", size = 106231, upload-time = "2026-08-07T10:47:36.251Z" }, - { url = "https://files.pythonhosted.org/packages/bf/af/64aff4885a40b93132382f2c314647d722574605416504379184ef3045ea/librt-0.15.0-cp313-cp313-win_amd64.whl", hash = "sha256:f395a4a9a03ac062dbe9a9f82e0c720502e590a38feee6a757bc82e9c63afbd8", size = 126996, upload-time = "2026-08-07T10:47:37.453Z" }, - { url = "https://files.pythonhosted.org/packages/27/83/335bccf6c7cb9028cb0b54aead27d9ece3f01f83bc6baa2abace5da655c1/librt-0.15.0-cp313-cp313-win_arm64.whl", hash = "sha256:0a15cb554761247d84a3ec0cbdf4078d70725384f0e4662c0fa3b26266eb60ad", size = 112188, upload-time = "2026-08-07T10:47:38.729Z" }, - { url = "https://files.pythonhosted.org/packages/a8/93/949053fb462eecc4a9a5ee770a81f4b40be7b79538b245545d4aebc6b58b/librt-0.15.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:f5de7feedc56337a088eb15cd9fafa9938367362221d8cc62c642b7f94821993", size = 149833, upload-time = "2026-08-07T10:47:39.86Z" }, - { url = "https://files.pythonhosted.org/packages/61/ca/8281aa6cd560a3420e4497729f6b704b53be3eeaaef82d5aeadddaf7441f/librt-0.15.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:6c0eb900c0e91f4aebe680845242e614f1864edfd44106380d0752ac29522bf8", size = 154088, upload-time = "2026-08-07T10:47:41.065Z" }, - { url = "https://files.pythonhosted.org/packages/dd/02/1a1662dceaba6a086360891448d5ce9a7d3555976cae59a31a39d744b9c7/librt-0.15.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e8c9a650a188e38bac005048cbe6342e81407782944d01934540ab75e417df21", size = 494215, upload-time = "2026-08-07T10:47:42.388Z" }, - { url = "https://files.pythonhosted.org/packages/69/84/99211619dc656370a3740c33d2b0b6d5a3fb1e73689314f6ed477a397dc4/librt-0.15.0-cp314-cp314-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:92bfed8deec93df30286b9fe9e3b1dd17329cc076a192b4ee5ec223841d54953", size = 491173, upload-time = "2026-08-07T10:47:43.683Z" }, - { url = "https://files.pythonhosted.org/packages/d4/aa/5448d0b05f4579b635d3899176817ebf561af0e57bacd425b5b1887264c1/librt-0.15.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ec4b19788f835711a2072f9dbe6b03b3bf32ed1f0fb30cf399bdd59d9f0c33fa", size = 505512, upload-time = "2026-08-07T10:47:45.314Z" }, - { url = "https://files.pythonhosted.org/packages/95/82/01940e40b83c43a546c4a3c896cf34ca272a9690899d55914e4827b3dcce/librt-0.15.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d4c7bacb70930f3d0a56f4ecf1be474a1f0d941b01dd73b756f3c256d42cb879", size = 523073, upload-time = "2026-08-07T10:47:46.66Z" }, - { url = "https://files.pythonhosted.org/packages/88/fa/759c0030f3ee371439eb26de34fc745807caf0abb878af7af4b8b7c3dd3d/librt-0.15.0-cp314-cp314-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3e79f05e4a08b4d880342673312bbc895b56df7765605796f15902eb5367d3ae", size = 515080, upload-time = "2026-08-07T10:47:48.319Z" }, - { url = "https://files.pythonhosted.org/packages/0b/27/894e072228fcb159703c655da69f8cd10dbed489c36e3df7dd032a2483be/librt-0.15.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:a417149c0cba4d50b61e992e5a15e69eaf96746609b461cc4ed168aeef6b79dd", size = 534164, upload-time = "2026-08-07T10:47:49.875Z" }, - { url = "https://files.pythonhosted.org/packages/98/a3/0078e91c1f36f8815db17827de15650b9a3fe56c55fbf998c854b34e40d3/librt-0.15.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:da7a94d6a3411f579d72aa3e3bc5fbca7ed4549f3dbd7e5de3aa567333374285", size = 540616, upload-time = "2026-08-07T10:47:51.408Z" }, - { url = "https://files.pythonhosted.org/packages/86/33/81a29b796dd52a45e9ef7974c7732926e8f10f15b8d2be505665979f896d/librt-0.15.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:856f743ae607f2c1380eccb566c0038a9fb3eabf0fc2be2704d76d9f73557239", size = 545890, upload-time = "2026-08-07T10:47:52.818Z" }, - { url = "https://files.pythonhosted.org/packages/05/82/8be1baa1350e5d30cfd70ae79d0a6f4dc5862ef47f7bb2808aabc9bb86e5/librt-0.15.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:779a6e7c894737e5983e7790a9c78c4000c30e23c9aada08081bdbea53b0fa60", size = 523287, upload-time = "2026-08-07T10:47:54.165Z" }, - { url = "https://files.pythonhosted.org/packages/c6/4f/d1be6a01a35c20ef734e0e44113f87d4af756a9354a89dcfbe3b4f8af5e1/librt-0.15.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:96bb17dbe8bab3c0954fbebfc69ed395599de75b6bbc35e3270a878e15d4dd65", size = 565868, upload-time = "2026-08-07T10:47:55.566Z" }, - { url = "https://files.pythonhosted.org/packages/67/88/649cfa33f5825927b160610f670bdab012a64d627eddb94fa795ea4292fd/librt-0.15.0-cp314-cp314-pyemscripten_2026_0_wasm32.whl", hash = "sha256:7220697efaa6e5348fc3d18ee7f8563d4bfecd9872b37ffb915bfc1d08840622", size = 81619, upload-time = "2026-08-07T10:47:56.886Z" }, - { url = "https://files.pythonhosted.org/packages/22/31/8e88a8d5e48fc8d1a817787fb6811dfff6499acd6c8683dd83934aa6ede0/librt-0.15.0-cp314-cp314-win32.whl", hash = "sha256:f54598964d357b1c5ab77cf5d92f21e598fe0e23cdbe9618480807f81b4eba15", size = 100138, upload-time = "2026-08-07T10:47:58.093Z" }, - { url = "https://files.pythonhosted.org/packages/80/92/20fd6c4b6a1b1a564b076d55cd3d427d8428217d7638dc25a654cc4791d4/librt-0.15.0-cp314-cp314-win_amd64.whl", hash = "sha256:3ff5893a2c23d886aa9ce786de5ac6ddc74aeeaf90743682b74d920e117d2e28", size = 121258, upload-time = "2026-08-07T10:47:59.564Z" }, - { url = "https://files.pythonhosted.org/packages/fc/28/6af430b44d9ebb897b865a3c363b6dcace51357be2347cc0f8f869656a86/librt-0.15.0-cp314-cp314-win_arm64.whl", hash = "sha256:3722a099730704c9a3d70c879fc0f51daec25fe5f1555672d97bc595abeafb95", size = 106467, upload-time = "2026-08-07T10:48:01.097Z" }, - { url = "https://files.pythonhosted.org/packages/7e/aa/b42bb798942ced219f6d63b27e07f91237887a8d0bd0921666db79a13790/librt-0.15.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:38c0c7d4b6fc06c3324b3f9162c8391bfc4fd9dde53afe1033ce7edb48d5a714", size = 159523, upload-time = "2026-08-07T10:48:02.442Z" }, - { url = "https://files.pythonhosted.org/packages/75/03/1b53cd4ef904e73b1d828a5f90143bf94a2967d7cfff0b9ccf93e12aa9b4/librt-0.15.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:8b2fdd7ead3c995c37940a790690660d0ca006c302db26cc51933f6766866fc3", size = 161638, upload-time = "2026-08-07T10:48:03.725Z" }, - { url = "https://files.pythonhosted.org/packages/ac/c4/9f9c9fba097d49e9e694c2b4dc331df31884645ecbc58a93b4b5fc69d2c5/librt-0.15.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2fde98cf1fc4bac144ce23c2c4c017b924ba714509ea9334977b0b27050c837d", size = 701795, upload-time = "2026-08-07T10:48:05.135Z" }, - { url = "https://files.pythonhosted.org/packages/4c/05/0966840bda0380c8ae167b9043c6230202941cc90ea29c48e096964c765e/librt-0.15.0-cp314-cp314t-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:e3b461183c5fa7681b48560f91515f53a953122fb30c71e07abc67d7ddf58c38", size = 682147, upload-time = "2026-08-07T10:48:06.555Z" }, - { url = "https://files.pythonhosted.org/packages/18/af/1c47ca573c30ea47d195aec26133af522fea1104afaace028d7b32247ea8/librt-0.15.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4bbcc257e3babea20a91715c361b24554ec4e8f51aa578568afc230799fe1a19", size = 696397, upload-time = "2026-08-07T10:48:08.03Z" }, - { url = "https://files.pythonhosted.org/packages/2e/0f/1aed6223d4f9f9d1171a8596ff100ea4c3f7699fea7a4ba657c3e60daa6c/librt-0.15.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b845b8d48088fad0cadc84be4b8fda63203be7e9237b71015b3925443c1f35ab", size = 722542, upload-time = "2026-08-07T10:48:09.569Z" }, - { url = "https://files.pythonhosted.org/packages/c6/22/9e3a929aea456c97d69e6ef3884efea56d4807f97399471cc946baebd8af/librt-0.15.0-cp314-cp314t-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b30e600e8f337b9bd7f39b86d9fdfedc73cc46e3d0f745931a23a234220bb7e2", size = 729709, upload-time = "2026-08-07T10:48:11.129Z" }, - { url = "https://files.pythonhosted.org/packages/e9/1b/c327ef6018e3a9ca0b8e7c5eddeeb331ba8f9b76c24e126d37d0f6d62faf/librt-0.15.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:64b0c8c35aa4c4ed79896359f3e0b285cbe4e610042106500da4811c322cc108", size = 752891, upload-time = "2026-08-07T10:48:12.558Z" }, - { url = "https://files.pythonhosted.org/packages/d7/d1/d5f1ea02c56930087009e39db9b70660a663e76c730b27b925d786718457/librt-0.15.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:0da0d94cb802f32a0524653e7201f2cef72d5f700a5407678f5290483d4fcd08", size = 745301, upload-time = "2026-08-07T10:48:14.55Z" }, - { url = "https://files.pythonhosted.org/packages/d9/3c/5f7c585d15ebb2250c73e7c0ee4e9e47be72c65d520c07ddbcdc62037674/librt-0.15.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:4a6369168d371207339b1e50d4532b06a7121586141f82599505a3f315751d47", size = 747921, upload-time = "2026-08-07T10:48:16.453Z" }, - { url = "https://files.pythonhosted.org/packages/7f/52/1443a446486eba966bcbca1696b472e4f210320ec42f490a47f48fbf0fdc/librt-0.15.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:c434e072557ade9cbc642d052c89d031efe47d5c9614523619d0d74a02378e81", size = 727561, upload-time = "2026-08-07T10:48:18.089Z" }, - { url = "https://files.pythonhosted.org/packages/79/91/2270a9380f11725cf83ce1925a5e32dd1dde2be9bba597f25c10a38644e7/librt-0.15.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:c7eec6a42018bc1d45763b1c162d3d2bf7c3b9a1b0ed30d3e91dcba390efefcc", size = 774417, upload-time = "2026-08-07T10:48:19.611Z" }, - { url = "https://files.pythonhosted.org/packages/9e/3b/f4b1548d4f5b99186737fe27aec238e9823e8d5d23bf4df007c030689dc5/librt-0.15.0-cp314-cp314t-win32.whl", hash = "sha256:6912fa5e635d74529ac7cdb1bdf6ca3af4453da8d1edbe0110ee1cb4ad407ebf", size = 104381, upload-time = "2026-08-07T10:48:21.048Z" }, - { url = "https://files.pythonhosted.org/packages/80/b6/134afad262def1de04c0843c376d02135f1168af43f22e09a52bd8394727/librt-0.15.0-cp314-cp314t-win_amd64.whl", hash = "sha256:8e11699ed745931c395acd3621b07062e0f840efa6935aad87a64ed0995f0915", size = 127034, upload-time = "2026-08-07T10:48:22.561Z" }, - { url = "https://files.pythonhosted.org/packages/99/5f/1b6846b20572bd699c9e9ec321a5f781845bee477df2aa2a43b28bc40119/librt-0.15.0-cp314-cp314t-win_arm64.whl", hash = "sha256:5d2a91724463bfed4f573cd7a9fdc856d2e230d0c0e5a61416a93481dccd8605", size = 110827, upload-time = "2026-08-07T10:48:23.804Z" }, - { url = "https://files.pythonhosted.org/packages/c6/44/4de9f4ddadb009a55c7758eb5736d62534a7daaf27bd71bc50e64b606b06/librt-0.15.0-cp315-cp315-macosx_10_15_x86_64.whl", hash = "sha256:8443e38dcfcfdbcf5add5118c623efd788d65ac2e25756d6251a54a06a4d0aca", size = 149843, upload-time = "2026-08-07T10:48:25.148Z" }, - { url = "https://files.pythonhosted.org/packages/1f/eb/5d9ab71e30119c44094e0275f38b47dd327aea0f843a080396677029d508/librt-0.15.0-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:6d15a29033c57490cfe2069097c6fc4049e4e65ffbb749be7dc453b7c4c68965", size = 154510, upload-time = "2026-08-07T10:48:26.485Z" }, - { url = "https://files.pythonhosted.org/packages/d0/9c/8505d1b8f5e8c19587bd03f7429993b3e9ce5c06819d856bfb11d919374c/librt-0.15.0-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d2c05c729b589e734c09578bf5964be48a911765484840d017bbc84f49d4c4ad", size = 497543, upload-time = "2026-08-07T10:48:28.045Z" }, - { url = "https://files.pythonhosted.org/packages/1d/9a/3a8390775cb095765aded027ac9c63e7c8ea74e731498607544c6505de0e/librt-0.15.0-cp315-cp315-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:fa60887537e1d0cd2d9982269d33a709bf54b195cd2b9364fc0a758022af5bd9", size = 480452, upload-time = "2026-08-07T10:48:29.531Z" }, - { url = "https://files.pythonhosted.org/packages/e7/40/258a4a7117ee915d66de5cd9b8ade65a440993161107ce3a686f1859955c/librt-0.15.0-cp315-cp315-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d8bc24219b24c0af375718942ab75e3544b2763085f40f965be4326734ae8328", size = 507768, upload-time = "2026-08-07T10:48:31.007Z" }, - { url = "https://files.pythonhosted.org/packages/6b/c6/2f4dd296c97a0b85b98894519b279408ec9dd602d4f692b1ea0e25dee670/librt-0.15.0-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:86a21a7bd3fe3a419512ef424cc1c020f6771d0b29cfddff36d1635a855e63f0", size = 525122, upload-time = "2026-08-07T10:48:32.7Z" }, - { url = "https://files.pythonhosted.org/packages/49/dd/29eab42be13b2bf0ea8cb227135a45d44693e30a7e8b92871981ff56b82b/librt-0.15.0-cp315-cp315-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:dbab647e88d90b3167b91efe7091e248653688ed4337e4f90907a722c7361bb9", size = 520371, upload-time = "2026-08-07T10:48:34.294Z" }, - { url = "https://files.pythonhosted.org/packages/91/ed/4bad71adeca8fe208b775c2a35417fa5a2584c8f4791daaf89a89450fea1/librt-0.15.0-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:d8edcf6f550e918dca779c069b9e156385c60b406f99fc7641f32c52f7193659", size = 537258, upload-time = "2026-08-07T10:48:35.88Z" }, - { url = "https://files.pythonhosted.org/packages/4c/63/59dba6143fdcc7240c54458b629f3250000a61b8945890fc9efd451b19c5/librt-0.15.0-cp315-cp315-musllinux_1_2_i686.whl", hash = "sha256:8b62076030baa2d8b1501a46bf0e19c27a489aa90671c55665bff7887f7660b0", size = 527432, upload-time = "2026-08-07T10:48:37.466Z" }, - { url = "https://files.pythonhosted.org/packages/ec/21/21a24c6a2327d8362580efebe77286bf47b0f4062ec5ea41766e609d3c7d/librt-0.15.0-cp315-cp315-musllinux_1_2_ppc64le.whl", hash = "sha256:d00d20d1818e82a07a0ee0aa89a98b17ed7916b92441090b683719cb20a59b6d", size = 548108, upload-time = "2026-08-07T10:48:39.384Z" }, - { url = "https://files.pythonhosted.org/packages/5a/6d/fc68c89a7971418b41f9a873623ff935cb864097544c6a2f8ce491c8ef5d/librt-0.15.0-cp315-cp315-musllinux_1_2_riscv64.whl", hash = "sha256:4e6ee93fc3cf848dcbf0cce2eca73d8e7dcd0cc2b6df3a529d57750b30a4c55c", size = 529681, upload-time = "2026-08-07T10:48:41.392Z" }, - { url = "https://files.pythonhosted.org/packages/65/7e/c2d98766124400d722063a630b0fde38a9fc768705d37eecca15c47dc192/librt-0.15.0-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:32896a0af72508ea979e0acb4e4c04cbeeae04938167950d535c83c45597167d", size = 567736, upload-time = "2026-08-07T10:48:43.124Z" }, - { url = "https://files.pythonhosted.org/packages/55/6c/f8c34a95e3a515c6e1c192b89511e7253c89a7760c6b500d57ffdb8d2dc8/librt-0.15.0-cp315-cp315-pyemscripten_2026_5_wasm32.whl", hash = "sha256:ec3ba415afaf951f6951b1dd16d3c8e4f540065fc382d7e70b823a79567ca374", size = 81673, upload-time = "2026-08-07T10:48:44.645Z" }, - { url = "https://files.pythonhosted.org/packages/c9/9e/e23fa8e78679ec45728188650b39e8ff476c83b691c96f749217df3b1b7c/librt-0.15.0-cp315-cp315-win32.whl", hash = "sha256:d2813ba2503764f0450680c533d13df7cff9b49df1411062eded5f67db4195b9", size = 100081, upload-time = "2026-08-07T10:48:46.171Z" }, - { url = "https://files.pythonhosted.org/packages/e1/dc/3eb4c5e297343f0620a55532cd7c8d764d3001fa2159212dadf480464827/librt-0.15.0-cp315-cp315-win_amd64.whl", hash = "sha256:b87d67e33afaf265262f2a66db578284b88ee2e6fcd224579cb5c15518677ad8", size = 121228, upload-time = "2026-08-07T10:48:47.631Z" }, - { url = "https://files.pythonhosted.org/packages/97/70/43abce19f04e49762f8ec834c8fafee13cc40fd6b94a72a24e534febfcd0/librt-0.15.0-cp315-cp315-win_arm64.whl", hash = "sha256:713bd7df21170b982e729e46870f31d6b437bd1a9b4648cffb529bd3c2ec5c4b", size = 106487, upload-time = "2026-08-07T10:48:49.095Z" }, - { url = "https://files.pythonhosted.org/packages/de/15/83f2deddb9368b8951ec8c9477269b5b9b8bd9bbf15e57402d0f38817dca/librt-0.15.0-cp315-cp315t-macosx_10_15_x86_64.whl", hash = "sha256:3de789c82752730f94782a5ee518baf9c05edf85733aeaf73bb6e518755cdf54", size = 159448, upload-time = "2026-08-07T10:48:50.649Z" }, - { url = "https://files.pythonhosted.org/packages/06/bf/043097353f9b3c73b583d07f6b8e552795463f4bfc8caf85e42eee50c26a/librt-0.15.0-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:e0b5deec9a8664eb722c797241970fd4aa1894d25fda36a1ddac0f7407606bd6", size = 161686, upload-time = "2026-08-07T10:48:52.174Z" }, - { url = "https://files.pythonhosted.org/packages/f4/2a/8ae77f9719d42ce71cd708560a3557b38ac3c17a0383e57f87084de45bbe/librt-0.15.0-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5563302a8359bc2295bb7084d1a8ed1519df96afb30eb2aa4e0bff7b54228988", size = 710668, upload-time = "2026-08-07T10:48:53.782Z" }, - { url = "https://files.pythonhosted.org/packages/61/34/c0436ea134deb9a0d6da80a396a2739a81cb31e0418f7227239e23140898/librt-0.15.0-cp315-cp315t-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:22d6263b9d39d7bbb286fa791945646e3218f1be2d693e36fb630f1d0e59cd13", size = 679396, upload-time = "2026-08-07T10:48:55.645Z" }, - { url = "https://files.pythonhosted.org/packages/4a/9f/001e0d99aa9250d5cd5715a9081291a20656083459f9019cda15255329e1/librt-0.15.0-cp315-cp315t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:39ffd14646190c454f0d86e0d256b33f00a87a26ab410e619773b841d0e41416", size = 704313, upload-time = "2026-08-07T10:48:57.46Z" }, - { url = "https://files.pythonhosted.org/packages/2d/53/b34fa9d0ff00f136f4d58ebb4c411ff634baed1eb412bb602a2bc8dcafcb/librt-0.15.0-cp315-cp315t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c47318cd3a61401452de11282242937e3e057c4fd3dbaf601e269d0928a06c0a", size = 729847, upload-time = "2026-08-07T10:48:59.231Z" }, - { url = "https://files.pythonhosted.org/packages/86/ac/fa4d7a424665040e95baf480a6d523446057684b6758624c85338e8a23b2/librt-0.15.0-cp315-cp315t-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a56a1d4f859a82ca5b99fc4b82c9b027b15e3c455c5cd99e7d0719f27bb20b6c", size = 742736, upload-time = "2026-08-07T10:49:01.151Z" }, - { url = "https://files.pythonhosted.org/packages/8a/f1/e17a9bb5de6fb8c3186ed1a7d68d21618b027ac2d3633e03d3b6109c67ae/librt-0.15.0-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:077471b3182db4e17c36ae91555f36a4d2c00080b267f749bcad34a478a9a302", size = 763454, upload-time = "2026-08-07T10:49:03.039Z" }, - { url = "https://files.pythonhosted.org/packages/1d/ec/ecd02cd30935b931b9cdbfed6ab5a099c51b280b4e7baa274da80978ed27/librt-0.15.0-cp315-cp315t-musllinux_1_2_i686.whl", hash = "sha256:411ca4d1b905b860ceba7570dd6717a71dedaddcc4b0f77ece710aa41ee11f8d", size = 743296, upload-time = "2026-08-07T10:49:04.941Z" }, - { url = "https://files.pythonhosted.org/packages/e6/b5/b3c2b8353ce820a4854f78d19321344242f89fa71c975b71132ba9bf242a/librt-0.15.0-cp315-cp315t-musllinux_1_2_ppc64le.whl", hash = "sha256:1256589e0b0adb31751d685a68bce29d73407ddf4ef05d4188f49d5dcf9566d9", size = 756217, upload-time = "2026-08-07T10:49:06.825Z" }, - { url = "https://files.pythonhosted.org/packages/3c/52/6cc22542ba59146b05cca2a656f9ff8bb67e38e63d12c3b0cc183d837bf1/librt-0.15.0-cp315-cp315t-musllinux_1_2_riscv64.whl", hash = "sha256:f42b74a53e5f26a0ba0007411a7455b66c67ce4022a39cc1f56fc4efd65bcbab", size = 741934, upload-time = "2026-08-07T10:49:08.839Z" }, - { url = "https://files.pythonhosted.org/packages/40/32/a04b72b1aa86e3be23b2ecff8c1aad2dcc955bd3956d6d26e7e34267e57a/librt-0.15.0-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:291bf73caf78b9e88d6fae9bfd693207ff7d832e2fdbe2cf8e746bc13f5f892b", size = 783763, upload-time = "2026-08-07T10:49:10.661Z" }, - { url = "https://files.pythonhosted.org/packages/6c/f0/89eb11dffbe9279ff37144dec786927314502ae0b114f1449dc78c458aab/librt-0.15.0-cp315-cp315t-win32.whl", hash = "sha256:c16d15ee371643ab48dc8248a3e680ebbeca573a13af2c3dd0c985b142d77162", size = 104313, upload-time = "2026-08-07T10:49:12.305Z" }, - { url = "https://files.pythonhosted.org/packages/6d/4a/1f1978c200f563beda63c36adff2d65bbecb81e365e8e69e572f5f70fbc6/librt-0.15.0-cp315-cp315t-win_amd64.whl", hash = "sha256:dbd605739f228912dc49027cb764456b9757750bdc2b6b7773164db7096c6fd1", size = 126889, upload-time = "2026-08-07T10:49:13.881Z" }, - { url = "https://files.pythonhosted.org/packages/38/a6/800800bfed7b1fb10fc3f3d557785c3854e80d3f7a9800d784b176a1fc2d/librt-0.15.0-cp315-cp315t-win_arm64.whl", hash = "sha256:84d244b00604d17df3fc7736c327892d6bba66181254aa4087be807b6c342bdc", size = 110700, upload-time = "2026-08-07T10:49:15.499Z" }, -] - [[package]] name = "markdown" version = "3.10.3" @@ -513,7 +319,6 @@ source = { editable = "." } [package.dev-dependencies] dev = [ { name = "maya-stubs" }, - { name = "mypy" }, { name = "ruff" }, ] docs = [ @@ -530,7 +335,6 @@ test = [ [package.metadata.requires-dev] dev = [ { name = "maya-stubs" }, - { name = "mypy" }, { name = "ruff" }, ] docs = [ @@ -669,75 +473,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d1/fc/10ab7e80650a9c9e8f4f1105f8c8e73567f88ed0c06ada589ab81d38687c/mkdocstrings_python-2.0.5-py3-none-any.whl", hash = "sha256:30c837bbff016549f659fcba6539ac351303f0fd7e713c89a040611072236e9d", size = 104951, upload-time = "2026-06-19T10:41:07.378Z" }, ] -[[package]] -name = "mypy" -version = "2.3.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "ast-serialize" }, - { name = "librt", marker = "platform_python_implementation != 'PyPy'" }, - { name = "mypy-extensions" }, - { name = "pathspec" }, - { name = "tomli", marker = "python_full_version < '3.11'" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/12/af/4e516a05d3ca2eb9283e9ec45b2c02225c1514dd6da49fd3c9eaa6639370/mypy-2.3.0.tar.gz", hash = "sha256:465965d41cd9a2726694e983e8ce7113259327bec798115d1e1dfa2a52fb666e", size = 3988104, upload-time = "2026-07-13T11:34:53.387Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a9/09/f2f5f45dae0c9a0891e4751a73312730e009395102e5d72a22a976cca41f/mypy-2.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1fa8d916ac3b705af733c4c1e6c9ebe38fd0d52beb15b105c3e8355b55e6ecdc", size = 14927774, upload-time = "2026-07-13T11:28:38.224Z" }, - { url = "https://files.pythonhosted.org/packages/56/b9/345367effd3a6877275a94d481614bfca983f45e028c6290e2cc54603811/mypy-2.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:28e1e2af8cd8fff551fd30f2fe4b03fb76764ac8b1ba6c6a1bd00ad32b412db3", size = 14000127, upload-time = "2026-07-13T11:30:19.57Z" }, - { url = "https://files.pythonhosted.org/packages/99/6c/a10b7a7b9f0a755fb94e27ae834d4cea9ad6c5221f9325eef8f182641feb/mypy-2.3.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3e77244df3843048c3f927182916730e40c124cbaa43905c1fb86cb382aa0805", size = 14229437, upload-time = "2026-07-13T11:28:17.765Z" }, - { url = "https://files.pythonhosted.org/packages/d9/bd/a26a602acb1bbf849fa4bdac4bc657ee2f11c0c2a764a2cc87a5304e865c/mypy-2.3.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9559ab18a9c9957dfa3004ab57cd4bac5f26a724329a9584e583367f0c2e1117", size = 15171457, upload-time = "2026-07-13T11:29:01.834Z" }, - { url = "https://files.pythonhosted.org/packages/7f/14/124f462bef69bcbc90b9358088460b6091954a3e004852fcd9948db617a5/mypy-2.3.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:09abd66d8685e73f8f7d17b847c3e104d9a7b164a8706ea87d6c96a3d45816d5", size = 15478281, upload-time = "2026-07-13T11:32:23.413Z" }, - { url = "https://files.pythonhosted.org/packages/db/a4/8bdca6a8ac8d856d82ed049144af2721245a135c2e8001d3890c93975852/mypy-2.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:5e91adad1ca81742ac7ef9893959911df867752206b37135185e88dfb3c89494", size = 11148008, upload-time = "2026-07-13T11:34:17.332Z" }, - { url = "https://files.pythonhosted.org/packages/83/41/490eea348e60ba50decec20bc750605444149a5d7a8cc560042f90ba2c75/mypy-2.3.0-cp310-cp310-win_arm64.whl", hash = "sha256:6f99ec626e3c3a2f7c0b22c5b90ddb5dabb1c18729c971e9bdaca1f1766d2cee", size = 10142329, upload-time = "2026-07-13T11:32:52.116Z" }, - { url = "https://files.pythonhosted.org/packages/e6/b9/d75b3082b05f1b3028828aeb18e74ae5ab0a0936051bbf1f32f59f654747/mypy-2.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3419d00717afbc5265b50dd14b1278f29ea4884dd398ab67873489ac093fd329", size = 14838725, upload-time = "2026-07-13T11:32:44.655Z" }, - { url = "https://files.pythonhosted.org/packages/a9/50/79a65c6ea6e115bc73296038a4543b2d5c91f07912b918a2c616a2514bba/mypy-2.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:cfca8ee88544090f86b6dcce05ec55d66eb48a762412ac2507810ba4bd793b6f", size = 13911128, upload-time = "2026-07-13T11:32:02.021Z" }, - { url = "https://files.pythonhosted.org/packages/90/48/e11ed7716c26953ca321f726e452e374dbf81a6f2b8b212ec02af29b6b8f/mypy-2.3.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:75cbb4b9ef04a0c84a957f07abc4504fbf64b8dcc145675101f2d3a78a4b1d6a", size = 14146742, upload-time = "2026-07-13T11:33:03.313Z" }, - { url = "https://files.pythonhosted.org/packages/06/72/6807565b1c4861ef66f7fdd98b51c61556356eab80235717b46c53bb8627/mypy-2.3.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:982e3d53dd23d0a4cef67dd66791fdbede0cf38f9eb617bf47663554c51e1e36", size = 15081418, upload-time = "2026-07-13T11:31:13.899Z" }, - { url = "https://files.pythonhosted.org/packages/00/80/1ea14c5d80e589e415973db3e47c78c2219a305b808b2b506395342c1d79/mypy-2.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:85c5385b93012ffa3b31479ab579aef5415f4f3a32c6cf1ae07a984d2a0ff461", size = 15328164, upload-time = "2026-07-13T11:31:35.723Z" }, - { url = "https://files.pythonhosted.org/packages/37/28/8223157404a3d51920078459c37f80fbdc590e1d8ea049dc5ce48643022a/mypy-2.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:13b1b16e2fa39f3b2e33fb1c468abc7a69369fa2e886b4b87b5afc81472325cd", size = 11136472, upload-time = "2026-07-13T11:27:37.018Z" }, - { url = "https://files.pythonhosted.org/packages/6f/cc/ea27e5959c5f258585a756b252031f3b313583d81b5064b2bebc41d3706b/mypy-2.3.0-cp311-cp311-win_arm64.whl", hash = "sha256:b5cd2f027a972a4a5f2278a11fac9747f5f81a53a30b714d74950b6807e55568", size = 10135800, upload-time = "2026-07-13T11:30:08.92Z" }, - { url = "https://files.pythonhosted.org/packages/dc/94/0e7e592619e2133596a47cdd642534b0456545c218430bd3b9d8fefdd1b1/mypy-2.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2d53fc67b9d28a43c6199077f49fea0f05839e36cf6158500331c9549225e5a5", size = 15026523, upload-time = "2026-07-13T11:34:49.206Z" }, - { url = "https://files.pythonhosted.org/packages/f6/d2/1e1731df090a857df2807177a4626863e5ac0f0256513c35780efe53986f/mypy-2.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fbc00cee7bdbb9291979ddc9d08034a29dfcda4932628c9bbc28c1edd589df0c", size = 14032189, upload-time = "2026-07-13T11:33:57.168Z" }, - { url = "https://files.pythonhosted.org/packages/44/95/cab921f4a806e171f34113e6181dd23c55358ccf6a80741269ef594a410e/mypy-2.3.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:04e617030eca5221909c8b7d8d7fd1c637948199aa2100b2ad9813feb07e1491", size = 14198696, upload-time = "2026-07-13T11:32:12.767Z" }, - { url = "https://files.pythonhosted.org/packages/66/80/e6d008bb19fe446e3662d85e0e2717bf9f2d611a2164fb29d6e067dbf46c/mypy-2.3.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:56c184d2c20ca6b6378d58d1960270a767f41f5e44acbbd27f05effef4f4e1d7", size = 15286904, upload-time = "2026-07-13T11:34:27.594Z" }, - { url = "https://files.pythonhosted.org/packages/db/83/94397c9293608a364aa03e8084fb34ede4ae976a260384b9b52929308135/mypy-2.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3961a4a34b05f7c74b0f05aa51fbfe99a2d1e126038df40318d15c8f558b7ef3", size = 15528342, upload-time = "2026-07-13T11:34:07.819Z" }, - { url = "https://files.pythonhosted.org/packages/cf/96/d8b37d819adec6cfccfb1fd3afc1735d94717ddeafb45536db9c6943e09b/mypy-2.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:b1942b9314d4c784b8ea1dbab4972603290e5dd5630f06675f13aec97526bc4c", size = 11218346, upload-time = "2026-07-13T11:28:27.745Z" }, - { url = "https://files.pythonhosted.org/packages/2b/cd/cd9f725b19b19e5b530a154cf9bcf9e94279c5d55b3c34fb42b3aa48ea1b/mypy-2.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:be51653d7669d7d7955d613b8d0bb57d5b652eaf71a873ddf65ac87254dd2595", size = 10204525, upload-time = "2026-07-13T11:31:02.552Z" }, - { url = "https://files.pythonhosted.org/packages/6e/ae/f7d056eb0294586a572d0d0d89580ec633c064db520f11d37d5a2fb833bd/mypy-2.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:91ad22a52ae2c7e621c2f67c94d5a17f66b3209a4cff5cf8a573579835c69e97", size = 14947298, upload-time = "2026-07-13T11:27:47.734Z" }, - { url = "https://files.pythonhosted.org/packages/32/d5/db3e7af01e7844d21662c6ddc1f7825ec7cb4053f0391ac02faf3638396f/mypy-2.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:99ac767cc5d3b64c8d0ae226ead10c96694f94e4e7da1668642225dcd4e75aac", size = 13950768, upload-time = "2026-07-13T11:27:57.726Z" }, - { url = "https://files.pythonhosted.org/packages/d9/fb/43c031f0190513d1ec248ed037eceb742ddd2a4d74bbf406658a28173837/mypy-2.3.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:de6d2c484742a4d7b0ed6d07b143375624d3b899c5749c7b3c947f56261f48a6", size = 14151586, upload-time = "2026-07-13T11:29:18.615Z" }, - { url = "https://files.pythonhosted.org/packages/ec/c3/f8b2ffc60883084da91be51af58e88a7ffd4ff9795acb7d902ff88d31eb1/mypy-2.3.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7da939dd335cfd2ad788bdfd081c9f4e47634ab995e5a45eb15fd1e5bc052f8b", size = 15227411, upload-time = "2026-07-13T11:30:29.904Z" }, - { url = "https://files.pythonhosted.org/packages/83/2e/16b917fc7adcf03f1aadddfc93aab804ffb234b1ab09c0ffd6d92a5d34a2/mypy-2.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7247eb2824f996722a949530183394921ca71deb9680052a338cf53cff7925c2", size = 15478790, upload-time = "2026-07-13T11:33:14.686Z" }, - { url = "https://files.pythonhosted.org/packages/c0/88/aaa65a93c73d0cdae7e42f8adb302bf6885bb281302084f99d0290a35347/mypy-2.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:75b0984bb3cbd76bb5c9291a8671f7ae66ca3b51c7584c358fc2e923259f0757", size = 11234919, upload-time = "2026-07-13T11:33:39.28Z" }, - { url = "https://files.pythonhosted.org/packages/35/19/b40de63f1a80e63bc2d40f0679a6a8dbd34e95176c8122119bdf406aa552/mypy-2.3.0-cp313-cp313-win_arm64.whl", hash = "sha256:d78fcf900b59cb7e82cb7e3a235e31b462d9333d92285bd1e4952d355b8ffba1", size = 10201510, upload-time = "2026-07-13T11:31:52.619Z" }, - { url = "https://files.pythonhosted.org/packages/a4/58/fa0ae047da911f540284009b4f44b96fe09d83c076d7c103e9d645f46303/mypy-2.3.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:ea317b060ce83e26050f8f9e4d7d6bf44ed7597c8ff9990bccffbb9d1d8522db", size = 14941909, upload-time = "2026-07-13T11:32:34.332Z" }, - { url = "https://files.pythonhosted.org/packages/15/14/2ba1d61452d7c2a7fe12741e8d374e52b183476b07aa7f9e2a0d02b0720a/mypy-2.3.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:094af99f92638aa92852326188b85a89e50f4a472f44827c03362228482f0762", size = 13967581, upload-time = "2026-07-13T11:30:00.587Z" }, - { url = "https://files.pythonhosted.org/packages/ed/5a/483fb9e5ffbbb1a28dccc7b0a13d141b17ac769b6c9f488c0a0c63698962/mypy-2.3.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:de121747278144fc9ae7caa2e978cf5df12aebc82933182f5b3b86081a30baef", size = 14168807, upload-time = "2026-07-13T11:28:48.6Z" }, - { url = "https://files.pythonhosted.org/packages/ae/77/70d7a10732063beb74ad713682cf871e88f5c5fa39bfc8beff8a524bf9cb/mypy-2.3.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:37fa4de896a84e2dc9200d91e614c22563b43d1a266789d4bbac7b22ebe6192b", size = 15200144, upload-time = "2026-07-13T11:31:25.283Z" }, - { url = "https://files.pythonhosted.org/packages/56/72/766218ac783be4fdfcd699b90037b63017348a3e86fb2c1fbfb18302637d/mypy-2.3.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:f1b3a98dfd21058bc759bb3337d5d1f61d0fdf9f3cf9c00f4291790fb5427bff", size = 15460389, upload-time = "2026-07-13T11:29:29.077Z" }, - { url = "https://files.pythonhosted.org/packages/38/4e/8a9db7411ecb8ec0cb1fd05dba432f28bafffcd38b4e887714a4a0506689/mypy-2.3.0-cp314-cp314-pyemscripten_2026_0_wasm32.whl", hash = "sha256:944c665d984157cb96a679dfb7a4a81dd1d36b24b9c284b699514e6e626b82d4", size = 7753664, upload-time = "2026-07-13T11:29:08.147Z" }, - { url = "https://files.pythonhosted.org/packages/65/4c/c3f8bfd6ed0e5e38b5a244403b27f821d433443df5a15a278417c10a3a3c/mypy-2.3.0-cp314-cp314-win_amd64.whl", hash = "sha256:4359424140d985192c778c1ce2c114a10c1ca58a381ed79cfa70d37df94b299f", size = 11417237, upload-time = "2026-07-13T11:33:47.467Z" }, - { url = "https://files.pythonhosted.org/packages/3c/00/89a32eaf5ccf174bc4f90db0eaea5d70636c01b8d49f384bdab2e8834390/mypy-2.3.0-cp314-cp314-win_arm64.whl", hash = "sha256:3dd0bed92c4bdec57c42505b96416fb9e6a5aa7be84d2809bcd5f2ecec2860d7", size = 10389252, upload-time = "2026-07-13T11:31:43.81Z" }, - { url = "https://files.pythonhosted.org/packages/31/56/104f93d69aa9f339b6b9d3b0a7faa699b8b466c942cf3ae86cc2a2ec0915/mypy-2.3.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:691fdc37132b1ae628d834f672e74de83462d9fb4aff621835767fb43a8dd373", size = 16385495, upload-time = "2026-07-13T11:29:49.818Z" }, - { url = "https://files.pythonhosted.org/packages/d2/03/f1d2123313f55efafdd27706960f43a771c62f1b68426c76043f3ab9ebf3/mypy-2.3.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:aec15d465d477558fd842757b487849007311cf3897849cdda0e3162ac0ac556", size = 15098155, upload-time = "2026-07-13T11:30:40.301Z" }, - { url = "https://files.pythonhosted.org/packages/e5/5d/d5f9200399b445e81726c4f23becee33f233aee81c72680b1ef3a258b641/mypy-2.3.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b352b7e49f5e6576009e8df730e1ff4f915cb565b851b396d2ffe2f5a6f5da88", size = 15514155, upload-time = "2026-07-13T11:34:38.569Z" }, - { url = "https://files.pythonhosted.org/packages/cd/ce/69977c555f08faa3190cfde44189b89dbd56861b1ab97aa18fc5f3a2e4a3/mypy-2.3.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1c6c6bf687b17f90dbfcad95b960d32eaa0154c00da45f03ab50bf8952e047fe", size = 16766351, upload-time = "2026-07-13T11:33:29.195Z" }, - { url = "https://files.pythonhosted.org/packages/bc/92/6648b6caa3ab9e00f9ac0c2a78307805f873dd48139b24a6f6f7c3667bbf/mypy-2.3.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:f4ed18f111bfe2d599bca7468e7f9251042c1c2118f762c8de2766a56d773c60", size = 17043490, upload-time = "2026-07-13T11:30:53.927Z" }, - { url = "https://files.pythonhosted.org/packages/7c/ab/0dc91d80f3f016634c68d451f294a97320fe903a9b6f90b9e57b3f7f1717/mypy-2.3.0-cp314-cp314t-win_amd64.whl", hash = "sha256:0b025a93cffb9781d231f232be07a17912f35f10a313c24f301c81e842870654", size = 12146869, upload-time = "2026-07-13T11:29:38.874Z" }, - { url = "https://files.pythonhosted.org/packages/85/b5/4c964d02634ba81f4d1c84838e5c5b18ab06d13ed568960f5d6318495ccc/mypy-2.3.0-cp314-cp314t-win_arm64.whl", hash = "sha256:adebc76aab4f3495a88b41d48aa4aff0c03f2822501da76625afcca5975f19e5", size = 10965113, upload-time = "2026-07-13T11:28:07.056Z" }, - { url = "https://files.pythonhosted.org/packages/2c/fa/fdc54fe583ba3cafbcedfb70eeeaf03849f75b1827a07096c7bd996f582d/mypy-2.3.0-py3-none-any.whl", hash = "sha256:6b1cdb579446b60432432b2b2403a6201b4b475a004d7f488511c9ba177c9e88", size = 2753292, upload-time = "2026-07-13T11:33:18.48Z" }, -] - -[[package]] -name = "mypy-extensions" -version = "1.1.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a2/6e/371856a3fb9d31ca8dac321cda606860fa4548858c0cc45d9d1d4ca2628b/mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558", size = 6343, upload-time = "2025-04-22T14:54:24.164Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/79/7b/2c79738432f5c924bef5071f933bcc9efd0473bac3b4aa584a6f7c1c8df8/mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505", size = 4963, upload-time = "2025-04-22T14:54:22.983Z" }, -] - [[package]] name = "packaging" version = "26.3" From e7e93c94cffeaf59c9753894529b46867d5d82ca Mon Sep 17 00:00:00 2001 From: Matthew Lee <{ID} {username}@users.noreply.github.com> Date: Wed, 12 Aug 2026 15:42:37 +1200 Subject: [PATCH 11/14] Update badges, docs, and agent notes for the new CI setup Template README gains its own CI/uv/ruff badges; mypy references removed everywhere; documented commands updated to repo-wide scope; AGENTS files describe the guarded/unguarded workflow split and the mkdocs real-value contract. --- AGENTS.md | 35 +++++++++++++++++++++-------------- CONTRIBUTING.md | 27 ++++++++------------------- README.md | 7 ++++--- _AGENTS.md | 13 +++++-------- _README.md | 1 - 5 files changed, 38 insertions(+), 45 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index 8e57844..3c91683 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -3,7 +3,7 @@ This repository is a **GitHub template** for Autodesk Maya Python tools. If you are an agent helping a user start a new Maya tool, create their project **from this template** instead of scaffolding from scratch. They get CI that runs tests inside real Maya -(Docker), Ruff + mypy static analysis, mkdocs docs deployment, and a manually triggered +(Docker), Ruff static analysis, mkdocs docs deployment, and a manually triggered release workflow, all preconfigured. ## Create a new project from this template (non-interactive) @@ -36,8 +36,11 @@ commands (generated from `_AGENTS.md` in this template). - Dependencies and all tool config live in `pyproject.toml`, managed with **uv**. Setup: `uv sync --all-groups`. Dependency groups: `test`, `dev`, `docs`. -- Lint/format/typecheck: `uv run ruff check src`, `uv run ruff format --check src`, - `uv run mypy src`. +- Lint/format: `uv run ruff check .`, `uv run ruff format --check .`. +- `tests/template/` exercises the template's own machinery (`initial_setup.py`, + `scripts/build_module.py`, `release.py`'s pure version-bump logic) with plain + pytest, no Maya needed: `uv run pytest tests/template`. It's deleted by + `initial-setup.yml` in generated repos. - Maya tests run under `mayapy` (Maya's bundled interpreter), not a uv-managed Python. CI frees runner disk space, `docker pull`s `mottosso/maya:`, then runs a single `docker run` that installs `uv` and the test group into `mayapy` and runs @@ -45,23 +48,27 @@ commands (generated from `_AGENTS.md` in this template). because the container is ephemeral. For local runs against a real Maya install, use the `PYTHONPATH` + disposable-venv pattern documented in [CONTRIBUTING.md](CONTRIBUTING.md#tests) instead of installing into Maya. -- `pyproject.toml` deliberately contains the **real** values - (`name = "mayapythonprojecttemplate"`, real description, real wheel path) rather than - `{{...}}` placeholders, so the file stays valid TOML and uv works on a clone of the - template. `initial_setup.py` string-replaces those literals during setup; if you - change them in `pyproject.toml`, update the matching literals in `initial_setup.py`. -- Other templated files (`_README.md`, `_AGENTS.md`, `CONTRIBUTING.md`, `mkdocs.yml`, +- `pyproject.toml` and `mkdocs.yml` deliberately contain **real** values + (`name = "mayapythonprojecttemplate"`, real description, real wheel path, + `site_name: MayaPythonProjectTemplate`) rather than `{{...}}` placeholders, so both + files stay valid (TOML / YAML) and `uv`/`mkdocs build` work on a clone of the + template itself. `initial_setup.py` string-replaces those literals during setup; if + you change them in `pyproject.toml` or `mkdocs.yml`, update the matching literals in + `initial_setup.py`. +- Other templated files (`_README.md`, `_AGENTS.md`, `CONTRIBUTING.md`, `tests/maya/test_example.py`) use `{{PROJECT_OWNER}}` / `{{PROJECT_NAME}}` / - `{{PROJECT_TITLE}}` / `{{PROJECT_DESC}}` / `{{SITE_NAME}}` placeholders handled by - `initial_setup.py` and `.github/workflows/initial-setup.yml`. `{{PROJECT_TITLE}}` is - `{{PROJECT_NAME}}` with `-`/`_` replaced by spaces, for display headings only — - `{{PROJECT_NAME}}` itself must stay a raw URL-safe slug. + `{{PROJECT_TITLE}}` / `{{PROJECT_DESC}}` placeholders handled by `initial_setup.py` + and `.github/workflows/initial-setup.yml`. `{{PROJECT_TITLE}}` is `{{PROJECT_NAME}}` + with `-`/`_` replaced by spaces, for display headings only; `{{PROJECT_NAME}}` + itself must stay a raw URL-safe slug. - Release pipeline: `scripts/build_module.py` stages `src//` into a Maya module tree under `dist/` (name/version read from `pyproject.toml`) and copies `install_module.py` in as `_drag_and_drop_installer.py`. `release.py` (repo root) dispatches `ci-release.yml`, which runs `reusable-release.yml` to zip `dist/` and attach it to the GitHub Release. `release.py` lives at the repo root, not under `scripts/`, so `build_module.py` never sweeps it into the shipped module. -- CI workflows are guarded with +- CI workflows are split by whether they make sense on the template repo itself: + static analysis and `template-tests` (pure-Python, no Maya) run unguarded, on this + repo too. Maya tests, the release pipeline, and `initial-setup.yml` are guarded with `if: github.repository != 'matthewlee-dev/MayaPythonProjectTemplate'` so they run only in generated repos. Keep those guards. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 05c7333..c015b07 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -27,7 +27,7 @@
  7. Contributing
  8. Project Dependencies
  9. Tests
  10. -
  11. Linting and Type Hinting
  12. +
  13. Linting and Formatting
  14. Documentation
  15. Continuous Integration
    • @@ -39,7 +39,7 @@ ## Contributing 1. Fork the Project. 2. Create your Feature Branch (`git checkout -b feature_name`). -3. Commit your Changes (`git commit -a -m "feat: a wonderful new feature"`). +3. Commit your Changes (`git commit -a -m "add a wonderful new feature"`). 4. Push to the Branch (`git push origin feature_name`). 5. Open a Pull Request. @@ -101,32 +101,21 @@ containers across the versions in

      (back to top)

      -## Linting and Type Hinting -Static code analysis and formatting are performed with [Ruff](https://github.com/astral-sh/ruff), and type hinting with [mypy](https://mypy.readthedocs.io/en/stable/). Configuration for both lives in [pyproject.toml](pyproject.toml). +## Linting and Formatting +Static code analysis and formatting are performed with [Ruff](https://github.com/astral-sh/ruff). Configuration lives in [pyproject.toml](pyproject.toml). To run ruff's linter locally: - ```sh - uv run ruff check src/ + uv run ruff check . ``` To check formatting locally: - ```sh - uv run ruff format --check src/ + uv run ruff format --check . ``` -Run [mypy](https://mypy.readthedocs.io/en/stable/) checks locally with: - -- ```sh - uv run mypy src/ - ``` - - `[tool.mypy]` in [pyproject.toml](pyproject.toml) ignores Maya import errors. Append to this section as needed. - - [maya-stubs](https://pypi.org/project/maya-stubs/) only types each `cmds` flag's - long-form name (e.g. `name`, `empty`, `parent`), not Maya's short aliases (`n`, - `em`, `p`, ...). Use long-form flags so mypy can check them; short flags raise a - spurious `call-arg` error even though they work fine at runtime. -

      (back to top)

      @@ -146,7 +135,7 @@ To serve the docs locally: ## Continuous Integration Continuous integration is set up with [GitHub Actions][github-actions-url], workflows can be found in the [.github/workflows](.github/workflows) directory. There are 2 main workflows: -1. [ci-main.yml](.github/workflows/ci-main.yml): This workflow is intended to be a fast check to ensure the code is in a good state, and code standards are met. It runs automatically on every push and pull request to main or can be triggered from the `Run workflow` button on the [actions menu](https://github.com/{{PROJECT_OWNER}}/{{PROJECT_NAME}}/actions/workflows/ci-main.yml). It runs tests (if they exist), and performs linting, formatting, and type hinting checks. +1. [ci-main.yml](.github/workflows/ci-main.yml): This workflow is intended to be a fast check to ensure the code is in a good state, and code standards are met. It runs automatically on every push and pull request to main or can be triggered from the `Run workflow` button on the [actions menu](https://github.com/{{PROJECT_OWNER}}/{{PROJECT_NAME}}/actions/workflows/ci-main.yml). It runs tests (if they exist), and performs linting and formatting checks.
      drawing
      2. [ci-release.yml](.github/workflows/ci-release.yml): This workflow will do all the above, then bump `pyproject.toml` to a version you specify, tag it, build an installable Maya module zip (`.mod` + `_drag_and_drop_installer.py`), create a GitHub release with the zip attached, and deploy the documentation to GitHub pages. Trigger it with `python3 release.py --bump patch` (or `minor`/`major`), or run it from the `Run workflow` button on the [actions menu](https://github.com/{{PROJECT_OWNER}}/{{PROJECT_NAME}}/actions/workflows/ci-release.yml) (enter the version, e.g. `1.2.3`, when prompted), or via CLI: `gh workflow run ci-release.yml -f version=1.2.3`. @@ -156,7 +145,7 @@ Continuous integration is set up with [GitHub Actions][github-actions-url], work ### Further useful information on the workflows: * Versions of Maya to test against can be specified in the [reusable-maya-tests.yml](.github/workflows/reusable-maya-tests.yml) file. * The Maya tests workflow will only run if tests exist in the `tests` directory, otherwise the CI will skip this workflow to avoid pulling the Maya Docker image unnecessarily. -* [Coding standards enforced](.github/workflows/reusable-static-analysis.yml) with [ruff](https://github.com/astral-sh/ruff) and [mypy](https://mypy.readthedocs.io/en/stable/), with minimal configuration. +* [Coding standards enforced](.github/workflows/reusable-static-analysis.yml) with [ruff](https://github.com/astral-sh/ruff), with minimal configuration. * [Docs are built](.github/workflows/reusable-build-and-deploy-docs.yml) with [mkdocs](https://www.mkdocs.org/) and deployed to GitHub pages: [https://{{PROJECT_OWNER}}.github.io/{{PROJECT_NAME}}](https://{{PROJECT_OWNER}}.github.io/{{PROJECT_NAME}}). * > To enable GitHub pages, go to the settings of your repository, scroll down to the GitHub Pages section, and select the `gh-pages` branch as the source. *drawing diff --git a/README.md b/README.md index 33303cc..c8b7b13 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,9 @@ MayaPythonLogo +[![CI](https://github.com/matthewlee-dev/MayaPythonProjectTemplate/actions/workflows/ci-main.yml/badge.svg)](https://github.com/matthewlee-dev/MayaPythonProjectTemplate/actions/workflows/ci-main.yml) +[![Managed with uv](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/uv/main/assets/badge/v0.json)](https://github.com/astral-sh/uv) +[![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff) [![Python][python_3-shield]][python-url] [![Maya][maya-shield]][maya-url] [![GitHub Actions][github-actions-shield]][github-actions-url] @@ -54,7 +57,7 @@ Wait for the `initial repository setup` workflow to finish before cloning. See [ * Continuous integration using [GitHub Actions][github-actions-url] with jobs to: * [Run integration tests](.github/workflows/reusable-maya-tests.yml) across a range of Maya versions in isolated Docker containers. * `Note: You should hold a valid Maya license.` - * [Enforce coding standards](.github/workflows/reusable-static-analysis.yml) with [ruff](https://github.com/astral-sh/ruff) and [mypy](https://mypy.readthedocs.io/en/stable/). + * [Enforce coding standards](.github/workflows/reusable-static-analysis.yml) with [ruff](https://github.com/astral-sh/ruff). * [Build and deploy documentation](.github/workflows/reusable-build-and-deploy-docs.yml) to GitHub pages with [mkdocs](https://www.mkdocs.org/). * [Manually triggered releases](.github/workflows/ci-release.yml): pick a version number and it tags, releases, and deploys docs (optional). The release also builds an installable Maya module zip (`.mod` + `_drag_and_drop_installer.py`) and attaches it to the GitHub Release. @@ -82,8 +85,6 @@ also trigger it manually from the Actions tab with an explicit version. [python_3-shield]: https://img.shields.io/badge/Python-3.X-grey?logo=python&logoColor=ffdd54&labelColor=%233670A0 [python-url]: https://python.org/ -[pytest-shield]: https://img.shields.io/badge/tests-pytest-%230A9EDC -[pytest-url]: https://docs.pytest.org/ [github-actions-shield]: https://img.shields.io/badge/GitHub%20Actions-%232671E5?logo=githubactions&logoColor=white [github-actions-url]: https://github.com/features/actions diff --git a/_AGENTS.md b/_AGENTS.md index e35afed..2e92d3e 100644 --- a/_AGENTS.md +++ b/_AGENTS.md @@ -9,15 +9,14 @@ This is an Autodesk Maya Python tool, created from - `tests/maya/`: pytest tests that run **inside Maya** via `mayapy` (Maya's bundled Python). `tests/maya/conftest.py` boots `maya.standalone` once per session. - `pyproject.toml`: single source of truth for metadata, dependency groups - (`test`, `dev`, `docs`), and all tool config (ruff, mypy, hatchling). + (`test`, `dev`, `docs`), and all tool config (ruff, hatchling). - Dependencies are managed with **uv**; `uv.lock` is committed. ## Commands - Setup: `uv sync --all-groups` -- Lint: `uv run ruff check src` -- Format: `uv run ruff format src` (CI enforces `ruff format --check`) -- Typecheck: `uv run mypy src` +- Lint: `uv run ruff check .` +- Format: `uv run ruff format .` (CI enforces `ruff format --check .`) - Tests: must run under `mayapy`, not plain Python. Don't install directly into Maya's own environment; use the `PYTHONPATH` + disposable-venv pattern in [CONTRIBUTING.md](CONTRIBUTING.md#tests). Without Maya locally, rely on CI, which runs @@ -26,12 +25,10 @@ This is an Autodesk Maya Python tool, created from ## Conventions -- `from maya import cmds` for Maya commands; `maya-stubs` provides type stubs, but only - for long-form flag names (e.g. `name`, not `n`); see - [CONTRIBUTING.md](CONTRIBUTING.md#linting-and-type-hinting). +- `from maya import cmds` for Maya commands. - Releases are manual: `python3 release.py --bump patch` (or `minor`/`major`), or `gh workflow run ci-release.yml -f version=1.2.3`. It bumps `version` in `pyproject.toml`, tags `v`, builds an installable Maya module zip (`.mod` + `_drag_and_drop_installer.py`) and attaches it to a GitHub release, and deploys docs to GitHub Pages. -- CI on push/PR runs static analysis (ruff, mypy) and the Maya test matrix. +- CI on push/PR runs static analysis (ruff) and the Maya test matrix. diff --git a/_README.md b/_README.md index 3f4714f..b39bcbf 100644 --- a/_README.md +++ b/_README.md @@ -7,7 +7,6 @@ [![pytest][pytest-shield]][pytest-url] [![Managed with uv](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/uv/main/assets/badge/v0.json)](https://github.com/astral-sh/uv) [![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff) -[![Checked with mypy](https://www.mypy-lang.org/static/mypy_badge.svg)](https://mypy-lang.org/) From c9bd3beb787a7a507561b72c78b2a2db5fc132a6 Mon Sep 17 00:00:00 2001 From: Matthew Lee <{ID} {username}@users.noreply.github.com> Date: Wed, 12 Aug 2026 16:43:30 +1200 Subject: [PATCH 12/14] text cut down --- AGENTS.md | 30 ++++++++++----------- CONTRIBUTING.md | 72 ++++++++++++++++++++++++------------------------- README.md | 16 +++++------ _README.md | 2 +- 4 files changed, 58 insertions(+), 62 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index 3c91683..980257d 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,10 +1,10 @@ # AGENTS.md: MayaPythonProjectTemplate -This repository is a **GitHub template** for Autodesk Maya Python tools. If you are an -agent helping a user start a new Maya tool, create their project **from this template** -instead of scaffolding from scratch. They get CI that runs tests inside real Maya -(Docker), Ruff static analysis, mkdocs docs deployment, and a manually triggered -release workflow, all preconfigured. +This repository is a **GitHub template** for Autodesk Maya Python tools. If an agent +is helping a user start a new Maya tool, create the project **from this template** +instead of scaffolding from scratch. It comes preconfigured with CI that runs tests +in real Maya (Docker), Ruff static analysis, mkdocs deployment, and a manually +triggered release workflow. ## Create a new project from this template (non-interactive) @@ -17,9 +17,9 @@ gh repo create \ Use all-lowercase with hyphens for `` (e.g. `my-cool-tool`). -Creating the repo triggers the `initial repository setup` workflow, which rewrites +Creating the repo triggers the `initial repository setup` workflow: it rewrites placeholders, renames `src/mayapythonprojecttemplate/`, regenerates `uv.lock`, and -pushes a commit. **Wait for it to finish before cloning**: +pushes a commit. **Wait for it before cloning**: ```sh sleep 20 # give the workflow a moment to appear @@ -29,8 +29,8 @@ gh run watch --repo / \ gh repo clone / ``` -Then work inside the new repo; it contains its own `AGENTS.md` with day-to-day -commands (generated from `_AGENTS.md` in this template). +The new repo has its own `AGENTS.md` with day-to-day commands (generated from +`_AGENTS.md` in this template). ## Working on the template itself @@ -42,12 +42,12 @@ commands (generated from `_AGENTS.md` in this template). pytest, no Maya needed: `uv run pytest tests/template`. It's deleted by `initial-setup.yml` in generated repos. - Maya tests run under `mayapy` (Maya's bundled interpreter), not a uv-managed Python. - CI frees runner disk space, `docker pull`s `mottosso/maya:`, then runs a - single `docker run` that installs `uv` and the test group into `mayapy` and runs - pytest (`.github/workflows/reusable-maya-tests.yml`); direct install is fine there - because the container is ephemeral. For local runs against a real Maya install, use - the `PYTHONPATH` + disposable-venv pattern documented in - [CONTRIBUTING.md](CONTRIBUTING.md#tests) instead of installing into Maya. + CI frees runner disk space, `docker pull`s `mottosso/maya:`, then runs one + `docker run` that installs `uv` and the test group into `mayapy` and runs pytest + (`.github/workflows/reusable-maya-tests.yml`); direct install is fine there since + the container is ephemeral. For local runs against a real Maya install, use the + `PYTHONPATH` + disposable-venv pattern in [CONTRIBUTING.md](CONTRIBUTING.md#tests) + instead. - `pyproject.toml` and `mkdocs.yml` deliberately contain **real** values (`name = "mayapythonprojecttemplate"`, real description, real wheel path, `site_name: MayaPythonProjectTemplate`) rather than `{{...}}` placeholders, so both diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index c015b07..f04dcd7 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -47,38 +47,38 @@ ## Project Dependencies ->

      Update to reflect the new project's specific requirements!

      -> Dependencies are managed with [uv](https://docs.astral.sh/uv/) and declared in -> [pyproject.toml](pyproject.toml). Tests run under Maya's bundled interpreter (`mayapy`), -> for more info see: https://help.autodesk.com/view/MAYACRE/ENU/?guid=GUID-6AF99E9C-1473-481E-A144-357577A53717.

      +>

      Update to reflect the new project's requirements.

      +> Managed with [uv](https://docs.astral.sh/uv/), declared in [pyproject.toml](pyproject.toml). +> Tests run under Maya's bundled interpreter (`mayapy`); see +> https://help.autodesk.com/view/MAYACRE/ENU/?guid=GUID-6AF99E9C-1473-481E-A144-357577A53717.

      -1. Install uv: see the [uv installation guide](https://docs.astral.sh/uv/getting-started/installation/). -2. Dependencies can be added to: +1. Install [uv](https://docs.astral.sh/uv/getting-started/installation/). +2. Add dependencies to: * `[project] dependencies` in [pyproject.toml](pyproject.toml): runtime requirements. - * `[dependency-groups]` in [pyproject.toml](pyproject.toml): `dev`, `test`, and `docs` groups. -3. Sync a local environment with all dependency groups: + * `[dependency-groups]` in [pyproject.toml](pyproject.toml): `dev`, `test`, `docs`. +3. Sync a local environment: ```sh uv sync --all-groups ``` -4. To run tests against a local Maya, don't install into Maya's own environment: +4. For tests against a local Maya, don't install into Maya's own environment: keep test dependencies in a disposable venv and expose them to `mayapy` via - `PYTHONPATH` (see [Tests](#tests) below). CI installs directly into `mayapy` - instead, which is fine there because the Docker container is ephemeral. + `PYTHONPATH` (see [Tests](#tests)). CI installs directly into `mayapy` since + its Docker container is ephemeral.

      (back to top)

      ## Tests -Tests are written with [Pytest](https://docs.pytest.org/) and should adhere to the ["Arrange, Act, Assert" pattern](https://docs.pytest.org/en/stable/explanation/anatomy.html). +Tests use [Pytest](https://docs.pytest.org/) and follow the ["Arrange, Act, Assert" pattern](https://docs.pytest.org/en/stable/explanation/anatomy.html). -Tests must run under `mayapy` (Maya's bundled interpreter): a plain Python can't -import `maya`. To run them against a local Maya install without touching Maya's own -site-packages, put the test dependencies in a disposable venv and point `mayapy` at it: +Tests must run under `mayapy` (Maya's bundled interpreter); plain Python can't +import `maya`. To run against a local Maya install without touching Maya's own +site-packages, put test dependencies in a disposable venv and point `mayapy` at it: -> This assumes `mayapy` is on your `PATH` (e.g. via a shell alias to your Maya install's +> Assumes `mayapy` is on your `PATH` (e.g. a shell alias to your Maya install's > `mayapy` binary, such as `/Applications/Autodesk/maya2026/Maya.app/Contents/bin/mayapy` -> on macOS). Otherwise, use the full path to `mayapy` in place of the bare command below. +> on macOS). Otherwise use the full path to `mayapy`. - ```sh # --managed-python forces a real standalone interpreter; without it, uv can pick up @@ -90,27 +90,25 @@ site-packages, put the test dependencies in a disposable venv and point `mayapy` ``` Maya's own modules still come from `mayapy`; only the test dependencies come from the -venv, so your Maya installation stays untouched. Keep this venv minimal: `PYTHONPATH` -entries take precedence over Maya's site-packages, so extra packages there can shadow -ones Maya ships. +venv, so your Maya installation stays untouched. Keep the venv minimal: `PYTHONPATH` +entries take precedence over Maya's site-packages and can shadow packages Maya ships. -If you don't have Maya locally, rely on CI: it runs the suite inside Maya Docker -containers across the versions in -[reusable-maya-tests.yml](.github/workflows/reusable-maya-tests.yml). +Without Maya locally, rely on CI: it runs the suite inside Maya Docker containers +across the versions in [reusable-maya-tests.yml](.github/workflows/reusable-maya-tests.yml).

      (back to top)

      ## Linting and Formatting -Static code analysis and formatting are performed with [Ruff](https://github.com/astral-sh/ruff). Configuration lives in [pyproject.toml](pyproject.toml). +Static analysis and formatting use [Ruff](https://github.com/astral-sh/ruff). Configuration lives in [pyproject.toml](pyproject.toml). -To run ruff's linter locally: +Lint: - ```sh uv run ruff check . ``` -To check formatting locally: +Check formatting: - ```sh uv run ruff format --check . @@ -120,11 +118,11 @@ To check formatting locally: ## Documentation -Documentation is built with [mkdocs](https://www.mkdocs.org/). To build the docs locally: +Docs are built with [mkdocs](https://www.mkdocs.org/). Build locally: - ```sh mkdocs build ``` -To serve the docs locally: +Serve locally: - ```sh mkdocs serve ``` @@ -134,20 +132,20 @@ To serve the docs locally: ## Continuous Integration -Continuous integration is set up with [GitHub Actions][github-actions-url], workflows can be found in the [.github/workflows](.github/workflows) directory. There are 2 main workflows: -1. [ci-main.yml](.github/workflows/ci-main.yml): This workflow is intended to be a fast check to ensure the code is in a good state, and code standards are met. It runs automatically on every push and pull request to main or can be triggered from the `Run workflow` button on the [actions menu](https://github.com/{{PROJECT_OWNER}}/{{PROJECT_NAME}}/actions/workflows/ci-main.yml). It runs tests (if they exist), and performs linting and formatting checks. +[GitHub Actions][github-actions-url] workflows live in [.github/workflows](.github/workflows). Two main ones: +1. [ci-main.yml](.github/workflows/ci-main.yml): fast check for code state and standards. Runs on every push/PR to main, or via the `Run workflow` button on the [actions menu](https://github.com/{{PROJECT_OWNER}}/{{PROJECT_NAME}}/actions/workflows/ci-main.yml). Runs tests (if any) plus lint/format checks.
      drawing
      -2. [ci-release.yml](.github/workflows/ci-release.yml): This workflow will do all the above, then bump `pyproject.toml` to a version you specify, tag it, build an installable Maya module zip (`.mod` + `_drag_and_drop_installer.py`), create a GitHub release with the zip attached, and deploy the documentation to GitHub pages. Trigger it with `python3 release.py --bump patch` (or `minor`/`major`), or run it from the `Run workflow` button on the [actions menu](https://github.com/{{PROJECT_OWNER}}/{{PROJECT_NAME}}/actions/workflows/ci-release.yml) (enter the version, e.g. `1.2.3`, when prompted), or via CLI: `gh workflow run ci-release.yml -f version=1.2.3`. +2. [ci-release.yml](.github/workflows/ci-release.yml): does the above, then bumps `pyproject.toml` to a given version, tags it, builds an installable Maya module zip (`.mod` + `_drag_and_drop_installer.py`), creates a GitHub release with the zip attached, and deploys docs. Trigger with `python3 release.py --bump patch` (or `minor`/`major`), the `Run workflow` button on the [actions menu](https://github.com/{{PROJECT_OWNER}}/{{PROJECT_NAME}}/actions/workflows/ci-release.yml) (enter a version like `1.2.3`), or `gh workflow run ci-release.yml -f version=1.2.3`.
      drawing
      -### Further useful information on the workflows: -* Versions of Maya to test against can be specified in the [reusable-maya-tests.yml](.github/workflows/reusable-maya-tests.yml) file. - * The Maya tests workflow will only run if tests exist in the `tests` directory, otherwise the CI will skip this workflow to avoid pulling the Maya Docker image unnecessarily. -* [Coding standards enforced](.github/workflows/reusable-static-analysis.yml) with [ruff](https://github.com/astral-sh/ruff), with minimal configuration. -* [Docs are built](.github/workflows/reusable-build-and-deploy-docs.yml) with [mkdocs](https://www.mkdocs.org/) and deployed to GitHub pages: [https://{{PROJECT_OWNER}}.github.io/{{PROJECT_NAME}}](https://{{PROJECT_OWNER}}.github.io/{{PROJECT_NAME}}). - * > To enable GitHub pages, go to the settings of your repository, scroll down to the GitHub Pages section, and select the `gh-pages` branch as the source. +### More on the workflows +* Maya versions to test against are set in [reusable-maya-tests.yml](.github/workflows/reusable-maya-tests.yml). + * That workflow only runs if `tests` exist, so CI skips pulling the Maya Docker image otherwise. +* [Standards enforced](.github/workflows/reusable-static-analysis.yml) with [ruff](https://github.com/astral-sh/ruff), minimal config. +* [Docs built](.github/workflows/reusable-build-and-deploy-docs.yml) with [mkdocs](https://www.mkdocs.org/) and deployed to [https://{{PROJECT_OWNER}}.github.io/{{PROJECT_NAME}}](https://{{PROJECT_OWNER}}.github.io/{{PROJECT_NAME}}). + * > To enable, go to repo Settings > Pages, and select the `gh-pages` branch as the source. *drawing diff --git a/README.md b/README.md index c8b7b13..d5eb27c 100644 --- a/README.md +++ b/README.md @@ -28,16 +28,14 @@ > Example project built using this template can be found [here](https://github.com/matthewlee-dev/locator_creator). -## HOW TO USE THIS TEMPLATE +## How to use this template -### DO NOT FORK this is meant to be used from [Use this template][use-template-link] feature. +### Do not fork. Use the [Use this template][use-template-link] button instead. -1. Click on [Use this template][use-template-link] button. -2. Give a name and description to the new project (e.g. my-awesome-project, please use all lowercase and hyphen separation for repo names). -3. GitHub Actions will process the template and commit to the new repo, this may take a few minutes. Check the progress in the Actions tab of the new repository. -4. Once setup is complete, clone the new project and start coding! - -> NOTE: WAIT until first CI run on GitHub actions before cloning the new project. This will be kicked off automatically after creating the new repo from the template, and should take a couple of minutes to complete. +1. Click [Use this template][use-template-link]. +2. Name the new project (lowercase, hyphen-separated, e.g. `my-awesome-project`) and add a description. +3. GitHub Actions processes the template and commits to the new repo. Check progress in the Actions tab. +4. Wait for the first CI run to finish, then clone and start coding. ### CLI / agent quickstart @@ -47,7 +45,7 @@ No browser needed: gh repo create my-cool-tool --template matthewlee-dev/MayaPythonProjectTemplate --public ``` -Wait for the `initial repository setup` workflow to finish before cloning. See [AGENTS.md](AGENTS.md) for the full non-interactive flow; coding agents should read that file directly. +Wait for the `initial repository setup` workflow to finish before cloning. See [AGENTS.md](AGENTS.md) for the full non-interactive flow. ## What is included in this template? * Basic project structure. diff --git a/_README.md b/_README.md index b39bcbf..29d2ab7 100644 --- a/_README.md +++ b/_README.md @@ -97,7 +97,7 @@ Please replace this text with a list of pre-requisites for the project. ### Installation -1. Either clone the repo or download the zip file from the [project page][project-link] and extract it. +1. Clone the repo, or download and extract the zip from the [project page][project-link]. ```sh git clone https://github.com/{{PROJECT_OWNER}}/{{PROJECT_NAME}}.git ``` From 7c8c027c39657c3e2eb8093774b86d24d3e53ac1 Mon Sep 17 00:00:00 2001 From: Matthew Lee <{ID} {username}@users.noreply.github.com> Date: Wed, 12 Aug 2026 20:04:48 +1200 Subject: [PATCH 13/14] testing bug fixes --- .github/workflows/ci-main.yml | 1 + .github/workflows/ci-release.yml | 16 ++++-- .github/workflows/initial-setup.yml | 1 + .github/workflows/reusable-release.yml | 14 ++++- CONTRIBUTING.md | 75 +++++++++++++------------ README.md | 10 ---- docs/resources/images/ci_main.png | Bin 62841 -> 0 bytes docs/resources/images/ci_release.png | Bin 50874 -> 0 bytes docs/resources/images/gh-pages.png | Bin 268158 -> 0 bytes pyproject.toml | 2 +- release.py | 19 ++++++- scripts/build_module.py | 30 +++++++--- tests/template/test_build_module.py | 49 +++++++++++++++- 13 files changed, 148 insertions(+), 69 deletions(-) delete mode 100644 docs/resources/images/ci_main.png delete mode 100644 docs/resources/images/ci_release.png delete mode 100644 docs/resources/images/gh-pages.png diff --git a/.github/workflows/ci-main.yml b/.github/workflows/ci-main.yml index d0ecd4f..fc0f7e4 100644 --- a/.github/workflows/ci-main.yml +++ b/.github/workflows/ci-main.yml @@ -15,6 +15,7 @@ jobs: uses: ./.github/workflows/reusable-static-analysis.yml template-tests: + if: github.repository == 'matthewlee-dev/MayaPythonProjectTemplate' uses: ./.github/workflows/reusable-template-tests.yml tests: diff --git a/.github/workflows/ci-release.yml b/.github/workflows/ci-release.yml index 3143145..9d1e1f7 100644 --- a/.github/workflows/ci-release.yml +++ b/.github/workflows/ci-release.yml @@ -6,19 +6,24 @@ on: workflow_dispatch: inputs: version: - description: "Version to release (e.g. 1.2.3, no leading v)" + description: "Version to release (e.g. 1.2.3)" required: true type: string platforms: - description: "Platforms to vendor runtime deps for (comma-separated: win64, linux, mac)" + description: "Platforms to vendor runtime deps for (e.g: win64, linux, mac)" required: false type: string - default: "win64,linux,mac" + default: "win64,mac" maya_versions: - description: "Maya versions to vendor runtime deps for (comma-separated)" + description: "Maya versions to vendor runtime deps for (e.g: 2024,2025,2026)" required: false type: string - default: "2024,2025,2026,2027" + default: "2026,2027" + vendor_deps: + description: "Vendor runtime dependencies into the module (uncheck to ship without them)" + required: false + type: boolean + default: true jobs: @@ -38,6 +43,7 @@ jobs: version: ${{ inputs.version }} platforms: ${{ inputs.platforms }} maya_versions: ${{ inputs.maya_versions }} + vendor_deps: ${{ inputs.vendor_deps }} permissions: contents: write diff --git a/.github/workflows/initial-setup.yml b/.github/workflows/initial-setup.yml index 50d7d5d..1fdc352 100644 --- a/.github/workflows/initial-setup.yml +++ b/.github/workflows/initial-setup.yml @@ -62,6 +62,7 @@ jobs: run: | rm -f initial_setup.py rm -f .github/workflows/initial-setup.yml + rm -f .github/workflows/reusable-template-tests.yml rm -rf tests/template rm -f PLAN.md diff --git a/.github/workflows/reusable-release.yml b/.github/workflows/reusable-release.yml index e158805..a1154c8 100644 --- a/.github/workflows/reusable-release.yml +++ b/.github/workflows/reusable-release.yml @@ -17,6 +17,11 @@ on: required: false type: string default: "2024,2025,2026,2027" + vendor_deps: + description: "Vendor runtime dependencies into the module. Uncheck to ship without them even if the project has dependencies." + required: false + type: boolean + default: true jobs: release: @@ -67,10 +72,13 @@ jobs: VERSION: ${{ inputs.version }} PLATFORMS: ${{ inputs.platforms }} MAYA_VERSIONS: ${{ inputs.maya_versions }} + VENDOR_DEPS: ${{ inputs.vendor_deps }} run: | - python3 scripts/build_module.py --clean --version "$VERSION" \ - --platforms "$PLATFORMS" \ - --maya-versions "$MAYA_VERSIONS" + args=(--clean --version "$VERSION" --platforms "$PLATFORMS" --maya-versions "$MAYA_VERSIONS") + if [[ "$VENDOR_DEPS" != "true" ]]; then + args+=(--skip-vendor) + fi + python3 scripts/build_module.py "${args[@]}" - name: Zip module (dot-free name) # Hyphenate dots: macOS Archive Utility truncates the extracted folder diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index f04dcd7..4999bc0 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -26,13 +26,11 @@
      1. Contributing
      2. Project Dependencies
      3. +
      4. Building the Maya Module Locally
      5. Tests
      6. Linting and Formatting
      7. Documentation
      8. Continuous Integration
      9. -
      @@ -65,36 +63,44 @@ `PYTHONPATH` (see [Tests](#tests)). CI installs directly into `mayapy` since its Docker container is ephemeral. -

      (back to top)

      +

      (back to top)

      - -## Tests -Tests use [Pytest](https://docs.pytest.org/) and follow the ["Arrange, Act, Assert" pattern](https://docs.pytest.org/en/stable/explanation/anatomy.html). +## Building the Maya Module Locally +Stage the module tree the same way a release does, without cutting one: +- ```sh + python3 scripts/build_module.py --clean + ``` + +If the project has runtime dependencies (anything in `[project] dependencies`), pass +platforms/Maya versions to vendor them for (requires [uv](https://docs.astral.sh/uv/)): +- ```sh + python3 scripts/build_module.py --clean --platforms mac --maya-versions 2026 + ``` -Tests must run under `mayapy` (Maya's bundled interpreter); plain Python can't -import `maya`. To run against a local Maya install without touching Maya's own -site-packages, put test dependencies in a disposable venv and point `mayapy` at it: +This stages `dist/.mod`, `dist//`, and +`dist/_drag_and_drop_installer.py`. To test it, drag that installer script +into a Maya viewport; it installs straight out of `dist/`, no need to zip/extract +first. + +

      (back to top)

      -> Assumes `mayapy` is on your `PATH` (e.g. a shell alias to your Maya install's -> `mayapy` binary, such as `/Applications/Autodesk/maya2026/Maya.app/Contents/bin/mayapy` -> on macOS). Otherwise use the full path to `mayapy`. + + +## Tests + +[Pytest](https://docs.pytest.org/), run under `mayapy` (plain Python can't `import maya`). +Keep test deps out of Maya's site-packages with a disposable venv on `PYTHONPATH`: - ```sh - # --managed-python forces a real standalone interpreter; without it, uv can pick up - # Maya's own bundled Python from PATH, which can't run outside Maya's process. - # match the venv's Python to your Maya version (2024 = 3.10, 2025/2026 = 3.11) + # --python must match your Maya version (2024 = 3.10, 2025/2026 = 3.11) uv venv --managed-python --python 3.11 .venv-maya uv pip install --python .venv-maya --group test . PYTHONPATH=.venv-maya/lib/python3.11/site-packages mayapy -m pytest tests ``` -Maya's own modules still come from `mayapy`; only the test dependencies come from the -venv, so your Maya installation stays untouched. Keep the venv minimal: `PYTHONPATH` -entries take precedence over Maya's site-packages and can shadow packages Maya ships. - -Without Maya locally, rely on CI: it runs the suite inside Maya Docker containers -across the versions in [reusable-maya-tests.yml](.github/workflows/reusable-maya-tests.yml). +Assumes `mayapy` is on `PATH`; otherwise use its full path. No local Maya? CI runs +the suite in Docker across the versions in [reusable-maya-tests.yml](.github/workflows/reusable-maya-tests.yml).

      (back to top)

      @@ -114,6 +120,12 @@ Check formatting: uv run ruff format --check . ``` +Format: + +- ```sh + uv run ruff format . + ``` +

      (back to top)

      @@ -132,22 +144,11 @@ Serve locally: ## Continuous Integration -[GitHub Actions][github-actions-url] workflows live in [.github/workflows](.github/workflows). Two main ones: -1. [ci-main.yml](.github/workflows/ci-main.yml): fast check for code state and standards. Runs on every push/PR to main, or via the `Run workflow` button on the [actions menu](https://github.com/{{PROJECT_OWNER}}/{{PROJECT_NAME}}/actions/workflows/ci-main.yml). Runs tests (if any) plus lint/format checks. -
      drawing -
      -2. [ci-release.yml](.github/workflows/ci-release.yml): does the above, then bumps `pyproject.toml` to a given version, tags it, builds an installable Maya module zip (`.mod` + `_drag_and_drop_installer.py`), creates a GitHub release with the zip attached, and deploys docs. Trigger with `python3 release.py --bump patch` (or `minor`/`major`), the `Run workflow` button on the [actions menu](https://github.com/{{PROJECT_OWNER}}/{{PROJECT_NAME}}/actions/workflows/ci-release.yml) (enter a version like `1.2.3`), or `gh workflow run ci-release.yml -f version=1.2.3`. -
      drawing -
      - -### More on the workflows -* Maya versions to test against are set in [reusable-maya-tests.yml](.github/workflows/reusable-maya-tests.yml). - * That workflow only runs if `tests` exist, so CI skips pulling the Maya Docker image otherwise. -* [Standards enforced](.github/workflows/reusable-static-analysis.yml) with [ruff](https://github.com/astral-sh/ruff), minimal config. -* [Docs built](.github/workflows/reusable-build-and-deploy-docs.yml) with [mkdocs](https://www.mkdocs.org/) and deployed to [https://{{PROJECT_OWNER}}.github.io/{{PROJECT_NAME}}](https://{{PROJECT_OWNER}}.github.io/{{PROJECT_NAME}}). - * > To enable, go to repo Settings > Pages, and select the `gh-pages` branch as the source. - *drawing +[GitHub Actions][github-actions-url] workflows live in [.github/workflows](.github/workflows): +* [ci-main.yml](.github/workflows/ci-main.yml): tests (if any) + lint/format checks. Runs on every push/PR to main. +* [ci-release.yml](.github/workflows/ci-release.yml): the above, then bumps `pyproject.toml`, tags, builds the Maya module zip, creates a GitHub release, and deploys docs. Trigger with `python3 release.py --bump patch` (or `minor`/`major`), or `gh workflow run ci-release.yml -f version=1.2.3`. +Maya versions to test against are set in [reusable-maya-tests.yml](.github/workflows/reusable-maya-tests.yml); that job is skipped if `tests` don't exist. Docs deploy to [https://{{PROJECT_OWNER}}.github.io/{{PROJECT_NAME}}](https://{{PROJECT_OWNER}}.github.io/{{PROJECT_NAME}}); enable once via repo Settings > Pages, source: `gh-pages` branch.

      (back to top)

      diff --git a/README.md b/README.md index d5eb27c..89edf7a 100644 --- a/README.md +++ b/README.md @@ -59,16 +59,6 @@ Wait for the `initial repository setup` workflow to finish before cloning. See [ * [Build and deploy documentation](.github/workflows/reusable-build-and-deploy-docs.yml) to GitHub pages with [mkdocs](https://www.mkdocs.org/). * [Manually triggered releases](.github/workflows/ci-release.yml): pick a version number and it tags, releases, and deploys docs (optional). The release also builds an installable Maya module zip (`.mod` + `_drag_and_drop_installer.py`) and attaches it to the GitHub Release. -### Cutting a release - -```sh -python3 release.py --bump patch # or --bump minor / --bump major -``` - -This dispatches the Release workflow, which bumps `pyproject.toml`, runs the test -suite, tags, builds the Maya module zip, and publishes the GitHub Release. You can -also trigger it manually from the Actions tab with an explicit version. - ## Acknowledgments * This project uses Docker images courtesy of [mottosso/docker-maya](https://github.com/mottosso/docker-maya). diff --git a/docs/resources/images/ci_main.png b/docs/resources/images/ci_main.png deleted file mode 100644 index 36eed47eed0b5dbf03fd0ede9caee9ec3da0b434..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 62841 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 z z;}r*DaarO&*UtQ(Yj=12Y_JrTiiJ&m<^MAV3NQWreuP#hprk2%f1f1Z=ilRx|BU-` zeb;*z9cB6`{CI(RW5mB*&kvx=FEv46kpk$n`@o{EkrC&3jg66N+wwqIiOLKs_{#(9 z3?b$}^yS0m#(9Xn{ipxtn={+D;iknp<-=8C%K6$Y0IGZNzj$Y=Z1^~_ynO8sYwG;b z{8TkQ`yY1b_R5>d3OIKy)s4VVV)Fm~I}5{St7mfn^8XD%9Y4&H+bU5zg@*T{ z@Dp}G)9Zas6K0Vpj!sEIM8zcBDzGa+-=v^_)&R@`X91pZ>CY3q zXIXnO_c81*d&>i)Qk~5cW|&YdQ($$V;`@lUvl}(()InuWIj>5EJTO_6ii#@!7T3{G z4S9*_W9#A8QshEEjTs)}#-$EjeH4=Ya0K9|V1{z$1f~dFi>&FV_M1}>xhL#hdM|@n zB?=^^0b==Oe_uv}`uxYaf#1VxbfI++oLT(ROKdZ%G18;@Oif+BrF&~zoATtQ8>CYm z<1kt^@Sgz*^39*vsaBc8+iaOf41)0QZ6~r5hvD%;!6$-sw2U|kb0Tt*WtVIK#~!?g9t=V)wxyrBOMlO_0h$ zGkUI0@Le;N=mdE$wcqB!Y-795Ly$gdMdhgh+7WU_pZ3p)J*wDrbrMvDZ^&x9MFb9y z+38do6khw0{p3;5nGSF|n&gvuQc5HL%kv}S#7pu1wO{YJ`S{vQTugyopO_Ts`DCM1wJiMYWDm?;h*{Faj6lW3YXJdc)osan^jFgP;p-75~oLH}oEUJ2=zu)63_NC+35yn}27^i-qa^?HA(9|4xsb zWB<;wwwH8m8L20r8TfZz|MQRk^F5tE%>an||MOv?zb*0qx*={+v)cXqhT0+vhv26d z+lRjwdg-5k5G>|2qB1zdVx;N_>IE-X3-!^Lx+0A(((Gr#&eA;isXuT$Rl5HM)tY1= zeP{0!(?gn=$3a5F|1cimygICVgywV_e_Xl%UCrP!I(mu%HNbcI0q(8mCJKD)hACr*c;XUXxRSNMo+`F_$Ub6BL90Ie!#(NpSa{kc=g$? z8ltLd_?ww2{u$g;phNic#J(9{hk&#GjkA9ilUUv-FSzf?8C){kiu+k-1c9427fn_8 zjPQ?EyYj+gjsWHKg%^r6r>|`30Ur|v%9)0QtH5_NCmSP7XR_h4!3EW

      ja_eN@u| zn#VAz=>wRJW9BX!N=}&wM3uXT6`NNkUFmutt`t;q6tqzKqx?MJZ(uQyn(lhS3_ey9 zD^-n8YTMuU1=oyUd2_-Hw9fz!*j^02&Qnei-ye%e9k(7?pEuj5DHOTnHvbs3&UHmu zMqq&>Fls1USZAs*b_6q(f~c^YeR346P8X`H*t52-!7;bsI9op@yex1sx+rk;LB6); z2^!ALOtFVdRtp!)Lih)|zSY35Z=L`2_Tpok zpuR1le>WPgR?aD(_7*h1o}>wKz$ZdZN76;9PC2;81Yt$i>4QBYOI-vInI zO?n~lAwWZ8%;}HPtWbw~%AXeg7}{{$+`bsv5jEla=en{#x7gvQ+~sDTxnNPajdo&HBG96Zk(M z*82bT<80p@fdKU-F#K3w!lfBQF7SgCadXf967TM6q@+u4HO2^{ebJ|Qd9|JiR*Tky z0h9BtVPalqiu~c{i}Z4~aK*Yw(fzp0*>optGulKihM)>XF3SNM>-1(YFyAhJ0uD`n zB+78+xv0DTDbL}wQ`bXSUj)V3Hr06#Ybzy^?>US)mrJ)ckQRlif$P)z9WTkHxoCKG zKEKcA%JrqCrAtgqyucIVn~7;Xp@}TC!LkX&x++;e!r|2L^K_ieEF%K3zbt^h`K=Of zyDez)_=O)6BdPQK+QNNS3Ze0@qsXJ6zK3A;>HdWW7(kHg=-Y0!{!5NYk6A=sy!Vyf z8vo2aw17%>A{Z7MUAOdI3+7WQa$eyG=#wO|dOP)8b=|Wf(Iogb}+#8WL-dam7tSH~9FM6xd&04aQ|I*UXS)!m<;kYE)d9jMRRIBoZ7GpJ&8A|jv(gr@{gX#{C-Gmcsh1NxbEwOlM&KF zj#;8F2Atp*3ot^nAFt`1fT)ThI@r$B4vHC#CzX$w9HZ&OPd3)pTh`bo`pU0Db-`$P z&^EgEf}^OJ@qFXOTWdG?lkW+kVd<~;KCNr6fs<*Oe@=Jp_z}+1tM$ICxr6N%v@UAC z`#_vT^Gl4j=8rP_@PJJGv(wAS7&?;wEKl(_tHx)qi?Q&4Lshle7i<-7Gq?d+1bD&U zGCb{1#zxr9= z%2@qS%)7)Z(-lXK^&px(JPqRbj>XRJFlgK%0j}dSsLYK2d2UNJHD8wu{fMI?gS-Ef zC!DaQ%cB|BNNDPgQQZJTHdis5j*m38 z=m|cd!hR2rWs^0bI;-ez=SCY_Qr!`99axmr)y45uC&tl&re*;o0q^Nxilqd#@;jH- zchiOpTy`XZJ4^2!euRdUqK5RU*flBpgeu#C37LbDIX)_vm{dV>bzqRA=#AAtAT_Hs zrcPUuFJaqbyU$imDUzMPS|58k^dtO_D&# zfrtkW8 z-h8m56ysKdagDfVW#&`|0f)w?RAJ&w!p}1QtR~V_5Nwg ztfC6r+cFi;`N4FX7werz(u?N$73le-p2$WDI_yH*z6QSXGsf2Xr%{9()tDvhZl76O zQ$$t|H6L0~)z5h23~d5e_m*%0xN8o^?S9tl7fnnX$zU1gSkCAgn!{g%_x6Zhz!% zvSKjxUdA&+N8N7*Q2m4`=0wOwNz2qh+W5RZ2B)s7dUq=aN~mvd{nTaXR|~&>AC&d!Su zai2k$$?(k1+L(>%0Mjf6Yl-zGt$Hpr-?oxx=B4^GB=(HmJ(Cp}Zt(h)g}By~56%I& zFxYBs?nG-|=EmuTXIJnRvQzq`bB`8|dw>h_OvUjfDvidf7fCfcM~TjVjt zHIkfpHG(p}4S5-U_8{!y5-FKP>mf>Rv;%0cJ`;u}|9G<-9Fd3FiQ(Nlf{@!w}gmQ1a`6d_3+=#-law*ya#|uI!IZqq285bJ7me-_b>dm>)6ZRM@tC zP(sXMy0tPFI9O4_vUC=`%GsNIGFZ5I^TmM8*1n_o)e&NL6^1Oj(Vl3aJogymZOlwN zCMKCDgEFN+fk4NSP>0uuPS}>?aWjvE$->10&ye2O520R?=2C%1w_ccj@&{FE)XpBz zv;V}~zqVm@kFwLqnaSi13IXj~-mo-%tP-jKgY}wZ#peu=23#Me5xqYFX^s+yA6NCz z1lH1Sv(k4T8QDuJXm8}f#W=>x<%Tv=Z6CTaE_7jIo=PLB(NR;8(Aq%)DU8`FCE#J_ z6N_fxAtbut^d|i#>-&mk_VemK=02m=zzxGK8Pdv|P$3U|4!#uV<|VlRdndIQUGWbM zEgcBe7YCy?W$d~NGuK{}5fDTH4(U z$*eNbl5ud?9glj>-Ol$0GU`wxv?;eme8Hyx&K|rVGr0i#ADni%nSY~IJC-%1Nn96v*gwhp6nymJI z6u0U}^pbiS!+Bbj&CEuFZTEoDG{agYVl@VU#t^toeA>x}4Vqg=1O1<@UiX>*8n}>4 z9@h9_A@X}&M|i6JM{Cl1rx!YzqXv^U4R9YB{B{wL2`A0Lg~OR8L`i#z7SJvIjcZ$t zBdf*;pK9-7Ffua(6HX=-7C%^NWtdd1>6vU)O{w*q@D5@1NPyDS?rtn3ua-wjQtW;D z7V0C~pB;y?#>dM#}OG08u8RIC`GsZ%ijWxmQOQ!5PF_NeW*pcA=$&)dVS!=GkU`Dcbo zxKDW#o~Xd89P>J*xB5(pF+Wd%8MB)q60EyB0ZdogOikKH{0g^j!=08qY-LyFJtvy6 zo`v1Dlm5vCxY5#Tyv<&1)l}Y=ylEL$v5aVGu{XIWQk08Icuo+Q0byhk{)$h^*f@C) zQpz}DxV0B}uW87yu+y5tx+jBJvZ=B=EP%iU5)-v@((0n{oO_HHUHckV3T5eY3^h@YwXz z(mhDf`r!dF^KDSy16yv=6T=fmh_yYIBfRqZ>0~9-y`_GqgAc>~Fu5_Z@-CEv{Bw=?C4bLh(PBOwnCibmy# z8Jw$Iu7@cC$4cwIn*cweaosPo_pdgfcr+93{U!KCZ)foIy4^C%K{CE8Y3hpU&Xf&J z^WHYzAh{=uHxlZGa8BXuEJupvwV`4#1v8yLBWg3f=(tCisQTb8q<3D@tW!W3`2sFD z4tSky<4#=@5%U_i0zL`*;r@w`@3^#p>5WI8oK-V&uX?WPqS28a=S1KskT$)g*$g%Q zkwX1${!r>}n?D%cE!?cP>_q}%xrv|>bMi;}hl`pVMYw2-&-6Af8g`E!ykiImu$t?b ziOUr4GL*eEb8X&{VdOt(x7;ZraCcCqb(WvArU z&)G;OZrv4>#l?($_0ZOhbKih!;SNbTv=i)pwA^ivwv~j%+!K6+VkewCkaDv~SB}?0 zV~*u);gmT1TTRZwcINDbUJqmj z*OLsUAiQ^N`ff`pMOKvPRh8m=8BaKJu1H5`{h*!gZmmc;r;wqfl@IN)eJKS z@TR8Ro{%41zoV6`Ct%|O!(yFwND@8v@WSA1zRV_ZyroslR;z-sP68EnY-%OLEC$DV zHqfN8#Oprl?%odJ+j1D4WR+KW<79lb?Z)|5X_FSsF*?bgvMHYrw&O;|f5)c<)Toe$ zo*ehcB!<|@CqOOTEa66k<_AN4NvdKgLA!rDth4jYA*_|RRaHlnNgkxScCqb;cS&Q< zeqel^$D}(BNd8?hd<$}yg9=Jd0o9>C_rer^Bo5|{=9;OZ%MF!;tCFe~9MLCV#$Lm@ z)qFr&9uU`c@Pz?~l=ym0xPH-NHa>xF*_T=T5TW_?(&~iz@NQ#AT!#&_AZ$@15dl1YOO0<#?Y_U6{K5Apg-my* zLFGklrd09Jb8@&ssjNX&W?mC?`nXC+!&Ly#zq&=s#=n7gYK|L4_FRE>h&RSsD%#N) z4!l)G{GQn03CutU$tB*gpzb(>?x?>4;Kjb%&PDf~iy__Agwh{r|8#$rlIL!uz~|xT zcYgS7e%Zed$-O4pZ!q;X<94bP6Fr1sMTSP|aVVX*?igGQ098B^v@EYaj1J6d%5OLY z^zb$OvK(8>I}9?nh(iACjIM1TFWWT^74K@<7 zULAGL5*On)G##U&`vnBJa>xsH#ghbYeLdhSP<#oDg5N2Jb(jJ~4pB=ygnm*S?Jx?Q5ZT%}@>!Ql`?-PtUE%$xb>KkpsC-(@m zk#cm(>nNtw_Sdr~JwM05U_uzI^Si{GE5K%;Kx?oymu&jZoYuwCXP$8hi$q=%B7A*E z7Xt*IO8jG6gJH+Ml=6g>SUcEJcPW(|*c~E^3)nCBuwM1qU$Q}mb}C%2{G{CD&R(*X zrtw)*{;;PfD+Ba?hGN*lE1mt1{c}3GBd)#D7ltfe>>*yKZ}*K8jUZtZT+MiI3WEwM z_+&@YC$z)JMvcsOKh|+s-|h|5xdIP1&u2A$?H;Ziw@}9;Z8$BGQVobNownPe1x-IP zXw6S2?)%Jy^7``pTuGMYO`+5Zd@sPpbjg5TZfY{?ti9Cf-Ze0E5%?&tob+I3v7_fs zwsFdN#xl*vyNrjeD_j;{b`BX+RmaPCSZO%S87Io%3#Bj>rF-dql{f`mn8FC8iTu@% zzJoAHfH?vu+2~UoJ{??kPd;6JzWkQ)B7ua#aJcpiZv70Me zIz=w5P1a%)p-vi>|J{|girxe>()~?dnA;2Owx6zbm!P)M50?5N^z!RvVz$2sl9{nj z9N=5iAsk7aZKbUD`_*2s7BscvNh_TfUngCVncciQw}r6)O)!D@ym`ZiM3__`Y`y!I zKk`e~lcZ;c@66PH?pH2y+$DX5ls5BA&|bTdm*&y1)zgtZyMu3C&zWpmdW?xTn_=&| zgVDc^p)ujD!E}~x-A(iCt51;QbTZ{wq|AQVd9Yha zeB5+n;a~}7)h&IY5@&9-L%M;Kjd6Rl^IU@VF5=tDafBn@DpH;Y>}ipUo}60KG7;{k zE9`*>M^$4Y`zSN`lnN(=ui84t86=-ZisflDs+vnvMI{axvx6c8SWMpuH{zoEIw6gV znPEK$x^cD@+nZmsEKC1UPyUGiNfjbET*W>27?i;J-egJ%X#T_|ZQx-Xo+GC03O4wi zAfV$vR@(HvSfJFo8QdBI`Q+ml{>vB*8KtLdtmbX5bVN;g%CL#)?XlAF<3ZG#Ngx1h zL#H_I{+NKw8wtEAywMVS-uZ;1$;ILH<-Kp1C)F-nc}XS+Fk^ zOB=<{VLG2oBgeS(sRyB4tQ3cSTSy+Akz& zn{#j#qq4kOJNfFUaB5^3CwpUH1iypH`PccM(qxr=ZSt5Tv`LLn^qf5 z#~>xTWWt+W7fm?K4`7|l8&xMQS>Xq zyV$Ap=6YcVe>v&hiyA}C$tIWYzy|Spt{g(N%=IBSt%D%SH;koI5Ykz4!Im^}s<5hF zh)#M_t4Pnk@>TsYKCreZZ^yEwpHMiq>4fB?n>wogI5s!4y}YKZhCvYcRZEZ&t0D;k{UGHi_oI!FJ2dKj?R-LB0Oo0@K=l&XD*TLPq%++1# zksqR|N+fT4a}eelDSJ?N%>=q?Li!yCR$fE_QvXV0gf|GpLVTs&reqtxB+BNw-qPQs zppd_gx>~{p0{C@rm8Sj-by07yJ3mr-$oh(EgWJFB-&jO}=X#-w>8@@+phqK{fm?9;+_(%1pm)vOC<_`5#hqH#Xi< zgsgb%F>S-6B>)V?0iQo(RkEt8E3eo#p%Y9dM@QwanNDEy=x{c??6P*>*Q$oPVZw!+ zSig%+8A^9RjcLq%hdD<%l$v^sX?fnw<4J#KULd28JpC~+-c)sZt-G|Xv;396&zcNQ z>eQow7NwA~0j}_qFKW*t+g7lHCZdo>Pf18*Is(={H|p`(Ebb#~yYatd;ut-KFYx++XCJ3PGu?sp_+**_tF8_C*<-GM=RSW zpnrGp@lPzFJt71=)3=BN-O)$xtB>vMpGAIjn+cVj|J@RK$2x$_74vW2C*58=qB2C-|?%F#EF6cMFY2b;S6vMV#Qv+B>X$uGao z$0tu|?p=eDmTpp4^IN}D_argS;UHUl?Ea%h#UN|dY(421bedfF~RGYOVCrJl2k zDO|*BrR^Q;d2S*OTybo#{5YR{@+!04d92Q(M)6NFgHBezG8OYqCwT%ZNVOEPf=3(7 zJ*g5H{?L6~#Q1!}H%#K{h#z#Lx3(ip7d14$u2$^_IPzV50kBq-Sbg19Ek>BJzxMeWvp3R8E--jFJ(m zS>Lvwr_$ZEMqzV5`fPqt`skmvg5`oXuKKM})BUx&s*a^KGS$4wV1Pxo2fWx$l*7t> zaQE&x#gWjyRXYbTq^Z&`@93tp$c7+q+}Lk5H09JFXz53Z9lb*KK4{t>R8>r~28d~I zc}`mAhIGHHL2b1{d&Gh_4oxP};*@nE6S*HU8e<+Ajq&GCUOclr^Rur_r|< z`NUW)^pclG&znUnxUji-hl8|ua?JTLP7{qGEsu2XOS8Y;BO)ggbXlOXhh}eja@L3` zk_2sL4axZ!%8SI0tzk6}W<(sEAsDts)~TGwP1YDp)j=s9C3`3nN_y?ATlq?zfnj`0 znJhi94tTe)OX6wdgj%7`#LOE+%cKK}ut=#OYEeEG0CF1k9zEGDrem}cy#CDrL`lYF zB%3l-7^5Xe)m3UUcDl)Zmz{R>@Q7Ra+1wIy6TD!W;*374v}k;`ZgDlY-7k@~Zeg_( zo`f`4>tBon3(hIAMX$v#A?mx616iuaZ>hZd++BPo#4qvwo6LfAyrSMnj;@U>aTV@4 zwLPlZva!n%!2;or$ng_OM&e#WI#@!^i_AMU?>;$j9bW}Gy{t%iQKom*QP6RC?UfT* z+y44KYyNct`R8K{f>!;0Y1$Eu(FX%WUDN7&j)SeYp+mFVfT8Lo-wFs&4cUM$jM|XM za;PTZ)|?$nFeRa1z5NpDd@4>q8F9 zPWY(BZYPTGpkFFJ@@=Zl<)WQAG%0&PWnpiV_j;0Ow5-_-lP>hneOe92VDB7h5QdGf zpn!*M57#sZAa=%KAKBXvCcH`JgQb@8of8Pt1`f}r>U&~h%DX$Wk*cW;IrJH`_*&&? z&!mn`5;@mpV|`8^Q!clc>IoO;UaBu(x}hS?v|0N!B%5#bsy5Y^d_w-kW9=fVfK9Rt zG3D2Xt<5VR!AAK$vTF~)zv^ioJphw^f{46G-Y7Ux;&9b@$vW38cF{Y!Qlfnex{M5l znwd3aV@i3~*1$((YMUlxMw2U*TuAeAQhKkgjT>L*=pX&1x?uq4l10q!?Z>MKu!G^lEqK?Ky(d%wJ$5`krZ8mu2uS_d4^!58g*EZitG zsKbq=}y$CnE%xCv%B!YTEm+23oA>H^YkH-A@p*T}{Xm z*JT~(kORGNGAj;8r7TpPM1sI|9S!XabSz=l~p9B-uGxnEc`-J*n0 ztudRQ68M=bF(myhm*ta#)cdJ3pVyn40=c+$A3fp>)S^9k{{2*ugPGk)CTAj|^L5-v zjuUE9dQingS-?(wu;f6~ziT4VyjLT--UcNYHC69AAK%M-2X5MEV6kNufG}`BGq<-0 zbwpC`Np9E8`hB1s6|Q{MC#pbPsy}(DYMIgm#0xpD@j?sCi*mWZt!95ioA}!=@T7rT>L4> zkT{ioKJ}xM%k{60oubQ^(L_v1arITA=~iw+~I=>V!A~*2|atBy9Rv>*sl#j>;x%*75ofD2X?&HL(4&$==!K%0GnG+BI^&rNb*kI}a;e(dIx24FMOBj^rL5Wy-tra<< zD}eVH?OrO>dE!jFY7$P;ImjNz?z=yrc@ifoi89xc#J#bnhm`R z@OlblJvLoQKX)db{2^Vvp-g__mm_xv_nQ54otox{Nw~h$o4RRfCISm1KVp1Jq}tP+ z{6vL?QLdI(y1RuD_EFE=?G`P>{xA04`Yp;YdK*Q>{3r%0(t?Dvw6sbygp$%K-7$nP zlm*gCcXvuRsN_&XcS#LB)XXpp@$Nyt=RN2B56*RtKX~apGtcwvT6^ua?t9&?rzhq? zCs^;J=7@FtNm|MIV4Dkt`GWh{TR|vgs$Q&+LU^LEyR7F&+_=p-5YBp*@|DbrfbdpI zxq2bH)e^#3HkCyhKYO~4SHgu%+TH9tf`X7&(}5f)FaW)C|K4SRD&u$W(ik!`c36D)qga?r+@?QJwwmGlU)_nR(0IM~Cl_7Vd@6t9=F_Wl zMj;_nl0OEZ4M<6o*sKnMu4L7$h5m8YwZ|6$O%1jVj`e9XEDhgel z8ItWzs}lA<$Z3Rm!k!Qlz33r;#=@Y&5zBiBF}o@tdzY;!02iXp+HJl`A<_EmX(~9d znP1s?XF~_eD*sB{r?Z6{7Bfu}KzmU`X+Fm}AcF)yWV*0<@A@-uXcF0c8G%*WOj~;S zyj0cHV=dJybqtMfhyHBoV@_+eCsWm`LNUN3-*IwZ$HX_B9$Enh}aU3b-%@U6C{nwKWxkoUt;2^;^|-yAh8YCN>$txw0C zug0~-oBa9x1)~qZk1P{L^>Tn#K=H)u=soUO^5z78F+m(G0U7p<$hZBh+z|Eyth6DOmE1w)43XbC+x2 z6A3^g`s6D>6imFm8r37T8FRfq0AR%tjH5pl%@?e0b zubq7XH39j*zR=m(nVIwBB`Yf{10%<R{=0LInL(5i+lfb3qX9!OiTM+!f16SM_RE(F zSRW%36hHF#cmV5gVIrR%EimS#s}CQksntenXV{KP+6I`YAmY zPS#Q@jR6tYN=Cx9XE_i5_5j^GV3u|B269RNzV#LUe|MBJHr@Ij5OA$-`5ratBkIA} zz`t*L_22hyXEHK^-P33^ ~9mjBluR)qWdREGSU7~dLTF5{|^)z$CiQU9p0SML40 z_vb|*iuv~K2mSnk3R&O3y)*G|Cf$1HVmoUJ(U^a?kfD~{`?vjlQUAu{R(N70Bj}?| zoyekTUWSh~D}<+}^!(#|(V4f8a8#-@3UDgdx)|j^2p7%Q|EKQ;YF2jl_P|d8ALkBj z@|(ZiWb@AmTzNHlyq`8m$BExxxBEXY;qbc*B38xv`C;E;9#215JDa@|?0+ZWt>2Z_ zGmlL&O~5qJ@~tI|jE_LzzkYb4)C;DuRI#t3%_PG@u8O!2U zBji#TfJs@Oj>i3MP~ksr!P_@`Z8yLM3d`vtp%zgXEt=jWupNm~IR1^_+Z1408CH)7 zHG&uzv&Z-eSD&4ENZ=oD>6t|!n2i~e(L5=zd`{1O0$#|B?b#A5XZrW{GL<&t?0774 zvV!$h|0^E*?OT8XS)xn05mDinf6X9Fh4CLQ!4Z)oNuiuf0-Beu)6l;XCE`=?TbsqAQYaZZ)MgdrWnj`l_m7 z`;<@mioP%@J;};+{uY$fVEi+Mj%UN?!X_Kx%YB%C1OKGL3}HK7;+e0X&&kiBbhuCX zX7q)uf@L1E8sGK7h$PJG!e#kU+v%Rl>anNzv#Dy1|2OatCTl$Fz;v#(8g^Dxi9We- z86ssodGm&v>Y(x5TxwR8Ui-fCo!htH8WK9jr;qgZ?ZlTb)sF(!`@j6+mMRNRbU)C) ze+O%mpPyrprwU`}r#9NqEZ#lh8E;~pJ-TcA_y-W@Bl2lm?JvvL<~;cWE0gM4o%Hr` zT8Xh8&FezUGOv#mMD3RH)Majd4GIdQX@JRRE9-AWu`*^ds;aBAGqy^D%5khqnI@_R zuWSu(e3NNeJftX8i|!q$(=uG0t_o$y&KN5+01VPnw?U@yQnz#v`ItW2hAEh*7NqYu zFQ>6)W!2Gmrz zZK2_-x8DIiM<$BhU{SlM;;i+)-&3rNe7l^ZTt8}T$umTH}N)X%___K?$h}pw5+WTR8z#n<`>9?3cP{7w9x1Ujx zFR(#0rm@koDur+4Xd>wwP*e}8L$)6GTMYY^SO?@}JeH@3rKfIli753nQ7y0OJ9CME z@3^+vQvt;blu7-UpYv^_fPL^02VJVmLj6jP`RW+A{xu9LdR|j;00-$cF*AeMDi=jW z58mqI0H@BdtI^6~7f7fW<>lcnR)ekW%yQlcPilV4pbf4uE|3Z>Khq1Z_yPl7T&)W$ zy+X$NXPPiCOS8I6lSQw1j>)8H_Ir$U=om1SelqT-Sc!?bW50v!*hIw|aJv+5)kFR8 zdw#1wqCWXvFSDXIF);~?tca%3;uOJ^^Dg!^lT=w%EE$`1tpPP=W@g!I|6$_kRQcWF zzI}V_?|(HcBJABA5B;@OXY8H|WGVcn#J2%ecPX%KrU(H47>pdhq58Xs{o00P29j&m zy*|sVQ+f~MPbv*M9VdJB?gJgIQ&ce_SPJp-YMgSI+$^>K^8&BX<-SPk9UZPL439AD zj-hj%@$zGNbOa>yoX7!3ho$L>bKcSM_ojHB`mO3clA5Ccwlf`6$5lpBkgV;)0RLHE zzs@-tEd31~8(;}b9gcNa*r3^?I>yEk*U81}9eah8dQD7Cc``Bs%cCdV$n+UJ5BJM- z^K_rsg|K6Xid|6G3b495ek45B2Umo4V@mEA8gV|aFv7dIEudG!n(UIN@0@%k>mRt! zp=}MJH?IR?0z$3~5$yB2o> zNt`5TVN`;Z-zT4yAKBrYO#^n0wmo@~yDbZ+5#wd1ml6`xCI+|SFYYbndW$hZ?jM_1 zX|5)HrvvrZZI-sB|Af2;TGm7)cbqomq^vXcYoIQ?%Il0#I^Y?|}?URP#L$LUc&cS#AspaTn%EYDhgSLu?=+E8ne8#3WP zr`KI47cRla7L+4)kOq&*424^d%(bglt(5M(joy@UathMpb0~G%((|MsZn$jMv{PG; zn;m5kWS+FO5v4xAw{UYdS}RM5U##5&)YIr7MwsE5%qBnP7dPrO;@_sO+7PxkV#=$v zE*b06(~PNxoBngtY5u>q!g)4y*6Xk*_{HQ<2~!>GOM~Eew*-PUyv;knFX(KdJ&gvZ zAh2=A1K-bNIADoMTPqrzc1%{jUeGDX4kxKveaz1O?U+C8>52KS5~+hMm2=Sk+O+JQ z@Gx+^8Ti|b!z3o=wF!S9LLtp#*&?H@t-bpjs?wDg$+i)-JXvoME_%A}ZH&jP?NM63 z+m0Aisj@1}_dY$@oiDd=?6Rp+P;@Gvrl2}2{a_C!Df1m)Ciz47ufq-v_g(+Dl5d|Ik5X|EMXCh8jqk@!Q*YuBn(X4ZAEv#_ZN zd^yg}uFh`zXpu^r@PKQl3nFbTEge43f1#AJ<(q)QS{+kZe7qUNS>&LvS&7iR8~xZ7 z7~1uvE-m6%6nwZ52MV5xEPXLc4r_q%Zbr?)!3M)6jxD#=Ynrj$5uW?m&tv~)ol%va z8#~rS6D>I7t|k*qV^VdAc8C6Ve?%82um9#viNg+pA8>>2`6!9h`}t)WEp(+-A(xTk z&F|)}?SVoobDtF7{h35HMY0vuz6cASj{kJ?3RzSANwldduAIbzu<>7!6>+r=ugKRN z5n9X~m~m>Bp?R!dXCh~8yhrLxJt#6B)^T!-r%Z5FCbg0D1@`H~;4GcImcFrZMuHpW zY29)rb}m@Ua7Xllvd zvUKfpKFHd2F;p(xncuh%JcL_deLV9c6@geszpfiOd?(zhkgYbo*@HbA%4I6KMY&%1 zI4UBlvkW0>)Cp!4QQjbpGFvo9c%n$<=y*J*u&@q~J0{`})2q>G2KTrZe(4*1+|xxC zjyWf(9L_nNSqw<3!#WT}SW1y32`8Zz1|b1KLvM}UU5c&NF}*mVBh)e+RP`=M(U7}77L&qeO_^YLnb zeif)dF{yPvJT8v)_U)P50tyO{JVvV{A^V{Rx|X$XHXcz)Ny`F(by}m*`bPY+)p(_I zpuUy3(u{I~W6jk2b!x}2$uoh%pO-(nLBX8*BTK_kQnDq;!@w5T{Y4#%)^)`9CXZxm+^7s(H_WPPh=Y||K~=1MIqKubV*p0E9?N4< zswZF)P*BW0O7N(NPRltP+*^6ZYdquCBcdk@D=b25IrZz{KfYh?@cAVPVo@QH{#Azz zOw5yEn4CNbp=`0)^Rdt(y4suW{r=Z!xmCkFioBn{{m`AvJ6XhU7|p3~lE!>#eK5N? z1K1vx>}0wfuRGO-Trtc9S6YdIj{CWJLz z{;MbLY!>MrLywv)BP?5~={UD44Q-!;Mut0EHY%1kE1<2T|ud@lRR=^+kvdzViW znBz}IYW+*4A@?W4I$~a>+vMU5+?;EJ9&rDTFpLq_I63KQ8Y+ajg52wlV;i}df=uWZs1IUZX~iXzIQR~fbKKp9aCLpe?e(~LJB4Ao zxSI4rgbyFD#>|vV+{$#TsR61R^lrT z+9hcCpVx9FdT(wxEM&rDT>bq+1dt_WSld``sA&_E# zLxfd3hI)4iY4|=Q^~5Zz1ThBY8AmviN*K2hNgl=xhTZrcDsd>41;c3VB}AfTb@)W}a_P zbp54tw4uWnH>KoI2v@9mCpcne%Oa9YYYzNSJ$G#4N7?}g`K@opbq1W~TCUxqDR9d| zknL*Tg9dK=Hy-dwsj8|e39(rf-`yy#tC}I~cLojku?j%faSQKG6dNq6P$6Yf4g;Iv z1i#AlomR7~%lc1Z7N<<2Aul{WPN#_t1uUVw(T1+#b3b402JRpy_`e6Qk9Or3E0$Sp zS-}sDjn;R61q4p0*5@Gk{)7dZY>XLY0@+h9#A=D`skYsMPJ{2Lo@*g<8@bWR4Tt&b zn^$8i1iMJBIKPn@yifggskV@ut8z%pV#AeM3B=J)WhmxhwkO1F216)1+v*edy{fYm zOXEH)64i(=+KsjBbQK`-8MzIjUScc1UmJU5u)%Al?DCkA>c1uqk-;zBt=)q*6E*A2 z5Q#=i>NIn?9wL!%{VMr}{i9A%*rw>JS8sd@dWWYnDcIH%2CC-p`$LI|lO_K>c_l zt!Ir!6Ti|+F)-CteTAsIpoPQB?ZTt==pqIrv|*RJ7!t~YCFY7O5CYzi8R zjvGA^6|+6AA2opW5S#pRnXt%)NAsG+AhsL46hfB(a6Mf16leYn`!d<{n6esp8kS;O zIwNL!$;iv6+usPm&5ue=2Q%ew8wzw96&*{2b@JjI-wMjkAe7Fxio=KhZx@(e?$-?||Ey0!72Co(FPNM>r*c7dvwwJWiSg|hsN`Zf$L{*oSzBAlQ*e^o| zCLWrnWJX$MzbHhF&O$LIwwtw`3!^_}KV<-%WN(2W0|&p7morL?sd`7O2mt)YUEg2$ za0=_2T;D_`tq)|Y&_ZbrYkKjXsKCaPpBGN8M%S{jM~9R}g2=4Gj>O~D&?1pqGvkir zlOy}|^FrPUDZ{bb28cnNs2Hsn*Kn%QWw%9?cRt!$L!>bw@2wx`U5(8O6A7-WV)g!? z$eT&e^3<47(T45_51^@qTN5ilkq@nJCub+;MWyt@dvjf`_d@w?r=AKum4hn*hPxq% zJP`_>bgLjm_}+S!i>EakU{(d6kv#DHah+DE^ZFNZO0~$(EL`XjrL{Ck+Dnip*n0u) z*i|ct!DN+Pv?qRdLuU|FVAW<)ZY&rT`^{FKF;@lzT_^)Bs`Ec;zeT7vWQlH=svWlaXHS1a;L(j zegz|Dp2{MP+wNS}qwb{+XvbV>V@RpHp+5&5fVW_&|UKCvdv>%^`9i4qy2b}&( zzSY-_5)rFR`l1pX(y-oPh2B;vxn$TSx%rfzVV~+|X6Ry3S{hE%BXN>?mKS%cn(#Iz z((i{mBOOu2TWFD^wqY$pj?q~sBa>TYj;+^f-v4gR+JLYX=+tNe$)hkr1ql+Blwqh=Y`Gt-%oLys72u5lvxF9LB9rOLZah54@H=%&jUx8By8Q=tzmk8 z2}Yvx!RvGytC-&($Mmb&0opI1Av^r=BS5dE|A38P=a0@unOCK&l-HLX@W8|IGGo;#E zI>S#7t3>e|Wk3XSlUm^I@6Vmcw4&5!=iS;oiZd^XoQSI>Ul6;gbR`eS)prhS8JKkP zZF1M% zgU7Zjm&CTj>}7ZiVBmDo>aB3KivJVa_A&T4D()Sxq4wU zt|Ot?wDYJ23MP=#S^>PKi!rxN^h2`e?)RhWAAg#5BuT^+m4%KK>zH_8BZ}Hjirw0W z)CH2HMb zjGV_QXPSQ3`{q${{qcw{p^L?*L&$X3l8ATpWq&M4BY7#~PM%%lH7KYlR*DyZ+f+^I zSQ(xqT?G_0qP|M*7RDEvdWgK#TOT1-bB12Hdljr01qrLp3^>y`vU(#R%ll92^9T}_KYec? zSi@1FVV>Atj9u+7b-4B$V0fE+z(~x*`%Il>M_6@X#CF-O5gN`Ww=d;9=Ag19punjK@;RQGU*D zN6DeM8}B{DaEsxUi#D%DUOv={1|ajoQq_8st`T=;pQ0`tncf@LX@v{P&vZ&wkx!q8 zdYxoOkIa@j<11~@Tdp(pHI<9#O~Kg%8g3Yt>bo3 zz`<`wu*`R?7zVCkv~IvhU&kfHJB>$HU~=I#(h@_4u6vQuTKpM_YkjGoI4ZboTckUC z-oGMc>lL!_Y-ACO@>uwY5I-*eRjpvbKHow?@oD`EGumSFeF+OTgXM;BGo!)&baW%K zr2WLA6YX}Gn{9m+xLvXzIfJC7WX4pRT^cKuG^ZOC1tc1uEARwvj!cxAp&~aC)|FNU zw@bbc;CoMkm3wnz%E5umQ2A+U-qIYP98A8sIJGkpZ#NNEIg&4)3R8+>_|N#@HZ{$Q z+5Ga4;$BBj)ocqcc>4An%pGHGaveb2^Baf1$C1M{X~!s^oq@&=dmn^7?Flf=ol!^e z62Dgy3$%VT4cb-pQxS~1hp1wvif`lbA49)%eWW!?LILh-4p|>>{@B&J#*j{Dp*Z}})6>CH=TMy_l?U>&%4&Qzw^^~-0u4zk|!R3#>- zamS_DK{3@RT~@qTM`W$OG*z!(ej%ZZWPi4U1a6SJs}d+ z1Lf&8xKG`GjaCjlDU@3iHO(_^EzhdR*O~<5yH%iY>ySn_h0lL}^3gUp5I+^y5 z`KY^x6gM2^v0R?dPWI4Y#1whc<8Dw|sVHyeo7!&!%I{d1cQARQ1!|@tiKxguu&b6( zLOM!H*k#2W@_`&6F_$W?@AJBDjafhruk+b$b)Hh*zaC!0X32$A;)$I2U9pC6G8A?Te zda}$OpCjsv17%@L0>XasIK5&S4mW1hW-R^lhhMdRP^7JTmkF6y^@K+ZX^Ud^|3o

      BRfdaP1>^T_naU|NwL6nQ?H0{fli(P&N9`nE(gs8_CspS{p4R8xd*>3Y zS^R5n|wH%5M=I}N_yU;R2Znc{!rXBKo-2(LWpVHyEsJff&bb!U#`B9^R%pk;BgA7NWw_W^qKu{ws)Vx|aFRU9K$L^-uYG z*mFd;ED4=f`tfI&p~Lii#^AXAW}KD<5asoFpLo}XE26=0D>pGAFfd}qb>GSnAtdYO zHFvMi9u1fMa8o;t055{rs67cOF2S2`@JpFbG{CArCe_EjbT;Hx>ij%KQo8$Um~`ck z)2}hvoIyG{&*6=WTFK=k)F!)2S_+nyXkTN)o`X_(F(eh7Wf-fa{(9KFT-^V)^>jH2XR9~e7e^ZJtaMT^X?{di8z+! zt3=H{5I(C`L4hvYK>qZ*WYLkQk$>bR<0;X5be;-^$mcA>{;DO`!@+j*Ydc zb9e`_Vsm))WTExV(CXj-g{%G{#%?CT!sgYFt+TzBo9`@XPH5^x^`h2jAP>Xw{+fJk z>CsxlwxT2F70^{*;{UVB^awY$Ye_T9z3$mwY8Svcori6^ zu3mz;C1OEML1yo)fHH>kKujwbkMUZ;UCEJ&CXf$14N*Fc*1Hih$5ZZmJ(#L^8DxwD zdyK>^%4`U`x3<5EsmkA@4#=eI??)pH!G<^y5)j}B$B<(Fn~>X4Ma`wMB{2%!|) ztQ>jR@*p@dU8D!;Hk|6*{2aO^U)>fc=57r3wKRI1@Li%lfo;Q#CzamL3rN!y7YAP_ z(N^!9gJ#r758Z21FjRw@YEtmO<%@jGiH)+e5XYjHC^B%Ih(yE8oLrSB;z-C5WgUp)i@0yM-ehvJS26wErs>klaZ(3`4 z${LK#kT_7@GKSFWR%z1G<#0HxCw*3{uZEco*F!H{;+yLD+3)>KU>@_TBBDkF51CJCQ=&3R-ko=3c|BMyU)01n5i+ z=n$h2p|&U~)1Jf5sEMSpv8OcvX1t*@O(L{-i(J?#M}IG2usgQ$ZZ&$nL0+t(O3T1G zljX8n)z-9iZsnI*u5!ljl48gKD!V4MW(C*d^EFw#3(Ss3z0xX0kc8rX~3A9`pjXVV_AsI_&{jfW7HS6w#`*+hZEt ze}8`3&;N!DwRvY;#K1vXq2pdsxpDp2%jO|4sU?n&!a3Y1B`!N26Ecl^ROgBM?t^GM zR2v#6aNn&8;x32WnMu9&C_F6#k@#y0<>VvP=(b3f#n- zpuIv1J?QIMB>asDJDJ#@SAU{sR>UkrG9mdNIUBrgT-0yEP1{|q23`NW&cpqv1tgZ= zsm=vo;KvELVid!_!Zsrm@9S4&0mF6X4L-b zfenQ1q$SCEa_a)SiJgHNUb|L*qX`YAeLv@|RKw|>M9P^&0MeLy0zm>jWl~b7ysnyQ zlLKhF@ruzSMhCfV_gJS- z(_Zsxt>HhiRCFq$xX-hlJK9YLUqlbbj3WK7-&w#`?cZux37gTLtaw$>djnu-th17iIKG=VYbwfuXcq*9!qTlv zhofh_JxP2?C{0Ju352pfYPReR(RD6ve)v9yA2aLFUa|H9d^%z-ndT&1^k}=;1!B|K z>__FSK5aOY<2vg$8r3qD-hP69-{24bkE`~j_~F5$I?ZWFQqw)NEB70`1`Xmgk?45L zE@W9R;UR!a9~h7F93ox=MeU>S;8ED45c zD%P~#-KIS?4v`eX_q`scogI5-;jxWsKQ-yJiPgnsFwVC&!15ct2MoN>S2gRaq3tA~ zUS6I-Jq7cK>+uPuB2>Z?hw_=U>6Fw4R5#)gfqjlafXUXwq0iLCm{+tAF}V4OC- z)#oXC+&wtZZpQ9TJ#RlffsSlXPKaP{z+=A0teBS-jVgsdb=F5dL;0n1BfeCcHW07~ z$NG(Q5EMxH3xC92eCti+fTWq->5&N~d@{{|fx`2eCrJC=yhnf2i$ zvtOe==Pob`jmLjZ<~H)3a;rPNUrT1_=syKu=$mnJfRJuoae5yxuR2-+xwuXIP}02XUQI!= zksTe6$$31gL8>p_xlqD9F&$uG3LYKwiX-*N-JWTvD$5?epWl%MeM&CoE-&qtyD@fq z$}O2$-z8IiKuEy$HCJ(?-f&6@Kc70nF67zTF2`*$5Ms>P@n`y&FeW+ds(kW}blQ(e zTiB_9qCed7$sPG?bV+KhSh6(q{{IaVMD;TWXtv5S{A}Dvu#THL#k2jbX^2cPg$8axJ*uMga7UJQI5r{Q!qBVnXbIuXf6uzG zn}kxlz%jY;9_;w{qX)mD21cwvxz;ZpSp8ut*x~qvOC&i*)?y^tt%erzn{-xAw4(-4 zn+neryl1E(7OCEc-Rz16;YIrn^&HeTF>kzp8}lNzVboo@@!TS)GB>^f9e}wbsa<1X z8+}MPP7&FDwQ?W2jxUwg-95yFZ4BkAEs57UZN970?Ek5htnKLnXhpiCiLe@&>+~t- zO2zwyCOh>l$Z)+^Z8DGm={m;FFlS=yK(66))b1|Nc)i0X{k;*|^4|VDvDM#GqkGHa zVbLM4pKML-ZRj{pR@q#2cib9VP$>Wq6yS-JWMc9&7t%()k~!0=F)8IGoGOB$YW*@( zljFH6UQ|CHV2RHmUocOYYteK+s+#eD#3#Xe|6s(fy3`*mHYGo4-|B;{Zafm0!BhJb zgWZwBtavw;tZ5ky4TC~OPb-Ha-w>a{_N*=kRNaHma82~uhY8J^cAZ4dXsX|G+ei+D zkDDF8$WlqRbtks??}eYH5C4-vh4n8;!-v>etzj6;EsD>2?(od4FEN*_Nsg}{7cie3 z+X>-X!av@z7E*lZhURw!^tjlX!Cem~yp}r^TU7D4rsJk2xQSZUSmCe`zWUE0Wp~N? zOY%m4^1^*9t9tL#bweJ^O8OEgPf=A|?&)p|LSM{k$?=w*y>6?j2sIS?^M9Otdv`B2 z6VjeyBkP5u-GXma-MyXa#Jvw|yxk5En0u#u&kImJa7=G%PWN7U|0(gwVfPy9pf29W90V^2_ZglvdJ>RGb<4*C zl~5#Sa9lXa2S7)vVn5o_ty|`QxA?(P>Vjn4<>qgx&5J7~8e+CXyCxD{SxOr66PSX( zW5-|O0(8XV4o|~cA$guf0|$$ERHI<==!V0RJ!WSe@2zjvor^!&OQsP3!M|5I_V^@X zUV|ar@%|WpZbAEc-`?1dnbTRPAM?`3y0P~C#Czgm2D6A!=m7G0aJ4ce*ZoXq>PL@x*i7l2S;`l)yoLGZdq5o_uN@!F5Skj z!Ry|Dvb3Mc4R|LoA+Ln%mxllf<>SZmb&R67xqkl<=}u?LU75ZJWQ49e`2TqMN}W@e zX7aJg#lq+ZY+S5+RL#CWRC;sYi)Q{P~)4Aiz2e6eody1Mn?M zyCHA6K4oWAzn(ckS*fl-3x^45ezQc+5dHs>NR>sUdmH9{Tf%F?!rr;92ao<17s~z$ zHZURpa;$jNDiUBkc&f{MFLTQ^uHbS0x1LbjZ@+_wFErXOiM&M%&Q>Z0s)1)eoLaSy z&X3}X?(Uv;3Dg2SA#zM9q^c-vBJ~pk1CyMSVvv*!A6?6hTy7Jc-kFBj-PzURu?p79 zAv7FX26zbhlN5Kmwychh6}o8UninBYYcbogcE?y}UPXP_nXV0y^v9w^7Cpmvs3@(#uwb+8N7ke1Lj@$8C2Vx;LB*&xn~yWmMN5COckUr z>d)%@26c@WzaW#oi`C_0b<_buFWf(zD_qyM3DSGi`jni{ILB#oL|=7qpj*_1m637S zn)0dnj|7)CZO4T|*N%*?qKFR{F2{~~ZjP79W{F`7tfzj=*k1Mi3%~;CW#-T7>b!?@ zl0A--BZa2^S%F`JBetSV<@^?e$2opQiixPXD9+k0H(7BJQr93!J;}hzssMN^i?voo zks#YMq18_lOe$SX$NXfdItW&Kl5Vf*&d@-SXCgoOF7+SnVwpPncnH@g&H_1SSL1?l=~%M!ue- z`qMvtj(BR0AR zxK2%N=Tc(g%^Lp0Iy`qvC6&027sE&RS)%YQjT zmNB15eo6f$Lf!oP8E6*xa|;N{{rwl=@Bg0`^sg`eU)2$J@7*Tf^WpIOyhSe7P2iKV z{|SLGDSbB#lF$Mm$48*lRPb~_Rt`!Bvoa2`tw+0%!=`q^lABaqtY>WvuPQ1i1n7BA z-vCQLTftcBv-L!If8!kw?8&lsw*wOsV`nYD6`(HyFu%OK5`S0XWK}FR*FcL=i~XVtWG zXzqcCM6K7K)@TLa8|Js;_D`|^%?@B7sh+wA{iWKW0|CCc|1vduw7y&9loz&Pc)nE^ zRju1g;Tn?Rykb5Z{F2YQMb2ME?wef0s1Zpe0de1_0}MAQh1|6Lo{i(5&yWn)*+v4b z#c*c;{o&IkxQUj&QPsn{h58K&7$l(gxz(`i*LR$827GGKfCFjUxT!3(P*BF0F3aT~ z7+6;Po{@p6^Fz8!S7ta@neMFsO?JGtf`URueSzYAuESr1pFXo907h4S_-PqH6IZn} zd0bK7h04r2+iATXq8j$1fMLuo^_;w~CNFC~nCd};Z=YQ(_I8(B?!|SUJ(}p$X{`Aw zDRXR+hJuk~@NIt0p_o@j?bCHGaWXzvY~lrN!emc&nQ`mQ-rtraPOYm52=xj8z`g9$ z$ZK;h_uR0ET_YVr6m1tPVHU!!z5gj&^&~v@@@6YCIb4<&7g%7}?s0}X>@!FZI}zoT z@_O~^d;P%_FO$H~gI7k0LOK*T=C3*%0^o7d=kVjO$CVO-w zTU2bRL~ASK?%}@H#u?@2VS+QTUXB?6gQfj&avf+O0B+5U=lYF00_r-Y21N5~XvAQ# zBi}5&e|eRi@v~B3p-GhtVadsM5W-@cxr z>jQ;7D(?Xnp7+}?xw*Mb>q!0sFvbbt zP{ZN+s7Ah2;iZ6lMciPhM1-^iJKs`UHCFJ{C`y9;NLl=J(MS!${3zXz3OaRlpiB$V z3Cn3tSw>BoFJuH-z z6DwYLA!_Np1x>Ra{ zmaH~zHKGKwj?nc&0E-x#MU}JM5{Pbvg2hg`ho=~&h8+QTM=r#~BYSVe3~Ag|WyrPN zav~99b8>)Bh(mnt?CQDk7~}MA6gXU3G!S`tf568>A8mQ4bk_`7gXsMq0!atx3DB^F-kfEQ=x{?$(?v>n?pw56M&9c+9b0Y31dXe${-)g`c z9>bsj4HkV9q37DHG>~oA)cIO|9YZ0K2>bQLagE$8&c@lovOec(Qct`YL#y>Oq+TnMLJQzK#iUZC8QplQ6qQl6zdhu{&^C+Kvrv!_EQ5 zz|534O-}1cAY;?dl%pW`HQL!~bYk{CxbOEzA;J?8{{>z%nU3Sn+E|Y<3Jot3AkT=z zfIKr$r@?pEO0r=uhhQ`p&3X?8_C%NB93LK{X&-*_yB-PXrMu0)QDUQW`mrKNwn5e> zJgfudSB4f4EB%sQ`}GFlP>u?8hH~Q;Vx_wfF zXpL4Dz$#d9HDYIB?a*Vh7+8rTj)xQ|w-2-?d=lrP94X#|c_tv>@LqvJUG(^Y`!7+b z1lqkox2_GEv>Fx_rCC#qYQ)t}K(oa}x$5RE_onUw#ZfX)EYZ*d<1ZA&80ZxNTs0M< z7+W3l^F%(|i+p|K+K4GFLd^zB+4bd#$$YKk#;jhiZ92cWBzbUlDM4KcBBhLoi0Yv8 zqvphmjv6im#Tt5W272k4uc0RnwT)DRqbqI4t=)%)ho;`Yg5{$(XJ=bJOsMr3Ql-Ng zndR?NlCu5RgdYKQsonOunX-o7Tl8*d10xnk$u&ZT;1@KoUcpvyBbT)F+4O6j_}AU9 zqnhwhtGJw!sW|?8R-<~59U)cY8maEt>ps{$PM}wr@*3i9kDGDiHS>5o-(YvYI~w4l z+)oU6MX^u%J^WI{FqQ^4J!wM3wuseSLQH(c)sn1gEQhZlJcEWEQjKv4iC8SKTHB-q zQhKe+8^qQ$Q#D}V6kB-aocmBIGxS!*WowM)Wm>O1t3@DxVR_S2w9sIDVa|`fBje4U z2onj8Nbbwj?+jGX#4@uUVzVceTG^b5OTVv@D!q&X{8xm;9<6qndxd;=L}X-qX65@M zx79l;&v?7l2hd){dNtkq#OgXbv;rR0K%_L*`NkznVcgIlBd7SxK9!=PBH#025aQg( zH}Io!k0E!F#O9xSVFb=*(^SYwyOU9d;{9s=xuNxxbL#E;AxtrYM*C!UD@{Lc0nHq~ zLU#eS12a7(tB3ob-N^jo+3vYtKJ&btMh zsUOb=gq^*q7nd7rz^TqMmfD>ld~kWBJAm=R$r8pP*FC&yhO>I=omNUF`4K%c3U>i=7Y`?yP}Pmioqg{{)ex1 zOIS9^he6RGH5V%HBY0$Uc>U?tr1Pbo+T%b(z0u}6KJ@AC12vZd{RJDkTn=U{lFZ!a z`j$FzLI`S+dhc?Ir$ZSZVkb)7%CrT1F&hITpPYB71DmV_Pn(4+qa;a0ezT(whXiR; zd&hrx#0vKH6DL%jFASYQ)Go&ix{)RzZCCnko34Hh4h4zV?&+D-*96z9dOaOG8|gaZ z(aaDY(Wbu8D`se0jT0EO2RNcD`eW3**Bv)hD>kQ5{?Rlsk7tUGh`Zt}|6KQO$Nmtr_hV>(orK^FP>2 zqERp!KZfBnBo$5tLUQ257qYePHB zFJeF{v6nI%>NCtQ8&k}oD=-}UTCL7n5)pTULj%P8lp1s698xHrc8Cm}3ab>Xv=m*q zq@FxEB|l~{V2(o!!+bAF>IRd^1{W!Wc#3%^aSYqQ=cP?^9coBcwaIK+))^#^`$sFs zjSWYOW>Wd7TU(_~$LmyPeVPbVR6^~52|Ak+?8+nWNOD6D&B8B>_p}Uk$KMrkQVqN}%K(&mKywY}| zE|OYY6Cuci>L?R3YLG#2&pM9AAoJ)$Sw}?lyV9S`bd0# z)ejv1a9voMt@kcw_*gu^QHe2%h$_~ELY06ypL-M-;d=0NCDiJA)R8c@hx}hr_1Qi7z`XfkSnDVBhMpme1P1_(kR z5`@qRgdQOzAlx&-`>b{ETKC)ia@R87CYj01>^XDJK70T7?|4u2dIRquFs${Yl$6xd zjw32x)A~XAT)+^-WV79*G={ueh|tp0vuL!IPA6Q3H6HR*E3MVOZkVQyK4(Rds0i;L^ zC_c9|%eSK}9{L<->2xlk$}L{s9a;I@^3+zPceR2+sKTMBJ0j)i@&FWk&Z^+FfKuwz zUed>#OO9o?Vj5%Bt*iX#_L)qdsaEk2Wqx(wIEw z_jd=?`ImAOge&1N>GT9MN;R=FJs&LH=$4F~+Xx`*n7EIg={n|E*C1+tk@GI6Q9<_G z*NZ;;1sfUmtm=8y(XZ8aYHvKS??tSnGhr*%4yqG-pk@C!^(3g5-6@(2H;3+7wjR-$ zQt;VXpv_S=KUj+sVvv`pSoh0gdmW}FCew_X(}(ZYv&W|cQvX5v z^m&K?rcFr*hYrPw=RuJM?j~sn!9+OF*G9hZ1wr$HS`s-kar^;?+Z0`~kTT+Pbd&mW zvBv>@1q%O_6*1$h=s~RY^Kl2!7Q$$k6 z!y_uFNReIyCw58@%;llp^0E}7UrkZBPRQl#cjW<*f`H6AN#<2y+}{B+vseOI3E5F9 z>H5$(ooGWTzSp$sX@lGsRdOSo!GLiKp2D)wGMg_{R89}i#7(A$)&Qo>sb2!hquMqe zHo^8)FXgEkpoYJ_RMS96qc2%Em=*ZybZ>stH`Zi!m#D$d3>nwLRPCUx!4Hz}EIP}e zCjJTQqR2B4rywi)4lyby10`S=lLTQivEDr1PxfUzGpD>Mc{$%>#KM(nEDFjbjx{@j zcnXjf9rKGh-8&c8SRfUY7B1Q6Cre6(M&QWqxq>wR zd?`L&-ZoJ0@XXt^^FR_Ak8Bqm8vaD7@lI-d;Y&NCfmu~{cC~SGp1PTux4U4orD_4l z$&dOs9rVX}eiL!|7RzO770FZw0V>n}%(`DJ{Nh2_v(nuqsnxXGZH1p_^-^p-NUwXe zfgk$~Q*^lf1u~f%tBjqxznE8lL|FLF*Jiz;5nrf%>>?D(!P>wuZ0&k$^4!W#1=Csw z&%cCGxz#P4{xu(6l2il=*t+n`mxH@2QS#eVs@mk=%9l9&9zpJajH{n60)fJikarzUb_9h zyPChK99OxOaf@mR(X_LNJ`6Ht5R>1>UOJ(xUis3@Nq0Un{pnS!t7!Vlv>#aG>!Gph zEVHg6GPyp(p8Wh0BMJD)vmde#2e0(kd>(jxHM|F3RHct*%pv15J4+nArw{d)<~j4E zea`YRxak@g-U339vz2`x+CF{Ok-+J|K;f3HTld8iKl(oXMOmL8xbuub(u+LM8<9~a zJ2#iV-t)^LgpQkhE>p{3?Op5sWKlf!FTP8Pq;96&Y1;TqXUYx-*}`Lm&@kktiK7d9 z5wCa;*fG9ZkT$y|%oXj4Yc9lR;S&)FW^yY*xB;2Dq}4eR-4yXXOh{Ih{*)G%#tKgN z8Kfw}XnlbRUK}uVq|vSRLSd!*=$f?=%)+yUU5UX4!)f6y?yTGikZyXjv8fG5JM=es z*eTkpuf;WP*vGyJ33Qs+@KLDSsOfV%r-50KC*0GFWT|y7%+RSo;Hh?RLbG-YT;c_z zYq~evIVz6wR1FL%2L=u?yD!%#60ZqpOp07JGc;7JZQYI984IRnVxZn71x(vb9ODBr zO4{2s@UxY;oSbSt_EJ>L zqj*j1dK)z7H4yT7Yc+!giN-`s*jqr)(CI6FGbrAfBAHm_Kj(tBac}}+_=itn&qQnqI+@X(c2$PDx)FiL z?6K2&^@MP5&8dRCXlI8ZO`l7C4w1rviT#wU&pPc&=4A5~Fb7a@cIYfOytHt$D34xk zZDwYse4Y_Q(84Jfi-0au)_UuTnuZ@=RwXq5FHY$jDBsLXOuU8Ga|Z&Hj$u)qcHfFZu0)O!vwx+JIh1U;)_+MJixQ7LH$(k; zW4(TTl_uGILz;id5lbqqTyoT@cd)fRg$H&0qB@bOw0yZ-c)@gRa{2kZ?x~TLY1wt` zu^=ti&bI>b<56=}0fa(7jhx(E({@J3M&)ux7&*$J_VB@{PbU#XidXRUOsijm4PiS| zR~zW&*9_W$isOObM}|1$8jUnyyYYSrmj^pU#11yJ#iX|;|1iuWrzgEptP zP+^h(>V0BY{N^@hc`2lVDa-LF+GM$aJ)R}4xvAx~47l}5E?cY(9E#SUu0iKXNPzjmVpg@jC0)c3jn9@XVX|&<- zWeebrw2@-qHVf0${Eb1LLkgKyjv<+)ZZ1bdk!%+>iZKgIu5^k_OiX;{9cYyb3Q^AI zYp%cF*y!P5XI*i!Vq&V<4aqtU)bRaEcu$)T&yRyMhj#Vmx?U=?{pU%5?+yU&w*5;O zSd#tsXZSaVkG&Zhy$#&j{_PC7uK(I?$H)J+Jo=x5whi;gdcPaU|G6RdwC%Ff)4R{s zt8h9K=MLUdhx9($C{9Kdw)Hp_Lh#7T%Qu{YUiApc0<#6;(!EJBdnjwypo4kHr*r1~ zbpTLC+lYzh*0SHC2nk#da?qZ(rhWE+EYy{ZWNS174BoH`k|hv4}SG%rHzf7uaF zNtt49?E$IQmD}L>9S7oT{8)QzzQCTxvPn;z`{zXM_g3z*vo|Y(aDBExHM)BDe~f_6 zXUAe!RZZV?`R!uAAQ67H-XXM$WIx&*7yZ{GlScr{WFRIkc3f1hjh$pYVEq0}u^$>Y zfD{tu+&v1Zd_;bhr=aAT@41Wp0{_RAXX7-Q zqeT&uUjVHmzFg&Mj+ppy1Y#TidSK5#M;zmn+&+hIc>zjJ0`5EE>|E-!ZYd=#ow)Y# z9LS`Xu;FKJ`1kWgekdFsnQl*8)joTWZO80awcsRbNPi=*sM+ro7SiflCdL;fsF01x z=Wu1nK|9)_bqYyUql@SFop&D_Yc71)`V4jp0fYwG-TNX=!sFo`m*Y6xGO3f&7~TmTmZs<3>BLZ#M`} z_>v>P1oay5pqiRm3>h&Q-Ey@F5O^1$br10#M&I@*NlbK;X)`D6KMf5sp~*Y~0wc_* zWWW{$ts?2;8Y(L0VIn8NKYiF{>Oj{GV=4lsvTY??ED9_{W7vfd%gq6!fRU=-yyPo) z_f>s;)Mi0$GTQwvG+u~&OcOCi4)AtvVP=LZ5eVo>&km#rufl_JJ;mA0+Zwi%6LKRd z%ZK{77qQ#C+x)l`LT?n#qfV2P6oHyrm%L(DH==$I*B%J~KOLVKNB2dOEw~KdW7#$f z1?XNR7k--y33dkuSn83X5##rVZ<__Vz4eE;``api4DrVh|Bp3ik6X83dKhsG;sl0` Pm^IQf(=EF2ci4Xd5mg$B diff --git a/docs/resources/images/ci_release.png b/docs/resources/images/ci_release.png deleted file mode 100644 index 66a1413f6963be79d1c0aea0fae40a531d392a79..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 50874 zcmeFYXH-+$*Ds7>Llo=?(xeIqC`F{Bpmb1>UZT8NC z7XcxVfFwYG5C|oPkZ|KU{*UKAU*7kAxZ~bujJw8QY*zN#d(Ao5EWb7PT+eTr=^s7J zcbJWh?Wm!Fo&_7*!5%iYy#j|0uzs<{#|*J9dx9Q19BE2hPh=2k)Nh82PwX8qIfT--#P{1|tq) zq7a5Z_-4}^CE|gTKTc$bg)Lu=k1$+r{6a8xJV}k`Y`>Cuf7s+S5_Ig)zU$XFF>n=` zig8wsbGN-L3Vye!4!s=Ee>$wI#?vU(Ki!Whhcem! zbTyv;zng6TPYA!%wlo{^p>DZaEv}*+x;Fl*ZDCX1CLX?Ov+o3o^v&wqL7BH

      mma*xL(_>F6W*ZDGE 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 z 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 dFtO|&(yq7&O-B%_TBv(l^RC_<Z?bDjij-*ez z`|6nQie9>Vx6I^zYRUl(^#K>91^?q(dmykW_&-W0Uo4nES^T$*?RL_I|CD_+KNWl8 zKV{FupWXXU5mnSBwd2wG_w`NaW&6LsAOBnW$z7)Zlm)e($^VYr z|E{_Jxg`E~xBj0GB}3|m!6y%eX9>m=^$m7?8v&qtblCx!+@%{5%N1!q@P?M;NmLR3 zFSG{LIVC+StE#F>$CC>}=>?ryavYYSSkijP9_+t$KeE<*ZN#BTw9L8JRVv}Q519r% z|Ha$)-`4|p!DP;VCIJ^ z^omi*Oa1z-7cCwYLxkV=qRN@&JoC5OR^NcVbOuq{=%A z4W6kbu43mOd9;|VnuW;MD?5JBcD1H6-!Da7rp(~EV+7b9uaQyNtsJ5iaZJ*(N@oixi z!IdeAw4uXxAPJfD6C-J{WwKv1#VE>&;hC*#~lCJ4dFkC-`>OZ z8!V$+Xz?E)mNGOPqt9o#bMB!YVf?=s^6N<(Ms)3B$go$6(`pi>)lHYcTyYmHB%Jpc z?%W7e^*JqSTbOqyqHk$71!aMk!jJWurT^YPH_F{C?$%)Vb3MULTY^X_Ryi*<6V2oT zLAfI}>z;HW^H`~pzzkU?a(Y0LoMve$W7p6Y%4z3)Jvw$wbC2h2!RA|1czTXR=b-I$ zg5wAqTai(>X=}zvwNF~Y*L{8SHy(iU2b+q=Jt;zb6q6V6AAf|N%uQFB-MJf)dVckf zV9=L103*D3j*PI7!-h*CW(OL@=)XzM7(KAWd-i@)4y(9RQTMXT=J*yrFQ&xXuiE(y zP+}Y*ZMQ>24~RIC+0AqMs10j{*CB+@dz+H3Q`G^+m5--e19D{Qyr9;3{9cc(EWS~7|{pcS|KZ>9u>#~RYjUGzpy*y2WcsLD%dCd;LykJr^ly!RY z;y`&}O1{eQt&N`5?8nh(oaOcy?_}KrtpdXYifzWGSoMWhTsLn}+7`syla#HGYGNW=RJ*mwx@KNGZnbxP6K4>bCY*Tc4}rC9f^tpL`cF zk)wybhaXXjn^mft{(3bXlJ zw9AttPK&(w(W)T7SXpj|mrl<6MeuJb|JgLwqn(t_RbM)VToup68&$bXv0tryTX!wj zh&P~rNAB=L{G>DRHB&~}18l>-2G+h$$$LTz@UZH1TPrbGlW*`N1TESMEC&#aZWHzA ztq^{ynXhfvX2!DrKlT*JH$qQJn?Dqa7j7JbEK>EDmU9>%Za*YwSc( zwv!LXGgh*}Z|XA{sT*Jdn%lkpJ97DE&0#6lxvMxVFFmXO2<9&nIXQYh;1H&WN>veE z=MiJJ5L=3#0HMp+xa3h;2F3Vt04%_E5fn ze^74u_w^)_hI5sMPMjlTs`=#B3;+!*d3sZrvqsv-Z>gt-|88%%veAIm&YhfDGAyC& z;|4uuwtb~zdfL22Ddb2phh|*OoRhB(qpD0?Yim)r%4kTcIq9C!e4Wg3X?ZNB~d;P-M?O=I(G{k zh{%&94tRg(e!YWML0axuFN*%Q?An4@7}aEbx5IS~>%U@HLa*|}ipDb%8Us%VbCyz% zR#s6bjZ?6f6XD{^0Z=V43?9Yi+I#!>&I_5d1dvQ$a9fsdzuHpUyv*75XWkkU8oM`5 zyM1h(1lcF%n&%szb!F?UdrN^$XRp54EBA}2i$dEJAf9dFBhkBO)V*Y}1Y{cbZ@gDB zp$y^ZLA^)mAi1&y!*ZTppy2(!L9+hKvZ@IfUi6h(*Z0*}F5+xX&sKMeyeMhBibzh? z3yo0sBMj;k0vfi48sxbEDtFySfUMFblbEtt1%D|~K#=miFTp*%gjeNK^?&A5?}ylt z$~;HPZX4Epc5D(L*I1?{sQD`zrR0s%c-Hk!ew}=6?`h*JEJitsnbLMey&VT&AUV6w z@5Kfcg+KNyrA;R11S2aKdW^akM>F|Tz_uC-RH)(vuSp&9yyOw5VL3H4`h}y&^Et$> zEzKwil`cxhQId~uIw@j>kJ2w4CZey*sn5UJLLT!OP5oN(q~I^?om}^e9b-+N78j2< z9-RwvC<&;xI%Ia_5!e7~rxn3|*%?d%YVl%TtY_f3QNWCk%0V>@m-IVz(^U--e@C1gX16*x%y!}MExBEHN$y4r* zG^2Jc7Ug&uPv`eh@W=McTTd;m`G)&9KZsEl)*B(Cg>W=fT_?5yY2WtL6L8mp*gAf)&jV?`YjsZg8t{xZho1XEYhdb|M#8dsh)78LF1 zxF3ad{SBp5R7zTr7dc127-^iX7#WM>U7tOy_c7Y9jo(&W63w0QS{*Z0xfo0{>7a7) zh`f`*E%C+Jjq_=7_81-pQet>jK)0JGwawDEgtDRXDp$!WbC@yY+eMVkW{ISX z!}XDTg=H&<+XlO&bq3k^yv>AaPgO}g0Q^DA8-*54)F@=n<4UP%nDDp5)Ymm!kaAAv z-Wy!bPt^92QEh!1f!7B_s<{>10@oL_bzNULv2UM@L-uPs^U0d|V_Gyp?1a3DMMI;n zAY`3>!n*cS`=qGnGXqh66XU9oEesd$_M*vV>T}omtEIcQiFSG*)b(-e37lkwE$kch z8#|vk;cG^ZZW^6&F}*@X_3exfdj4eX?cu0Nvx>bGoaiQ0m4mL=0oR-EpM*S|>-#cd z|8*p%hZgttz1f^ABNp?3f1P9RDs)@Jx1K@#er%klx z-|O=La)LJIU1h2&$KzpdJAjT^Iz5fZ;ZB?#>Ae{EE(VhO7{A2?@X*S6JjE`}WobL4 z(3B^Dt6dJ;>RJGA0STPvd7PsIv+4-M7A731l7q0^-u9 zR#>LdTK&)nlVuFrFH@`DkB-nwp!f$qz0diF%5=@sy=pq2?msQmsBI{u1xanXv~Z-s za=cl~%EljZFOrDe*&9oT@(iNSAr*5&D_$almBy2B9?P&cxkk+?_IE>*bwPZyuQ1h~ znzSrZU{x`7ZMx07zZTLxfmZ5RL6Zi`N)ex}ZI5F)B#XP|h&WGR>Y9j~o5CC+LqlJT zIL0l=J)r&%Zrf$~n65(@Uz)5>Z(JEv0i6-Z*MR#*W12x&q&De0IIAf0FlX>WpprAc zuy`$zr!ZkWLtQwCFipq{8^rm}^=awHiUeJ%QE}cOJ+RkEsa4^wCcc6#A%fEbYis^k z0$-lKih7>Uws>f}fdjm5SR7Xbd^TeNO+NE{F0nl0(fr}YY@~jH_=s0;$?9ho8Jq&& zK+=lfg89BMi$MAa!a2hko`9C?+pySd=9#i5GFPee!SEoVwpU@*ls>l&>n{X)gViPs zHoj+wESi&4TCfcHii(2RB`u??KxyS?!u%5o^cc&yh9k?YTAb*#)8ii}l|KKT*;}?E z@RQ)n!8POGa}QqJ#EYBO$`ZbtUa0yWMsoY%86|{TKa;HAphh&SX4sB=Sz$Z#BDQl$ zWEfX`(b>+;3Rhe^E^4)YOZ_<=fB$@~<%B9HZB1P!jfYT!A#tsUAp zaVo9w4;8Qw2Vx|bmviqdNgurRs~RQ{(Ey!}y-f~`bt zwAyPI)_O}@QrVMWFSX6q7ADih-FGncH47*U0oNHjhX{N!SX_Hj#JB$e>g?CmfL^v= zL#oHqdL|aVIir-?yJZ!=wHizlD$6=KTQuIyI;!6OJ>Ay;u~gXZ+%z(?GRI@G z?gelkLYaqfOR#8OcDsl$GVm7HtYe%=g+W>&2%DmbW(U2jXam++ph6Kgy$P0TOyxa! z#=mMJ4j^Pb8jvg-nS0qX_HKP~q*(aqN{_t-3y&?5TULKiK!J0n@68mOI_BOdH!WpMLgh=kIK4WqS_S@_w>@u z{hVzFUE2=ZcNp7w8p!EZ}g@AyO7|~)T)cF>o}-IkE+PmNsIKiyq}O81c*S+ zW4}8RD~7KV>L)?`cH)3KC-Tn#1B zS&XvE5UF&Qe1Fh5v^8$Jc~R;0_4yW8A<6B1wTOiQ9e%_loWZenvDvg~YcR=naL*gr!Q_@GT`L|ZbB8r6C}*6$ zH4X4(YKLf1E``aGcSg^pvI(0&#&8dIWVaF+mgJldZ@h3ML!4|#Xo;%p2QT&i@}1UI zD011zoHj&IYo@9 zs-UQt0&Sv@rgwI`Nw5T?IYJu+78zxWUyZ|v_S#Q_lG`$yex(;3xT7MgZCGm&e$;jZ=@9dh;@PS;WyKVHxXWJb^zoid#;~WN<51mpZ zx8Wz`8vD|Q9@C+PrA^#VlgQD~j3kxk7B< zc~xIoeTA>S3YxSA1^E`6eTt&11o&3qo26c--g3JHzPBk9XkS6Rwq4%{r7N&DEIET7 ztXJ2Ca(==j{jYV8W5VThZ=3ZJa zNKoUVYN_~Ac>ZDk1J8n(HFN8b%@MJ^(=rmKui$ysubyl}R68}35C8}PjFUvfRa6nG z@A@CLgnPW2YJdF1>cIJLIHaQbQ?T`PtZE`R#apfOa=?Y#0@V3E8=Xh;+pn~6<8APX ziHAe=%G0fWInxx|K#03MI8pA%A(d=$On>qO1_S~+*@UZ}{AGB+&t4ExE}G1eou6h< zVX4~k#wesK!@ACfRp~oAnxI%=hph$`E?QPAy$ zi&$Ha3`v=TB+^BaLP)F;oWibrq|No$qZe;J>oP5FySumY5=`FvGrhIK(}P#R4QYlzlRyI3BTpi@&;T+49F`TTohI?!mK!J zr@z63tT3bc4}7eEt8jrX^(dgLBFbXnq#c&5Ugd7347i;Uu)zxD}#*i20_5tRdYyP74-2FhFyR4TDRZgbQPXk0pd3TlRs zL|Tr|tnV#M!WNo1U@@lA=gBVV+HEOyd4z1cn2M&wFjJBfW=1VdP%+>j>@fW3uxX7> zJN93^NsztHF+mq~mO{`S(@6-dT@v(_NrT_udKGNs)%vHC`xRSx3Q!8rc0q;I8w>Xo z`uf_PGws~nqqDYmln_2js2hA<%;8>Dh$J( zGu7P6&7BthYs12uo@@D=Jd0gCdVOj8qgI(MRmg&JMTAk9h~E?aL@-T<;3BKT51$>b zdyn8d;mD4_auYWQ-FLl%d@hZxO?eUWT+7utVqu3Lh+JwC=}~_my+vm2(-c7LY*~v0 z*uw0aIqLi(2e~J#GHUK>qP_?DYx1y#TjTEQMO~hXHvy5}y2yrZ!?X7%NKXsLqH8SN zRvA2FiMlLgf;V&WqT!CNqlOs&ArBz;9d}*kgG=$XpG|&5&VKCH8`NiF9ZyWLj#ec@ zf<5h%~C-()TwGz5jiQYEh6 zj!e>i8S~;@W7s=J&kj0~VT+fFi3`(5fXvUqUAo+w>C%X&>s|zc^oMk~GpdK%3 zV5}R9H1kCZ-Hi{687_1QS`lit;A0hqfp61`{0Lg=@#|ApI`kzhUGriCwPa^WsAAHI z8}}0(P|r2bkCPb$id10Fo9Su$-o`;_#GA65x$F)~=CL<(5<0GKD^IAFjr*`BZ6=Vy zho0ewc{eB|fg9NK^l8r3F!F9Uiqsq@Q!0Avp3g^d8Fe0{T7S+~bK1!L;W**N#Mt&# zhgnObM&=Z^Te0FTf#CNaRZrY3UM%+>xkD4!L;GXlQGNw^%(Ok*=xe*Jzl+`%2NJit zvnfIL#l?mmPKzx8=8H zLj^HC;q5vGlUQ(PB-A*T3`7x5b@|TU1gZ1OIKpAR8BB!|o3c-(gn0%6Mhka4S8`YS z+?(_{=^UwLVOl0=7{du|!?~3p3it&P6duQEKyQ_e+~oJ)HTCR>{Jtp{-5R`j+=W?lg?0SSiR!xS54(`}JTXA)CuMJ$jqf?cP_2?8FDSzRX^k@pWnaE0h2h z4cKw8g@05;`Y)fh`;MN#5lBO_ZffM?uVR*T3MRdcu!YKRZalW3>yd2QN!(W4jR!nt zq30g^pXY0u1VDOXjJ;%~q? z?&y}hKV0o=Rp&4LtPr{o-L09V|B`0DhxeF9RppZ;Rlow)YmWUA^P)Hm|=LL9<{&l)JGCj1-?%gQW7i1AhL(Ek0Y2dfGD{> z{fJjDffL#f4)*{Almve>=#K5`m*EDrfx-LV=4LXo)qK^JGI96|wByKRM)#gnQ+69= zU`OMh+XC9EX^LO5G3uSfSt%n-(Cc4Z_JhjyQVP1D>~-uhZ@=r8+vQdsmMU~I9OVmg zM&Q;mi|zV%pZZJA-DVwX?2#Tlj=XkEKJvw758Yaz7ITjZz5X+J~wUV z;V^2Z?pGR?t|>Ii3QtDYEflWa_UQIe?;$~hJ9I!#pFTZ!n(J_B4>HOY4)|KCl*=;N zeet?T8JOL_c5v3+cfVa*)^x-{-Y0C+y%n!!VZpGaQw7T2Z^%_pOkKruWK7LonJD)Q zB9f;(oLWWD{X5nYx4%+=q52`&OP5Qn5A@=ex*GQtorb)0%9)vBu{#w-sOvE?yluta zD+Ew`s>VS`nGzLPnX+Xylmgs_$bR^ifEEq#Yg!S33nf72u>Do z04B9?bMOhaV~6YL=dhZexNp0I1RTEFGtOF8fZ90!Ayokyq@9-=6Vz zjO-s$f}uCK%F?3_{0HNV;x1eeE8MwqouDui9+7qXNFk@<3md2;o8G;dl zCoKON>>xh(*ud{WM{0YumV}!%_ECB2>XOf&HOf*P2DtKs&xTF!dvVVJb@5>Wqo6V7 zt*N}{p4-NC!DE{_$QMC~V4q(&x_op-Te3#2czhTjtS%~5K|@x*{U|gUdP(eIRh2&u zs4e`UyvaA8;_1D%)!wUQwzXSqKk&`V`jH@@H3j}UBx3niadm$0Kvf_YCtburCLo<_ z(KD5}B-CweRz7^BX1~fw$<;WRFzU5qyPyN;5;!?;2i~!RnWgF$ydXmCBjHxX&xmAB zAez9CK%foPHs4=gYRrqWb;c;OPND((pO1QB{))h|CN5^Eg|9?IbtCh(hUE#%o$dGi zggjvrz}Q@Q#D0coNf#CE(&k&{GjrbNOwBxQ&597uwLJYMx(Eu${k)`OrhV1CT3?X& zuU^?KhAUfkOxUf8?hSr?u>YrFRe;}}VXMgrmq$Oci=`_-2Dc(p%EE5N1B-*XPvX)7 ziJD#^F~yQ$lCJ~a+fn!&GvEPh7(}*DN4+x?Z7QeS*ynF9PkPdtccYU%c zTu#l(Qfg+pOs#d(T0(=cb9DM!pH)2k{S6d;FPgz2OvQsSf999~jcL)$$Y1g7y7NzS zsVq8ZFR4`yqwN#9C8Q@%DTlbiJpZ${K8;L-68Bayz;OgV=xa*3XYhKGS6i>e29%`Ja7XjSv3LtSQkBKSbwJDuFS^mhktAFFQcg8-3+npB zEY#FI{qS7};An$AXo%ADH=l?Y?|PNnT^MXH)L3vj7nHZva{OtbXV4-CLq$ z_Z1tJkHqyeu=?wp1|FK)9k>14i}uEao|$%wc!z`h^c%ZxSc+UfcD4Inko9~-t+r0G z&^i+60)54#PGu!57H;3f@3)s-ptctNOH8AEbrlHYU>8x)%)Kh6**en1y>-Fl!&_zw zp4~P}=4|ZOqtIsqvCiF?gjjCsIP@P-Lh{39^n^<1E7Mt?v6*I``8CeaN@~Ie@!yH|8#BbpwZ*=)hky4?W5{_^4xE_ z1}^!`SZt(!SB=vV1=Mdpw(E)mV-~vwAkNK~IF8P=sh;SPf(y#A{aTJ~ao0JM95!3$ z)Je~`d`XU7Jj;`em*gH(lBM$48Elq9vaiy6Vt(fHN$(K1EG4g6^Q_kc8hx?42voGE5h8A5wxa>W-I}gv7 zS`q$*J5&~JwDf9~d;2rze9!KMy_=p6;g01RYU*GVY)P^{?%M+fy^R-E&XUeN0)F<0 z&XN;ZlQV>NS%ox_=I6~GsjHHLJk<>)j+Ae zo<^9*?U79LJheWBXV|Z2L=5sRm$hN3p7lHvg-58n@oMJ=2X?62TQO6theoP8(0lzL zwDlEG$K#97u`4H460-S$CWYz50*;#b*?o}cl>u`a)guN5$BuKMqWBLJ5}B@HhDezZ z^%V>;`{Pce$E!DDDiAPt1Aaa+-tM zfV#}FncOkhf|#lzv7tB%b-Jy(uzb+oxy+(0YUQ~{$w;#P8>~Obf3@?VW1AQ{8Sl`! zgO)!Mzt45BHswrC`Any%!E)FY_fLDN-e3AD-1v5W=&oN9>`j`uDA@RXwe?%8?m$I4 zW5LCloIjlUSYgl6`)*C$GbgsBAKHxyzB0OsWBnk`hD@jjPw`C|l!r}RyXIiW^enBY zRFk?B2b?wR=%|N6?VdQY7H3rcb(H)nR18Ox zy!c|gU#V$wDXYUrO-2|NiOX8cac>!^6b;lV_S(7&HLR+WP1$=0&9o0|j@`-6?mq#$ zCirAtLlOGRnxwk-@~7Oy@Djy1!x`v%{56O%^5G7gy$A{XuCLC%@g89%X>P5B4GCGu zgq~I-^9=bvZdDgb52O`caOl9*4L8~vludxqz*^$d2v_kBOuI=f{%bi1PSqnT4mr>= zGXmaYbtCn-Et;;iW);(;edp1a+)}S^~-pOU?spr|5%TZvR*jFij6W0cGZoe4K zEbN+jkwaB!6!I)k-J~J$g-cm(?nIJ^4jmWagjBZJ!oXr9=c?#1^0oej6nKxX#jR7t z4`l9Jzy|#!o~o zo`yW&9G8I)Bj{<(Iv+twWs?EgGO*@8fXG2>Q zSk>9Kwv|$+QeWs$Qal2@LUq*qo^~g+_+@3F_AKxSGN4dw!2{K zQEeo<(AT7$%){cW3?{~GR@K0+EfRx-&-<1l4WDu6yU#*p?vFJ zmbHwZd0a)O3Ph7dgrTr*yK-df2|xL}+U@&Bj>qrrwUo}&`#gIkRyYhVkrT6-)N9?~X4IAUp3qabJP#{NFe>Rz zaT@d~pTHEyy>Le%eMJF68ox43!*Y8>_#rokUWdiLmC1gUqGK~l$w@A=E$-e+1S~^A zAo!=W+RaL;z3Q)<3)m* rQ(j?xrrd3Wm2ZfG=O1;WoNI#*|E7yU?gOhDjC>vkcQ zv}?%|pFg66Md&8ly3oh-ER_}M8I@FCl7Yoxsg-d@;a_oEFy&H7_h(g=2c=rnw?3mF zDg0!DE>0!B9xGW~Kp5i>zTCxC=K;&4gw~m(ZDjSU$^juLZ=8nXC_TJw4Kyg$DmIaY zpzY*c8c}`!;0&DgmS@H1ZqX~?+ zJso~aK{Lyb5?AtkYQUh`_com$G+iVHS&y|0y&GjL5e*%#du5zjc{}#g7~yA*3oA*p zFCliNwcA|tum~<#iGB5oQP1S&F*o{cAA8swu5L0`(^%ov5oQ;t>8xIVQ@;Jl%q?1U zW1%s0qfVn*YTr!LCd_}r()8>Q=afDATEFqhf&n+alglB6TttplZ*ZNWqOH14vBTir z=C*txcDgHh#Ep;h%86OsG>H-&0JUt6&dp=5edJ2@c8V)$W#>+_MHc#9gshE8p26g> z9(&HF?5|TFx z#{5#Kq~BA6z{wA@ygCcG5_?`|uO4 zYmV^xKCrds{|bc#3g4#W{Goim35XWxspp2xXo^HF$>rbQi4sVcfuX5yRah_cbnTf! z#VoB9%7FuDegmGIhw}TCIzz2o?Y_TnkbVuMWn(1!e|8B{TQ@91Za^tUq%+L;yH9QR!<61jivG^)ja zWU($y_Ql^+4q;1IvtLQgr~Eci-pl?Ybrr8=par4wxuu$y`!dSae=+V#qrobNs4y!~7p%?aUp)MS_X7-EM3by-kb7lV>U3B7xd;Afo8) zsWcq>WI#^wzg#mH+`rZ+6_w%U85^(XbRbm1l)w{PTxiA?xqg_mo_Duqpw;!+rW1bK zgAN4;0Vk|dku;`PFxks>BhT>vOafI<-S1YM`(y!jW$an>m^r~Z(g-%#$+%}uYZAtz za{-t<+SxIcqRldVQ^2nDjqI3#@VN5*UtOV6{_}5nahsO*MNVG|NDVU|J`em!0sMGY zTZQ4A$h^`;|)e4OLaz)mMy;tzIN(k*fd0Z<>tVE76f6?R*9_@(qz_|pS*Xw{4*yyp4P`&fvP8*m_gK0(sX&DtMSi%vQ}yBVG6?~rPC zC{cK&PK-i-CgQ)zZAUB5fZCb)fmIJJL3}z&0kV;enA~e=QL;tj6b1KshfA7wxcXn- z-w}301<45T#iynw&c0>`ZcC@rLPv57RTFGHci#c?d-!&e?UaSjxJ~FreTL4JwzCYW%yU%x(-R+WC&|03JgfxXBZ!@ zDNe6my%>+W`ragcOu$HGUVBA4fae)EV#pC$F(1z4I3v*a_y~tgd4wNBTt0m;lQx@C5MnhLtIDW#SU<7hc32838mnv+EP8b0gc~u+>(WI^$78aF6mtZit~KNixK-zw4HG#9-is27I)ME|c5uY59J+ue(6OIRn9+vt zF0iY5Y=a-5xg)lQYq1U6N@POzFK>+jh`=E>zJ`MG(RthcEtDiH`-N`g$I2eK`&w7z zDW9yKq?t{lLxYrtU8T(($;p9FVqNsA8Q5(jPMH6`Ies$t%>j#O^Aee&g)Z>$(M+l5 z(cko%B~M4awmtoyF89BG<*U|R_(6*2{-buC#G{c+{`E|Yl=6`ZatXJ=X`s&X6f70E z?u)&3Q;)Ct@j{5EY(JdfHP1h*)nCix7y!2y%5{Ok@y^OgrGeXG8pt>t1_j ztN0NCmYTggPW-SUX!233rd|`-a0pVIl5cymbZ$?_A>Zw^a~YT%I@6blHI=k1mYCIv zuqp(7N?t@)D|R;OaV5&W0VLK%LMsp-9>JLF?BBthLq$*?rzUb49-dg2k!8Gt(^XHY zQgY3IUhWfvRZomu?D6#VczCp6F~L(?Zg^r?Zd|?Le7x;5cc=?gC z8J8ej*G2vGj4RNckuUGt6K{AKM{zexl=hY!W4wphe<6CYJ@eCyw%tfkaL0@=Hsw5W zYMeV5a=kSqW_e?m(0H=Z#yZQwO%Ll}teCq2#Sim>=@5wh#y<{ejl#dT7gwF`TAm9(h?3I4coi_xqa}+caK3Eu7dIa%Nq<0sVaJ{ z4(Q>6HfGI7HWQ3JK z9j|TFW7~G}1?cpvQ!H*zaO+hx_E~_2xycMgvt|p+XKs0*UE)*hO%dRE>QdFmW zX+1K`0i}GVZ{SKZ-EmruIxr~RZX|)V3<9z2)Xx1~md;wHCW2RlgTEzvi5=x&1= zEYgcUERisr@0z@C*uS`zvDKB26EXWT4{da6)M&1)FVj3H3YjsD7sftk+_4=f(A=6R zF=gJtx;aXbqApv>3+#by^Dfeo)mbSm`X~zjcmuS+UL<8QS%~L960}bLW|`?%D2DGA zryC0SphK5j8U&(9P8)1Pyp~5`mKh##&Eefl$1*yX2qj{`WyfCPrsQ`hBZ+Y*}$HF$V8aVWXYeq`Azx-LcdEi z+3!K1f&_`ZveVjMS}#KTf=@^aR9qsXc9HmU;X=gly^zkjO*0l9`=W-hp08T82D^J%@)tY11g0_!S;!rBJHi> zeSXJ?@?K%%6mK9g%EJI>06brXN!pMO>A1Z z2a)&P#+vU0I}c~^51Q`37;sy}U624Cvm(}8e|70qYFsyhe5s_9I>fYe5h^SuaLmFv zDbUkUxmvTbZx>Zh&U5;u*PQ&SM9GjSh;Mq?UIWUulJH4^dZ=A8wN{s)Jt`RJZd4oQ z!STn_&$wA0^e1GX_ALA|Iyyjq=^CZ`7^0kAVLq&G`|*I~klK7(Tj58ETl1mnlJrM; zHNf5OA_(b-8DWt{^R;Hy0G2r-+pk@fB-AfkXdHMylWX2k9O;y3jma`QocS~-9qeKM z$_cVkO0s&bE(=;-tA|t;WoNYuSTX7lLz~ryIrX_x+Z|MeW!AOnu!6A%{%(o+u(H!? z&G?P>JFKEVe004Vng*vm^t1mTrrtZA%{J`gzT4iarKPQ+c9*?cduu6b?-`_OkJvL- z7iz1$H!-7x#MV;Oj2R?G?GdqKg?Q8Zd7k%uufOy8mNUQw$Q_K zP#o~jRF%0L+%_;mtv*Qe^$qcIg*I}}rRo^Z>=9~+gL=IWAToLs7~Qkkm9lotraFbq z;i9nPAq{7@@)fk4El%{W>)1RHO0a$tH{`C#R2g4-0TqU8?kxe$jyB0jR;laeSW?gy z-V9@2Z7l0%M7Mrq^(Was>!@&<2!oE9xZZ@rf8h*;g2pbRpWGrgXHc33f8BB|M_)nf zIL@o+Rr zd_bJCY1Tf+)4(VxuRf`G3a)(bmuHxHWaGuugJ22Q^5JP7pTI4=SX>^iyE}Vg^hPN5 zQ^Pi(I7aQEhisV~L>|&wG}BU5bNlZaZ#|#Vp|eWmHz2+#_^)7&v5Q7kxykBr5<GEnoGLd=C-eYH92vZ3zSfE3^xkU#{vqqhar;@?8S9!aA+AZQDjm*c!%gqB)FjFex z85N3E0vE@bopixjdtHW)?*p_Y{yM&@gUr>>r;LFDp7a0I`8NS7$}bhQD{L#@k>y$B z=Tq%wl0#qP6dS-cU$?8zBD)z)Y7lGFY>mW!#db@3S(~+EKSw)aq&4v}7%_LvO?h$i zxeCdC3`eRl;eMQuyWwhau#|gFok8GRTwW{igq$2Z+sU}~i@11G-@@%eLgmVM-Y5>n z`b?yO_1W{;76wVf@6FoGCF@zK-kZ;nPmVhoF0tp6)o$0$ID+-2|DBr`J0z^cwMTE`XGF9wP9z-=zJL~=uE7Kt zTX&a0w9jd|XP>*tzi?i&fr_HjC;#B0(}6gbT`-Fs03-rmbsHY;3D=Z)z2#5g-cGup zBALF5zmT5G);e9?9{LYvvc!oWhnW;^M zmlV+U7%{!Swz*-J+lo4?2To{sjk1Pm6|UDswhJ8Rr8w&@QA+lKNr8%jgHY*<9}}Qq zuD0md6}A=6p3S$=Ep^eaD*P0cRp+s}p%#oMx@%^(ybg?0=IvombH;X`t^fh`OO<_Q zTVsH_E_S6$sn=|6hZ$=%nCdczsT(5_-4|YZ5#oYV;z{(4N2xC6=px(Y`LW)lH0J>z zC%&dS+7?1m0;Y};7%>OpsTJ71-|Xa`1$9`TyQoLM!K8u*9;pCaFARuebe(;vV zL%mUsw%f7)TRkw=_ zR5$FM?7fYC{q;gY1;x+kss5ac{kmcqNv)pB@YLwd32Lw1tltAox}!eV#IL$|4I1gDS; zu=YGSU%IUzkeeaL&GIf?<#8JV%RxGF8{vX0Q?&Ldb)P4ZAvWGnC3g?B{bwijn3dh8 zm@gI8H;3SVy}w&E1@PLYHV=K^YCQnIYaZP=DFRiMbj+hNhoHlVrT3r2?XphG&wiCq z=?F2Ic;a0;e~Wu@gYWT9vRDkRdYH}rC|U<;yFL4Y67}=1BcVldr0r8L4Kwf=Yj6EO z?ux%(%l?OleWi7fpw{4QrO-DP8qv|lQ($A>vV^KeF_1Kk2mQvK|EK=jNCnN}(!)f?C{?AvYIcA3IgTi!$4Rx@5PxXU zvyORe2!=r@&;z|bM=&X=y|lImf@whVx!G+iT0vvecCv$B?W@pQd)h!D4V6#|!-;vI z_l%sFEZtdh;A{3QaihieN~^eK5F0j~zS4W8Hy(d-8{2xzGGCgl$~9CYu-ADm%}u($ zyl>8g7~5R#9gFTao(48;^9ENf5hV+}Fl(D52ZBe)vt+m6O&;S>Rtkp+)oz~DL~S|w zL-j2Qi*|RC9uqpXZ<{2vXPWf;Ep-*iXWr0T1a7qAPvJ3p)gCuf+!(#?O^Z>691#BY8In|%} zgdB&0i>*K@0*lmh zgW4>gJS>|z?+5;Ca(Wc$G`;zY-gAUyW%+k7FZ`}AzV$4H4l9*OFoa>kaIAFGVn)oLLrut(EV zKj$*f_bwUXllwaFO>hFu}7x(-lN)OM^{e^ zBdbh<_G)Ex)G<6ClIviknEEuNPSDl9C2{dmF`sq&Dp6_yAYBk!w{!A-ILF9f+A~-< z;1h?SdRvN`2hjvlv;OBbxXv-3Vs*a`8bMzF?v)ol&n-05ie!yzDKm!r0=X5gO5%gt z#07D5V|utJK0BA8D0mf#2Km-;F0b5?hQl!+Q!wcu2;SyV>^mLl8RcFl`+ z<-pp@bLjaYFlJ55kl(_9j3Rw?b<8)ENNmZ>>p8M$V4X8Zr#w(P;O_7-MR(^;nPTgA z=Z=y}TWS~jE~MTU!#nDBRX8`gZo}&N6$zCtW*n(bP7BLqKF*7E@$liwBo*IHLUaZ6`=G(Vm$EUi{6E#1D%^WJU;&7#HnMO6)4l_M$kYGtm>(b|WmfFXg43_aQ zuS;0<4O1VNRKvQB!?pU$Z@oChRA#1Pcy4hwEZAP}<50_HZN!eg^_1^04{3LiBMCRo z3eBt-eFnmoI0MpH(^ix3mp7;!!%tOZ-Hp#qg9~A?>gnxAw(v{U45hoxGL=`dP8P(H zsQv}!e{xGEVfZuo8JYplD?rE z?84lNHG$Luc7og-&>G?P14+$^W>|FhtFwrB29ZB;h7+rFCC9 z!fU5Szb{@_=BoWi4oP(7G)@`Fw6tS8Y!B;!? zv~-Q>eYS&6o)m%0l&XdH7d4qMNAx6FfSQ`IhD0U9j=nm4C1mU%H(lz3y2EBW(W2ELSStc@gfC@~Uf1>d<%S2a5FZ~rXX1cABd!}e00k`B^f8PHiswabqh99f^>=>y|%&cRnCzMB7-M)3TzOHp=b zd1Q)<@K~)+Drz@YIOS9GaxSzq8@?r*RhF1>%|qJA={*HK3L5M4_{J91$aX-{L{sXs z4Xb5bmUaM(QoM;&oCxT(EcO`N%H_Q3V(fz1Ej$Ak*`D8xE?KS2YnE%83| zyj<4tv8x*b!RJ|pFs#lKCO&P}RKQ#kJAp@5y)haVzLXQ6cLyhLrunkVX}nv;*~`xJ z6g?({*ngw5wYmK6Vb4+vD_gCE)%)u55O@h8M;4lSa=LSKvp`#nP&uKhbU3TTulf0m z3SiyvTV2D%R!L;$;SelCI`wxwiCYk=wxm-hsSFUBg3rxnxcpu6?q-yc!ETx_Zu;~S z@q(3cLv_kxq4Ugj@=@!)1b2Mg-8%1uO&K@Ft0*Z>(0WyCFy%BRflm9bLC3M(is8MB zs>9g=r^3GroAdqzSMZg(6v)E}A@9@TJUEtjbaoGRVL^30o3LfCVDCKtJ(U4-W#28C zhJUmgRvx!{{v9XrbhNz(p8N27p1s^G;r^tsb&Ui96TaWP;g zB-GGh8~(I5Iyi$gogPkehT}{cazPBuP|Dkw^Z#&p`4NEw|8f1E zCA$zj*3p{8p%_azWw*4m>|B0KeHYiIzb$su|Wf@P?#)4(JYu?*QwM`2MJVM$B6-% zILZOD8wMqlR~Bb9D?g$HUSq7A-6u$bXT4Eh6xJGPrYO{Ux!9b@8m2X@2D;{N!8CEp&oKO3wAOtzHo)7d(Wy=N_rPchn`B26^ zyXUw9Qn;3NJiYN5-EJEVmx$PVo71v!hZw-I88`zLh`giiUxOnbHd+7TvpLUPHP0qf zniywaGBl>kro~px=|n3^Px;`w)Jg*R2_P80${i6G`308`g z^-2!o{Q@o4FkdGUY+A(X_z z+Ejl+F}RyP))=iTFur*JwhW`4b*}0u_3#h@qy{o-DL?1C;+Kx+sK-O7pT~%ILA%yo z(!-H*UN+>0{0YP$`D z)#kofoiH@UG_MYdJt~q<)mB9%jWpCzHP(d9v+NgF*mc#Ic>3L$JhH;!K(Cj4AMZDB zq;%8~-Bu*<+SaTlQXz$oMJ=TBx7Vr%2$GG}NH=@jmqUQ#!J7Qnv#Xsb zTR)p0NzfHOs^|)xSPIkqeLu0e*WLNVv>67j0vgd!E>M32(54&@N{`nO8DI zqQyeaa;5Wro^zjTOhSS`8BX(Rz3lC@uoSjpvvYGJ#7wmCYsixM$tR4sVgggVE!?__ z%u8#E&8S$5LUt^ShwXlD$vea6aXOl0*;%vQ;{w=l5c*ll_r6u*e4oqH9^6PZ6ZUJ4 z5{q00^rRV8FF-ELlX98j*H^l=zDDE$q(+ijY0pgA$QH6~T4sH9>>n6CqJ?5qc3abW zD3Ze85XKB5%P9MaQVmymVAc1wkkR}XlD2v z3^9icxs0PgrDM-_w~F4Kv;%%;dI?~CWnHUsp=k$a-$A$HWzxQP^u3r`KFx`0c2I`6 zGv|S&w_Py_Lm&faKjYy?(3NA(`9vIIo3K2(1*#jmRAM4E`fs_(8=}fZhbMc!OGalga;@eY0!)p(HC}(%qh0t1{ozD z^NiM3omuh?O$}~|JtLsUoe6;z^>GoUPCbIRX$<5Vi^k+FHmf*Z#}S_QgKfUMYALsf zl7GN<{r}9MuZ+r0Q+76Hr}tMaw!t`7)N2SyMyLh!@NSe7Y<3rxkK!qq=Jc>}86c1;ROQ52Ph6%q<(N?qFy_pLF=OqJq!h<tz2Q4%NbX0w6afJXoaA0 zrY?g`ZNzPbmD5~lEeI;Klpe^OvJHo%hHGPE5qbJaiE9JCEfcPz3@#n{qt%(q*F9#N zSTco=B-=7qeB)EYYqpABS{RIn{1n%USUZ}O6%_Q4aacbKdVA%&NGH4Bef_SJLwk0- zbjjU3>WKuuH1;O4TBW7*7&r&cSo99Dbu5|{i9^*$dlGmzBzTJ#vs^lDO zt+QY@8L5o4^v=1fyktvT`J0w)bMmLEn=VtCiekq|enMiL*j4Av;D-la6_NyyE~YyS zf12+$dN8dPj|aN;y0j5zdAVmT7vS09j;CIlwl9;IVZn9H4Xn9m^Q9zFX(_;B??6A7 zQd;CN1tQ|DTNqY;Q!oxy261_!+?&2ZTT|(JQXUr-U3Dd6I&SyeMbPwn%%qAwq9gxZ z;AgOrbNJL)QWB23xa#}`fA-&HZ>$Si3XXdNM z_(%s1Hs`Qozo1d-^UtwZbY2=dsG)tn()!3FEz?tEDnbOYJI9z%oTDZZT9qe@I-j{Q ztmJT3>?e9oA`M$@xp6OJTi>whf6VyI4^D^#zz4gJ>gs=aBk$4gI zYitSDW+<@X+p<{q@#W+?;}N>WEZ0WCg;2S;+n#@OnCyMpIXs7DVC9of=&o}x@#F5o ze&LL?>jWJq|IqP3Xrso>th4i0T(-JvTFDzuG>2{$%?}HdYt!ROOO#j;}q<(r|wc=240G;=)ZGYL|5_t9{0P$|(5PTI~ zjOat)(UQttQjNrW7@m}4o_+A@Pf6qTNVBWvrXgb3+&MfH@qC>s95m-jQ$>@fg%Y$g z=xGWy&)SDSAz)S-8zlk)x*aepa$CYO`^~ho)^*Bl$?jAkHYcvMPzQ@t60quGNMI{v z<8+WTAc12uMSXi)$K^%NYu$t#wJ954=jU>19(r+4Vr-E1G=T)T~q? z*hs;Usr+!_vFG49wZZae?XjnkS7i=N&BSG7{&1I5`!_dGTneupxNM29&4QI35pppt-;SiYu>{R?GG>U2s|7 zMOL^~11GVDu)~4ULj(+k%$3gn;>l)OpndZ$>U2^S^&WdR@#n;H{Mo+zhBipjUNLLY zBXA46{ocZEwR&LCQtRpG-ujsk=EV8^k&JID!8)gnt;8-1vI;@CA9r6Hp zX%K-GQgc_}gI#hGd)U2O`pe&n_Xn&6G%Gq?@U&`}b*iH@orX4O@54@z@aNCMuYza; z7R(izh(ujXFHtanWNTV7SJDhnBb-PR?6^ulq;?IawapCCO|#TsG`MEyew_t^${zTL zc$_6`2?i^7#P4P(kgx+a!y)oUz1f@F=Cp=ob=)n#4KHoymhP|v=ZiiU#BbEtkZf6P zQdeGINri|krnbNZ-ht2j8eEcESI|&RE3d@xL{QauV?N{>(^#0NxOQ_LbE_5}_LYyi}%Nco(56;YP5 z3OH6xR;`9e^ULzwEfE9t!m-^?zs4YWtUlqA0$(p7YVb&NS#y>J^U~$x%rrIm z5sP4p7W1YDhXvh~;MR6nZ-T?+aR{f6*56M~WNNomjK5nyYDV@>Y14PfO$l=kVSXEe zTc*g(Xcm}sxycYABgqy`0+kX<{Hzr!&75toTxkm2z$c^0FJQTZo0VMys)4qHxvROs z543m5u&qJoKa&NHr>9f({bYr_YqOKK^-Gd+u}L9UuUz|`w;&!J zN?FZ5d4@QF2I19zXZ8Z1CRyL^TQ_VNuea_Q$8uO`O4`P@h5kcM~r6VLiz7? z5+1dBn0xOi-Hvp!k_GnA>#yBpU-A{S9h9SVk=|k{ z{&e^dV(sZ4+pWXNb8r{i7+_$qG9blhU!zs()-@aL8UaBeN zSJ@_z&WX#H4NKr8uX)5iKxJiB6s7FPXOUchtf6edlAiN;$MU z@&h&aZBaPcc)U-9Y%X823(dZdcALaA8KQq5XIUic%hh7y9717NR#!V`UW4^RLoJRv zVi?VGW!B9zsc)^{&QnF`$sN*6{{c2nKX10Por{m%omVAMyq!uHR8p>L^1u*SUlS~D z8gbdXD^y^EC2mcf9BmZ!DfWrMFDH|zsZj?sc5kHWtTRr}&rME{Zkv(Cq$vGbGl>mj zpzv#dm-|>WWH1?~H+PMZP=A{p0Qj)_jGUdC9rG)94CRQdG<>`JP~oE(YB>@jKe=@Z zcw?+{mm2(WFoE|w(RQfTl&P+qbQcVc zZNFK;M5+`IbPi}2feP2)!S5>w=vzafhfidMZCjQ)MjhrYKI?C_zl=t+VLVgz> zm@nY#c50GHrLC&*%s9caZqp=P;~qm;Q2R$Gl>4NDY8R>K!5 z>UAwq^az}M5-HQfG&U;4={b%l%*IH;t=&thN-7I~GZXPITkGC+p{(e)$i=n(f5dA2 zTkM$WMS@I$^tqM8DiBolJsqB>7DzFKx; zLYB1t^nm3=w+rSon`PTmjA1)9oVz9BOz0SAnCuX7Il((V!YHI9r6mVv5iq%#?wi-w z2AF6d835N8I$}uUiT;Eu{ZI2yUAo)oQmKv4mY~IpZi5+cuO{~&tkAy=;NLO~JCe|{ zUGP?(jg_e}*2jfdc)IGPUv9>ejWMXpR+Kvgl4W zZxpDc88~{q%izdYS zjoVF#EO7l!RwZbdvYdnkXK3C#Xig3x>@JO!#0)>53Xa9Uuw7)@%Bnh9E*5iG`7`5b z*@EX8e+wG#t9WxIrrI^`KXiP)-fWB|I<+GgW|vm+ote9q)Poo zpU;bH8RU7RL;)Ca7()H);0e{-;Ttp{8-RVA2ny~05Xl|Em|aDv6z`Z>LH#|y_iX}2 z9ZeVs>-Yk*re`5xx_uKy=^B(qSFeY^NAc^Ne4N(+UFKX>fJ@Gw(Lu`1Xnax0!3L#z zV&PsE=8yZ^`ygdo4vDS;{X8#il^k%>@K{CEb=oK^_oL z<5SQF&Uk++kp=?>k*q@RllF+}0e&`D;3(znnIPqR4W zXrFaywpvYB#C7i5!@1(WNm{gTXiGF9080+~0yvRyA}7z!GfTtAssx}oWIpQ`qX z`hh!^|S_WJkF_65&{t0%1SaTUg+ zXR8-^W>Qbv8PTr&deo(=Iq_ZL)Jaj9+dW{uI9#?%Lg9S940Ls%h5s$ zrUy^VQzqm<+24j&OW6Sp$N(#|YdlFS@7>`+xx5p0Hq(hp=})n&eJ{h_|3NB z^y1#n?&RT>5&?sj0PL%qUj!#lT{b6QD2EEDhA>^MJU|$e-Ee;1tYg|{Ei0LYP3Ko1 z>mc)3F~dayb2q;T3`3_{z0p@*>pA*sC2Fw|Wv`XTte}L<#yK-N$<4NX{aT;a5HyLW z{=UMXBa$1kQq^fxdeU__E#Q4{TOzIIOJR7f`ZTqF05>KiD-{ZLvXl;q_VQYA5H=JJ ziPSDC4+76&n``5qqk&CLIQvZ^&*y;^muW%n6D?*WKE3zwyMf-%8Y(0E@o0bZ38COb zqqk^H66b8znKRA!Le{@-l-BI3?homBV_tv^jNOe-^e75$H0!--+Pv!m1RCb7XGNrK zMc3xK*3N7upfvpK+06)dHy%<#`F<9$cjDB-&5OJCaR(=IdY z`cN>tZ`xG7M0d7y5zJml!o2bPqdo%dQ~9PhONqDA(hTy@Rk||vaBLo8hdsmmG|XHy z5|-D-<^adRDU-NJQr_6?9CGFuiv%S@Nao>T%QPeoHR^T+kuMGA@)ICi>0i(YK~U@Lx5$lw;*q*3>%<9` znr)-W=I%jZJslpM_F)*2#_C*p?%&$3ZU=j}2i%So7pd1vgY?#qt6r?uGsB_C()59+ z9f_qbKKlq-sbvjY`er~1&>RZDdh3kE_`ub@rQ6>-3E9BuG@0{{CxvDq#*7ubTq8}b z@9POCBvNbc+ZI_Z)iZ zm`|dl-tM(t@3RnX`S0J>oW*oggobZjs^Vt8k0p;U)n&I{H{c*%HxT1LanZN<$ex{d zS=EVZlx{PEUR%^4<`T&c5Fgb zpKhLowV~RcNGnax9AOKAx$;xV88$my%w{kWZM>R%a+-$uDPAbyFvU%-$c?vHc;Y=Z z9)?FQYTT0fIZ2u?4WWm>G*g|Lu{$K+@ZP&N+Vh4|BmfE&cSEJJkgzK-mZ7~dyr%G z5|twn%YbDO|E{Iq06ws76Z5a<2s+83gQBZq0dPnEw~W2VGm8|}p}A~Xw%?pL5AD=Y z+wqC2h~P#rDZQF@x8GS1OLrAm%;dGzHP14=JrQEfUKH=~1H_{JC*FBk>LzJMXrW1> z2!+Azb$UQVSN+%!tqe{~f*09TwJU0Cdtt$7P+xAD)n<~14}EJ`bG+CT{lCf9&?Ut= zz61{O(IZEc!hRG9KEH4fRwr>@=c*_1B|pKSqvx7eJ1W)RSp{9t#5gmF4&&eTCKjGh zK_j`dF^p$%^g6QS-kvPvQQB0K6cHupHeVp+XXAbfPCFx1_O|)XacD%uXBJYFo2340 zJ1&3nd-xEM)FQq`udjtsW0A<*Yx7xrAb@oeYhakN3 zq7n)}FF7mEt=oJs!63udPL=~fJ)QY>Ia2$axKg+JuM?Ll7-t<9pXHmTWnlf+>&@&q z2B{LOdbNi_p-%-@Juf+y@_tg}!7S;AVjBAp+1JfFYNS3B4H~qb8Gd(=?7cDLS{dFZ zXT(GlTWAejHGVhF3bxlM7uqrQEIX#i^{UB9@f!n$heL?@#z^VavPz_v~e%eQ*D`Iv>e% z@VQ++j69Z{;ntx(rk>0;4CQf|G}p|1p@Ed!|04BewmiSW)}Z*+wKGfJHmo7ng9Sp` za30K6iNSp-`+=Bb&6nl&hs7Onjq_s{Fmq}h>lgfHA%hLFdnm%pJD*C)j|7^W8w)=0S~*F%7C%;fYrQ)>m_cUufg#=MkkGNvI^6VG_#`)Q zrwJD11wCGEqD0@x{rI&F@}1X(@n*eXmGQb%Q`}u8PmPf4VSPEH4{RJp{TPjKk{@C8 zMSII*lIbt%+2(i0Zsz7f6I5&HnQ?p`@Y(PzFx#9_St4O|+&2a<_FymP(~XmEwuG5n zE)BWzO|p=I!XPb9QT@4=$l2i#RM6G&O5`Sas`;+*hgF`VsrK(C-rJnzt*Olk*vzu$#uo>zcg%IY?eQ*A|QhnD`1^(SSlIc&qZwq#M zG%Pa5ydJU<_XW4?aRqjX`)I?CG49;&R{<8n0W8xqTkYOwg3DH=35T(~&D0RD#9V_@ z;Q|}ZF2Cf{6V3TzL~tJr{#ljoVa^sanXsAO;RDCnIbJ-eR^L`T6EW-Zfk;m(X5ni+8^T> z?7muj0>1whqvm^e)X64QbYq+@cS*f%R*>6l?EJ^LR@|Pp)DO2or(d(GQ(!<{UjXr&6f3T0XC9l>9dyNpXK7d7rAl)q3t zO~iC3d=22gS@gECeN2N7_VnyE-|d4iC?CgZ%8zJ3JQDi3yLR)KHH?b5rJfO>Ib z>b-_m|C*OGZw!Nymkd8ep6+&M>ISyZ{6=grKBOPHj6%m?!S?)_PD7Rf{Rm^PxoT_@Vw}wW&`I*szN(dR4aJy zwg(_o$tm-#x-8&YN^@weQ>KM2C^GQ-`}b`A;*R7Ux7BOqUm6bbIew-X3SW*+xCq&^ zyk_Xtp;x9uA%^@~`0|RU9%hMNko{^Y8<^?GboKdkO4$U)Qh|Eqr8{WIopqh~53k}( zRj0N2`RLo0Re#D~E=9%>@IN64#!HZ3Jdd440Zb^nKFwN7*>@q0w(2^XwKAT;&aCl9 z@0(`id=VMg;YN7Z;#^f#b2^S)N!^T%>z$_amOxtQl>qc>;aCTSW*2&S{>gt)94UEc zYAxwmNY|a14fOT9!6`q_#~UGMg)@r*-b^Q==bPmEc%&$8Wrk=`wn~%GmY^LwHQVfc zcHT|le`V*CI5ncX`icA_&PUfTybEt>$7U3aSiCG$ply8|#ZkU}3-=_AJtkG&Q0G#V z^xFj1E0-Fz>z*-vC|^daR~H@KvNs~LwyUp5yg~i%u^To1-vNr*xXc)V_K&yDLO7Q+ z+rUktw0%T-CGGL!HFr57;9{HD_u(cOU$%vs*7eaYB@WOxvvVLKKl+ua{YAOK(9tuM z)Ma~06c|~O+GsB+haIP~#5G$j`4JM*d2$C!ueXLr{291@ItQD{g}*e->%Dgb5)3&l zY7DbTk}lN$^RViaT?;(v#C~7peofnK4lkPekj9n=oLQK9TzveGALWLv&8Yv?+O;$% zv@Yw3+a{R>rNbcC#eV%pu(HQHe2Do2tU+6(pj27(tE`jJPD2Zg_?bxCL3Wz^FVi*t zd&$}acwYD%-Kx)XOFL1{K`HG6;tLl|13fg)m}LO4RM#F(n(5T)Cu&Vxlee2Aub@vF zMuZ=L7ELs17MlJ!8_x4)6Jjcm$G|>HBfNvZn+3mAwA<-#do1@_)QOVyvgAyp@hP(n zU6z(0EYy1cB$D_QD8Uwb$)73nBmI^P2c;ByXJt?EODC1e%;xL zwOXD6ctj*H9N`$%obqNSJzCr+4OnGFKBqKV$2UQx;_$w;h#krvWkEs2hP;rzC4 zT^y>WwJf+T$@{c7Te0XI7D-1M5#+9U_^En(;Kh0Z_RnG=)(!Ch-{}xg5ZYexiJsAP zEy$4XBvP04QQNzRW?vEfj-%>(qkQ^it)iA-%R@Brsc(1{^5we{`Dd0Nxr8ojK0GAg z8V1jP2Zf!Sk0h=SpJEZD_pRY>Y+*2-4nn~J&AZdi+RTNSaYZ=(qG{ zImo;jRSEz8r`K|9n0SYIm}*T3npz<9BmU`1L=_GIoyCH=JC-^Uy41DhER zU7STGEWi_G;bmLVv$jxNb*5M?gu6{3nfz_U$%Hkd8%ilJ?F|9$f*KFqrHbE3XzO-|9kdDh9?DZ;0KD}n4$^Qh@kxgg~%p%C@r z%hOVbzePdg7i(-aQ&M?xOOJ5w%EeO((l#z#yfS_A%^#DhvAtwM4$W{47@*HEi3W0$(kn$4P31_3l&8 zIW=r{Y+LR=Od%TUL=le7)`F7h!|?ybIZH=w7{`0N-5D0PEPtMX*uI}qUels)D!*}v zc)}jnm)8WSgs^zD;E^yo=1^3gQlZ!d>W*7Roh$3|=<7qq$4se#NZU^vXC@bwJ2J)% z;b*&~NgR$$N%&-+kxL0xa9e_xALyEwcG`^TVMl{R5(keMbT6;v-`z}6rb?|AV@im{@q^zVuou_v`HV&2qaKaWql9Z?v*d85tt zfBWF7CB8&4=#Stbh#k`C^C1DScfd49fsaiGZ8{YiH0GKUZd`p8;z0~~_-5N75oW`IuNAtBZ^y!y zak~4}8C+@BCM^s+CqZnh^*m#wqKf!mV1mDwit9qWo2 zp3UlkOi%JU?)HjU`H>6Wu@qr#0=0SOMASbJ=HiAfPx&aVGd-$wiSLf54U{lD$E;iM zem6D;Ow7Yr=KVIKeV;NXV*X|Y`HF;>p}4*k9<^HtglF+7cD&5dMOJhKy^Qy4%|r`9 zf}h74Cy_hb>vy+ZPB-c#i*|-6*V~~_52{~07y0o^FpmG{jrR7nSZi+8bNz3)&VHbv zW0zt>vqsOS53{Iw%4LO%dcsTGO5F9fjcoAxze0=qki z{Y&X3yUvA-R~*$l67O!1HF5iBHH9YaQefJ32`JD~;EubF;m-TrLG4-|LBW4@uMN-K zd?LK7pS0?!g|rym3?(Z%b*oVtRteB?sG;T$*oiUuD0};T0<1i27`U<=oRm9ed+7I& z(LTN>*#7a0-Vep}a+kBz(D#2d;xUomUF`1_8dIP&j9a zM^#tRT!b~V2{)s={)MXXkDm2j&V4%tjJw;KEtlMv&u@J#t-js-`uOLGdqAzo!_7=V zX4wA8RAb0eYPx8XNWaeot6;|>b=LN|Avd+m)Ly86z>grCAzkTqJU`=I(@#+;unf&v z$6HRK{||d_84$;^b%7=!A%cYf!5JjL;30T$8QcbU3GVJP!5xCTySuv%PO#wa4#E9R z&N=z+IrrT6`~7+SW4arrx@)ScckjJwtzAVllwrpotuleCO5;Rv_}D%#05v0&cC6Qqoqi%z0CBqWgU~;rE&0Jg_;{aw1~&4ov0)q+v|hfNlm*}UWp zXwS^c$SImm|BD$&^U7Eii)ZJBcDGVFPv(%`TMeT+B&9%_apyLgMhgSoL&wujw&^N8+J+#Iio)!XKASV# zEK#kD?A7M6PsXQxE~jp*gV;*sLx9#vjnTGgmF#wL#yy|1Er?> zwC8KO?L)>Y@Wud`SK+CgMoqi*hEBt4@-HQLPEkW2-+s|e71HX1mpE>RALi2ha!`RX zI_yXuQI{riB%)MpK`IzT>ZFK?PhQ%yax8Le!{UB7;F_DBX>Y&AZMl-ykcWEPt!CPo z^V(M4>oRulc;UOL=W|+h)FyiL`-N`AN+YW)tCW0(!Oex7EAFZ-1ecK~;`q9ba(ybH zywjd2%lf%*bzI$pyKjPC*ToSoNKy~nQX6ZxE5VjZlQJA;>lsFSrw2i}f0`!v1G1*oO6OSM0a zAva}LFN&(#@gd$hmrsZH`;U7`=AId2kJb$KB*PS8OgrzJsR6OCC}`&r@q?1WerA+u z091a?JK;sP26dPXGBybVvV zl{C*LpW`Wok4N?`KT3QEO_ge^x4At|4!;x<5FqVi(4%54Y!&B|9pM!K(*_ zg>X>(+lj|4x}+{C*+;QkGz!Qf_=Q_4%_Ga9``pWhuvU-$`;t{qIGV(w!b{B1!T~Y{ ztLBvRS3)|E`nxFn(J5JLsfj1TXsMrK3fAGFfftUOeKhm4*gD)uSI+-?u{MUSG-xaEAR{F!z*L8#0_I4zE#v z7^n-G;5O%JzR_DbZbC?ry$C-WuX9Q#D`+LIVRL5uQiBWcVAfo-7ClVRU@r*&$y{Av zmp`1?D$m1uGWn!vg8SjtgnTt@^6Tx~Dse$8UAskLi$W}e5t-Q$rI8D0S$JnjNVw7N z>7yYRX-rgs5~dzylssom`F)NF!$!H~OUNSy<{ZVSDjlg$6|F&*9cm;~B9so@PyZ&5 zo3I7b=k<`+CkQXMHUlku0Uc+aV^Sdd)H_RddHHD83}-J)=}E~dEfu^Nlzrd$(cJ>r z;){2tuRLmR#;q{A*XHW1C6Ui%XEVOwD^BET(H&F@`D-!*SQ;h1)*Amj!D)mb<68Vgvm zYIuC*IcnEz^J2>)kUa9oc(#TaD}|!$HOHw%#=sTcMQWDIHdy=;3_x(m>`B*?rqv8y z|3NO-ly#s?YZj)#J>vNMdQ!~!fVeuilFC@#&b!&#rNV`p>cC;#iSTL*X*)B%T{t`t z7xSH^q7%=ILQkfb8NF7_4K33KCMoxF<>5#WHZf_SEyoqZQ^@=jo=>Qydp@#m1~eH9dO-Req~!Dwmww9`|E!N!OR!6GcXCzxyC?LA2KAXpPyx)09+)S-P+2NgF(tIw?jWC zzub03_84x(A;i~>}*djXWiCb2Q9Pi33yU+Q#dD^!DvdT?LV=_JCrwCedD zm+Y|OizcaxG2BwrT68+Q#B^Gdb?f1s2N-Ook^SIJ&NOt(1w=`j!Wy?YAANP+1ce3iBmBInp$(d zT(gDGfHIF=-QF$*5DP^%jF)p4P`q>XoB>-zy!H~+lw*Zvls*pg4zTYH9qZn3WkI=P z+Qb&3>h#!JSS(`>ZFG;^!NZ95LR9Gn*`pf1CQ`39qC)wg3+)0u@L*(uy)Grq#Vn$F zXe`SP`$KWiN#+cCPSd0G!1%QEwob*)T<({PTNWLTkIrj2h)$r&A>|&{X16$dvUj=0 zS1>`wp20h8mEd@<8Lwt(-ZL~Bqb8AicJ(_}%^l_GXjC`)NL7El$#(z?H2L=R8kW80 z^!VG}xOokd*A*)!*#|%S84s80tqEq;Wt+J)@{Cb%yJ_}S@KHvd5(_6uXnyA=8$Jr< z>t>lqMbdk8mX%=2IYZ>DV{1hjpp z@J19i?eUX4CEvcOndwM0#n(YI!lPGdW0+AjgftN zeZoH04mnfQwrBw%lGd+Yk09QvM-#(Z3&tcg~5Fsin7fb{i@3Hz-ywz zqpP=ykBl~-qlCb9=ryPis@z?mJhGlf@6Wp3){e;a%sNvK=?YQ`NuHpI9Kw86VDGc4uodbFcoK`W1g?0hTbM5QX?9TDyk{GtBrG5-ECb+a!D>M3r)o}H*f zx6$h6YQ(lWwN4*p8VIptIGdSfv?HaY)Sd7)sEQ{EUtUH6GgVjQWU;N3f1tq0u$NWH`Sv&w{>Gf#Wl=P zMR#LDCCS%LtPE6A_(dkF*<9T0_RiqGn*GD8-nUc`c)g-T#eb&(f>~QLh%mbVZut z^g7*xEUIYUH_zfDS)-YMN*LFXc>6_{+yT87RdTD{t@O20gS55a7(F#Xlsa$*hxqs; z@5oAUuCB&%%tZCvUZ1B$YPJWZG_bX=@dr|hBJ9Qt;ZXeHt!$6%)2^#ahEyBV{r=1v z{UU`$H9PHRAYc3*Rp;PkLtC5ZO?1AUoUY4t9b$NPYd4evXEU-x2Bf^FQ#JdZR&!(6*;(0p zw4!iU%fcSR0oVX(H*;0(*PmXU5gdk3dXw1#}k(u7K?L9YyEo(1cmo zk|z32>l+^jsWDu9jWiha2v|7P&-wbWFD*@5PNXX$vZ1MK<9;HykF19#%p8e!19kN% zHd#~FE3>Tw0eXuz_l3!PinFPq@tTR-v(#{xlBI23+MsjJAZb%*-kpDU5~?PV%&j}y z09Nj--jpQdlbeMsv86vh2vO!wq7DsYlS{@xo7;{G23Jb zjsFjgWF8891AE#&E?C>o@ZRHi`EOISYkflfwSjrBE}szGjiKhY9(vau57pUhP!c@e z3uEreIY)#-9wh~5Q=yh7M|fQ$XFVrQ_*Um#n}d+pmk=TQ&iGVj5;l<|wnsN_Xl+TH zQ#_|w#M;q)?-E;0Sun;9;!bwiko1I?i2 zq`P=7$DNo?=*9?=6wme^lGKuvPcz}R97TEO{u6Q^ZYrrN?DpA69W5#85u=0xz#;~5 zk4Om)&KeL7)CfR0UFyo0*WA`W#E5X;53DO@4?i>5yf5W?zwYShoV>e~f}H4CC7$k% zkjV7x0WIdsRQdB>S%Mw6*V#$t1&2Y-`cVwqKSDIQy=&*a2_d6Vmrrq z_;^zs|8ro5%W%~E37-P)jx2VV+?>1C9!K!`x%bgFlQ6mihQ#}Mf*^dV^0@I#+@2CH zUz5x6Y)ElVl8^EO6l0CZfx+j&6@7IzBVwMGA|V>%=Ic+fapW;(v9$>{r$Am!j-1aI zF6&1x2^FmH5Ec(Sd1X7SsK-yJiX8%fUa5x!aJsJC22c={3EZ*HzD#xwhE@PKu;K!3 z?^jf2A5pSvSZg6vn^M~zESdm)kD17tm9O@9owd!zKL9C&@^S$ z>?sE4E#93aGWGk;XWYODUFV^!+UEXCvHsJGACKBf(9LZY?%dIFm;?68LiCnM{2GT) z{_;k?`5?D^uaSOx?DN}!K_?mmk4rTh!Mw{Yi`Uj16ZlxW7c%&`D+Q3b4hZF&Tbdk^ zzyqvk6q(e=x>#;9$|c+#i_+b=VCaRi$Myu?bphI$Mc*7bQpfj()I@3PKGF4_^~x5Xgfr(1N7;fyzEzMb zqo0U$({iIZ}%r4sY-Qw7AVzW}~F@K%H zSj!q+V#?7J3e|RHhmF^NM&!iK1v6EPAvyTF1^w6tIm;708wH=h>7$KuT8{`YGLtnF$#0jqL1Y~W{y z3yy*OeWY@0Dlp`jV4mhF!_7NXRK3-Z2a7!ZzBVL0HK_C_RImaf8QLE&4Ak)Nm>6ow z0&Fi}YXqX{Wpu21m`iB9)my$fQl^^~6PWpl<;lV+56h-OOCc&ic51kukuv%7L>W&x zPvuPR=l1CH*~+u(=XmHK;(?Q|xk1kM?PqcPujHfibibtwf`;gDBPggq2z$dWw3BgzU z^9dW+EFNlYqAdNp_=3)_ENN`65x-{K?85!2(VGvEItntxCcUBNE5@ns6rs+L)XT6hB&FGsjdMd9UW!TK@zMsc=uFt6qY;F&Mlb4 z#GgFdb^jW8&yu)6&5{z;0Q9WXhu4>&_&n*}XJyMlp|Aj9$BG@bC!oe(97bDkPz}m= zL4WOk7aEIBT9Nd`u_-SpgaiKsN<0yi^7+%1pQLZ8zHb@S%3ozDl2MtLhre!G^bwos|mGt@I@D~EX?qASg`;3skIFX5u6lMq?0=<~}&rv%i zykc6kaMB`ZnWFkhL?N#8NNkWEX=mNB&NTYx*Ko52E)l+i%`ZJ!%)4W`Cc8}g-l#2= zzh!WWATv?oeqP!r3RU&eP?D}duFXvtWO=UHx<%_**vDF<$5iJM#M)|sT2F^qDRlNV zQJk7#+0!22OKf~iSjXlMGJ>Ayyn@K{z~DLm0T(4kmM0|zEc|ai2>5=%(CmGSihV9V z^Je%l;7_*)6*c+;Q*4{fvFa+q5+X3dg7{qWT}s|=giN$_j=se7j4^Eo&GjXjdCAYt z^TIoU=pt085>Qj)464m`U1ni=H{4 z5uc+*1Z?q(Ka5UZ2K7=P^ziN4jp;*FRG{`Q^g)XSDEre zdn5!T4}HR>PJMu=;LGosafg`%pd-N${sF=V!_2GW&L&N0T8ZtUSoE+1?YVKMNE4B0 zkZK_B!j*= zCZa-uzQ7Lni_lMXFh!fJi_H+a=rAnaE3&d3Hzb)vx8!EaP^xa%FM{EaNdKJmiUIatwh9lg2NQQi3D{jGPEF{o5c&JM`2;^d z$op5=l3C`-;Ub+4qokNu!`%I`7Kz}FBwpBkU?x?%zg_uWMey^I5iAa1A)&X!T0%fY z-SB4k%epClFO)3_dTMyPGyl7I5s`YeY2q@n^SeD*#F4IC+Pg?q5ceaojiu< z+PTP_d4oDoX6eC91|OX9MPw7Xl>pE-HHT(iP1#W%oN3>~2pkK)aiDy-x&MGHVBVE* zbV&%F2MNsJV%xv>N-Tu)!Zxy2Tdan!Y*7yG9Q0gAH4x9qjYc%*bXkVev|zL?^$FA) zXamz3#-!Y^$V9qB^Y7VFQETvAU{6d%MT8}nGr;B|n5Pkjn%&%M_mF&8X!6foIi)u_ z;q{GR3cLyK6Qw<%Pm@AvI%#-`BS+)6m2?Iv`uPfFJi_Ys%<2yBnvds1V zU$?Ts;5-9<^6qq};C0IO15(oB1-C1k9s+me2jc!0zuCR-yR<%GFvYw%`Scg6@h9n5 zK%idxFZ$dc9J;@K{FHDxSNO|B{&Sbn^qX?`x3B+k_%r1Htm;3D^t1e)NdK=Qz@^_D zlYbT<&T!TFf2-L4f0O@eE7-=Bl`wvS*4bsK+ev0HQ-r31%>1B z^3&lYE}zzj!+_R**ZkLC#DG@qx?zeqD?_#H?W3b$YI@s~J2rvC>A;tlM?s{&$Lc@! zQ2lc9dg=06G-oWPooa5yOx4Say`m?3hu86@TbCPCUHLMsQ7>Z9diEN45HPq_$KP-#?aF(BZm-tQSlj79A4!VX{xgRqf8 z%V-#s!vBM?ng%Z^Njg6iSL6IO&(d&dz{Wp%^!LfN;=WhkNb54OsPW6o$3R%e3Jld{ z`k@e!knm4@t_!l#0EJ5!Aa`vS5Rj3hkS~e>^T_AxLxdpQ@2UqiT+3+} z0mmMB7{tm?Hj8hO`4bg=_089V*G*X8b0Lv5R`Yqmrx?!Gl^7zE9gv%kHO{ zID|1DVK3>@7ush~_3yLt@LsR$0<6Dt7*Y$`8^I|m8y#HzZlAyHNj1w+$hdD!DZnzf zTd5EM3WLkX8?mSf(O6mT5HRIIu}E!cZ~I-gANN|_uabyLs$vm&2<_U^!cBb;LkJg3J_L% zgsoMO$k5*8)UuicnQ>3^OnD_Rf1$|=4(0HX)OaR{9gRfPcw;~jJ=>GG(_h0ZErgW3 z2#VRR@P@Rp3i{P(pnPqaB8kHR6%*~ztzYR+SO8V-SnD00%y5f z3lyK5e9V3oZDGR??r32yhw}u3gY(Jqx`&*{BHK7#cB~Gx@In{f+Qv%?GA1}Q)OU=8(f5jsAo+_ugR()kd_+M9Lv^FOBZVjPOSEN&~O& z@Oo&WR50LRo|tnaztVr;jN@gw$m~?IjZ=bEBGaQ_sf6C)abng!zw^D?E;sCkIv3Jw zx3ug9Ey>yV)_X5Ee@#j@9Kih1#PCHL=~^|nxnQeRE}g19To;X7i>kd_UYGoCiSWmA z;>MOK0~IX$`<%I{t>NTv1QrqD_eE-cA_Y1;4v3=nd~EQ8*n#hJ7@H~p!3f}>kcR~}Y&MKm#6O1UC`u6ypUjY6Bs(P4P= zbfRpxiYKMO{F#}#0GX#JzoOj(&<0Tki*Luza$QW@lp1WP19kiJM`oC%Y9AdIoF^}* z38{!S?i~N68wwU!Pr4LGe6txgc*#(7Yeq+$gW~C6qu85-r(LQ}gFDTx@JpogN`oNa z9IdI#TGmlpV4B`EnTE3@k$Svl_Oo!(vX~p) zYqQhQf<~(HV2RBjsm?I%sZH!xXHJt^_@*#2LcXNUSyC0^97`yRcH-dHm>mwWY_l_6;HZPZav02KE|!o{ACcE ziIS|jDQ5ePZ0KI19=F(9f0$}E*R-M?;&v!+z9ta*l~$+Rc0eWAknBC~%FjhS0YTAw ztuhpjJ-L2+YV5a!G5>yGF`jmF#T8XqT+-_5>iXkI_l%-;3WoB9eRcR=qyDn#+Fl3| zhxr*G1RG_lfi9p`rqTVtI7iDy()dRKji_-x3LsFX{Tplrwx9&l*-osx202>Fm{lJu zT#}ESOZbw+cDassPo`FN-lCD1zqZaYN|^0IrBx?efj)c1%zQNeIwhKsDmqlo$PUvg1G(_6RkFS%} z@Ft1WcCL>;Y?szfz>9=sH77$XY|lJ`GL>S3g@nhJhP~&674wcf&Frq=>DmlYz#{=e zmPI$_tWA`&!uMM>=1Y3JVa$2oO<8l?)@XKngzv3J`4HvL&8mYLb=-LGl`5ACOCB;g z#5$sthIF9I9cE@Dyg%g^tj`aK5gS6QmNttMz1(M860aRO9GF0jBX}vXH-jkY$0M6s zRsBjQrf$@6h4XYgH~0%{JEgJC+#|f-#Ni*m*S|7W;5AmiKlnC#=iXo|S1==Y#`ity zZ6>r8Mq;HRw;R1E6?fxximV|Kal!i^g9Cpgs(AS>6^LnazA!(!w{Qs>VnhLObvYnx zi9Jf7idAf>N%(35+^LO?PxXh|ylx=@3FqgkPB^f|E($5BhN%U;2rA|D2Bdv=I!>~s zm{7OHyM6rou$Zh6-pOC?g;#fc`<8!IW@d*K%_mr^ z5Cf&7&qL;tzIq()THk$Aypm9iJjMEpc^Jju zpmB)j$9B!b4F@bYb9Pc;`oxgi)y23LHCxn1sd@wPRpQ9#Erwp3^bW0khzk-4B6Iqa z*~4`aT}Gp4TN48N>RfO(Eel=(@$7ekp#qsCUZ_nH=LTP4&gzgUieDF}61~p*_xtpQ zz@|n=Ca$A2fmC@LI}MyQv17V+16#v7MgT zzW1YY1@5d2$)D;6TKSDMIWWaT%Nz&IVv?z_DIj1(mmu> zzF{Ru?W#R+(e`L>8JGnetz9`}p7iZ|DTlu7yic>HdxMtnQadtl)91l`;4tpTiOfBZ zR+@{EyhOM&K_VH%d!$D9khTBfZppL75rpwWe)%Q`b^ExF_B`3Sh+YAR{$_eQi^RR# z5-~NQ9={pBxNX0@SfKT#xkiKcoAcdvUMmEb+_Ua7rW-0kFNu~{bl)wGR&6X22%aUDxrG^K@#BYj`!)o$-UCuSvj4nSMYPB z=yy|E(-~gE@8uJnQ?_aQXDIg6knC$SkM&A|G|4w_1fFoIQ35K9gmwnOjk;K)n+NUa9N?aH2zA<+KbM_to07#B zRe=9YXL>u~2)mM%R1069=%d<}hj=Bxv^8brdu6`A@vRi4Bf=}e(a?zT;xH&lrG1_G z?ZZ7w>_ddqsn833fb07&EGbY$fdv-~MQ`g`CE}k zZ90aMG)C9{JdBFf?I$bp;gTQBAFQ*vt*IlgERav8*XV*Ra`(V) zzCl$Nk?fa)g;_1wm)q@j_*WZGLW?i$9L}voO*q7jUIm`ZB zXsjW;NdV#wepKTzyZnfwngb0KeaPmx5sJ#*~}QYPfIs z?qJR^mGB)te->HGD^^vC4`EMlLjo=Fje2aO^^exH@dl0^-hht{;l=+Mt|1*LNO5FvZAg z&=_;*wl81V&H-2L<*)bQv&CU0jR z7VoT>Olj?6rs{N$bx*%5f9jG!T)vVEK>Z9s-WN_`RC_Zq$6Ko+Q9?mJ{-v zI(uy&pxzNrgg!#Zv7t96BeZQz%%9#)vG<4sgpMF*qB!vm^r1^T61XV=u=`7axSx}jQ* zNXBA1fmK>8EK`pq;Y5Q12Ku?AyKIyC&}r0 z;qo@qHvZF>*Wcpe2u0)NOTlnno?HS8&h;Cjy$-eivMGGZP{xFPw#gE>d7C}I&a`^>npk%cZu=1`aB7RL3~xU)YbCWff^&ZHu@-`+Q*Rp*kc z=}7|j3{g&1C|T^l`Axu8i>$b*SHh!Ae4(&znSj@BztSHE2&2i*iH3YX9VeZ3Km5q- z6Y7`RNV=6`$Gc^fK5ctUy^3t!6PQheHB$<>bJOt2RW*}~xXI#wAkSnDbB8oRP!vJs zy_9=TT)+ZePp4zQeGRH#c(%~ZElt4O<6N-;eRIm;(Q%gEoyXM9Pp zE%ITQV8-*snsZx-Ebw350Y;VI_v}N?#$TQ*56a7@=#s+jS^q>v-zWO{+J@!CHCh7kO) zfWltYjXvqGs*9Zi@fIOpfd0?B54 z6CFUK#OtpfvtSeaMS_FLw)uW}FwS14#|WYLTpjMqPV#gcck7-q(c6$=W0q6q*GLu zBw(7j8m4gY2M38YmelZQ#(|mGe#D#GK586oxLdgu9k(IXD)j8Z)!`nk6VFGYgYeByw`0!Hls@L}4;lI(lME}~MDapD7QgEN zQ7%2;u>d+a{f!1J--(>P_vaJ}r*GcR!BtpcMB8&M37-w~{;rotww?r_KS!y9Ee+nk zQwO0^h$02$9B{myZskmxMDm#fM~-&0yd_#X5@?#lrG$GlMmyaAcNZC{QFV&Uz3S_w zJxyk@?y`vUKvh>wOFw!mj=~+{g1t)Xw>4@uKeZhjD{YWUw7o;C@Rb91rbQIxu zJV4;QA|r!OzKJ@po>EVil^iaA&9EW#e!**dvNG4H_JrFXLPPOR#|NW#?JYgSs|8I5 z{#>H*vXwK=9e-IH$3>J>aoi{Rzo{Dk0hRLdfC}yF&UDR)s;cZ@xL=lcb3z0>kb3WO z=^vp2SL>UhyB%{!_M=GSsn4or`SZNfI|Rr2mc%^e09Pja)QJ}vg;kGl8Ja+(+%@WL z)zA#J3q8m9aEHU?m1h#Vmn+2r+aPLJ^7^B|SabMuNQ! zR3+L0?jotcrk?zoJ%yhlP{AA11Rr4)yw6*Cs6g zdeVszC}AzOrD=;nTD_g=cd`U|3{ZLapw<#+w7D^+Cz|Ozl#rpnJ+e1dW-($8mOV9I zREsJCg?@KZ{g#%@RR8`nr2Lu3kO1chu_d(v8g;Q}45wcrE1Ut~c~uEfe;;eLiw{s$ zTKT1V*=b)Z+lcFI?u&UQB1N=mmztheXv`B-+el4CuQ@c>gE-?mDnZ!?cwm*p8Hgvu z#vEAnF*iLbi88$!h*PSs1CAs??YKxWdi$Bsi1t^h(&OJWhgHeMKh8wgKXAxz@p|z z*dMLwV*vmUBT$86fP(PCGg(%nHeaIJPfA1Y%>PXM@Hfm}Ko_H%GES{nWwUB6nyNJ@ zLQk#1QX^`@c*;p5Dwv(X4G|kV!4~T{!-P{VPYFCx^x-p>W|2RCLf$NEZO8UejW#SB zPx%MBb)~WcU<7C=edaB7(lQLI4sYkS1**g-PN7d-Xt~8Tm@;7`jq;)+!PqQXN>m5p zHDu)`o-GW|!gU6iZV^+@Eqy-6CWT(*0n)g&tw&88-&hVahb3IsODN>vC4ok&PqE8`m3!<<{qMRJ$@?SLNXxRr# zoh5r#{L&Xs4d%DNIQRy|jHz`+fyIVez6R|A(m&TxquO+0E3 zQv|Zhnj=*KFrI04`gSzhOpKVx@Z&doxMcW?O02LG=5`rkk(IKRAPutDLB4j+<)l}h z2=WA_rz>IX!x`9-EMKI6;%de047esh(7r+|R@ZlT^C6{$gAO>KodcchFd)l(1jtJg zCop2NU(F?A+XSz#wxRL>{VUbur}O*hvujmp`ze)AbE{g_UqDG`ILy3C)^S zc#Y;V;kuQ_|y&Z~qzOZ0*Jf&&1>c|V~(mj6E z#~`z{^3eG~p^UL3e9w-5!+sIJ)!#NMdFl5TJumNd#goCS6&qWZmMSGe&WW{`byn9X zchN-eSwF93fBwWe9oRsOVW5D>*LJq{g;)PKh&QusBidso*~a5w$L1bSb(d2(U<^wI zVuj?}l%Y)iV(dt*{W>v!w;&VoT+`CGxys1MfY_?Qmrf;5AJQD8zNXRXPc0Q|__-nscxIP>?kU^8BSA!!mhsI@^YV5IW>tYy1dv`2L_6dFo5r zG`^wDQ-!|XHBeZ#m;31aqS#MOp2ZKaiJtZO&~iA*i_ZUw=H>BJr%W4lE*H8jKw#GzRW-(Ps+ zRi*JuP3H*6Q@PPVCu2nEAe#hihC?x@Ytm6{)wiV7#OrcrG3}#et;)W*GpMl}r}`H{HvKW6KT(v^nds9T-TYz!njYi$gaVI2P|hfBIR7Lx`M7}x`OyvJmR zEas?`dcuIPKGcT*lsjl~PdT@2xY183T$ewT0gDpcQAsq{&cP4}>w7@sO9{l`o)Qk@ zMyHN(*?Bd)c9q}y3MCWl@;HW7DuKm`64d>|hTY<@PlkCsyVuomtgDKKn>5TKyXJ@} z0d4Xdro}aq@ipV}bWus+wunoc=%Nag&&)8{O`hinE>5_(8`K%6%>5xY_@#yI`;3@Or&z?0*bJLJw{0>9YMsUxOde$kTiqJj6gxtay@)O7_eIgf`3sTA9 ze!7j>xH`(;Nwi16@S-^7Tf(V*zanUes+l}cc>&<7tsim4AQo`{Y{?*DvN^|IlQB=3 zK)Es0+U-_qCQ!gEQFKq0==4Fhq!K15L0lNH$P08XVpTxTLVQs*1z$!JA{rkGU@-$K zv-$2PFa@Unrf2@g<)D-al>ZoyND6bo-OV^hjd~fqLHEATo!-a*OvdAl`>~^BWxm-m z5zyb(t~QnmX$cE6k303Fd@)bmJU-+GIX8{h#Y6?#Hv0_-i+ONpbJvXEdP$~mVO5fW z=XF3o&#!(FtV_6JoZLPUtfX@g%o)7MkloS}*d$6N*W^a#Qip0O%W@k&QbG%iU5xeOWWysiY}&6{-O@P~E}o zdiMbHjhDh~dQucsw&L=# zm^uL^Q9Zzy=743Z} z!A85Q2@t7l&IgzXv#qb z_v%KgYpi2m``?D&_ZQ9knj8GDpyiK#?MM5qvit9n*FC?vum6R*Zs7jrwEb6+D2xB2 z7yq*exaD_#ivKDh@c-ZBS4)A@!>`?a?SxjXXo;R~4deGTjJOh^U2f#SM9*qb56KS) z(s`+MwU)tiNltE2wf?VHB`LA*_^f~fTrG~&=nLHo-3lTLC46gsFQ64w1|48(;5<>_ zf1)b?-re6Mzl@Gi>gNNSNM8-)U8aTQaoG(Vk>fmk(3&PL|B1zb%R7GeKSp5aQR`Dh zJz}=VG0VMqOngwt->wZi3`F@&E-W(Z*rbjGFmg`LL^D!{%d?gKV9@ANA{b zV|lb}>LinP3G{ygqIp+Ze^CwdURByz@+rqtam?Aa_kK$)a4lf7`$(|0m3%|FWipHgr4O^8;?+?X);Gbq;g!e8_X3JVQ>tyPC;qBIAD! zKsncsf3Y#;5N8xDf}~ z3=KrmlK8KOrHwGQJQWV3p@)Vn2@&Qc>{pGBXTkN*ECslgZ=u%f65m`g@*TXn0FoY( z{+}JrSoQde<(bj(&H6o+%Y^`4W^L{F8Y>;f^SrQ{1wohqh<;vJewf0v7naln@WO_Y z7gn0`Fd@weSFsn*6qNk8I+OgabKpm(dC8)<>6ZttaOJz=l)>GRg;fVWsNIe~{_9-; z%M<=rVlqnP^_M4hVNzuW3E_qn$>b`nLEy*@08H=o&5N3B`+Xx@aJUm z+v=w9`c|LXyN2bEDbDX{DxfI)D!-6AsS{R=un6-Nwf)j*yapUpD{HH;*D{2nl;U}_nwl#8BtKwQB@0_#Q@6h zZaI6a;N8<%8OLA7J8Ptb8HiB@&TYV${%0PVjZ-U&X*iTIR^H7QUnzrI$gPaRp1L_N z7c)y7e<6j6LmdTG-pCxP3Ejo3``@`|w$qz`*3mgv-^aPc5nQ+Mm$5RM#cgpfJ}#IW zuq>8G4ZS&_1e-&-!w8n0)ew>K7d<4DFC9ca*!V5o@^1g29hffOH$X8b;l+`yxvxXl z_7k7Uy}7UXOvxVYyD2@E^imSAlrq8<0k=_ecJ-uXF~zb_9$V6Rq!fqb7rk1II`m+{ zpXo)pg^d#6oc@$u@?a^zzieYVu{0Vx%-@^W5{-#z0H5VQV@&Sj@3C0H90VT;SGHYS zI$9Eu_vW=pW2TN}QJx-DX_*{(K)q2rCoi6kn<(S%#U(YqcuX~3V0r2pG|@cT?r9mG z-tyv3bsU%bo0X>EI}0N$4G}4DSrX*OMn`BXhK(QZbELHy`#z1Anmu@I3Q_Q1~#osUzCg zGwRg)?Gik!ju-{x*~fo~OkOgNK#KynSL>8?DIv(aKP>1M`vB$$`9r$v4+t~2oeaP^h}ab-={ zXcR*5;2xZy!5xAJPX~8*cZc8(!QC2nch?Rc+_iCcmwPhv&dl@O^P_*!-Sj^D?5bL| z)~e4(F>`ZuzB8HMqzLa|_Trg!Hso_iY({n6F?3a%w92Q`^28&T zrib?1kxW6V`lWWW4GAGQpBnHv@kqtW`yU^44r)Q^pBw%IUgRfvXr3hhzGuDOfv~1V zaO5;XoJum=m=bvh{j2wLqUNf6m}yc-gRz3PR5lLKzFwFSXdv$5gm&gYb+pu{Dtbc#S~i#7RrcnYgq9IY)UgXFimodCi< zRo~dZra_J;hUFZo5g^SU;g_JSn1kMV7+s6+tI&S%2 zV*2A@fywx}orzzQKxg_4`x=5(jI`P;;NN^5$DgW3Ed#Z^-D{;hLEc1@a);4q*v#^-X7B< zK@MJ)XZkdX^CJQvFP$@Lp9;svI?Co3^= ze<(LlYo+5;X`9o9!~#8(8=LP~ll^krF|&$dDV36yo`P$BF|9CkG4uAcEgJa4NMuI2 z?{gxxA}om8IFIdIIFKNDp&>Gj6o+H7vF89sDkToXAY31R0T>j3;}zFAM`XB~cDGd@ zYT=;e-bf;B<$f->I?#x{RM&LNzx9)f=(yTFEI|{EjYNGf+l8okO7H3bG3yrTYw=f$ zW^JK&O`A66HU&og=dk~!6Bz9OB(WG+Rcki|6YyYgRK(3Mj9EHUeIx^AM}WrjZP>X$ zIx2!2?!MAvih2kcspqGFcOs7!hUaV(5uDR_7K&Hi`f9|JUAu?{h|V_0LOhOgwZ7o; zMrZ1S6jA9y`bmNFqD!iYSq=W;N;jn*uQ1(l3k7YL5#QZmDp2j`SDLlvS%~S~tt-s7 z@e?mNfa*@0p^&bFS`#+HKP(RG+8(cTRCavxNIW}>!RCGD(aEJSysfVa= zwqtJF?%_DRB~Oj6vBwNmAM_g%B`)W6&!n5_DK}s+~y*{tf2{dq&HF)YuPub!`vo5&T8>VZD zIpVvrJ(=m7=ZjJ?WUGnF=o9W_=h3I^prQNk>fZqMDz*&PoKs4xRvI*UBH$eam1m5KZli$9H1nF84krPfOmR)#RO3(l6b zOU18t4`s=L{dxH9A0*TG|4B3e)9M?SJoC5P&;O(#B|2S(>In8&7;FEBjDUvY&TKCS zjaJiKlZ+VT$x1}p>wRq0C+*k>QQ>@7DNIdml#k{SnMH=(`v}kfCWqOk_0Ii;?>HHN z6c{g8Ui}}i1(IvVV@0C#l}h28*E_MbU8(dFl?6PVqP}bOD8~)lBM!K)4*B?;JkvWw{#wh$(!jED|VWS>QX&ORcW$sDehqk@zj24<33NKPm0Jw9%cZPEFu8~>!hq!qV z+wNX+3jo}$C_6*l={?`M(Q)99R{OEHve_r91?NY{WkxQ7wg^XW72nhsC$V7CCiMA~ zz{Udbg&QWc_-8Li>Jq)vab)GWXm(80oXYXh6Z(_T%r;j{*;re>+gn{;*vvG;Fh(7X zoLYgO$9 z$h^(~@Su5r1qr&GV-2XZctJ>*9Fq5_6qMYkk6mfW&S$R6uxH9%kJOEq?G&tP*mq^| zUGSAeV-q;Fio^o4)`)gGw{CvdBB}Jo>zvcI{d;Ex;&=qq3$3i%DuT$=T3QkTjzqaWESafLt!E$vUn|Tk$J$dq^?q6um z+x-;f8Y$n2w3M@RGth2{B;<_^Go;h#tpj-c1>fA0CQcV@soEayNNWl$$#^p+u*Zo} zGTMPT3CAIhkE)pg1%$-!vPSS1-@ zOUUs0#>Ge>lFLz4tzoZ>0<16_BFOf&$ilT95H|mSGC#_Qp!t%KJs-Ni*=B(P<`p9a z5-8fRd6*M`DE9C%{({Iq&L-JnOfDPo)m@M+p}dO*nuOxV%c1WGdnmCU0EeuR-n;e0 zV3Llsx>ZqNKfPOo(}|$%7KKl=tJ%a$Si8!~D6IceOL2~RLM9S63-qI)}~fe#SNH2Z=WS?rNA$cB=f36*XKoG>m!OUufCKpNm>fUk0$DVK6JWXP48*re49a z!QO8*(T~rso~(boK}d~+df{As*$k`kCcaIHoF=P!naDMwOm&M|W|{WND3Br!Rrc|#|A{S8%(yE5tQOE`i&;RhtnFFH%hu&72u)yeQ zIdKL6@lx{osqu&Z1~2IP28U<`9~bnofj7~be(Nhn4~WHcTdo;z>iWrY_) zb7^11h~mvbOcG8ec8+%9g#NsF6yahQH%w#RSGk+;vKcl@E1lxH%x8urOCM0P(&D|# zSd3T^3T14V(I?#}E?k7+t-`BvV(3;PCRVZBKKZg(dX8*~|Le}_jy)jyzp^F-_um=} zH;G%*E1NyQiy*||Ubn)-QL9zOWs1r2s5`Zj_cOC9?Z;|+~BNGj0uq zTQ{Q;c}{4c-X((3(G?h4j^^oR1;f8>h7ck;$bF?h1;Uiy2iq>^W~hZ{@fs##=OmEw z7$aRRqbcxSU8aCDsJ4IU@%V5}Gre1&wiMIZyN9Br>v6DFLnUFghe9}Vf?czyeHJzu z9bdh|)rU(dipU4uXcrbjVkVyhJPaB}E!5YzIjs7f@rD`R#;#5Myk_KENb(N?|YJWPiMVndE$79Dr4AzkHFHrW~KIZ2~-WgmK+rqj#~;1>7FI16j9Nn)2P|_hcnR z{yJt-CK|h^ZOcA>K-6F2CkSR!G0axHp7Kt_H__FKD~AMuMDI*)XU6P;0t+_$t1MuN zwVQ$=<+i+r$DJCWsY=M8=IehV!k<`?j`?pc5HP@(m=17U`Yd7D0frVz7{ZCS(J*bo zic$^?*qtz1k8 z-GtSIM0?O!;rD93GnU)DKB(QzZgC+6AU-9j(BCHS{%A1QWIU-7YxmnjnZ02yI3!@5 ztIh*eU(s0!dUK(Z=tiY7`CfKxf!^xk*qr0u`7En(i%537l4TPT^K1U~AghU$D)thU z!|Y_ui7Doo9HWDtj}8&-Gp_qN_7JN$n_eu_B0q(($4Iq~kz~Zl&)Zoml&ev4V}fSX zv34Vimu@WPyiCY?KCl4cC4pQ%Bcd91Yuh5l^1a?n3PlJ zv8-9IW$V@Q_3^Lsm#_&${s#s~NBVcg;UldLMoGd>Fa50O6BP1OUEZ|lkj*CjpgYIhVmzS? zM(T@%h3BtH_Od-_x7UchlrQz(0w-eii%moKdEV^mB^*HB`lhO}PCBCXnj?PMolahfTc!swrT`{lR?JM<_5#4ZW?j{&DI^}ijf7U{T!ruu$e!K8TC?pRlpFAlQIyA& zEid>QZ23u7a}eSO01RA_K|(||Wrn21reifxNP)Cr;C=NkiktAW@ZS^*;)QyZ=0;(i z?UmQY-h^8eF$*n`m}TIS(^V=GtdJ@d^oEQ5_Xn7)a;2Q^n8+fW)%K}#JTpU(7*eLI z5UPEfvfw^&B0*$k{TRnS--wvj5pxT%{K5ZUoF$7z)0iKjI(vk4YZa3gd*-#}ZF1L@$)*>7uTUt<E!K>QR8LCWL@0|Ln~ki^;Tg7wfxV-2Kqi)v{K$!9}K8GY&V`9C8H zTqv`UG_*vf>6%@%38sU9<=eKg7ANGI3xRK-2ub1z>l?Y$Umk|mAde-Nq-Tm zob}N$5iH^Y2Y2~<^{u+0Z$ZLY5s7zf9a+0b2pZCh$Db6kUc4 zR}`;i1f_Wg}?U<`}fh<+2`~Ft2Gm*?Dn24=yptVw5092!tZQ7TMAx zMtKA{yuC^t;v#L~T~xhEv3WWTu!<>>Gt&aFARfnMyaa1nSwveL_TykMp@=SzVsMoT zl4dsnX!28_1n1^X_!0EsYRaO)eo9-@Y|^u_nkwbU@`1S82s}OSg;8HM;v8Y56LbDk z`agt)9N{0p-+%3tPCY1CK+3WH4JTn<&PM>%Y(-^@pg$qJCzuXsgT<;0vpt<2EU+LQ zzzq@ZDMi_I=k(r(VOGQxx{vuu5`t;7Z`x*96372pJw;*)VSLk-XLa|xNUVdUR)pvi zY0(#Ru)TSRZ71+pPUZ2L8c9p=xBWo7)qe{F{?MyVr5f| zFW3M1V`M7L3>6%UWs6-VO3raE^8Vk#aZK*t$L}9dw*0`-s#b8KFMLg91*7fwjo#C= zUPHV&ZLT?d(kNL80^;gWKZWtqs!KPHk<~*48aR=^^5&ihM2n=J3_iqbW#r+&*77gw zY@&0s*_iy)^EXE}-uimW07OkydI}c6WFVNKH%Hramyi)!JJ=#=(9mQ6H&K}`HAQfM zY6`|9etp_E30t35H~?-$R0bpirusmY(tPf8Q}q`YY;Ett#mzAcvED34wxdkU{?WY8 zjv2T_M~-OtKFM**rQCuv7R{g*IHDTKMzii(B54+^&&#Ox8lAcYAyIH)hfw>%@+~^! zG-kKm2F6j1#TK%V|8|YA3*dP0*Ybc+6P$JFFe8p$A5#!8vOVy8M>KS+@va_qmLljd zwzW(hjK?G==zZi?g!99|VRC9&cJtG`;eat>pjg$NlvS=`c|&@C>DxY9d}3c5E+Hdh zU4ijj)({;Rn4LytwghP{$r@PCduOR+wjDCQ6C+~5Pb>ZNPRY~K`)IxMY`c6R7_3h) zITt~k)+q}?2ZY$ zJt(rdt7}fQz>a6|p!^xiwgj;jb@(q$2X}S+^Ajthf-KOu^>#{p8!S*{=mRky`2}D> zq)^QQLyqmD+U`()A(;B~n7`=0OZ7N3f_&5PMBH7=AEi}&S`=T$iGa2VEio7U3Z_9o z!Sy|9Te$Frd|5;jSowqmnDaulSEvqU1y$ig#$nFMNjJT7U$-b(bBm+b+Gf1ua_pB$ zb)lv984ex(O;@jfW=+I0%%tFP7Dez5V>3Uz(!-o}YA>_-fBPmF=>KM%Nl;1t-uiaj zMof=zws$+E0~Z&jm_ctrQSUOAv4;0!8Rm%fNd|nqvTkJ2hl!CPYqRzsRC7(?YC=x( z7z6CFCSoQr8>`jTrqBP|V+2PB{2PwMB2N69qduB)ZJwMJr->w`i&p(e3Q`3SB>IS7 ztdS*O#Y`nWl=VVB8a^vNRG1P{AiwYVVM&9+@Z=X1`|zzfnQBj5rioTU7M>H+oI6Ax zBv;)TI_&y!!MJLOh>oXf2qhIbYn_7s@u~T<>*6^6%_PJsn^B#lV=p;oOg~CoO#Z=8 zd>_9-1SXmLzYI({%a88b0CW7d8Bzl z1QDt$M-uzKDz(0UkJlrIjLZ(FPT@sGJvSPY=Y#M!Ek4DvEx$jei zAq=7+h$IXF$MGsPrBbO3z+0D*g{XS1MTjHfdk>3Q22};nB*S1!Qn+QRRbw%aE}1nAR!{|7M1L?6_)ovV^L0qh9?^}5i4BSDF+*}15jd^t#t zhxG4rFz!uZijT?#5uKU^bPF6s8Q4U>NQlgh1 zTmTK5_XH>k;jekMx&h3CY`Zt0t zk3fa)OdFEtf|+|31K_sQidM9n$YD~<8o3l)A-YeKq6WSy3h<)WNa5N)gWD?cvgDAH z`PB@!lM84=ddHv0u#YxF3ie1sZYSp(b+>S|;U!QP>2HV0u%&R-OEDKkDl1f|4?ek- z5*CG40oiLqjdU#CFXP$fcp7)%F_J~ItRgB?-dNJH$>1L&@zf_5Z_ocWm#Zm8v36Cp9qY~Yk?(doa|2uHRLh+z ze9Ll(7UEyHF$jeA11rqn=;$e!0Bj7*TzyKW+Uiv+qmr3Po{M!xQ(3nkPZ@49-Xb2j zUE2=WJ``^J;?gnEYhARpKc-fp7CZcX4mDS#(wQsJtX>2(2t$ALT9}hx-&k|zBN)hj zRvpuB&|r%7uX%8lO)%&+c?AyEz$BSE4h9wZbY5zyQr|;oDD`DOBtT7c&KcTd6Gn zQ%Oh!>0(GJj_9jntJa%PO8gy{MEtbWoaH|l@Ya`Sppom9t=4s7Y!qi2KDOj%aXB|+ zmQZ2AL%bl;ph=gP;cgrJNe{~l<+vlN>L2&O-(5hHG0`JL-NxHY z>&bnxubGpZ8*KD4-Ol=l9jhlN;Q0kyBL1*_mlk?tZ&JeG+bz%x^hTf&YZx1A>+v%v zS?um9`V#3F9`})JJ_0|-VJ?@kGvOyU{msd^S~X?lL#p{sEEG9TO(o~;ud3FDW;eBj z@}q9utX6b7@CuZa8}-G<7Ruh?hf87_q*0eXpvt53iB=W{I=();CUq*$tUnFulmf(g z6x3Fo&x@rU=`jHos%2Bn@9H{+j;f;4#(4ITanRdIU9%e*%}DoEvfgfPAPqT090R4i=gh z0CR|Dug+e(BqJO<>V#YPEx=S{)ddS{s?`1MlI!1ZR!Kmhr4Q@=72e2!r5rME8+Pb}LCoXHT(fizVT{Ur zKY?<5;7|qdrC;tCjSn3}zBE&-Pd<*%m0eR@m%=MBz`gl=tgxLPoBe7|0OKAv$-mE?$ou0c<0 zyrjj2g)ih|02%jhq6+ID-1t2tX<{60PbumQG3|RdZ*xMc;?pRb!rAN;LA$Km3CE3i zZx%y*rBjgBo1(1q7u<-kXQbqZSD9=H`S!mhRwEd#YLQw+Y2eJhjGWm`w0j#rH&gjrF&s_>>u#l7qm>+U50p6iRrp8#{= z~Ut&IJX9`oj8U6|-l z57RFZzcIMO-~6^%Jvir7OhP+~t?kMW&C8OrV6-Z$iGep@FGlY@p*MBf=!AFb*?JCQsb)T#xMo#Do0*||~^R8YlmR3n<)1~GIR+>}z zUSdYcin}_Z>fzMcAr9m>&+edO8%}t}KSxWH0w=5RGa_CEee*(mD~IhKx=ea=kVguZ zHlUW6v}Pe>`Mwy@HL1gF4K$j_G9nMf5J>#?P}csMtOMvs@idxby5obyjkilQfx|if66X!&EA6$Ic_9}6NldqjXK<7HZ$ab?)>Jq= zKzlypK`jK(+JOxGgC<5VU#lx3yL_&$<%~M*oZaBpSw);9gwDM1nAPocyPMJ6eX^2; z2ZB43*F``Ex6S@QZt4#PT8i$y`O40}ZW_jQA58I)Mm^Hx^^Z>Q>Jb)Xk2*@)!oSTa z(vFgfhz1x_;>jDceV{?21tu$Tin$ul1?mb+eh2z|tUWX??nwL|tW!0WZ0%s*)7}sc zY$UmH&m$(dHBeTgWoWeIJ#y}0aK|>^R8%b|2HZa5R`)y5V9G2xw++Qaq=u%C6+{(W z;&|S{Rf1|T&Pj+LX5D?kx%v(Hcqmj@e<#q`NaEE}E-#D}JfxF%fQX^-V@ksN-oDDg z84+8GtL>r?%=MFHSDdQ&u5TMl;NMh`44YeD^gbe^2;GP3uiuVUO_h!?})cxE1~=ti*N zHoNM$=EF1sv?30A#yLB&&jqk*JhJJyJWk;FGOF>pBYO1i&AnPm#Cbmf8i{8T8!-(U zO|X&nJg#0Ae{lEt$&)c$UHW3E^x*dDdFAUdanry$4H#XiKjPggEXZ})FZ>sBwIc7z zcu+5W>Q3B*HJLwHPaI9qDW5oe4!Dl56Pk~A5`61ho!N+k8 zX#Ff-i(wI&sFBzx;+87~dY0nl3#XV~Uq(lUSw^10(#62O+2+@$1FBi&#|)9#4$(kqJp(M~+NL5~Yod?jCferO=2eh%^c;JyGl^@=` z6tuDVxW{4{QY8aS{<=ZJbEJouOKTnT3VJLag?91qpBnwo?jl2n;>5r^j_3~q9+T|P z4`?ZDC6ECF$qGy9Ei;f}k-SRmdzr?W2h_y!eVhRlmdw{hp|}`-=1*alA^76+ggP`1 z8xruoZcUzqNHR2LJqGUU9EJ`>-ww@Z0QBh_M0OVIQe*}%G$TPWz>+XpHY%j2U>AE* zCsid&KW+DMfa-gws!xxLE_^sO3O+vqI&WCzW)Ltv1cz;nDTRZ z0T%zj@0Fg~genu*jyiP<7UPMx$H-|xbKkjXlbBI`?;Qlp>gTP;N2RHcpf`dBYUo=u z#~O+C&d6a~f(rMOh|4b@KQjr>BblhRJv0CsV%)4c&lmE0az=`8^lV?kFqF!;((&p} zvU8ZX=;Y*8iYd$}h1U!htK2o;iM^m0m9n%Dv1yLozj%r@eOR0r?4u zI_n~69`y@s4x0@DV_TVM8d?6MAy)5Q?*<>S8Q&{Oy8fC-$UaQq=8CkW8 z65?Yarla3xj?sHOHj7U~txx3&6M(Fy!;@N)<3wwAw;%mSAuW5Lr(%-rp-4=?-aB1p zg+llUBp`F(Dl5u?G|4&cNL}=8ed{mv3=U>UR+o&)K zGAGYvx)3-A58Mzr=e0ju{rH6!|NgB=$>@oSGYyc*h39YF&sr<)Mwufr2+ zKg1ep9C-q;oWG8aZv-I_2CaogKs_~A-Wx3TJgErmFt?v92)6OP(=#L(qDW1JS7>lW zc@^@=$4cUg!{_YvzV2CvcE|Aj+wY_0y*=0GC!{aTs6!Uw8eqCzJ;M}?j_{H;XVk~< z$VGKVZptf#X#3GnA9!NwJ7tm<`^r@OUCe)>KK0*Y^U=Ils)jF5K0qxK9q#(6DR9FG zqOJ0)$Uyawjb#>xB&A7qsN0Tg1m<;Ft=b<9oL81G{240IcOz>U>}o?Mw$s8o7g+m0 zA^Mlz=SGg^48QiCYtt#U>n^uF@EjL{^Xp4_m%YFS+f9ZkrayUaRT;M zpEERMu5<_#fU4^n*pFK@Es)yNTfY_BV*Dyn3cOCS3Uw=J_{+i&o%2J42(i27=jBTW zA)4plcigcnWLfxu`By)l8>WK92T%rW6Qb;Kb@ZCD?5uMx-jRDxB2~L(-*>3YI&i+F zsQ07(*oLdeUDvmoD?&Ns=Dz#l;=84!Zc%XOH`FKm+1#&w#ibNBh<)}u0hPtF&=I|f z*F`w}36*AwAGsWmMD;-jC%{9o5p~lfhJ}#)AtI4`*X13R(Z|g_MnCBtZy7!T<>=!| z8G;9d6THBRiR&SbJ~0MKl|LFh;=J#8?$`&pWYU%pw+?fMfK&I8-wLbwKa7*`p!V{0J#N$m8MgXN2(@|Jwyx z93BRQF=lz4!$-ScgD&gusbPn= z`MPeBTt~712U??vrO$&+WpeWAmJ+czXD0d#Pqd4d;#)v8x8p9osVVzYOGIucW)LpO zQQvxh?lsYkYj&0!oxF{$kMC9$Qiy%d(<7E;T4-e5AOZ~a1U;Ac!_EG=?IR^t}$~7)?;;h z0W(~y4*FF~`ORH5-`Fxi^4@!A`P8Aty_cYtniE`; z&1*lC{GCWCl4!Z}SP9MMc2>ar&V^29OK0<9MbBh095*mt02Q2<$J2NJ<~FNT%tO9d z9wx$ZUQ|$3;{B0kWcQp#^Qj);Otv=FwF9!f`Pg>{cO|M)enoMXd+yT@^anJ+VBOC~ z{Fsh~#HOZw^BGcEgzawiZiwMIp2@fBIXMT#CeHTHTxHLv++bue9it7Io`hd9)m6ZV zq2nL%#`2}$<(n)*?x!XP+`yUVpv{%zPojFPe;3%mE2tl$ZOaxS_L=j2#GyM)yKkpQXW^Frn5%n1jb&A>X8ur%p}n-H9|qy_~;8vWj=%P#?q)=8^b48jmu*Cru~r+Km}#T{k~PDgwm|HSjV zNGFsOK}dFW=nXe>zv@-*Hg-^uWg&SB(!Si~_XwyCJJ5 zzVnx1p&GtX>+}R;qH0&`zW`sz2_C1ig$+RDVLw{<{I*yv)3Wid4hP!fK|S!Id8lcp|*k(W_n-2~VQnqrjzze8JdcRuKph@N<3OB1Sc=C|2j273+3_y@Z#;6A?}cSJ>Ltsr%(xj)z}`<*N?nZ<%EXpQR@!4>H`4JYe4lDz-K$ zM>mT~C*vZL2R_#TmQ#O@VCuPFBgW}~*zF;4SE)pw>VMF?ox&b%+e)l}+$gwj1p}ME zTh7162z69Nwf=6ZYDy)nMjOtZe|b-IsQ6U+MRhfCtw=vB%DYU-T#h68x9f^Yp5B zM?KG!(%Ja;)h=)H&*yso1D%sl6Jtx!zl;cc3S*9(GH@F`x|vne7)g4<5(9<~SnzEW zRhhIPMIG)TA=Q7GrOa6f zuZ}M=&bY5fu_)Ta$;ZDmeB8ES2o^vIv8KuW3+D)Kcs|cVmBG1 z_H9-~a4jb?KE4Kq8JMyy@9bnRqysLCOm(~xbyI6J788KKqLMh^lz3V{e%N(rU#UK? zr{pj=RUg_we8e0|`{I1sBXG>Z%=C30U@1?w!+X_OjC?U&&6JF+7NoH9CK26`j+F-? zG|(-}M|#VV---2Y^76}+_b0e~Xv|W3^^Fx*S6@BsHG(osGpGqyMlKov@^3Hln;dD| zl1L{*!$ZklFRv~`4n+@kd`*mMbFT;1oE=9hY8Jc*lNIchEKM{_owbUs0@{FxKla4= z^`4A?^CjPO$wxp2L|VS4FHLouWR#97nWM!0{;kj-kXQb53v8wa?i$ z|G6{bz@35HIIn#CTGeDO2XA$;mrcK&Gb*-2+s5%-eLlddTV5oF>UB>wYzr9iE-xJ! zqO8TxsR0?T817& z^{RkV2(~###(V#68s}bx$NIS#!1{pxu6?~AJ(nFyaW(qBC#AeSZj+HxZ$`Q@8tKUS z8oJgPz>;Bs{%&QS?bn|<25?Kir>8I&ZV@``@5@$+PT5s)u2HI8c^>9jd-hf8wuilG zP%)g;+riOc%HF)jWgvhR-BU>oI0P7By+N=*f#){}=rq}u0ckWz-O(iZiD;eX2 z9!Bqyx$~fV)BQ>H?PlE04yj?SO#~sT1g{ypR*CPmzsWiQ_9T(kCWnD1mg7iEm(%4l zYNfw(1k`S%mHnaOMf||%Zqr0OnGyQfhl%8=zZ~vB-p=Jpc={f3(eC`fFL?X{~BsrMHTrm&p{+=0S@ zU5@IB)Il>>C^YNP;pKV*Fw68@*j!S6hB*d$vi{{F9X}T_bDn+2KQh2bgA>Px&r_EB zzJf%D4#ojHoG6^va2?Zq+66_ikM{$-?JDnkp?M{_z-Wy63Nu?^2EF@lYr~x$R%}Lh z^7Y=538djypV<=T-1c2u!IOtn?sLOL#CYqIkx31(@UO&l+V&VGpBk%>S1!yVH09Vx zmVYJKo(ah@xJ`)D-_mdA52tscN4!G;Kd;to!Zy+e$y6ock4`Pdc{iaG5X3#cpk# zhSTo(KW0qe5BY#CkkxVnvBZzGGy)$!+;E^=lV|6D)-2Gh&TE+Ahzuytbjt9Y_lj9M z^zH0kJsSJ=KvTPMe=SlN6oMq8FV)m!z8%aSxU*%#`kVG$TRMsJsxKK#9jkXXeUg!F9VH=3y@TQ$>!wp)S{3I9OFDJm)Z^UkpzH z$ERJp){4nj0M;JXFY{QI>iuxz7hx*|4#B=^P(?^xGb{2Mh>xRcZ?K zNgbi$>Zk^j&ZyENV@-g+P-SIeqas(GqkEFweZkj5LVRyY5@%DnW{jp?*%Nc&v$4&@ z=C+_KaqC7L92zKTl-i^Qs7N2}QZHot0# z_lX*hqsOVob0cMJDT7;=5Bwv~?rrUMSKRH#*Vp&AhxW_&gfCuLZ{8N4|Ack03vqc3 zW*;7#IhTI@;{Pu77+ZzUF8f;>=Xde+hxrn5uMg_+_Lj|&3G(w5_UrbXpM{Dvvklir zbDWC5RYu=_3iO4&+CNzn%5$iFKeMCa)sOn@pj6wOp)}Ahkw)lQ6#j}};++}f0Pt_| zFxld96ys%{u$^v8K5s6R{NUSjG__aMT1fX~v0oGdhXOfP1@|Z2zA$@YP^}%EG;tNA z+vBXaZ;zKv)7iTiUThH?;V?=10h1>ow(}~y`GlI;NKb!#e_%=DR@y~;Y8NazmFn9j z6iQ)uCf6Mfy$ED}QU1N@DL(AgVt%bjf6s+bN&HFNeA3M|Os;%h@~7&(stZb0ysh?> z;JIFl?e%fQ;QJco4#Wgc%!9#kuLZ)T8u=Cd7NJ^Oqwx%cSZcW``M$BQY0S9~d&NuL zFY{i$_-Zn8pmi~GmYcV^s!;Ir5qW3cVMmGz=fw+k(31wt?%aYzQaozAmL31#(7oY5 ztNb%zvq;Fhu^VAkzOlL4;9r=+_tP5qH<(vH!2bs?PR`C zRGG~`9n~F-+FiV8>cL0ZGc>tZhE^#Msa(;yn68HH9aq)F|&&B3Hd>K~pVtf&Liy%oZnfuy0f>INNhe zKVEPePd2^s@Dr@l0*3|$y`?7<<>UaFkQpk+e;jQ&hV`t+N}%;JqVIxwqSec(*U=_!XPN2El z-d^0yU5tW~$FoxS_Zi2f%e9s?E)28yxseDk243OBKJ;RLz7hA)UXC%4=>=J3S3gZW z`7@MGu>Zx2)o8nG`Q45H)45GX-m}C*M=R#H@mEq0)5XG|l#9#IR@QKNrhgWtqTiu& zW2mWF!|m;oZLtZbGBc4E?~`3xa2ShZRat{9+|qnbQu2yt;Nx_a1KxR%(Bxc?iFf(W z{yY0CB<9zqDzyhs>bf1H&y8-AzlNOg3C^1Pj0{w#=k1d!G=HryG__r!p;M z!xQVi-^)-?#42PeE7ZChv>3{`j5uPxe37~}oR-ax#npz#OTm@=4OoK)F5$!9$R2Jc z8`KlP1Nrwg)53!-HInZ(?kSe z)qTBd%j1^zU;F5NsFMCHPwPx+c)*ZB(Z9#iPqNXsF~@D!d{f0l`l?7`q!By&a8UcL zA)IP5)@LSz%dWx4$@8S`%f-<0fqMD9U60pAZ<47knw<{Ew~9X|mYjf+Ti0{49n13; zGK@bt7?%ea5QMG^ZSM^BM{t=Lnn0F~<=l!@eUb7;{Nf$t=YT-ajj_cf)%+}(oYJ5^ z)hy*eOd!vky~Jo%{$xkN>M>AYib)wYT=u-AEHcuc5lNpBeL5siR=uxDU+lE2C0Ari zP&;yQb5pERdzKfEbf~2VEDsPN&#V3Ft*l!Q5o|bGt<0_jkCLMHuZyFVb}gdwV%>3CptcN2qtXE!Qy!T;%Vc zlJZX9hZj$m4#e%amElro^Tct4;CajMGBs+HYiLc|>n>(8J3 zxf(Dx?zGS9hEt^Cl0EV^7$BdR&T3Sm+kO))NN;{CuqNi6ZUquJ8A2JyTH+0&d#NF! z*6Rq*Bt~gQ#u4X31#KwDBdTs4q~4#<+;r=h_cXyUvgsx=qDyRed;l$PZR(3`_+dUw zUJ~Imz24-+?cM49<@O}{1na1B9wI33svuu%#YGUuFvj<8H$2cxOFMoo{LW=p5zX0A zsWzf}lKobAK0$gcdUO0Zaw;KW%3Ljx)xYIY%As;=f1ls!7wVFu(yd#dv3&wOc^6*6 zaRpM5Asd_Np%t!I+(tBmlGi|uhe~&fevPJ=1L0XLE*AT65c%CMvz*at@?3^f%}AH| z2wQ%{xd8j$>+yfD8zjIUYOy>tJzS}W)I{U+x&Pvmvo#d#kAHoCy?ec4m=Z4(MIv(H zT%TTODC5Xwv)*v!=fArFXY~Er^h4R0T*6LJt7AeluRC`6??xz)w$Ak?mk^^V4JMIZ z6+PzgWn4xa!F`60K2?I|Lv~UGN;ix&pMQ5%-Z{5Dc9N}S?C!5zr+mwmFA?{We!Meb zl_BlG{%u*|iT{{m>XN1qYeza>Y12bS$E82Lr=S+;#VFa$Jtf0VcA#}ne|dX?HT+QE zt73afpZ6-anXZe%VXPS9y%1;_|zaosN9Jep*ij&N)v9`a6=v zEW^d%dVlgPyzp*)H_s$e_6s-Sokx{-O+$UW>1%Ob*^4S|#+o zJYJFKg~(3*|AugeKd#9y_F5XEpV&Pqqb57WfAX2 z5dA-^y}B1Ox&S$DDYPqn_4a*%=Wn{EtRv|GtKykb&D{2Q2G&T!VY={?y%9F2l=$vB zW+PUc2j#f(Z{pW=$Hwszl2{Dm;9IZ6X@hZ{u=sFua<>ac-Sj*5y)*&q@(7sWq_VP+ zPawVNy$Q@~Gkcib?l%6wA~g%KRu}h7t}yG#exQ%PI`Vs3ncEKr5DWbD|mwiwuDQF{<+KJM3X&oZu= z|IMhtQ2IETquauLvPCu7Bp*!h*DtGo>Kc?s=}QL0HaU`7!RAMTAS7%lJgmKsx0Mx$+b-*j;TE~cPEw> zk258;U*O)#7iWS;x|i^?udkmNA1kaBuZ#>KtdM&z)cgGB(fQ@2hmJf3g~v80g4*8A z%A3Tm1j|@OLcx@}sBwiVD!IHv0U~pEbHmf43K10lzk8ps4~!%4>Fb;K{RQQ_7tZi_ zcmfh`Ixjlp>0>*?qy>Y`)b=@ z6ruHGT}hQ__dxn3h67GU^3}Jh-N97hy5YP{-!rbi^7pv*Y5+WFW2a**R>LWqg{GxV6|T=VX%1$M ze$k~+kFB@Bkz;1#)ki*zbaVs~e)1MyFh~m=`DS}C=5-;xqUrZ<*!yc$KPL2}b#A2A z+1@feG8)yHaH7+z&+?^I70+UuSxywI-4qn6;_A?>3$b2@_DA@0lBf^z?-cdb^JnSA zY<kOs0<8vTFly=PRDS=TUZ85D7^ii04%Bp{(gr6%+edQlM> zK#KH^NKHZr0tp>N6r`6B0)!&c6N;2j5=h>Rj`z&{tY^J{zi+MYJ3mOWIOkmF+Gn5L z_dYO1Wq?lT!6S548FE-MxcJtlVco|C=ob|fzLs%A{Onl+Y|}_d{@6~Ra!hC~D#MpQ z_udBu%y&Ef#rLmV@Z=T9HYF!kn?;y7Tv}pMe36e@J#P@8**G>?%8b-XYp;Od>q&!o z)v5=u%8v%wn8t)KS(D{~Mp4{`pHj-x;>ZJ)Y=19Q{>>jaX|O&_OCl*;wKY2I#B zqn@fe=)`M*q#!v?3UCv~=|RnLEBkcgO|v45)v$lfAGoPicp$gWFwqOWF>~g>a5P?9 z)s4S-v*-bf>F;}g5g}73`1Kxu!KeHfbZ8?dB;)+peatdNQ14`e!Sxl{{~CKpE0Qx& z`a5CcD?nOE$z`(Y&0n(cf3?TI>oy${%~FPZ^W#dE|J z{BtR7$C5;VAkA1FIq^gOV6~o;D|w*pfJDLHCX3%}bN%_Pp+Y#Pz@X#k>5L_)FaSHPqJP=gR(P-)GSuUo#b@|85mAkN+nW zo;hDn`){xxI&_72Qt&@krN3wRBKP9|w{GoBRNb#G7ZACbrz$iTD!zvwQ42 z3DstYH~-WNs=C(q2YG86HCFZXjlFKpTa734Qvccl&r?5v=zeNX-XC=IxEhLhH0sNQ zSbcoY%u)Q4mymz;jn}D35B%%*-E&U;Ht&k`{WQcYfB(y-@~d5`zV>tLQq?02C@rFT zbEzV4c#tI~(=2CC8U0!7G8zad&VSl7^J@U}b5?(^A$Y$x^9QcRUne>CXDyLHJ+jF> z=oxY|?#op$w5`a!QmmHwenTsfngGFq+8n=1dGw7gdF$S7*966W*&-8}LsA`W~I|wmQWw@=aKiV}_~ms7GwO4kExsjvviV zCtGtIIQaqyldL7cM#P5bDo_3+jqIrYme7Qa?jaxf2=xPKjSYYN~hrO2n zCwcnfF$IBWRl(0rUEPf)sS8I)|i;{DWAGAa7l5cAdYgq8-vqnId z(7mekl0C*U4*qD<{Wd*dncRm*`CP?ev+$Fj!BDNZcKmeHiJ{Fx0~s~3L9D5e?;a+= zD6IZ>y?@T$v*lk$?<3+~z;;i#V$!uNG4}X1y=;8wxErX^z2Z2gOZRT=^GUzj?9Te$ zLp+S!lx8B3lHqHbONdxPJsDmRpwuAWuP)0OW#)HpE|0U1cs!#HOZ9a16qmV*In~F- z7=9@TA@$1`;*VOu2|_Jn91DI?>4J?B3}j*Om>=Y8C})HWlUB-i!yaCDC6HRn!_C@=e*wNunI)L-a3iw zmC6|e85xAsjxj^)!E%*7_HZx{Lk&2e*8tb2DhwePXH{Wu3kicWtm!i0EJ#0$5{Uji(yM z0d#vfvVFBARm>e3c3MWT=L0I5vvrGHG>elxG3n=)L2l-W727uq4yh7K!1dpYA^ByD zO;1fte)+lwDZy#PAZi6OSw(j1Bei|cax;cfn05nXDVJ}?57qxC{M?Ox^3D$e97X1C zKBhBR70MDi6Lv??|M5uKGc*^4stZ2jlzmNkTvt}qFLP|V|CJi%!_d-c!gx%*p35%K zkj=!}`UGXCo3lv2m5l;xjDWAGW4ylwnK%qGjsPcecCV0+-sKnTLKe!%B9k`I ze>U&K=fBBws?LadOb9$X1G`v45JU~Nd`UVyr;gbES|6~+NpSRh$Sz^4ef`^4F%vsy zn@2VJnPX)Ixgwbx6^gt?XF0=P9t0(c1@N9PijOJky}|evp6uK^mmt1n>R5txa3`A* zl?m=%l8;6Hwd^0Bu3+TF;fT)NjN3^42TNJP=#s^o z0-0HN!m)Oe*szCO$>MhZo-JAZr%+Uu^!;)0R{sH4<#wt0BHdvujGedejkgjrRo_-Fi9j+^ zesW#lM1EXqXu)vE_GcfOgAa}uEg^;4+GE`XM(375KyrWc4H-Sy<$SyA7Q&FS=>uvl z(S?+{ictE=ZEm-C4EhK{)aE5)9OrI_d2|x=;D707jabOYr_x~|S^lBRxbCDRa!tR} zzn199BmD!3KO|q`K>ub^B&Vaa{UCEJFUU}7g6TBdL(ZH9>aP6Gi&gM9^j$C#$aScx z(LR=TTO8(UY?o^289Uklj$q<|M_7jHf*V(Qk|(dK9Y8i3`Ol^tvW*LFv;8Txc&bO7 zrxtZQXj~ukWs#1)J@|NJjXK|Qw>A@d5ryZ+8x#6?#2E`kq__oA2X3HB0ogNCKWc4{ zffVP>X^CH+xHrdU#)X3Aul9%Kf7ByxycTrxH#)1Vi<_VQmd8R;9j!{JpJ^4KE>F%* z)g)e*7A%%xtGspz`k0oJF<)29NkT{tp8-~WD}wv2&T)#?K=wPuGv+R`%3U}{EZ`o8BR@lLPR-_A!N|$h469N=KE0c-gzG6G>cPKc#YCCAU zzg}dwKvch96l>NexTG7%)2|;ELN%65FOo4=lTdMlM%Q;v(Q-m~`T?B!S_(e zJTDoH6K1w$aaW7ivQaA<%U><)OfC(r&me374{L}jwwdHeNQ*6WzwSsm9x$`h5pd?~zS2Zz(ac7%d%tEzNmmYR)8>@xW=Xm?g;J<-gUJ+27>7SpQna7h%m- z%2dZA+?Rrpli|7~Wbe|;1aYLMH()_N6!^%t!93ypNIqjRlVg=xqu==y!^o}awh>v{ zvY0(Br-TDcYd5u0e=-F(E9ThhQ9Iu`wD`G=lqH<~F*L}Ob^9_hSyNhxKK#0qh_Ne% z{Ok1o+V>9v(`b+{cEHMa67eqw;{FU&aNqmLu;n*xo#*FV3x z5B&f7;s2YJVQkQ(YRH1#*}rzH=FG-iSMmPd=`Tq4tN#A%2@w&+EVI65s`7N7i-(xj zV*@QiXUm4CPv5b#!%U4FdPO88Oc(k#bGd#I=9-kh&v(}+7QR4#cEJ0msv>}za+LS zi20zIMnkmXi!WFUOXt#HY{%}dpM_FO)0soh#y`|y=eiaIeSLjtrHsAP7t19p4|1;= z6LuQ!g0dlQR=)2FEL-F#n zUR@6Lz5Zipn5(Pnw$sG>{PWx9NvDK<5p(yIU$WDm?Aj8`D=6baZPDD7(Dxo5QIV?5 zi^n(*J!|-qac{J>@-543A9@qZ;8pN^~2Y`{cTlzfRYN>M!F!&4RC4WJ1$+dIAbvsph-NtTo1b zZeQK1IYEuA=xD`?B47J8>I?1XS-g9$Yhk`9K_GZ;dOB~U=8k&Dp=VABu!G97uwhDn zodk%W`D;jg_4-dk!|W|d^b3)1R)ABdPDMouG8b6mV@|k74sf*MK#{Ni>i^|$bI{#$ zovD(!QS6&)4R^3D)>9Wo6~U%>{OT zgTDp}(O?5U!ByaYCd~OYq2crWRYi1=VyJ4181r%emlx~nS(hX4?`>`~4K?xJR^HbC z%r^Py=lA&5jXCLKhYo3dqMZMGNzWSM{ues?|BM;#Z&DG{RTw1Hxa)nCUAm_nOoa@J z;O@R6sqK}mmObSXGIiPy#KAtu9M&1Ai$hq@K-f+4>vLi>YjEEb{LbcOCe-H)3!$>K zgAO*KWhT4$kjD&(+NN14`Hrmpvtcu7LTL|A&(_J!a#_`*L`Jxnr=|`E~10+lo zyO;zyGAK^k=w{5Wxr$CG1FDP_<}4VgKAH-AOt9DRXeWt5n&VV`dqbGQ0uRe2?|nk~ zOndCuzZYh|>V@8KLin$3lH?bUsSIJCBdpDI!J_dOIc)8K|4774mugTo%Lx(uZq>mK`W-4lc_4YwFY9X2jxq*f~&=li)o10(48#0i6T`PdX@|j>S zb={ZSu9KzWSc}D$#Hja@KZgH!#sRz|+RrQa4oHGR>I18;XR}ghO2Ec;Q4XcM)`s;H(SBV=f^KX|r0^ zAvA;?jeoGR+F(8x)ByO1qzd6TF@{W)}R{0bdVtT7q z2ZsCd;-&O7h|zvSZ`U7l?Opdr%WfEtkM2rA3yv3NeQ{*Qq!HgaWi9l_Z{(R&)d7TZ zIV)OLUTr6wDkuH~9d|6waLowPwE2e*KG52RDxVx&5O>VUw$Grdmwreh{OM<2w|BlP z<4>CZV|DY7v!NDP-UwY8W6?SzpmU05y2z{%n6TNkHtZVU@!@npiH23Oc=|)Cv%pr%CuaBT!W?or5c4!=xVdqK%Jl<@C(>jiqI=B<^+IpTLrw! zW)-S$1t?`AIi1hVw~AiigO+v*@J^dX=dbyWVKK#|VkM?B>Ar>}5y*VUjwLZG4@aZW z0;0kttnj406dCtYjTFxmqbxTL)!~J*N22 zO0>%f9e*b7D)JR*Z0CmM&>s%|w|B;U)b{q(KuU=vrhz4G zj2aK?Q`7Mtu9DCX0Xoy(89&X@K+_$)|!HaW2)2wR#IUiko>w%Gbw z=>jN>CzpeyKaLH134+#5ahr;=P5GvZhxIv3Pi~E#01ybAu2uF{DsTIFl`spqm{8)OWT(`rtcK2B9~m0N=i8$OyaVY zk9s>47eTfgEr|SPmObEk8NO&>bafq z^992bJ?~wxQln&ZTCoo|#JGDdO}GU!hR}t z=1ZN15VrtLY`#}YF;GyutkwJ89uh&RY{b_Eyti%7^vdp_tw~H}^7pf)pSoCo41vpM zBsLejblK!DleHBdsGe0q0{wAJ|5eSAk0Jh+6S-P5+avb_N;VS%_E3E?(tZ)KZ8r|| zXH83ADV_@gH@-M2v~Z3cpuB!CeTsKdPvnPx>IZB1F!xJ>IqZgq4yzxIb(_HpA&yr3LZ=ya)NjWY#uu&LYwV!Jv0z$nilYTxE6yAwIFq6$N zbLBeU<(f&}OGRz;hwGmgzvDBcTube{X(nA^jG;lh`ioZBIz*C0me{Oc5bX#`&5_Gz zvTm=XtZq(`ttFOj&?OZ7)@{DD{}qLNu>uOGvqS=G1AucjsGH4kofj2L*e$N}^!1fi zP$X59K#`nm^1MGjpjwb znE&jJo6w!y3>o_u_L5bxl1^DEkccCIN@EZ9@;JMYJpi(F7lU1o#WLdWN3DneJ}phy7G@$#mYkZ+>Xl5pV)l#JzzA~HK`U}=n`D?hIF|D9krucSdSD8hkm5--nMaEsyjPb!j7`s%S*0nk zV2ACv^GjGL0Q{&Lv4l2To!y5GWh&x#CxP#5AJT%iYQ45;qNuhND?k^)h<{=~pFaMr z#3Xun>3(3<-dcEuv@c4ZI`x*jlig$AD9hqJu&y@cf~n--uo&Y=2<*%Lomn5di{1uo zz;Z?>cVTdsJp|YZ9(W_VE8n0QBdR!A|Hq0&(G*>OGh3(vse2vcVmz=u75;7;vbWs) zS=ejoqS&GzTk!sf5l!XC`CoeOoIV6B5LW#cY|yP9F;}ijWjr9sM1eXNhNVhN%zpme>#KF}#e3?Oa%P!cG?5 zO6GwL2ahgGcYQLjHH9OMq9CZdDO9&w?Zra#ub_KQxVXA{Mo$)vveEmSdlx=yICgcb zVQ_Z8pWX$QuS_S&EfH9!205C`jQ&6zRx6V=2}_pwc5D_5uYgM)Ci*i&dkUl{741WJ zw@$dcc2{XGomn{%tZEmw0{*S|8e*bh^q9S(L4V7!+@%Q2d93VZtQ0kH&~0pWa7}#< zStRv%ZQruv^A%oe5& zCCoA1gfGR7*Qsa1${ni32pQ5vZx-MBEI;Hss>WIIh}$IAVq7u2ws+gAJig0Ek(Y3a z@GL~z!Ds2~DHGzXmshVu*5(F*1z=9tl-VW7#F^`iZ|_mt?L_RWJr8TYfg4EJN0>@H zoEgzmcrf|dPLRYjA=PwhKz4?zW$gE)aM;F`l90?XtFLR5zi^-VNhteinae&6FwHc} zH8u3W4e|Bx-Zl+&i1+U{q(tC%2DmRc+*7%;CLUaSLyD9M+S3nMUpgKsEtb1a^9tS~ zy9QceHh)*KB-9qQve3UD71wo>TlnZ((oPl!4$HKLEEPXQ>fWD(jyb&rB}w<_M&q&Y zqmcDY>u9Wqw!;&YEax$YUYHd{D>-~!wWY)Dyp<5JyX>4wI3{dgl98F+ue z==Y-0qiv8Fh(O{uzlX9RK6;eJ@AY#$8Y>y7Jn*s1S0+(5-@1yK{6n4#%z6E zeH5f%yzL?pvrv7Q8lXW+yvaZ{%9NwL(1oEvc>i5-Sm{z$k3!hGVTk`8z$iI`E@EEs zqLX$p(O~p~$g+{)F{=~GC@C$U(n9%^a~;&2Zny_B)XG47vGYsG{K)nbT|6-|?7)e028)vnyy>&tIF>QSs@Od#2LsZV?dC1A z0S;pu7!YdjV6x^Pvor+|D5X9sf3Us(2f4J)(Q0DHk7L3boe*@|{|>!VZZ#{Gp9Mc( zs7B7@y!tS-CjFII-2DL(baBu;ATB0KV^c3?2 zQlB(#LIQzU#uo^RI(sTOZ6IF3A2yT;Rx5!H_X)gQN_C)-0#lpg^m11gibg|vt8RZA z+hMBm>cN>~nqzW9*M|a=R;mH$Lzv|OoosGXfRRNm+f(Oe`M4l!wqas!in|BmW=fhuE#k(jh68%vG$*_n6uis+BlLQgGk1zXi0jLOY6tR z%ie;3?2pO{SlIRXdK=3hW$Uc?(d70}inD#NJ33LlMD38u62kfc%OAplJ3l9Qp7s-(*!wvz>4mSRonz!@ECyvV4 zkKg@a4ib6=cG=)aG8i3$ZhXBP!+X%FvH#ow6opu2Yo*N9Oq1|MZ$whCjczj221-Py zOY6eO3_boq(cIv&HxSC)_aK*%nSFtN3yiCaE9rIeYQN$0`N9i6bX0mei@?Ga^efWl z^huZ#Xq1ns82kHmhWGWFj~O(~+((7l89;3DgL*7gv84CftCKGmn(O>?lR z!X*royXvRis>WL&r{L~+@`df~?)fD~k2_vF@tpHUvdf3{H4vzarxf^8#?pWskJ=cI~wnpPO6tv%cQUw>B~b z?CKPfN^*X`?F#{7ve`Oz^aMwCC=LOIVX(5=*To9e7F(C|jE=7L0z#LGcZRWLLaXjP zi4Pfv%umFzjAGwEy-%e3SHzg7@kt(|>>Bbn?-hWCswj9nm2D5~+6*hDlQ;D#f3Xj7 zMO?;jkz2tN`KV*Bz5Q<-XQqDY4;DYFRnI!d=X2KblJVV@u3eRnoX4Cclcno1PkSv7 zaw3US_7}eCc7TB{Ie`yQPBeJ=rZl$3FhK&Hhwb3%b<l)h#~G zS+5@kF;-2NAHag?Z^Xi3IO9r<=z4$ z?4lBo7`I}T;siEnz^)iIKQMrY3ie6j{j?>0%R*Wfj?20sSi*bWKk2bwrcwj1U7X=@ zrZxFnt!QWZJQydIOj!&!VeRK*`zK{+Gez&@RS~Iywp&vnrB~K91CYgCaz)C5E@b88 znm3%AOEQLy7C^%%)w44V1fQn@Wi6;AlG^%fMTecYoi8^R`jGZ0&}h@K-%O2|t|xQR zUzqlxFtO`J$KdmxCs8t(Lami~Xj*c5s%3Wc8}fdAjx|SGC9)w`J7X{*-j#~eTb-}$ zlqq~<;CV`MjjCWYF69DldL%0CK@9n{uPc~Tm!JJYTT!iCspza)NNIJ%nc**Q_(^29 zHuA!h3wiwF8|NU2h#*(avsvERZc-*zSxC$jr;?3cTV}ztVu>V-mYn`6vnz&cfV!Af z$fJ+@_Y>dFT*b*yV+fR9qMOt5%k_+XoEQ^Z??p)Bo@okYdJyGe!}Zc*Jqfir@b!*9 zJtoa`>gc_%O*Kw47D>GAZeGT`$`EH6vJGBf^R_4O#4PT;vxY&LA2@Oh86HUX=^(Ee zSU#wEy(oa0T~+<^I%s{}g!HE7EY>DJQ2s1KR!nMq#dOIB26@Ug`b0@$`&ejU3szNa zPj_&;agVx58rZy!a(8`eAuQ`MCFM2!Rrh=8fYFZWj`4V2az_8!snjM#FirfRfl}bV z=AhJ^;bXFM`gr~X5UJy}SO0lwB!x4enQ%Se19mF#%)U1AT*11a_-YNd+s`aGXBlB# zhGvj(0VE7$Y+Bj25xUrWLL!LI)RFeqRfGq1^t5V4wu1o@TtTmSU5HYn_pF&^dQYBA zWtN!f%6zZi4@XHG^Cx0qsuXwMv)JrIG<}EfZDm@)DucCk%Dpe4+x@dM<7hMavuO>g z>r>qRzaj7k3Lb`b&g;3+G9Dj)!`0nc=+%IX^yev-hc=u4a=IRJUrIAj@p@y`0$Stx zKq)C8@;9^w9m>%-!Ah` zWoCqYzzA-Y=x5%Rm7JjL1|#g%!xpg2oH;sJcs40N`-XOX@wq{Vt~iAZS2}cfZuNCo zX1GoVVe`+F;H@attkjFQ^*pt&PO%PVN+;NROAORR^EIUH7|QYugvIEj%Xb)!Nx8f| zu6yQT{gly@3`UD67kkjB-|neg9NG4mNEW-Jpcz``MfZM!KiPRFoo7Tsi(M~R%=W!$ z8r4&nS#V|l9oC8ZAyp=z*GIECKi0A5Q=AN>@jzHkcFUd6=Bba!qBmhjws#tK@N4;B zKizt-`E??o6xJ4MzhrOW`^R_3Mip5KUA6qHRgCpkF63cIvM4c@-wE7^GU_sM{Ub>( zlm@@F>`|oE$nLlK`PDG*H+@(9vV5-Tl#y4}b(Cr@sLW^zrLAl~EVb=ug8T=L70fi{SZtyEGY9XJ zb`p!|8=U;~ySv^o%x#P)S}vfQI&&=WdJDFRb!+^q@DfjAag|N45Q(C(O>xkj$XJhUKNp>ka1D1}??YhFxIuuo6aX*q9JezL!;->~vOSqonW zJA+$nd53bNu^q4@=6x*Ulv!MMLX)v9FW;Oi;X1FYlz3)75;HO9_Xy|<60rOXQ-eVMi;b9CD7#clbb|E3ImTLA z7hO0{M81ZHBT@wEZwTr#QADNz?oABIxsK0y2C*BVh#7@}x))u1>Y+ltzh%8`wYYEl zjz87vD%$pFj^b~wCO1o(5PoS70*t#|L*B=th()bMSo)r5sE!j*cP$AWg668zUAV+s zchBNSSP(~{Qi(Y)n_SFj8Cdh6;ApIA#&Gangiji{L?LS~_>8Fw;I$=Raj-gFW6#&UYG!$n|_QQ8kG^j|Iu!PA-X=xgMzC;Zy-khk;)Hc)Q6>Fvs$a&H? z6Mt{In=d_(`dYwoZNE?Y4(q!rThl>*rXvN=k(4_2@!07K9{pIwz?6Sd&1#lCpWHH! zB7R2|?XPg1OIAMMF6q*_PYJ5lhx*)yC4Z+#SCbIIfkG<#`-YS?STW+FuijO@;e^j+ zR~Mclc0NVdtvv{>oxib38)pXD`wpLt%p3WQm+q7!R~M9xk}DmW|Ag+soOQ0fL|Wfn z5t*sD)*euYu=c3D!s|g!aZ2o}Q$|)9#YJR(kq7!oH#h8)h{JoOAOXhk*V9`4{;3Z` zqbJ?#xdczcH~=3S4Un*89ey3`b_vc1#C(I5ic0Zj$EnWiqXPoym6(4)eh371mQiH=yFt|0UVcWTJfar z>cL~5SF!ZGui_H?CLHKu&D`L-upq1a^LxMsQz2MA<2Z4^@dnQ@V$Z3^48}CVeE=>g zxf$Czn8L`OJz7+q@+u7!!P)___M)Z79hIG!9=~dOP}{<31~VD$G|%R&u60Gt?90XA zSj_JzB~G{5Wo-IBy#`7yYwj6p8x|Ow4I0URMZ(Czv}H5k*uCMzm*ve{UCF!AHPU2^ zdqA5KdK3k_(0s74Rd+1I>-p=lM5nv77nLX1hzJc%l)QJuImNJMIhy?bnPG4%pSzymMcg1c&?^BQm02t zJSUP2cj)Z;z^ShqN@vEvs){Dn- zcGTbt)Js z1JybJ(xDi-_$X?H7jZZ&$8@vPS}_y8PDCGN)RuPTCxDuvv7E&BJ6iGP zWnrLQ3QxE|aHlA<$On>mi0EOb*7Rx-BR}c>I&t%^!JQ&tVv`=<+ve_%^2^49e{uls z5>xSRkHHkbWpfoLGMFL6{bgtT9V|{DEk&&m8v^VlFOHMz# z6e!W2S-+-7+I{E6Q0PT+@IkLIK6T{u2|Ev)f&B8GF(Y6;$dcxx>~sZIhR{%P?>DWP$Tp6vg zoaB3+XFaX2ybciyA{-~Sk`JR=R=8PqDrf+)q!_5r)KSvlCi_`FYSRN| z@C`VaV5X;?Ry_Nb?Fre%LEru*>Fe|->3bT%(u!=c5JpP$ov{XOxF_CXh)O@Pwdi$J zc6Y@4zT^LXT`Ng?yf3;yV#1`@o&>)m=93Z$Zx_;Bwv4-tKuHIgjl zw`V>*`#v|O_f{5~LMJ=)#;qSE1Jhs4i`((!Lgv=+?1 zD4JhgFpyE$1#8rnwxOP-vam}Os9PViJT7c4B!5uQ*TkYP?H=H>@`s-JK6rywWrC&T zEhgtadyK%%+XTSP(*s*px;g7*efM=;l(K`=>HN=bn^keL5WGhv zQ|bQ7#SUl@SPcAwQP({VDtSC;R{xt1)l^M4Go-~Ll{A0CxjAAq-#gnup+HjqLZ0#O@a}4oSOmpLrFW4T z1lfnfY2qwRUz2dDZSPwH^^$W~L~?d90uC@ioiJ~8hYKf!PdJ>%9z4j6|Ge{Ybf&OV zFBi}pC*(Ldgx+c)h7FOY^-1oU*YTx5rd{o#(bYJyCbf=&mtx*q-{A%5#~a)5$B3#M zYN^tu0GN_8`bnK+VKqe z5C}~U@tYdsvj7_it+ehgCMs4fu?9=+tMv3l#=GcKXn^vj;I-2S@0a5BA1H->z~(S( z5xjR#P(ARrpKo_#=mu|(^0?5~YzL)mczuOfmzr&gAfI@_aL8ICTr$KOm5p7vJ8alg|kd&09jrtS3{Pb_Q-L$je{du5xLX7?kG^O zwL_erT~N1V#v?I=Ki{%?)GgP;PfK~AXF0p;d)IZ?WL-dM90(~^{4p{hJHrODc7`2CV}7)tZ3Yz?u?NJ$n_z$M5Y958XDr{noU zuw8NZ3xaqOD^U7Y5Ur=DGT ze}UclEPf@wZ-~)SgaFmO)!9|mU$}N1w*OV%V#*9Uy(Oz?%U8Qx5imJ_*!0dG&OlZF zlD^NY1lHv#x0GL&tV5O|f90%6D8qjkx2~8V04V!rHUDof59r$D@1}!iJ}VXZ41QgT zRosM@v=_GyeN)sVKl*->!iQ-aD1QhFeSOVmWoX)K`*S)rbozI_GjeBj8W&`XLQUFr zOWI$^RxAjC974Yy$=JcYbl@r}2d?dD^fgjZmJ58n?mU)Y>7bnBsyiC^*Ia9!E1T=T6`1 z)3{>WhKpO{5dnD+;dZcZd-iaS?52$G>XC!SIjwI^-e10L+g)**Nw~3;mat79vp8si zsjw-MdLXQw>*yh$gAxB{_9Nu2r0Q%XH)1cZ=3CXPg6hPS-ob{^7Lfm~xm+uz)ytf| zQ-X6paBtpwzA{CA{#;D~8clA}o5|{{663$FP#x#>5f#Ht9$f$%&Ms*+N_l?=@@q?& zj;}jN)cdTKPyI?1c-A14+V?Z(peBh$uG#FKV3OEDap=4dt7eC!TxhOsAv8ti9sLEV#WbV7TzH?$rVO*7H0`d7uK){olVf6#dcWg_!`pM1e3Dd z|L9UBq3HZUXaTr-hgsO52v}rYw;%pzbQDPt;@J$!G^}7+8v>e(Df2Z`gC_;RPYOFr zUJ0XRMN=dRwChtn?0G*D)&D|8cbC7@Aha^g?yFE9AN9|iuSK2S>N3UM^5Iv6igZ-# z2Aj;qU(*1NC2?*VCz9B8#lzQn#=9#bha-fQ+lIoCCHg8R4j(D_E}`R0S~i-ieCIxHm|5 zwzre44>&AB-bV{PiIxokCP4}c|6~csxP5|MIHOkjp0yrOd>ycB7Fel}==L}!Dsq7l z32TNv$mj^n_r7ZNqO90$#hTaW)!gY+GmMjLx^tyZ4;M2z;_vnqaqnjuL41bUeOO?9 zoU8bgF(V>{%%N7yGU@uLS;zkN#%RANmNtw=HL>MDK)d zPz(+#TRH2*^Qb6d$yYsfMb*V;gZn6CUC;ksN7dQ;X5Nzn4zkYMTQ+C0XXX-)j%4_|$HvtmBzTMXa8A zvT!Ai>mD=_ZZdu8m|zZzQq}Fu2%r(Vpu|I6y#YRGT4%?bEKiwRkC0pT7EDB&%*3Xv zxc!R2Kjbd_GbQ8DjTxqs^z6Zw9Y)L{A^wyQrEe#4L$6~0+ky{qA^k;pWvpFKY_VJ}@uS$-apA@vLzQ+z@+FK-Y}T&oOafeJDUDOrnH5%FMbnqs|1`c z@HQh)=z&rSy;Llhh4bb&FDvSTPi-v8%i)6^Jx&+9>C-YMmQ(#}pAXdx{hhN`@Xiij z(t{((lelBJ`|lArq}@2!^r17=_bIF6TM3m;TQgZG`%C8Xdvd`>Yfa-1@PlXBIDn%T zd=-uQp%`hM+p|^%6O${&DTg7t92Qk&e7x%^V<$59oY_8NX6ti}dziU{U8*<(a=vb> z4qmajaN1x3F8hXq3 z)F{&3gjClSu>58WezZ=58`(|_W>!KRHd(mQq|jYIX%bNECJNM_0eolrHD5L3jUE<% ze5#k8b5KRAW7@AAI<`wjO@mjpc=yFG_v;^hHHn7iFvBltw-u}X-r2k9`A^ElyJb}B zZ~!rKeNMK`G+plhz&2I=Uo~iKP5vEC%{!Skjd?OExDl6S)DQeIxpW|=}B70P=5pyU6r_f~OnEkVC%3`jzN1a|@i zx8N=b?(P=cA-GF|LvVL@8Qdj!a2wo$JA(~AaE8d<**V`i_rBei+YhXnA8WeTD(UX3 zuKHJ&6IRU0iEP`Al3An29v2_uURYiJc~kePRUxvHyLm}0UO@rrL`k$xvJ}C531kS2 zb|(J;Mw`UKA=*L0UDG=c#Jazx(WBD?l&aZe-_dWvE}WZlk2DOb5ea`J1^)r9ZaSlg%!m<3!6>RDv*_K0ifk3xPvE*G(4HDU!=!| zIEiIV%@T;LZ)~>6Eaje&?fhDUwTuR80Ip3XizR(zzP9rFyY0s%a#A@_u%bpaQWN2A zyc8v(wUsq^37|C1id6~~Vpoq$`!l$T%&OVu%TM^l%Ura`s3_&q8U90TiL^Z{^(Dd8 zy@2{1BZq5-aC41GSgK4zdBw`K=Xv%Y&s#e6D$2AKW6r@M9Os$lo0GdWwp1l;O2W@@t7LIyU&99*}~7?cv$|(srWW`j6t1ABq+Be=NE~hOH^erM20<5%j4rUmr&OycG@UGrae}AbeLG$A8*h4fK{V2s{Bl$sC&LD1qF0PG)zMebz!m1 z&=&`qmn`nQ0CC`6UDx8iAkjvwafht$y67GAa>O!;P@LK4WXssJW9_RS25O0rMJIFO zPSSzCOh)nt;>G$~k;Lh>bD-ZJz0tXVQexr^&vq;O!Dm~}Hp$NydqaDJXfxL8R_~1E z8Zy>`%Z2p(r6+1SQ8+K1F^!Q(dbUUU=$KY2sjB=fHutBMwWS>vXK%~px5Y&D6e>+s zp|Rtnv^)OoZ;)G~oB+zJVE5=q5QkwFxf7)acig)$g^LK``6eXDF zk*Urbnvj=GqHtkpieDJ}jiX-LDn;}lQ372;B8ImLv~rl^ z3_4y*x-_ddR_X~aS>)+XuciF)!XEIYDnns$uOX!= zoc9@SKig}N&QExs2ej~X)h5=J+|krs#%6~v{@q|acyNsRGXe2|1|rn!ZX$^!>~7c` zI}~aI{M`*Sc~JN#e#wLH40SCKnnLqM-?YU#4RKtOfA3kt`i1^g2W(2*J@A`i-|^vA zW3W%i`X|5kffv{B6#2MFWiJk-t=y|cXv|u5B{Rh9&)b@Q-^O0tfrA2Wo3k=L961Ni zT)f&*S?F)!A|z7L_GnPq+@tw-{BP>NR?zVA`DVo$Q<{6rnuHtIsu^X-eByLD%~&zI z`H%E8XT)DXXErJlK=!T#j)QrfeT_q3*i-CmEVzO9fAs8q?0kKZ!ukWk?RC<>Mh`S% ziVc-YYu=;PY!mU%DB@qRQU7-F;5S~H7p_ApDCgmW*J!0-zyH1F{*!XA;ZmeU%9b|! zmC?{B z9!h1`L(+D3a!SmBqMkGs?`GI*R+WZL+W!Mfv!?l*0IJ&Zp2us}z4#Jm;f;-r|F80Q z(b4RsBJ!kr2L~nbQ(*?>pusiVllCJG_-a#vyI21tJ0AZ+hzsu+B73v7HTtxxvooLX z_J&d={3FAI@3VTEcg4HuzcPP+=fXZ%`-N%u9XTK@c#59N$KW~*x{mumf$pY|cN>iU z{n2kmy$1bCm5uv)d9rDLHh^`XgS}~CfrKROj7CWfO&IS%frgrU|KD=0TkZpK-G0K& z#EC#ju8{vxCx(36ERCIkkg)AG=8T?xlq2oy96dCiK75!ajr)ta=I;Fb{N5CYS+4%S z`mOOxE54E#`bI6BG#2TLYNH*|no8!GBbjt{byKp?Y8@RN)i^wAqj|trs-rn~ylz`L z9Io-zA*5eB-OD{;{|?ppDmoNDM5bvUyQdoJ?ETTa%;10OPo2bZeSL3#Q93m9x_mg( z+_!puOk{)7UE#rg;7vab7=_3)b! z&}+DbM9;sulRy9Q|Dy-~Pf&@!&;vK0DHbUzLt(J%*KMbIQF^Lf9rH7Xgc5`+OZ9u@ z3T2C8E%1!&FAfQz2*^`h|HNthBKcQ};U`g$n^O5axJD=_yPRQQ$M$$0v)=6aY_nOM zY9za2p@L#Cr+SgZOod?}|5oUJBKSm_!}&P-U$6MDu3k$+dn!Fqu1#%*A_nNhX0u!- z0roOh28?I-SgMWf<4kfKsEOWdhvKA^B;1Ec|Jl5nItS-B)$s9Ccdjm?u%Lmfn)psC zT|pSEC8raGnq(a^6*)ct!0h7OV%49&yZ;OYzP15lGq3Gy0;_Nxp!FRP2zOC&FpOeF z@KaL@U2WaR#g_JIKuj?m1@h2@Rsh;_UZ)Xi>wL{kAv7qe>fil&nW>i|k!ovK))e4w z3|tAyw?Nbwb0sH$Aku^!#A?$esFU|Hnmi-2B}YO$C@5%bD~xv}d8XBPK3?|uLj3~Q ziVWl`@lV{S9}iq=0Y#$L$QF4e&%XC;&VZ7_PWbqBd2MYi)W|MNk1N1!zvIr2-!dML zbl9Iaq4Xybj2Z@hY03f(XUyX7)D3P~q5s9a*P8eE=r>#R^6U!5xF0ABY+@*LZP*<4 z@(acsn26dH5N~e{6ux$JRAr0N?$#u;dCV*PMZ2%nzokfwbx}cjpVOY6#(!VEmYm}% z*%a9F4(521RXpcANpSVYMGYtj>$rRBl>M!Ngg8_Jd}^#_GHuqW@+InR3=2AhiI-}) zJ;thNqY(9~%=M{a7zUZTgsF}@34Kc;{7`S<*cZv=jfeWN%z8Gpv!O007ku`Z%lUuF zL3oV@uio*M=j6_}<&NC-`@*jaGUprm8Edw(vT7}Mp=#&Hsnghb)PNknH9;M z*N+Y2c%ze54^k=RDn9Sj>_DqwBo@_!?4dyg|EwjyUc3&~#{KOK!@fTV6$j@&@8HcF zR+^cu-3%&N`l92i&ygI*mi%qWsq7_*EgUw>9pFxf1g2|!O%B8&z)DbbvPmC z+qZE;lSoC+l94q)4;3x#5Ow|MP`Xid)}`XBUQ2s>ez4LGxR+~RazLlCAE4-nP^k9< zaqN#Fq3|3iZTkJKa7e~|*?}C^H+8BjhZAvn)n=Ox<9$sr{c$Ff!;BLBItz&tiHz46 zDeSi0)b(nThU z@hWdx-1SSgd*T-HIwtu+E1oGz{yj~v6?0)o42kAIZY0(}k}`}b)OQJ`up5c}@zD1l zza#f~x2>&J;^vtfPC|tVxaK)1*}uHx4JQ$!4wPN~oU71;2)gbE_JSeo3UmB;wOEkB zb}t8PCK?q&b-aF7iyNuo1pmm3BBeYJZ0<`(8ZC@Wgt?U6nNkEoPqW)KM__eetFz_o zY}h5$QFUC%_J>&5turHDAkf#7tmXD>KdGAK!qJ_*E@gkTxU8l;j3@qs#VV`?17Ll+ z+g|PF`U!$(Rl&Y$!gp;+b{Ikb@>7RzyTldkR(L)Z7!2I2uq z)XBxm(ly`a8y=}`1v(b*tHv=&8FHHym%D7rG7l;I8^8RM5EXPkVP7|&4L1XoNyK8A zXtwhRJj0jlr+SxKzs#RNRgP|;RRYV|g*4Y?zmmlBbdfVCIG9nqH2jxpRqO;f?=0ol z8bUn={3CB6XZzmI?P@2EIGO6@aS-OVoW8}NNgOE6$y(tPmF3xH0115+^R5qk|K4{+9AM znbahDcI}om`8SSx$6oFmtCWgG1#;_N5=&6rwphWFySn3ywc~$&Tc1cY0RKsM z9+sF?NzNkPk$#YjjcLe1JtsvpE&bFelX6%c7OnWIk1B9!v38Uu7_r2w0n%4%6zJ63=22Fpd4Xr;^yJBrT z9&NE#dQ8qT7fI~ypv&B8ann0BZ45zFkQ6En@j|DL6w|iXjTl)iO6MdOCK^6B>W1BB z^+G`MCtvv#ttRBtXctRtH`oJLh|yR;C}2}fad6^d&NZjK&HU^_DXfLR@hBlmsC}zc z3I2YZPWZH3m5Jkma_?YGvmSVDpS8$ImMlto{8pAlQ-jh?mdVKy9}XB)^2M`l2BA~>?&iUn!Kpl+A{FvQ6Lnu z9h23u6@BMYu20HAF-)p@eQQ>A|Ke7)x_EPzZf?Icw@|sVp5ydRs3>eU?XM*OTBQwY zyZ2wd0im7V^t-RiXJ(ri47WYLuC_ZOvRG>9qON~#_XC!(Alf9C?gx6^ZT30%cC+m{ ztN8fX`KFA0(SH8w>S|7aFZNhLZLYx~zlFbNM!Eq%lfEUa^bUtskspgPeNm`tiL@zC zKK&V7WEH_loKTh6jwCRbZeq2?u^NhNdgS?Ddk{Oly9;j+3gHL5OHElfesio0qVU|h zd`%T?u{)gMjIk%KrqR=h-OqmlyM4RJo68;guH$sB7KwC73R?BR)*dtBCgFD24Ny0{yY4v%)=+Hzx4?4Xx1P44RasB(a>9=qxE8!>8vsX`e z-sON=F2%H^G2^!9jMCiF>3Tw28s7J+u9V(%Q57z_hZPNHNz$>Ymq#^T)6-miZ-2MA z1j`j;O+LfmT+foiQZ4MP*w_Qy4n&%uv&w_QEBHtQixq_>_>ZZy#}#PRS_+3qql+&f ziOfv98EXns#UnmCKS1@mjV(p0OzMj4eAOlP6@(Y&7R?RWLnk*tusH-`H3OKr+N=pP zx!k5jvT(u)Vs1^k5`TCE?qB0$&idttW2@Goss)e9A-uV2GHUAaT4H~sBxa4Sl`J&p zooK1NIw&6g`;r5E!8L+ui4@qdsXf&WAP3|2+6W9bYX@+~LCz?}S(A!f^K10>OtacJ z;rmZLe4DG8uK7@DEA`GfNKhESv&%j9ebEJ%MWW#2+|WtC zoUF05bvF1jXqmRcQwy#rObn@g&rdd%G4EMTaw!-qPN4x(qAdo6NqvUBwQ3a|1G&X= zrYuf=8=;^)#A-%PGM3-6^Yi*OCt~w+@8vNGNDc~(R!~Z#W7aa|x}d(j9hih_5bHeQ zp)$-HW$gt%Y#ES>+XHlmwPabLmyY`FpD?ZWBTd|G_ndxf9#p8cOuq?6SA2!UD1K;Q z8{8Mok`qd$n??a(vZ8ZNlw(dCSs9VBXdNkWwK#bk+1R+tW(h3INHYP`qewZ>WqNIJ zpAHQNSGg?fBY0N$#`FJ+vhd?MHJ&+pbg!8$?7V7b^025fK^sE|;f&|t#Lgd%)&{SC zA2L-auj4|otvm_}<;odf&UpUpQvJj;xr8QfkUvh-=QhQlugP$N+}>hJlVE7BK)&2C z;d#Dsm(b4X6&s|%p;U->L17@{udNhq9v7MfZFsBK{0UiFPHno;J9*8bcJR2LW^OFk zW77g?3`1xuN7$uEv$vZ*!8WuENxf5~5SMLQBAn6`g1wazB-e5KRtl+TcvswhBq6Y6 z?|I=zJb5j_Oe70=5fPC|%egyd-hCo2l~tEoCGQ$;X5Cq_ea?h<8KqCUiWA2%M~Up~ z?96Zb|I4!nwAEZF5~a$#B6Q~judP6tP_xe#a5`?`SjA9cChz3-xxj`mCDo;>%RW@b z=EgITH@oEE;5L`^wp?`ij7)>(MxmvJ0#H@w)Ri=LB2sn$0#caOdMqWTN%2p=mvk#B zQk!hl#Jln=Akm4~sGeU(IsM{?NSydLb;6(<=2ES!+yj#(S(xUgfyg&dgG0G;PA%W0 za&92fOgg2Vwo<64hpIaoW8HH?ag?0`d{&Qrt0!c=rV9lw>g(6_Ye(cD{<>JGk(W~d zDBHgeB5f$uWicw2lK!J4l~kg^!E^I@)jP&N+>iG(@e-$)f{WsYcPVhsqs@)sF`Lw1 zlFO0URU6|=!B$|YMs0RX@?ZoD9-YbQPO=fwuBt{hvM5W41V4aEWc!LAe7BAoaqZE1Evh%IwdibWH^UqJQohobzSsmXgioL?lACb%O4!X zAPJb2-Z@bP<@4`XjW<1{NuAho*4`xAk~#w8NYK zE(*hJh05@gJS6q%!vR-_M~&~;?KbSrVo5 z8tYcXzB`;KM5yR`s0S%uag=XX@5%+3d&R2|nj?-*1aL3prv&b7N{ z)ek7;vMLuZog?0V)~vC;qDyRbsWc38)uMSEMAZtZj~nSe2j4&qE&b24Fnvr@m8%=3 z9Xo=F33ZY+b9BK~?KO8Bw{Imhabo1lnOFvzMZDB_c%>?9eTc5)`%Bd{7q zBHR)GW#j#)k2?1SyDa9=p+(=A8w4S+h!er?+VVw{76WqrCF-mRlz?DGAT()_HX-*F z_gta%=5ivAC4S$tW!@d%YtG$jQL1W?adu{k=*&G-Zi{N=5~#EhgcV&0NHADdyM3q3 zY&j=SoJ%8Xd_f^d;ul>qVwD|wuuz;cz9@ zU64O#*(9_vp~8&EsF4CL~WYNLV3=Hz4dm%4Tcx0i2DJzzy<~HyzFI zZHFD;`YrIR(p3pDjB{9ji>Cb#`5_Sx78sop(XHl9wOb7Ou|q&6o?m@iO&4Y)y}RA=mOf8G z_l*0ryR(Ji_H9=d?VLNaol9K2G!Q1@BO}~<4-EgU`;r^A$DIL^{vIzCiD0#x| zran0N=adWzFZ8?ALJ?m|(j$dFpaVT;)q$hDw#;L20)rxm$0h2f`T2BQohz#HGXhtW z%_SGF+)|ZvleFgC(h_XSk=Fbmr@ACz8kjXjp!TOh4zm%T`YQvKU251s?a4LmZZnxp zp+cF80IrlGS{V@%Di*oCwpC{E?m-Prv)8?2$s%XNlY6=*g>`09Q6X0xu?7sSnNp}z zgzr*tPGhJe^yqZNAD(H|8{bs5e<^49;Fww$d@kF3*Z-(_j)bcD4@X$G@2|6VlXsBQ zZud{QI)PKSOWkI6btYPTqsmuBuHj)CdfgPv4V#vbwC3vvVVPSU4{jsFeZqy1#X`}a zWuUmc6bO19Ap$~w5`j#SnK_0k6JD53^!lmDE1nz?;c(LQr(=W-oW00r_oNd9sM;cN9aNR)fJN)b7$WNO+ZBaNyqCa z*YWC&#A3}Cggg+SgmFbQQqiQ8FrcAJ2QxU?J~W@j5sPQ{5Lcs%Q>dQDUy7JC3rR03 z5LyiW-&W!KsaN1fbAFTl4(>Fi0{c1+kq<$0t@wE$nP>Z!v_pV_xZ7y1yT!?;T0aGf zI(HXNB~MOtoyS*ZS{->GE>rtO&^`~@;9;t={9ygSyy)+zR%!2I!p{6sI{=7<7r&2 zcmtR{C!G(LE{f;1aKv;~q=jWz$En)Exj~ZLc^LCC*Ar8V(7ubI0HB`SYsJ z9U3q3<6|_zn}tqKvQWYmwM?fDF&mkR9a4ucpf9N?Yw7xzgXDX+S_IM5!5YVev(*F^ z4CJZ~PJ5)du5ZwReHn6k5low-Sk!lK^<*mc-sXlac!`u}FMm3oND8hRxk9m%#)y9L zM)=0(eDN)MG_}0$T~pik=SWG>K$TDQSf3*eWZ_%db5F4RBxx1#>4M(8`cIn){Vh|M z?__xu5D?!1=ugUzwp`p^6}}`;aWI;ac%f;)@m&SoW2+2}_#qTjL+g!2_(x+rQUYXn zEMJg7Ct3u0P~Bxvv`}Su13Ar@X;`T4a=Hl{HG1U%;u%en-^cQ3Ew)L5<~L)Xttb>; zivHyN@4ppzkAI1|O)uCpc4adM77*fUy>f~+?-}i}rbPxwblRVrh+pVP{Jyq(;h3@> z;XMw|2Z`fI2leP3%?t>t)EnZQ;d1(A8Re$iTOX0J)EzJBMlcxC=`uXw#Gu$Ak*j!J z^_-Gy4EvdXjZV!vxoJQ0ZHEq{Dhhs%z-JMZ|IkDBjQ(xH50xX2o9AVGr7gwegaGnS z#ZzCo+{w6bni1{9?k3~B$^ZuhI>}QfM!)ox=Ml& z{T~#{xQfT@3^?{Wd2nnz5UFWNo2dg`+xH<=6c8i;|f)UcZ&FJ{uaubYWh+ zY(|P+Jmbf`tbS;JZu-#?)iXcVXS~0qd(XU^WL1PI+OOjkCv4_**xb=-orm$c9DLQ* z2$J5W<<~?Qci9d_7{!K+VB3D1FKH(jE1i*vS)7FqX`e!b9rf1dd#|{X>Yu9L&IG~` z_@`&)U8w)XQ4GxA)0TK&(+HdunBL8vuae`FOdUsH>xh`I&2Ahf1Gr3O$nWrS+J#A! z+L)~YF5MY48ejf_aAO!ZM2nDFMq}1zjUT6sRp~~SR-P8$8wo@BwJNn4yK{_iN;v)% z*X{`JClbwYTEC?K3c)eVKSDrU*a?NSaCxoeX@yq7sZ!yGY|DFvyi1pdBqb&7+Zh#1 zzn0}KM+qP=_mm@h5nqER8#rn1`#eluPB8JWP9Oi%X@SC@W6rd_HV7 zweF!tQ=eJD$cccLFx!-*IuSy6A%yj>nP5v5$sE_40UH&t~t5>o$zo)^! z1_`JL`7Nt|jS_9~dm{L2l>g6P1?~8d7A%krpUq&<&oA4+G{3OW#aZKg`2C?&Dx04$ z1;q;9UyuCrYlY$`1PKSqJ)g6b#&o3=mz9*_;NZrvF8GaQ5A$LtXl?ZWp_wngzNPu7 z=I1j_Law^8uJ{7<0{00(x2u!$FM9p_svrCaD}HZd!>?O1F_7f?@bt8u^D$hZN*@OVIqtDI(&5qLl zhmK-VzkOYE0eg>Th_jYIxoNgSa=0y5q@LNxiQ^x+$x+f3^=|vM-Tdo8YOG)0p;P-l z5A^9q!4Vc?Io%xEpRRPxQyGIk{`;kep!Oma`Xj`@MC#|)1o^j*qxQ{*OYtsN&uMf; z`4OcKFj(UM4ayy^I^?oi@orgZ?C`GRngL-SMDJ?d@=r#Vb(?TKRr!E%EwOq$8cvLMh+XBJ4d*z z_}Z}l16vt%KiI%_e~wyM;67$!V@DHxb|ezOdL$-==1C?h$#BcMqf8X};x_t!kcfb9 zTF;%G;#`QvV1$}s5k@m?mCK*(%~j$wI^Gb*jzxI~@y|K(<%lVM+>J$6XSHe%*`4al z%VoAWLRPD`B#vc5MqW7@hw?Hc@D*qcC2Mk3<1R7LuJe(?Hj`x3f0vS9a@cwu$Qd&Kn5lLpR zgj+h332;o)EMBD$KAaB^FjsWo*^vn7J~=kKaH|Wf4XhA)7#B1yYkf%1gh|#nvAHQ* z+y8p7$5)%bK4WwAWcSYZ{b?ZZJQE%>!89R7aI5?iYyn- zomMmVi--xTwY}gGGD&BovnOaSih^xsVFAzm+P`gXO8Fn9x>T)P_I{~01QYu4v(dt$ zlV`w%7nFvn&U<7sw{M?-&P(B?$-a)(Q@>w=yd3N#6VT@^J_!sU2Qm35Z&v3|CWZMQ4l538^_+~rw6&%kUBFVKv1`aK+S={Dx5X+;<1aXi)eb!Mu zEk1@kLBo#o_V%`8tDEBYt?B55yHt5MZ`fxo4S7szeGUqa)_SkeB%*3a&8CXaewhN* z%bvL5)R*^~5J3Uek#r9qvPOX#r%cY2kD}nwDBs8>Sj^PnhsnuxA|GCFAc#mvycD0L$4ch<_|nb2 z1jn6S`rV;;0C%f}9FX#34S6p(vPB?+##CX8R?XQa2 zIimjjEA$$(4B~F#VQ8Hexwz*FPe^&4j|H+B8m%GN8yBcD7w$!h4) zllKk|LTllC(9*xJeK<{P#1pO^>d8M?AxbEUx{x5!ek~8=+x^5?X1#R2Wl8bj{i`7Q zR=n;Ftj8k_md+R08Xs-#9F(=cY%|+4d#FxpUl~%7C$4m?!yP5 z_|W)rhz;CPdv|-;JmYU_LBi|9>2P4W$JPY5WN47xpb=wx$tQ3MlmQCFWiXb1nA2v1 zRx?pXHC8%D38?x!>bcBgo;->Z($|m&FCZluD*V3bHYS;pXT? zU}r-8ySJj)k)N(?g{Y-H$dcu}DJ*fdS94{Z}5# z6fST8agSL0V$iH2EhynS<-sT&Dgk>av4)0?a{o1&O)J|2UTCWG&%c%)N2Oh4U4o|TlFViGNcXI_nUVzG(1 z-c)(g-#ecTQXSXa_>}p{Z_BuGTP3G+FpcSzwJ(<~W1;Vi$M@)-9(_6f99Qch(-LpY1@&Dpw`Sx6n^DAK6~9I- zAQHI*p?>q|(3{YUxZnGr79=}veSdg!bd3)6&>S3ma)fOOCMw-I^m3zP-e8Lj+wqxv zH=JePW4SdWd189q-j7+v_NaFSq+#YL7(be~kG92V@aDaEaA_1Jx<7_b2EUAa72593 zObM~tlvSW(%PoAZLMXXnBk4dW)dJOv1yl5i?5N?@sdF`=Iz{1ynu1z@2_DdN^jTIM zF07F`bao=j{7iy=eh{QSVvv|6OeZ;JSaO|dU@#a{;3FRQQ99-4h9NVV45{oGi-Vi& zz~J?>QJkJEeu&JA&Si^^v~daO-Ax7d+gC;xMlEg} z=En|{diZ=02X;hxe{Qoz$20g~Nqgq&spPP$cPD$`=~ytt*+E}#-KSf?j!@ccZ~KlY z&jsh)P{PEWO9(D)HtMY;KGkm#$nCrp)jOJV-k*p<&YztYX{ot=X~leo3~$YLXfJ)5 zSOYJ+g2!#*esYz$IjvboyhxvO0?(YTxth|7u6v_|G9FDqT;{N-yN43|V-@kt6WR9%?Ec`$wqYUOy=hi1Aq~G?*cN}MoU9T#bY<4!HAE!& zV?=>dYRd3Wy;A_qw(26~&PXAVt)hDD0Lfu_FMKTrmaq8QRwzoFvU0wQQb2uGfx?(>D?(%9xX0Z(o+w`=i3f|$saRGBu!B?oSK5EM3NHTU9sUnbmawved?beh-Y2H zNWOZDx$`!tagM%l^h2?{XZq+~5pQ|AE&E{m0{6vA$n8ZMxZ}l-jmbK{pZg}~G<_yL zVv`H%s+#e}^T4?icI>m-T*i`7=Yxk52o!`l3T&-SIJ3OT#t>&dKB`l^Ls$-`;y@b` z?&am3Y-e8PXU`nzmcQqwy|ul9Wh8d*&GLe}$?Z8F1wZ1{Y2Zka{pkd5knOb8J@;9} ztZMH}M3Wpfo1SxmbX|=()OQHF$MK@|9ywZXe>c40a>SZUj7MarLS=5uocc~{{7M1A zqs8*0Bf1Vu7_zlC)+gS$p`JYhPpkw@(xkN;&;*)A;*@ZDX8eKc#3dbMGFbTT>oFit zCn~}A^6G&d2w)5E~P?9|2 zScwW-dN+shNOo*N5YId!vAEM0kLnPtd{V}%>Gvdk-If22Tk=~t*>m6)%L9T_ zs}PrU@gTS8KJhQen`eObVu?A^ZxUE6TyQmfwF^r0H&XCllF4u?rfylOa4tXCEn!np z>3XKjH$UMWg2F|58ie=T3r=pI*IO9)rt*;P;1b)XmLfu~Jymp<>)tAc`Gw$lJE}cN zk5`~8#23^%`KE+fE($T?n6Z4^IMB5;&Yynk;LSmmKH-XaY-z+)S_qXhSw6893k~ju z$0wu)#XW-&yBDQSWL0=OQ#2tfsYIT@T~{wx)-b)hyIB2Mp{)JHOwxuI7cU`dI6$l& zx6saq!S47cFU~)aH0;xh6%sFDc}=-C1vGf@kW>?abkq&Uia0jSlUfCQok*~ z`vQKrb}Kp%V#{{cW5WqX0)IK6<7cl(QE~&&v6a=TQ7IlwOQlwiWj?5d2bM-}3Uktcu$mS*bHHigz+NQV0oU)0t5*hGDz z8C?Hi$8hU%RhJ}cYxO2ozH$L-5SH0ytY-*-CBEnlHN5cz5@c~Jl$7NZZ(x$-jDvN6 zZj-Jp>B!BMUVEzR^1^XjUy`GrGSk@m75Us-%+xOTWfc_}!0c6)%T?a` z_YMa>a@;~08eZ?4EleojUNINsZG8GvaUyH<0cX&C=X&lXJ>v_c>}>ucB$)v)vcK zc*X!m{&Wdk&}HAX2<58L#>zJUwn5HazHz9F=EPA;6$ zyXlWyg<<Wi5fkhDkvyJ~YefoEF-{~ea$f8x)u*~TS@2q# zr-e37l^AEi_%me59*}ISjKw$(HURB6N(E!Xh|ShS77|_8r&ZKTsmStTSG%>v2Wp0M zceT0u=SWczKdYx?kQ0MPx!i)WES3NkX^{n~6;~?AkkDy8-sME!rI>Y>Hj>Nxi8W zi7tqW+4ay_Axf{7fUVXc)EVV3c(O@EPyend>(y8;4K}L@X{?P>hfv5k3`t&Y?uLhq z4GXzxO8`0msmn-@Oz-TNS*3PY8<*YT`Kt}72DAwoC3ixh<1H>J6&&G=FM>@X*p*f@ zTFFxbW;7EDG>0>@`xn*%%0QWb^B-=T)JIevH+T`5OS|Crt}m)gJb_gH8U9SyMxs{bS8Jx*}+7&+mSFQ(PIz@8U zy5f;`e;L?0I)m488!}=s|K9x8B0JjbER%05uc+KJIQp)cUq-mkvje2K*=pqsjPTg~ z7SqaqptW~S3uE0K{E2|Ud5#-@iTh@%HnAePWoUdNrX-4}X6diGvId#4s3Kds7cn{2R&4pZN%&OMJhCz(=UBC1@;8L0MwM5ga z*E|)K-*x(Pc*Hh%yykh2zyPW%fB2HZB3n6+*hBe9+%t9XVHx7JcCq@z@J2Xm?r z)$&cY6@l6E3cD}C*A^S#_xT6i7kIc=3*Wl#9!;@E49hC%we=9@zkws^w-N=v8?{5r zL3?2Yh_E^P-dFE{Bt}Y=AC^?2^0t%{JBQP<%0k-li)IxX4yoTpqelkOseJK`BkQCT zp4Vi^TFp?IHWk$0a?Uztepe_PtFBic*5rPzJ1We=g;>2Q4AMJO!?{LVxoX=GTpf|L z3}Xb|uUg|}YET^bLqWz}1Sb?m;C{oY`Z~|&0*6v7$0IFt5&Kd9ek9%1o6$rI<_Sm4 z8xHJ1N8A2!m)jK?Q(Q{-Q@GC@RiA3pSVROjp28_>*G+5%7Iv^?ZBSVyJmWEb3UFwY z^&EJw;9daJlnvg39;y50K(^FTJn&lhA?KUzlIM6zhq&H_X>R_TlxClG4G?K9iOR+? zVdk|KyDlsu4w#JEn1$vuzeo8lUY`~oP{W+ z)JkkW9Gow&s&v5|ja7wZ-(WAcB*b2qUS>rSZGM8cgOF$<*qG^MmIcn|6ym92j22vI zXc1~AoWz@}7cGr4^}JzD?U$+T11Foo6x=?Y`(ip7{doTflQfjXn<1x&F=sV@F+I5; zcu%!<;|<(hLjIBHMvaEDl-3oLBQwui<=D09*c5K0W@8cZDXxrjXU~tJkm?)XdgP{I zfkRHzfgZxvmyQUKnS)D^f-AFW*f$N2YOqSoc`Z>{4H|~<^A9N()Z`=1G;m~ex7Iw! zj87i79-FE+O&9yB^kLC8P2&P;KyPB1h@?_p7Pv{^Yw8}r?mgoT=H89_aNCJ=sFa3p zypSJCDnhu>+xRM^pARSQ%Z18y$Q$%qcG3a%FDkFHm$&e}HXi5c>>ub&m%BZ`s_Dz1 zI{aa>)^Cq!m~%&DigHf9%UdpCHi7@#KAT=sH-d6LOgd20K)i?y@O$!AQzKYJGPEsb zob2O@&jy+^C(P{T;}kLfmGK#Zj>33f3Dm7yh}ajTQ7MaLpYdS0^d5!P+Ffs9h@Ufo z|7$+;_?=N2fglSGYa--Y0u$*MO|Q6&5jRw<^(KqE_m4~$R#r5G@wr7!4&C#tNoW-z zfo|_+n$I}nkD3Et>m(UJGBG+W30|3vDh9qGC$3(iY9@*ine?cp55m82SP#Qo%q%`I z%;kzK_n4FZE^+Ffz2%^5%@lcTwyn%v+}O6wjBMNO@Tt{|awSU|ny;Zki@RX9x?eDU zRB`GmbaM#xekd#SwWH2YLPABz5j=c$Z8Z;jqg!HImol&oJsF?0@$mKSi!3;%1%~=t zT1e%*;&32^rDA#q^2Tuycm4KJJ;xoxtgM8m4UG;qO2w|K#yVD4CSA*|gYolZ zWKBW>7-)LTO8MI1(qT=t2_(H~&bC3c~UXOk}m)p8^ehXyKuezVdxnof;KtNw|Sd8<<@zd+m@FtSd3Bkwtvn#~xJcJM`=ogZ{X^Zs)h8f6PI4aBM!DM}_yCFY zib{@~{(95eIL~5=@qnuSHdJ&h?ZhC^&5{ES#4>hfHFhqzrku?nt4(SiF=(5a2fpcQ z^Q1NP1AB+n+#RzaBGKaU@4;N6eS!;| z-%~gDiiGQH1lgu@SfCrl)BnZPJ8;+4eQ%&|nkH#%t7#hBwr$&XPOK)4ZQHi(#zs$U zoY>Ai{r$%s_kMsq_84ogHP_saru=T}pF$S=L*FyDV!z+UFvx8(uk{Zg;fA+j!VkX~v=@FKF@=+f@BxXT{ zyh?G?7rPCv|EW6VKJ7-OR8z*EOo3C268bytILYb3mNLG=pbmp(QQ9M^76NMBE2)8m z;cct(H}EqfL*^UJyNQdxQVA0h-e=CK;nnXOR4w0#kFlyv?M*pNu!a5viiD?^&9na* z@7T~jQ1t3crKC9$>3EQO^Xpfd!(8e>WvDBV#qjbB};kf)UxA*g>!9tCKfrd@Y zd28Nzgqd2$4XUq-!8A(>@(HHDf{*#{pidvwOWGBw6VQ^YUF4#;ch4KtcqYx`Kf;q_ z3zs1FWTI>5g#c4ok9F1O-JHgIxtdFA`ZBLaZ|CBavbnT%enkWNUYKO%^y<22zoQfCA*c#=RS*e4_3xz$Pi0hQL}+Y4qhH%C$o z56i(yKYmZPMP5`p#0b1`_EXe97G8QqA4`?LXL!zC5Qmp{o_LPub2Xy(@f=m=ffRvI1`( zpRVY`J00I*Wt2x;T=xHleyBTAbKX4I`|H;|7BIDfT&&4x!Z9^8)`=azgweY1PgpobaV|3*v5`YmxGI~A(%Gr@uJP0a2C zH%SFDWPz=+cZ~_E6dSoePU^&8{yK04uLxkd?hqjl_KdJDBbY)5i-rJ~+|N_hD>J$$`|F zs~*{`zTG9lyMLRX-rna{lTMDt&5VDLcW-@xbNa=4Fll@TVx$6*HsRUZ49KlhpM@$1 z%Qe$MSPERw_`I0gdDu|fpaU|DxHwi?PH``47vLf1%qqyM6G_*sh99-x=!9@yU-9lL zX#L~iT0cJEh`Y1%qhOu2>`w0au*_GZvMg!ntR9wfHD}wi%t>yrU2Ry{Rl1GKW)k*r zZVN(_ly}~4>@7drcMOgMw}!@F@x0WNxCWVBA1Pys7bW<5MMclGf7kYW5Oo$}l+D@U zgePS6jojh4{qU!kh5&kOJlP$_mn`o)Jm+^M6N7F;{ zR*M^=nz1Pv+nk}UnNb>{w)|)AXf5fBkxxg2YTTECrEdCu*n1E)jWJW5vS>i*-y12XJRt-r`G)NBK@O4|G+Zp(AbPwivd zOxhZ(2`+RIIliSOjDfTQ@-&)-Y)VQ;6gcFb+DWg<<^`p3s#esJcCyAxkcrQe@LL5dP8^K`h8FQ zdR3ZpmAWlhFi;_!#x!R7+jTKHOQd`Ya<}>pB12TJXtsg2RMuUzzBT$iu{tu=dkyh^ z#X6n$WplF%=ymBS0d3v6J8!w-CH)NR2*W@Hkz%mILNKE%yZdUZe-fsC>N(emhiI#> znvK-yK=y?<;8y2~n3c$HR|sk8FD~c9MAhV)HQl|R1L7!%$MK}~B%^$7q5NAc(x*r> zH1G{}beLgn$9{zB6meoEDAR-TUMZ3@;|cNRc#&aJFd4^ZrxY$6{ z{}F)v=>FYU-Jh4Swf9`hKvR#x=2RNMLvg>!5R*7w#BEnb@;2ZX?2qfasb_FcWUu>2 zvv$0&_%q;?!3qS|fBdL(+kH}82@i&wdu1skLqNRI-bY_{RE8m9r)&G3n{ThaOTmWj z66g8&!svd8WS!t2e!km2?`v+Ak<4DE=9SD!1_OOJ6b|8FuuSzSkb(I4Tqt zv-3aZuJQl;Qe$SFTXduJY_WK;gpg5hr0U`7Ml$`zj!T6bBXNJc?#nL>YuB#UIOt^b z)JfO!H{_W*c`m8IF$q+(bh&r)_YTm)n_+*y!rd=NK&ntfKR5?vQf!c>Bx2=HpZrit zUYqkXw|~h@B)==CXVdkHD74RgE2Q;>Q+cPqM<{GHeVCnD;&eHSe$@TyDhD|NLxy=S zXZ-&DsBE!4nto=X=-pEmn2US6p7FBs*0L111-6hgl>Ws=R*+8|KYK$s4-E0i^2B(? za>5-it2dDXJZofWu|tpH#*l4YG%6~+*CkD=_6{z;VH{v96F%4o=*q0D#7|rbf9+n< zUg41Dc|?qD?$Ay#S!)a@iI%4;kAd8F4w*$u z8%a9lc5c5VW)%9I35r40zn_Ry|EPL>^^rmSN6GWBwcT8t-{o=znH}|ymvl;uvdupdE zpxj;MQO`k6w-xO_FcV=X5Q+Y2KYZpsr9e_$_7~cBbZWQ(asHDJ41%A2()3R6EQb3p zHR|3ob0oLMWZ$Uqps$86aFTxLPcQhpRgXkHYD;YyLvcxp0aF0}gcEgi$~go)VBk(!hu4AeMRpzPyqhUCgYQb8q24eMYzC*y2CLB_MHp4V zYp|8HmNW+~G}e%137H)^a36oSA!0Ctl0=*MiWOA!2rxk?xVt5sRWG{7ze97C_ zS!3!k(I^BzQl__MVi}URAGLo%#C9JXA23&j`D8f>eVhSL1EhXsu38B&1@KwXQfiT> zhJSeYg2fYPYanH?YL(cy^!)xxgv!FjP6mTr?l|HxB|F|L0gp`kesr};t}-6*Y|UdJ zrUy`L5CvdmO5h_)r;M4gnJ7AoKUmSwt+m=RxNf}l8M?A$a)``!eKs?Z8`G*C6>C)swWH*hQ=et^m!FZ=>$K@unD2dRl}` z`Z@gnz44b*SF59W9c#kvFLf+s&&B32O#JXeQ+`n5R#ZN@n7x$35)Fs!tsn~{jvGTO z^ROL<_PUbZajVw^P5-E-Xw4=B2#rc@=5S}r=?FaLBIc09$MBykdl9QBoiS9JG! zjFYL5#oi1Kyl^1gARCSQl``H6?HrQ7jmml$9j%BKJuI4+g@kRT@DWpB*&cz)AULhq zJLJ1adKV(3<4#cxNr+8zOb5(GLuFhN6*97KJQbx@iq`{O7EfL;)-E*+87Zuj&gKMo ztEl|&+_GqM)63KtR;=oXpYxOP34{aY>3|2f_xq24H)8DL&PNA5r^|5(&iNdael>qR zr*V_ovqKx96^E0H6}B!rnoop;0IAoG!mNDMj^;UA((;gunVdH5#ibAO=us#xtaOT= z=)ee9TXnRTYgv@>k|+>^Ljc2x`4+zjK>oe}i@GKc;&-t^ffnGX&%1@gIKS^#FNtMH zSEZlniViDYyHc!L+-YCgAx_FXVtLRg8b(Q)hawBz+kK=%v13&z)=O`~YfZ8ECOxev z!52TVlhqmxO*S!K6WizSg7rgwjTOr#9F9&O6`p+G$k!-FWR`-m60uLFGl0g$V6<5l z!h^Y-_X9UDu@^L9vRMvyDIHwQeZ`Wc%dbzEL@U$zTFp<%1y7(G@k5T=?}y*mzXNvK zyhhVALa1lzg8RgNOgSG?w8vBw{!Kb1*C8_`vDXxQI*W&=g%;14+KRW%J!Pp2f!tIg ziVd{qyRV#&D^Ty0J!YqP)hh?g_gU-#I^0Bshri9i-@ABNzVA8LJ

      XqK%E{8!`O( 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 z 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 z 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

      x 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 None: _die("aborted.") -def _dispatch(version: str, dry_run: bool) -> None: +def _dispatch(version: str, dry_run: bool, skip_vendor: bool) -> None: """Dispatch the release workflow for the given version. Args: version: Version to release, ``x.y.z``. dry_run: If True, print the command instead of running it. + skip_vendor: If True, tell the workflow to ship without vendoring + runtime dependencies, even if the project has them. """ cmd = ["gh", "workflow", "run", WORKFLOW, "-f", f"version={version}"] + if skip_vendor: + cmd += ["-f", "vendor_deps=false"] if dry_run: print(f"[dry-run] would dispatch: {' '.join(cmd)}") return @@ -190,6 +195,12 @@ def main(argv: list[str]) -> int: parser.add_argument( "--dry-run", action="store_true", help="Show actions without dispatching." ) + parser.add_argument( + "--skip-vendor", + action="store_true", + help="Ship without vendoring runtime dependencies, even if the " + "project has them.", + ) args = parser.parse_args(argv) _preflight() @@ -201,11 +212,13 @@ def main(argv: list[str]) -> int: _confirm( f"Dispatch release {old_str} -> {new_str} (workflow bumps, tests, " - "tags, and publishes)?", + "tags, and publishes)" + + (", without vendoring dependencies" if args.skip_vendor else "") + + "?", args.yes, ) - _dispatch(new_str, args.dry_run) + _dispatch(new_str, args.dry_run, args.skip_vendor) if not args.dry_run: print( diff --git a/scripts/build_module.py b/scripts/build_module.py index 5bfd5d2..b199aa5 100644 --- a/scripts/build_module.py +++ b/scripts/build_module.py @@ -22,7 +22,6 @@ scripts// # copied from src// vendor/_/ # only if the project has runtime deps LICENSE - icons/ # only if the repo has one Usage: python3 scripts/build_module.py # use pyproject.toml's version @@ -258,6 +257,7 @@ def build( clean: bool, platforms: list[str], maya_versions: list[str], + skip_vendor: bool = False, root: Path = REPO_ROOT, ) -> Path: """Stage the module tree under ``root/dist``. @@ -269,6 +269,9 @@ def build( clean: If True, wipe ``dist/`` before staging. platforms: Platforms to vendor runtime deps for. maya_versions: Maya versions to vendor runtime deps for. + skip_vendor: If True, don't vendor runtime deps even if the project + has them (the shipped module then relies on the target Maya's + own environment providing them). root: Project root to build from. Returns: @@ -276,7 +279,8 @@ def build( Raises: SystemExit: If the project has runtime dependencies but no - ``platforms``/``maya_versions`` were given. + ``platforms``/``maya_versions`` were given and ``skip_vendor`` + wasn't set. """ src_root = root / "src" dist_root = root / "dist" @@ -302,23 +306,26 @@ def build( if license_src.is_file(): shutil.copy2(license_src, module_dir / "LICENSE") - icons_src = root / "icons" - if icons_src.is_dir(): - shutil.copytree(icons_src, module_dir / "icons", dirs_exist_ok=True) - installer_src = root / INSTALLER if installer_src.is_file(): shutil.copy2(installer_src, dist_root / f"{name}_drag_and_drop_installer.py") - if dependencies: + if dependencies and not skip_vendor: if not platforms or not maya_versions: raise SystemExit( "[build] the project has runtime dependencies; pass --platforms " "and --maya-versions so they can be vendored, e.g.\n" - " --platforms win64,linux,mac --maya-versions 2024,2025,2026,2027" + " --platforms win64,linux,mac --maya-versions 2024,2025,2026,2027\n" + " (or pass --skip-vendor to ship without them)" ) vendor_rows = _vendor_deps(module_dir, platforms, maya_versions, root=root) else: + if dependencies and skip_vendor: + print( + "[build] --skip-vendor set: shipping without vendoring " + f"{len(dependencies)} runtime dependenc" + f"{'y' if len(dependencies) == 1 else 'ies'}" + ) vendor_rows = [] _write_mod_file(dist_root / f"{name}.mod", name, version, vendor_rows) @@ -360,12 +367,19 @@ def main(argv: list[str]) -> int: f"({', '.join(MAYA_PYTHON)}). Required if the project has " "runtime dependencies.", ) + parser.add_argument( + "--skip-vendor", + action="store_true", + help="Don't vendor runtime dependencies, even if the project has " + "them. --platforms/--maya-versions become optional.", + ) args = parser.parse_args(argv) build( version_override=args.version_override, clean=args.clean, platforms=[p.strip() for p in args.platforms.split(",") if p.strip()], maya_versions=[m.strip() for m in args.maya_versions.split(",") if m.strip()], + skip_vendor=args.skip_vendor, ) return 0 diff --git a/tests/template/test_build_module.py b/tests/template/test_build_module.py index 5c16589..0a95cf7 100644 --- a/tests/template/test_build_module.py +++ b/tests/template/test_build_module.py @@ -1,23 +1,34 @@ from pathlib import Path +import pytest + from scripts.build_module import build -def _make_project(tmp_path: Path, *, name="footool", version="1.2.3") -> Path: +def _make_project( + tmp_path: Path, + *, + name="footool", + version="1.2.3", + dependencies: list[str] | None = None, +) -> Path: """Write a minimal project fixture (pyproject, src package, installer). Args: tmp_path: Directory to write the fixture into. name: Package/project name. version: Project version. + dependencies: Runtime dependencies to declare. Returns: The fixture root (same as ``tmp_path``). """ (tmp_path / "src" / name).mkdir(parents=True) (tmp_path / "src" / name / "__init__.py").write_text("") + deps_toml = ", ".join(f'"{d}"' for d in dependencies or []) (tmp_path / "pyproject.toml").write_text( - f'[project]\nname = "{name}"\nversion = "{version}"\ndependencies = []\n' + f'[project]\nname = "{name}"\nversion = "{version}"\n' + f"dependencies = [{deps_toml}]\n" ) (tmp_path / "install_module.py").write_text("# installer\n") return tmp_path @@ -93,3 +104,37 @@ def test_installer_copied_as_name_drag_and_drop_installer_expects_content_match( # Assert installer = dist_root / "footool_drag_and_drop_installer.py" assert installer.read_text() == "# installer\n" + + def test_deps_without_platforms_expects_system_exit(self, tmp_path): + # Arrange + root = _make_project(tmp_path, dependencies=["requests"]) + + # Act / Assert + with pytest.raises(SystemExit): + build( + version_override=None, + clean=False, + platforms=[], + maya_versions=[], + root=root, + ) + + def test_skip_vendor_expects_no_vendor_dir_and_plain_mod_row(self, tmp_path): + # Arrange + root = _make_project( + tmp_path, name="footool", version="1.2.3", dependencies=["requests"] + ) + + # Act + dist_root = build( + version_override=None, + clean=False, + platforms=[], + maya_versions=[], + skip_vendor=True, + root=root, + ) + + # Assert + assert not (dist_root / "footool" / "vendor").exists() + assert (dist_root / "footool.mod").read_text() == "+ footool 1.2.3 footool\n" From 4bc8ca858e20374d50f88a910bce4238748fe98d Mon Sep 17 00:00:00 2001 From: Matthew Lee <{ID} {username}@users.noreply.github.com> Date: Wed, 12 Aug 2026 20:34:32 +1200 Subject: [PATCH 14/14] Fix CI and setup bugs affecting generated projects --- .github/workflows/ci-main.yml | 5 +- .github/workflows/ci-release.yml | 7 +- .github/workflows/initial-setup.yml | 1 + .github/workflows/reusable-maya-tests.yml | 23 +++++-- .github/workflows/template-tests.yml | 16 +++++ AGENTS.md | 12 ++-- README.md | 5 +- initial_setup.py | 30 +++++++++ install_module.py | 41 ++++++++---- mkdocs.yml | 2 + tests/template/test_initial_setup.py | 80 ++++++++++++++++++++++- uv.lock | 2 +- 12 files changed, 197 insertions(+), 27 deletions(-) create mode 100644 .github/workflows/template-tests.yml diff --git a/.github/workflows/ci-main.yml b/.github/workflows/ci-main.yml index fc0f7e4..e5d9dbc 100644 --- a/.github/workflows/ci-main.yml +++ b/.github/workflows/ci-main.yml @@ -14,9 +14,8 @@ jobs: static-analysis: uses: ./.github/workflows/reusable-static-analysis.yml - template-tests: - if: github.repository == 'matthewlee-dev/MayaPythonProjectTemplate' - uses: ./.github/workflows/reusable-template-tests.yml + # Template-only tests live in template-tests.yml: their reusable workflow is + # deleted by setup, and a dangling `uses:` breaks the caller even behind `if:`. tests: if: github.repository != 'matthewlee-dev/MayaPythonProjectTemplate' diff --git a/.github/workflows/ci-release.yml b/.github/workflows/ci-release.yml index 9d1e1f7..f352262 100644 --- a/.github/workflows/ci-release.yml +++ b/.github/workflows/ci-release.yml @@ -13,12 +13,15 @@ on: description: "Platforms to vendor runtime deps for (e.g: win64, linux, mac)" required: false type: string - default: "win64,mac" + # release.py never passes these, so the defaults are what ships. Keep + # in step with reusable-maya-tests.yml: a Maya version with no .mod row + # won't load the module, even though CI went green on it. + default: "win64,linux,mac" maya_versions: description: "Maya versions to vendor runtime deps for (e.g: 2024,2025,2026)" required: false type: string - default: "2026,2027" + default: "2024,2025,2026,2027" vendor_deps: description: "Vendor runtime dependencies into the module (uncheck to ship without them)" required: false diff --git a/.github/workflows/initial-setup.yml b/.github/workflows/initial-setup.yml index 1fdc352..ca5b75d 100644 --- a/.github/workflows/initial-setup.yml +++ b/.github/workflows/initial-setup.yml @@ -62,6 +62,7 @@ jobs: run: | rm -f initial_setup.py rm -f .github/workflows/initial-setup.yml + rm -f .github/workflows/template-tests.yml rm -f .github/workflows/reusable-template-tests.yml rm -rf tests/template rm -f PLAN.md diff --git a/.github/workflows/reusable-maya-tests.yml b/.github/workflows/reusable-maya-tests.yml index 63e088c..98a49df 100644 --- a/.github/workflows/reusable-maya-tests.yml +++ b/.github/workflows/reusable-maya-tests.yml @@ -32,15 +32,30 @@ jobs: set -e # Re-enable exit on error echo "$output" + # Exit 5 is the only non-zero status meaning "nothing to run". A + # collection error (exit 2) also prints "collected 0 items", so + # treating it as an empty suite would skip every test and stay green. if [ $exit_code -eq 5 ]; then echo "tests_collected=0" >> $GITHUB_OUTPUT echo "No tests were collected." - else - collected=$(echo "$output" | grep -oP 'collected \K\d+') - echo "tests_collected=$collected" >> $GITHUB_OUTPUT - echo "Collected $collected tests." + exit 0 fi + if [ $exit_code -ne 0 ]; then + echo "::error::pytest --collect-only failed (exit $exit_code)." \ + "Tests must import outside Maya: move 'from maya import ...'" \ + "into a test or fixture, as tests/maya/conftest.py does." + exit 1 + fi + + collected=$(echo "$output" | grep -oP 'collected \K\d+') + if [ -z "$collected" ]; then + echo "::error::Could not parse a test count from pytest output." + exit 1 + fi + echo "tests_collected=$collected" >> $GITHUB_OUTPUT + echo "Collected $collected tests." + no_tests_found: needs: collect_tests if: needs.collect_tests.outputs.tests_collected == '0' diff --git a/.github/workflows/template-tests.yml b/.github/workflows/template-tests.yml new file mode 100644 index 0000000..c25038d --- /dev/null +++ b/.github/workflows/template-tests.yml @@ -0,0 +1,16 @@ +# Template-only CI. Kept separate from ci-main.yml because initial-setup.yml +# deletes this file and the reusable workflow it calls: `uses:` is resolved at +# parse time, before any `if:`, so a dangling reference breaks the caller. +name: Template Tests + +on: + workflow_dispatch: + push: + branches: + - main + pull_request: + +jobs: + + template-tests: + uses: ./.github/workflows/reusable-template-tests.yml diff --git a/AGENTS.md b/AGENTS.md index 980257d..3b01a49 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -67,8 +67,12 @@ The new repo has its own `AGENTS.md` with day-to-day commands (generated from (repo root) dispatches `ci-release.yml`, which runs `reusable-release.yml` to zip `dist/` and attach it to the GitHub Release. `release.py` lives at the repo root, not under `scripts/`, so `build_module.py` never sweeps it into the shipped module. -- CI workflows are split by whether they make sense on the template repo itself: - static analysis and `template-tests` (pure-Python, no Maya) run unguarded, on this - repo too. Maya tests, the release pipeline, and `initial-setup.yml` are guarded with +- CI workflows are split by whether they make sense on the template repo itself. + Static analysis runs unguarded, on this repo too. Maya tests, the release pipeline, + and `initial-setup.yml` are guarded with `if: github.repository != 'matthewlee-dev/MayaPythonProjectTemplate'` so they run only - in generated repos. Keep those guards. + in generated repos. Keep those guards. The template's own tests (pure-Python, no Maya) + live in `template-tests.yml` rather than a `ci-main.yml` job because + `initial-setup.yml` deletes it and `reusable-template-tests.yml`: a local `uses:` is + resolved at parse time, before any `if:`, so a dangling reference would make + `ci-main.yml` unparseable. Delete such references with the file, never guard them. diff --git a/README.md b/README.md index 89edf7a..7b07afa 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,10 @@

      -> Example project built using this template can be found [here](https://github.com/matthewlee-dev/locator_creator). +## Why this template exists +Maya Python projects often start as small collections of scripts and grow into production tools without the development infrastructure growing with them: dependency management, testing, Maya-version compatibility, packaging, CI, documentation, and distribution. + +This template provides a modern, reproducible foundation for that infrastructure from the outset, so a tool can go from initial development to reliable distribution without it being bolted on later. The goal isn't to prescribe how a Maya tool should be written, just to remove the repetitive setup work around it. ## How to use this template diff --git a/initial_setup.py b/initial_setup.py index 7ba1696..191c5d5 100644 --- a/initial_setup.py +++ b/initial_setup.py @@ -25,6 +25,35 @@ def replace_text_in_file(file_name, placeholder, replacement_text, root=None): file.write(updated_content) +def reset_project_version(new_version="0.0.0", root=None): + """Reset ``pyproject.toml``'s version so a new project starts from scratch. + + The version here is the *last released* one and ``release.py`` bumps before + publishing, so ``0.0.0`` makes the first patch release 0.0.1. Matched by + pattern, not literal, so it survives the template's own version changing. + + Args: + new_version: Version string to write. + root: Base directory holding ``pyproject.toml``. + + Returns: + True if a version line was rewritten, False otherwise. + """ + pyproject = (root or Path(__file__).parent) / "pyproject.toml" + content = pyproject.read_text() + # Line-anchored so it can't match a version pin inside a dependency entry. + updated, count = re.subn( + r'^version = "[^"]*"', + f'version = "{new_version}"', + content, + count=1, + flags=re.MULTILINE, + ) + if count: + pyproject.write_text(updated) + return bool(count) + + def package_name_from(project_name): """Derive an importable package name from the repo name. @@ -120,3 +149,4 @@ def rename_python_src_directory(project_name): 'description = "A GitHub template for Maya Python tools"', f"description = {json.dumps(project_description or '')}", ) + reset_project_version() diff --git a/install_module.py b/install_module.py index d11e3da..f394e92 100644 --- a/install_module.py +++ b/install_module.py @@ -25,8 +25,12 @@ from pathlib import Path # Maya may both exec this file and call onMayaDroppedPythonFile for one drop, -# depending on version; the flag keeps that from installing twice. -_ALREADY_RAN = False +# depending on version; these keep that from installing twice. The cooldown +# (rather than a latching flag) lets a genuine later drop still install, since +# Maya keeps this module in sys.modules for the session. +_RUNNING = False +_LAST_RUN_ENDED = 0.0 +_REPEAT_WINDOW_SECONDS = 2.0 def _dialog( @@ -128,7 +132,12 @@ def _clear_readonly(func, path, _exc_info) -> None: path: Path that failed to remove. _exc_info: Unused exception info from rmtree. """ - os.chmod(path, stat.S_IWRITE) + if os.name == "nt": + os.chmod(path, stat.S_IWRITE) + else: + # chmod replaces the mode, so a flat S_IWRITE (0o200) would strip + # read/execute and leave a directory unusable. OR the bit in instead. + os.chmod(path, os.stat(path).st_mode | stat.S_IWUSR) func(path) @@ -259,12 +268,19 @@ def install() -> None: except RemoveBlockedError: traceback.print_exc() _dialog( - "Windows blocked removing the old install:\n\n" + "Couldn't remove the old install:\n\n" f"{dest_dir}\n\n" - "This is usually OneDrive syncing the folder. Pause OneDrive " - "syncing (cloud icon in the taskbar > Pause), close any " - "Explorer windows showing that folder, then run this " - "installer again.", + + ( + "This is usually OneDrive syncing the folder. Pause " + "OneDrive syncing (cloud icon in the taskbar > Pause), " + "close any Explorer windows showing that folder, then " + "run this installer again." + if os.name == "nt" + else "Something is holding the folder open, or you lack " + "write permission on it. Close anything using that " + "folder, check its permissions, then run this " + "installer again." + ), icon="critical", ) return @@ -280,10 +296,10 @@ def install() -> None: def _run_once() -> None: """Run ``install()`` at most once, reporting failures via dialog.""" - global _ALREADY_RAN - if _ALREADY_RAN: + global _RUNNING, _LAST_RUN_ENDED + if _RUNNING or time.monotonic() - _LAST_RUN_ENDED < _REPEAT_WINDOW_SECONDS: return - _ALREADY_RAN = True + _RUNNING = True try: install() except Exception: @@ -295,6 +311,9 @@ def _run_once() -> None: ) except Exception: pass + finally: + _RUNNING = False + _LAST_RUN_ENDED = time.monotonic() def onMayaDroppedPythonFile(*_args: object) -> None: diff --git a/mkdocs.yml b/mkdocs.yml index 155f184..5ddf732 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -13,6 +13,8 @@ plugins: default_handler: python handlers: python: + # Docs CI syncs only the docs group, so the project isn't installed. + paths: [src] options: show_source: true diff --git a/tests/template/test_initial_setup.py b/tests/template/test_initial_setup.py index f2f4f6d..06f6cb6 100644 --- a/tests/template/test_initial_setup.py +++ b/tests/template/test_initial_setup.py @@ -1,6 +1,14 @@ +from pathlib import Path + import pytest -from initial_setup import package_name_from, replace_text_in_file +from initial_setup import ( + package_name_from, + replace_text_in_file, + reset_project_version, +) + +REPO_ROOT = Path(__file__).resolve().parents[2] class TestPackageNameFrom: @@ -70,3 +78,73 @@ def test_replaces_real_literal_expects_mkdocs_site_name_updated(self, tmp_path): # Assert assert target.read_text() == "site_name: my-cool-tool\n" + + +class TestResetProjectVersion: + def test_template_version_expects_reset_to_zero(self, tmp_path): + # Arrange + target = tmp_path / "pyproject.toml" + target.write_text('[project]\nname = "x"\nversion = "2.0.0"\n') + + # Act + result = reset_project_version(root=tmp_path) + + # Assert + assert result is True + assert 'version = "0.0.0"' in target.read_text() + + def test_later_template_version_expects_reset_to_zero(self, tmp_path): + # Arrange: the literal moves as the template releases, so this must not + # be matched by value. + target = tmp_path / "pyproject.toml" + target.write_text('[project]\nname = "x"\nversion = "2.4.1"\n') + + # Act + reset_project_version(root=tmp_path) + + # Assert + assert 'version = "0.0.0"' in target.read_text() + + def test_other_version_keys_expects_left_untouched(self, tmp_path): + # Arrange + target = tmp_path / "pyproject.toml" + target.write_text( + '[project]\nversion = "2.0.0"\n' + 'dependencies = ["foo==1.2.3", "bar>=9.9.9"]\n\n' + '[tool.other]\nversion = "8.8.8"\n' + ) + + # Act + reset_project_version(root=tmp_path) + + # Assert + content = target.read_text() + assert 'version = "0.0.0"' in content + assert '"foo==1.2.3"' in content + assert '[tool.other]\nversion = "8.8.8"' in content + + def test_no_version_line_expects_false_and_no_write(self, tmp_path): + # Arrange + target = tmp_path / "pyproject.toml" + target.write_text('[project]\nname = "x"\n') + + # Act + result = reset_project_version(root=tmp_path) + + # Assert + assert result is False + assert target.read_text() == '[project]\nname = "x"\n' + + def test_repo_pyproject_expects_version_matched(self, tmp_path): + # Arrange: guards against the real pyproject.toml drifting to a format + # the pattern no longer matches, which would silently ship generated + # projects on the template's own version. + target = tmp_path / "pyproject.toml" + target.write_text((REPO_ROOT / "pyproject.toml").read_text()) + + # Act + result = reset_project_version(root=tmp_path) + + # Assert + assert result is True + assert 'version = "0.0.0"' in target.read_text() diff --git a/uv.lock b/uv.lock index 8eb0187..accfedc 100644 --- a/uv.lock +++ b/uv.lock @@ -313,7 +313,7 @@ wheels = [ [[package]] name = "mayapythonprojecttemplate" -version = "0.0.0" +version = "2.0.0" source = { editable = "." } [package.dev-dependencies]