From 1c2b2929e9141ae05211ae20380b12ebf7e2bfaf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hubert=20Bry=C5=82kowski?= Date: Sun, 9 Jul 2023 15:36:04 +0200 Subject: [PATCH 01/10] add action for building docker --- .github/workflows/build_docker.yml | 46 ++++++++++++++++++++++++++++++ Dockerfile | 13 +++++++++ readme.md | 0 3 files changed, 59 insertions(+) create mode 100644 .github/workflows/build_docker.yml create mode 100644 Dockerfile create mode 100644 readme.md diff --git a/.github/workflows/build_docker.yml b/.github/workflows/build_docker.yml new file mode 100644 index 0000000..5b90237 --- /dev/null +++ b/.github/workflows/build_docker.yml @@ -0,0 +1,46 @@ +# This workflow uses actions that are not certified by GitHub. +# They are provided by a third-party and are governed by +# separate terms of service, privacy policy, and support +# documentation. + +# GitHub recommends pinning actions to a commit SHA. +# To get a newer version, you will need to update the SHA. +# You can also reference a tag or branch, but the action may change without warning. + +name: Publish Docker image + +on: + release: + types: [published] + +jobs: + push_to_registries: + name: Push Docker image to multiple registries + runs-on: ubuntu-latest + permissions: + packages: write + contents: read + steps: + - name: Check out the repo + uses: actions/checkout@v3 + + - name: Log in to the Container registry + uses: docker/login-action@65b78e6e13532edd9afa3aa52ac7964289d1a9c1 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Extract metadata (tags, labels) for Docker + id: meta + uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7 + with: + images: ghcr.io/${{ github.repository }} + + - name: Build and push Docker images + uses: docker/build-push-action@3b5e8027fcad23fda98b2e3ac259d8d67585f671 + with: + context: . + push: true + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..d8ebb90 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,13 @@ +FROM python:3.11 + +RUN mkdir /app COPY /app /app +COPY pyproject.toml poetry.lock /app/ + +WORKDIR /app + +ENV PYTHONPATH=${PYTHONPATH}:${PWD} +RUN pip install poetry + +RUN poetry config virtualenvs.create false +RUN poetry install --no-dev + diff --git a/readme.md b/readme.md new file mode 100644 index 0000000..e69de29 From aaf143899050f81984025479b6ac4327826363aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hubert=20Bry=C5=82kowski?= Date: Sun, 9 Jul 2023 15:37:03 +0200 Subject: [PATCH 02/10] build on every push --- .github/workflows/build_docker.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build_docker.yml b/.github/workflows/build_docker.yml index 5b90237..8e18e3a 100644 --- a/.github/workflows/build_docker.yml +++ b/.github/workflows/build_docker.yml @@ -10,8 +10,9 @@ name: Publish Docker image on: - release: - types: [published] + push: + branches: + - main jobs: push_to_registries: From ef8b051b337eb8cf4d19886881d4ae063583d99f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hubert=20Bry=C5=82kowski?= Date: Sun, 9 Jul 2023 15:46:02 +0200 Subject: [PATCH 03/10] simplified dockerfile --- Dockerfile | 6 +- poetry.lock | 724 +++++++++++++++++++++++++++++++++++++++++++++++++ pyproject.toml | 23 ++ 3 files changed, 751 insertions(+), 2 deletions(-) create mode 100644 poetry.lock create mode 100644 pyproject.toml diff --git a/Dockerfile b/Dockerfile index d8ebb90..35efae7 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,8 @@ FROM python:3.11 -RUN mkdir /app COPY /app /app +RUN mkdir /app +COPY /labeler /app + COPY pyproject.toml poetry.lock /app/ WORKDIR /app @@ -9,5 +11,5 @@ ENV PYTHONPATH=${PYTHONPATH}:${PWD} RUN pip install poetry RUN poetry config virtualenvs.create false -RUN poetry install --no-dev +RUN poetry install --only main diff --git a/poetry.lock b/poetry.lock new file mode 100644 index 0000000..8e1ad09 --- /dev/null +++ b/poetry.lock @@ -0,0 +1,724 @@ +# This file is automatically @generated by Poetry 1.5.1 and should not be changed by hand. + +[[package]] +name = "anyio" +version = "3.7.1" +description = "High level compatibility layer for multiple asynchronous event loop implementations" +optional = false +python-versions = ">=3.7" +files = [ + {file = "anyio-3.7.1-py3-none-any.whl", hash = "sha256:91dee416e570e92c64041bd18b900d1d6fa78dff7048769ce5ac5ddad004fbb5"}, + {file = "anyio-3.7.1.tar.gz", hash = "sha256:44a3c9aba0f5defa43261a8b3efb97891f2bd7d804e0e1f56419befa1adfc780"}, +] + +[package.dependencies] +idna = ">=2.8" +sniffio = ">=1.1" + +[package.extras] +doc = ["Sphinx", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme (>=1.2.2)", "sphinxcontrib-jquery"] +test = ["anyio[trio]", "coverage[toml] (>=4.5)", "hypothesis (>=4.0)", "mock (>=4)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] +trio = ["trio (<0.22)"] + +[[package]] +name = "attrs" +version = "23.1.0" +description = "Classes Without Boilerplate" +optional = false +python-versions = ">=3.7" +files = [ + {file = "attrs-23.1.0-py3-none-any.whl", hash = "sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04"}, + {file = "attrs-23.1.0.tar.gz", hash = "sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015"}, +] + +[package.extras] +cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] +dev = ["attrs[docs,tests]", "pre-commit"] +docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] +tests = ["attrs[tests-no-zope]", "zope-interface"] +tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] + +[[package]] +name = "black" +version = "23.3.0" +description = "The uncompromising code formatter." +optional = false +python-versions = ">=3.7" +files = [ + {file = "black-23.3.0-cp310-cp310-macosx_10_16_arm64.whl", hash = "sha256:0945e13506be58bf7db93ee5853243eb368ace1c08a24c65ce108986eac65915"}, + {file = "black-23.3.0-cp310-cp310-macosx_10_16_universal2.whl", hash = "sha256:67de8d0c209eb5b330cce2469503de11bca4085880d62f1628bd9972cc3366b9"}, + {file = "black-23.3.0-cp310-cp310-macosx_10_16_x86_64.whl", hash = "sha256:7c3eb7cea23904399866c55826b31c1f55bbcd3890ce22ff70466b907b6775c2"}, + {file = "black-23.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:32daa9783106c28815d05b724238e30718f34155653d4d6e125dc7daec8e260c"}, + {file = "black-23.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:35d1381d7a22cc5b2be2f72c7dfdae4072a3336060635718cc7e1ede24221d6c"}, + {file = "black-23.3.0-cp311-cp311-macosx_10_16_arm64.whl", hash = "sha256:a8a968125d0a6a404842fa1bf0b349a568634f856aa08ffaff40ae0dfa52e7c6"}, + {file = "black-23.3.0-cp311-cp311-macosx_10_16_universal2.whl", hash = "sha256:c7ab5790333c448903c4b721b59c0d80b11fe5e9803d8703e84dcb8da56fec1b"}, + {file = "black-23.3.0-cp311-cp311-macosx_10_16_x86_64.whl", hash = "sha256:a6f6886c9869d4daae2d1715ce34a19bbc4b95006d20ed785ca00fa03cba312d"}, + {file = "black-23.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f3c333ea1dd6771b2d3777482429864f8e258899f6ff05826c3a4fcc5ce3f70"}, + {file = "black-23.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:11c410f71b876f961d1de77b9699ad19f939094c3a677323f43d7a29855fe326"}, + {file = "black-23.3.0-cp37-cp37m-macosx_10_16_x86_64.whl", hash = "sha256:1d06691f1eb8de91cd1b322f21e3bfc9efe0c7ca1f0e1eb1db44ea367dff656b"}, + {file = "black-23.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:50cb33cac881766a5cd9913e10ff75b1e8eb71babf4c7104f2e9c52da1fb7de2"}, + {file = "black-23.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:e114420bf26b90d4b9daa597351337762b63039752bdf72bf361364c1aa05925"}, + {file = "black-23.3.0-cp38-cp38-macosx_10_16_arm64.whl", hash = "sha256:48f9d345675bb7fbc3dd85821b12487e1b9a75242028adad0333ce36ed2a6d27"}, + {file = "black-23.3.0-cp38-cp38-macosx_10_16_universal2.whl", hash = "sha256:714290490c18fb0126baa0fca0a54ee795f7502b44177e1ce7624ba1c00f2331"}, + {file = "black-23.3.0-cp38-cp38-macosx_10_16_x86_64.whl", hash = "sha256:064101748afa12ad2291c2b91c960be28b817c0c7eaa35bec09cc63aa56493c5"}, + {file = "black-23.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:562bd3a70495facf56814293149e51aa1be9931567474993c7942ff7d3533961"}, + {file = "black-23.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:e198cf27888ad6f4ff331ca1c48ffc038848ea9f031a3b40ba36aced7e22f2c8"}, + {file = "black-23.3.0-cp39-cp39-macosx_10_16_arm64.whl", hash = "sha256:3238f2aacf827d18d26db07524e44741233ae09a584273aa059066d644ca7b30"}, + {file = "black-23.3.0-cp39-cp39-macosx_10_16_universal2.whl", hash = "sha256:f0bd2f4a58d6666500542b26354978218a9babcdc972722f4bf90779524515f3"}, + {file = "black-23.3.0-cp39-cp39-macosx_10_16_x86_64.whl", hash = "sha256:92c543f6854c28a3c7f39f4d9b7694f9a6eb9d3c5e2ece488c327b6e7ea9b266"}, + {file = "black-23.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a150542a204124ed00683f0db1f5cf1c2aaaa9cc3495b7a3b5976fb136090ab"}, + {file = "black-23.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:6b39abdfb402002b8a7d030ccc85cf5afff64ee90fa4c5aebc531e3ad0175ddb"}, + {file = "black-23.3.0-py3-none-any.whl", hash = "sha256:ec751418022185b0c1bb7d7736e6933d40bbb14c14a0abcf9123d1b159f98dd4"}, + {file = "black-23.3.0.tar.gz", hash = "sha256:1c7b8d606e728a41ea1ccbd7264677e494e87cf630e399262ced92d4a8dac940"}, +] + +[package.dependencies] +click = ">=8.0.0" +mypy-extensions = ">=0.4.3" +packaging = ">=22.0" +pathspec = ">=0.9.0" +platformdirs = ">=2" + +[package.extras] +colorama = ["colorama (>=0.4.3)"] +d = ["aiohttp (>=3.7.4)"] +jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] +uvloop = ["uvloop (>=0.15.2)"] + +[[package]] +name = "brother-ql" +version = "1.0.4" +description = "Python package to talk to Brother QL label printers" +optional = false +python-versions = "*" +files = [] +develop = false + +[package.dependencies] +attrs = "*" +click = "*" +future = "*" +packbits = "*" +pillow = ">=3.3.0" +pyusb = "*" + +[package.source] +type = "git" +url = "https://github.com/archetipo/brother_ql" +reference = "HEAD" +resolved_reference = "02395c70e8609ac23ec3f8b57551b67b520b483b" + +[[package]] +name = "certifi" +version = "2023.5.7" +description = "Python package for providing Mozilla's CA Bundle." +optional = false +python-versions = ">=3.6" +files = [ + {file = "certifi-2023.5.7-py3-none-any.whl", hash = "sha256:c6c2e98f5c7869efca1f8916fed228dd91539f9f1b444c314c06eef02980c716"}, + {file = "certifi-2023.5.7.tar.gz", hash = "sha256:0f0d56dc5a6ad56fd4ba36484d6cc34451e1c6548c61daad8c320169f91eddc7"}, +] + +[[package]] +name = "click" +version = "8.1.4" +description = "Composable command line interface toolkit" +optional = false +python-versions = ">=3.7" +files = [ + {file = "click-8.1.4-py3-none-any.whl", hash = "sha256:2739815aaa5d2c986a88f1e9230c55e17f0caad3d958a5e13ad0797c166db9e3"}, + {file = "click-8.1.4.tar.gz", hash = "sha256:b97d0c74955da062a7d4ef92fadb583806a585b2ea81958a81bd72726cbb8e37"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "fastapi" +version = "0.99.1" +description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" +optional = false +python-versions = ">=3.7" +files = [ + {file = "fastapi-0.99.1-py3-none-any.whl", hash = "sha256:976df7bab51ac7beda9f68c4513b8c4490b5c1135c72aafd0a5ee4023ec5282e"}, + {file = "fastapi-0.99.1.tar.gz", hash = "sha256:ac78f717cd80d657bd183f94d33b9bda84aa376a46a9dab513586b8eef1dc6fc"}, +] + +[package.dependencies] +pydantic = ">=1.7.4,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0" +starlette = ">=0.27.0,<0.28.0" +typing-extensions = ">=4.5.0" + +[package.extras] +all = ["email-validator (>=1.1.1)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=2.11.2)", "orjson (>=3.2.1)", "python-multipart (>=0.0.5)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"] + +[[package]] +name = "future" +version = "0.18.3" +description = "Clean single-source support for Python 3 and 2" +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "future-0.18.3.tar.gz", hash = "sha256:34a17436ed1e96697a86f9de3d15a3b0be01d8bc8de9c1dffd59fb8234ed5307"}, +] + +[[package]] +name = "h11" +version = "0.14.0" +description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" +optional = false +python-versions = ">=3.7" +files = [ + {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, + {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, +] + +[[package]] +name = "httpcore" +version = "0.17.3" +description = "A minimal low-level HTTP client." +optional = false +python-versions = ">=3.7" +files = [ + {file = "httpcore-0.17.3-py3-none-any.whl", hash = "sha256:c2789b767ddddfa2a5782e3199b2b7f6894540b17b16ec26b2c4d8e103510b87"}, + {file = "httpcore-0.17.3.tar.gz", hash = "sha256:a6f30213335e34c1ade7be6ec7c47f19f50c56db36abef1a9dfa3815b1cb3888"}, +] + +[package.dependencies] +anyio = ">=3.0,<5.0" +certifi = "*" +h11 = ">=0.13,<0.15" +sniffio = "==1.*" + +[package.extras] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (==1.*)"] + +[[package]] +name = "httpx" +version = "0.24.1" +description = "The next generation HTTP client." +optional = false +python-versions = ">=3.7" +files = [ + {file = "httpx-0.24.1-py3-none-any.whl", hash = "sha256:06781eb9ac53cde990577af654bd990a4949de37a28bdb4a230d434f3a30b9bd"}, + {file = "httpx-0.24.1.tar.gz", hash = "sha256:5853a43053df830c20f8110c5e69fe44d035d850b2dfe795e196f00fdb774bdd"}, +] + +[package.dependencies] +certifi = "*" +httpcore = ">=0.15.0,<0.18.0" +idna = "*" +sniffio = "*" + +[package.extras] +brotli = ["brotli", "brotlicffi"] +cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (==1.*)"] + +[[package]] +name = "idna" +version = "3.4" +description = "Internationalized Domain Names in Applications (IDNA)" +optional = false +python-versions = ">=3.5" +files = [ + {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, + {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, +] + +[[package]] +name = "iniconfig" +version = "2.0.0" +description = "brain-dead simple config-ini parsing" +optional = false +python-versions = ">=3.7" +files = [ + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, +] + +[[package]] +name = "jinja2" +version = "3.1.2" +description = "A very fast and expressive template engine." +optional = false +python-versions = ">=3.7" +files = [ + {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, + {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, +] + +[package.dependencies] +MarkupSafe = ">=2.0" + +[package.extras] +i18n = ["Babel (>=2.7)"] + +[[package]] +name = "markupsafe" +version = "2.1.3" +description = "Safely add untrusted strings to HTML/XML markup." +optional = false +python-versions = ">=3.7" +files = [ + {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-win32.whl", hash = "sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-win_amd64.whl", hash = "sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-win32.whl", hash = "sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-win_amd64.whl", hash = "sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-win32.whl", hash = "sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-win_amd64.whl", hash = "sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-win32.whl", hash = "sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-win_amd64.whl", hash = "sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba"}, + {file = "MarkupSafe-2.1.3.tar.gz", hash = "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad"}, +] + +[[package]] +name = "mypy-extensions" +version = "1.0.0" +description = "Type system extensions for programs checked with the mypy type checker." +optional = false +python-versions = ">=3.5" +files = [ + {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, + {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, +] + +[[package]] +name = "packaging" +version = "23.1" +description = "Core utilities for Python packages" +optional = false +python-versions = ">=3.7" +files = [ + {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"}, + {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, +] + +[[package]] +name = "packbits" +version = "0.6" +description = "PackBits encoder/decoder" +optional = false +python-versions = "*" +files = [ + {file = "packbits-0.6.tar.gz", hash = "sha256:bc6b370bb34e04ac8cfa835e06c0484380affc6d593adb8009dd6c0f7bfff034"}, +] + +[[package]] +name = "pathspec" +version = "0.11.1" +description = "Utility library for gitignore style pattern matching of file paths." +optional = false +python-versions = ">=3.7" +files = [ + {file = "pathspec-0.11.1-py3-none-any.whl", hash = "sha256:d8af70af76652554bd134c22b3e8a1cc46ed7d91edcdd721ef1a0c51a84a5293"}, + {file = "pathspec-0.11.1.tar.gz", hash = "sha256:2798de800fa92780e33acca925945e9a19a133b715067cf165b8866c15a31687"}, +] + +[[package]] +name = "pillow" +version = "9.5.0" +description = "Python Imaging Library (Fork)" +optional = false +python-versions = ">=3.7" +files = [ + {file = "Pillow-9.5.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:ace6ca218308447b9077c14ea4ef381ba0b67ee78d64046b3f19cf4e1139ad16"}, + {file = "Pillow-9.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d3d403753c9d5adc04d4694d35cf0391f0f3d57c8e0030aac09d7678fa8030aa"}, + {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ba1b81ee69573fe7124881762bb4cd2e4b6ed9dd28c9c60a632902fe8db8b38"}, + {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fe7e1c262d3392afcf5071df9afa574544f28eac825284596ac6db56e6d11062"}, + {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f36397bf3f7d7c6a3abdea815ecf6fd14e7fcd4418ab24bae01008d8d8ca15e"}, + {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:252a03f1bdddce077eff2354c3861bf437c892fb1832f75ce813ee94347aa9b5"}, + {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:85ec677246533e27770b0de5cf0f9d6e4ec0c212a1f89dfc941b64b21226009d"}, + {file = "Pillow-9.5.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b416f03d37d27290cb93597335a2f85ed446731200705b22bb927405320de903"}, + {file = "Pillow-9.5.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1781a624c229cb35a2ac31cc4a77e28cafc8900733a864870c49bfeedacd106a"}, + {file = "Pillow-9.5.0-cp310-cp310-win32.whl", hash = "sha256:8507eda3cd0608a1f94f58c64817e83ec12fa93a9436938b191b80d9e4c0fc44"}, + {file = "Pillow-9.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:d3c6b54e304c60c4181da1c9dadf83e4a54fd266a99c70ba646a9baa626819eb"}, + {file = "Pillow-9.5.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:7ec6f6ce99dab90b52da21cf0dc519e21095e332ff3b399a357c187b1a5eee32"}, + {file = "Pillow-9.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:560737e70cb9c6255d6dcba3de6578a9e2ec4b573659943a5e7e4af13f298f5c"}, + {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:96e88745a55b88a7c64fa49bceff363a1a27d9a64e04019c2281049444a571e3"}, + {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d9c206c29b46cfd343ea7cdfe1232443072bbb270d6a46f59c259460db76779a"}, + {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cfcc2c53c06f2ccb8976fb5c71d448bdd0a07d26d8e07e321c103416444c7ad1"}, + {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:a0f9bb6c80e6efcde93ffc51256d5cfb2155ff8f78292f074f60f9e70b942d99"}, + {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:8d935f924bbab8f0a9a28404422da8af4904e36d5c33fc6f677e4c4485515625"}, + {file = "Pillow-9.5.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:fed1e1cf6a42577953abbe8e6cf2fe2f566daebde7c34724ec8803c4c0cda579"}, + {file = "Pillow-9.5.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c1170d6b195555644f0616fd6ed929dfcf6333b8675fcca044ae5ab110ded296"}, + {file = "Pillow-9.5.0-cp311-cp311-win32.whl", hash = "sha256:54f7102ad31a3de5666827526e248c3530b3a33539dbda27c6843d19d72644ec"}, + {file = "Pillow-9.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:cfa4561277f677ecf651e2b22dc43e8f5368b74a25a8f7d1d4a3a243e573f2d4"}, + {file = "Pillow-9.5.0-cp311-cp311-win_arm64.whl", hash = "sha256:965e4a05ef364e7b973dd17fc765f42233415974d773e82144c9bbaaaea5d089"}, + {file = "Pillow-9.5.0-cp312-cp312-win32.whl", hash = "sha256:22baf0c3cf0c7f26e82d6e1adf118027afb325e703922c8dfc1d5d0156bb2eeb"}, + {file = "Pillow-9.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:432b975c009cf649420615388561c0ce7cc31ce9b2e374db659ee4f7d57a1f8b"}, + {file = "Pillow-9.5.0-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:5d4ebf8e1db4441a55c509c4baa7a0587a0210f7cd25fcfe74dbbce7a4bd1906"}, + {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:375f6e5ee9620a271acb6820b3d1e94ffa8e741c0601db4c0c4d3cb0a9c224bf"}, + {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:99eb6cafb6ba90e436684e08dad8be1637efb71c4f2180ee6b8f940739406e78"}, + {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2dfaaf10b6172697b9bceb9a3bd7b951819d1ca339a5ef294d1f1ac6d7f63270"}, + {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_28_aarch64.whl", hash = "sha256:763782b2e03e45e2c77d7779875f4432e25121ef002a41829d8868700d119392"}, + {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:35f6e77122a0c0762268216315bf239cf52b88865bba522999dc38f1c52b9b47"}, + {file = "Pillow-9.5.0-cp37-cp37m-win32.whl", hash = "sha256:aca1c196f407ec7cf04dcbb15d19a43c507a81f7ffc45b690899d6a76ac9fda7"}, + {file = "Pillow-9.5.0-cp37-cp37m-win_amd64.whl", hash = "sha256:322724c0032af6692456cd6ed554bb85f8149214d97398bb80613b04e33769f6"}, + {file = "Pillow-9.5.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:a0aa9417994d91301056f3d0038af1199eb7adc86e646a36b9e050b06f526597"}, + {file = "Pillow-9.5.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f8286396b351785801a976b1e85ea88e937712ee2c3ac653710a4a57a8da5d9c"}, + {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c830a02caeb789633863b466b9de10c015bded434deb3ec87c768e53752ad22a"}, + {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fbd359831c1657d69bb81f0db962905ee05e5e9451913b18b831febfe0519082"}, + {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8fc330c3370a81bbf3f88557097d1ea26cd8b019d6433aa59f71195f5ddebbf"}, + {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:7002d0797a3e4193c7cdee3198d7c14f92c0836d6b4a3f3046a64bd1ce8df2bf"}, + {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:229e2c79c00e85989a34b5981a2b67aa079fd08c903f0aaead522a1d68d79e51"}, + {file = "Pillow-9.5.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9adf58f5d64e474bed00d69bcd86ec4bcaa4123bfa70a65ce72e424bfb88ed96"}, + {file = "Pillow-9.5.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:662da1f3f89a302cc22faa9f14a262c2e3951f9dbc9617609a47521c69dd9f8f"}, + {file = "Pillow-9.5.0-cp38-cp38-win32.whl", hash = "sha256:6608ff3bf781eee0cd14d0901a2b9cc3d3834516532e3bd673a0a204dc8615fc"}, + {file = "Pillow-9.5.0-cp38-cp38-win_amd64.whl", hash = "sha256:e49eb4e95ff6fd7c0c402508894b1ef0e01b99a44320ba7d8ecbabefddcc5569"}, + {file = "Pillow-9.5.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:482877592e927fd263028c105b36272398e3e1be3269efda09f6ba21fd83ec66"}, + {file = "Pillow-9.5.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3ded42b9ad70e5f1754fb7c2e2d6465a9c842e41d178f262e08b8c85ed8a1d8e"}, + {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c446d2245ba29820d405315083d55299a796695d747efceb5717a8b450324115"}, + {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8aca1152d93dcc27dc55395604dcfc55bed5f25ef4c98716a928bacba90d33a3"}, + {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:608488bdcbdb4ba7837461442b90ea6f3079397ddc968c31265c1e056964f1ef"}, + {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:60037a8db8750e474af7ffc9faa9b5859e6c6d0a50e55c45576bf28be7419705"}, + {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:07999f5834bdc404c442146942a2ecadd1cb6292f5229f4ed3b31e0a108746b1"}, + {file = "Pillow-9.5.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a127ae76092974abfbfa38ca2d12cbeddcdeac0fb71f9627cc1135bedaf9d51a"}, + {file = "Pillow-9.5.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:489f8389261e5ed43ac8ff7b453162af39c3e8abd730af8363587ba64bb2e865"}, + {file = "Pillow-9.5.0-cp39-cp39-win32.whl", hash = "sha256:9b1af95c3a967bf1da94f253e56b6286b50af23392a886720f563c547e48e964"}, + {file = "Pillow-9.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:77165c4a5e7d5a284f10a6efaa39a0ae8ba839da344f20b111d62cc932fa4e5d"}, + {file = "Pillow-9.5.0-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:833b86a98e0ede388fa29363159c9b1a294b0905b5128baf01db683672f230f5"}, + {file = "Pillow-9.5.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aaf305d6d40bd9632198c766fb64f0c1a83ca5b667f16c1e79e1661ab5060140"}, + {file = "Pillow-9.5.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0852ddb76d85f127c135b6dd1f0bb88dbb9ee990d2cd9aa9e28526c93e794fba"}, + {file = "Pillow-9.5.0-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:91ec6fe47b5eb5a9968c79ad9ed78c342b1f97a091677ba0e012701add857829"}, + {file = "Pillow-9.5.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:cb841572862f629b99725ebaec3287fc6d275be9b14443ea746c1dd325053cbd"}, + {file = "Pillow-9.5.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:c380b27d041209b849ed246b111b7c166ba36d7933ec6e41175fd15ab9eb1572"}, + {file = "Pillow-9.5.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7c9af5a3b406a50e313467e3565fc99929717f780164fe6fbb7704edba0cebbe"}, + {file = "Pillow-9.5.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5671583eab84af046a397d6d0ba25343c00cd50bce03787948e0fff01d4fd9b1"}, + {file = "Pillow-9.5.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:84a6f19ce086c1bf894644b43cd129702f781ba5751ca8572f08aa40ef0ab7b7"}, + {file = "Pillow-9.5.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:1e7723bd90ef94eda669a3c2c19d549874dd5badaeefabefd26053304abe5799"}, + {file = "Pillow-9.5.0.tar.gz", hash = "sha256:bf548479d336726d7a0eceb6e767e179fbde37833ae42794602631a070d630f1"}, +] + +[package.extras] +docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-removed-in", "sphinxext-opengraph"] +tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] + +[[package]] +name = "platformdirs" +version = "3.8.1" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +optional = false +python-versions = ">=3.7" +files = [ + {file = "platformdirs-3.8.1-py3-none-any.whl", hash = "sha256:cec7b889196b9144d088e4c57d9ceef7374f6c39694ad1577a0aab50d27ea28c"}, + {file = "platformdirs-3.8.1.tar.gz", hash = "sha256:f87ca4fcff7d2b0f81c6a748a77973d7af0f4d526f98f308477c3c436c74d528"}, +] + +[package.extras] +docs = ["furo (>=2023.5.20)", "proselint (>=0.13)", "sphinx (>=7.0.1)", "sphinx-autodoc-typehints (>=1.23,!=1.23.4)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.3.1)", "pytest-cov (>=4.1)", "pytest-mock (>=3.10)"] + +[[package]] +name = "pluggy" +version = "1.2.0" +description = "plugin and hook calling mechanisms for python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pluggy-1.2.0-py3-none-any.whl", hash = "sha256:c2fd55a7d7a3863cba1a013e4e2414658b1d07b6bc57b3919e0c63c9abb99849"}, + {file = "pluggy-1.2.0.tar.gz", hash = "sha256:d12f0c4b579b15f5e054301bb226ee85eeeba08ffec228092f8defbaa3a4c4b3"}, +] + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + +[[package]] +name = "ply" +version = "3.11" +description = "Python Lex & Yacc" +optional = false +python-versions = "*" +files = [ + {file = "ply-3.11-py2.py3-none-any.whl", hash = "sha256:096f9b8350b65ebd2fd1346b12452efe5b9607f7482813ffca50c22722a807ce"}, + {file = "ply-3.11.tar.gz", hash = "sha256:00c7c1aaa88358b9c765b6d3000c6eec0ba42abca5351b095321aef446081da3"}, +] + +[[package]] +name = "pyasn1" +version = "0.5.0" +description = "Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208)" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +files = [ + {file = "pyasn1-0.5.0-py2.py3-none-any.whl", hash = "sha256:87a2121042a1ac9358cabcaf1d07680ff97ee6404333bacca15f76aa8ad01a57"}, + {file = "pyasn1-0.5.0.tar.gz", hash = "sha256:97b7290ca68e62a832558ec3976f15cbf911bf5d7c7039d8b861c2a0ece69fde"}, +] + +[[package]] +name = "pycryptodomex" +version = "3.18.0" +description = "Cryptographic library for Python" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "pycryptodomex-3.18.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:160a39a708c36fa0b168ab79386dede588e62aec06eb505add870739329aecc6"}, + {file = "pycryptodomex-3.18.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:c2953afebf282a444c51bf4effe751706b4d0d63d7ca2cc51db21f902aa5b84e"}, + {file = "pycryptodomex-3.18.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:ba95abd563b0d1b88401658665a260852a8e6c647026ee6a0a65589287681df8"}, + {file = "pycryptodomex-3.18.0-cp27-cp27m-manylinux2014_aarch64.whl", hash = "sha256:192306cf881fe3467dda0e174a4f47bb3a8bb24b90c9cdfbdc248eec5fc0578c"}, + {file = "pycryptodomex-3.18.0-cp27-cp27m-musllinux_1_1_aarch64.whl", hash = "sha256:f9ab5ef0718f6a8716695dea16d83b671b22c45e9c0c78fd807c32c0192e54b5"}, + {file = "pycryptodomex-3.18.0-cp27-cp27m-win32.whl", hash = "sha256:50308fcdbf8345e5ec224a5502b4215178bdb5e95456ead8ab1a69ffd94779cb"}, + {file = "pycryptodomex-3.18.0-cp27-cp27m-win_amd64.whl", hash = "sha256:4d9379c684efea80fdab02a3eb0169372bca7db13f9332cb67483b8dc8b67c37"}, + {file = "pycryptodomex-3.18.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:5594a125dae30d60e94f37797fc67ce3c744522de7992c7c360d02fdb34918f8"}, + {file = "pycryptodomex-3.18.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:8ff129a5a0eb5ff16e45ca4fa70a6051da7f3de303c33b259063c19be0c43d35"}, + {file = "pycryptodomex-3.18.0-cp27-cp27mu-manylinux2014_aarch64.whl", hash = "sha256:3d9314ac785a5b75d5aaf924c5f21d6ca7e8df442e5cf4f0fefad4f6e284d422"}, + {file = "pycryptodomex-3.18.0-cp27-cp27mu-musllinux_1_1_aarch64.whl", hash = "sha256:f237278836dda412a325e9340ba2e6a84cb0f56b9244781e5b61f10b3905de88"}, + {file = "pycryptodomex-3.18.0-cp35-abi3-macosx_10_9_universal2.whl", hash = "sha256:ac614363a86cc53d8ba44b6c469831d1555947e69ab3276ae8d6edc219f570f7"}, + {file = "pycryptodomex-3.18.0-cp35-abi3-macosx_10_9_x86_64.whl", hash = "sha256:302a8f37c224e7b5d72017d462a2be058e28f7be627bdd854066e16722d0fc0c"}, + {file = "pycryptodomex-3.18.0-cp35-abi3-manylinux2014_aarch64.whl", hash = "sha256:6421d23d6a648e83ba2670a352bcd978542dad86829209f59d17a3f087f4afef"}, + {file = "pycryptodomex-3.18.0-cp35-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d84e105787f5e5d36ec6a581ff37a1048d12e638688074b2a00bcf402f9aa1c2"}, + {file = "pycryptodomex-3.18.0-cp35-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6875eb8666f68ddbd39097867325bd22771f595b4e2b0149739b5623c8bf899b"}, + {file = "pycryptodomex-3.18.0-cp35-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:27072a494ce621cc7a9096bbf60ed66826bb94db24b49b7359509e7951033e74"}, + {file = "pycryptodomex-3.18.0-cp35-abi3-musllinux_1_1_i686.whl", hash = "sha256:1949e09ea49b09c36d11a951b16ff2a05a0ffe969dda1846e4686ee342fe8646"}, + {file = "pycryptodomex-3.18.0-cp35-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:6ed3606832987018615f68e8ed716a7065c09a0fe94afd7c9ca1b6777f0ac6eb"}, + {file = "pycryptodomex-3.18.0-cp35-abi3-win32.whl", hash = "sha256:d56c9ec41258fd3734db9f5e4d2faeabe48644ba9ca23b18e1839b3bdf093222"}, + {file = "pycryptodomex-3.18.0-cp35-abi3-win_amd64.whl", hash = "sha256:e00a4bacb83a2627e8210cb353a2e31f04befc1155db2976e5e239dd66482278"}, + {file = "pycryptodomex-3.18.0-pp27-pypy_73-manylinux2010_x86_64.whl", hash = "sha256:2dc4eab20f4f04a2d00220fdc9258717b82d31913552e766d5f00282c031b70a"}, + {file = "pycryptodomex-3.18.0-pp27-pypy_73-win32.whl", hash = "sha256:75672205148bdea34669173366df005dbd52be05115e919551ee97171083423d"}, + {file = "pycryptodomex-3.18.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:bec6c80994d4e7a38312072f89458903b65ec99bed2d65aa4de96d997a53ea7a"}, + {file = "pycryptodomex-3.18.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d35a8ffdc8b05e4b353ba281217c8437f02c57d7233363824e9d794cf753c419"}, + {file = "pycryptodomex-3.18.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:76f0a46bee539dae4b3dfe37216f678769349576b0080fdbe431d19a02da42ff"}, + {file = "pycryptodomex-3.18.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:71687eed47df7e965f6e0bf3cadef98f368d5221f0fb89d2132effe1a3e6a194"}, + {file = "pycryptodomex-3.18.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:73d64b32d84cf48d9ec62106aa277dbe99ab5fbfd38c5100bc7bddd3beb569f7"}, + {file = "pycryptodomex-3.18.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbdcce0a226d9205560a5936b05208c709b01d493ed8307792075dedfaaffa5f"}, + {file = "pycryptodomex-3.18.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58fc0aceb9c961b9897facec9da24c6a94c5db04597ec832060f53d4d6a07196"}, + {file = "pycryptodomex-3.18.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:215be2980a6b70704c10796dd7003eb4390e7be138ac6fb8344bf47e71a8d470"}, + {file = "pycryptodomex-3.18.0.tar.gz", hash = "sha256:3e3ecb5fe979e7c1bb0027e518340acf7ee60415d79295e5251d13c68dde576e"}, +] + +[[package]] +name = "pydantic" +version = "1.10.11" +description = "Data validation and settings management using python type hints" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pydantic-1.10.11-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ff44c5e89315b15ff1f7fdaf9853770b810936d6b01a7bcecaa227d2f8fe444f"}, + {file = "pydantic-1.10.11-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a6c098d4ab5e2d5b3984d3cb2527e2d6099d3de85630c8934efcfdc348a9760e"}, + {file = "pydantic-1.10.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:16928fdc9cb273c6af00d9d5045434c39afba5f42325fb990add2c241402d151"}, + {file = "pydantic-1.10.11-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0588788a9a85f3e5e9ebca14211a496409cb3deca5b6971ff37c556d581854e7"}, + {file = "pydantic-1.10.11-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e9baf78b31da2dc3d3f346ef18e58ec5f12f5aaa17ac517e2ffd026a92a87588"}, + {file = "pydantic-1.10.11-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:373c0840f5c2b5b1ccadd9286782852b901055998136287828731868027a724f"}, + {file = "pydantic-1.10.11-cp310-cp310-win_amd64.whl", hash = "sha256:c3339a46bbe6013ef7bdd2844679bfe500347ac5742cd4019a88312aa58a9847"}, + {file = "pydantic-1.10.11-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:08a6c32e1c3809fbc49debb96bf833164f3438b3696abf0fbeceb417d123e6eb"}, + {file = "pydantic-1.10.11-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a451ccab49971af043ec4e0d207cbc8cbe53dbf148ef9f19599024076fe9c25b"}, + {file = "pydantic-1.10.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5b02d24f7b2b365fed586ed73582c20f353a4c50e4be9ba2c57ab96f8091ddae"}, + {file = "pydantic-1.10.11-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3f34739a89260dfa420aa3cbd069fbcc794b25bbe5c0a214f8fb29e363484b66"}, + {file = "pydantic-1.10.11-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:e297897eb4bebde985f72a46a7552a7556a3dd11e7f76acda0c1093e3dbcf216"}, + {file = "pydantic-1.10.11-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d185819a7a059550ecb85d5134e7d40f2565f3dd94cfd870132c5f91a89cf58c"}, + {file = "pydantic-1.10.11-cp311-cp311-win_amd64.whl", hash = "sha256:4400015f15c9b464c9db2d5d951b6a780102cfa5870f2c036d37c23b56f7fc1b"}, + {file = "pydantic-1.10.11-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2417de68290434461a266271fc57274a138510dca19982336639484c73a07af6"}, + {file = "pydantic-1.10.11-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:331c031ba1554b974c98679bd0780d89670d6fd6f53f5d70b10bdc9addee1713"}, + {file = "pydantic-1.10.11-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8268a735a14c308923e8958363e3a3404f6834bb98c11f5ab43251a4e410170c"}, + {file = "pydantic-1.10.11-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:44e51ba599c3ef227e168424e220cd3e544288c57829520dc90ea9cb190c3248"}, + {file = "pydantic-1.10.11-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d7781f1d13b19700b7949c5a639c764a077cbbdd4322ed505b449d3ca8edcb36"}, + {file = "pydantic-1.10.11-cp37-cp37m-win_amd64.whl", hash = "sha256:7522a7666157aa22b812ce14c827574ddccc94f361237ca6ea8bb0d5c38f1629"}, + {file = "pydantic-1.10.11-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bc64eab9b19cd794a380179ac0e6752335e9555d214cfcb755820333c0784cb3"}, + {file = "pydantic-1.10.11-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8dc77064471780262b6a68fe67e013298d130414d5aaf9b562c33987dbd2cf4f"}, + {file = "pydantic-1.10.11-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe429898f2c9dd209bd0632a606bddc06f8bce081bbd03d1c775a45886e2c1cb"}, + {file = "pydantic-1.10.11-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:192c608ad002a748e4a0bed2ddbcd98f9b56df50a7c24d9a931a8c5dd053bd3d"}, + {file = "pydantic-1.10.11-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ef55392ec4bb5721f4ded1096241e4b7151ba6d50a50a80a2526c854f42e6a2f"}, + {file = "pydantic-1.10.11-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:41e0bb6efe86281623abbeeb0be64eab740c865388ee934cd3e6a358784aca6e"}, + {file = "pydantic-1.10.11-cp38-cp38-win_amd64.whl", hash = "sha256:265a60da42f9f27e0b1014eab8acd3e53bd0bad5c5b4884e98a55f8f596b2c19"}, + {file = "pydantic-1.10.11-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:469adf96c8e2c2bbfa655fc7735a2a82f4c543d9fee97bd113a7fb509bf5e622"}, + {file = "pydantic-1.10.11-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e6cbfbd010b14c8a905a7b10f9fe090068d1744d46f9e0c021db28daeb8b6de1"}, + {file = "pydantic-1.10.11-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:abade85268cc92dff86d6effcd917893130f0ff516f3d637f50dadc22ae93999"}, + {file = "pydantic-1.10.11-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e9738b0f2e6c70f44ee0de53f2089d6002b10c33264abee07bdb5c7f03038303"}, + {file = "pydantic-1.10.11-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:787cf23e5a0cde753f2eabac1b2e73ae3844eb873fd1f5bdbff3048d8dbb7604"}, + {file = "pydantic-1.10.11-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:174899023337b9fc685ac8adaa7b047050616136ccd30e9070627c1aaab53a13"}, + {file = "pydantic-1.10.11-cp39-cp39-win_amd64.whl", hash = "sha256:1954f8778489a04b245a1e7b8b22a9d3ea8ef49337285693cf6959e4b757535e"}, + {file = "pydantic-1.10.11-py3-none-any.whl", hash = "sha256:008c5e266c8aada206d0627a011504e14268a62091450210eda7c07fabe6963e"}, + {file = "pydantic-1.10.11.tar.gz", hash = "sha256:f66d479cf7eb331372c470614be6511eae96f1f120344c25f3f9bb59fb1b5528"}, +] + +[package.dependencies] +typing-extensions = ">=4.2.0" + +[package.extras] +dotenv = ["python-dotenv (>=0.10.4)"] +email = ["email-validator (>=1.0.3)"] + +[[package]] +name = "pysmi" +version = "0.3.4" +description = "SNMP SMI/MIB Parser" +optional = false +python-versions = "*" +files = [ + {file = "pysmi-0.3.4-py2.py3-none-any.whl", hash = "sha256:2ec6ebd41aaef562695e7d0058763c6e1e8c1fbf8710804c11ef3a857fc9cad7"}, + {file = "pysmi-0.3.4.tar.gz", hash = "sha256:bd15a15020aee8376cab5be264c26330824a8b8164ed0195bd402dd59e4e8f7c"}, +] + +[package.dependencies] +ply = "*" + +[[package]] +name = "pysnmp" +version = "4.4.12" +description = "SNMP library for Python" +optional = false +python-versions = "*" +files = [ + {file = "pysnmp-4.4.12-py2.py3-none-any.whl", hash = "sha256:d90946c5d7c55b1ddc03e065a99a2ed36e748dcf166ca04ee4126b8f25fc057a"}, + {file = "pysnmp-4.4.12.tar.gz", hash = "sha256:0c3dbef2f958caca96071fe5c19de43e9c1b0484ab02a0cf08b190bcee768ba9"}, +] + +[package.dependencies] +pyasn1 = ">=0.2.3" +pycryptodomex = "*" +pysmi = "*" + +[[package]] +name = "pytest" +version = "7.4.0" +description = "pytest: simple powerful testing with Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pytest-7.4.0-py3-none-any.whl", hash = "sha256:78bf16451a2eb8c7a2ea98e32dc119fd2aa758f1d5d66dbf0a59d69a3969df32"}, + {file = "pytest-7.4.0.tar.gz", hash = "sha256:b4bf8c45bd59934ed84001ad51e11b4ee40d40a1229d2c79f9c592b0a3f6bd8a"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=0.12,<2.0" + +[package.extras] +testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] + +[[package]] +name = "python-telegram-bot" +version = "20.4" +description = "We have made you a wrapper you can't refuse" +optional = false +python-versions = ">=3.8" +files = [ + {file = "python-telegram-bot-20.4.tar.gz", hash = "sha256:a6ac3f9c9674aaf7d1c7e652d8b75cde969fb872f75e9521b8516eceaba82b1b"}, + {file = "python_telegram_bot-20.4-py3-none-any.whl", hash = "sha256:e426404b0006989a5bcc05e11a7ef3ffe0c086b684a4e963db5bda1d361a049a"}, +] + +[package.dependencies] +httpx = ">=0.24.1,<0.25.0" + +[package.extras] +all = ["APScheduler (>=3.10.1,<3.11.0)", "aiolimiter (>=1.1.0,<1.2.0)", "cachetools (>=5.3.1,<5.4.0)", "cryptography (>=39.0.1)", "httpx[http2]", "httpx[socks]", "pytz (>=2018.6)", "tornado (>=6.2,<7.0)"] +callback-data = ["cachetools (>=5.3.1,<5.4.0)"] +ext = ["APScheduler (>=3.10.1,<3.11.0)", "aiolimiter (>=1.1.0,<1.2.0)", "cachetools (>=5.3.1,<5.4.0)", "pytz (>=2018.6)", "tornado (>=6.2,<7.0)"] +http2 = ["httpx[http2]"] +job-queue = ["APScheduler (>=3.10.1,<3.11.0)", "pytz (>=2018.6)"] +passport = ["cryptography (>=39.0.1)"] +rate-limiter = ["aiolimiter (>=1.1.0,<1.2.0)"] +socks = ["httpx[socks]"] +webhooks = ["tornado (>=6.2,<7.0)"] + +[[package]] +name = "pyusb" +version = "1.2.1" +description = "Python USB access module" +optional = false +python-versions = ">=3.6.0" +files = [ + {file = "pyusb-1.2.1-py3-none-any.whl", hash = "sha256:2b4c7cb86dbadf044dfb9d3a4ff69fd217013dbe78a792177a3feb172449ea36"}, + {file = "pyusb-1.2.1.tar.gz", hash = "sha256:a4cc7404a203144754164b8b40994e2849fde1cfff06b08492f12fff9d9de7b9"}, +] + +[[package]] +name = "sniffio" +version = "1.3.0" +description = "Sniff out which async library your code is running under" +optional = false +python-versions = ">=3.7" +files = [ + {file = "sniffio-1.3.0-py3-none-any.whl", hash = "sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384"}, + {file = "sniffio-1.3.0.tar.gz", hash = "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101"}, +] + +[[package]] +name = "starlette" +version = "0.27.0" +description = "The little ASGI library that shines." +optional = false +python-versions = ">=3.7" +files = [ + {file = "starlette-0.27.0-py3-none-any.whl", hash = "sha256:918416370e846586541235ccd38a474c08b80443ed31c578a418e2209b3eef91"}, + {file = "starlette-0.27.0.tar.gz", hash = "sha256:6a6b0d042acb8d469a01eba54e9cda6cbd24ac602c4cd016723117d6a7e73b75"}, +] + +[package.dependencies] +anyio = ">=3.4.0,<5" + +[package.extras] +full = ["httpx (>=0.22.0)", "itsdangerous", "jinja2", "python-multipart", "pyyaml"] + +[[package]] +name = "typing-extensions" +version = "4.7.1" +description = "Backported and Experimental Type Hints for Python 3.7+" +optional = false +python-versions = ">=3.7" +files = [ + {file = "typing_extensions-4.7.1-py3-none-any.whl", hash = "sha256:440d5dd3af93b060174bf433bccd69b0babc3b15b1a8dca43789fd7f61514b36"}, + {file = "typing_extensions-4.7.1.tar.gz", hash = "sha256:b75ddc264f0ba5615db7ba217daeb99701ad295353c45f9e95963337ceeeffb2"}, +] + +[metadata] +lock-version = "2.0" +python-versions = "^3.11" +content-hash = "1937f9f1c025ae74edea552506772b52a303ca0435d67da173c690b73415266b" diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..e90b203 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,23 @@ +[tool.poetry] +name = "python-scratchpad" +version = "0.1.0" +description = "" +authors = ["Hubert Bryłkowski "] +readme = "README.md" + +[tool.poetry.dependencies] +python = "^3.11" +brother-ql = {git = "https://github.com/archetipo/brother_ql"} +jinja2 = "^3.1.2" +pillow = "^9.5.0" +pysnmp = "^4.4.12" +python-telegram-bot = "^20.3" +fastapi = "^0.99.1" + +[tool.poetry.group.dev.dependencies] +pytest = "^7.4.0" +black = "^23.3.0" + +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api" From 56af39791e3a2fc97e62bb2609af8d555e462bbe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hubert=20Bry=C5=82kowski?= Date: Sun, 9 Jul 2023 16:00:49 +0200 Subject: [PATCH 04/10] starter docs --- Dockerfile | 2 +- poetry.lock | 12 ++++++------ pyproject.toml | 1 + readme.md | 29 +++++++++++++++++++++++++++++ 4 files changed, 37 insertions(+), 7 deletions(-) diff --git a/Dockerfile b/Dockerfile index 35efae7..327c715 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,7 @@ FROM python:3.11 RUN mkdir /app -COPY /labeler /app +COPY / /app COPY pyproject.toml poetry.lock /app/ diff --git a/poetry.lock b/poetry.lock index 8e1ad09..f0286ce 100644 --- a/poetry.lock +++ b/poetry.lock @@ -491,13 +491,13 @@ files = [ [[package]] name = "pyasn1" -version = "0.5.0" -description = "Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208)" +version = "0.4.8" +description = "ASN.1 types and codecs" optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +python-versions = "*" files = [ - {file = "pyasn1-0.5.0-py2.py3-none-any.whl", hash = "sha256:87a2121042a1ac9358cabcaf1d07680ff97ee6404333bacca15f76aa8ad01a57"}, - {file = "pyasn1-0.5.0.tar.gz", hash = "sha256:97b7290ca68e62a832558ec3976f15cbf911bf5d7c7039d8b861c2a0ece69fde"}, + {file = "pyasn1-0.4.8-py2.py3-none-any.whl", hash = "sha256:39c7e2ec30515947ff4e87fb6f456dfc6e84857d34be479c9d4a4ba4bf46aa5d"}, + {file = "pyasn1-0.4.8.tar.gz", hash = "sha256:aef77c9fb94a3ac588e87841208bdec464471d9871bd5050a287cc9a475cd0ba"}, ] [[package]] @@ -721,4 +721,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = "^3.11" -content-hash = "1937f9f1c025ae74edea552506772b52a303ca0435d67da173c690b73415266b" +content-hash = "9467b5a8ad9e1ddc4068bf23b85f7e13050fae63d92db59034153fbfab7f09f7" diff --git a/pyproject.toml b/pyproject.toml index e90b203..6e17479 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -11,6 +11,7 @@ brother-ql = {git = "https://github.com/archetipo/brother_ql"} jinja2 = "^3.1.2" pillow = "^9.5.0" pysnmp = "^4.4.12" +pyasn1 = "0.4.8" python-telegram-bot = "^20.3" fastapi = "^0.99.1" diff --git a/readme.md b/readme.md index e69de29..1427050 100644 --- a/readme.md +++ b/readme.md @@ -0,0 +1,29 @@ +## labeling telegram bot + +This application is build to render and print labels sent to it via telegram, as well +as provide info about printer status and other useful information. + +### usage example +You need to things: +1. A telegram bot token, you can write to [@BotFather](https://t.me/BotFather) to get one +2. A compatible printer +3. docker installed on your system + +```yaml +version: "3.8" +services: + bot: + build: + context: . + dockerfile: Dockerfile + environment: + - PRINTER_IP= + - TELEGRAM_TOKEN= + command: + - python + - labeler/adapter/telegram_bot.py + +``` + +### Supported printers +- Brother PT-E550W \ No newline at end of file From a3a1c567e18a46097cc893eb2719ca056564bd52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hubert=20Bry=C5=82kowski?= Date: Sun, 9 Jul 2023 16:02:14 +0200 Subject: [PATCH 05/10] listed supported commands --- readme.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/readme.md b/readme.md index 1427050..838fb5d 100644 --- a/readme.md +++ b/readme.md @@ -3,6 +3,10 @@ This application is build to render and print labels sent to it via telegram, as well as provide info about printer status and other useful information. + +## Supported commands +- `/media_info` - show info about currently installed media + ### usage example You need to things: 1. A telegram bot token, you can write to [@BotFather](https://t.me/BotFather) to get one From ff55c26d7b6dd6428648b43dfad4398a171a4959 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hubert=20Bry=C5=82kowski?= Date: Sun, 9 Jul 2023 17:32:08 +0200 Subject: [PATCH 06/10] added support for printing simple labels --- labeler/adapter/telegram_bot.py | 60 +++++++++++++++++++++++++- labeler/app/labeler.py | 38 +++++++++++++--- labeler/domain/objects.py | 5 ++- labeler/infra/e550w_printer/printer.py | 57 ++++++++++++++++++++++-- labeler/interfaces.py | 4 ++ readme.md | 1 + 6 files changed, 151 insertions(+), 14 deletions(-) diff --git a/labeler/adapter/telegram_bot.py b/labeler/adapter/telegram_bot.py index a3f8739..ca24fa4 100644 --- a/labeler/adapter/telegram_bot.py +++ b/labeler/adapter/telegram_bot.py @@ -1,6 +1,14 @@ import os -from telegram.ext import CommandHandler, ApplicationBuilder +from telegram import Update +from telegram.ext import ( + CommandHandler, + ApplicationBuilder, + ConversationHandler, + CallbackContext, + filters, + MessageHandler, +) from labeler.app.labeler import Application from labeler.infra.e550w_printer.printer import E550W @@ -8,19 +16,67 @@ from labeler.infra.renderer import PILRenderer class LabelingBot: - def __init__(self, app): + def __init__(self, app: Application): self.app = app async def media_info(self, update, context): media = self.app.get_installed_media() await update.message.reply_text(f"Installed media: {media.description}") + async def label_length(self, update, context): + await update.message.reply_text( + "Hello! Please tell me the length of the label, enter 0 for auto:" + ) + return LABEL_LENGTH + + async def label_text(self, update: Update, context: CallbackContext) -> int: + user_input = update.message.text + context.user_data["length"] = int(user_input) + await update.message.reply_text("Now, please tell me the text of the label:") + return LABEL_TEXT + + async def simple_label(self, update: Update, context: CallbackContext) -> int: + user_input = update.message.text + context.user_data["label"] = user_input + try: + label = self.app.print_label( + text=context.user_data["label"], length=context.user_data["length"] + ) + except Exception as e: + await update.message.reply_text(f"There was an exception: {e}") + return ConversationHandler.END + + await update.message.reply_photo( + label.bytes, f'Your label is: {context.user_data["label"]}' + ) + return ConversationHandler.END + + async def cancel(self, update: Update, context: CallbackContext) -> int: + await update.message.reply_text("Cancelled.") + return ConversationHandler.END + if __name__ == "__main__": application = Application(PILRenderer(), E550W(os.environ.get("PRINTER_IP"))) bot = LabelingBot(application) + LABEL_LENGTH, LABEL_TEXT = range(2) + + conv_handler = ConversationHandler( + entry_points=[CommandHandler("simple_label", bot.label_length)], + states={ + LABEL_LENGTH: [ + MessageHandler(filters.Text() & ~filters.Command(), bot.label_text) + ], + LABEL_TEXT: [ + MessageHandler(filters.Text() & ~filters.Command(), bot.simple_label) + ], + }, + fallbacks=[CommandHandler("cancel", bot.cancel)], + ) + app = ApplicationBuilder().token(os.environ["TELEGRAM_TOKEN"]).build() app.add_handler(CommandHandler("media_info", bot.media_info)) + app.add_handler(conv_handler) app.run_polling() diff --git a/labeler/app/labeler.py b/labeler/app/labeler.py index 9dea496..fe6d53c 100644 --- a/labeler/app/labeler.py +++ b/labeler/app/labeler.py @@ -1,4 +1,11 @@ -from labeler.domain.objects import Label, LabelRequest, LabelDefinition, MediaDefinition +from labeler.domain.objects import ( + Label, + LabelRequest, + LabelDefinition, + MediaDefinition, + Dimension, + Image, +) from labeler.interfaces import Renderer, Printer @@ -7,16 +14,16 @@ class Application: self.renderer = renderer self.printer = printer - def render_preview(self, label_request: LabelRequest): + def render_preview(self, text: str, length: int = None) -> Label: media = self.printer.get_installed_media() - if label_request.length is not None: - label_length = label_request.length - 2 * media.minimal_margin_horizontal + if length != 0: + label_length = Dimension(mm=length) - 2 * media.minimal_margin_horizontal else: - label_length = media.printable_length + label_length = None label_definition = LabelDefinition( - text=label_request.text, + text=text, length=label_length, width=media.printable_width, dpi=media.dpi, @@ -24,5 +31,24 @@ class Application: self.renderer.render_label(label_definition) + def print_label(self, text: str, length: int = None) -> Image: + media = self.printer.get_installed_media() + + if length != 0: + label_length = Dimension(mm=length) - 2 * media.minimal_margin_horizontal + else: + label_length = None + + label_definition = LabelDefinition( + text=text, + length=label_length, + width=media.printable_width, + dpi=media.dpi, + ) + + label = self.renderer.render_label(label_definition) + self.printer.print_label(label) + return label + def get_installed_media(self) -> MediaDefinition: return self.printer.get_installed_media() diff --git a/labeler/domain/objects.py b/labeler/domain/objects.py index a9a1cbe..7d4c0c6 100644 --- a/labeler/domain/objects.py +++ b/labeler/domain/objects.py @@ -107,16 +107,17 @@ class MediaDefinition(BaseModel): length: Dimension minimal_margin_vertical: Dimension minimal_margin_horizontal: Dimension + minimum_length: Dimension = Field(default_factory=lambda: Dimension(mm=5)) dpi: int description: str @property def printable_width(self) -> Dimension: - return self.width - 2 * self.minimal_margin_horizontal + return self.width - 2 * self.minimal_margin_vertical @property def printable_length(self) -> Dimension: - return self.length - 2 * self.minimal_margin_vertical + return self.length - 2 * self.minimal_margin_horizontal class Label(BaseModel): diff --git a/labeler/infra/e550w_printer/printer.py b/labeler/infra/e550w_printer/printer.py index a7be38b..affe0f7 100644 --- a/labeler/infra/e550w_printer/printer.py +++ b/labeler/infra/e550w_printer/printer.py @@ -1,10 +1,14 @@ +import io +import logging from math import inf +from brother_ql import BrotherQLRaster, create_label +from brother_ql.backends import guess_backend, backend_factory from pysnmp.entity.engine import SnmpEngine from pysnmp.hlapi import getCmd, CommunityData, UdpTransportTarget, ContextData from pysnmp.smi.rfc1902 import ObjectType, ObjectIdentity -from labeler.domain.objects import MediaDefinition, Dimension +from labeler.domain.objects import MediaDefinition, Dimension, Image from labeler.infra.e550w_printer.media_definitions import ( media_width, tape_color, @@ -16,6 +20,12 @@ from labeler.infra.e550w_printer.media_definitions import ( TYPE_BYTE, ) from labeler.interfaces import Printer +from PIL import Image as PILImage + +PRINTABLE_WIDTH = { + 12: Dimension.from_points(150, 360), + 24: Dimension.from_points(320, 360), +} class E550W(Printer): @@ -26,6 +36,45 @@ class E550W(Printer): def get_installed_media(self) -> MediaDefinition: return self.__get_printer_status() + def print_label(self, label: Image): + im = PILImage.open(io.BytesIO(label.bytes)) + + qlr = BrotherQLRaster("PT-E550W") + create_label( + qlr, + im, + self.__media_width_to_type(label.height), + red=False, + threshold=70, + cut=True, + rotate=270, + compress=True, + dpi_600=True, + hq=True, + ) + + try: + try: + selected_backend = guess_backend(f"tcp://{self.ip_address}:9100") + except ValueError: + logging.error( + "Couln't guess the backend to use from the printer string descriptor" + ) + BACKEND_CLASS = backend_factory(selected_backend)["backend_class"] + be = BACKEND_CLASS(f"tcp://{self.ip_address}:9100") + be.write(qlr.data) + be.dispose() + del be + except Exception as e: + logging.exception("Exception happened: %s", e) + + def __media_width_to_type(self, height: int): + metric_width = Dimension.from_points(height, 360) + if metric_width == Dimension.from_points(150, 360): + return "pt512" + else: + raise ValueError(f"Unsupported media width: {metric_width}") + def __get_printer_status(self): raw_snmp_data = self.__get_snmp_status().asNumbers() width = media_width(raw_snmp_data[WIDTH_BYTE]) @@ -36,9 +85,9 @@ class E550W(Printer): return MediaDefinition( width=Dimension(mm=width), length=Dimension(mm=inf), - minimal_margin_vertical=Dimension(mm=1), - minimal_margin_horizontal=Dimension(mm=2), - dpi=600, + minimal_margin_vertical=(Dimension(mm=width) - PRINTABLE_WIDTH[width]) / 2, + minimal_margin_horizontal=Dimension(mm=1), + dpi=360, description=f"{tape_type} - {width}mm, {media_text_color} on {media_tape_color} background", ) diff --git a/labeler/interfaces.py b/labeler/interfaces.py index fdbc9d5..a88553d 100644 --- a/labeler/interfaces.py +++ b/labeler/interfaces.py @@ -13,3 +13,7 @@ class Printer(abc.ABC): @abc.abstractmethod def get_installed_media(self) -> MediaDefinition: pass + + @abc.abstractmethod + def print_label(self, label: Image): + pass diff --git a/readme.md b/readme.md index 838fb5d..0ec7733 100644 --- a/readme.md +++ b/readme.md @@ -6,6 +6,7 @@ as provide info about printer status and other useful information. ## Supported commands - `/media_info` - show info about currently installed media +- `/simple_label` - print a simple label ### usage example You need to things: From 34d65005a37a202dc22ed31e72a8450bc6d05e1e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hubert=20Bry=C5=82kowski?= Date: Sun, 9 Jul 2023 20:07:30 +0200 Subject: [PATCH 07/10] expand docs --- img.png | Bin 0 -> 10170 bytes img_1.png | Bin 0 -> 50687 bytes readme.md | 6 ++++-- 3 files changed, 4 insertions(+), 2 deletions(-) create mode 100644 img.png create mode 100644 img_1.png diff --git a/img.png b/img.png new file mode 100644 index 0000000000000000000000000000000000000000..3048372f3e407e89a00d400466ac51209d4ca8b7 GIT binary patch literal 10170 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

wPxL{w|?cD9NYy#}G($^{S=$Mo* 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 C3=gFM literal 0 HcmV?d00001 diff --git a/readme.md b/readme.md index 0ec7733..4406a7a 100644 --- a/readme.md +++ b/readme.md @@ -6,10 +6,12 @@ as provide info about printer status and other useful information. ## Supported commands - `/media_info` - show info about currently installed media +![img.png](img.png) - `/simple_label` - print a simple label +![img_1.png](img_1.png) -### usage example -You need to things: +### Usage example +You need three things: 1. A telegram bot token, you can write to [@BotFather](https://t.me/BotFather) to get one 2. A compatible printer 3. docker installed on your system From b4bf6552f6b1e63ae62da547ea8105132274684f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hubert=20Bry=C5=82kowski?= Date: Wed, 12 Jul 2023 18:49:21 +0200 Subject: [PATCH 08/10] support more tape widths --- docker-compose.yml | 12 ++++++ labeler/infra/e550w_printer/printer.py | 17 ++++---- poetry.lock | 57 ++++++++++++-------------- pyproject.toml | 2 +- 4 files changed, 50 insertions(+), 38 deletions(-) create mode 100644 docker-compose.yml diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..f0d3f49 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,12 @@ +version: "3.8" +services: + bot: + build: + context: . + dockerfile: Dockerfile + environment: + - PRINTER_IP=192.168.1.93 + - TELEGRAM_TOKEN=6386069775:AAFOQL7lIsDe_5njXptfOwmHWEVo_yyVAi4 + command: + - python + - labeler/adapter/telegram_bot.py \ No newline at end of file diff --git a/labeler/infra/e550w_printer/printer.py b/labeler/infra/e550w_printer/printer.py index affe0f7..f69f289 100644 --- a/labeler/infra/e550w_printer/printer.py +++ b/labeler/infra/e550w_printer/printer.py @@ -23,8 +23,11 @@ from labeler.interfaces import Printer from PIL import Image as PILImage PRINTABLE_WIDTH = { - 12: Dimension.from_points(150, 360), - 24: Dimension.from_points(320, 360), + 6: Dimension.from_points(64, 360), + 9: Dimension.from_points(100, 360), + 12: Dimension.from_points(140, 360), + 18: Dimension.from_points(224, 360), + 24: Dimension.from_points(256, 360), } @@ -47,7 +50,7 @@ class E550W(Printer): red=False, threshold=70, cut=True, - rotate=270, + rotate=90, compress=True, dpi_600=True, hq=True, @@ -70,10 +73,10 @@ class E550W(Printer): def __media_width_to_type(self, height: int): metric_width = Dimension.from_points(height, 360) - if metric_width == Dimension.from_points(150, 360): - return "pt512" - else: - raise ValueError(f"Unsupported media width: {metric_width}") + for width, printable_width in PRINTABLE_WIDTH.items(): + if printable_width == metric_width: + return f"pt5{width}" + raise ValueError(f"Unsupported media width: {metric_width}") def __get_printer_status(self): raw_snmp_data = self.__get_snmp_status().asNumbers() diff --git a/poetry.lock b/poetry.lock index f0286ce..d556631 100644 --- a/poetry.lock +++ b/poetry.lock @@ -40,36 +40,33 @@ tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pyte [[package]] name = "black" -version = "23.3.0" +version = "23.7.0" description = "The uncompromising code formatter." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "black-23.3.0-cp310-cp310-macosx_10_16_arm64.whl", hash = "sha256:0945e13506be58bf7db93ee5853243eb368ace1c08a24c65ce108986eac65915"}, - {file = "black-23.3.0-cp310-cp310-macosx_10_16_universal2.whl", hash = "sha256:67de8d0c209eb5b330cce2469503de11bca4085880d62f1628bd9972cc3366b9"}, - {file = "black-23.3.0-cp310-cp310-macosx_10_16_x86_64.whl", hash = "sha256:7c3eb7cea23904399866c55826b31c1f55bbcd3890ce22ff70466b907b6775c2"}, - {file = "black-23.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:32daa9783106c28815d05b724238e30718f34155653d4d6e125dc7daec8e260c"}, - {file = "black-23.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:35d1381d7a22cc5b2be2f72c7dfdae4072a3336060635718cc7e1ede24221d6c"}, - {file = "black-23.3.0-cp311-cp311-macosx_10_16_arm64.whl", hash = "sha256:a8a968125d0a6a404842fa1bf0b349a568634f856aa08ffaff40ae0dfa52e7c6"}, - {file = "black-23.3.0-cp311-cp311-macosx_10_16_universal2.whl", hash = "sha256:c7ab5790333c448903c4b721b59c0d80b11fe5e9803d8703e84dcb8da56fec1b"}, - {file = "black-23.3.0-cp311-cp311-macosx_10_16_x86_64.whl", hash = "sha256:a6f6886c9869d4daae2d1715ce34a19bbc4b95006d20ed785ca00fa03cba312d"}, - {file = "black-23.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f3c333ea1dd6771b2d3777482429864f8e258899f6ff05826c3a4fcc5ce3f70"}, - {file = "black-23.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:11c410f71b876f961d1de77b9699ad19f939094c3a677323f43d7a29855fe326"}, - {file = "black-23.3.0-cp37-cp37m-macosx_10_16_x86_64.whl", hash = "sha256:1d06691f1eb8de91cd1b322f21e3bfc9efe0c7ca1f0e1eb1db44ea367dff656b"}, - {file = "black-23.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:50cb33cac881766a5cd9913e10ff75b1e8eb71babf4c7104f2e9c52da1fb7de2"}, - {file = "black-23.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:e114420bf26b90d4b9daa597351337762b63039752bdf72bf361364c1aa05925"}, - {file = "black-23.3.0-cp38-cp38-macosx_10_16_arm64.whl", hash = "sha256:48f9d345675bb7fbc3dd85821b12487e1b9a75242028adad0333ce36ed2a6d27"}, - {file = "black-23.3.0-cp38-cp38-macosx_10_16_universal2.whl", hash = "sha256:714290490c18fb0126baa0fca0a54ee795f7502b44177e1ce7624ba1c00f2331"}, - {file = "black-23.3.0-cp38-cp38-macosx_10_16_x86_64.whl", hash = "sha256:064101748afa12ad2291c2b91c960be28b817c0c7eaa35bec09cc63aa56493c5"}, - {file = "black-23.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:562bd3a70495facf56814293149e51aa1be9931567474993c7942ff7d3533961"}, - {file = "black-23.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:e198cf27888ad6f4ff331ca1c48ffc038848ea9f031a3b40ba36aced7e22f2c8"}, - {file = "black-23.3.0-cp39-cp39-macosx_10_16_arm64.whl", hash = "sha256:3238f2aacf827d18d26db07524e44741233ae09a584273aa059066d644ca7b30"}, - {file = "black-23.3.0-cp39-cp39-macosx_10_16_universal2.whl", hash = "sha256:f0bd2f4a58d6666500542b26354978218a9babcdc972722f4bf90779524515f3"}, - {file = "black-23.3.0-cp39-cp39-macosx_10_16_x86_64.whl", hash = "sha256:92c543f6854c28a3c7f39f4d9b7694f9a6eb9d3c5e2ece488c327b6e7ea9b266"}, - {file = "black-23.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a150542a204124ed00683f0db1f5cf1c2aaaa9cc3495b7a3b5976fb136090ab"}, - {file = "black-23.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:6b39abdfb402002b8a7d030ccc85cf5afff64ee90fa4c5aebc531e3ad0175ddb"}, - {file = "black-23.3.0-py3-none-any.whl", hash = "sha256:ec751418022185b0c1bb7d7736e6933d40bbb14c14a0abcf9123d1b159f98dd4"}, - {file = "black-23.3.0.tar.gz", hash = "sha256:1c7b8d606e728a41ea1ccbd7264677e494e87cf630e399262ced92d4a8dac940"}, + {file = "black-23.7.0-cp310-cp310-macosx_10_16_arm64.whl", hash = "sha256:5c4bc552ab52f6c1c506ccae05681fab58c3f72d59ae6e6639e8885e94fe2587"}, + {file = "black-23.7.0-cp310-cp310-macosx_10_16_universal2.whl", hash = "sha256:552513d5cd5694590d7ef6f46e1767a4df9af168d449ff767b13b084c020e63f"}, + {file = "black-23.7.0-cp310-cp310-macosx_10_16_x86_64.whl", hash = "sha256:86cee259349b4448adb4ef9b204bb4467aae74a386bce85d56ba4f5dc0da27be"}, + {file = "black-23.7.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:501387a9edcb75d7ae8a4412bb8749900386eaef258f1aefab18adddea1936bc"}, + {file = "black-23.7.0-cp310-cp310-win_amd64.whl", hash = "sha256:fb074d8b213749fa1d077d630db0d5f8cc3b2ae63587ad4116e8a436e9bbe995"}, + {file = "black-23.7.0-cp311-cp311-macosx_10_16_arm64.whl", hash = "sha256:b5b0ee6d96b345a8b420100b7d71ebfdd19fab5e8301aff48ec270042cd40ac2"}, + {file = "black-23.7.0-cp311-cp311-macosx_10_16_universal2.whl", hash = "sha256:893695a76b140881531062d48476ebe4a48f5d1e9388177e175d76234ca247cd"}, + {file = "black-23.7.0-cp311-cp311-macosx_10_16_x86_64.whl", hash = "sha256:c333286dc3ddca6fdff74670b911cccedacb4ef0a60b34e491b8a67c833b343a"}, + {file = "black-23.7.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:831d8f54c3a8c8cf55f64d0422ee875eecac26f5f649fb6c1df65316b67c8926"}, + {file = "black-23.7.0-cp311-cp311-win_amd64.whl", hash = "sha256:7f3bf2dec7d541b4619b8ce526bda74a6b0bffc480a163fed32eb8b3c9aed8ad"}, + {file = "black-23.7.0-cp38-cp38-macosx_10_16_arm64.whl", hash = "sha256:f9062af71c59c004cd519e2fb8f5d25d39e46d3af011b41ab43b9c74e27e236f"}, + {file = "black-23.7.0-cp38-cp38-macosx_10_16_universal2.whl", hash = "sha256:01ede61aac8c154b55f35301fac3e730baf0c9cf8120f65a9cd61a81cfb4a0c3"}, + {file = "black-23.7.0-cp38-cp38-macosx_10_16_x86_64.whl", hash = "sha256:327a8c2550ddc573b51e2c352adb88143464bb9d92c10416feb86b0f5aee5ff6"}, + {file = "black-23.7.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d1c6022b86f83b632d06f2b02774134def5d4d4f1dac8bef16d90cda18ba28a"}, + {file = "black-23.7.0-cp38-cp38-win_amd64.whl", hash = "sha256:27eb7a0c71604d5de083757fbdb245b1a4fae60e9596514c6ec497eb63f95320"}, + {file = "black-23.7.0-cp39-cp39-macosx_10_16_arm64.whl", hash = "sha256:8417dbd2f57b5701492cd46edcecc4f9208dc75529bcf76c514864e48da867d9"}, + {file = "black-23.7.0-cp39-cp39-macosx_10_16_universal2.whl", hash = "sha256:47e56d83aad53ca140da0af87678fb38e44fd6bc0af71eebab2d1f59b1acf1d3"}, + {file = "black-23.7.0-cp39-cp39-macosx_10_16_x86_64.whl", hash = "sha256:25cc308838fe71f7065df53aedd20327969d05671bac95b38fdf37ebe70ac087"}, + {file = "black-23.7.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:642496b675095d423f9b8448243336f8ec71c9d4d57ec17bf795b67f08132a91"}, + {file = "black-23.7.0-cp39-cp39-win_amd64.whl", hash = "sha256:ad0014efc7acf0bd745792bd0d8857413652979200ab924fbf239062adc12491"}, + {file = "black-23.7.0-py3-none-any.whl", hash = "sha256:9fd59d418c60c0348505f2ddf9609c1e1de8e7493eab96198fc89d9f865e7a96"}, + {file = "black-23.7.0.tar.gz", hash = "sha256:022a582720b0d9480ed82576c920a8c1dde97cc38ff11d8d8859b3bd6ca9eedb"}, ] [package.dependencies] @@ -104,9 +101,9 @@ pyusb = "*" [package.source] type = "git" -url = "https://github.com/archetipo/brother_ql" +url = "https://github.com/hbrylkowski/brother_ql" reference = "HEAD" -resolved_reference = "02395c70e8609ac23ec3f8b57551b67b520b483b" +resolved_reference = "4225d13d209e8e4a2c17e87a75f42809e0da8fda" [[package]] name = "certifi" @@ -721,4 +718,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = "^3.11" -content-hash = "9467b5a8ad9e1ddc4068bf23b85f7e13050fae63d92db59034153fbfab7f09f7" +content-hash = "0d8fef37d593ec1da3be93986b3808e68a983d7e0c4ecc88560b8dcf8a47ed04" diff --git a/pyproject.toml b/pyproject.toml index 6e17479..c955dd2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -7,7 +7,7 @@ readme = "README.md" [tool.poetry.dependencies] python = "^3.11" -brother-ql = {git = "https://github.com/archetipo/brother_ql"} +brother-ql = {git = "https://github.com/hbrylkowski/brother_ql"} jinja2 = "^3.1.2" pillow = "^9.5.0" pysnmp = "^4.4.12" From 783d9b6d34bc81edd06b00d5b7b69ab4b927cb13 Mon Sep 17 00:00:00 2001 From: Piotr Gaczkowski Date: Tue, 24 Mar 2026 14:27:32 +0100 Subject: [PATCH 09/10] feat: Add Web iface with QR codes --- labeler/adapter/cli.py | 75 ++ labeler/adapter/fastapi.py | 0 labeler/adapter/fastapi_srv.py | 80 ++ labeler/app/labeler.py | 36 + labeler/infra/e550w_printer/printer.py | 5 +- labeler/infra/renderer.py | 48 +- labeler/interfaces.py | 4 + poetry.lock | 721 ----------------- pyproject.toml | 37 +- uv.lock | 1026 ++++++++++++++++++++++++ 10 files changed, 1293 insertions(+), 739 deletions(-) create mode 100644 labeler/adapter/cli.py delete mode 100644 labeler/adapter/fastapi.py create mode 100644 labeler/adapter/fastapi_srv.py delete mode 100644 poetry.lock create mode 100644 uv.lock diff --git a/labeler/adapter/cli.py b/labeler/adapter/cli.py new file mode 100644 index 0000000..624770c --- /dev/null +++ b/labeler/adapter/cli.py @@ -0,0 +1,75 @@ +import os + +from labeler.app.labeler import Application +from labeler.infra.e550w_printer.printer import E550W +from labeler.infra.renderer import PILRenderer + + +class LabelingBot: + def __init__(self, app: Application): + self.app = app + + def media_info(self): + media = self.app.get_installed_media() + print(f"Installed medium: {media}") + + def simple_label(self, label_text, label_length=0): + try: + label = self.app.print_label(text=label_text, length=label_length) + except Exception as e: + print(f"There was an exception: {e}") + + def get_qrcode(self, label_text, label_length=0): + label = self.app.render_qrcode_preview(text=label_text, length=label_length) + return label + + def print_qrcode(self, label_text, label_length=0): + try: + label = self.app.print_qrcode(text=label_text, length=label_length) + except Exception as e: + print(f"There was an exception: {e}") + + # async def label_length(self): + # await update.message.reply_text( + # "Hello! Please tell me the length of the label, enter 0 for auto:" + # ) + # return LABEL_LENGTH + # + # async def label_text(self, update: Update, context: CallbackContext) -> int: + # user_input = update.message.text + # context.user_data["length"] = int(user_input) + # await update.message.reply_text("Now, please tell me the text of the label:") + # return LABEL_TEXT + # + # async def simple_label(self, update: Update, context: CallbackContext) -> int: + # user_input = update.message.text + # context.user_data["label"] = user_input + # try: + # label = self.app.print_label( + # text=context.user_data["label"], length=context.user_data["length"] + # ) + # except Exception as e: + # await update.message.reply_text(f"There was an exception: {e}") + # return ConversationHandler.END + # + # await update.message.reply_photo( + # label.bytes, f'Your label is: {context.user_data["label"]}' + # ) + # return ConversationHandler.END + # + # async def cancel(self, update: Update, context: CallbackContext) -> int: + # await update.message.reply_text("Cancelled.") + # return ConversationHandler.END + + +if __name__ == "__main__": + application = Application(PILRenderer(), E550W(os.environ.get("PRINTER_IP"))) + bot = LabelingBot(application) + + LABEL_LENGTH, LABEL_TEXT = range(2) + + bot.media_info() + label = bot.get_qrcode("512", 25) + with open("label.png", "wb") as preview: + preview.write(label.bytes) + label = bot.print_qrcode("512", 25) diff --git a/labeler/adapter/fastapi.py b/labeler/adapter/fastapi.py deleted file mode 100644 index e69de29..0000000 diff --git a/labeler/adapter/fastapi_srv.py b/labeler/adapter/fastapi_srv.py new file mode 100644 index 0000000..2ba98a8 --- /dev/null +++ b/labeler/adapter/fastapi_srv.py @@ -0,0 +1,80 @@ +import os + +from labeler.app.labeler import Application +from labeler.infra.e550w_printer.printer import E550W +from labeler.infra.renderer import PILRenderer + +from fastapi import FastAPI + +app = FastAPI() + + +class LabelingBot: + def __init__(self, app: Application): + self.app = app + + def media_info(self): + media = self.app.get_installed_media() + print(f"Installed medium: {media}") + + def simple_label(self, label_text, label_length=0): + try: + label = self.app.print_label(text=label_text, length=label_length) + except Exception as e: + print(f"There was an exception: {e}") + + def get_qrcode(self, label_text, label_length=0): + label = self.app.render_qrcode_preview(text=label_text, length=label_length) + return label + + def print_qrcode(self, label_text, label_length=0): + try: + label = self.app.print_qrcode(text=label_text, length=label_length) + except Exception as e: + print(f"There was an exception: {e}") + + # async def label_length(self): + # await update.message.reply_text( + # "Hello! Please tell me the length of the label, enter 0 for auto:" + # ) + # return LABEL_LENGTH + # + # async def label_text(self, update: Update, context: CallbackContext) -> int: + # user_input = update.message.text + # context.user_data["length"] = int(user_input) + # await update.message.reply_text("Now, please tell me the text of the label:") + # return LABEL_TEXT + # + # async def simple_label(self, update: Update, context: CallbackContext) -> int: + # user_input = update.message.text + # context.user_data["label"] = user_input + # try: + # label = self.app.print_label( + # text=context.user_data["label"], length=context.user_data["length"] + # ) + # except Exception as e: + # await update.message.reply_text(f"There was an exception: {e}") + # return ConversationHandler.END + # + # await update.message.reply_photo( + # label.bytes, f'Your label is: {context.user_data["label"]}' + # ) + # return ConversationHandler.END + # + # async def cancel(self, update: Update, context: CallbackContext) -> int: + # await update.message.reply_text("Cancelled.") + # return ConversationHandler.END + + +@app.get("/print/{item_id}") +def print_item(item_id: int, q: str | None = None): + application = Application(PILRenderer(), E550W(os.environ.get("PRINTER_IP"))) + bot = LabelingBot(application) + + LABEL_LENGTH, LABEL_TEXT = range(2) + + bot.media_info() + label = bot.get_qrcode(item_id, 25) + with open("label.png", "wb") as preview: + preview.write(label.bytes) + bot.print_qrcode(item_id, 25) diff --git a/labeler/app/labeler.py b/labeler/app/labeler.py index fe6d53c..1337622 100644 --- a/labeler/app/labeler.py +++ b/labeler/app/labeler.py @@ -31,6 +31,23 @@ class Application: self.renderer.render_label(label_definition) + def render_qrcode_preview(self, text: str, length: int = None) -> Label: + media = self.printer.get_installed_media() + + if length != 0: + label_length = Dimension(mm=length) - 2 * media.minimal_margin_horizontal + else: + label_length = None + + label_definition = LabelDefinition( + text=text, + length=label_length, + width=media.printable_width, + dpi=media.dpi, + ) + + return self.renderer.render_qrcode(label_definition) + def print_label(self, text: str, length: int = None) -> Image: media = self.printer.get_installed_media() @@ -50,5 +67,24 @@ class Application: self.printer.print_label(label) return label + def print_qrcode(self, text: str, length: int = None) -> Image: + media = self.printer.get_installed_media() + + if length != 0: + label_length = Dimension(mm=length) - 2 * media.minimal_margin_horizontal + else: + label_length = None + + label_definition = LabelDefinition( + text=text, + length=label_length, + width=media.printable_width, + dpi=media.dpi, + ) + + label = self.renderer.render_qrcode(label_definition) + self.printer.print_label(label) + return label + def get_installed_media(self) -> MediaDefinition: return self.printer.get_installed_media() diff --git a/labeler/infra/e550w_printer/printer.py b/labeler/infra/e550w_printer/printer.py index f69f289..4643f58 100644 --- a/labeler/infra/e550w_printer/printer.py +++ b/labeler/infra/e550w_printer/printer.py @@ -4,6 +4,7 @@ from math import inf from brother_ql import BrotherQLRaster, create_label from brother_ql.backends import guess_backend, backend_factory +from brother_ql.conversion import convert from pysnmp.entity.engine import SnmpEngine from pysnmp.hlapi import getCmd, CommunityData, UdpTransportTarget, ContextData from pysnmp.smi.rfc1902 import ObjectType, ObjectIdentity @@ -43,9 +44,9 @@ class E550W(Printer): im = PILImage.open(io.BytesIO(label.bytes)) qlr = BrotherQLRaster("PT-E550W") - create_label( + convert( qlr, - im, + [im], self.__media_width_to_type(label.height), red=False, threshold=70, diff --git a/labeler/infra/renderer.py b/labeler/infra/renderer.py index 59a3bcc..cbf2f4a 100644 --- a/labeler/infra/renderer.py +++ b/labeler/infra/renderer.py @@ -1,3 +1,4 @@ +import qrcode import textwrap from string import ascii_letters @@ -7,9 +8,16 @@ from labeler.domain.objects import Image, LabelDefinition from labeler.interfaces import Renderer +DPI = 360.0 + + +def points_to_pixels(point_size: float): + return int(point_size * (72 / DPI)) + + class PILRenderer(Renderer): def __init__(self): - self.font_path = "/Library/Fonts/Arial.ttf" + self.font_path = "/Library/Fonts/Arial Unicode.ttf" def render_label(self, label_definition: LabelDefinition) -> Image: if label_definition.length is None: @@ -47,7 +55,7 @@ class PILRenderer(Renderer): while text_height > 0: font = ImageFont.truetype( - "/Library/Fonts/Arial.ttf", + "/Library/Fonts/Arial Unicode.ttf", text_height, ) if lines_to_print > 1: @@ -74,6 +82,42 @@ class PILRenderer(Renderer): ) return im + def render_qrcode(self, label_definition: LabelDefinition) -> Image: + width = label_definition.pixel_width + length = label_definition.pixel_length + text = label_definition.text + font = self.__get_font_for_qr() + qr = qrcode.QRCode(box_size=7) + qr.add_data(f"https://hs3.pl/db/{text}") + qr.make(fit=True) + qr_img = qr.make_image() + print(width, length) + pil_image = PILImage.new("1", (width, length), 1) + draw = ImageDraw.Draw(pil_image) + pil_image.paste(qr_img) + draw.text( + (width / 2, 232), + "HS3-DB", + font=font, + fill=0, + anchor="mm", + align="center", + ) + draw.text( + (20, 232 + 34), + f"ID: {text}", + font=font, + fill=0, + align="left", + ) + + return Image.from_pil(pil_image.transpose(PILImage.Transpose.ROTATE_90)) + + def __get_font_for_qr(self): + font_size = int(360 / 9) + + return ImageFont.truetype("fonts/SourceCodePro-SemiBold.ttf", font_size) + def __get_font(self, text: str, max_width: int, max_length: int): font_size = max_width step = max_width // 2 diff --git a/labeler/interfaces.py b/labeler/interfaces.py index a88553d..40bed73 100644 --- a/labeler/interfaces.py +++ b/labeler/interfaces.py @@ -8,6 +8,10 @@ class Renderer(abc.ABC): def render_label(self, label_definition: LabelDefinition) -> Image: pass + @abc.abstractmethod + def render_qrcode(self, label_definition: LabelDefinition) -> Image: + pass + class Printer(abc.ABC): @abc.abstractmethod diff --git a/poetry.lock b/poetry.lock deleted file mode 100644 index d556631..0000000 --- a/poetry.lock +++ /dev/null @@ -1,721 +0,0 @@ -# This file is automatically @generated by Poetry 1.5.1 and should not be changed by hand. - -[[package]] -name = "anyio" -version = "3.7.1" -description = "High level compatibility layer for multiple asynchronous event loop implementations" -optional = false -python-versions = ">=3.7" -files = [ - {file = "anyio-3.7.1-py3-none-any.whl", hash = "sha256:91dee416e570e92c64041bd18b900d1d6fa78dff7048769ce5ac5ddad004fbb5"}, - {file = "anyio-3.7.1.tar.gz", hash = "sha256:44a3c9aba0f5defa43261a8b3efb97891f2bd7d804e0e1f56419befa1adfc780"}, -] - -[package.dependencies] -idna = ">=2.8" -sniffio = ">=1.1" - -[package.extras] -doc = ["Sphinx", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme (>=1.2.2)", "sphinxcontrib-jquery"] -test = ["anyio[trio]", "coverage[toml] (>=4.5)", "hypothesis (>=4.0)", "mock (>=4)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] -trio = ["trio (<0.22)"] - -[[package]] -name = "attrs" -version = "23.1.0" -description = "Classes Without Boilerplate" -optional = false -python-versions = ">=3.7" -files = [ - {file = "attrs-23.1.0-py3-none-any.whl", hash = "sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04"}, - {file = "attrs-23.1.0.tar.gz", hash = "sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015"}, -] - -[package.extras] -cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] -dev = ["attrs[docs,tests]", "pre-commit"] -docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] -tests = ["attrs[tests-no-zope]", "zope-interface"] -tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] - -[[package]] -name = "black" -version = "23.7.0" -description = "The uncompromising code formatter." -optional = false -python-versions = ">=3.8" -files = [ - {file = "black-23.7.0-cp310-cp310-macosx_10_16_arm64.whl", hash = "sha256:5c4bc552ab52f6c1c506ccae05681fab58c3f72d59ae6e6639e8885e94fe2587"}, - {file = "black-23.7.0-cp310-cp310-macosx_10_16_universal2.whl", hash = "sha256:552513d5cd5694590d7ef6f46e1767a4df9af168d449ff767b13b084c020e63f"}, - {file = "black-23.7.0-cp310-cp310-macosx_10_16_x86_64.whl", hash = "sha256:86cee259349b4448adb4ef9b204bb4467aae74a386bce85d56ba4f5dc0da27be"}, - {file = "black-23.7.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:501387a9edcb75d7ae8a4412bb8749900386eaef258f1aefab18adddea1936bc"}, - {file = "black-23.7.0-cp310-cp310-win_amd64.whl", hash = "sha256:fb074d8b213749fa1d077d630db0d5f8cc3b2ae63587ad4116e8a436e9bbe995"}, - {file = "black-23.7.0-cp311-cp311-macosx_10_16_arm64.whl", hash = "sha256:b5b0ee6d96b345a8b420100b7d71ebfdd19fab5e8301aff48ec270042cd40ac2"}, - {file = "black-23.7.0-cp311-cp311-macosx_10_16_universal2.whl", hash = "sha256:893695a76b140881531062d48476ebe4a48f5d1e9388177e175d76234ca247cd"}, - {file = "black-23.7.0-cp311-cp311-macosx_10_16_x86_64.whl", hash = "sha256:c333286dc3ddca6fdff74670b911cccedacb4ef0a60b34e491b8a67c833b343a"}, - {file = "black-23.7.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:831d8f54c3a8c8cf55f64d0422ee875eecac26f5f649fb6c1df65316b67c8926"}, - {file = "black-23.7.0-cp311-cp311-win_amd64.whl", hash = "sha256:7f3bf2dec7d541b4619b8ce526bda74a6b0bffc480a163fed32eb8b3c9aed8ad"}, - {file = "black-23.7.0-cp38-cp38-macosx_10_16_arm64.whl", hash = "sha256:f9062af71c59c004cd519e2fb8f5d25d39e46d3af011b41ab43b9c74e27e236f"}, - {file = "black-23.7.0-cp38-cp38-macosx_10_16_universal2.whl", hash = "sha256:01ede61aac8c154b55f35301fac3e730baf0c9cf8120f65a9cd61a81cfb4a0c3"}, - {file = "black-23.7.0-cp38-cp38-macosx_10_16_x86_64.whl", hash = "sha256:327a8c2550ddc573b51e2c352adb88143464bb9d92c10416feb86b0f5aee5ff6"}, - {file = "black-23.7.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d1c6022b86f83b632d06f2b02774134def5d4d4f1dac8bef16d90cda18ba28a"}, - {file = "black-23.7.0-cp38-cp38-win_amd64.whl", hash = "sha256:27eb7a0c71604d5de083757fbdb245b1a4fae60e9596514c6ec497eb63f95320"}, - {file = "black-23.7.0-cp39-cp39-macosx_10_16_arm64.whl", hash = "sha256:8417dbd2f57b5701492cd46edcecc4f9208dc75529bcf76c514864e48da867d9"}, - {file = "black-23.7.0-cp39-cp39-macosx_10_16_universal2.whl", hash = "sha256:47e56d83aad53ca140da0af87678fb38e44fd6bc0af71eebab2d1f59b1acf1d3"}, - {file = "black-23.7.0-cp39-cp39-macosx_10_16_x86_64.whl", hash = "sha256:25cc308838fe71f7065df53aedd20327969d05671bac95b38fdf37ebe70ac087"}, - {file = "black-23.7.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:642496b675095d423f9b8448243336f8ec71c9d4d57ec17bf795b67f08132a91"}, - {file = "black-23.7.0-cp39-cp39-win_amd64.whl", hash = "sha256:ad0014efc7acf0bd745792bd0d8857413652979200ab924fbf239062adc12491"}, - {file = "black-23.7.0-py3-none-any.whl", hash = "sha256:9fd59d418c60c0348505f2ddf9609c1e1de8e7493eab96198fc89d9f865e7a96"}, - {file = "black-23.7.0.tar.gz", hash = "sha256:022a582720b0d9480ed82576c920a8c1dde97cc38ff11d8d8859b3bd6ca9eedb"}, -] - -[package.dependencies] -click = ">=8.0.0" -mypy-extensions = ">=0.4.3" -packaging = ">=22.0" -pathspec = ">=0.9.0" -platformdirs = ">=2" - -[package.extras] -colorama = ["colorama (>=0.4.3)"] -d = ["aiohttp (>=3.7.4)"] -jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] -uvloop = ["uvloop (>=0.15.2)"] - -[[package]] -name = "brother-ql" -version = "1.0.4" -description = "Python package to talk to Brother QL label printers" -optional = false -python-versions = "*" -files = [] -develop = false - -[package.dependencies] -attrs = "*" -click = "*" -future = "*" -packbits = "*" -pillow = ">=3.3.0" -pyusb = "*" - -[package.source] -type = "git" -url = "https://github.com/hbrylkowski/brother_ql" -reference = "HEAD" -resolved_reference = "4225d13d209e8e4a2c17e87a75f42809e0da8fda" - -[[package]] -name = "certifi" -version = "2023.5.7" -description = "Python package for providing Mozilla's CA Bundle." -optional = false -python-versions = ">=3.6" -files = [ - {file = "certifi-2023.5.7-py3-none-any.whl", hash = "sha256:c6c2e98f5c7869efca1f8916fed228dd91539f9f1b444c314c06eef02980c716"}, - {file = "certifi-2023.5.7.tar.gz", hash = "sha256:0f0d56dc5a6ad56fd4ba36484d6cc34451e1c6548c61daad8c320169f91eddc7"}, -] - -[[package]] -name = "click" -version = "8.1.4" -description = "Composable command line interface toolkit" -optional = false -python-versions = ">=3.7" -files = [ - {file = "click-8.1.4-py3-none-any.whl", hash = "sha256:2739815aaa5d2c986a88f1e9230c55e17f0caad3d958a5e13ad0797c166db9e3"}, - {file = "click-8.1.4.tar.gz", hash = "sha256:b97d0c74955da062a7d4ef92fadb583806a585b2ea81958a81bd72726cbb8e37"}, -] - -[package.dependencies] -colorama = {version = "*", markers = "platform_system == \"Windows\""} - -[[package]] -name = "colorama" -version = "0.4.6" -description = "Cross-platform colored terminal text." -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" -files = [ - {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, - {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, -] - -[[package]] -name = "fastapi" -version = "0.99.1" -description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" -optional = false -python-versions = ">=3.7" -files = [ - {file = "fastapi-0.99.1-py3-none-any.whl", hash = "sha256:976df7bab51ac7beda9f68c4513b8c4490b5c1135c72aafd0a5ee4023ec5282e"}, - {file = "fastapi-0.99.1.tar.gz", hash = "sha256:ac78f717cd80d657bd183f94d33b9bda84aa376a46a9dab513586b8eef1dc6fc"}, -] - -[package.dependencies] -pydantic = ">=1.7.4,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0" -starlette = ">=0.27.0,<0.28.0" -typing-extensions = ">=4.5.0" - -[package.extras] -all = ["email-validator (>=1.1.1)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=2.11.2)", "orjson (>=3.2.1)", "python-multipart (>=0.0.5)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"] - -[[package]] -name = "future" -version = "0.18.3" -description = "Clean single-source support for Python 3 and 2" -optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" -files = [ - {file = "future-0.18.3.tar.gz", hash = "sha256:34a17436ed1e96697a86f9de3d15a3b0be01d8bc8de9c1dffd59fb8234ed5307"}, -] - -[[package]] -name = "h11" -version = "0.14.0" -description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" -optional = false -python-versions = ">=3.7" -files = [ - {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, - {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, -] - -[[package]] -name = "httpcore" -version = "0.17.3" -description = "A minimal low-level HTTP client." -optional = false -python-versions = ">=3.7" -files = [ - {file = "httpcore-0.17.3-py3-none-any.whl", hash = "sha256:c2789b767ddddfa2a5782e3199b2b7f6894540b17b16ec26b2c4d8e103510b87"}, - {file = "httpcore-0.17.3.tar.gz", hash = "sha256:a6f30213335e34c1ade7be6ec7c47f19f50c56db36abef1a9dfa3815b1cb3888"}, -] - -[package.dependencies] -anyio = ">=3.0,<5.0" -certifi = "*" -h11 = ">=0.13,<0.15" -sniffio = "==1.*" - -[package.extras] -http2 = ["h2 (>=3,<5)"] -socks = ["socksio (==1.*)"] - -[[package]] -name = "httpx" -version = "0.24.1" -description = "The next generation HTTP client." -optional = false -python-versions = ">=3.7" -files = [ - {file = "httpx-0.24.1-py3-none-any.whl", hash = "sha256:06781eb9ac53cde990577af654bd990a4949de37a28bdb4a230d434f3a30b9bd"}, - {file = "httpx-0.24.1.tar.gz", hash = "sha256:5853a43053df830c20f8110c5e69fe44d035d850b2dfe795e196f00fdb774bdd"}, -] - -[package.dependencies] -certifi = "*" -httpcore = ">=0.15.0,<0.18.0" -idna = "*" -sniffio = "*" - -[package.extras] -brotli = ["brotli", "brotlicffi"] -cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] -http2 = ["h2 (>=3,<5)"] -socks = ["socksio (==1.*)"] - -[[package]] -name = "idna" -version = "3.4" -description = "Internationalized Domain Names in Applications (IDNA)" -optional = false -python-versions = ">=3.5" -files = [ - {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, - {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, -] - -[[package]] -name = "iniconfig" -version = "2.0.0" -description = "brain-dead simple config-ini parsing" -optional = false -python-versions = ">=3.7" -files = [ - {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, - {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, -] - -[[package]] -name = "jinja2" -version = "3.1.2" -description = "A very fast and expressive template engine." -optional = false -python-versions = ">=3.7" -files = [ - {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, - {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, -] - -[package.dependencies] -MarkupSafe = ">=2.0" - -[package.extras] -i18n = ["Babel (>=2.7)"] - -[[package]] -name = "markupsafe" -version = "2.1.3" -description = "Safely add untrusted strings to HTML/XML markup." -optional = false -python-versions = ">=3.7" -files = [ - {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-win32.whl", hash = "sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-win_amd64.whl", hash = "sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-win32.whl", hash = "sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-win_amd64.whl", hash = "sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-win32.whl", hash = "sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-win_amd64.whl", hash = "sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-win32.whl", hash = "sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-win_amd64.whl", hash = "sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba"}, - {file = "MarkupSafe-2.1.3.tar.gz", hash = "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad"}, -] - -[[package]] -name = "mypy-extensions" -version = "1.0.0" -description = "Type system extensions for programs checked with the mypy type checker." -optional = false -python-versions = ">=3.5" -files = [ - {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, - {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, -] - -[[package]] -name = "packaging" -version = "23.1" -description = "Core utilities for Python packages" -optional = false -python-versions = ">=3.7" -files = [ - {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"}, - {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, -] - -[[package]] -name = "packbits" -version = "0.6" -description = "PackBits encoder/decoder" -optional = false -python-versions = "*" -files = [ - {file = "packbits-0.6.tar.gz", hash = "sha256:bc6b370bb34e04ac8cfa835e06c0484380affc6d593adb8009dd6c0f7bfff034"}, -] - -[[package]] -name = "pathspec" -version = "0.11.1" -description = "Utility library for gitignore style pattern matching of file paths." -optional = false -python-versions = ">=3.7" -files = [ - {file = "pathspec-0.11.1-py3-none-any.whl", hash = "sha256:d8af70af76652554bd134c22b3e8a1cc46ed7d91edcdd721ef1a0c51a84a5293"}, - {file = "pathspec-0.11.1.tar.gz", hash = "sha256:2798de800fa92780e33acca925945e9a19a133b715067cf165b8866c15a31687"}, -] - -[[package]] -name = "pillow" -version = "9.5.0" -description = "Python Imaging Library (Fork)" -optional = false -python-versions = ">=3.7" -files = [ - {file = "Pillow-9.5.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:ace6ca218308447b9077c14ea4ef381ba0b67ee78d64046b3f19cf4e1139ad16"}, - {file = "Pillow-9.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d3d403753c9d5adc04d4694d35cf0391f0f3d57c8e0030aac09d7678fa8030aa"}, - {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ba1b81ee69573fe7124881762bb4cd2e4b6ed9dd28c9c60a632902fe8db8b38"}, - {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fe7e1c262d3392afcf5071df9afa574544f28eac825284596ac6db56e6d11062"}, - {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f36397bf3f7d7c6a3abdea815ecf6fd14e7fcd4418ab24bae01008d8d8ca15e"}, - {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:252a03f1bdddce077eff2354c3861bf437c892fb1832f75ce813ee94347aa9b5"}, - {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:85ec677246533e27770b0de5cf0f9d6e4ec0c212a1f89dfc941b64b21226009d"}, - {file = "Pillow-9.5.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b416f03d37d27290cb93597335a2f85ed446731200705b22bb927405320de903"}, - {file = "Pillow-9.5.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1781a624c229cb35a2ac31cc4a77e28cafc8900733a864870c49bfeedacd106a"}, - {file = "Pillow-9.5.0-cp310-cp310-win32.whl", hash = "sha256:8507eda3cd0608a1f94f58c64817e83ec12fa93a9436938b191b80d9e4c0fc44"}, - {file = "Pillow-9.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:d3c6b54e304c60c4181da1c9dadf83e4a54fd266a99c70ba646a9baa626819eb"}, - {file = "Pillow-9.5.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:7ec6f6ce99dab90b52da21cf0dc519e21095e332ff3b399a357c187b1a5eee32"}, - {file = "Pillow-9.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:560737e70cb9c6255d6dcba3de6578a9e2ec4b573659943a5e7e4af13f298f5c"}, - {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:96e88745a55b88a7c64fa49bceff363a1a27d9a64e04019c2281049444a571e3"}, - {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d9c206c29b46cfd343ea7cdfe1232443072bbb270d6a46f59c259460db76779a"}, - {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cfcc2c53c06f2ccb8976fb5c71d448bdd0a07d26d8e07e321c103416444c7ad1"}, - {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:a0f9bb6c80e6efcde93ffc51256d5cfb2155ff8f78292f074f60f9e70b942d99"}, - {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:8d935f924bbab8f0a9a28404422da8af4904e36d5c33fc6f677e4c4485515625"}, - {file = "Pillow-9.5.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:fed1e1cf6a42577953abbe8e6cf2fe2f566daebde7c34724ec8803c4c0cda579"}, - {file = "Pillow-9.5.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c1170d6b195555644f0616fd6ed929dfcf6333b8675fcca044ae5ab110ded296"}, - {file = "Pillow-9.5.0-cp311-cp311-win32.whl", hash = "sha256:54f7102ad31a3de5666827526e248c3530b3a33539dbda27c6843d19d72644ec"}, - {file = "Pillow-9.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:cfa4561277f677ecf651e2b22dc43e8f5368b74a25a8f7d1d4a3a243e573f2d4"}, - {file = "Pillow-9.5.0-cp311-cp311-win_arm64.whl", hash = "sha256:965e4a05ef364e7b973dd17fc765f42233415974d773e82144c9bbaaaea5d089"}, - {file = "Pillow-9.5.0-cp312-cp312-win32.whl", hash = "sha256:22baf0c3cf0c7f26e82d6e1adf118027afb325e703922c8dfc1d5d0156bb2eeb"}, - {file = "Pillow-9.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:432b975c009cf649420615388561c0ce7cc31ce9b2e374db659ee4f7d57a1f8b"}, - {file = "Pillow-9.5.0-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:5d4ebf8e1db4441a55c509c4baa7a0587a0210f7cd25fcfe74dbbce7a4bd1906"}, - {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:375f6e5ee9620a271acb6820b3d1e94ffa8e741c0601db4c0c4d3cb0a9c224bf"}, - {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:99eb6cafb6ba90e436684e08dad8be1637efb71c4f2180ee6b8f940739406e78"}, - {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2dfaaf10b6172697b9bceb9a3bd7b951819d1ca339a5ef294d1f1ac6d7f63270"}, - {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_28_aarch64.whl", hash = "sha256:763782b2e03e45e2c77d7779875f4432e25121ef002a41829d8868700d119392"}, - {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:35f6e77122a0c0762268216315bf239cf52b88865bba522999dc38f1c52b9b47"}, - {file = "Pillow-9.5.0-cp37-cp37m-win32.whl", hash = "sha256:aca1c196f407ec7cf04dcbb15d19a43c507a81f7ffc45b690899d6a76ac9fda7"}, - {file = "Pillow-9.5.0-cp37-cp37m-win_amd64.whl", hash = "sha256:322724c0032af6692456cd6ed554bb85f8149214d97398bb80613b04e33769f6"}, - {file = "Pillow-9.5.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:a0aa9417994d91301056f3d0038af1199eb7adc86e646a36b9e050b06f526597"}, - {file = "Pillow-9.5.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f8286396b351785801a976b1e85ea88e937712ee2c3ac653710a4a57a8da5d9c"}, - {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c830a02caeb789633863b466b9de10c015bded434deb3ec87c768e53752ad22a"}, - {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fbd359831c1657d69bb81f0db962905ee05e5e9451913b18b831febfe0519082"}, - {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8fc330c3370a81bbf3f88557097d1ea26cd8b019d6433aa59f71195f5ddebbf"}, - {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:7002d0797a3e4193c7cdee3198d7c14f92c0836d6b4a3f3046a64bd1ce8df2bf"}, - {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:229e2c79c00e85989a34b5981a2b67aa079fd08c903f0aaead522a1d68d79e51"}, - {file = "Pillow-9.5.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9adf58f5d64e474bed00d69bcd86ec4bcaa4123bfa70a65ce72e424bfb88ed96"}, - {file = "Pillow-9.5.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:662da1f3f89a302cc22faa9f14a262c2e3951f9dbc9617609a47521c69dd9f8f"}, - {file = "Pillow-9.5.0-cp38-cp38-win32.whl", hash = "sha256:6608ff3bf781eee0cd14d0901a2b9cc3d3834516532e3bd673a0a204dc8615fc"}, - {file = "Pillow-9.5.0-cp38-cp38-win_amd64.whl", hash = "sha256:e49eb4e95ff6fd7c0c402508894b1ef0e01b99a44320ba7d8ecbabefddcc5569"}, - {file = "Pillow-9.5.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:482877592e927fd263028c105b36272398e3e1be3269efda09f6ba21fd83ec66"}, - {file = "Pillow-9.5.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3ded42b9ad70e5f1754fb7c2e2d6465a9c842e41d178f262e08b8c85ed8a1d8e"}, - {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c446d2245ba29820d405315083d55299a796695d747efceb5717a8b450324115"}, - {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8aca1152d93dcc27dc55395604dcfc55bed5f25ef4c98716a928bacba90d33a3"}, - {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:608488bdcbdb4ba7837461442b90ea6f3079397ddc968c31265c1e056964f1ef"}, - {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:60037a8db8750e474af7ffc9faa9b5859e6c6d0a50e55c45576bf28be7419705"}, - {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:07999f5834bdc404c442146942a2ecadd1cb6292f5229f4ed3b31e0a108746b1"}, - {file = "Pillow-9.5.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a127ae76092974abfbfa38ca2d12cbeddcdeac0fb71f9627cc1135bedaf9d51a"}, - {file = "Pillow-9.5.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:489f8389261e5ed43ac8ff7b453162af39c3e8abd730af8363587ba64bb2e865"}, - {file = "Pillow-9.5.0-cp39-cp39-win32.whl", hash = "sha256:9b1af95c3a967bf1da94f253e56b6286b50af23392a886720f563c547e48e964"}, - {file = "Pillow-9.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:77165c4a5e7d5a284f10a6efaa39a0ae8ba839da344f20b111d62cc932fa4e5d"}, - {file = "Pillow-9.5.0-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:833b86a98e0ede388fa29363159c9b1a294b0905b5128baf01db683672f230f5"}, - {file = "Pillow-9.5.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aaf305d6d40bd9632198c766fb64f0c1a83ca5b667f16c1e79e1661ab5060140"}, - {file = "Pillow-9.5.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0852ddb76d85f127c135b6dd1f0bb88dbb9ee990d2cd9aa9e28526c93e794fba"}, - {file = "Pillow-9.5.0-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:91ec6fe47b5eb5a9968c79ad9ed78c342b1f97a091677ba0e012701add857829"}, - {file = "Pillow-9.5.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:cb841572862f629b99725ebaec3287fc6d275be9b14443ea746c1dd325053cbd"}, - {file = "Pillow-9.5.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:c380b27d041209b849ed246b111b7c166ba36d7933ec6e41175fd15ab9eb1572"}, - {file = "Pillow-9.5.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7c9af5a3b406a50e313467e3565fc99929717f780164fe6fbb7704edba0cebbe"}, - {file = "Pillow-9.5.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5671583eab84af046a397d6d0ba25343c00cd50bce03787948e0fff01d4fd9b1"}, - {file = "Pillow-9.5.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:84a6f19ce086c1bf894644b43cd129702f781ba5751ca8572f08aa40ef0ab7b7"}, - {file = "Pillow-9.5.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:1e7723bd90ef94eda669a3c2c19d549874dd5badaeefabefd26053304abe5799"}, - {file = "Pillow-9.5.0.tar.gz", hash = "sha256:bf548479d336726d7a0eceb6e767e179fbde37833ae42794602631a070d630f1"}, -] - -[package.extras] -docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-removed-in", "sphinxext-opengraph"] -tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] - -[[package]] -name = "platformdirs" -version = "3.8.1" -description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." -optional = false -python-versions = ">=3.7" -files = [ - {file = "platformdirs-3.8.1-py3-none-any.whl", hash = "sha256:cec7b889196b9144d088e4c57d9ceef7374f6c39694ad1577a0aab50d27ea28c"}, - {file = "platformdirs-3.8.1.tar.gz", hash = "sha256:f87ca4fcff7d2b0f81c6a748a77973d7af0f4d526f98f308477c3c436c74d528"}, -] - -[package.extras] -docs = ["furo (>=2023.5.20)", "proselint (>=0.13)", "sphinx (>=7.0.1)", "sphinx-autodoc-typehints (>=1.23,!=1.23.4)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.3.1)", "pytest-cov (>=4.1)", "pytest-mock (>=3.10)"] - -[[package]] -name = "pluggy" -version = "1.2.0" -description = "plugin and hook calling mechanisms for python" -optional = false -python-versions = ">=3.7" -files = [ - {file = "pluggy-1.2.0-py3-none-any.whl", hash = "sha256:c2fd55a7d7a3863cba1a013e4e2414658b1d07b6bc57b3919e0c63c9abb99849"}, - {file = "pluggy-1.2.0.tar.gz", hash = "sha256:d12f0c4b579b15f5e054301bb226ee85eeeba08ffec228092f8defbaa3a4c4b3"}, -] - -[package.extras] -dev = ["pre-commit", "tox"] -testing = ["pytest", "pytest-benchmark"] - -[[package]] -name = "ply" -version = "3.11" -description = "Python Lex & Yacc" -optional = false -python-versions = "*" -files = [ - {file = "ply-3.11-py2.py3-none-any.whl", hash = "sha256:096f9b8350b65ebd2fd1346b12452efe5b9607f7482813ffca50c22722a807ce"}, - {file = "ply-3.11.tar.gz", hash = "sha256:00c7c1aaa88358b9c765b6d3000c6eec0ba42abca5351b095321aef446081da3"}, -] - -[[package]] -name = "pyasn1" -version = "0.4.8" -description = "ASN.1 types and codecs" -optional = false -python-versions = "*" -files = [ - {file = "pyasn1-0.4.8-py2.py3-none-any.whl", hash = "sha256:39c7e2ec30515947ff4e87fb6f456dfc6e84857d34be479c9d4a4ba4bf46aa5d"}, - {file = "pyasn1-0.4.8.tar.gz", hash = "sha256:aef77c9fb94a3ac588e87841208bdec464471d9871bd5050a287cc9a475cd0ba"}, -] - -[[package]] -name = "pycryptodomex" -version = "3.18.0" -description = "Cryptographic library for Python" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -files = [ - {file = "pycryptodomex-3.18.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:160a39a708c36fa0b168ab79386dede588e62aec06eb505add870739329aecc6"}, - {file = "pycryptodomex-3.18.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:c2953afebf282a444c51bf4effe751706b4d0d63d7ca2cc51db21f902aa5b84e"}, - {file = "pycryptodomex-3.18.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:ba95abd563b0d1b88401658665a260852a8e6c647026ee6a0a65589287681df8"}, - {file = "pycryptodomex-3.18.0-cp27-cp27m-manylinux2014_aarch64.whl", hash = "sha256:192306cf881fe3467dda0e174a4f47bb3a8bb24b90c9cdfbdc248eec5fc0578c"}, - {file = "pycryptodomex-3.18.0-cp27-cp27m-musllinux_1_1_aarch64.whl", hash = "sha256:f9ab5ef0718f6a8716695dea16d83b671b22c45e9c0c78fd807c32c0192e54b5"}, - {file = "pycryptodomex-3.18.0-cp27-cp27m-win32.whl", hash = "sha256:50308fcdbf8345e5ec224a5502b4215178bdb5e95456ead8ab1a69ffd94779cb"}, - {file = "pycryptodomex-3.18.0-cp27-cp27m-win_amd64.whl", hash = "sha256:4d9379c684efea80fdab02a3eb0169372bca7db13f9332cb67483b8dc8b67c37"}, - {file = "pycryptodomex-3.18.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:5594a125dae30d60e94f37797fc67ce3c744522de7992c7c360d02fdb34918f8"}, - {file = "pycryptodomex-3.18.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:8ff129a5a0eb5ff16e45ca4fa70a6051da7f3de303c33b259063c19be0c43d35"}, - {file = "pycryptodomex-3.18.0-cp27-cp27mu-manylinux2014_aarch64.whl", hash = "sha256:3d9314ac785a5b75d5aaf924c5f21d6ca7e8df442e5cf4f0fefad4f6e284d422"}, - {file = "pycryptodomex-3.18.0-cp27-cp27mu-musllinux_1_1_aarch64.whl", hash = "sha256:f237278836dda412a325e9340ba2e6a84cb0f56b9244781e5b61f10b3905de88"}, - {file = "pycryptodomex-3.18.0-cp35-abi3-macosx_10_9_universal2.whl", hash = "sha256:ac614363a86cc53d8ba44b6c469831d1555947e69ab3276ae8d6edc219f570f7"}, - {file = "pycryptodomex-3.18.0-cp35-abi3-macosx_10_9_x86_64.whl", hash = "sha256:302a8f37c224e7b5d72017d462a2be058e28f7be627bdd854066e16722d0fc0c"}, - {file = "pycryptodomex-3.18.0-cp35-abi3-manylinux2014_aarch64.whl", hash = "sha256:6421d23d6a648e83ba2670a352bcd978542dad86829209f59d17a3f087f4afef"}, - {file = "pycryptodomex-3.18.0-cp35-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d84e105787f5e5d36ec6a581ff37a1048d12e638688074b2a00bcf402f9aa1c2"}, - {file = "pycryptodomex-3.18.0-cp35-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6875eb8666f68ddbd39097867325bd22771f595b4e2b0149739b5623c8bf899b"}, - {file = "pycryptodomex-3.18.0-cp35-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:27072a494ce621cc7a9096bbf60ed66826bb94db24b49b7359509e7951033e74"}, - {file = "pycryptodomex-3.18.0-cp35-abi3-musllinux_1_1_i686.whl", hash = "sha256:1949e09ea49b09c36d11a951b16ff2a05a0ffe969dda1846e4686ee342fe8646"}, - {file = "pycryptodomex-3.18.0-cp35-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:6ed3606832987018615f68e8ed716a7065c09a0fe94afd7c9ca1b6777f0ac6eb"}, - {file = "pycryptodomex-3.18.0-cp35-abi3-win32.whl", hash = "sha256:d56c9ec41258fd3734db9f5e4d2faeabe48644ba9ca23b18e1839b3bdf093222"}, - {file = "pycryptodomex-3.18.0-cp35-abi3-win_amd64.whl", hash = "sha256:e00a4bacb83a2627e8210cb353a2e31f04befc1155db2976e5e239dd66482278"}, - {file = "pycryptodomex-3.18.0-pp27-pypy_73-manylinux2010_x86_64.whl", hash = "sha256:2dc4eab20f4f04a2d00220fdc9258717b82d31913552e766d5f00282c031b70a"}, - {file = "pycryptodomex-3.18.0-pp27-pypy_73-win32.whl", hash = "sha256:75672205148bdea34669173366df005dbd52be05115e919551ee97171083423d"}, - {file = "pycryptodomex-3.18.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:bec6c80994d4e7a38312072f89458903b65ec99bed2d65aa4de96d997a53ea7a"}, - {file = "pycryptodomex-3.18.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d35a8ffdc8b05e4b353ba281217c8437f02c57d7233363824e9d794cf753c419"}, - {file = "pycryptodomex-3.18.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:76f0a46bee539dae4b3dfe37216f678769349576b0080fdbe431d19a02da42ff"}, - {file = "pycryptodomex-3.18.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:71687eed47df7e965f6e0bf3cadef98f368d5221f0fb89d2132effe1a3e6a194"}, - {file = "pycryptodomex-3.18.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:73d64b32d84cf48d9ec62106aa277dbe99ab5fbfd38c5100bc7bddd3beb569f7"}, - {file = "pycryptodomex-3.18.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbdcce0a226d9205560a5936b05208c709b01d493ed8307792075dedfaaffa5f"}, - {file = "pycryptodomex-3.18.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58fc0aceb9c961b9897facec9da24c6a94c5db04597ec832060f53d4d6a07196"}, - {file = "pycryptodomex-3.18.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:215be2980a6b70704c10796dd7003eb4390e7be138ac6fb8344bf47e71a8d470"}, - {file = "pycryptodomex-3.18.0.tar.gz", hash = "sha256:3e3ecb5fe979e7c1bb0027e518340acf7ee60415d79295e5251d13c68dde576e"}, -] - -[[package]] -name = "pydantic" -version = "1.10.11" -description = "Data validation and settings management using python type hints" -optional = false -python-versions = ">=3.7" -files = [ - {file = "pydantic-1.10.11-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ff44c5e89315b15ff1f7fdaf9853770b810936d6b01a7bcecaa227d2f8fe444f"}, - {file = "pydantic-1.10.11-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a6c098d4ab5e2d5b3984d3cb2527e2d6099d3de85630c8934efcfdc348a9760e"}, - {file = "pydantic-1.10.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:16928fdc9cb273c6af00d9d5045434c39afba5f42325fb990add2c241402d151"}, - {file = "pydantic-1.10.11-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0588788a9a85f3e5e9ebca14211a496409cb3deca5b6971ff37c556d581854e7"}, - {file = "pydantic-1.10.11-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e9baf78b31da2dc3d3f346ef18e58ec5f12f5aaa17ac517e2ffd026a92a87588"}, - {file = "pydantic-1.10.11-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:373c0840f5c2b5b1ccadd9286782852b901055998136287828731868027a724f"}, - {file = "pydantic-1.10.11-cp310-cp310-win_amd64.whl", hash = "sha256:c3339a46bbe6013ef7bdd2844679bfe500347ac5742cd4019a88312aa58a9847"}, - {file = "pydantic-1.10.11-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:08a6c32e1c3809fbc49debb96bf833164f3438b3696abf0fbeceb417d123e6eb"}, - {file = "pydantic-1.10.11-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a451ccab49971af043ec4e0d207cbc8cbe53dbf148ef9f19599024076fe9c25b"}, - {file = "pydantic-1.10.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5b02d24f7b2b365fed586ed73582c20f353a4c50e4be9ba2c57ab96f8091ddae"}, - {file = "pydantic-1.10.11-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3f34739a89260dfa420aa3cbd069fbcc794b25bbe5c0a214f8fb29e363484b66"}, - {file = "pydantic-1.10.11-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:e297897eb4bebde985f72a46a7552a7556a3dd11e7f76acda0c1093e3dbcf216"}, - {file = "pydantic-1.10.11-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d185819a7a059550ecb85d5134e7d40f2565f3dd94cfd870132c5f91a89cf58c"}, - {file = "pydantic-1.10.11-cp311-cp311-win_amd64.whl", hash = "sha256:4400015f15c9b464c9db2d5d951b6a780102cfa5870f2c036d37c23b56f7fc1b"}, - {file = "pydantic-1.10.11-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2417de68290434461a266271fc57274a138510dca19982336639484c73a07af6"}, - {file = "pydantic-1.10.11-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:331c031ba1554b974c98679bd0780d89670d6fd6f53f5d70b10bdc9addee1713"}, - {file = "pydantic-1.10.11-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8268a735a14c308923e8958363e3a3404f6834bb98c11f5ab43251a4e410170c"}, - {file = "pydantic-1.10.11-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:44e51ba599c3ef227e168424e220cd3e544288c57829520dc90ea9cb190c3248"}, - {file = "pydantic-1.10.11-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d7781f1d13b19700b7949c5a639c764a077cbbdd4322ed505b449d3ca8edcb36"}, - {file = "pydantic-1.10.11-cp37-cp37m-win_amd64.whl", hash = "sha256:7522a7666157aa22b812ce14c827574ddccc94f361237ca6ea8bb0d5c38f1629"}, - {file = "pydantic-1.10.11-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bc64eab9b19cd794a380179ac0e6752335e9555d214cfcb755820333c0784cb3"}, - {file = "pydantic-1.10.11-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8dc77064471780262b6a68fe67e013298d130414d5aaf9b562c33987dbd2cf4f"}, - {file = "pydantic-1.10.11-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe429898f2c9dd209bd0632a606bddc06f8bce081bbd03d1c775a45886e2c1cb"}, - {file = "pydantic-1.10.11-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:192c608ad002a748e4a0bed2ddbcd98f9b56df50a7c24d9a931a8c5dd053bd3d"}, - {file = "pydantic-1.10.11-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ef55392ec4bb5721f4ded1096241e4b7151ba6d50a50a80a2526c854f42e6a2f"}, - {file = "pydantic-1.10.11-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:41e0bb6efe86281623abbeeb0be64eab740c865388ee934cd3e6a358784aca6e"}, - {file = "pydantic-1.10.11-cp38-cp38-win_amd64.whl", hash = "sha256:265a60da42f9f27e0b1014eab8acd3e53bd0bad5c5b4884e98a55f8f596b2c19"}, - {file = "pydantic-1.10.11-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:469adf96c8e2c2bbfa655fc7735a2a82f4c543d9fee97bd113a7fb509bf5e622"}, - {file = "pydantic-1.10.11-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e6cbfbd010b14c8a905a7b10f9fe090068d1744d46f9e0c021db28daeb8b6de1"}, - {file = "pydantic-1.10.11-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:abade85268cc92dff86d6effcd917893130f0ff516f3d637f50dadc22ae93999"}, - {file = "pydantic-1.10.11-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e9738b0f2e6c70f44ee0de53f2089d6002b10c33264abee07bdb5c7f03038303"}, - {file = "pydantic-1.10.11-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:787cf23e5a0cde753f2eabac1b2e73ae3844eb873fd1f5bdbff3048d8dbb7604"}, - {file = "pydantic-1.10.11-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:174899023337b9fc685ac8adaa7b047050616136ccd30e9070627c1aaab53a13"}, - {file = "pydantic-1.10.11-cp39-cp39-win_amd64.whl", hash = "sha256:1954f8778489a04b245a1e7b8b22a9d3ea8ef49337285693cf6959e4b757535e"}, - {file = "pydantic-1.10.11-py3-none-any.whl", hash = "sha256:008c5e266c8aada206d0627a011504e14268a62091450210eda7c07fabe6963e"}, - {file = "pydantic-1.10.11.tar.gz", hash = "sha256:f66d479cf7eb331372c470614be6511eae96f1f120344c25f3f9bb59fb1b5528"}, -] - -[package.dependencies] -typing-extensions = ">=4.2.0" - -[package.extras] -dotenv = ["python-dotenv (>=0.10.4)"] -email = ["email-validator (>=1.0.3)"] - -[[package]] -name = "pysmi" -version = "0.3.4" -description = "SNMP SMI/MIB Parser" -optional = false -python-versions = "*" -files = [ - {file = "pysmi-0.3.4-py2.py3-none-any.whl", hash = "sha256:2ec6ebd41aaef562695e7d0058763c6e1e8c1fbf8710804c11ef3a857fc9cad7"}, - {file = "pysmi-0.3.4.tar.gz", hash = "sha256:bd15a15020aee8376cab5be264c26330824a8b8164ed0195bd402dd59e4e8f7c"}, -] - -[package.dependencies] -ply = "*" - -[[package]] -name = "pysnmp" -version = "4.4.12" -description = "SNMP library for Python" -optional = false -python-versions = "*" -files = [ - {file = "pysnmp-4.4.12-py2.py3-none-any.whl", hash = "sha256:d90946c5d7c55b1ddc03e065a99a2ed36e748dcf166ca04ee4126b8f25fc057a"}, - {file = "pysnmp-4.4.12.tar.gz", hash = "sha256:0c3dbef2f958caca96071fe5c19de43e9c1b0484ab02a0cf08b190bcee768ba9"}, -] - -[package.dependencies] -pyasn1 = ">=0.2.3" -pycryptodomex = "*" -pysmi = "*" - -[[package]] -name = "pytest" -version = "7.4.0" -description = "pytest: simple powerful testing with Python" -optional = false -python-versions = ">=3.7" -files = [ - {file = "pytest-7.4.0-py3-none-any.whl", hash = "sha256:78bf16451a2eb8c7a2ea98e32dc119fd2aa758f1d5d66dbf0a59d69a3969df32"}, - {file = "pytest-7.4.0.tar.gz", hash = "sha256:b4bf8c45bd59934ed84001ad51e11b4ee40d40a1229d2c79f9c592b0a3f6bd8a"}, -] - -[package.dependencies] -colorama = {version = "*", markers = "sys_platform == \"win32\""} -iniconfig = "*" -packaging = "*" -pluggy = ">=0.12,<2.0" - -[package.extras] -testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] - -[[package]] -name = "python-telegram-bot" -version = "20.4" -description = "We have made you a wrapper you can't refuse" -optional = false -python-versions = ">=3.8" -files = [ - {file = "python-telegram-bot-20.4.tar.gz", hash = "sha256:a6ac3f9c9674aaf7d1c7e652d8b75cde969fb872f75e9521b8516eceaba82b1b"}, - {file = "python_telegram_bot-20.4-py3-none-any.whl", hash = "sha256:e426404b0006989a5bcc05e11a7ef3ffe0c086b684a4e963db5bda1d361a049a"}, -] - -[package.dependencies] -httpx = ">=0.24.1,<0.25.0" - -[package.extras] -all = ["APScheduler (>=3.10.1,<3.11.0)", "aiolimiter (>=1.1.0,<1.2.0)", "cachetools (>=5.3.1,<5.4.0)", "cryptography (>=39.0.1)", "httpx[http2]", "httpx[socks]", "pytz (>=2018.6)", "tornado (>=6.2,<7.0)"] -callback-data = ["cachetools (>=5.3.1,<5.4.0)"] -ext = ["APScheduler (>=3.10.1,<3.11.0)", "aiolimiter (>=1.1.0,<1.2.0)", "cachetools (>=5.3.1,<5.4.0)", "pytz (>=2018.6)", "tornado (>=6.2,<7.0)"] -http2 = ["httpx[http2]"] -job-queue = ["APScheduler (>=3.10.1,<3.11.0)", "pytz (>=2018.6)"] -passport = ["cryptography (>=39.0.1)"] -rate-limiter = ["aiolimiter (>=1.1.0,<1.2.0)"] -socks = ["httpx[socks]"] -webhooks = ["tornado (>=6.2,<7.0)"] - -[[package]] -name = "pyusb" -version = "1.2.1" -description = "Python USB access module" -optional = false -python-versions = ">=3.6.0" -files = [ - {file = "pyusb-1.2.1-py3-none-any.whl", hash = "sha256:2b4c7cb86dbadf044dfb9d3a4ff69fd217013dbe78a792177a3feb172449ea36"}, - {file = "pyusb-1.2.1.tar.gz", hash = "sha256:a4cc7404a203144754164b8b40994e2849fde1cfff06b08492f12fff9d9de7b9"}, -] - -[[package]] -name = "sniffio" -version = "1.3.0" -description = "Sniff out which async library your code is running under" -optional = false -python-versions = ">=3.7" -files = [ - {file = "sniffio-1.3.0-py3-none-any.whl", hash = "sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384"}, - {file = "sniffio-1.3.0.tar.gz", hash = "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101"}, -] - -[[package]] -name = "starlette" -version = "0.27.0" -description = "The little ASGI library that shines." -optional = false -python-versions = ">=3.7" -files = [ - {file = "starlette-0.27.0-py3-none-any.whl", hash = "sha256:918416370e846586541235ccd38a474c08b80443ed31c578a418e2209b3eef91"}, - {file = "starlette-0.27.0.tar.gz", hash = "sha256:6a6b0d042acb8d469a01eba54e9cda6cbd24ac602c4cd016723117d6a7e73b75"}, -] - -[package.dependencies] -anyio = ">=3.4.0,<5" - -[package.extras] -full = ["httpx (>=0.22.0)", "itsdangerous", "jinja2", "python-multipart", "pyyaml"] - -[[package]] -name = "typing-extensions" -version = "4.7.1" -description = "Backported and Experimental Type Hints for Python 3.7+" -optional = false -python-versions = ">=3.7" -files = [ - {file = "typing_extensions-4.7.1-py3-none-any.whl", hash = "sha256:440d5dd3af93b060174bf433bccd69b0babc3b15b1a8dca43789fd7f61514b36"}, - {file = "typing_extensions-4.7.1.tar.gz", hash = "sha256:b75ddc264f0ba5615db7ba217daeb99701ad295353c45f9e95963337ceeeffb2"}, -] - -[metadata] -lock-version = "2.0" -python-versions = "^3.11" -content-hash = "0d8fef37d593ec1da3be93986b3808e68a983d7e0c4ecc88560b8dcf8a47ed04" diff --git a/pyproject.toml b/pyproject.toml index c955dd2..c442e92 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,24 +1,33 @@ -[tool.poetry] +[project] name = "python-scratchpad" version = "0.1.0" description = "" -authors = ["Hubert Bryłkowski "] +# authors = ["Hubert Bryłkowski "] readme = "README.md" - -[tool.poetry.dependencies] -python = "^3.11" -brother-ql = {git = "https://github.com/hbrylkowski/brother_ql"} -jinja2 = "^3.1.2" -pillow = "^9.5.0" -pysnmp = "^4.4.12" -pyasn1 = "0.4.8" -python-telegram-bot = "^20.3" -fastapi = "^0.99.1" +requires-python = ">=3.11" +dependencies = [ + "brother-ql @ git+https://github.com/hbrylkowski/brother_ql@4225d13d209e8e4a2c17e87a75f42809e0da8fda", + "qrcode[pil]", + # https://github.com/astral-sh/uv/issues/6384 + "setuptools<81", + "jinja2>=3.1.2,<4", + "pillow>=9.5.0,<10", + "pysnmp>=4.4.12,<5", + "pyasn1==0.4.8,<0.5", + "python-telegram-bot>=20.3,<21", + "fastapi[standard]>=0.114.0", +] [tool.poetry.group.dev.dependencies] pytest = "^7.4.0" black = "^23.3.0" +[tool.hatch] +metadata.allow-direct-references = true + +[tool.hatch.build.targets.wheel] +packages = ["labeler"] + [build-system] -requires = ["poetry-core"] -build-backend = "poetry.core.masonry.api" +requires = ["hatchling"] +build-backend = "hatchling.build" diff --git a/uv.lock b/uv.lock new file mode 100644 index 0000000..147a418 --- /dev/null +++ b/uv.lock @@ -0,0 +1,1026 @@ +version = 1 +revision = 3 +requires-python = ">=3.11" +resolution-markers = [ + "python_full_version >= '3.14'", + "python_full_version == '3.13.*'", + "python_full_version < '3.13'", +] + +[[package]] +name = "annotated-doc" +version = "0.0.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/57/ba/046ceea27344560984e26a590f90bc7f4a75b06701f653222458922b558c/annotated_doc-0.0.4.tar.gz", hash = "sha256:fbcda96e87e9c92ad167c2e53839e57503ecfda18804ea28102353485033faa4", size = 7288, upload-time = "2025-11-10T22:07:42.062Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/d3/26bf1008eb3d2daa8ef4cacc7f3bfdc11818d111f7e2d0201bc6e3b49d45/annotated_doc-0.0.4-py3-none-any.whl", hash = "sha256:571ac1dc6991c450b25a9c2d84a3705e2ae7a53467b5d111c24fa8baabbed320", size = 5303, upload-time = "2025-11-10T22:07:40.673Z" }, +] + +[[package]] +name = "anyio" +version = "4.12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "idna" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/96/f0/5eb65b2bb0d09ac6776f2eb54adee6abe8228ea05b20a5ad0e4945de8aac/anyio-4.12.1.tar.gz", hash = "sha256:41cfcc3a4c85d3f05c932da7c26d0201ac36f72abd4435ba90d0464a3ffed703", size = 228685, upload-time = "2026-01-06T11:45:21.246Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/38/0e/27be9fdef66e72d64c0cdc3cc2823101b80585f8119b5c112c2e8f5f7dab/anyio-4.12.1-py3-none-any.whl", hash = "sha256:d405828884fc140aa80a3c667b8beed277f1dfedec42ba031bd6ac3db606ab6c", size = 113592, upload-time = "2026-01-06T11:45:19.497Z" }, +] + +[[package]] +name = "attrs" +version = "25.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6b/5c/685e6633917e101e5dcb62b9dd76946cbb57c26e133bae9e0cd36033c0a9/attrs-25.4.0.tar.gz", hash = "sha256:16d5969b87f0859ef33a48b35d55ac1be6e42ae49d5e853b597db70c35c57e11", size = 934251, upload-time = "2025-10-06T13:54:44.725Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3a/2a/7cc015f5b9f5db42b7d48157e23356022889fc354a2813c15934b7cb5c0e/attrs-25.4.0-py3-none-any.whl", hash = "sha256:adcf7e2a1fb3b36ac48d97835bb6d8ade15b8dcce26aba8bf1d14847b57a3373", size = 67615, upload-time = "2025-10-06T13:54:43.17Z" }, +] + +[[package]] +name = "brother-ql" +version = "1.0.4" +source = { git = "https://github.com/hbrylkowski/brother_ql?rev=4225d13d209e8e4a2c17e87a75f42809e0da8fda#4225d13d209e8e4a2c17e87a75f42809e0da8fda" } +dependencies = [ + { name = "attrs" }, + { name = "click" }, + { name = "future" }, + { name = "packbits" }, + { name = "pillow" }, + { name = "pyusb" }, +] + +[[package]] +name = "certifi" +version = "2026.2.25" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/af/2d/7bf41579a8986e348fa033a31cdd0e4121114f6bce2457e8876010b092dd/certifi-2026.2.25.tar.gz", hash = "sha256:e887ab5cee78ea814d3472169153c2d12cd43b14bd03329a39a9c6e2e80bfba7", size = 155029, upload-time = "2026-02-25T02:54:17.342Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl", hash = "sha256:027692e4402ad994f1c42e52a4997a9763c646b73e4096e4d5d6db8af1d6f0fa", size = 153684, upload-time = "2026-02-25T02:54:15.766Z" }, +] + +[[package]] +name = "charset-normalizer" +version = "3.4.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/13/69/33ddede1939fdd074bce5434295f38fae7136463422fe4fd3e0e89b98062/charset_normalizer-3.4.4.tar.gz", hash = "sha256:94537985111c35f28720e43603b8e7b43a6ecfb2ce1d3058bbe955b73404e21a", size = 129418, upload-time = "2025-10-14T04:42:32.879Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ed/27/c6491ff4954e58a10f69ad90aca8a1b6fe9c5d3c6f380907af3c37435b59/charset_normalizer-3.4.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6e1fcf0720908f200cd21aa4e6750a48ff6ce4afe7ff5a79a90d5ed8a08296f8", size = 206988, upload-time = "2025-10-14T04:40:33.79Z" }, + { url = "https://files.pythonhosted.org/packages/94/59/2e87300fe67ab820b5428580a53cad894272dbb97f38a7a814a2a1ac1011/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f819d5fe9234f9f82d75bdfa9aef3a3d72c4d24a6e57aeaebba32a704553aa0", size = 147324, upload-time = "2025-10-14T04:40:34.961Z" }, + { url = "https://files.pythonhosted.org/packages/07/fb/0cf61dc84b2b088391830f6274cb57c82e4da8bbc2efeac8c025edb88772/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:a59cb51917aa591b1c4e6a43c132f0cdc3c76dbad6155df4e28ee626cc77a0a3", size = 142742, upload-time = "2025-10-14T04:40:36.105Z" }, + { url = "https://files.pythonhosted.org/packages/62/8b/171935adf2312cd745d290ed93cf16cf0dfe320863ab7cbeeae1dcd6535f/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8ef3c867360f88ac904fd3f5e1f902f13307af9052646963ee08ff4f131adafc", size = 160863, upload-time = "2025-10-14T04:40:37.188Z" }, + { url = "https://files.pythonhosted.org/packages/09/73/ad875b192bda14f2173bfc1bc9a55e009808484a4b256748d931b6948442/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d9e45d7faa48ee908174d8fe84854479ef838fc6a705c9315372eacbc2f02897", size = 157837, upload-time = "2025-10-14T04:40:38.435Z" }, + { url = "https://files.pythonhosted.org/packages/6d/fc/de9cce525b2c5b94b47c70a4b4fb19f871b24995c728e957ee68ab1671ea/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:840c25fb618a231545cbab0564a799f101b63b9901f2569faecd6b222ac72381", size = 151550, upload-time = "2025-10-14T04:40:40.053Z" }, + { url = "https://files.pythonhosted.org/packages/55/c2/43edd615fdfba8c6f2dfbd459b25a6b3b551f24ea21981e23fb768503ce1/charset_normalizer-3.4.4-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ca5862d5b3928c4940729dacc329aa9102900382fea192fc5e52eb69d6093815", size = 149162, upload-time = "2025-10-14T04:40:41.163Z" }, + { url = "https://files.pythonhosted.org/packages/03/86/bde4ad8b4d0e9429a4e82c1e8f5c659993a9a863ad62c7df05cf7b678d75/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d9c7f57c3d666a53421049053eaacdd14bbd0a528e2186fcb2e672effd053bb0", size = 150019, upload-time = "2025-10-14T04:40:42.276Z" }, + { url = "https://files.pythonhosted.org/packages/1f/86/a151eb2af293a7e7bac3a739b81072585ce36ccfb4493039f49f1d3cae8c/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:277e970e750505ed74c832b4bf75dac7476262ee2a013f5574dd49075879e161", size = 143310, upload-time = "2025-10-14T04:40:43.439Z" }, + { url = "https://files.pythonhosted.org/packages/b5/fe/43dae6144a7e07b87478fdfc4dbe9efd5defb0e7ec29f5f58a55aeef7bf7/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:31fd66405eaf47bb62e8cd575dc621c56c668f27d46a61d975a249930dd5e2a4", size = 162022, upload-time = "2025-10-14T04:40:44.547Z" }, + { url = "https://files.pythonhosted.org/packages/80/e6/7aab83774f5d2bca81f42ac58d04caf44f0cc2b65fc6db2b3b2e8a05f3b3/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:0d3d8f15c07f86e9ff82319b3d9ef6f4bf907608f53fe9d92b28ea9ae3d1fd89", size = 149383, upload-time = "2025-10-14T04:40:46.018Z" }, + { url = "https://files.pythonhosted.org/packages/4f/e8/b289173b4edae05c0dde07f69f8db476a0b511eac556dfe0d6bda3c43384/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:9f7fcd74d410a36883701fafa2482a6af2ff5ba96b9a620e9e0721e28ead5569", size = 159098, upload-time = "2025-10-14T04:40:47.081Z" }, + { url = "https://files.pythonhosted.org/packages/d8/df/fe699727754cae3f8478493c7f45f777b17c3ef0600e28abfec8619eb49c/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ebf3e58c7ec8a8bed6d66a75d7fb37b55e5015b03ceae72a8e7c74495551e224", size = 152991, upload-time = "2025-10-14T04:40:48.246Z" }, + { url = "https://files.pythonhosted.org/packages/1a/86/584869fe4ddb6ffa3bd9f491b87a01568797fb9bd8933f557dba9771beaf/charset_normalizer-3.4.4-cp311-cp311-win32.whl", hash = "sha256:eecbc200c7fd5ddb9a7f16c7decb07b566c29fa2161a16cf67b8d068bd21690a", size = 99456, upload-time = "2025-10-14T04:40:49.376Z" }, + { url = "https://files.pythonhosted.org/packages/65/f6/62fdd5feb60530f50f7e38b4f6a1d5203f4d16ff4f9f0952962c044e919a/charset_normalizer-3.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:5ae497466c7901d54b639cf42d5b8c1b6a4fead55215500d2f486d34db48d016", size = 106978, upload-time = "2025-10-14T04:40:50.844Z" }, + { url = "https://files.pythonhosted.org/packages/7a/9d/0710916e6c82948b3be62d9d398cb4fcf4e97b56d6a6aeccd66c4b2f2bd5/charset_normalizer-3.4.4-cp311-cp311-win_arm64.whl", hash = "sha256:65e2befcd84bc6f37095f5961e68a6f077bf44946771354a28ad434c2cce0ae1", size = 99969, upload-time = "2025-10-14T04:40:52.272Z" }, + { url = "https://files.pythonhosted.org/packages/f3/85/1637cd4af66fa687396e757dec650f28025f2a2f5a5531a3208dc0ec43f2/charset_normalizer-3.4.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0a98e6759f854bd25a58a73fa88833fba3b7c491169f86ce1180c948ab3fd394", size = 208425, upload-time = "2025-10-14T04:40:53.353Z" }, + { url = "https://files.pythonhosted.org/packages/9d/6a/04130023fef2a0d9c62d0bae2649b69f7b7d8d24ea5536feef50551029df/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b5b290ccc2a263e8d185130284f8501e3e36c5e02750fc6b6bdeb2e9e96f1e25", size = 148162, upload-time = "2025-10-14T04:40:54.558Z" }, + { url = "https://files.pythonhosted.org/packages/78/29/62328d79aa60da22c9e0b9a66539feae06ca0f5a4171ac4f7dc285b83688/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74bb723680f9f7a6234dcf67aea57e708ec1fbdf5699fb91dfd6f511b0a320ef", size = 144558, upload-time = "2025-10-14T04:40:55.677Z" }, + { url = "https://files.pythonhosted.org/packages/86/bb/b32194a4bf15b88403537c2e120b817c61cd4ecffa9b6876e941c3ee38fe/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f1e34719c6ed0b92f418c7c780480b26b5d9c50349e9a9af7d76bf757530350d", size = 161497, upload-time = "2025-10-14T04:40:57.217Z" }, + { url = "https://files.pythonhosted.org/packages/19/89/a54c82b253d5b9b111dc74aca196ba5ccfcca8242d0fb64146d4d3183ff1/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2437418e20515acec67d86e12bf70056a33abdacb5cb1655042f6538d6b085a8", size = 159240, upload-time = "2025-10-14T04:40:58.358Z" }, + { url = "https://files.pythonhosted.org/packages/c0/10/d20b513afe03acc89ec33948320a5544d31f21b05368436d580dec4e234d/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:11d694519d7f29d6cd09f6ac70028dba10f92f6cdd059096db198c283794ac86", size = 153471, upload-time = "2025-10-14T04:40:59.468Z" }, + { url = "https://files.pythonhosted.org/packages/61/fa/fbf177b55bdd727010f9c0a3c49eefa1d10f960e5f09d1d887bf93c2e698/charset_normalizer-3.4.4-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ac1c4a689edcc530fc9d9aa11f5774b9e2f33f9a0c6a57864e90908f5208d30a", size = 150864, upload-time = "2025-10-14T04:41:00.623Z" }, + { url = "https://files.pythonhosted.org/packages/05/12/9fbc6a4d39c0198adeebbde20b619790e9236557ca59fc40e0e3cebe6f40/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:21d142cc6c0ec30d2efee5068ca36c128a30b0f2c53c1c07bd78cb6bc1d3be5f", size = 150647, upload-time = "2025-10-14T04:41:01.754Z" }, + { url = "https://files.pythonhosted.org/packages/ad/1f/6a9a593d52e3e8c5d2b167daf8c6b968808efb57ef4c210acb907c365bc4/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:5dbe56a36425d26d6cfb40ce79c314a2e4dd6211d51d6d2191c00bed34f354cc", size = 145110, upload-time = "2025-10-14T04:41:03.231Z" }, + { url = "https://files.pythonhosted.org/packages/30/42/9a52c609e72471b0fc54386dc63c3781a387bb4fe61c20231a4ebcd58bdd/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5bfbb1b9acf3334612667b61bd3002196fe2a1eb4dd74d247e0f2a4d50ec9bbf", size = 162839, upload-time = "2025-10-14T04:41:04.715Z" }, + { url = "https://files.pythonhosted.org/packages/c4/5b/c0682bbf9f11597073052628ddd38344a3d673fda35a36773f7d19344b23/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:d055ec1e26e441f6187acf818b73564e6e6282709e9bcb5b63f5b23068356a15", size = 150667, upload-time = "2025-10-14T04:41:05.827Z" }, + { url = "https://files.pythonhosted.org/packages/e4/24/a41afeab6f990cf2daf6cb8c67419b63b48cf518e4f56022230840c9bfb2/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:af2d8c67d8e573d6de5bc30cdb27e9b95e49115cd9baad5ddbd1a6207aaa82a9", size = 160535, upload-time = "2025-10-14T04:41:06.938Z" }, + { url = "https://files.pythonhosted.org/packages/2a/e5/6a4ce77ed243c4a50a1fecca6aaaab419628c818a49434be428fe24c9957/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:780236ac706e66881f3b7f2f32dfe90507a09e67d1d454c762cf642e6e1586e0", size = 154816, upload-time = "2025-10-14T04:41:08.101Z" }, + { url = "https://files.pythonhosted.org/packages/a8/ef/89297262b8092b312d29cdb2517cb1237e51db8ecef2e9af5edbe7b683b1/charset_normalizer-3.4.4-cp312-cp312-win32.whl", hash = "sha256:5833d2c39d8896e4e19b689ffc198f08ea58116bee26dea51e362ecc7cd3ed26", size = 99694, upload-time = "2025-10-14T04:41:09.23Z" }, + { url = "https://files.pythonhosted.org/packages/3d/2d/1e5ed9dd3b3803994c155cd9aacb60c82c331bad84daf75bcb9c91b3295e/charset_normalizer-3.4.4-cp312-cp312-win_amd64.whl", hash = "sha256:a79cfe37875f822425b89a82333404539ae63dbdddf97f84dcbc3d339aae9525", size = 107131, upload-time = "2025-10-14T04:41:10.467Z" }, + { url = "https://files.pythonhosted.org/packages/d0/d9/0ed4c7098a861482a7b6a95603edce4c0d9db2311af23da1fb2b75ec26fc/charset_normalizer-3.4.4-cp312-cp312-win_arm64.whl", hash = "sha256:376bec83a63b8021bb5c8ea75e21c4ccb86e7e45ca4eb81146091b56599b80c3", size = 100390, upload-time = "2025-10-14T04:41:11.915Z" }, + { url = "https://files.pythonhosted.org/packages/97/45/4b3a1239bbacd321068ea6e7ac28875b03ab8bc0aa0966452db17cd36714/charset_normalizer-3.4.4-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e1f185f86a6f3403aa2420e815904c67b2f9ebc443f045edd0de921108345794", size = 208091, upload-time = "2025-10-14T04:41:13.346Z" }, + { url = "https://files.pythonhosted.org/packages/7d/62/73a6d7450829655a35bb88a88fca7d736f9882a27eacdca2c6d505b57e2e/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b39f987ae8ccdf0d2642338faf2abb1862340facc796048b604ef14919e55ed", size = 147936, upload-time = "2025-10-14T04:41:14.461Z" }, + { url = "https://files.pythonhosted.org/packages/89/c5/adb8c8b3d6625bef6d88b251bbb0d95f8205831b987631ab0c8bb5d937c2/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3162d5d8ce1bb98dd51af660f2121c55d0fa541b46dff7bb9b9f86ea1d87de72", size = 144180, upload-time = "2025-10-14T04:41:15.588Z" }, + { url = "https://files.pythonhosted.org/packages/91/ed/9706e4070682d1cc219050b6048bfd293ccf67b3d4f5a4f39207453d4b99/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:81d5eb2a312700f4ecaa977a8235b634ce853200e828fbadf3a9c50bab278328", size = 161346, upload-time = "2025-10-14T04:41:16.738Z" }, + { url = "https://files.pythonhosted.org/packages/d5/0d/031f0d95e4972901a2f6f09ef055751805ff541511dc1252ba3ca1f80cf5/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5bd2293095d766545ec1a8f612559f6b40abc0eb18bb2f5d1171872d34036ede", size = 158874, upload-time = "2025-10-14T04:41:17.923Z" }, + { url = "https://files.pythonhosted.org/packages/f5/83/6ab5883f57c9c801ce5e5677242328aa45592be8a00644310a008d04f922/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a8a8b89589086a25749f471e6a900d3f662d1d3b6e2e59dcecf787b1cc3a1894", size = 153076, upload-time = "2025-10-14T04:41:19.106Z" }, + { url = "https://files.pythonhosted.org/packages/75/1e/5ff781ddf5260e387d6419959ee89ef13878229732732ee73cdae01800f2/charset_normalizer-3.4.4-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc7637e2f80d8530ee4a78e878bce464f70087ce73cf7c1caf142416923b98f1", size = 150601, upload-time = "2025-10-14T04:41:20.245Z" }, + { url = "https://files.pythonhosted.org/packages/d7/57/71be810965493d3510a6ca79b90c19e48696fb1ff964da319334b12677f0/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f8bf04158c6b607d747e93949aa60618b61312fe647a6369f88ce2ff16043490", size = 150376, upload-time = "2025-10-14T04:41:21.398Z" }, + { url = "https://files.pythonhosted.org/packages/e5/d5/c3d057a78c181d007014feb7e9f2e65905a6c4ef182c0ddf0de2924edd65/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:554af85e960429cf30784dd47447d5125aaa3b99a6f0683589dbd27e2f45da44", size = 144825, upload-time = "2025-10-14T04:41:22.583Z" }, + { url = "https://files.pythonhosted.org/packages/e6/8c/d0406294828d4976f275ffbe66f00266c4b3136b7506941d87c00cab5272/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:74018750915ee7ad843a774364e13a3db91682f26142baddf775342c3f5b1133", size = 162583, upload-time = "2025-10-14T04:41:23.754Z" }, + { url = "https://files.pythonhosted.org/packages/d7/24/e2aa1f18c8f15c4c0e932d9287b8609dd30ad56dbe41d926bd846e22fb8d/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:c0463276121fdee9c49b98908b3a89c39be45d86d1dbaa22957e38f6321d4ce3", size = 150366, upload-time = "2025-10-14T04:41:25.27Z" }, + { url = "https://files.pythonhosted.org/packages/e4/5b/1e6160c7739aad1e2df054300cc618b06bf784a7a164b0f238360721ab86/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:362d61fd13843997c1c446760ef36f240cf81d3ebf74ac62652aebaf7838561e", size = 160300, upload-time = "2025-10-14T04:41:26.725Z" }, + { url = "https://files.pythonhosted.org/packages/7a/10/f882167cd207fbdd743e55534d5d9620e095089d176d55cb22d5322f2afd/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9a26f18905b8dd5d685d6d07b0cdf98a79f3c7a918906af7cc143ea2e164c8bc", size = 154465, upload-time = "2025-10-14T04:41:28.322Z" }, + { url = "https://files.pythonhosted.org/packages/89/66/c7a9e1b7429be72123441bfdbaf2bc13faab3f90b933f664db506dea5915/charset_normalizer-3.4.4-cp313-cp313-win32.whl", hash = "sha256:9b35f4c90079ff2e2edc5b26c0c77925e5d2d255c42c74fdb70fb49b172726ac", size = 99404, upload-time = "2025-10-14T04:41:29.95Z" }, + { url = "https://files.pythonhosted.org/packages/c4/26/b9924fa27db384bdcd97ab83b4f0a8058d96ad9626ead570674d5e737d90/charset_normalizer-3.4.4-cp313-cp313-win_amd64.whl", hash = "sha256:b435cba5f4f750aa6c0a0d92c541fb79f69a387c91e61f1795227e4ed9cece14", size = 107092, upload-time = "2025-10-14T04:41:31.188Z" }, + { url = "https://files.pythonhosted.org/packages/af/8f/3ed4bfa0c0c72a7ca17f0380cd9e4dd842b09f664e780c13cff1dcf2ef1b/charset_normalizer-3.4.4-cp313-cp313-win_arm64.whl", hash = "sha256:542d2cee80be6f80247095cc36c418f7bddd14f4a6de45af91dfad36d817bba2", size = 100408, upload-time = "2025-10-14T04:41:32.624Z" }, + { url = "https://files.pythonhosted.org/packages/2a/35/7051599bd493e62411d6ede36fd5af83a38f37c4767b92884df7301db25d/charset_normalizer-3.4.4-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:da3326d9e65ef63a817ecbcc0df6e94463713b754fe293eaa03da99befb9a5bd", size = 207746, upload-time = "2025-10-14T04:41:33.773Z" }, + { url = "https://files.pythonhosted.org/packages/10/9a/97c8d48ef10d6cd4fcead2415523221624bf58bcf68a802721a6bc807c8f/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8af65f14dc14a79b924524b1e7fffe304517b2bff5a58bf64f30b98bbc5079eb", size = 147889, upload-time = "2025-10-14T04:41:34.897Z" }, + { url = "https://files.pythonhosted.org/packages/10/bf/979224a919a1b606c82bd2c5fa49b5c6d5727aa47b4312bb27b1734f53cd/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74664978bb272435107de04e36db5a9735e78232b85b77d45cfb38f758efd33e", size = 143641, upload-time = "2025-10-14T04:41:36.116Z" }, + { url = "https://files.pythonhosted.org/packages/ba/33/0ad65587441fc730dc7bd90e9716b30b4702dc7b617e6ba4997dc8651495/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:752944c7ffbfdd10c074dc58ec2d5a8a4cd9493b314d367c14d24c17684ddd14", size = 160779, upload-time = "2025-10-14T04:41:37.229Z" }, + { url = "https://files.pythonhosted.org/packages/67/ed/331d6b249259ee71ddea93f6f2f0a56cfebd46938bde6fcc6f7b9a3d0e09/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d1f13550535ad8cff21b8d757a3257963e951d96e20ec82ab44bc64aeb62a191", size = 159035, upload-time = "2025-10-14T04:41:38.368Z" }, + { url = "https://files.pythonhosted.org/packages/67/ff/f6b948ca32e4f2a4576aa129d8bed61f2e0543bf9f5f2b7fc3758ed005c9/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ecaae4149d99b1c9e7b88bb03e3221956f68fd6d50be2ef061b2381b61d20838", size = 152542, upload-time = "2025-10-14T04:41:39.862Z" }, + { url = "https://files.pythonhosted.org/packages/16/85/276033dcbcc369eb176594de22728541a925b2632f9716428c851b149e83/charset_normalizer-3.4.4-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:cb6254dc36b47a990e59e1068afacdcd02958bdcce30bb50cc1700a8b9d624a6", size = 149524, upload-time = "2025-10-14T04:41:41.319Z" }, + { url = "https://files.pythonhosted.org/packages/9e/f2/6a2a1f722b6aba37050e626530a46a68f74e63683947a8acff92569f979a/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c8ae8a0f02f57a6e61203a31428fa1d677cbe50c93622b4149d5c0f319c1d19e", size = 150395, upload-time = "2025-10-14T04:41:42.539Z" }, + { url = "https://files.pythonhosted.org/packages/60/bb/2186cb2f2bbaea6338cad15ce23a67f9b0672929744381e28b0592676824/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:47cc91b2f4dd2833fddaedd2893006b0106129d4b94fdb6af1f4ce5a9965577c", size = 143680, upload-time = "2025-10-14T04:41:43.661Z" }, + { url = "https://files.pythonhosted.org/packages/7d/a5/bf6f13b772fbb2a90360eb620d52ed8f796f3c5caee8398c3b2eb7b1c60d/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:82004af6c302b5d3ab2cfc4cc5f29db16123b1a8417f2e25f9066f91d4411090", size = 162045, upload-time = "2025-10-14T04:41:44.821Z" }, + { url = "https://files.pythonhosted.org/packages/df/c5/d1be898bf0dc3ef9030c3825e5d3b83f2c528d207d246cbabe245966808d/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:2b7d8f6c26245217bd2ad053761201e9f9680f8ce52f0fcd8d0755aeae5b2152", size = 149687, upload-time = "2025-10-14T04:41:46.442Z" }, + { url = "https://files.pythonhosted.org/packages/a5/42/90c1f7b9341eef50c8a1cb3f098ac43b0508413f33affd762855f67a410e/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:799a7a5e4fb2d5898c60b640fd4981d6a25f1c11790935a44ce38c54e985f828", size = 160014, upload-time = "2025-10-14T04:41:47.631Z" }, + { url = "https://files.pythonhosted.org/packages/76/be/4d3ee471e8145d12795ab655ece37baed0929462a86e72372fd25859047c/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:99ae2cffebb06e6c22bdc25801d7b30f503cc87dbd283479e7b606f70aff57ec", size = 154044, upload-time = "2025-10-14T04:41:48.81Z" }, + { url = "https://files.pythonhosted.org/packages/b0/6f/8f7af07237c34a1defe7defc565a9bc1807762f672c0fde711a4b22bf9c0/charset_normalizer-3.4.4-cp314-cp314-win32.whl", hash = "sha256:f9d332f8c2a2fcbffe1378594431458ddbef721c1769d78e2cbc06280d8155f9", size = 99940, upload-time = "2025-10-14T04:41:49.946Z" }, + { url = "https://files.pythonhosted.org/packages/4b/51/8ade005e5ca5b0d80fb4aff72a3775b325bdc3d27408c8113811a7cbe640/charset_normalizer-3.4.4-cp314-cp314-win_amd64.whl", hash = "sha256:8a6562c3700cce886c5be75ade4a5db4214fda19fede41d9792d100288d8f94c", size = 107104, upload-time = "2025-10-14T04:41:51.051Z" }, + { url = "https://files.pythonhosted.org/packages/da/5f/6b8f83a55bb8278772c5ae54a577f3099025f9ade59d0136ac24a0df4bde/charset_normalizer-3.4.4-cp314-cp314-win_arm64.whl", hash = "sha256:de00632ca48df9daf77a2c65a484531649261ec9f25489917f09e455cb09ddb2", size = 100743, upload-time = "2025-10-14T04:41:52.122Z" }, + { url = "https://files.pythonhosted.org/packages/0a/4c/925909008ed5a988ccbb72dcc897407e5d6d3bd72410d69e051fc0c14647/charset_normalizer-3.4.4-py3-none-any.whl", hash = "sha256:7a32c560861a02ff789ad905a2fe94e3f840803362c84fecf1851cb4cf3dc37f", size = 53402, upload-time = "2025-10-14T04:42:31.76Z" }, +] + +[[package]] +name = "click" +version = "8.3.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/3d/fa/656b739db8587d7b5dfa22e22ed02566950fbfbcdc20311993483657a5c0/click-8.3.1.tar.gz", hash = "sha256:12ff4785d337a1bb490bb7e9c2b1ee5da3112e94a8622f26a6c77f5d2fc6842a", size = 295065, upload-time = "2025-11-15T20:45:42.706Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl", hash = "sha256:981153a64e25f12d547d3426c367a4857371575ee7ad18df2a6183ab0545b2a6", size = 108274, upload-time = "2025-11-15T20:45:41.139Z" }, +] + +[[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 = "dnspython" +version = "2.8.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8c/8b/57666417c0f90f08bcafa776861060426765fdb422eb10212086fb811d26/dnspython-2.8.0.tar.gz", hash = "sha256:181d3c6996452cb1189c4046c61599b84a5a86e099562ffde77d26984ff26d0f", size = 368251, upload-time = "2025-09-07T18:58:00.022Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl", hash = "sha256:01d9bbc4a2d76bf0db7c1f729812ded6d912bd318d3b1cf81d30c0f845dbf3af", size = 331094, upload-time = "2025-09-07T18:57:58.071Z" }, +] + +[[package]] +name = "email-validator" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "dnspython" }, + { name = "idna" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f5/22/900cb125c76b7aaa450ce02fd727f452243f2e91a61af068b40adba60ea9/email_validator-2.3.0.tar.gz", hash = "sha256:9fc05c37f2f6cf439ff414f8fc46d917929974a82244c20eb10231ba60c54426", size = 51238, upload-time = "2025-08-26T13:09:06.831Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl", hash = "sha256:80f13f623413e6b197ae73bb10bf4eb0908faf509ad8362c5edeb0be7fd450b4", size = 35604, upload-time = "2025-08-26T13:09:05.858Z" }, +] + +[[package]] +name = "fastapi" +version = "0.115.14" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pydantic" }, + { name = "starlette" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ca/53/8c38a874844a8b0fa10dd8adf3836ac154082cf88d3f22b544e9ceea0a15/fastapi-0.115.14.tar.gz", hash = "sha256:b1de15cdc1c499a4da47914db35d0e4ef8f1ce62b624e94e0e5824421df99739", size = 296263, upload-time = "2025-06-26T15:29:08.21Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/53/50/b1222562c6d270fea83e9c9075b8e8600b8479150a18e4516a6138b980d1/fastapi-0.115.14-py3-none-any.whl", hash = "sha256:6c0c8bf9420bd58f565e585036d971872472b4f7d3f6c73b698e10cffdefb3ca", size = 95514, upload-time = "2025-06-26T15:29:06.49Z" }, +] + +[package.optional-dependencies] +standard = [ + { name = "email-validator" }, + { name = "fastapi-cli", extra = ["standard"] }, + { name = "httpx" }, + { name = "jinja2" }, + { name = "python-multipart" }, + { name = "uvicorn", extra = ["standard"] }, +] + +[[package]] +name = "fastapi-cli" +version = "0.0.7" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "rich-toolkit" }, + { name = "typer" }, + { name = "uvicorn", extra = ["standard"] }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fe/73/82a5831fbbf8ed75905bacf5b2d9d3dfd6f04d6968b29fe6f72a5ae9ceb1/fastapi_cli-0.0.7.tar.gz", hash = "sha256:02b3b65956f526412515907a0793c9094abd4bfb5457b389f645b0ea6ba3605e", size = 16753, upload-time = "2024-12-15T14:28:10.028Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a1/e6/5daefc851b514ce2287d8f5d358ae4341089185f78f3217a69d0ce3a390c/fastapi_cli-0.0.7-py3-none-any.whl", hash = "sha256:d549368ff584b2804336c61f192d86ddea080c11255f375959627911944804f4", size = 10705, upload-time = "2024-12-15T14:28:06.18Z" }, +] + +[package.optional-dependencies] +standard = [ + { name = "uvicorn", extra = ["standard"] }, +] + +[[package]] +name = "future" +version = "1.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a7/b2/4140c69c6a66432916b26158687e821ba631a4c9273c474343badf84d3ba/future-1.0.0.tar.gz", hash = "sha256:bd2968309307861edae1458a4f8a4f3598c03be43b97521076aebf5d94c07b05", size = 1228490, upload-time = "2024-02-21T11:52:38.461Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/da/71/ae30dadffc90b9006d77af76b393cb9dfbfc9629f339fc1574a1c52e6806/future-1.0.0-py3-none-any.whl", hash = "sha256:929292d34f5872e70396626ef385ec22355a1fae8ad29e1a734c3e43f9fbc216", size = 491326, upload-time = "2024-02-21T11:52:35.956Z" }, +] + +[[package]] +name = "h11" +version = "0.16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/01/ee/02a2c011bdab74c6fb3c75474d40b3052059d95df7e73351460c8588d963/h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1", size = 101250, upload-time = "2025-04-24T03:35:25.427Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", size = 37515, upload-time = "2025-04-24T03:35:24.344Z" }, +] + +[[package]] +name = "httpcore" +version = "1.0.9" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "h11" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/06/94/82699a10bca87a5556c9c59b5963f2d039dbd239f25bc2a63907a05a14cb/httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8", size = 85484, upload-time = "2025-04-24T22:06:22.219Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55", size = 78784, upload-time = "2025-04-24T22:06:20.566Z" }, +] + +[[package]] +name = "httptools" +version = "0.7.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b5/46/120a669232c7bdedb9d52d4aeae7e6c7dfe151e99dc70802e2fc7a5e1993/httptools-0.7.1.tar.gz", hash = "sha256:abd72556974f8e7c74a259655924a717a2365b236c882c3f6f8a45fe94703ac9", size = 258961, upload-time = "2025-10-10T03:55:08.559Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9c/08/17e07e8d89ab8f343c134616d72eebfe03798835058e2ab579dcc8353c06/httptools-0.7.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:474d3b7ab469fefcca3697a10d11a32ee2b9573250206ba1e50d5980910da657", size = 206521, upload-time = "2025-10-10T03:54:31.002Z" }, + { url = "https://files.pythonhosted.org/packages/aa/06/c9c1b41ff52f16aee526fd10fbda99fa4787938aa776858ddc4a1ea825ec/httptools-0.7.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a3c3b7366bb6c7b96bd72d0dbe7f7d5eead261361f013be5f6d9590465ea1c70", size = 110375, upload-time = "2025-10-10T03:54:31.941Z" }, + { url = "https://files.pythonhosted.org/packages/cc/cc/10935db22fda0ee34c76f047590ca0a8bd9de531406a3ccb10a90e12ea21/httptools-0.7.1-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:379b479408b8747f47f3b253326183d7c009a3936518cdb70db58cffd369d9df", size = 456621, upload-time = "2025-10-10T03:54:33.176Z" }, + { url = "https://files.pythonhosted.org/packages/0e/84/875382b10d271b0c11aa5d414b44f92f8dd53e9b658aec338a79164fa548/httptools-0.7.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cad6b591a682dcc6cf1397c3900527f9affef1e55a06c4547264796bbd17cf5e", size = 454954, upload-time = "2025-10-10T03:54:34.226Z" }, + { url = "https://files.pythonhosted.org/packages/30/e1/44f89b280f7e46c0b1b2ccee5737d46b3bb13136383958f20b580a821ca0/httptools-0.7.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:eb844698d11433d2139bbeeb56499102143beb582bd6c194e3ba69c22f25c274", size = 440175, upload-time = "2025-10-10T03:54:35.942Z" }, + { url = "https://files.pythonhosted.org/packages/6f/7e/b9287763159e700e335028bc1824359dc736fa9b829dacedace91a39b37e/httptools-0.7.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f65744d7a8bdb4bda5e1fa23e4ba16832860606fcc09d674d56e425e991539ec", size = 440310, upload-time = "2025-10-10T03:54:37.1Z" }, + { url = "https://files.pythonhosted.org/packages/b3/07/5b614f592868e07f5c94b1f301b5e14a21df4e8076215a3bccb830a687d8/httptools-0.7.1-cp311-cp311-win_amd64.whl", hash = "sha256:135fbe974b3718eada677229312e97f3b31f8a9c8ffa3ae6f565bf808d5b6bcb", size = 86875, upload-time = "2025-10-10T03:54:38.421Z" }, + { url = "https://files.pythonhosted.org/packages/53/7f/403e5d787dc4942316e515e949b0c8a013d84078a915910e9f391ba9b3ed/httptools-0.7.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:38e0c83a2ea9746ebbd643bdfb521b9aa4a91703e2cd705c20443405d2fd16a5", size = 206280, upload-time = "2025-10-10T03:54:39.274Z" }, + { url = "https://files.pythonhosted.org/packages/2a/0d/7f3fd28e2ce311ccc998c388dd1c53b18120fda3b70ebb022b135dc9839b/httptools-0.7.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f25bbaf1235e27704f1a7b86cd3304eabc04f569c828101d94a0e605ef7205a5", size = 110004, upload-time = "2025-10-10T03:54:40.403Z" }, + { url = "https://files.pythonhosted.org/packages/84/a6/b3965e1e146ef5762870bbe76117876ceba51a201e18cc31f5703e454596/httptools-0.7.1-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:2c15f37ef679ab9ecc06bfc4e6e8628c32a8e4b305459de7cf6785acd57e4d03", size = 517655, upload-time = "2025-10-10T03:54:41.347Z" }, + { url = "https://files.pythonhosted.org/packages/11/7d/71fee6f1844e6fa378f2eddde6c3e41ce3a1fb4b2d81118dd544e3441ec0/httptools-0.7.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7fe6e96090df46b36ccfaf746f03034e5ab723162bc51b0a4cf58305324036f2", size = 511440, upload-time = "2025-10-10T03:54:42.452Z" }, + { url = "https://files.pythonhosted.org/packages/22/a5/079d216712a4f3ffa24af4a0381b108aa9c45b7a5cc6eb141f81726b1823/httptools-0.7.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f72fdbae2dbc6e68b8239defb48e6a5937b12218e6ffc2c7846cc37befa84362", size = 495186, upload-time = "2025-10-10T03:54:43.937Z" }, + { url = "https://files.pythonhosted.org/packages/e9/9e/025ad7b65278745dee3bd0ebf9314934c4592560878308a6121f7f812084/httptools-0.7.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e99c7b90a29fd82fea9ef57943d501a16f3404d7b9ee81799d41639bdaae412c", size = 499192, upload-time = "2025-10-10T03:54:45.003Z" }, + { url = "https://files.pythonhosted.org/packages/6d/de/40a8f202b987d43afc4d54689600ff03ce65680ede2f31df348d7f368b8f/httptools-0.7.1-cp312-cp312-win_amd64.whl", hash = "sha256:3e14f530fefa7499334a79b0cf7e7cd2992870eb893526fb097d51b4f2d0f321", size = 86694, upload-time = "2025-10-10T03:54:45.923Z" }, + { url = "https://files.pythonhosted.org/packages/09/8f/c77b1fcbfd262d422f12da02feb0d218fa228d52485b77b953832105bb90/httptools-0.7.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6babce6cfa2a99545c60bfef8bee0cc0545413cb0018f617c8059a30ad985de3", size = 202889, upload-time = "2025-10-10T03:54:47.089Z" }, + { url = "https://files.pythonhosted.org/packages/0a/1a/22887f53602feaa066354867bc49a68fc295c2293433177ee90870a7d517/httptools-0.7.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:601b7628de7504077dd3dcb3791c6b8694bbd967148a6d1f01806509254fb1ca", size = 108180, upload-time = "2025-10-10T03:54:48.052Z" }, + { url = "https://files.pythonhosted.org/packages/32/6a/6aaa91937f0010d288d3d124ca2946d48d60c3a5ee7ca62afe870e3ea011/httptools-0.7.1-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:04c6c0e6c5fb0739c5b8a9eb046d298650a0ff38cf42537fc372b28dc7e4472c", size = 478596, upload-time = "2025-10-10T03:54:48.919Z" }, + { url = "https://files.pythonhosted.org/packages/6d/70/023d7ce117993107be88d2cbca566a7c1323ccbaf0af7eabf2064fe356f6/httptools-0.7.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:69d4f9705c405ae3ee83d6a12283dc9feba8cc6aaec671b412917e644ab4fa66", size = 473268, upload-time = "2025-10-10T03:54:49.993Z" }, + { url = "https://files.pythonhosted.org/packages/32/4d/9dd616c38da088e3f436e9a616e1d0cc66544b8cdac405cc4e81c8679fc7/httptools-0.7.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:44c8f4347d4b31269c8a9205d8a5ee2df5322b09bbbd30f8f862185bb6b05346", size = 455517, upload-time = "2025-10-10T03:54:51.066Z" }, + { url = "https://files.pythonhosted.org/packages/1d/3a/a6c595c310b7df958e739aae88724e24f9246a514d909547778d776799be/httptools-0.7.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:465275d76db4d554918aba40bf1cbebe324670f3dfc979eaffaa5d108e2ed650", size = 458337, upload-time = "2025-10-10T03:54:52.196Z" }, + { url = "https://files.pythonhosted.org/packages/fd/82/88e8d6d2c51edc1cc391b6e044c6c435b6aebe97b1abc33db1b0b24cd582/httptools-0.7.1-cp313-cp313-win_amd64.whl", hash = "sha256:322d00c2068d125bd570f7bf78b2d367dad02b919d8581d7476d8b75b294e3e6", size = 85743, upload-time = "2025-10-10T03:54:53.448Z" }, + { url = "https://files.pythonhosted.org/packages/34/50/9d095fcbb6de2d523e027a2f304d4551855c2f46e0b82befd718b8b20056/httptools-0.7.1-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:c08fe65728b8d70b6923ce31e3956f859d5e1e8548e6f22ec520a962c6757270", size = 203619, upload-time = "2025-10-10T03:54:54.321Z" }, + { url = "https://files.pythonhosted.org/packages/07/f0/89720dc5139ae54b03f861b5e2c55a37dba9a5da7d51e1e824a1f343627f/httptools-0.7.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:7aea2e3c3953521c3c51106ee11487a910d45586e351202474d45472db7d72d3", size = 108714, upload-time = "2025-10-10T03:54:55.163Z" }, + { url = "https://files.pythonhosted.org/packages/b3/cb/eea88506f191fb552c11787c23f9a405f4c7b0c5799bf73f2249cd4f5228/httptools-0.7.1-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:0e68b8582f4ea9166be62926077a3334064d422cf08ab87d8b74664f8e9058e1", size = 472909, upload-time = "2025-10-10T03:54:56.056Z" }, + { url = "https://files.pythonhosted.org/packages/e0/4a/a548bdfae6369c0d078bab5769f7b66f17f1bfaa6fa28f81d6be6959066b/httptools-0.7.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:df091cf961a3be783d6aebae963cc9b71e00d57fa6f149025075217bc6a55a7b", size = 470831, upload-time = "2025-10-10T03:54:57.219Z" }, + { url = "https://files.pythonhosted.org/packages/4d/31/14df99e1c43bd132eec921c2e7e11cda7852f65619bc0fc5bdc2d0cb126c/httptools-0.7.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:f084813239e1eb403ddacd06a30de3d3e09a9b76e7894dcda2b22f8a726e9c60", size = 452631, upload-time = "2025-10-10T03:54:58.219Z" }, + { url = "https://files.pythonhosted.org/packages/22/d2/b7e131f7be8d854d48cb6d048113c30f9a46dca0c9a8b08fcb3fcd588cdc/httptools-0.7.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:7347714368fb2b335e9063bc2b96f2f87a9ceffcd9758ac295f8bbcd3ffbc0ca", size = 452910, upload-time = "2025-10-10T03:54:59.366Z" }, + { url = "https://files.pythonhosted.org/packages/53/cf/878f3b91e4e6e011eff6d1fa9ca39f7eb17d19c9d7971b04873734112f30/httptools-0.7.1-cp314-cp314-win_amd64.whl", hash = "sha256:cfabda2a5bb85aa2a904ce06d974a3f30fb36cc63d7feaddec05d2050acede96", size = 88205, upload-time = "2025-10-10T03:55:00.389Z" }, +] + +[[package]] +name = "httpx" +version = "0.26.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "certifi" }, + { name = "httpcore" }, + { name = "idna" }, + { name = "sniffio" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/bd/26/2dc654950920f499bd062a211071925533f821ccdca04fa0c2fd914d5d06/httpx-0.26.0.tar.gz", hash = "sha256:451b55c30d5185ea6b23c2c793abf9bb237d2a7dfb901ced6ff69ad37ec1dfaf", size = 125671, upload-time = "2023-12-20T11:02:58.032Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/39/9b/4937d841aee9c2c8102d9a4eeb800c7dad25386caabb4a1bf5010df81a57/httpx-0.26.0-py3-none-any.whl", hash = "sha256:8915f5a3627c4d47b73e8202457cb28f1266982d1159bd5779d86a80c0eab1cd", size = 75862, upload-time = "2023-12-20T11:02:55.395Z" }, +] + +[[package]] +name = "idna" +version = "3.11" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6f/6d/0703ccc57f3a7233505399edb88de3cbd678da106337b9fcde432b65ed60/idna-3.11.tar.gz", hash = "sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902", size = 194582, upload-time = "2025-10-12T14:55:20.501Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl", hash = "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea", size = 71008, upload-time = "2025-10-12T14:55:18.883Z" }, +] + +[[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 = "markdown-it-py" +version = "4.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mdurl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5b/f5/4ec618ed16cc4f8fb3b701563655a69816155e79e24a17b651541804721d/markdown_it_py-4.0.0.tar.gz", hash = "sha256:cb0a2b4aa34f932c007117b194e945bd74e0ec24133ceb5bac59009cda1cb9f3", size = 73070, upload-time = "2025-08-11T12:57:52.854Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl", hash = "sha256:87327c59b172c5011896038353a81343b6754500a08cd7a4973bb48c6d578147", size = 87321, upload-time = "2025-08-11T12:57:51.923Z" }, +] + +[[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/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 = "mdurl" +version = "0.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload-time = "2022-08-14T12:40:10.846Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" }, +] + +[[package]] +name = "packbits" +version = "0.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1b/23/78a967c9b9961258da2bf0d0a63bf12293ccddf96ec77361ee7b44f543f1/packbits-0.6.tar.gz", hash = "sha256:bc6b370bb34e04ac8cfa835e06c0484380affc6d593adb8009dd6c0f7bfff034", size = 2167, upload-time = "2013-04-06T08:22:59.65Z" } + +[[package]] +name = "pillow" +version = "9.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/00/d5/4903f310765e0ff2b8e91ffe55031ac6af77d982f0156061e20a4d1a8b2d/Pillow-9.5.0.tar.gz", hash = "sha256:bf548479d336726d7a0eceb6e767e179fbde37833ae42794602631a070d630f1", size = 50488147, upload-time = "2023-04-01T09:31:37.159Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/78/a8/3c2d737d856eb9cd8c18e78f6fe0ed08a2805bded74cbb0455584859023b/Pillow-9.5.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:7ec6f6ce99dab90b52da21cf0dc519e21095e332ff3b399a357c187b1a5eee32", size = 3395792, upload-time = "2023-04-01T09:28:38.917Z" }, + { url = "https://files.pythonhosted.org/packages/a9/15/310cde63cb15a091de889ded26281924cf9cfa5c000b36b06bd0c7f50261/Pillow-9.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:560737e70cb9c6255d6dcba3de6578a9e2ec4b573659943a5e7e4af13f298f5c", size = 3077092, upload-time = "2023-04-01T09:28:41.28Z" }, + { url = "https://files.pythonhosted.org/packages/17/66/20db69c0361902a2f6ee2086d3e83c70133e3fb4cb31470e59a8ed37184e/Pillow-9.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:96e88745a55b88a7c64fa49bceff363a1a27d9a64e04019c2281049444a571e3", size = 3112543, upload-time = "2023-04-01T09:28:43.89Z" }, + { url = "https://files.pythonhosted.org/packages/5c/a8/ff526cdec6b56eb20c992e7083f02c8065049ed1e62fbc159390d7a3dd5e/Pillow-9.5.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d9c206c29b46cfd343ea7cdfe1232443072bbb270d6a46f59c259460db76779a", size = 3386654, upload-time = "2023-04-01T09:28:46.378Z" }, + { url = "https://files.pythonhosted.org/packages/3b/70/e9a45a2e9c58c23e023fcda5af9686f5b42c718cc9bc86194e0025cf0ec5/Pillow-9.5.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cfcc2c53c06f2ccb8976fb5c71d448bdd0a07d26d8e07e321c103416444c7ad1", size = 3308566, upload-time = "2023-04-01T09:28:49.521Z" }, + { url = "https://files.pythonhosted.org/packages/61/a5/ee306d6cc53c9a30c23ba2313b43b67fdf76c611ca5afd0cdd62922cbd3e/Pillow-9.5.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:a0f9bb6c80e6efcde93ffc51256d5cfb2155ff8f78292f074f60f9e70b942d99", size = 3164027, upload-time = "2023-04-01T09:28:52.295Z" }, + { url = "https://files.pythonhosted.org/packages/3d/59/e6bd2c3715ace343d9739276ceed79657fe116923238d102cf731ab463dd/Pillow-9.5.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:8d935f924bbab8f0a9a28404422da8af4904e36d5c33fc6f677e4c4485515625", size = 3415610, upload-time = "2023-04-01T09:28:54.667Z" }, + { url = "https://files.pythonhosted.org/packages/9a/6d/9beb596ba5a5e61081c843187bcdbb42a5c9a9ef552751b554894247da7a/Pillow-9.5.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:fed1e1cf6a42577953abbe8e6cf2fe2f566daebde7c34724ec8803c4c0cda579", size = 3350704, upload-time = "2023-04-01T09:28:57.098Z" }, + { url = "https://files.pythonhosted.org/packages/1e/e4/de633d85be3b3c770c554a37a89e8273069bd19c34b15a419c2795600310/Pillow-9.5.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c1170d6b195555644f0616fd6ed929dfcf6333b8675fcca044ae5ab110ded296", size = 3414604, upload-time = "2023-04-01T09:29:03.375Z" }, + { url = "https://files.pythonhosted.org/packages/46/a0/e410f655300932308e70e883dd60c0c51e6f74bed138641ea9193e64fd7c/Pillow-9.5.0-cp311-cp311-win32.whl", hash = "sha256:54f7102ad31a3de5666827526e248c3530b3a33539dbda27c6843d19d72644ec", size = 2211929, upload-time = "2023-04-01T09:29:06.338Z" }, + { url = "https://files.pythonhosted.org/packages/0c/02/7729c8aecbc525b560c7eb283ffa34c6f5a6d0ed6d1339570c65a3e63088/Pillow-9.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:cfa4561277f677ecf651e2b22dc43e8f5368b74a25a8f7d1d4a3a243e573f2d4", size = 2511551, upload-time = "2023-04-01T09:29:08.636Z" }, + { url = "https://files.pythonhosted.org/packages/b9/8b/d38cc68796be4ac238db327682a1acfbc5deccf64a150aa44ee1efbaafae/Pillow-9.5.0-cp311-cp311-win_arm64.whl", hash = "sha256:965e4a05ef364e7b973dd17fc765f42233415974d773e82144c9bbaaaea5d089", size = 2489206, upload-time = "2023-04-01T20:01:51.312Z" }, + { url = "https://files.pythonhosted.org/packages/5d/38/b7bcbab3bfe1946ba9cf71c1fa03e541b498069457be49eadcdc229412ef/Pillow-9.5.0-cp312-cp312-win32.whl", hash = "sha256:22baf0c3cf0c7f26e82d6e1adf118027afb325e703922c8dfc1d5d0156bb2eeb", size = 2211914, upload-time = "2023-04-01T09:29:10.935Z" }, + { url = "https://files.pythonhosted.org/packages/29/8a/f4cf3f32bc554f9260b645ea1151449ac13525796d3d1a42076d75945d8d/Pillow-9.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:432b975c009cf649420615388561c0ce7cc31ce9b2e374db659ee4f7d57a1f8b", size = 2511483, upload-time = "2023-04-01T09:29:13.217Z" }, +] + +[[package]] +name = "ply" +version = "3.11" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e5/69/882ee5c9d017149285cab114ebeab373308ef0f874fcdac9beb90e0ac4da/ply-3.11.tar.gz", hash = "sha256:00c7c1aaa88358b9c765b6d3000c6eec0ba42abca5351b095321aef446081da3", size = 159130, upload-time = "2018-02-15T19:01:31.097Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a3/58/35da89ee790598a0700ea49b2a66594140f44dec458c07e8e3d4979137fc/ply-3.11-py2.py3-none-any.whl", hash = "sha256:096f9b8350b65ebd2fd1346b12452efe5b9607f7482813ffca50c22722a807ce", size = 49567, upload-time = "2018-02-15T19:01:27.172Z" }, +] + +[[package]] +name = "pyasn1" +version = "0.4.8" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a4/db/fffec68299e6d7bad3d504147f9094830b704527a7fc098b721d38cc7fa7/pyasn1-0.4.8.tar.gz", hash = "sha256:aef77c9fb94a3ac588e87841208bdec464471d9871bd5050a287cc9a475cd0ba", size = 146820, upload-time = "2019-11-16T17:27:38.772Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/62/1e/a94a8d635fa3ce4cfc7f506003548d0a2447ae76fd5ca53932970fe3053f/pyasn1-0.4.8-py2.py3-none-any.whl", hash = "sha256:39c7e2ec30515947ff4e87fb6f456dfc6e84857d34be479c9d4a4ba4bf46aa5d", size = 77145, upload-time = "2019-11-16T17:27:11.07Z" }, +] + +[[package]] +name = "pycryptodomex" +version = "3.23.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c9/85/e24bf90972a30b0fcd16c73009add1d7d7cd9140c2498a68252028899e41/pycryptodomex-3.23.0.tar.gz", hash = "sha256:71909758f010c82bc99b0abf4ea12012c98962fbf0583c2164f8b84533c2e4da", size = 4922157, upload-time = "2025-05-17T17:23:41.434Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2e/00/10edb04777069a42490a38c137099d4b17ba6e36a4e6e28bdc7470e9e853/pycryptodomex-3.23.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:7b37e08e3871efe2187bc1fd9320cc81d87caf19816c648f24443483005ff886", size = 2498764, upload-time = "2025-05-17T17:22:21.453Z" }, + { url = "https://files.pythonhosted.org/packages/6b/3f/2872a9c2d3a27eac094f9ceaa5a8a483b774ae69018040ea3240d5b11154/pycryptodomex-3.23.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:91979028227543010d7b2ba2471cf1d1e398b3f183cb105ac584df0c36dac28d", size = 1643012, upload-time = "2025-05-17T17:22:23.702Z" }, + { url = "https://files.pythonhosted.org/packages/70/af/774c2e2b4f6570fbf6a4972161adbb183aeeaa1863bde31e8706f123bf92/pycryptodomex-3.23.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b8962204c47464d5c1c4038abeadd4514a133b28748bcd9fa5b6d62e3cec6fa", size = 2187643, upload-time = "2025-05-17T17:22:26.37Z" }, + { url = "https://files.pythonhosted.org/packages/de/a3/71065b24cb889d537954cedc3ae5466af00a2cabcff8e29b73be047e9a19/pycryptodomex-3.23.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a33986a0066860f7fcf7c7bd2bc804fa90e434183645595ae7b33d01f3c91ed8", size = 2273762, upload-time = "2025-05-17T17:22:28.313Z" }, + { url = "https://files.pythonhosted.org/packages/c9/0b/ff6f43b7fbef4d302c8b981fe58467b8871902cdc3eb28896b52421422cc/pycryptodomex-3.23.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c7947ab8d589e3178da3d7cdeabe14f841b391e17046954f2fbcd941705762b5", size = 2313012, upload-time = "2025-05-17T17:22:30.57Z" }, + { url = "https://files.pythonhosted.org/packages/02/de/9d4772c0506ab6da10b41159493657105d3f8bb5c53615d19452afc6b315/pycryptodomex-3.23.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:c25e30a20e1b426e1f0fa00131c516f16e474204eee1139d1603e132acffc314", size = 2186856, upload-time = "2025-05-17T17:22:32.819Z" }, + { url = "https://files.pythonhosted.org/packages/28/ad/8b30efcd6341707a234e5eba5493700a17852ca1ac7a75daa7945fcf6427/pycryptodomex-3.23.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:da4fa650cef02db88c2b98acc5434461e027dce0ae8c22dd5a69013eaf510006", size = 2347523, upload-time = "2025-05-17T17:22:35.386Z" }, + { url = "https://files.pythonhosted.org/packages/0f/02/16868e9f655b7670dbb0ac4f2844145cbc42251f916fc35c414ad2359849/pycryptodomex-3.23.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:58b851b9effd0d072d4ca2e4542bf2a4abcf13c82a29fd2c93ce27ee2a2e9462", size = 2272825, upload-time = "2025-05-17T17:22:37.632Z" }, + { url = "https://files.pythonhosted.org/packages/ca/18/4ca89ac737230b52ac8ffaca42f9c6f1fd07c81a6cd821e91af79db60632/pycryptodomex-3.23.0-cp313-cp313t-win32.whl", hash = "sha256:a9d446e844f08299236780f2efa9898c818fe7e02f17263866b8550c7d5fb328", size = 1772078, upload-time = "2025-05-17T17:22:40Z" }, + { url = "https://files.pythonhosted.org/packages/73/34/13e01c322db027682e00986873eca803f11c56ade9ba5bbf3225841ea2d4/pycryptodomex-3.23.0-cp313-cp313t-win_amd64.whl", hash = "sha256:bc65bdd9fc8de7a35a74cab1c898cab391a4add33a8fe740bda00f5976ca4708", size = 1803656, upload-time = "2025-05-17T17:22:42.139Z" }, + { url = "https://files.pythonhosted.org/packages/54/68/9504c8796b1805d58f4425002bcca20f12880e6fa4dc2fc9a668705c7a08/pycryptodomex-3.23.0-cp313-cp313t-win_arm64.whl", hash = "sha256:c885da45e70139464f082018ac527fdaad26f1657a99ee13eecdce0f0ca24ab4", size = 1707172, upload-time = "2025-05-17T17:22:44.704Z" }, + { url = "https://files.pythonhosted.org/packages/dd/9c/1a8f35daa39784ed8adf93a694e7e5dc15c23c741bbda06e1d45f8979e9e/pycryptodomex-3.23.0-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:06698f957fe1ab229a99ba2defeeae1c09af185baa909a31a5d1f9d42b1aaed6", size = 2499240, upload-time = "2025-05-17T17:22:46.953Z" }, + { url = "https://files.pythonhosted.org/packages/7a/62/f5221a191a97157d240cf6643747558759126c76ee92f29a3f4aee3197a5/pycryptodomex-3.23.0-cp37-abi3-macosx_10_9_x86_64.whl", hash = "sha256:b2c2537863eccef2d41061e82a881dcabb04944c5c06c5aa7110b577cc487545", size = 1644042, upload-time = "2025-05-17T17:22:49.098Z" }, + { url = "https://files.pythonhosted.org/packages/8c/fd/5a054543c8988d4ed7b612721d7e78a4b9bf36bc3c5ad45ef45c22d0060e/pycryptodomex-3.23.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:43c446e2ba8df8889e0e16f02211c25b4934898384c1ec1ec04d7889c0333587", size = 2186227, upload-time = "2025-05-17T17:22:51.139Z" }, + { url = "https://files.pythonhosted.org/packages/c8/a9/8862616a85cf450d2822dbd4fff1fcaba90877907a6ff5bc2672cafe42f8/pycryptodomex-3.23.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f489c4765093fb60e2edafdf223397bc716491b2b69fe74367b70d6999257a5c", size = 2272578, upload-time = "2025-05-17T17:22:53.676Z" }, + { url = "https://files.pythonhosted.org/packages/46/9f/bda9c49a7c1842820de674ab36c79f4fbeeee03f8ff0e4f3546c3889076b/pycryptodomex-3.23.0-cp37-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bdc69d0d3d989a1029df0eed67cc5e8e5d968f3724f4519bd03e0ec68df7543c", size = 2312166, upload-time = "2025-05-17T17:22:56.585Z" }, + { url = "https://files.pythonhosted.org/packages/03/cc/870b9bf8ca92866ca0186534801cf8d20554ad2a76ca959538041b7a7cf4/pycryptodomex-3.23.0-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:6bbcb1dd0f646484939e142462d9e532482bc74475cecf9c4903d4e1cd21f003", size = 2185467, upload-time = "2025-05-17T17:22:59.237Z" }, + { url = "https://files.pythonhosted.org/packages/96/e3/ce9348236d8e669fea5dd82a90e86be48b9c341210f44e25443162aba187/pycryptodomex-3.23.0-cp37-abi3-musllinux_1_2_i686.whl", hash = "sha256:8a4fcd42ccb04c31268d1efeecfccfd1249612b4de6374205376b8f280321744", size = 2346104, upload-time = "2025-05-17T17:23:02.112Z" }, + { url = "https://files.pythonhosted.org/packages/a5/e9/e869bcee87beb89040263c416a8a50204f7f7a83ac11897646c9e71e0daf/pycryptodomex-3.23.0-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:55ccbe27f049743a4caf4f4221b166560d3438d0b1e5ab929e07ae1702a4d6fd", size = 2271038, upload-time = "2025-05-17T17:23:04.872Z" }, + { url = "https://files.pythonhosted.org/packages/8d/67/09ee8500dd22614af5fbaa51a4aee6e342b5fa8aecf0a6cb9cbf52fa6d45/pycryptodomex-3.23.0-cp37-abi3-win32.whl", hash = "sha256:189afbc87f0b9f158386bf051f720e20fa6145975f1e76369303d0f31d1a8d7c", size = 1771969, upload-time = "2025-05-17T17:23:07.115Z" }, + { url = "https://files.pythonhosted.org/packages/69/96/11f36f71a865dd6df03716d33bd07a67e9d20f6b8d39820470b766af323c/pycryptodomex-3.23.0-cp37-abi3-win_amd64.whl", hash = "sha256:52e5ca58c3a0b0bd5e100a9fbc8015059b05cffc6c66ce9d98b4b45e023443b9", size = 1803124, upload-time = "2025-05-17T17:23:09.267Z" }, + { url = "https://files.pythonhosted.org/packages/f9/93/45c1cdcbeb182ccd2e144c693eaa097763b08b38cded279f0053ed53c553/pycryptodomex-3.23.0-cp37-abi3-win_arm64.whl", hash = "sha256:02d87b80778c171445d67e23d1caef279bf4b25c3597050ccd2e13970b57fd51", size = 1707161, upload-time = "2025-05-17T17:23:11.414Z" }, +] + +[[package]] +name = "pydantic" +version = "1.10.26" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7b/da/fd89f987a376c807cd81ea0eff4589aade783bbb702637b4734ef2c743a2/pydantic-1.10.26.tar.gz", hash = "sha256:8c6aa39b494c5af092e690127c283d84f363ac36017106a9e66cb33a22ac412e", size = 357906, upload-time = "2025-12-18T15:47:46.557Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1d/c1/d521e64c8130e1ad9d22c270bed3fabcc0940c9539b076b639c88fd32a8d/pydantic-1.10.26-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:116233e53889bcc536f617e38c1b8337d7fa9c280f0fd7a4045947515a785637", size = 2428347, upload-time = "2025-12-18T15:46:39.41Z" }, + { url = "https://files.pythonhosted.org/packages/2c/08/f4b804a00c16e3ea994cb640a7c25c579b4f1fa674cde6a19fa0dfb0ae4f/pydantic-1.10.26-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c3cfdd361addb6eb64ccd26ac356ad6514cee06a61ab26b27e16b5ed53108f77", size = 2212605, upload-time = "2025-12-18T15:46:41.006Z" }, + { url = "https://files.pythonhosted.org/packages/5d/78/0df4b9efef29bbc5e39f247fcba99060d15946b4463d82a5589cf7923d71/pydantic-1.10.26-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0e4451951a9a93bf9a90576f3e25240b47ee49ab5236adccb8eff6ac943adf0f", size = 2753560, upload-time = "2025-12-18T15:46:43.215Z" }, + { url = "https://files.pythonhosted.org/packages/68/66/6ab6c1d3a116d05d2508fce64f96e35242938fac07544d611e11d0d363a0/pydantic-1.10.26-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9858ed44c6bea5f29ffe95308db9e62060791c877766c67dd5f55d072c8612b5", size = 2859235, upload-time = "2025-12-18T15:46:45.112Z" }, + { url = "https://files.pythonhosted.org/packages/61/4e/f1676bb0fcdf6ed2ce4670d7d1fc1d6c3a06d84497644acfbe02649503f1/pydantic-1.10.26-cp311-cp311-win_amd64.whl", hash = "sha256:ac1089f723e2106ebde434377d31239e00870a7563245072968e5af5cc4d33df", size = 2066646, upload-time = "2025-12-18T15:46:46.816Z" }, + { url = "https://files.pythonhosted.org/packages/02/6c/cd97a5a776c4515e6ee2ae81c2f2c5be51376dda6c31f965d7746ce0019f/pydantic-1.10.26-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:468d5b9cacfcaadc76ed0a4645354ab6f263ec01a63fb6d05630ea1df6ae453f", size = 2433795, upload-time = "2025-12-18T15:46:49.321Z" }, + { url = "https://files.pythonhosted.org/packages/47/12/de20affa30dcef728fcf9cc98e13ff4438c7a630de8d2f90eb38eba0891c/pydantic-1.10.26-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2c1b0b914be31671000ca25cf7ea17fcaaa68cfeadf6924529c5c5aa24b7ab1f", size = 2227387, upload-time = "2025-12-18T15:46:50.877Z" }, + { url = "https://files.pythonhosted.org/packages/7b/1d/9d65dcc5b8c17ba590f1f9f486e9306346831902318b7ee93f63516f4003/pydantic-1.10.26-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:15b13b9f8ba8867095769e1156e0d7fbafa1f65b898dd40fd1c02e34430973cb", size = 2629594, upload-time = "2025-12-18T15:46:53.42Z" }, + { url = "https://files.pythonhosted.org/packages/3f/76/acb41409356789e23e1a7ef58f93821410c96409183ce314ddb58d97f23e/pydantic-1.10.26-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad7025ca324ae263d4313998e25078dcaec5f9ed0392c06dedb57e053cc8086b", size = 2745305, upload-time = "2025-12-18T15:46:55.987Z" }, + { url = "https://files.pythonhosted.org/packages/22/72/a98c0c5e527a66057d969fedd61675223c7975ade61acebbca9f1abd6dc0/pydantic-1.10.26-cp312-cp312-win_amd64.whl", hash = "sha256:4482b299874dabb88a6c3759e3d85c6557c407c3b586891f7d808d8a38b66b9c", size = 1937647, upload-time = "2025-12-18T15:46:57.905Z" }, + { url = "https://files.pythonhosted.org/packages/28/b9/17a5a5a421c23ac27486b977724a42c9d5f8b7f0f4aab054251066223900/pydantic-1.10.26-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1ae7913bb40a96c87e3d3f6fe4e918ef53bf181583de4e71824360a9b11aef1c", size = 2494599, upload-time = "2025-12-18T15:47:00.209Z" }, + { url = "https://files.pythonhosted.org/packages/e6/8e/6e3bd4241076cf227b443d7577245dd5d181ecf40b3182fcb908bc8c197d/pydantic-1.10.26-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8154c13f58d4de5d3a856bb6c909c7370f41fb876a5952a503af6b975265f4ba", size = 2254391, upload-time = "2025-12-18T15:47:02.268Z" }, + { url = "https://files.pythonhosted.org/packages/a8/30/a1c4092eda2145ecbead6c92db489b223e101e1ba0da82576d0cf73dd422/pydantic-1.10.26-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f8af0507bf6118b054a9765fb2e402f18a8b70c964f420d95b525eb711122d62", size = 2609445, upload-time = "2025-12-18T15:47:04.909Z" }, + { url = "https://files.pythonhosted.org/packages/3a/2a/0491f1729ee4b7b6bc859ec22f69752f0c09bee1b66ac6f5f701136f34c3/pydantic-1.10.26-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:dcb5a7318fb43189fde6af6f21ac7149c4bcbcfffc54bc87b5becddc46084847", size = 2732124, upload-time = "2025-12-18T15:47:07.464Z" }, + { url = "https://files.pythonhosted.org/packages/2a/56/b59f3b2f84e1df2b04ae768a1bb04d9f0288ff71b67cdcbb07683757b2c0/pydantic-1.10.26-cp313-cp313-win_amd64.whl", hash = "sha256:71cde228bc0600cf8619f0ee62db050d1880dcc477eba0e90b23011b4ee0f314", size = 1939888, upload-time = "2025-12-18T15:47:09.618Z" }, + { url = "https://files.pythonhosted.org/packages/d2/8b/0c3dc02d4b97790b0f199bf933f677c14e7be4a8d21307c5f2daae06aa41/pydantic-1.10.26-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:6b40730cc81d53d515dc0b8bb5c9b43fadb9bed46de4a3c03bd95e8571616dba", size = 2502689, upload-time = "2025-12-18T15:47:12.308Z" }, + { url = "https://files.pythonhosted.org/packages/d4/9d/d31aeea45542b2ae4b09ecba92b88aaba696b801c31919811aa979a1242d/pydantic-1.10.26-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c3bbb9c0eecdf599e4db9b372fa9cc55be12e80a0d9c6d307950a39050cb0e37", size = 2269494, upload-time = "2025-12-18T15:47:14.53Z" }, + { url = "https://files.pythonhosted.org/packages/78/c1/3a4d069593283ca4dd0006039ba33644e21e432cddc09da706ac50441610/pydantic-1.10.26-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:cc2e3fe7bc4993626ef6b6fa855defafa1d6f8996aa1caef2deb83c5ac4d043a", size = 2620047, upload-time = "2025-12-18T15:47:17.089Z" }, + { url = "https://files.pythonhosted.org/packages/e0/0e/340c3d29197d99c15ab04093d43bb9c9d0fd17c2a34b80cb9d36ed732b09/pydantic-1.10.26-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:36d9e46b588aaeb1dcd2409fa4c467fe0b331f3cc9f227b03a7a00643704e962", size = 2747625, upload-time = "2025-12-18T15:47:19.21Z" }, + { url = "https://files.pythonhosted.org/packages/1e/58/f12ab3727339b172c830b32151919456b67787cdfe8808b2568b322fb15c/pydantic-1.10.26-cp314-cp314-win_amd64.whl", hash = "sha256:81ce3c8616d12a7be31b4aadfd3434f78f6b44b75adbfaec2fe1ad4f7f999b8c", size = 1976436, upload-time = "2025-12-18T15:47:21.384Z" }, + { url = "https://files.pythonhosted.org/packages/1f/98/556e82f00b98486def0b8af85da95e69d2be7e367cf2431408e108bc3095/pydantic-1.10.26-py3-none-any.whl", hash = "sha256:c43ad70dc3ce7787543d563792426a16fd7895e14be4b194b5665e36459dd917", size = 166975, upload-time = "2025-12-18T15:47:44.927Z" }, +] + +[[package]] +name = "pygments" +version = "2.19.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b0/77/a5b8c569bf593b0140bde72ea885a803b82086995367bf2037de0159d924/pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887", size = 4968631, upload-time = "2025-06-21T13:39:12.283Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217, upload-time = "2025-06-21T13:39:07.939Z" }, +] + +[[package]] +name = "pysmi" +version = "1.6.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jinja2" }, + { name = "ply" }, + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e0/9c/ba0465dcbcbf93bec4e408b164cde7258cd3e77be4fcde5e835796cfb39f/pysmi-1.6.3.tar.gz", hash = "sha256:5d2eeb9e98bc149dee8f9256899d13789206769aab1637e33ac5f0dacaaf51fb", size = 62800, upload-time = "2026-01-23T00:30:19.919Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/ec/b336b8fe0134077a3d07e3732c33398e7d2eed8410571e063cbd2c89d8e0/pysmi-1.6.3-py3-none-any.whl", hash = "sha256:fc2d796c252379e1b47aeea2e547ff339ca6df504cf6196cb3adad8054f41e7d", size = 87797, upload-time = "2026-01-23T00:30:18.823Z" }, +] + +[[package]] +name = "pysnmp" +version = "4.4.12" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyasn1" }, + { name = "pycryptodomex" }, + { name = "pysmi" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/4e/75/72f64c451bf5884715f84f8217b69b4025da0b67628d611cd14a5b7db217/pysnmp-4.4.12.tar.gz", hash = "sha256:0c3dbef2f958caca96071fe5c19de43e9c1b0484ab02a0cf08b190bcee768ba9", size = 442270, upload-time = "2019-09-24T16:29:37.521Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/25/7e/1e17facea54dd21c6a72db6ae57a5bfdd56edd54b8c4850668b554bdddba/pysnmp-4.4.12-py2.py3-none-any.whl", hash = "sha256:d90946c5d7c55b1ddc03e065a99a2ed36e748dcf166ca04ee4126b8f25fc057a", size = 296498, upload-time = "2019-09-24T16:28:57.676Z" }, +] + +[[package]] +name = "python-dotenv" +version = "1.2.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/82/ed/0301aeeac3e5353ef3d94b6ec08bbcabd04a72018415dcb29e588514bba8/python_dotenv-1.2.2.tar.gz", hash = "sha256:2c371a91fbd7ba082c2c1dc1f8bf89ca22564a087c2c287cd9b662adde799cf3", size = 50135, upload-time = "2026-03-01T16:00:26.196Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0b/d7/1959b9648791274998a9c3526f6d0ec8fd2233e4d4acce81bbae76b44b2a/python_dotenv-1.2.2-py3-none-any.whl", hash = "sha256:1d8214789a24de455a8b8bd8ae6fe3c6b69a5e3d64aa8a8e5d68e694bbcb285a", size = 22101, upload-time = "2026-03-01T16:00:25.09Z" }, +] + +[[package]] +name = "python-multipart" +version = "0.0.22" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/94/01/979e98d542a70714b0cb2b6728ed0b7c46792b695e3eaec3e20711271ca3/python_multipart-0.0.22.tar.gz", hash = "sha256:7340bef99a7e0032613f56dc36027b959fd3b30a787ed62d310e951f7c3a3a58", size = 37612, upload-time = "2026-01-25T10:15:56.219Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1b/d0/397f9626e711ff749a95d96b7af99b9c566a9bb5129b8e4c10fc4d100304/python_multipart-0.0.22-py3-none-any.whl", hash = "sha256:2b2cd894c83d21bf49d702499531c7bafd057d730c201782048f7945d82de155", size = 24579, upload-time = "2026-01-25T10:15:54.811Z" }, +] + +[[package]] +name = "python-scratchpad" +version = "0.1.0" +source = { editable = "." } +dependencies = [ + { name = "brother-ql" }, + { name = "fastapi", extra = ["standard"] }, + { name = "jinja2" }, + { name = "pillow" }, + { name = "pyasn1" }, + { name = "pysnmp" }, + { name = "python-telegram-bot" }, + { name = "qrcode", extra = ["pil"] }, + { name = "setuptools" }, +] + +[package.metadata] +requires-dist = [ + { name = "brother-ql", git = "https://github.com/hbrylkowski/brother_ql?rev=4225d13d209e8e4a2c17e87a75f42809e0da8fda" }, + { name = "fastapi", extras = ["standard"], specifier = ">=0.114.0" }, + { name = "jinja2", specifier = ">=3.1.2,<4" }, + { name = "pillow", specifier = ">=9.5.0,<10" }, + { name = "pyasn1", specifier = "==0.4.8,<0.5" }, + { name = "pysnmp", specifier = ">=4.4.12,<5" }, + { name = "python-telegram-bot", specifier = ">=20.3,<21" }, + { name = "qrcode", extras = ["pil"] }, + { name = "setuptools", specifier = "<81" }, +] + +[[package]] +name = "python-telegram-bot" +version = "20.8" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "httpx" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/38/4c/90e0cee1ad7525d4009ae300219c6ee553aedc38cce59c8deb5dffb1859d/python-telegram-bot-20.8.tar.gz", hash = "sha256:0e1e4a6dbce3f4ba606990d66467a5a2d2018368fe44756fae07410a74e960dc", size = 407744, upload-time = "2024-02-08T17:39:19.184Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6f/8e/4e4ed06986557fce0c41c3dfc60c5495b1095cf8a552bdc4c56e96aefdac/python_telegram_bot-20.8-py3-none-any.whl", hash = "sha256:a98ddf2f237d6584b03a2f8b20553e1b5e02c8d3a1ea8e17fd06cc955af78c14", size = 604866, upload-time = "2024-02-08T17:39:12.202Z" }, +] + +[[package]] +name = "pyusb" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/00/6b/ce3727395e52b7b76dfcf0c665e37d223b680b9becc60710d4bc08b7b7cb/pyusb-1.3.1.tar.gz", hash = "sha256:3af070b607467c1c164f49d5b0caabe8ac78dbed9298d703a8dbf9df4052d17e", size = 77281, upload-time = "2025-01-08T23:45:01.866Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/28/b8/27e6312e86408a44fe16bd28ee12dd98608b39f7e7e57884a24e8f29b573/pyusb-1.3.1-py3-none-any.whl", hash = "sha256:bf9b754557af4717fe80c2b07cc2b923a9151f5c08d17bdb5345dac09d6a0430", size = 58465, upload-time = "2025-01-08T23:45:00.029Z" }, +] + +[[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/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 = "qrcode" +version = "8.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8f/b2/7fc2931bfae0af02d5f53b174e9cf701adbb35f39d69c2af63d4a39f81a9/qrcode-8.2.tar.gz", hash = "sha256:35c3f2a4172b33136ab9f6b3ef1c00260dd2f66f858f24d88418a015f446506c", size = 43317, upload-time = "2025-05-01T15:44:24.726Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/dd/b8/d2d6d731733f51684bbf76bf34dab3b70a9148e8f2cef2bb544fccec681a/qrcode-8.2-py3-none-any.whl", hash = "sha256:16e64e0716c14960108e85d853062c9e8bba5ca8252c0b4d0231b9df4060ff4f", size = 45986, upload-time = "2025-05-01T15:44:22.781Z" }, +] + +[package.optional-dependencies] +pil = [ + { name = "pillow" }, +] + +[[package]] +name = "requests" +version = "2.32.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "charset-normalizer" }, + { name = "idna" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c9/74/b3ff8e6c8446842c3f5c837e9c3dfcfe2018ea6ecef224c710c85ef728f4/requests-2.32.5.tar.gz", hash = "sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf", size = 134517, upload-time = "2025-08-18T20:46:02.573Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6", size = 64738, upload-time = "2025-08-18T20:46:00.542Z" }, +] + +[[package]] +name = "rich" +version = "14.3.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown-it-py" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b3/c6/f3b320c27991c46f43ee9d856302c70dc2d0fb2dba4842ff739d5f46b393/rich-14.3.3.tar.gz", hash = "sha256:b8daa0b9e4eef54dd8cf7c86c03713f53241884e814f4e2f5fb342fe520f639b", size = 230582, upload-time = "2026-02-19T17:23:12.474Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/14/25/b208c5683343959b670dc001595f2f3737e051da617f66c31f7c4fa93abc/rich-14.3.3-py3-none-any.whl", hash = "sha256:793431c1f8619afa7d3b52b2cdec859562b950ea0d4b6b505397612db8d5362d", size = 310458, upload-time = "2026-02-19T17:23:13.732Z" }, +] + +[[package]] +name = "rich-toolkit" +version = "0.19.7" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "rich" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/42/ba/dae9e3096651042754da419a4042bc1c75e07d615f9b15066d738838e4df/rich_toolkit-0.19.7.tar.gz", hash = "sha256:133c0915872da91d4c25d85342d5ec1dfacc69b63448af1a08a0d4b4f23ef46e", size = 195877, upload-time = "2026-02-24T16:06:20.555Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fb/3c/c923619f6d2f5fafcc96fec0aaf9550a46cd5b6481f06e0c6b66a2a4fed0/rich_toolkit-0.19.7-py3-none-any.whl", hash = "sha256:0288e9203728c47c5a4eb60fd2f0692d9df7455a65901ab6f898437a2ba5989d", size = 32963, upload-time = "2026-02-24T16:06:22.066Z" }, +] + +[[package]] +name = "setuptools" +version = "80.10.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/76/95/faf61eb8363f26aa7e1d762267a8d602a1b26d4f3a1e758e92cb3cb8b054/setuptools-80.10.2.tar.gz", hash = "sha256:8b0e9d10c784bf7d262c4e5ec5d4ec94127ce206e8738f29a437945fbc219b70", size = 1200343, upload-time = "2026-01-25T22:38:17.252Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/94/b8/f1f62a5e3c0ad2ff1d189590bfa4c46b4f3b6e49cef6f26c6ee4e575394d/setuptools-80.10.2-py3-none-any.whl", hash = "sha256:95b30ddfb717250edb492926c92b5221f7ef3fbcc2b07579bcd4a27da21d0173", size = 1064234, upload-time = "2026-01-25T22:38:15.216Z" }, +] + +[[package]] +name = "shellingham" +version = "1.5.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310, upload-time = "2023-10-24T04:13:40.426Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755, upload-time = "2023-10-24T04:13:38.866Z" }, +] + +[[package]] +name = "sniffio" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372, upload-time = "2024-02-25T23:20:04.057Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235, upload-time = "2024-02-25T23:20:01.196Z" }, +] + +[[package]] +name = "starlette" +version = "0.46.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ce/20/08dfcd9c983f6a6f4a1000d934b9e6d626cff8d2eeb77a89a68eef20a2b7/starlette-0.46.2.tar.gz", hash = "sha256:7f7361f34eed179294600af672f565727419830b54b7b084efe44bb82d2fccd5", size = 2580846, upload-time = "2025-04-13T13:56:17.942Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8b/0c/9d30a4ebeb6db2b25a841afbb80f6ef9a854fc3b41be131d249a977b4959/starlette-0.46.2-py3-none-any.whl", hash = "sha256:595633ce89f8ffa71a015caed34a5b2dc1c0cdb3f0f1fbd1e69339cf2abeec35", size = 72037, upload-time = "2025-04-13T13:56:16.21Z" }, +] + +[[package]] +name = "typer" +version = "0.24.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "annotated-doc" }, + { name = "click" }, + { name = "rich" }, + { name = "shellingham" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f5/24/cb09efec5cc954f7f9b930bf8279447d24618bb6758d4f6adf2574c41780/typer-0.24.1.tar.gz", hash = "sha256:e39b4732d65fbdcde189ae76cf7cd48aeae72919dea1fdfc16593be016256b45", size = 118613, upload-time = "2026-02-21T16:54:40.609Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4a/91/48db081e7a63bb37284f9fbcefda7c44c277b18b0e13fbc36ea2335b71e6/typer-0.24.1-py3-none-any.whl", hash = "sha256:112c1f0ce578bfb4cab9ffdabc68f031416ebcc216536611ba21f04e9aa84c9e", size = 56085, upload-time = "2026-02-21T16:54:41.616Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.15.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", size = 109391, upload-time = "2025-08-25T13:49:26.313Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614, upload-time = "2025-08-25T13:49:24.86Z" }, +] + +[[package]] +name = "urllib3" +version = "2.6.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c7/24/5f1b3bdffd70275f6661c76461e25f024d5a38a46f04aaca912426a2b1d3/urllib3-2.6.3.tar.gz", hash = "sha256:1b62b6884944a57dbe321509ab94fd4d3b307075e0c2eae991ac71ee15ad38ed", size = 435556, upload-time = "2026-01-07T16:24:43.925Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl", hash = "sha256:bf272323e553dfb2e87d9bfd225ca7b0f467b919d7bbd355436d3fd37cb0acd4", size = 131584, upload-time = "2026-01-07T16:24:42.685Z" }, +] + +[[package]] +name = "uvicorn" +version = "0.41.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "h11" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/32/ce/eeb58ae4ac36fe09e3842eb02e0eb676bf2c53ae062b98f1b2531673efdd/uvicorn-0.41.0.tar.gz", hash = "sha256:09d11cf7008da33113824ee5a1c6422d89fbc2ff476540d69a34c87fab8b571a", size = 82633, upload-time = "2026-02-16T23:07:24.1Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/83/e4/d04a086285c20886c0daad0e026f250869201013d18f81d9ff5eada73a88/uvicorn-0.41.0-py3-none-any.whl", hash = "sha256:29e35b1d2c36a04b9e180d4007ede3bcb32a85fbdfd6c6aeb3f26839de088187", size = 68783, upload-time = "2026-02-16T23:07:22.357Z" }, +] + +[package.optional-dependencies] +standard = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "httptools" }, + { name = "python-dotenv" }, + { name = "pyyaml" }, + { name = "uvloop", marker = "platform_python_implementation != 'PyPy' and sys_platform != 'cygwin' and sys_platform != 'win32'" }, + { name = "watchfiles" }, + { name = "websockets" }, +] + +[[package]] +name = "uvloop" +version = "0.22.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/06/f0/18d39dbd1971d6d62c4629cc7fa67f74821b0dc1f5a77af43719de7936a7/uvloop-0.22.1.tar.gz", hash = "sha256:6c84bae345b9147082b17371e3dd5d42775bddce91f885499017f4607fdaf39f", size = 2443250, upload-time = "2025-10-16T22:17:19.342Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c7/d5/69900f7883235562f1f50d8184bb7dd84a2fb61e9ec63f3782546fdbd057/uvloop-0.22.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c60ebcd36f7b240b30788554b6f0782454826a0ed765d8430652621b5de674b9", size = 1352420, upload-time = "2025-10-16T22:16:21.187Z" }, + { url = "https://files.pythonhosted.org/packages/a8/73/c4e271b3bce59724e291465cc936c37758886a4868787da0278b3b56b905/uvloop-0.22.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3b7f102bf3cb1995cfeaee9321105e8f5da76fdb104cdad8986f85461a1b7b77", size = 748677, upload-time = "2025-10-16T22:16:22.558Z" }, + { url = "https://files.pythonhosted.org/packages/86/94/9fb7fad2f824d25f8ecac0d70b94d0d48107ad5ece03769a9c543444f78a/uvloop-0.22.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:53c85520781d84a4b8b230e24a5af5b0778efdb39142b424990ff1ef7c48ba21", size = 3753819, upload-time = "2025-10-16T22:16:23.903Z" }, + { url = "https://files.pythonhosted.org/packages/74/4f/256aca690709e9b008b7108bc85fba619a2bc37c6d80743d18abad16ee09/uvloop-0.22.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:56a2d1fae65fd82197cb8c53c367310b3eabe1bbb9fb5a04d28e3e3520e4f702", size = 3804529, upload-time = "2025-10-16T22:16:25.246Z" }, + { url = "https://files.pythonhosted.org/packages/7f/74/03c05ae4737e871923d21a76fe28b6aad57f5c03b6e6bfcfa5ad616013e4/uvloop-0.22.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:40631b049d5972c6755b06d0bfe8233b1bd9a8a6392d9d1c45c10b6f9e9b2733", size = 3621267, upload-time = "2025-10-16T22:16:26.819Z" }, + { url = "https://files.pythonhosted.org/packages/75/be/f8e590fe61d18b4a92070905497aec4c0e64ae1761498cad09023f3f4b3e/uvloop-0.22.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:535cc37b3a04f6cd2c1ef65fa1d370c9a35b6695df735fcff5427323f2cd5473", size = 3723105, upload-time = "2025-10-16T22:16:28.252Z" }, + { url = "https://files.pythonhosted.org/packages/3d/ff/7f72e8170be527b4977b033239a83a68d5c881cc4775fca255c677f7ac5d/uvloop-0.22.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:fe94b4564e865d968414598eea1a6de60adba0c040ba4ed05ac1300de402cd42", size = 1359936, upload-time = "2025-10-16T22:16:29.436Z" }, + { url = "https://files.pythonhosted.org/packages/c3/c6/e5d433f88fd54d81ef4be58b2b7b0cea13c442454a1db703a1eea0db1a59/uvloop-0.22.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:51eb9bd88391483410daad430813d982010f9c9c89512321f5b60e2cddbdddd6", size = 752769, upload-time = "2025-10-16T22:16:30.493Z" }, + { url = "https://files.pythonhosted.org/packages/24/68/a6ac446820273e71aa762fa21cdcc09861edd3536ff47c5cd3b7afb10eeb/uvloop-0.22.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:700e674a166ca5778255e0e1dc4e9d79ab2acc57b9171b79e65feba7184b3370", size = 4317413, upload-time = "2025-10-16T22:16:31.644Z" }, + { url = "https://files.pythonhosted.org/packages/5f/6f/e62b4dfc7ad6518e7eff2516f680d02a0f6eb62c0c212e152ca708a0085e/uvloop-0.22.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7b5b1ac819a3f946d3b2ee07f09149578ae76066d70b44df3fa990add49a82e4", size = 4426307, upload-time = "2025-10-16T22:16:32.917Z" }, + { url = "https://files.pythonhosted.org/packages/90/60/97362554ac21e20e81bcef1150cb2a7e4ffdaf8ea1e5b2e8bf7a053caa18/uvloop-0.22.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e047cc068570bac9866237739607d1313b9253c3051ad84738cbb095be0537b2", size = 4131970, upload-time = "2025-10-16T22:16:34.015Z" }, + { url = "https://files.pythonhosted.org/packages/99/39/6b3f7d234ba3964c428a6e40006340f53ba37993f46ed6e111c6e9141d18/uvloop-0.22.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:512fec6815e2dd45161054592441ef76c830eddaad55c8aa30952e6fe1ed07c0", size = 4296343, upload-time = "2025-10-16T22:16:35.149Z" }, + { url = "https://files.pythonhosted.org/packages/89/8c/182a2a593195bfd39842ea68ebc084e20c850806117213f5a299dfc513d9/uvloop-0.22.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:561577354eb94200d75aca23fbde86ee11be36b00e52a4eaf8f50fb0c86b7705", size = 1358611, upload-time = "2025-10-16T22:16:36.833Z" }, + { url = "https://files.pythonhosted.org/packages/d2/14/e301ee96a6dc95224b6f1162cd3312f6d1217be3907b79173b06785f2fe7/uvloop-0.22.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1cdf5192ab3e674ca26da2eada35b288d2fa49fdd0f357a19f0e7c4e7d5077c8", size = 751811, upload-time = "2025-10-16T22:16:38.275Z" }, + { url = "https://files.pythonhosted.org/packages/b7/02/654426ce265ac19e2980bfd9ea6590ca96a56f10c76e63801a2df01c0486/uvloop-0.22.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6e2ea3d6190a2968f4a14a23019d3b16870dd2190cd69c8180f7c632d21de68d", size = 4288562, upload-time = "2025-10-16T22:16:39.375Z" }, + { url = "https://files.pythonhosted.org/packages/15/c0/0be24758891ef825f2065cd5db8741aaddabe3e248ee6acc5e8a80f04005/uvloop-0.22.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0530a5fbad9c9e4ee3f2b33b148c6a64d47bbad8000ea63704fa8260f4cf728e", size = 4366890, upload-time = "2025-10-16T22:16:40.547Z" }, + { url = "https://files.pythonhosted.org/packages/d2/53/8369e5219a5855869bcee5f4d317f6da0e2c669aecf0ef7d371e3d084449/uvloop-0.22.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bc5ef13bbc10b5335792360623cc378d52d7e62c2de64660616478c32cd0598e", size = 4119472, upload-time = "2025-10-16T22:16:41.694Z" }, + { url = "https://files.pythonhosted.org/packages/f8/ba/d69adbe699b768f6b29a5eec7b47dd610bd17a69de51b251126a801369ea/uvloop-0.22.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:1f38ec5e3f18c8a10ded09742f7fb8de0108796eb673f30ce7762ce1b8550cad", size = 4239051, upload-time = "2025-10-16T22:16:43.224Z" }, + { url = "https://files.pythonhosted.org/packages/90/cd/b62bdeaa429758aee8de8b00ac0dd26593a9de93d302bff3d21439e9791d/uvloop-0.22.1-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:3879b88423ec7e97cd4eba2a443aa26ed4e59b45e6b76aabf13fe2f27023a142", size = 1362067, upload-time = "2025-10-16T22:16:44.503Z" }, + { url = "https://files.pythonhosted.org/packages/0d/f8/a132124dfda0777e489ca86732e85e69afcd1ff7686647000050ba670689/uvloop-0.22.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:4baa86acedf1d62115c1dc6ad1e17134476688f08c6efd8a2ab076e815665c74", size = 752423, upload-time = "2025-10-16T22:16:45.968Z" }, + { url = "https://files.pythonhosted.org/packages/a3/94/94af78c156f88da4b3a733773ad5ba0b164393e357cc4bd0ab2e2677a7d6/uvloop-0.22.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:297c27d8003520596236bdb2335e6b3f649480bd09e00d1e3a99144b691d2a35", size = 4272437, upload-time = "2025-10-16T22:16:47.451Z" }, + { url = "https://files.pythonhosted.org/packages/b5/35/60249e9fd07b32c665192cec7af29e06c7cd96fa1d08b84f012a56a0b38e/uvloop-0.22.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c1955d5a1dd43198244d47664a5858082a3239766a839b2102a269aaff7a4e25", size = 4292101, upload-time = "2025-10-16T22:16:49.318Z" }, + { url = "https://files.pythonhosted.org/packages/02/62/67d382dfcb25d0a98ce73c11ed1a6fba5037a1a1d533dcbb7cab033a2636/uvloop-0.22.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b31dc2fccbd42adc73bc4e7cdbae4fc5086cf378979e53ca5d0301838c5682c6", size = 4114158, upload-time = "2025-10-16T22:16:50.517Z" }, + { url = "https://files.pythonhosted.org/packages/f0/7a/f1171b4a882a5d13c8b7576f348acfe6074d72eaf52cccef752f748d4a9f/uvloop-0.22.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:93f617675b2d03af4e72a5333ef89450dfaa5321303ede6e67ba9c9d26878079", size = 4177360, upload-time = "2025-10-16T22:16:52.646Z" }, + { url = "https://files.pythonhosted.org/packages/79/7b/b01414f31546caf0919da80ad57cbfe24c56b151d12af68cee1b04922ca8/uvloop-0.22.1-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:37554f70528f60cad66945b885eb01f1bb514f132d92b6eeed1c90fd54ed6289", size = 1454790, upload-time = "2025-10-16T22:16:54.355Z" }, + { url = "https://files.pythonhosted.org/packages/d4/31/0bb232318dd838cad3fa8fb0c68c8b40e1145b32025581975e18b11fab40/uvloop-0.22.1-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:b76324e2dc033a0b2f435f33eb88ff9913c156ef78e153fb210e03c13da746b3", size = 796783, upload-time = "2025-10-16T22:16:55.906Z" }, + { url = "https://files.pythonhosted.org/packages/42/38/c9b09f3271a7a723a5de69f8e237ab8e7803183131bc57c890db0b6bb872/uvloop-0.22.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:badb4d8e58ee08dad957002027830d5c3b06aea446a6a3744483c2b3b745345c", size = 4647548, upload-time = "2025-10-16T22:16:57.008Z" }, + { url = "https://files.pythonhosted.org/packages/c1/37/945b4ca0ac27e3dc4952642d4c900edd030b3da6c9634875af6e13ae80e5/uvloop-0.22.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b91328c72635f6f9e0282e4a57da7470c7350ab1c9f48546c0f2866205349d21", size = 4467065, upload-time = "2025-10-16T22:16:58.206Z" }, + { url = "https://files.pythonhosted.org/packages/97/cc/48d232f33d60e2e2e0b42f4e73455b146b76ebe216487e862700457fbf3c/uvloop-0.22.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:daf620c2995d193449393d6c62131b3fbd40a63bf7b307a1527856ace637fe88", size = 4328384, upload-time = "2025-10-16T22:16:59.36Z" }, + { url = "https://files.pythonhosted.org/packages/e4/16/c1fd27e9549f3c4baf1dc9c20c456cd2f822dbf8de9f463824b0c0357e06/uvloop-0.22.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6cde23eeda1a25c75b2e07d39970f3374105d5eafbaab2a4482be82f272d5a5e", size = 4296730, upload-time = "2025-10-16T22:17:00.744Z" }, +] + +[[package]] +name = "watchfiles" +version = "1.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c2/c9/8869df9b2a2d6c59d79220a4db37679e74f807c559ffe5265e08b227a210/watchfiles-1.1.1.tar.gz", hash = "sha256:a173cb5c16c4f40ab19cecf48a534c409f7ea983ab8fed0741304a1c0a31b3f2", size = 94440, upload-time = "2025-10-14T15:06:21.08Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1f/f8/2c5f479fb531ce2f0564eda479faecf253d886b1ab3630a39b7bf7362d46/watchfiles-1.1.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:f57b396167a2565a4e8b5e56a5a1c537571733992b226f4f1197d79e94cf0ae5", size = 406529, upload-time = "2025-10-14T15:04:32.899Z" }, + { url = "https://files.pythonhosted.org/packages/fe/cd/f515660b1f32f65df671ddf6f85bfaca621aee177712874dc30a97397977/watchfiles-1.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:421e29339983e1bebc281fab40d812742268ad057db4aee8c4d2bce0af43b741", size = 394384, upload-time = "2025-10-14T15:04:33.761Z" }, + { url = "https://files.pythonhosted.org/packages/7b/c3/28b7dc99733eab43fca2d10f55c86e03bd6ab11ca31b802abac26b23d161/watchfiles-1.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6e43d39a741e972bab5d8100b5cdacf69db64e34eb19b6e9af162bccf63c5cc6", size = 448789, upload-time = "2025-10-14T15:04:34.679Z" }, + { url = "https://files.pythonhosted.org/packages/4a/24/33e71113b320030011c8e4316ccca04194bf0cbbaeee207f00cbc7d6b9f5/watchfiles-1.1.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f537afb3276d12814082a2e9b242bdcf416c2e8fd9f799a737990a1dbe906e5b", size = 460521, upload-time = "2025-10-14T15:04:35.963Z" }, + { url = "https://files.pythonhosted.org/packages/f4/c3/3c9a55f255aa57b91579ae9e98c88704955fa9dac3e5614fb378291155df/watchfiles-1.1.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b2cd9e04277e756a2e2d2543d65d1e2166d6fd4c9b183f8808634fda23f17b14", size = 488722, upload-time = "2025-10-14T15:04:37.091Z" }, + { url = "https://files.pythonhosted.org/packages/49/36/506447b73eb46c120169dc1717fe2eff07c234bb3232a7200b5f5bd816e9/watchfiles-1.1.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5f3f58818dc0b07f7d9aa7fe9eb1037aecb9700e63e1f6acfed13e9fef648f5d", size = 596088, upload-time = "2025-10-14T15:04:38.39Z" }, + { url = "https://files.pythonhosted.org/packages/82/ab/5f39e752a9838ec4d52e9b87c1e80f1ee3ccdbe92e183c15b6577ab9de16/watchfiles-1.1.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9bb9f66367023ae783551042d31b1d7fd422e8289eedd91f26754a66f44d5cff", size = 472923, upload-time = "2025-10-14T15:04:39.666Z" }, + { url = "https://files.pythonhosted.org/packages/af/b9/a419292f05e302dea372fa7e6fda5178a92998411f8581b9830d28fb9edb/watchfiles-1.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aebfd0861a83e6c3d1110b78ad54704486555246e542be3e2bb94195eabb2606", size = 456080, upload-time = "2025-10-14T15:04:40.643Z" }, + { url = "https://files.pythonhosted.org/packages/b0/c3/d5932fd62bde1a30c36e10c409dc5d54506726f08cb3e1d8d0ba5e2bc8db/watchfiles-1.1.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:5fac835b4ab3c6487b5dbad78c4b3724e26bcc468e886f8ba8cc4306f68f6701", size = 629432, upload-time = "2025-10-14T15:04:41.789Z" }, + { url = "https://files.pythonhosted.org/packages/f7/77/16bddd9779fafb795f1a94319dc965209c5641db5bf1edbbccace6d1b3c0/watchfiles-1.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:399600947b170270e80134ac854e21b3ccdefa11a9529a3decc1327088180f10", size = 623046, upload-time = "2025-10-14T15:04:42.718Z" }, + { url = "https://files.pythonhosted.org/packages/46/ef/f2ecb9a0f342b4bfad13a2787155c6ee7ce792140eac63a34676a2feeef2/watchfiles-1.1.1-cp311-cp311-win32.whl", hash = "sha256:de6da501c883f58ad50db3a32ad397b09ad29865b5f26f64c24d3e3281685849", size = 271473, upload-time = "2025-10-14T15:04:43.624Z" }, + { url = "https://files.pythonhosted.org/packages/94/bc/f42d71125f19731ea435c3948cad148d31a64fccde3867e5ba4edee901f9/watchfiles-1.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:35c53bd62a0b885bf653ebf6b700d1bf05debb78ad9292cf2a942b23513dc4c4", size = 287598, upload-time = "2025-10-14T15:04:44.516Z" }, + { url = "https://files.pythonhosted.org/packages/57/c9/a30f897351f95bbbfb6abcadafbaca711ce1162f4db95fc908c98a9165f3/watchfiles-1.1.1-cp311-cp311-win_arm64.whl", hash = "sha256:57ca5281a8b5e27593cb7d82c2ac927ad88a96ed406aa446f6344e4328208e9e", size = 277210, upload-time = "2025-10-14T15:04:45.883Z" }, + { url = "https://files.pythonhosted.org/packages/74/d5/f039e7e3c639d9b1d09b07ea412a6806d38123f0508e5f9b48a87b0a76cc/watchfiles-1.1.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:8c89f9f2f740a6b7dcc753140dd5e1ab9215966f7a3530d0c0705c83b401bd7d", size = 404745, upload-time = "2025-10-14T15:04:46.731Z" }, + { url = "https://files.pythonhosted.org/packages/a5/96/a881a13aa1349827490dab2d363c8039527060cfcc2c92cc6d13d1b1049e/watchfiles-1.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bd404be08018c37350f0d6e34676bd1e2889990117a2b90070b3007f172d0610", size = 391769, upload-time = "2025-10-14T15:04:48.003Z" }, + { url = "https://files.pythonhosted.org/packages/4b/5b/d3b460364aeb8da471c1989238ea0e56bec24b6042a68046adf3d9ddb01c/watchfiles-1.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8526e8f916bb5b9a0a777c8317c23ce65de259422bba5b31325a6fa6029d33af", size = 449374, upload-time = "2025-10-14T15:04:49.179Z" }, + { url = "https://files.pythonhosted.org/packages/b9/44/5769cb62d4ed055cb17417c0a109a92f007114a4e07f30812a73a4efdb11/watchfiles-1.1.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2edc3553362b1c38d9f06242416a5d8e9fe235c204a4072e988ce2e5bb1f69f6", size = 459485, upload-time = "2025-10-14T15:04:50.155Z" }, + { url = "https://files.pythonhosted.org/packages/19/0c/286b6301ded2eccd4ffd0041a1b726afda999926cf720aab63adb68a1e36/watchfiles-1.1.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:30f7da3fb3f2844259cba4720c3fc7138eb0f7b659c38f3bfa65084c7fc7abce", size = 488813, upload-time = "2025-10-14T15:04:51.059Z" }, + { url = "https://files.pythonhosted.org/packages/c7/2b/8530ed41112dd4a22f4dcfdb5ccf6a1baad1ff6eed8dc5a5f09e7e8c41c7/watchfiles-1.1.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f8979280bdafff686ba5e4d8f97840f929a87ed9cdf133cbbd42f7766774d2aa", size = 594816, upload-time = "2025-10-14T15:04:52.031Z" }, + { url = "https://files.pythonhosted.org/packages/ce/d2/f5f9fb49489f184f18470d4f99f4e862a4b3e9ac2865688eb2099e3d837a/watchfiles-1.1.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dcc5c24523771db3a294c77d94771abcfcb82a0e0ee8efd910c37c59ec1b31bb", size = 475186, upload-time = "2025-10-14T15:04:53.064Z" }, + { url = "https://files.pythonhosted.org/packages/cf/68/5707da262a119fb06fbe214d82dd1fe4a6f4af32d2d14de368d0349eb52a/watchfiles-1.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1db5d7ae38ff20153d542460752ff397fcf5c96090c1230803713cf3147a6803", size = 456812, upload-time = "2025-10-14T15:04:55.174Z" }, + { url = "https://files.pythonhosted.org/packages/66/ab/3cbb8756323e8f9b6f9acb9ef4ec26d42b2109bce830cc1f3468df20511d/watchfiles-1.1.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:28475ddbde92df1874b6c5c8aaeb24ad5be47a11f87cde5a28ef3835932e3e94", size = 630196, upload-time = "2025-10-14T15:04:56.22Z" }, + { url = "https://files.pythonhosted.org/packages/78/46/7152ec29b8335f80167928944a94955015a345440f524d2dfe63fc2f437b/watchfiles-1.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:36193ed342f5b9842edd3532729a2ad55c4160ffcfa3700e0d54be496b70dd43", size = 622657, upload-time = "2025-10-14T15:04:57.521Z" }, + { url = "https://files.pythonhosted.org/packages/0a/bf/95895e78dd75efe9a7f31733607f384b42eb5feb54bd2eb6ed57cc2e94f4/watchfiles-1.1.1-cp312-cp312-win32.whl", hash = "sha256:859e43a1951717cc8de7f4c77674a6d389b106361585951d9e69572823f311d9", size = 272042, upload-time = "2025-10-14T15:04:59.046Z" }, + { url = "https://files.pythonhosted.org/packages/87/0a/90eb755f568de2688cb220171c4191df932232c20946966c27a59c400850/watchfiles-1.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:91d4c9a823a8c987cce8fa2690923b069966dabb196dd8d137ea2cede885fde9", size = 288410, upload-time = "2025-10-14T15:05:00.081Z" }, + { url = "https://files.pythonhosted.org/packages/36/76/f322701530586922fbd6723c4f91ace21364924822a8772c549483abed13/watchfiles-1.1.1-cp312-cp312-win_arm64.whl", hash = "sha256:a625815d4a2bdca61953dbba5a39d60164451ef34c88d751f6c368c3ea73d404", size = 278209, upload-time = "2025-10-14T15:05:01.168Z" }, + { url = "https://files.pythonhosted.org/packages/bb/f4/f750b29225fe77139f7ae5de89d4949f5a99f934c65a1f1c0b248f26f747/watchfiles-1.1.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:130e4876309e8686a5e37dba7d5e9bc77e6ed908266996ca26572437a5271e18", size = 404321, upload-time = "2025-10-14T15:05:02.063Z" }, + { url = "https://files.pythonhosted.org/packages/2b/f9/f07a295cde762644aa4c4bb0f88921d2d141af45e735b965fb2e87858328/watchfiles-1.1.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5f3bde70f157f84ece3765b42b4a52c6ac1a50334903c6eaf765362f6ccca88a", size = 391783, upload-time = "2025-10-14T15:05:03.052Z" }, + { url = "https://files.pythonhosted.org/packages/bc/11/fc2502457e0bea39a5c958d86d2cb69e407a4d00b85735ca724bfa6e0d1a/watchfiles-1.1.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:14e0b1fe858430fc0251737ef3824c54027bedb8c37c38114488b8e131cf8219", size = 449279, upload-time = "2025-10-14T15:05:04.004Z" }, + { url = "https://files.pythonhosted.org/packages/e3/1f/d66bc15ea0b728df3ed96a539c777acfcad0eb78555ad9efcaa1274688f0/watchfiles-1.1.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f27db948078f3823a6bb3b465180db8ebecf26dd5dae6f6180bd87383b6b4428", size = 459405, upload-time = "2025-10-14T15:05:04.942Z" }, + { url = "https://files.pythonhosted.org/packages/be/90/9f4a65c0aec3ccf032703e6db02d89a157462fbb2cf20dd415128251cac0/watchfiles-1.1.1-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:059098c3a429f62fc98e8ec62b982230ef2c8df68c79e826e37b895bc359a9c0", size = 488976, upload-time = "2025-10-14T15:05:05.905Z" }, + { url = "https://files.pythonhosted.org/packages/37/57/ee347af605d867f712be7029bb94c8c071732a4b44792e3176fa3c612d39/watchfiles-1.1.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bfb5862016acc9b869bb57284e6cb35fdf8e22fe59f7548858e2f971d045f150", size = 595506, upload-time = "2025-10-14T15:05:06.906Z" }, + { url = "https://files.pythonhosted.org/packages/a8/78/cc5ab0b86c122047f75e8fc471c67a04dee395daf847d3e59381996c8707/watchfiles-1.1.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:319b27255aacd9923b8a276bb14d21a5f7ff82564c744235fc5eae58d95422ae", size = 474936, upload-time = "2025-10-14T15:05:07.906Z" }, + { url = "https://files.pythonhosted.org/packages/62/da/def65b170a3815af7bd40a3e7010bf6ab53089ef1b75d05dd5385b87cf08/watchfiles-1.1.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c755367e51db90e75b19454b680903631d41f9e3607fbd941d296a020c2d752d", size = 456147, upload-time = "2025-10-14T15:05:09.138Z" }, + { url = "https://files.pythonhosted.org/packages/57/99/da6573ba71166e82d288d4df0839128004c67d2778d3b566c138695f5c0b/watchfiles-1.1.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:c22c776292a23bfc7237a98f791b9ad3144b02116ff10d820829ce62dff46d0b", size = 630007, upload-time = "2025-10-14T15:05:10.117Z" }, + { url = "https://files.pythonhosted.org/packages/a8/51/7439c4dd39511368849eb1e53279cd3454b4a4dbace80bab88feeb83c6b5/watchfiles-1.1.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:3a476189be23c3686bc2f4321dd501cb329c0a0469e77b7b534ee10129ae6374", size = 622280, upload-time = "2025-10-14T15:05:11.146Z" }, + { url = "https://files.pythonhosted.org/packages/95/9c/8ed97d4bba5db6fdcdb2b298d3898f2dd5c20f6b73aee04eabe56c59677e/watchfiles-1.1.1-cp313-cp313-win32.whl", hash = "sha256:bf0a91bfb5574a2f7fc223cf95eeea79abfefa404bf1ea5e339c0c1560ae99a0", size = 272056, upload-time = "2025-10-14T15:05:12.156Z" }, + { url = "https://files.pythonhosted.org/packages/1f/f3/c14e28429f744a260d8ceae18bf58c1d5fa56b50d006a7a9f80e1882cb0d/watchfiles-1.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:52e06553899e11e8074503c8e716d574adeeb7e68913115c4b3653c53f9bae42", size = 288162, upload-time = "2025-10-14T15:05:13.208Z" }, + { url = "https://files.pythonhosted.org/packages/dc/61/fe0e56c40d5cd29523e398d31153218718c5786b5e636d9ae8ae79453d27/watchfiles-1.1.1-cp313-cp313-win_arm64.whl", hash = "sha256:ac3cc5759570cd02662b15fbcd9d917f7ecd47efe0d6b40474eafd246f91ea18", size = 277909, upload-time = "2025-10-14T15:05:14.49Z" }, + { url = "https://files.pythonhosted.org/packages/79/42/e0a7d749626f1e28c7108a99fb9bf524b501bbbeb9b261ceecde644d5a07/watchfiles-1.1.1-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:563b116874a9a7ce6f96f87cd0b94f7faf92d08d0021e837796f0a14318ef8da", size = 403389, upload-time = "2025-10-14T15:05:15.777Z" }, + { url = "https://files.pythonhosted.org/packages/15/49/08732f90ce0fbbc13913f9f215c689cfc9ced345fb1bcd8829a50007cc8d/watchfiles-1.1.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3ad9fe1dae4ab4212d8c91e80b832425e24f421703b5a42ef2e4a1e215aff051", size = 389964, upload-time = "2025-10-14T15:05:16.85Z" }, + { url = "https://files.pythonhosted.org/packages/27/0d/7c315d4bd5f2538910491a0393c56bf70d333d51bc5b34bee8e68e8cea19/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce70f96a46b894b36eba678f153f052967a0d06d5b5a19b336ab0dbbd029f73e", size = 448114, upload-time = "2025-10-14T15:05:17.876Z" }, + { url = "https://files.pythonhosted.org/packages/c3/24/9e096de47a4d11bc4df41e9d1e61776393eac4cb6eb11b3e23315b78b2cc/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:cb467c999c2eff23a6417e58d75e5828716f42ed8289fe6b77a7e5a91036ca70", size = 460264, upload-time = "2025-10-14T15:05:18.962Z" }, + { url = "https://files.pythonhosted.org/packages/cc/0f/e8dea6375f1d3ba5fcb0b3583e2b493e77379834c74fd5a22d66d85d6540/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:836398932192dae4146c8f6f737d74baeac8b70ce14831a239bdb1ca882fc261", size = 487877, upload-time = "2025-10-14T15:05:20.094Z" }, + { url = "https://files.pythonhosted.org/packages/ac/5b/df24cfc6424a12deb41503b64d42fbea6b8cb357ec62ca84a5a3476f654a/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:743185e7372b7bc7c389e1badcc606931a827112fbbd37f14c537320fca08620", size = 595176, upload-time = "2025-10-14T15:05:21.134Z" }, + { url = "https://files.pythonhosted.org/packages/8f/b5/853b6757f7347de4e9b37e8cc3289283fb983cba1ab4d2d7144694871d9c/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:afaeff7696e0ad9f02cbb8f56365ff4686ab205fcf9c4c5b6fdfaaa16549dd04", size = 473577, upload-time = "2025-10-14T15:05:22.306Z" }, + { url = "https://files.pythonhosted.org/packages/e1/f7/0a4467be0a56e80447c8529c9fce5b38eab4f513cb3d9bf82e7392a5696b/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f7eb7da0eb23aa2ba036d4f616d46906013a68caf61b7fdbe42fc8b25132e77", size = 455425, upload-time = "2025-10-14T15:05:23.348Z" }, + { url = "https://files.pythonhosted.org/packages/8e/e0/82583485ea00137ddf69bc84a2db88bd92ab4a6e3c405e5fb878ead8d0e7/watchfiles-1.1.1-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:831a62658609f0e5c64178211c942ace999517f5770fe9436be4c2faeba0c0ef", size = 628826, upload-time = "2025-10-14T15:05:24.398Z" }, + { url = "https://files.pythonhosted.org/packages/28/9a/a785356fccf9fae84c0cc90570f11702ae9571036fb25932f1242c82191c/watchfiles-1.1.1-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:f9a2ae5c91cecc9edd47e041a930490c31c3afb1f5e6d71de3dc671bfaca02bf", size = 622208, upload-time = "2025-10-14T15:05:25.45Z" }, + { url = "https://files.pythonhosted.org/packages/c3/f4/0872229324ef69b2c3edec35e84bd57a1289e7d3fe74588048ed8947a323/watchfiles-1.1.1-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:d1715143123baeeaeadec0528bb7441103979a1d5f6fd0e1f915383fea7ea6d5", size = 404315, upload-time = "2025-10-14T15:05:26.501Z" }, + { url = "https://files.pythonhosted.org/packages/7b/22/16d5331eaed1cb107b873f6ae1b69e9ced582fcf0c59a50cd84f403b1c32/watchfiles-1.1.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:39574d6370c4579d7f5d0ad940ce5b20db0e4117444e39b6d8f99db5676c52fd", size = 390869, upload-time = "2025-10-14T15:05:27.649Z" }, + { url = "https://files.pythonhosted.org/packages/b2/7e/5643bfff5acb6539b18483128fdc0ef2cccc94a5b8fbda130c823e8ed636/watchfiles-1.1.1-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7365b92c2e69ee952902e8f70f3ba6360d0d596d9299d55d7d386df84b6941fb", size = 449919, upload-time = "2025-10-14T15:05:28.701Z" }, + { url = "https://files.pythonhosted.org/packages/51/2e/c410993ba5025a9f9357c376f48976ef0e1b1aefb73b97a5ae01a5972755/watchfiles-1.1.1-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bfff9740c69c0e4ed32416f013f3c45e2ae42ccedd1167ef2d805c000b6c71a5", size = 460845, upload-time = "2025-10-14T15:05:30.064Z" }, + { url = "https://files.pythonhosted.org/packages/8e/a4/2df3b404469122e8680f0fcd06079317e48db58a2da2950fb45020947734/watchfiles-1.1.1-cp314-cp314-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b27cf2eb1dda37b2089e3907d8ea92922b673c0c427886d4edc6b94d8dfe5db3", size = 489027, upload-time = "2025-10-14T15:05:31.064Z" }, + { url = "https://files.pythonhosted.org/packages/ea/84/4587ba5b1f267167ee715b7f66e6382cca6938e0a4b870adad93e44747e6/watchfiles-1.1.1-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:526e86aced14a65a5b0ec50827c745597c782ff46b571dbfe46192ab9e0b3c33", size = 595615, upload-time = "2025-10-14T15:05:32.074Z" }, + { url = "https://files.pythonhosted.org/packages/6a/0f/c6988c91d06e93cd0bb3d4a808bcf32375ca1904609835c3031799e3ecae/watchfiles-1.1.1-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:04e78dd0b6352db95507fd8cb46f39d185cf8c74e4cf1e4fbad1d3df96faf510", size = 474836, upload-time = "2025-10-14T15:05:33.209Z" }, + { url = "https://files.pythonhosted.org/packages/b4/36/ded8aebea91919485b7bbabbd14f5f359326cb5ec218cd67074d1e426d74/watchfiles-1.1.1-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5c85794a4cfa094714fb9c08d4a218375b2b95b8ed1666e8677c349906246c05", size = 455099, upload-time = "2025-10-14T15:05:34.189Z" }, + { url = "https://files.pythonhosted.org/packages/98/e0/8c9bdba88af756a2fce230dd365fab2baf927ba42cd47521ee7498fd5211/watchfiles-1.1.1-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:74d5012b7630714b66be7b7b7a78855ef7ad58e8650c73afc4c076a1f480a8d6", size = 630626, upload-time = "2025-10-14T15:05:35.216Z" }, + { url = "https://files.pythonhosted.org/packages/2a/84/a95db05354bf2d19e438520d92a8ca475e578c647f78f53197f5a2f17aaf/watchfiles-1.1.1-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:8fbe85cb3201c7d380d3d0b90e63d520f15d6afe217165d7f98c9c649654db81", size = 622519, upload-time = "2025-10-14T15:05:36.259Z" }, + { url = "https://files.pythonhosted.org/packages/1d/ce/d8acdc8de545de995c339be67711e474c77d643555a9bb74a9334252bd55/watchfiles-1.1.1-cp314-cp314-win32.whl", hash = "sha256:3fa0b59c92278b5a7800d3ee7733da9d096d4aabcfabb9a928918bd276ef9b9b", size = 272078, upload-time = "2025-10-14T15:05:37.63Z" }, + { url = "https://files.pythonhosted.org/packages/c4/c9/a74487f72d0451524be827e8edec251da0cc1fcf111646a511ae752e1a3d/watchfiles-1.1.1-cp314-cp314-win_amd64.whl", hash = "sha256:c2047d0b6cea13b3316bdbafbfa0c4228ae593d995030fda39089d36e64fc03a", size = 287664, upload-time = "2025-10-14T15:05:38.95Z" }, + { url = "https://files.pythonhosted.org/packages/df/b8/8ac000702cdd496cdce998c6f4ee0ca1f15977bba51bdf07d872ebdfc34c/watchfiles-1.1.1-cp314-cp314-win_arm64.whl", hash = "sha256:842178b126593addc05acf6fce960d28bc5fae7afbaa2c6c1b3a7b9460e5be02", size = 277154, upload-time = "2025-10-14T15:05:39.954Z" }, + { url = "https://files.pythonhosted.org/packages/47/a8/e3af2184707c29f0f14b1963c0aace6529f9d1b8582d5b99f31bbf42f59e/watchfiles-1.1.1-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:88863fbbc1a7312972f1c511f202eb30866370ebb8493aef2812b9ff28156a21", size = 403820, upload-time = "2025-10-14T15:05:40.932Z" }, + { url = "https://files.pythonhosted.org/packages/c0/ec/e47e307c2f4bd75f9f9e8afbe3876679b18e1bcec449beca132a1c5ffb2d/watchfiles-1.1.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:55c7475190662e202c08c6c0f4d9e345a29367438cf8e8037f3155e10a88d5a5", size = 390510, upload-time = "2025-10-14T15:05:41.945Z" }, + { url = "https://files.pythonhosted.org/packages/d5/a0/ad235642118090f66e7b2f18fd5c42082418404a79205cdfca50b6309c13/watchfiles-1.1.1-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f53fa183d53a1d7a8852277c92b967ae99c2d4dcee2bfacff8868e6e30b15f7", size = 448408, upload-time = "2025-10-14T15:05:43.385Z" }, + { url = "https://files.pythonhosted.org/packages/df/85/97fa10fd5ff3332ae17e7e40e20784e419e28521549780869f1413742e9d/watchfiles-1.1.1-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6aae418a8b323732fa89721d86f39ec8f092fc2af67f4217a2b07fd3e93c6101", size = 458968, upload-time = "2025-10-14T15:05:44.404Z" }, + { url = "https://files.pythonhosted.org/packages/47/c2/9059c2e8966ea5ce678166617a7f75ecba6164375f3b288e50a40dc6d489/watchfiles-1.1.1-cp314-cp314t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f096076119da54a6080e8920cbdaac3dbee667eb91dcc5e5b78840b87415bd44", size = 488096, upload-time = "2025-10-14T15:05:45.398Z" }, + { url = "https://files.pythonhosted.org/packages/94/44/d90a9ec8ac309bc26db808a13e7bfc0e4e78b6fc051078a554e132e80160/watchfiles-1.1.1-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:00485f441d183717038ed2e887a7c868154f216877653121068107b227a2f64c", size = 596040, upload-time = "2025-10-14T15:05:46.502Z" }, + { url = "https://files.pythonhosted.org/packages/95/68/4e3479b20ca305cfc561db3ed207a8a1c745ee32bf24f2026a129d0ddb6e/watchfiles-1.1.1-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a55f3e9e493158d7bfdb60a1165035f1cf7d320914e7b7ea83fe22c6023b58fc", size = 473847, upload-time = "2025-10-14T15:05:47.484Z" }, + { url = "https://files.pythonhosted.org/packages/4f/55/2af26693fd15165c4ff7857e38330e1b61ab8c37d15dc79118cdba115b7a/watchfiles-1.1.1-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c91ed27800188c2ae96d16e3149f199d62f86c7af5f5f4d2c61a3ed8cd3666c", size = 455072, upload-time = "2025-10-14T15:05:48.928Z" }, + { url = "https://files.pythonhosted.org/packages/66/1d/d0d200b10c9311ec25d2273f8aad8c3ef7cc7ea11808022501811208a750/watchfiles-1.1.1-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:311ff15a0bae3714ffb603e6ba6dbfba4065ab60865d15a6ec544133bdb21099", size = 629104, upload-time = "2025-10-14T15:05:49.908Z" }, + { url = "https://files.pythonhosted.org/packages/e3/bd/fa9bb053192491b3867ba07d2343d9f2252e00811567d30ae8d0f78136fe/watchfiles-1.1.1-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:a916a2932da8f8ab582f242c065f5c81bed3462849ca79ee357dd9551b0e9b01", size = 622112, upload-time = "2025-10-14T15:05:50.941Z" }, + { url = "https://files.pythonhosted.org/packages/d3/8e/e500f8b0b77be4ff753ac94dc06b33d8f0d839377fee1b78e8c8d8f031bf/watchfiles-1.1.1-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:db476ab59b6765134de1d4fe96a1a9c96ddf091683599be0f26147ea1b2e4b88", size = 408250, upload-time = "2025-10-14T15:06:10.264Z" }, + { url = "https://files.pythonhosted.org/packages/bd/95/615e72cd27b85b61eec764a5ca51bd94d40b5adea5ff47567d9ebc4d275a/watchfiles-1.1.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:89eef07eee5e9d1fda06e38822ad167a044153457e6fd997f8a858ab7564a336", size = 396117, upload-time = "2025-10-14T15:06:11.28Z" }, + { url = "https://files.pythonhosted.org/packages/c9/81/e7fe958ce8a7fb5c73cc9fb07f5aeaf755e6aa72498c57d760af760c91f8/watchfiles-1.1.1-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce19e06cbda693e9e7686358af9cd6f5d61312ab8b00488bc36f5aabbaf77e24", size = 450493, upload-time = "2025-10-14T15:06:12.321Z" }, + { url = "https://files.pythonhosted.org/packages/6e/d4/ed38dd3b1767193de971e694aa544356e63353c33a85d948166b5ff58b9e/watchfiles-1.1.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3e6f39af2eab0118338902798b5aa6664f46ff66bc0280de76fca67a7f262a49", size = 457546, upload-time = "2025-10-14T15:06:13.372Z" }, +] + +[[package]] +name = "websockets" +version = "16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/04/24/4b2031d72e840ce4c1ccb255f693b15c334757fc50023e4db9537080b8c4/websockets-16.0.tar.gz", hash = "sha256:5f6261a5e56e8d5c42a4497b364ea24d94d9563e8fbd44e78ac40879c60179b5", size = 179346, upload-time = "2026-01-10T09:23:47.181Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f2/db/de907251b4ff46ae804ad0409809504153b3f30984daf82a1d84a9875830/websockets-16.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:31a52addea25187bde0797a97d6fc3d2f92b6f72a9370792d65a6e84615ac8a8", size = 177340, upload-time = "2026-01-10T09:22:34.539Z" }, + { url = "https://files.pythonhosted.org/packages/f3/fa/abe89019d8d8815c8781e90d697dec52523fb8ebe308bf11664e8de1877e/websockets-16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:417b28978cdccab24f46400586d128366313e8a96312e4b9362a4af504f3bbad", size = 175022, upload-time = "2026-01-10T09:22:36.332Z" }, + { url = "https://files.pythonhosted.org/packages/58/5d/88ea17ed1ded2079358b40d31d48abe90a73c9e5819dbcde1606e991e2ad/websockets-16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:af80d74d4edfa3cb9ed973a0a5ba2b2a549371f8a741e0800cb07becdd20f23d", size = 175319, upload-time = "2026-01-10T09:22:37.602Z" }, + { url = "https://files.pythonhosted.org/packages/d2/ae/0ee92b33087a33632f37a635e11e1d99d429d3d323329675a6022312aac2/websockets-16.0-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:08d7af67b64d29823fed316505a89b86705f2b7981c07848fb5e3ea3020c1abe", size = 184631, upload-time = "2026-01-10T09:22:38.789Z" }, + { url = "https://files.pythonhosted.org/packages/c8/c5/27178df583b6c5b31b29f526ba2da5e2f864ecc79c99dae630a85d68c304/websockets-16.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7be95cfb0a4dae143eaed2bcba8ac23f4892d8971311f1b06f3c6b78952ee70b", size = 185870, upload-time = "2026-01-10T09:22:39.893Z" }, + { url = "https://files.pythonhosted.org/packages/87/05/536652aa84ddc1c018dbb7e2c4cbcd0db884580bf8e95aece7593fde526f/websockets-16.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d6297ce39ce5c2e6feb13c1a996a2ded3b6832155fcfc920265c76f24c7cceb5", size = 185361, upload-time = "2026-01-10T09:22:41.016Z" }, + { url = "https://files.pythonhosted.org/packages/6d/e2/d5332c90da12b1e01f06fb1b85c50cfc489783076547415bf9f0a659ec19/websockets-16.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1c1b30e4f497b0b354057f3467f56244c603a79c0d1dafce1d16c283c25f6e64", size = 184615, upload-time = "2026-01-10T09:22:42.442Z" }, + { url = "https://files.pythonhosted.org/packages/77/fb/d3f9576691cae9253b51555f841bc6600bf0a983a461c79500ace5a5b364/websockets-16.0-cp311-cp311-win32.whl", hash = "sha256:5f451484aeb5cafee1ccf789b1b66f535409d038c56966d6101740c1614b86c6", size = 178246, upload-time = "2026-01-10T09:22:43.654Z" }, + { url = "https://files.pythonhosted.org/packages/54/67/eaff76b3dbaf18dcddabc3b8c1dba50b483761cccff67793897945b37408/websockets-16.0-cp311-cp311-win_amd64.whl", hash = "sha256:8d7f0659570eefb578dacde98e24fb60af35350193e4f56e11190787bee77dac", size = 178684, upload-time = "2026-01-10T09:22:44.941Z" }, + { url = "https://files.pythonhosted.org/packages/84/7b/bac442e6b96c9d25092695578dda82403c77936104b5682307bd4deb1ad4/websockets-16.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:71c989cbf3254fbd5e84d3bff31e4da39c43f884e64f2551d14bb3c186230f00", size = 177365, upload-time = "2026-01-10T09:22:46.787Z" }, + { url = "https://files.pythonhosted.org/packages/b0/fe/136ccece61bd690d9c1f715baaeefd953bb2360134de73519d5df19d29ca/websockets-16.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:8b6e209ffee39ff1b6d0fa7bfef6de950c60dfb91b8fcead17da4ee539121a79", size = 175038, upload-time = "2026-01-10T09:22:47.999Z" }, + { url = "https://files.pythonhosted.org/packages/40/1e/9771421ac2286eaab95b8575b0cb701ae3663abf8b5e1f64f1fd90d0a673/websockets-16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:86890e837d61574c92a97496d590968b23c2ef0aeb8a9bc9421d174cd378ae39", size = 175328, upload-time = "2026-01-10T09:22:49.809Z" }, + { url = "https://files.pythonhosted.org/packages/18/29/71729b4671f21e1eaa5d6573031ab810ad2936c8175f03f97f3ff164c802/websockets-16.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:9b5aca38b67492ef518a8ab76851862488a478602229112c4b0d58d63a7a4d5c", size = 184915, upload-time = "2026-01-10T09:22:51.071Z" }, + { url = "https://files.pythonhosted.org/packages/97/bb/21c36b7dbbafc85d2d480cd65df02a1dc93bf76d97147605a8e27ff9409d/websockets-16.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e0334872c0a37b606418ac52f6ab9cfd17317ac26365f7f65e203e2d0d0d359f", size = 186152, upload-time = "2026-01-10T09:22:52.224Z" }, + { url = "https://files.pythonhosted.org/packages/4a/34/9bf8df0c0cf88fa7bfe36678dc7b02970c9a7d5e065a3099292db87b1be2/websockets-16.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a0b31e0b424cc6b5a04b8838bbaec1688834b2383256688cf47eb97412531da1", size = 185583, upload-time = "2026-01-10T09:22:53.443Z" }, + { url = "https://files.pythonhosted.org/packages/47/88/4dd516068e1a3d6ab3c7c183288404cd424a9a02d585efbac226cb61ff2d/websockets-16.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:485c49116d0af10ac698623c513c1cc01c9446c058a4e61e3bf6c19dff7335a2", size = 184880, upload-time = "2026-01-10T09:22:55.033Z" }, + { url = "https://files.pythonhosted.org/packages/91/d6/7d4553ad4bf1c0421e1ebd4b18de5d9098383b5caa1d937b63df8d04b565/websockets-16.0-cp312-cp312-win32.whl", hash = "sha256:eaded469f5e5b7294e2bdca0ab06becb6756ea86894a47806456089298813c89", size = 178261, upload-time = "2026-01-10T09:22:56.251Z" }, + { url = "https://files.pythonhosted.org/packages/c3/f0/f3a17365441ed1c27f850a80b2bc680a0fa9505d733fe152fdf5e98c1c0b/websockets-16.0-cp312-cp312-win_amd64.whl", hash = "sha256:5569417dc80977fc8c2d43a86f78e0a5a22fee17565d78621b6bb264a115d4ea", size = 178693, upload-time = "2026-01-10T09:22:57.478Z" }, + { url = "https://files.pythonhosted.org/packages/cc/9c/baa8456050d1c1b08dd0ec7346026668cbc6f145ab4e314d707bb845bf0d/websockets-16.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:878b336ac47938b474c8f982ac2f7266a540adc3fa4ad74ae96fea9823a02cc9", size = 177364, upload-time = "2026-01-10T09:22:59.333Z" }, + { url = "https://files.pythonhosted.org/packages/7e/0c/8811fc53e9bcff68fe7de2bcbe75116a8d959ac699a3200f4847a8925210/websockets-16.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:52a0fec0e6c8d9a784c2c78276a48a2bdf099e4ccc2a4cad53b27718dbfd0230", size = 175039, upload-time = "2026-01-10T09:23:01.171Z" }, + { url = "https://files.pythonhosted.org/packages/aa/82/39a5f910cb99ec0b59e482971238c845af9220d3ab9fa76dd9162cda9d62/websockets-16.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e6578ed5b6981005df1860a56e3617f14a6c307e6a71b4fff8c48fdc50f3ed2c", size = 175323, upload-time = "2026-01-10T09:23:02.341Z" }, + { url = "https://files.pythonhosted.org/packages/bd/28/0a25ee5342eb5d5f297d992a77e56892ecb65e7854c7898fb7d35e9b33bd/websockets-16.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:95724e638f0f9c350bb1c2b0a7ad0e83d9cc0c9259f3ea94e40d7b02a2179ae5", size = 184975, upload-time = "2026-01-10T09:23:03.756Z" }, + { url = "https://files.pythonhosted.org/packages/f9/66/27ea52741752f5107c2e41fda05e8395a682a1e11c4e592a809a90c6a506/websockets-16.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c0204dc62a89dc9d50d682412c10b3542d748260d743500a85c13cd1ee4bde82", size = 186203, upload-time = "2026-01-10T09:23:05.01Z" }, + { url = "https://files.pythonhosted.org/packages/37/e5/8e32857371406a757816a2b471939d51c463509be73fa538216ea52b792a/websockets-16.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:52ac480f44d32970d66763115edea932f1c5b1312de36df06d6b219f6741eed8", size = 185653, upload-time = "2026-01-10T09:23:06.301Z" }, + { url = "https://files.pythonhosted.org/packages/9b/67/f926bac29882894669368dc73f4da900fcdf47955d0a0185d60103df5737/websockets-16.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6e5a82b677f8f6f59e8dfc34ec06ca6b5b48bc4fcda346acd093694cc2c24d8f", size = 184920, upload-time = "2026-01-10T09:23:07.492Z" }, + { url = "https://files.pythonhosted.org/packages/3c/a1/3d6ccdcd125b0a42a311bcd15a7f705d688f73b2a22d8cf1c0875d35d34a/websockets-16.0-cp313-cp313-win32.whl", hash = "sha256:abf050a199613f64c886ea10f38b47770a65154dc37181bfaff70c160f45315a", size = 178255, upload-time = "2026-01-10T09:23:09.245Z" }, + { url = "https://files.pythonhosted.org/packages/6b/ae/90366304d7c2ce80f9b826096a9e9048b4bb760e44d3b873bb272cba696b/websockets-16.0-cp313-cp313-win_amd64.whl", hash = "sha256:3425ac5cf448801335d6fdc7ae1eb22072055417a96cc6b31b3861f455fbc156", size = 178689, upload-time = "2026-01-10T09:23:10.483Z" }, + { url = "https://files.pythonhosted.org/packages/f3/1d/e88022630271f5bd349ed82417136281931e558d628dd52c4d8621b4a0b2/websockets-16.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:8cc451a50f2aee53042ac52d2d053d08bf89bcb31ae799cb4487587661c038a0", size = 177406, upload-time = "2026-01-10T09:23:12.178Z" }, + { url = "https://files.pythonhosted.org/packages/f2/78/e63be1bf0724eeb4616efb1ae1c9044f7c3953b7957799abb5915bffd38e/websockets-16.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:daa3b6ff70a9241cf6c7fc9e949d41232d9d7d26fd3522b1ad2b4d62487e9904", size = 175085, upload-time = "2026-01-10T09:23:13.511Z" }, + { url = "https://files.pythonhosted.org/packages/bb/f4/d3c9220d818ee955ae390cf319a7c7a467beceb24f05ee7aaaa2414345ba/websockets-16.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:fd3cb4adb94a2a6e2b7c0d8d05cb94e6f1c81a0cf9dc2694fb65c7e8d94c42e4", size = 175328, upload-time = "2026-01-10T09:23:14.727Z" }, + { url = "https://files.pythonhosted.org/packages/63/bc/d3e208028de777087e6fb2b122051a6ff7bbcca0d6df9d9c2bf1dd869ae9/websockets-16.0-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:781caf5e8eee67f663126490c2f96f40906594cb86b408a703630f95550a8c3e", size = 185044, upload-time = "2026-01-10T09:23:15.939Z" }, + { url = "https://files.pythonhosted.org/packages/ad/6e/9a0927ac24bd33a0a9af834d89e0abc7cfd8e13bed17a86407a66773cc0e/websockets-16.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:caab51a72c51973ca21fa8a18bd8165e1a0183f1ac7066a182ff27107b71e1a4", size = 186279, upload-time = "2026-01-10T09:23:17.148Z" }, + { url = "https://files.pythonhosted.org/packages/b9/ca/bf1c68440d7a868180e11be653c85959502efd3a709323230314fda6e0b3/websockets-16.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:19c4dc84098e523fd63711e563077d39e90ec6702aff4b5d9e344a60cb3c0cb1", size = 185711, upload-time = "2026-01-10T09:23:18.372Z" }, + { url = "https://files.pythonhosted.org/packages/c4/f8/fdc34643a989561f217bb477cbc47a3a07212cbda91c0e4389c43c296ebf/websockets-16.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:a5e18a238a2b2249c9a9235466b90e96ae4795672598a58772dd806edc7ac6d3", size = 184982, upload-time = "2026-01-10T09:23:19.652Z" }, + { url = "https://files.pythonhosted.org/packages/dd/d1/574fa27e233764dbac9c52730d63fcf2823b16f0856b3329fc6268d6ae4f/websockets-16.0-cp314-cp314-win32.whl", hash = "sha256:a069d734c4a043182729edd3e9f247c3b2a4035415a9172fd0f1b71658a320a8", size = 177915, upload-time = "2026-01-10T09:23:21.458Z" }, + { url = "https://files.pythonhosted.org/packages/8a/f1/ae6b937bf3126b5134ce1f482365fde31a357c784ac51852978768b5eff4/websockets-16.0-cp314-cp314-win_amd64.whl", hash = "sha256:c0ee0e63f23914732c6d7e0cce24915c48f3f1512ec1d079ed01fc629dab269d", size = 178381, upload-time = "2026-01-10T09:23:22.715Z" }, + { url = "https://files.pythonhosted.org/packages/06/9b/f791d1db48403e1f0a27577a6beb37afae94254a8c6f08be4a23e4930bc0/websockets-16.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:a35539cacc3febb22b8f4d4a99cc79b104226a756aa7400adc722e83b0d03244", size = 177737, upload-time = "2026-01-10T09:23:24.523Z" }, + { url = "https://files.pythonhosted.org/packages/bd/40/53ad02341fa33b3ce489023f635367a4ac98b73570102ad2cdd770dacc9a/websockets-16.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:b784ca5de850f4ce93ec85d3269d24d4c82f22b7212023c974c401d4980ebc5e", size = 175268, upload-time = "2026-01-10T09:23:25.781Z" }, + { url = "https://files.pythonhosted.org/packages/74/9b/6158d4e459b984f949dcbbb0c5d270154c7618e11c01029b9bbd1bb4c4f9/websockets-16.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:569d01a4e7fba956c5ae4fc988f0d4e187900f5497ce46339c996dbf24f17641", size = 175486, upload-time = "2026-01-10T09:23:27.033Z" }, + { url = "https://files.pythonhosted.org/packages/e5/2d/7583b30208b639c8090206f95073646c2c9ffd66f44df967981a64f849ad/websockets-16.0-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:50f23cdd8343b984957e4077839841146f67a3d31ab0d00e6b824e74c5b2f6e8", size = 185331, upload-time = "2026-01-10T09:23:28.259Z" }, + { url = "https://files.pythonhosted.org/packages/45/b0/cce3784eb519b7b5ad680d14b9673a31ab8dcb7aad8b64d81709d2430aa8/websockets-16.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:152284a83a00c59b759697b7f9e9cddf4e3c7861dd0d964b472b70f78f89e80e", size = 186501, upload-time = "2026-01-10T09:23:29.449Z" }, + { url = "https://files.pythonhosted.org/packages/19/60/b8ebe4c7e89fb5f6cdf080623c9d92789a53636950f7abacfc33fe2b3135/websockets-16.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:bc59589ab64b0022385f429b94697348a6a234e8ce22544e3681b2e9331b5944", size = 186062, upload-time = "2026-01-10T09:23:31.368Z" }, + { url = "https://files.pythonhosted.org/packages/88/a8/a080593f89b0138b6cba1b28f8df5673b5506f72879322288b031337c0b8/websockets-16.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:32da954ffa2814258030e5a57bc73a3635463238e797c7375dc8091327434206", size = 185356, upload-time = "2026-01-10T09:23:32.627Z" }, + { url = "https://files.pythonhosted.org/packages/c2/b6/b9afed2afadddaf5ebb2afa801abf4b0868f42f8539bfe4b071b5266c9fe/websockets-16.0-cp314-cp314t-win32.whl", hash = "sha256:5a4b4cc550cb665dd8a47f868c8d04c8230f857363ad3c9caf7a0c3bf8c61ca6", size = 178085, upload-time = "2026-01-10T09:23:33.816Z" }, + { url = "https://files.pythonhosted.org/packages/9f/3e/28135a24e384493fa804216b79a6a6759a38cc4ff59118787b9fb693df93/websockets-16.0-cp314-cp314t-win_amd64.whl", hash = "sha256:b14dc141ed6d2dde437cddb216004bcac6a1df0935d79656387bd41632ba0bbd", size = 178531, upload-time = "2026-01-10T09:23:35.016Z" }, + { url = "https://files.pythonhosted.org/packages/72/07/c98a68571dcf256e74f1f816b8cc5eae6eb2d3d5cfa44d37f801619d9166/websockets-16.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:349f83cd6c9a415428ee1005cadb5c2c56f4389bc06a9af16103c3bc3dcc8b7d", size = 174947, upload-time = "2026-01-10T09:23:36.166Z" }, + { url = "https://files.pythonhosted.org/packages/7e/52/93e166a81e0305b33fe416338be92ae863563fe7bce446b0f687b9df5aea/websockets-16.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:4a1aba3340a8dca8db6eb5a7986157f52eb9e436b74813764241981ca4888f03", size = 175260, upload-time = "2026-01-10T09:23:37.409Z" }, + { url = "https://files.pythonhosted.org/packages/56/0c/2dbf513bafd24889d33de2ff0368190a0e69f37bcfa19009ef819fe4d507/websockets-16.0-pp311-pypy311_pp73-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:f4a32d1bd841d4bcbffdcb3d2ce50c09c3909fbead375ab28d0181af89fd04da", size = 176071, upload-time = "2026-01-10T09:23:39.158Z" }, + { url = "https://files.pythonhosted.org/packages/a5/8f/aea9c71cc92bf9b6cc0f7f70df8f0b420636b6c96ef4feee1e16f80f75dd/websockets-16.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0298d07ee155e2e9fda5be8a9042200dd2e3bb0b8a38482156576f863a9d457c", size = 176968, upload-time = "2026-01-10T09:23:41.031Z" }, + { url = "https://files.pythonhosted.org/packages/9a/3f/f70e03f40ffc9a30d817eef7da1be72ee4956ba8d7255c399a01b135902a/websockets-16.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:a653aea902e0324b52f1613332ddf50b00c06fdaf7e92624fbf8c77c78fa5767", size = 178735, upload-time = "2026-01-10T09:23:42.259Z" }, + { url = "https://files.pythonhosted.org/packages/6f/28/258ebab549c2bf3e64d2b0217b973467394a9cea8c42f70418ca2c5d0d2e/websockets-16.0-py3-none-any.whl", hash = "sha256:1637db62fad1dc833276dded54215f2c7fa46912301a24bd94d45d46a011ceec", size = 171598, upload-time = "2026-01-10T09:23:45.395Z" }, +] From 34e13c5643ce36192e038136ccf47ea22ea4fbc5 Mon Sep 17 00:00:00 2001 From: Piotr Gaczkowski Date: Tue, 24 Mar 2026 15:39:18 +0100 Subject: [PATCH 10/10] feat: Add basic frontend --- .dockerignore | 6 + Dockerfile | 23 +- fegen/__init__.py | 0 fegen/discourse.py | 111 + fegen/docs/index.html | 7030 +++++++++++++++++++++++++++ fegen/docs/static/css/style.css | 14 + fegen/main.py | 44 + fegen/template/_base_template.html | 150 + fegen/template/_main_layout.html | 29 + fegen/template/static/css/style.css | 14 + fonts/SourceCodePro-SemiBold.ttf | Bin 0 -> 133348 bytes labeler/adapter/fastapi_srv.py | 18 + pyproject.toml | 6 +- uv.lock | 190 +- 14 files changed, 7620 insertions(+), 15 deletions(-) create mode 100644 .dockerignore create mode 100644 fegen/__init__.py create mode 100644 fegen/discourse.py create mode 100644 fegen/docs/index.html create mode 100644 fegen/docs/static/css/style.css create mode 100644 fegen/main.py create mode 100644 fegen/template/_base_template.html create mode 100644 fegen/template/_main_layout.html create mode 100644 fegen/template/static/css/style.css create mode 100644 fonts/SourceCodePro-SemiBold.ttf diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..01f441d --- /dev/null +++ b/.dockerignore @@ -0,0 +1,6 @@ +.venv +.git +__pycache__ +*.pyc +.ruff_cache +.mypy_cache diff --git a/Dockerfile b/Dockerfile index 327c715..b99eba5 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,15 +1,20 @@ -FROM python:3.11 +# Build stage +FROM python:3.11 AS builder -RUN mkdir /app -COPY / /app - -COPY pyproject.toml poetry.lock /app/ +COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/ WORKDIR /app +COPY pyproject.toml uv.lock ./ +RUN uv sync --frozen --no-install-project +COPY . . +RUN uv sync -ENV PYTHONPATH=${PYTHONPATH}:${PWD} -RUN pip install poetry +# Runtime stage +FROM python:3.11-slim -RUN poetry config virtualenvs.create false -RUN poetry install --only main +WORKDIR /app +COPY --from=builder /app/ /app/ +ENV PATH="/app/.venv/bin:$PATH" + +CMD ["fastapi", "dev", "--host", "0.0.0.0", "--port", "31337", "labeler/adapter/fastapi_srv.py" ] diff --git a/fegen/__init__.py b/fegen/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/fegen/discourse.py b/fegen/discourse.py new file mode 100644 index 0000000..216c11f --- /dev/null +++ b/fegen/discourse.py @@ -0,0 +1,111 @@ +''' +Class to generate a csv file based on data fetched via Discourse REST API +''' +import os +import csv +import json +import requests +from dotenv import load_dotenv + +DISCOURSE_URL = "https://kb.hs3.pl" # Database is hosted here +CATEGORY_ID = 9 # Database category ID + +class DiscourseDatabase(): + def __init__(self): + data = self.get_category_data() + self.category_topics_csv(data) + load_dotenv() + + def get_headers(self, auth=False): + """Get request headers, optionally with auth data.""" + headers = { + "content-type": "application/json", + } + if auth: + headers["Api-Key"] = os.getenv("DISCOURSE_PAT") + headers["Api-Username"] = os.getenv("DISCOURSE_USERNAME") + return headers + + def get_category_data(self) -> dict: + """Get all topics from a Discourse category with pagination""" + url = f"{DISCOURSE_URL}/c/{CATEGORY_ID}.json" + print(f"Fetching data from {url}") + all_topics = [] + page = 0 + while True: + params = {"per_page": 100, "page": page} + res = requests.get(url, headers=self.get_headers(), params=params) + res.raise_for_status() + res_json = res.json() + topics = res_json["topic_list"]["topics"] + if not topics: + break + for topic in topics: + if topic["category_id"] == CATEGORY_ID: + all_topics.append(topic) + print(f"Fetched page {page}: {len(topics)} topics, {len(all_topics)} total in category") + page += 1 + return {"topic_list": {"topics": all_topics}} + + def get_topic_content(self, topic_id: str): + """Get a single topic's content""" + get_url = f"{DISCOURSE_URL}/posts/{topic_id}.json" + res = requests.get(get_url, headers=self.get_headers(auth=True)) + res.raise_for_status() + return res.json() + + def category_topics_csv(self, category_data) -> None: + """Save category topics to a csv file""" + columns = ["id", "title", "place", "tags"] + records = category_data["topic_list"]["topics"] + with open('zasoby.csv', 'w', encoding='UTF8') as f: + write = csv.writer(f) + write.writerow(columns) + for topic in records: + html_url = f'{topic["title"]}' + place = self.get_place(topic) + write.writerow([topic["id"], html_url, place, topic["tags"]]) + print(f"New zasoby.csv generated with {len(records)} records") + + def get_place(self, topic): + """Get place of a topic""" + places = ["cow-work", "garage", "lab"] + for place in places: + if place in topic["tags"]: + return f'{place}' + return "unknown" + + def replace_string_in_post(self, topic_id: str, old_string: str, new_string: str) -> dict: + """Replace a selected string within a topic's first post using Discourse REST API""" + # Fetch the topic to get the first post ID + topic_url = f"{DISCOURSE_URL}/t/{topic_id}.json" + topic_res = requests.get(topic_url, headers=self.get_headers(auth=True)) + topic_res.raise_for_status() + topic_data = topic_res.json() + + # Get the first post ID from the topic + first_post_id = topic_data["post_stream"]["posts"][0]["id"] + + # Fetch the post content + post_url = f"{DISCOURSE_URL}/posts/{first_post_id}.json" + post_res = requests.get(post_url, headers=self.get_headers(auth=True)) + post_res.raise_for_status() + post_data = post_res.json() + + # Replace the string + updated_raw = post_data["raw"].replace(old_string, new_string) + + # Update the post + payload = {"post": {"raw": updated_raw}} + res = requests.put(post_url, json=payload, headers=self.get_headers(auth=True)) + res.raise_for_status() + return res.json() + +if __name__ == "__main__": + disc = DiscourseDatabase() + category = disc.get_category_data() + records = category["topic_list"]["topics"] + for topic in records: + if "lab" in topic["tags"]: + disc.replace_string_in_post(topic["id"], "[Workshop](https://kb.s.hs3.pl/tag/workshop)", "[Lab](https://kb.s.hs3.pl/tag/lab)") + diff --git a/fegen/docs/index.html b/fegen/docs/index.html new file mode 100644 index 0000000..dd1f24f --- /dev/null +++ b/fegen/docs/index.html @@ -0,0 +1,7030 @@ + + + + + + Baza Zasobów Hackerspace Trójmiasto + + + + + + + + + + + +

+
+
+
+

Baza Zasobów Hackerspace Trójmiasto

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
idtitleplacetagslabelprint
45Jak stworzyć nowy wpis do bazy zasobów Hackerspace Trójmiasto?unknown[]
20O kategorii: Baza Wiedzy Hackerspace'uunknown[]
179Sprzęt komp Desktop Dr Robotomycow-work['cow-work']
561Antena Dipol na 30mlab['lab', 'sticker-needed']
585Ścianka narzędziowalab['lab']
584Stojak ze śrubokrętamilab['lab']
583Pudełko z zapalniczkamilab['lab']
582Konwerter ATC-1000 firmy F&Flab['lab']
581Pojemnik z konektoramilab['lab']
580Pudło - rurki / koszulki termokurczliwe, różne rodzajelab['lab']
579Uchwyt na kolbę gorącego powietrza (hot-air) z magnetycznym stolikiem naprawczym W.E.R 628lab['lab']
578Myjka ultradźwiękowa 2lab['lab']
577Żywiczna drukarka 3D Elegoo Mars 2 Prolab['lab', '3d-print']
576Pudło z filamentami kolorowymi krótkimilab['lab', '3d-print']
529Projektor Optomacow-work['cow-work']
527Stacja dokująca USB-C + ładowarka bezprzewodowacow-work['cow-work']
575Pudło z materiałami do drukarek 3Dlab['lab']
574Laminator biurowy Leitz iLAM Office Pro A3lab['lab']
573Deska do krojenia, bambus, 53x46 cmlab['lab']
572Farba Akrylowa Greenishlab['lab']
571Smartphone Nexus LGlab['lab']
570Smartphone Googlelab['lab']
569Smartphone Samsunglab['lab']
568Redmi smartphonelab['lab']
567iPhonelab['lab']
566Materiały do plotera (winyl i inne) + krepalab['lab']
565Antena bazowa HamRadioShop 10 cmlab['lab']
564LORA / Meshtasticlab['lab']
563Przełącznik antenowy na 4 anteny KF ze sterownikiemlab['lab']
562DREMEL 3000lab['lab']
514Pistolet do kleju na gorącolab['lab']
560Przełącznik antenowy z kontroleremunknown[]
304Monitor LG StudioWorks 560Ncow-work['cow-work']
554ArcaderOS - Śmieciowy Arcade Charytatywny dla każdegocow-work['cow-work']
283Telewizor Funaicow-work['cow-work']
531Streamer LTO-4 HP M8609Aunknown['server-room']
285Konsola do gier Sony PlayStation 2 Slim + kontroler Namco GunConcow-work['cow-work']
456Wzmacniacz gitarowy Roland Micro Cubeunknown['audiolab']
478Gitara basowa Squier Precision Bassunknown['audiolab']
479Guitalele Ever Play GT-WBKunknown['audiolab']
481Gitara elektryczna Blond STR-1H MN SFGunknown['audiolab']
480Gitara elektryczna Blond TE-1 MN BBunknown['audiolab']
533Access Point Mikrotik cAP acunknown[]
546Kwadraty ze sklejki w drewnianych pudełkachunknown[]
545LEGO piedestał z figurkami i jednorożcemcow-work['cow-work']
541HAM QRP Szpejunknown[]
543PKL, RF7, kable koncentryczne KFunknown[]
542Antena Uda-Yagi 2m i 70 cmunknown[]
370Infiniti mirror - części, pudłolab['lab']
540Icom 706-mk2unknown[]
538Interfejs audio Line6 GXunknown['audiolab', 'sticker-needed']
537Płyta główna GIGABYTE GA-790XT-USB3cow-work['cow-work']
536Płyta główna ECS L7VMM3cow-work['cow-work']
535Płyta główna EPoX EP-8K9A7Icow-work['cow-work']
377Drukarka 3D “Elegoo Neptune 4 Pro”lab['lab', '3d-print']
92Drukarka 3D Creality K1 Maxlab['lab', 'tools', '3d-print']
530Discman SONYunknown['audiolab']
454Perkusja Alesis DM8cow-work['cow-work', 'audiolab']
273Drukarka Samsung ML-3710NDcow-work['cow-work']
476Wieża TECHNICS EH550 - kolumny głośnikoweunknown['audiolab']
286Magnetowid VHS Philips VR 471cow-work['cow-work']
482Magnetofon kasetowy Technics RS-B765unknown['audiolab']
317Sound Technology 1700B Distortion Measurement Systemcow-work['cow-work']
311Hung Chang Oscilloscope 5504 40MHzcow-work['cow-work']
279Komputer Apple Macintosh SEcow-work['cow-work']
292Wieża TECHNICS EH550 - Stereo sound processor SH-EH550cow-work['cow-work']
293Wieża TECHNICS EH550 - Stereo cassette deck RS-EH750cow-work['cow-work']
294Wieża TECHNICS EH550 - Compact disc player SL-EH750cow-work['cow-work']
291Wieża TECHNICS EH550 - Stereo tuner amplifier SA-EH550cow-work['cow-work']
532Telefon komórkowy Compas CTKE08unknown[]
357Radio samochodowe Alpineunknown['audiolab']
519Statyw Keyboardcow-work['cow-work', 'audiolab']
352Przejściówki USB-A => Power Jackcow-work['cow-work']
451Maty lutowniczecow-work['cow-work', 'lab']
490Radiomagnetofon przenośny Panasonic RQ-V77unknown['audiolab']
312Szufladka "Zestawy adapterów końcówek do zasilacza laptopa" / końcówki do zasilaniacow-work['cow-work']
526Monitoryunknown[]
528Stacja dokująca USB-C z wbudowaną klawiaturą Unitekunknown[]
61HS3 BOFHcow-work['cow-work', 'garage', 'events', 'bofh']
493Wkrętarka Niteo Toolslab['lab']
494Quad Power Supply Cobrabid KB-60-01unknown['audiolab']
495Lenco PA-45 Portable Sound System with Bluetoothunknown['audiolab']
496Głośnik gitarowy DIYunknown['audiolab']
498Wiertarka udarowa | Bosch Professional GSB 16 RElab['lab']
497Drukarka DYMO Omega S0717930lab['lab']
499Pudło "wiercimy, wkręcamy i różne inne"lab['lab']
500Pudło z chemiąlab['lab']
503Lutownica TS 80lab['lab']
507ZD-939L stacja na gorące powietrze HOT-AIRlab['lab']
513Urządzenie do wywoływania klisz polimerowych KENT Belichtungsgerät BG 250lab['lab']
501Switch Planet FSD-803unknown['audiolab']
502Switch ES-3208Punknown['audiolab']
504Access Point TP-Linkunknown['audiolab']
505Mikrofon T-Bone SC-300unknown['audiolab']
506Uchwyty biurkowe do mikrofonu/kameryunknown['audiolab']
508Bongosyunknown['audiolab']
509Dalekopis Lorenz LO133 Automatikunknown['audiolab']
515Zegar mAlab['lab']
510Soundbar Dell AX510unknown['audiolab']
511Głośniki komputerowe Creative Inspire T3100unknown['audiolab']
516Głośnik CUBElab['lab']
512Pegasus & Counknown['audiolab']
517Rozlutownicalab['lab']
518Wałek giętki do wiertarki Dremellab['lab']
520Uchwyt do telewizora / monitoracow-work['cow-work']
521Terminal MOTOROLA MC9062 (1 szt) i MC9060 (3 szt)cow-work['cow-work']
522HUB 10Mb Hewlett Packard J3188Acow-work['cow-work']
489Aparat fotograficzny Agat 18Kunknown['audiolab']
488Aparat fotograficzny Nikon Coolpix L26unknown['audiolab']
487Aparat fotograficzny Hitachi HDC-761Eunknown['audiolab']
486Aparat fotograficzny Konica Minoltaunknown['audiolab']
485Odtwarzacz przenośny Philipsunknown['audiolab']
484Komputer AiO POS CHD8700unknown['audiolab']
483Tuner Technics ST-600Lunknown['audiolab']
491Odkurzacz Zelmerlab['lab']
492Poziomica 1,50mlab['lab']
455Wzmacniacz gitarowy Peavey Rage 258unknown['audiolab']
458Słuchawki Creative Aurvana Live!unknown['audiolab']
459Słuchawki Sennheiser HD25unknown['audiolab']
460Mikrofon Grundig GDM 312unknown['audiolab']
461Looper Ditto TC Electronicunknown['audiolab']
462Mikser Behringer MX400 Micromixunknown['audiolab']
463Korg Volca Keysunknown['audiolab']
464Korg Volca Sampleunknown['audiolab']
465Korg Volca Mixunknown['audiolab']
466Korg Volca Bassunknown['audiolab']
467Korg Volca Modularunknown['audiolab']
468Yamaha DD-10 Drum Machineunknown['audiolab']
477Wzmacniacz zintegrowany Technics SU-810unknown['audiolab']
470Mikrofon Rode NT1-Aunknown['audiolab']
473Obudowa komputerowa Chieftec Tower of BBL (but SMOL)unknown['audiolab']
447Aerograf PS-22 Verkelab['lab']
475Głośniki LG CMS4340Funknown['audiolab']
474Wzmacniacz DIY 12V DCunknown['audiolab']
472Obudowa komputerowa Chieftec Tower of BBLunknown['audiolab']
471Głośniki DIY d33p w00funknown['audiolab']
469A8 Wireless Sound Transmitter/Receiverunknown['audiolab']
453Klawiatury laptopowecow-work['cow-work']
452Klawiaturycow-work['cow-work']
417Kable Audio Jack-Jack Monounknown['audiolab']
449Omnifixocow-work['cow-work', 'lab']
448Joystick Thrustmaster T.16000Mcow-work['cow-work']
206Club* Matecow-work['cow-work']
450Lutownica T12 + grotycow-work['cow-work', 'lab']
441Podnośnik samochodowe 2,5 tongarage['garage', 'tools']
443Odciąg trocin/wiórów Cormakgarage['garage']
439Mikro regały. W70xD50xH55garage['garage']
405Home Automation Switchescow-work['cow-work', 'lab', 'server-room']
431Audio Mixer XENYX 302USBcow-work['cow-work']
430Głośniki Loewe L82 Aunknown['audiolab']
429Komputer Sun Ultra 45 Workstation 500s XVR2500 ULTRAsparc IIIiunknown['audiolab']
428Hodowla gryzoni (myszki et al.)cow-work['cow-work']
426Karton "Drukarka paragonowa + etykietki"cow-work['cow-work']
415Multimetr, oscyloskop, generator sygnałów JT-OMS01lab['lab']
375Termostatycow-work['cow-work', 'lab', 'audiolab', 'server-room']
432Rode Wireless GO IIunknown[]
435Capture Card/Passthrough (black)unknown[]
434Capture Card (gray)unknown[]
438Rode Lav Micunknown[]
437MACROSILICON usb extscreenunknown[]
436HDMI Extenderunknown[]
4331->4 HDMI Splitterunknown[]
149LEDon Pink pussycow-work['cow-work']
151LEDon Bulbcow-work['cow-work']
148LEDon HS3cow-work['cow-work']
147LEDon Classy Ladycow-work['cow-work']
418Karton "Artykuły higieniczne"cow-work['cow-work']
419Karton "Akces(er)oria lutowanie"cow-work['cow-work']
421Karton "HS3 Narzędzia Warsztatowe"cow-work['cow-work']
422Karton "Taśmy samoprzylepne"cow-work['cow-work']
423Karton "Przedłużacze 230V"cow-work['cow-work']
424Rzepowiskocow-work['cow-work']
427Głośniki Creative GigaWorks T20 MultiMedia Speaker 28W MF1545unknown['audiolab']
425Repeater Zigbee Cow-workcow-work['cow-work']
420Karton "Bags"cow-work['cow-work']
208Komputer Nixdorf XT "All-in-One Portable"cow-work['cow-work']
47Cricut Maker 3 ploter tnącylab['lab', 'tools']
411Stacja W.E.R 852D+ do prac z smdlab['lab']
414Tester kabli RJ45, RJ11/12, BNC Lanberglab['lab']
416Switch zarządzalny MikroTik CRS309-1G-8S+IN 1x1GbE 8x10GbE SFP+ RS232 PoEunknown['server-room']
413Zasilacz regulowanylab['lab']
412Stacja lutownicza 937Dlab['lab']
410Stacja lutownicza LF-1660SDlab['lab']
409Stacja do rozlutowywania DS-915lab['lab']
197Sprzęt komp laptop Oden-donocow-work['cow-work']
189Sprzęt komp laptop Udon-sancow-work['cow-work']
200Sprzęt komp laptop Bogumiłcow-work['cow-work']
202Sprzęt komp laptop Amilocow-work['cow-work']
193Sprzęt komp laptop Victoriacow-work['cow-work']
188Sprzęt komp laptop mały Jaścow-work['cow-work']
199Sprzęt komp laptop Robincow-work['cow-work']
407Mikser audio Phonic MM2005cow-work['cow-work', 'audiolab']
401Telewizor LG 37LK450-ZHcow-work['cow-work']
404Kamera USB Savio CAK-02cow-work['cow-work']
397Telewizor NEC E658cow-work['cow-work']
406Klawiatura sterująca MIDI/USB AKAI MPK 61cow-work['cow-work', 'audiolab']
398Telewizor Samsung LE37C530cow-work['cow-work']
403Domofon Hikvisioncow-work['cow-work']
400Chromecast 2 NC2-6A5cow-work['cow-work']
399Klawiatura MIDI Arturia Keystepcow-work['cow-work', 'audiolab']
395Przyssawka do powierzchni płaskichlab['lab']
394Rozlutownica bez regulacji temperaturylab['lab']
393Lutownica Solomonlab['lab']
392Myjka Ultradźwiękowalab['lab']
391Kamera statyw zestaw do pracy z płytkami PCBlab['lab']
390Wyciąg stanowiska do lutowanialab['lab']
384Pojemnik FOTOcow-work['cow-work']
389Karton z częściami SMDlab['lab']
388Zasilacz 16A, 12V dclab['lab']
387Klucze płaskooczkowelab['lab']
386Suwmiarkalab['lab']
385Wiertarka Cemi statyw imadłolab['lab']
383Obudowa robota sprzątającegolab['lab']
382Drukarka 3D Photon żywicznalab['lab']
381Wiertarka statyw Dremellab['lab']
354Czujnik temperatury i wilgotnościlab['lab']
374Hot Platelab['lab']
379Drukarka 3D Creality K1MAXlab['lab']
257Gra L gamecow-work['cow-work']
376Drukarka 3D HEVO (Hypercube Evolutionlab['lab']
372Skrzynia skarbówlab['lab']
378Nitownica do nitonakręteklab['lab']
380Mikroskop Edukolab['lab']
356Karton "termostaty"cow-work['cow-work']
358Karton "wSchody"cow-work['cow-work']
359Karton "materiały plastyczne"cow-work['cow-work']
360Pojemnik "złącza, taśmy, słupki"lab['lab']
361Karton Zigbeecow-work['cow-work']
362Karton "electro"cow-work['cow-work']
363Instalacja Lasy Oliwskiecow-work['cow-work']
371Uchwyt do płytek PCBlab['lab']
364Karton Led String Lightcow-work['cow-work']
368Zgrzewarka do ogniwlab['lab']
369Lutownica gazowalab['lab']
373OPSISlab['lab']
367Przejściówki USB-C => B, micro B, mini B, micro B 3, Lightningcow-work['cow-work']
365Karton "USB"cow-work['cow-work']
366Karton "Polish C Power"cow-work['cow-work']
355Zasilacz regulowany USB-C Power Delivery Zasilacz 100W 5V/9V/12V/15V/20Vcow-work['cow-work']
351Przejściówki USB-C => Power Jackcow-work['cow-work']
353Przejściówka Power Jack => USB-Ccow-work['cow-work']
350Body Fat Scalelab['lab']
349DVD Video "Monty Python: A teraz coś z zupełnie innej beczki"cow-work['cow-work']
34814 in 1 Educational Solar Robotlab['lab']
347Gra wideo "PS3 Ridge Racer 7"cow-work['cow-work', 'video-game']
346Cyberdeck Ijonacow-work['cow-work']
345Gra wideo "PS3 Uncharted: Drake's Fortune DE"cow-work['cow-work', 'video-game']
344Szafka ze sprzętem telekomunikacyjnymcow-work['cow-work']
340Kartón z wkrętami, kołkami i pudelkamilab['lab']
343Gra wideo "PS3 Colin McRae: Dirt 2"cow-work['cow-work', 'video-game']
341Gra wideo "PS3 Ratchet & Clank Quest for Booty"cow-work['cow-work', 'video-game']
342Odtwarzacz Linn Sekrit DS-I + kolumnycow-work['cow-work']
339Gra wideo "Need for Speed: Most Wanted"cow-work['cow-work', 'video-game']
338Gra wideo "Commandos 3: Kierunek Berlin"cow-work['cow-work', 'video-game']
337Gra wideo "Heroes of Might and Magic V: Kuźnia Przeznaczenia"cow-work['cow-work', 'video-game']
336Puzzle Ptaki 500 - Politechnika Gdańskacow-work['cow-work', 'boardgame']
335Wiertarka PSR 1440 LI-2 + AL 1880 CV BOSCHlab['lab', 'tools']
3345-Port Fast Ethernet Switch Edimax 10/100Mbpscow-work['cow-work']
333Karton "ZASILACZE LAPTOP"cow-work['cow-work']
332Karton "URZĄDZENIA SIECIOWE LAN"cow-work['cow-work']
331Karton "VR"cow-work['cow-work']
330Karton "RADIO"cow-work['cow-work']
326Lampa z lupąlab['lab']
328Lampa z lupą niesprawnalab['lab']
329Karton "RÓŻNE MAŁE ZASILACZE"cow-work['cow-work']
327Karton "PRZEWODY ZASILAJACE"cow-work['cow-work']
325Karton "PRZEWODY <1MM2"cow-work['cow-work']
324Karton "AUDIO PRO"cow-work['cow-work']
323Karton "VIDEO"cow-work['cow-work']
322Karton "AUDIO JABRA"cow-work['cow-work']
321Karton "HDMI"cow-work['cow-work']
320Karton "RETRO AV SCART ET AL"cow-work['cow-work']
319Karton "LAN przewody"cow-work['cow-work']
318Gra zręcznościowa “Wooden Blocks"cow-work['cow-work', 'boardgame']
316Wavetek Universal Antenna Coupler WWG MMS-4107Scow-work['cow-work']
287Gra wideo “PC Warcraft II: Tides of Darkness”cow-work['cow-work', 'video-game']
289Gra wideo "PC Fallout 1"cow-work['cow-work', 'video-game']
297Naklejki "własność prywatna"cow-work['cow-work']
299Gra Koci Cymbergajcow-work['cow-work']
300Multifunction Printer Canon MG3150cow-work['cow-work']
302Skaner Plustek OpticPro ST24cow-work['cow-work']
305Voltage, Distortion, and Noise Meter VN-1687 Unitra Elmaszcow-work['cow-work']
306WANPTEK Programmable DC Power Supplycow-work['cow-work']
307Oscyloskop Hantek 6022BEcow-work['cow-work']
309Type SMG-1 Stereo Generator Radiometer Copenhagencow-work['cow-work']
313Karton "Słuchawki"cow-work['cow-work']
301Karton "ARTYKUŁY BIUROWE"cow-work['cow-work']
314PINTEK 20MHz oscilloscope PS-200cow-work['cow-work']
315PAL-B System?cow-work['cow-work']
296HUBy USB-Ccow-work['cow-work']
144Venuscow-work['cow-work']
52Evil Submarinecow-work['cow-work', 'projects']
295Dmuchawa do elektroniki Appiocow-work['cow-work']
288Gra wideo "Warcraft II: Battle.net Edition"cow-work['cow-work', 'video-game']
290Projektor Barco F22 SX+ Ultra Wide VizSimcow-work['cow-work']
284Robotarm SVI-2000 QuickShotcow-work['cow-work']
282Komputer ZX Spectrum +2cow-work['cow-work']
281Gra wideo “PC Mortyr 2093-1944”cow-work['cow-work', 'video-game']
280Komputer Commodore C=64cow-work['cow-work']
278Philips PM5415TX color TV Pattern Generatorcow-work['cow-work']
277Joystick QuickShot II Turbocow-work['cow-work']
276Gra wideo “PC Dragon Dice”cow-work['cow-work', 'video-game']
275Joystick Quickshotcow-work['cow-work']
274Komputer Spectravideo SVI–738cow-work['cow-work']
272Gra wideo “PC Man Of War”cow-work['cow-work', 'video-game']
271Gra wideo “PC Warcraft: Orcs & Humans”cow-work['cow-work', 'video-game']
270Gra wideo “Nowy Teenagent”cow-work['cow-work', 'video-game']
269Gra wideo "PC Requiem: Avenging Angel"cow-work['cow-work', 'video-game']
268Gra wideo “PC CLASH”cow-work['cow-work', 'video-game']
267Gra wideo "PC Baldur’s Gate: Opowieści z Wybrzeża Mieczy"cow-work['cow-work', 'video-game']
266Gra wideo “PC Fallout 2 - A Post Nuclear Role Playing Game”cow-work['cow-work', 'video-game']
265Gra wideo “PC Might & Magic: Heroes VI - Pirates of the Savage Sea”cow-work['cow-work', 'video-game']
264Gra wideo “PC Konung: Legenda Północy”cow-work['cow-work', 'video-game']
263Gra wideo “PC End of Twilight: Zaginiona tarcza wikinga”cow-work['cow-work', 'video-game']
262Gra wideo “Alien Nations”cow-work['cow-work', 'video-game']
261Gra wideo “PC Tony Hawk's Underground 2”cow-work['cow-work', 'video-game']
259Gra wideo "PC Kroniki czarnego księżyca"cow-work['cow-work', 'video-game']
260Gra wideo "PC ony Hawk's Pro Skater 3"cow-work['cow-work', 'video-game']
256Gra wideo “PC Full Spectrum Warrior”cow-work['cow-work', 'video-game']
258Gra wideo "PC Invictus: W Cieniu Olimpu"cow-work['cow-work', 'video-game']
236Gra planszowa "Carcassonne. Gra o zamkach, miastach i rycerzach.”cow-work['cow-work', 'boardgame']
237Gra zręcznościowa "Wieża"cow-work['cow-work', 'boardgame']
238Gra planszowa "Postaw na klocka"cow-work['cow-work', 'boardgame']
239Gra planszowa “Tajniacy”cow-work['cow-work', 'boardgame']
240Gra planszowa “Story Cubes: Podróże”cow-work['cow-work', 'boardgame']
253Gra wideo "PS2 Charlie and the Chocolate Factory"cow-work['cow-work', 'video-game']
254Gra wideo “ The Chronicles of Narnia: The Lion, The Witch and The Wardrobe”cow-work['cow-work', 'video-game']
255Gra wideo “PS2 Conflict: Vietnam”cow-work['cow-work', 'video-game']
248Komputer Amstrad 128k Colour Personal Computercow-work['cow-work']
249Zasilacz laboratoryjny Zhaoxincow-work['cow-work', 'tools']
250Gra karciana "Monty Python and the Holy Grail CCG Booster Pack"cow-work['cow-work', 'boardgame']
252Konsola do gier Doom.txtcow-work['cow-work']
251Konsola do gier DoomGirlcow-work['cow-work', 'video-game']
212SUN Keyboard & Mouse Collectioncow-work['cow-work']
243Gra karciana "List Miłosny"cow-work['cow-work', 'boardgame']
242Dodatek do gry “ KeyForge: Zew Archontów - Talia Archonta”cow-work['cow-work', 'boardgame']
241Gra planszowa “Developer Dilemmas”cow-work['cow-work', 'boardgame']
244Osciloscope OS-352 ZUE Unitemcow-work['cow-work']
245Dodatek do gry “KeyForge: Czas Wstąpienia - Talia Archonta”cow-work['cow-work', 'boardgame']
246Gra planszowa “Dobble: collector”cow-work['cow-work', 'boardgame']
247Gra planszowa “Cytadela”cow-work['cow-work', 'boardgame']
91Drukarka 3D Creality Ender 3lab['lab', 'tools', '3d-print']
139Drukarka Brother PT-E550WSPlab['lab']
222Gra planszowa “Spiskowcy"cow-work['cow-work', 'boardgame']
232Gra planszowa “Takie Życie - Ciekawostki"cow-work['cow-work', 'boardgame']
234Gra planszowa "Załoga: Wyprawa w głębiny"cow-work['cow-work', 'boardgame']
235Gra planszowa "Decrypto"cow-work['cow-work', 'boardgame']
233Blinkenkratecow-work['cow-work', 'projects']
231Mecanorma 9,99999MHzcow-work['cow-work']
230SECAM/PAL TV Pattern Generator Type K944cow-work['cow-work']
229TRIO 15MHz Oscilloscope CS-1560Acow-work['cow-work']
228Monitor Trinitroncow-work['cow-work']
227Oscyloskop ST-315A II KABID Radiotechnikacow-work['cow-work']
226Grundig AM/FM Generator AS4cow-work['cow-work']
225Mera tronik Digital Voltmeter Type V530cow-work['cow-work']
224Hewlett Packard 8640A Signal Generatorcow-work['cow-work']
223Sprzęt komp all-in-one krągły iMac *inandercow-work['cow-work']
221Monitor Amstrad CTM644cow-work['cow-work']
220UNITRA Unima Digital Multimeter 1331cow-work['cow-work']
219Leader LVS-5851 A PAL Vectorscopecow-work['cow-work']
218Zopan Signal Generator KZ 1623cow-work['cow-work']
217UNITRA Elmasz Miernik nierównomierności ND-1481cow-work['cow-work']
216SUN CD-ROM Caddy Loadedcow-work['cow-work']
215Xbox 360 Plaincow-work['cow-work']
214Xbox 360 Chromecow-work['cow-work']
213Xbox 360 Toothlesscow-work['cow-work']
211SUN Ultra 5 Bottomcow-work['cow-work']
210SUN Ultra 5 Topcow-work['cow-work']
209SUN Sparkstation 20cow-work['cow-work']
203Multimetr TL-4unknown[]
156Drabinkacow-work['cow-work']
155Flipchartcow-work['cow-work']
166Gra planszowa Oriflammecow-work['cow-work', 'boardgame']
168Gra planszowa "To ja go tnę"cow-work['cow-work', 'boardgame']
152Gra planszowa Dreadful Circuscow-work['cow-work', 'boardgame']
160Gra planszowa "Mage Knight Dugeons"cow-work['cow-work', 'boardgame']
169Gra planszowa Mix Turacow-work['cow-work', 'boardgame']
171Gra karciana UNOcow-work['cow-work']
140Kamizelka projektu 'Człowiek'cow-work['cow-work']
167Sprzęt komp Monitor Samsoncow-work['cow-work']
165Sprzęt komp Monitor mały Delltoncow-work['cow-work']
163Sprzęt komp all-in-one krągły iMaciejcow-work['cow-work']
162Sprzęt komp monitor Delltoncow-work['cow-work']
161Sprzęt komp All-in-one Asusełcow-work['cow-work']
159Sprzęt komp monitor Optimus Primecow-work['cow-work']
158Sprzęt komp monitor Hehe Princecow-work['cow-work']
157Sprzęt komp All-in-one Lenovaldekcow-work['cow-work']
154Sprzęt komp All-in-one Bazzitecow-work['cow-work']
143Von Countcow-work['cow-work']
142Kaktuscow-work['cow-work']
141Tramwajomatcow-work['cow-work']
170Sprzęt komp Desktop FrankenSUNcow-work['cow-work']
172Sprzęt komp Desktop Bandziorcow-work['cow-work']
173Sprzęt komp Desktop GOOD BOYcow-work['cow-work']
174Sprzęt komp Desktop Unbreak My Heartcow-work['cow-work']
175Sprzęt komp Desktop Mucha w Zupiecow-work['cow-work']
178Sprzęt komp Desktop Roxannecow-work['cow-work']
180Sprzęt komp Desktop Wronisławcow-work['cow-work']
194Sprzęt komp laptop Wonder Boycow-work['cow-work']
204Sprzęt komp laptop Lego Dellcow-work['cow-work']
181Klimatyzatorcow-work['cow-work']
205Sprzęt komp laptop HackLab-0x01cow-work['cow-work']
185Dekadowy Generator RC PW-9cow-work['cow-work']
186Sprzęt komp laptop Vojtěchcow-work['cow-work']
187PMZ-12 Automatic Distortion Metercow-work['cow-work']
190Dekadowy Generator RC PW-9 NATIONALcow-work['cow-work']
191Dekadowy Generator RC PW-9 TK2cow-work['cow-work']
192Generator RC PO-20cow-work['cow-work']
195Miernik napięć, zniekształceń i szumów VN-1064/Acow-work['cow-work']
184Sprzęt komp All-in-one Przyczajony nieobecny Bazylcow-work['cow-work']
183Sprzęt komp All-in-one Przyczajony Bazyl Lewycow-work['cow-work']
182Sprzęt komp All-in-one Przyczajony Bazyl pierwszycow-work['cow-work']
108PC Engines APU2 Router Boxcow-work['cow-work', 'networking']
150LEDon Schrödinger's pussycow-work['cow-work']
164Sprzęt komp Monitor Hapeuszunknown[]
153LEDon Duckcow-work['cow-work']
145Prince Charmingcow-work['cow-work']
93King Bobcow-work['cow-work']
90Chciejlistaunknown[]
85Komu powinien służyć Spejsunknown[]
84Budżetunknown[]
83Hackerspace Dragon Dreamingunknown[]
82Bibliotekacow-work['cow-work', 'books']
66Apteczkicow-work['cow-work', 'garage', 'bhp']
44Brayton Powergarage['garage', 'projects']
50Infinity mirror (duże)garage['garage', 'projects']
41Wiertarka PSB 500 RE BOSCHgarage['garage', 'tools']
46What the Duckcow-work['cow-work', 'wled']
+
+
+
+ + +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ + + + + + + + + \ No newline at end of file diff --git a/fegen/docs/static/css/style.css b/fegen/docs/static/css/style.css new file mode 100644 index 0000000..fcfabb6 --- /dev/null +++ b/fegen/docs/static/css/style.css @@ -0,0 +1,14 @@ +footer { + padding: 12px; + margin-top: auto; +} + +/* || Sidenav */ +.sidenav { + width: 250px; + position: sticky; + z-index: 1; + top: 0; + overflow-x: hidden; + padding: 6px 8px 6px 16px; +} diff --git a/fegen/main.py b/fegen/main.py new file mode 100644 index 0000000..eb8dd58 --- /dev/null +++ b/fegen/main.py @@ -0,0 +1,44 @@ +import os, re, shutil +from jinja2 import Environment, FileSystemLoader +import pandas as pd + + +def add_download_button(row): + item_id = re.sub(r' {item_id}' + ) + print_button = f'' + return row + [download_button, print_button] + + +def generate_dashboard(): + """Generate dashboard from zasoby.csv file""" + print("Generating HTML dashboard") + website_folder = "fegen/docs" + data = pd.read_csv("zasoby.csv") + env = Environment(loader=FileSystemLoader("fegen/template")) + print("Removing old website files") + print("Creating a new website") + shutil.copytree("fegen/template/static", f"{website_folder}/static", dirs_exist_ok=True) + template = env.get_template("_main_layout.html") + with open(f"{website_folder}/index.html", "w+", encoding="utf-8") as file: + header_row = data.columns.values.tolist() + ["label", "print"] + rows = map( + add_download_button, + data.values.tolist(), + ) + html = template.render( + title="Baza Zasobów Hackerspace Trójmiasto", + t_header=header_row, + t_body=rows, + ) + file.write(html) + + +if __name__ == "__main__": + from discourse import DiscourseDatabase + + DiscourseDatabase() + generate_dashboard() + print("Done!") diff --git a/fegen/template/_base_template.html b/fegen/template/_base_template.html new file mode 100644 index 0000000..ecf3da4 --- /dev/null +++ b/fegen/template/_base_template.html @@ -0,0 +1,150 @@ + + + + + + Baza Zasobów Hackerspace Trójmiasto + + + + + + + + + + + {% block body %}{% endblock body %} + +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ + + + + + + + + diff --git a/fegen/template/_main_layout.html b/fegen/template/_main_layout.html new file mode 100644 index 0000000..579f45d --- /dev/null +++ b/fegen/template/_main_layout.html @@ -0,0 +1,29 @@ +{% extends "_base_template.html" %} {% block body %} +
+
+
{% block sidenav %}{% endblock sidenav %}
+
+

Baza Zasobów Hackerspace Trójmiasto

+ + + + + {% for cell in t_header %} + + {% endfor %} + + + + {% for row in t_body %} + + {% for cell in row %} + + {% endfor %} + + {% endfor %} + +
{{cell}}
{{cell}}
+
+
+
+{% endblock body %} diff --git a/fegen/template/static/css/style.css b/fegen/template/static/css/style.css new file mode 100644 index 0000000..fcfabb6 --- /dev/null +++ b/fegen/template/static/css/style.css @@ -0,0 +1,14 @@ +footer { + padding: 12px; + margin-top: auto; +} + +/* || Sidenav */ +.sidenav { + width: 250px; + position: sticky; + z-index: 1; + top: 0; + overflow-x: hidden; + padding: 6px 8px 6px 16px; +} diff --git a/fonts/SourceCodePro-SemiBold.ttf b/fonts/SourceCodePro-SemiBold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..210f974ee4b7cfbf530214c6d2aea87a0b6b458a GIT binary patch literal 133348 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"] -readme = "README.md" +readme = "readme.md" requires-python = ">=3.11" dependencies = [ "brother-ql @ git+https://github.com/hbrylkowski/brother_ql@4225d13d209e8e4a2c17e87a75f42809e0da8fda", @@ -16,6 +16,10 @@ dependencies = [ "pyasn1==0.4.8,<0.5", "python-telegram-bot>=20.3,<21", "fastapi[standard]>=0.114.0", + "requests==2.32.5", + "Jinja2==3.1.6", + "pandas==2.3.3", + "python-dotenv==1.2.1", ] [tool.poetry.group.dev.dependencies] diff --git a/uv.lock b/uv.lock index 147a418..727696b 100644 --- a/uv.lock +++ b/uv.lock @@ -4,7 +4,8 @@ requires-python = ">=3.11" resolution-markers = [ "python_full_version >= '3.14'", "python_full_version == '3.13.*'", - "python_full_version < '3.13'", + "python_full_version == '3.12.*'", + "python_full_version < '3.12'", ] [[package]] @@ -418,12 +419,145 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" }, ] +[[package]] +name = "numpy" +version = "2.4.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/10/8b/c265f4823726ab832de836cdd184d0986dcf94480f81e8739692a7ac7af2/numpy-2.4.3.tar.gz", hash = "sha256:483a201202b73495f00dbc83796c6ae63137a9bdade074f7648b3e32613412dd", size = 20727743, upload-time = "2026-03-09T07:58:53.426Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f9/51/5093a2df15c4dc19da3f79d1021e891f5dcf1d9d1db6ba38891d5590f3fe/numpy-2.4.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:33b3bf58ee84b172c067f56aeadc7ee9ab6de69c5e800ab5b10295d54c581adb", size = 16957183, upload-time = "2026-03-09T07:55:57.774Z" }, + { url = "https://files.pythonhosted.org/packages/b5/7c/c061f3de0630941073d2598dc271ac2f6cbcf5c83c74a5870fea07488333/numpy-2.4.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8ba7b51e71c05aa1f9bc3641463cd82308eab40ce0d5c7e1fd4038cbf9938147", size = 14968734, upload-time = "2026-03-09T07:56:00.494Z" }, + { url = "https://files.pythonhosted.org/packages/ef/27/d26c85cbcd86b26e4f125b0668e7a7c0542d19dd7d23ee12e87b550e95b5/numpy-2.4.3-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:a1988292870c7cb9d0ebb4cc96b4d447513a9644801de54606dc7aabf2b7d920", size = 5475288, upload-time = "2026-03-09T07:56:02.857Z" }, + { url = "https://files.pythonhosted.org/packages/2b/09/3c4abbc1dcd8010bf1a611d174c7aa689fc505585ec806111b4406f6f1b1/numpy-2.4.3-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:23b46bb6d8ecb68b58c09944483c135ae5f0e9b8d8858ece5e4ead783771d2a9", size = 6805253, upload-time = "2026-03-09T07:56:04.53Z" }, + { url = "https://files.pythonhosted.org/packages/21/bc/e7aa3f6817e40c3f517d407742337cbb8e6fc4b83ce0b55ab780c829243b/numpy-2.4.3-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a016db5c5dba78fa8fe9f5d80d6708f9c42ab087a739803c0ac83a43d686a470", size = 15969479, upload-time = "2026-03-09T07:56:06.638Z" }, + { url = "https://files.pythonhosted.org/packages/78/51/9f5d7a41f0b51649ddf2f2320595e15e122a40610b233d51928dd6c92353/numpy-2.4.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:715de7f82e192e8cae5a507a347d97ad17598f8e026152ca97233e3666daaa71", size = 16901035, upload-time = "2026-03-09T07:56:09.405Z" }, + { url = "https://files.pythonhosted.org/packages/64/6e/b221dd847d7181bc5ee4857bfb026182ef69499f9305eb1371cbb1aea626/numpy-2.4.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2ddb7919366ee468342b91dea2352824c25b55814a987847b6c52003a7c97f15", size = 17325657, upload-time = "2026-03-09T07:56:12.067Z" }, + { url = "https://files.pythonhosted.org/packages/eb/b8/8f3fd2da596e1063964b758b5e3c970aed1949a05200d7e3d46a9d46d643/numpy-2.4.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a315e5234d88067f2d97e1f2ef670a7569df445d55400f1e33d117418d008d52", size = 18635512, upload-time = "2026-03-09T07:56:14.629Z" }, + { url = "https://files.pythonhosted.org/packages/5c/24/2993b775c37e39d2f8ab4125b44337ab0b2ba106c100980b7c274a22bee7/numpy-2.4.3-cp311-cp311-win32.whl", hash = "sha256:2b3f8d2c4589b1a2028d2a770b0fc4d1f332fb5e01521f4de3199a896d158ddd", size = 6238100, upload-time = "2026-03-09T07:56:17.243Z" }, + { url = "https://files.pythonhosted.org/packages/76/1d/edccf27adedb754db7c4511d5eac8b83f004ae948fe2d3509e8b78097d4c/numpy-2.4.3-cp311-cp311-win_amd64.whl", hash = "sha256:77e76d932c49a75617c6d13464e41203cd410956614d0a0e999b25e9e8d27eec", size = 12609816, upload-time = "2026-03-09T07:56:19.089Z" }, + { url = "https://files.pythonhosted.org/packages/92/82/190b99153480076c8dce85f4cfe7d53ea84444145ffa54cb58dcd460d66b/numpy-2.4.3-cp311-cp311-win_arm64.whl", hash = "sha256:eb610595dd91560905c132c709412b512135a60f1851ccbd2c959e136431ff67", size = 10485757, upload-time = "2026-03-09T07:56:21.753Z" }, + { url = "https://files.pythonhosted.org/packages/a9/ed/6388632536f9788cea23a3a1b629f25b43eaacd7d7377e5d6bc7b9deb69b/numpy-2.4.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:61b0cbabbb6126c8df63b9a3a0c4b1f44ebca5e12ff6997b80fcf267fb3150ef", size = 16669628, upload-time = "2026-03-09T07:56:24.252Z" }, + { url = "https://files.pythonhosted.org/packages/74/1b/ee2abfc68e1ce728b2958b6ba831d65c62e1b13ce3017c13943f8f9b5b2e/numpy-2.4.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7395e69ff32526710748f92cd8c9849b361830968ea3e24a676f272653e8983e", size = 14696872, upload-time = "2026-03-09T07:56:26.991Z" }, + { url = "https://files.pythonhosted.org/packages/ba/d1/780400e915ff5638166f11ca9dc2c5815189f3d7cf6f8759a1685e586413/numpy-2.4.3-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:abdce0f71dcb4a00e4e77f3faf05e4616ceccfe72ccaa07f47ee79cda3b7b0f4", size = 5203489, upload-time = "2026-03-09T07:56:29.414Z" }, + { url = "https://files.pythonhosted.org/packages/0b/bb/baffa907e9da4cc34a6e556d6d90e032f6d7a75ea47968ea92b4858826c4/numpy-2.4.3-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:48da3a4ee1336454b07497ff7ec83903efa5505792c4e6d9bf83d99dc07a1e18", size = 6550814, upload-time = "2026-03-09T07:56:32.225Z" }, + { url = "https://files.pythonhosted.org/packages/7b/12/8c9f0c6c95f76aeb20fc4a699c33e9f827fa0d0f857747c73bb7b17af945/numpy-2.4.3-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:32e3bef222ad6b052280311d1d60db8e259e4947052c3ae7dd6817451fc8a4c5", size = 15666601, upload-time = "2026-03-09T07:56:34.461Z" }, + { url = "https://files.pythonhosted.org/packages/bd/79/cc665495e4d57d0aa6fbcc0aa57aa82671dfc78fbf95fe733ed86d98f52a/numpy-2.4.3-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e7dd01a46700b1967487141a66ac1a3cf0dd8ebf1f08db37d46389401512ca97", size = 16621358, upload-time = "2026-03-09T07:56:36.852Z" }, + { url = "https://files.pythonhosted.org/packages/a8/40/b4ecb7224af1065c3539f5ecfff879d090de09608ad1008f02c05c770cb3/numpy-2.4.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:76f0f283506c28b12bba319c0fab98217e9f9b54e6160e9c79e9f7348ba32e9c", size = 17016135, upload-time = "2026-03-09T07:56:39.337Z" }, + { url = "https://files.pythonhosted.org/packages/f7/b1/6a88e888052eed951afed7a142dcdf3b149a030ca59b4c71eef085858e43/numpy-2.4.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:737f630a337364665aba3b5a77e56a68cc42d350edd010c345d65a3efa3addcc", size = 18345816, upload-time = "2026-03-09T07:56:42.31Z" }, + { url = "https://files.pythonhosted.org/packages/f3/8f/103a60c5f8c3d7fc678c19cd7b2476110da689ccb80bc18050efbaeae183/numpy-2.4.3-cp312-cp312-win32.whl", hash = "sha256:26952e18d82a1dbbc2f008d402021baa8d6fc8e84347a2072a25e08b46d698b9", size = 5960132, upload-time = "2026-03-09T07:56:44.851Z" }, + { url = "https://files.pythonhosted.org/packages/d7/7c/f5ee1bf6ed888494978046a809df2882aad35d414b622893322df7286879/numpy-2.4.3-cp312-cp312-win_amd64.whl", hash = "sha256:65f3c2455188f09678355f5cae1f959a06b778bc66d535da07bf2ef20cd319d5", size = 12316144, upload-time = "2026-03-09T07:56:47.057Z" }, + { url = "https://files.pythonhosted.org/packages/71/46/8d1cb3f7a00f2fb6394140e7e6623696e54c6318a9d9691bb4904672cf42/numpy-2.4.3-cp312-cp312-win_arm64.whl", hash = "sha256:2abad5c7fef172b3377502bde47892439bae394a71bc329f31df0fd829b41a9e", size = 10220364, upload-time = "2026-03-09T07:56:49.849Z" }, + { url = "https://files.pythonhosted.org/packages/b6/d0/1fe47a98ce0df229238b77611340aff92d52691bcbc10583303181abf7fc/numpy-2.4.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b346845443716c8e542d54112966383b448f4a3ba5c66409771b8c0889485dd3", size = 16665297, upload-time = "2026-03-09T07:56:52.296Z" }, + { url = "https://files.pythonhosted.org/packages/27/d9/4e7c3f0e68dfa91f21c6fb6cf839bc829ec920688b1ce7ec722b1a6202fb/numpy-2.4.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2629289168f4897a3c4e23dc98d6f1731f0fc0fe52fb9db19f974041e4cc12b9", size = 14691853, upload-time = "2026-03-09T07:56:54.992Z" }, + { url = "https://files.pythonhosted.org/packages/3a/66/bd096b13a87549683812b53ab211e6d413497f84e794fb3c39191948da97/numpy-2.4.3-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:bb2e3cf95854233799013779216c57e153c1ee67a0bf92138acca0e429aefaee", size = 5198435, upload-time = "2026-03-09T07:56:57.184Z" }, + { url = "https://files.pythonhosted.org/packages/a2/2f/687722910b5a5601de2135c891108f51dfc873d8e43c8ed9f4ebb440b4a2/numpy-2.4.3-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:7f3408ff897f8ab07a07fbe2823d7aee6ff644c097cc1f90382511fe982f647f", size = 6546347, upload-time = "2026-03-09T07:56:59.531Z" }, + { url = "https://files.pythonhosted.org/packages/bf/ec/7971c4e98d86c564750393fab8d7d83d0a9432a9d78bb8a163a6dc59967a/numpy-2.4.3-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:decb0eb8a53c3b009b0962378065589685d66b23467ef5dac16cbe818afde27f", size = 15664626, upload-time = "2026-03-09T07:57:01.385Z" }, + { url = "https://files.pythonhosted.org/packages/7e/eb/7daecbea84ec935b7fc732e18f532073064a3816f0932a40a17f3349185f/numpy-2.4.3-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d5f51900414fc9204a0e0da158ba2ac52b75656e7dce7e77fb9f84bfa343b4cc", size = 16608916, upload-time = "2026-03-09T07:57:04.008Z" }, + { url = "https://files.pythonhosted.org/packages/df/58/2a2b4a817ffd7472dca4421d9f0776898b364154e30c95f42195041dc03b/numpy-2.4.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6bd06731541f89cdc01b261ba2c9e037f1543df7472517836b78dfb15bd6e476", size = 17015824, upload-time = "2026-03-09T07:57:06.347Z" }, + { url = "https://files.pythonhosted.org/packages/4a/ca/627a828d44e78a418c55f82dd4caea8ea4a8ef24e5144d9e71016e52fb40/numpy-2.4.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:22654fe6be0e5206f553a9250762c653d3698e46686eee53b399ab90da59bd92", size = 18334581, upload-time = "2026-03-09T07:57:09.114Z" }, + { url = "https://files.pythonhosted.org/packages/cd/c0/76f93962fc79955fcba30a429b62304332345f22d4daec1cb33653425643/numpy-2.4.3-cp313-cp313-win32.whl", hash = "sha256:d71e379452a2f670ccb689ec801b1218cd3983e253105d6e83780967e899d687", size = 5958618, upload-time = "2026-03-09T07:57:11.432Z" }, + { url = "https://files.pythonhosted.org/packages/b1/3c/88af0040119209b9b5cb59485fa48b76f372c73068dbf9254784b975ac53/numpy-2.4.3-cp313-cp313-win_amd64.whl", hash = "sha256:0a60e17a14d640f49146cb38e3f105f571318db7826d9b6fef7e4dce758faecd", size = 12312824, upload-time = "2026-03-09T07:57:13.586Z" }, + { url = "https://files.pythonhosted.org/packages/58/ce/3d07743aced3d173f877c3ef6a454c2174ba42b584ab0b7e6d99374f51ed/numpy-2.4.3-cp313-cp313-win_arm64.whl", hash = "sha256:c9619741e9da2059cd9c3f206110b97583c7152c1dc9f8aafd4beb450ac1c89d", size = 10221218, upload-time = "2026-03-09T07:57:16.183Z" }, + { url = "https://files.pythonhosted.org/packages/62/09/d96b02a91d09e9d97862f4fc8bfebf5400f567d8eb1fe4b0cc4795679c15/numpy-2.4.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:7aa4e54f6469300ebca1d9eb80acd5253cdfa36f2c03d79a35883687da430875", size = 14819570, upload-time = "2026-03-09T07:57:18.564Z" }, + { url = "https://files.pythonhosted.org/packages/b5/ca/0b1aba3905fdfa3373d523b2b15b19029f4f3031c87f4066bd9d20ef6c6b/numpy-2.4.3-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:d1b90d840b25874cf5cd20c219af10bac3667db3876d9a495609273ebe679070", size = 5326113, upload-time = "2026-03-09T07:57:21.052Z" }, + { url = "https://files.pythonhosted.org/packages/c0/63/406e0fd32fcaeb94180fd6a4c41e55736d676c54346b7efbce548b94a914/numpy-2.4.3-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:a749547700de0a20a6718293396ec237bb38218049cfce788e08fcb716e8cf73", size = 6646370, upload-time = "2026-03-09T07:57:22.804Z" }, + { url = "https://files.pythonhosted.org/packages/b6/d0/10f7dc157d4b37af92720a196be6f54f889e90dcd30dce9dc657ed92c257/numpy-2.4.3-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:94f3c4a151a2e529adf49c1d54f0f57ff8f9b233ee4d44af623a81553ab86368", size = 15723499, upload-time = "2026-03-09T07:57:24.693Z" }, + { url = "https://files.pythonhosted.org/packages/66/f1/d1c2bf1161396629701bc284d958dc1efa3a5a542aab83cf11ee6eb4cba5/numpy-2.4.3-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:22c31dc07025123aedf7f2db9e91783df13f1776dc52c6b22c620870dc0fab22", size = 16657164, upload-time = "2026-03-09T07:57:27.676Z" }, + { url = "https://files.pythonhosted.org/packages/1a/be/cca19230b740af199ac47331a21c71e7a3d0ba59661350483c1600d28c37/numpy-2.4.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:148d59127ac95979d6f07e4d460f934ebdd6eed641db9c0db6c73026f2b2101a", size = 17081544, upload-time = "2026-03-09T07:57:30.664Z" }, + { url = "https://files.pythonhosted.org/packages/b9/c5/9602b0cbb703a0936fb40f8a95407e8171935b15846de2f0776e08af04c7/numpy-2.4.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:a97cbf7e905c435865c2d939af3d93f99d18eaaa3cabe4256f4304fb51604349", size = 18380290, upload-time = "2026-03-09T07:57:33.763Z" }, + { url = "https://files.pythonhosted.org/packages/ed/81/9f24708953cd30be9ee36ec4778f4b112b45165812f2ada4cc5ea1c1f254/numpy-2.4.3-cp313-cp313t-win32.whl", hash = "sha256:be3b8487d725a77acccc9924f65fd8bce9af7fac8c9820df1049424a2115af6c", size = 6082814, upload-time = "2026-03-09T07:57:36.491Z" }, + { url = "https://files.pythonhosted.org/packages/e2/9e/52f6eaa13e1a799f0ab79066c17f7016a4a8ae0c1aefa58c82b4dab690b4/numpy-2.4.3-cp313-cp313t-win_amd64.whl", hash = "sha256:1ec84fd7c8e652b0f4aaaf2e6e9cc8eaa9b1b80a537e06b2e3a2fb176eedcb26", size = 12452673, upload-time = "2026-03-09T07:57:38.281Z" }, + { url = "https://files.pythonhosted.org/packages/c4/04/b8cece6ead0b30c9fbd99bb835ad7ea0112ac5f39f069788c5558e3b1ab2/numpy-2.4.3-cp313-cp313t-win_arm64.whl", hash = "sha256:120df8c0a81ebbf5b9020c91439fccd85f5e018a927a39f624845be194a2be02", size = 10290907, upload-time = "2026-03-09T07:57:40.747Z" }, + { url = "https://files.pythonhosted.org/packages/70/ae/3936f79adebf8caf81bd7a599b90a561334a658be4dcc7b6329ebf4ee8de/numpy-2.4.3-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:5884ce5c7acfae1e4e1b6fde43797d10aa506074d25b531b4f54bde33c0c31d4", size = 16664563, upload-time = "2026-03-09T07:57:43.817Z" }, + { url = "https://files.pythonhosted.org/packages/9b/62/760f2b55866b496bb1fa7da2a6db076bef908110e568b02fcfc1422e2a3a/numpy-2.4.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:297837823f5bc572c5f9379b0c9f3a3365f08492cbdc33bcc3af174372ebb168", size = 14702161, upload-time = "2026-03-09T07:57:46.169Z" }, + { url = "https://files.pythonhosted.org/packages/32/af/a7a39464e2c0a21526fb4fb76e346fb172ebc92f6d1c7a07c2c139cc17b1/numpy-2.4.3-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:a111698b4a3f8dcbe54c64a7708f049355abd603e619013c346553c1fd4ca90b", size = 5208738, upload-time = "2026-03-09T07:57:48.506Z" }, + { url = "https://files.pythonhosted.org/packages/29/8c/2a0cf86a59558fa078d83805589c2de490f29ed4fb336c14313a161d358a/numpy-2.4.3-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:4bd4741a6a676770e0e97fe9ab2e51de01183df3dcbcec591d26d331a40de950", size = 6543618, upload-time = "2026-03-09T07:57:50.591Z" }, + { url = "https://files.pythonhosted.org/packages/aa/b8/612ce010c0728b1c363fa4ea3aa4c22fe1c5da1de008486f8c2f5cb92fae/numpy-2.4.3-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:54f29b877279d51e210e0c80709ee14ccbbad647810e8f3d375561c45ef613dd", size = 15680676, upload-time = "2026-03-09T07:57:52.34Z" }, + { url = "https://files.pythonhosted.org/packages/a9/7e/4f120ecc54ba26ddf3dc348eeb9eb063f421de65c05fc961941798feea18/numpy-2.4.3-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:679f2a834bae9020f81534671c56fd0cc76dd7e5182f57131478e23d0dc59e24", size = 16613492, upload-time = "2026-03-09T07:57:54.91Z" }, + { url = "https://files.pythonhosted.org/packages/2c/86/1b6020db73be330c4b45d5c6ee4295d59cfeef0e3ea323959d053e5a6909/numpy-2.4.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:d84f0f881cb2225c2dfd7f78a10a5645d487a496c6668d6cc39f0f114164f3d0", size = 17031789, upload-time = "2026-03-09T07:57:57.641Z" }, + { url = "https://files.pythonhosted.org/packages/07/3a/3b90463bf41ebc21d1b7e06079f03070334374208c0f9a1f05e4ae8455e7/numpy-2.4.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d213c7e6e8d211888cc359bab7199670a00f5b82c0978b9d1c75baf1eddbeac0", size = 18339941, upload-time = "2026-03-09T07:58:00.577Z" }, + { url = "https://files.pythonhosted.org/packages/a8/74/6d736c4cd962259fd8bae9be27363eb4883a2f9069763747347544c2a487/numpy-2.4.3-cp314-cp314-win32.whl", hash = "sha256:52077feedeff7c76ed7c9f1a0428558e50825347b7545bbb8523da2cd55c547a", size = 6007503, upload-time = "2026-03-09T07:58:03.331Z" }, + { url = "https://files.pythonhosted.org/packages/48/39/c56ef87af669364356bb011922ef0734fc49dad51964568634c72a009488/numpy-2.4.3-cp314-cp314-win_amd64.whl", hash = "sha256:0448e7f9caefb34b4b7dd2b77f21e8906e5d6f0365ad525f9f4f530b13df2afc", size = 12444915, upload-time = "2026-03-09T07:58:06.353Z" }, + { url = "https://files.pythonhosted.org/packages/9d/1f/ab8528e38d295fd349310807496fabb7cf9fe2e1f70b97bc20a483ea9d4a/numpy-2.4.3-cp314-cp314-win_arm64.whl", hash = "sha256:b44fd60341c4d9783039598efadd03617fa28d041fc37d22b62d08f2027fa0e7", size = 10494875, upload-time = "2026-03-09T07:58:08.734Z" }, + { url = "https://files.pythonhosted.org/packages/e6/ef/b7c35e4d5ef141b836658ab21a66d1a573e15b335b1d111d31f26c8ef80f/numpy-2.4.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:0a195f4216be9305a73c0e91c9b026a35f2161237cf1c6de9b681637772ea657", size = 14822225, upload-time = "2026-03-09T07:58:11.034Z" }, + { url = "https://files.pythonhosted.org/packages/cd/8d/7730fa9278cf6648639946cc816e7cc89f0d891602584697923375f801ed/numpy-2.4.3-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:cd32fbacb9fd1bf041bf8e89e4576b6f00b895f06d00914820ae06a616bdfef7", size = 5328769, upload-time = "2026-03-09T07:58:13.67Z" }, + { url = "https://files.pythonhosted.org/packages/47/01/d2a137317c958b074d338807c1b6a383406cdf8b8e53b075d804cc3d211d/numpy-2.4.3-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:2e03c05abaee1f672e9d67bc858f300b5ccba1c21397211e8d77d98350972093", size = 6649461, upload-time = "2026-03-09T07:58:15.912Z" }, + { url = "https://files.pythonhosted.org/packages/5c/34/812ce12bc0f00272a4b0ec0d713cd237cb390666eb6206323d1cc9cedbb2/numpy-2.4.3-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7d1ce23cce91fcea443320a9d0ece9b9305d4368875bab09538f7a5b4131938a", size = 15725809, upload-time = "2026-03-09T07:58:17.787Z" }, + { url = "https://files.pythonhosted.org/packages/25/c0/2aed473a4823e905e765fee3dc2cbf504bd3e68ccb1150fbdabd5c39f527/numpy-2.4.3-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c59020932feb24ed49ffd03704fbab89f22aa9c0d4b180ff45542fe8918f5611", size = 16655242, upload-time = "2026-03-09T07:58:20.476Z" }, + { url = "https://files.pythonhosted.org/packages/f2/c8/7e052b2fc87aa0e86de23f20e2c42bd261c624748aa8efd2c78f7bb8d8c6/numpy-2.4.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:9684823a78a6cd6ad7511fc5e25b07947d1d5b5e2812c93fe99d7d4195130720", size = 17080660, upload-time = "2026-03-09T07:58:23.067Z" }, + { url = "https://files.pythonhosted.org/packages/f3/3d/0876746044db2adcb11549f214d104f2e1be00f07a67edbb4e2812094847/numpy-2.4.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:0200b25c687033316fb39f0ff4e3e690e8957a2c3c8d22499891ec58c37a3eb5", size = 18380384, upload-time = "2026-03-09T07:58:25.839Z" }, + { url = "https://files.pythonhosted.org/packages/07/12/8160bea39da3335737b10308df4f484235fd297f556745f13092aa039d3b/numpy-2.4.3-cp314-cp314t-win32.whl", hash = "sha256:5e10da9e93247e554bb1d22f8edc51847ddd7dde52d85ce31024c1b4312bfba0", size = 6154547, upload-time = "2026-03-09T07:58:28.289Z" }, + { url = "https://files.pythonhosted.org/packages/42/f3/76534f61f80d74cc9cdf2e570d3d4eeb92c2280a27c39b0aaf471eda7b48/numpy-2.4.3-cp314-cp314t-win_amd64.whl", hash = "sha256:45f003dbdffb997a03da2d1d0cb41fbd24a87507fb41605c0420a3db5bd4667b", size = 12633645, upload-time = "2026-03-09T07:58:30.384Z" }, + { url = "https://files.pythonhosted.org/packages/1f/b6/7c0d4334c15983cec7f92a69e8ce9b1e6f31857e5ee3a413ac424e6bd63d/numpy-2.4.3-cp314-cp314t-win_arm64.whl", hash = "sha256:4d382735cecd7bcf090172489a525cd7d4087bc331f7df9f60ddc9a296cf208e", size = 10565454, upload-time = "2026-03-09T07:58:33.031Z" }, + { url = "https://files.pythonhosted.org/packages/64/e4/4dab9fb43c83719c29241c535d9e07be73bea4bc0c6686c5816d8e1b6689/numpy-2.4.3-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:c6b124bfcafb9e8d3ed09130dbee44848c20b3e758b6bbf006e641778927c028", size = 16834892, upload-time = "2026-03-09T07:58:35.334Z" }, + { url = "https://files.pythonhosted.org/packages/c9/29/f8b6d4af90fed3dfda84ebc0df06c9833d38880c79ce954e5b661758aa31/numpy-2.4.3-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:76dbb9d4e43c16cf9aa711fcd8de1e2eeb27539dcefb60a1d5e9f12fae1d1ed8", size = 14893070, upload-time = "2026-03-09T07:58:37.7Z" }, + { url = "https://files.pythonhosted.org/packages/9a/04/a19b3c91dbec0a49269407f15d5753673a09832daed40c45e8150e6fa558/numpy-2.4.3-pp311-pypy311_pp73-macosx_14_0_arm64.whl", hash = "sha256:29363fbfa6f8ee855d7569c96ce524845e3d726d6c19b29eceec7dd555dab152", size = 5399609, upload-time = "2026-03-09T07:58:39.853Z" }, + { url = "https://files.pythonhosted.org/packages/79/34/4d73603f5420eab89ea8a67097b31364bf7c30f811d4dd84b1659c7476d9/numpy-2.4.3-pp311-pypy311_pp73-macosx_14_0_x86_64.whl", hash = "sha256:bc71942c789ef415a37f0d4eab90341425a00d538cd0642445d30b41023d3395", size = 6714355, upload-time = "2026-03-09T07:58:42.365Z" }, + { url = "https://files.pythonhosted.org/packages/58/ad/1100d7229bb248394939a12a8074d485b655e8ed44207d328fdd7fcebc7b/numpy-2.4.3-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7e58765ad74dcebd3ef0208a5078fba32dc8ec3578fe84a604432950cd043d79", size = 15800434, upload-time = "2026-03-09T07:58:44.837Z" }, + { url = "https://files.pythonhosted.org/packages/0c/fd/16d710c085d28ba4feaf29ac60c936c9d662e390344f94a6beaa2ac9899b/numpy-2.4.3-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8e236dbda4e1d319d681afcbb136c0c4a8e0f1a5c58ceec2adebb547357fe857", size = 16729409, upload-time = "2026-03-09T07:58:47.972Z" }, + { url = "https://files.pythonhosted.org/packages/57/a7/b35835e278c18b85206834b3aa3abe68e77a98769c59233d1f6300284781/numpy-2.4.3-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:4b42639cdde6d24e732ff823a3fa5b701d8acad89c4142bc1d0bd6dc85200ba5", size = 12504685, upload-time = "2026-03-09T07:58:50.525Z" }, +] + [[package]] name = "packbits" version = "0.6" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/1b/23/78a967c9b9961258da2bf0d0a63bf12293ccddf96ec77361ee7b44f543f1/packbits-0.6.tar.gz", hash = "sha256:bc6b370bb34e04ac8cfa835e06c0484380affc6d593adb8009dd6c0f7bfff034", size = 2167, upload-time = "2013-04-06T08:22:59.65Z" } +[[package]] +name = "pandas" +version = "2.3.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, + { name = "python-dateutil" }, + { name = "pytz" }, + { name = "tzdata" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/33/01/d40b85317f86cf08d853a4f495195c73815fdf205eef3993821720274518/pandas-2.3.3.tar.gz", hash = "sha256:e05e1af93b977f7eafa636d043f9f94c7ee3ac81af99c13508215942e64c993b", size = 4495223, upload-time = "2025-09-29T23:34:51.853Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c1/fa/7ac648108144a095b4fb6aa3de1954689f7af60a14cf25583f4960ecb878/pandas-2.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:602b8615ebcc4a0c1751e71840428ddebeb142ec02c786e8ad6b1ce3c8dec523", size = 11578790, upload-time = "2025-09-29T23:18:30.065Z" }, + { url = "https://files.pythonhosted.org/packages/9b/35/74442388c6cf008882d4d4bdfc4109be87e9b8b7ccd097ad1e7f006e2e95/pandas-2.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8fe25fc7b623b0ef6b5009149627e34d2a4657e880948ec3c840e9402e5c1b45", size = 10833831, upload-time = "2025-09-29T23:38:56.071Z" }, + { url = "https://files.pythonhosted.org/packages/fe/e4/de154cbfeee13383ad58d23017da99390b91d73f8c11856f2095e813201b/pandas-2.3.3-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b468d3dad6ff947df92dcb32ede5b7bd41a9b3cceef0a30ed925f6d01fb8fa66", size = 12199267, upload-time = "2025-09-29T23:18:41.627Z" }, + { url = "https://files.pythonhosted.org/packages/bf/c9/63f8d545568d9ab91476b1818b4741f521646cbdd151c6efebf40d6de6f7/pandas-2.3.3-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b98560e98cb334799c0b07ca7967ac361a47326e9b4e5a7dfb5ab2b1c9d35a1b", size = 12789281, upload-time = "2025-09-29T23:18:56.834Z" }, + { url = "https://files.pythonhosted.org/packages/f2/00/a5ac8c7a0e67fd1a6059e40aa08fa1c52cc00709077d2300e210c3ce0322/pandas-2.3.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d37b5848ba49824e5c30bedb9c830ab9b7751fd049bc7914533e01c65f79791", size = 13240453, upload-time = "2025-09-29T23:19:09.247Z" }, + { url = "https://files.pythonhosted.org/packages/27/4d/5c23a5bc7bd209231618dd9e606ce076272c9bc4f12023a70e03a86b4067/pandas-2.3.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:db4301b2d1f926ae677a751eb2bd0e8c5f5319c9cb3f88b0becbbb0b07b34151", size = 13890361, upload-time = "2025-09-29T23:19:25.342Z" }, + { url = "https://files.pythonhosted.org/packages/8e/59/712db1d7040520de7a4965df15b774348980e6df45c129b8c64d0dbe74ef/pandas-2.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:f086f6fe114e19d92014a1966f43a3e62285109afe874f067f5abbdcbb10e59c", size = 11348702, upload-time = "2025-09-29T23:19:38.296Z" }, + { url = "https://files.pythonhosted.org/packages/9c/fb/231d89e8637c808b997d172b18e9d4a4bc7bf31296196c260526055d1ea0/pandas-2.3.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6d21f6d74eb1725c2efaa71a2bfc661a0689579b58e9c0ca58a739ff0b002b53", size = 11597846, upload-time = "2025-09-29T23:19:48.856Z" }, + { url = "https://files.pythonhosted.org/packages/5c/bd/bf8064d9cfa214294356c2d6702b716d3cf3bb24be59287a6a21e24cae6b/pandas-2.3.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3fd2f887589c7aa868e02632612ba39acb0b8948faf5cc58f0850e165bd46f35", size = 10729618, upload-time = "2025-09-29T23:39:08.659Z" }, + { url = "https://files.pythonhosted.org/packages/57/56/cf2dbe1a3f5271370669475ead12ce77c61726ffd19a35546e31aa8edf4e/pandas-2.3.3-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ecaf1e12bdc03c86ad4a7ea848d66c685cb6851d807a26aa245ca3d2017a1908", size = 11737212, upload-time = "2025-09-29T23:19:59.765Z" }, + { url = "https://files.pythonhosted.org/packages/e5/63/cd7d615331b328e287d8233ba9fdf191a9c2d11b6af0c7a59cfcec23de68/pandas-2.3.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b3d11d2fda7eb164ef27ffc14b4fcab16a80e1ce67e9f57e19ec0afaf715ba89", size = 12362693, upload-time = "2025-09-29T23:20:14.098Z" }, + { url = "https://files.pythonhosted.org/packages/a6/de/8b1895b107277d52f2b42d3a6806e69cfef0d5cf1d0ba343470b9d8e0a04/pandas-2.3.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a68e15f780eddf2b07d242e17a04aa187a7ee12b40b930bfdd78070556550e98", size = 12771002, upload-time = "2025-09-29T23:20:26.76Z" }, + { url = "https://files.pythonhosted.org/packages/87/21/84072af3187a677c5893b170ba2c8fbe450a6ff911234916da889b698220/pandas-2.3.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:371a4ab48e950033bcf52b6527eccb564f52dc826c02afd9a1bc0ab731bba084", size = 13450971, upload-time = "2025-09-29T23:20:41.344Z" }, + { url = "https://files.pythonhosted.org/packages/86/41/585a168330ff063014880a80d744219dbf1dd7a1c706e75ab3425a987384/pandas-2.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:a16dcec078a01eeef8ee61bf64074b4e524a2a3f4b3be9326420cabe59c4778b", size = 10992722, upload-time = "2025-09-29T23:20:54.139Z" }, + { url = "https://files.pythonhosted.org/packages/cd/4b/18b035ee18f97c1040d94debd8f2e737000ad70ccc8f5513f4eefad75f4b/pandas-2.3.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:56851a737e3470de7fa88e6131f41281ed440d29a9268dcbf0002da5ac366713", size = 11544671, upload-time = "2025-09-29T23:21:05.024Z" }, + { url = "https://files.pythonhosted.org/packages/31/94/72fac03573102779920099bcac1c3b05975c2cb5f01eac609faf34bed1ca/pandas-2.3.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bdcd9d1167f4885211e401b3036c0c8d9e274eee67ea8d0758a256d60704cfe8", size = 10680807, upload-time = "2025-09-29T23:21:15.979Z" }, + { url = "https://files.pythonhosted.org/packages/16/87/9472cf4a487d848476865321de18cc8c920b8cab98453ab79dbbc98db63a/pandas-2.3.3-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e32e7cc9af0f1cc15548288a51a3b681cc2a219faa838e995f7dc53dbab1062d", size = 11709872, upload-time = "2025-09-29T23:21:27.165Z" }, + { url = "https://files.pythonhosted.org/packages/15/07/284f757f63f8a8d69ed4472bfd85122bd086e637bf4ed09de572d575a693/pandas-2.3.3-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:318d77e0e42a628c04dc56bcef4b40de67918f7041c2b061af1da41dcff670ac", size = 12306371, upload-time = "2025-09-29T23:21:40.532Z" }, + { url = "https://files.pythonhosted.org/packages/33/81/a3afc88fca4aa925804a27d2676d22dcd2031c2ebe08aabd0ae55b9ff282/pandas-2.3.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4e0a175408804d566144e170d0476b15d78458795bb18f1304fb94160cabf40c", size = 12765333, upload-time = "2025-09-29T23:21:55.77Z" }, + { url = "https://files.pythonhosted.org/packages/8d/0f/b4d4ae743a83742f1153464cf1a8ecfafc3ac59722a0b5c8602310cb7158/pandas-2.3.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:93c2d9ab0fc11822b5eece72ec9587e172f63cff87c00b062f6e37448ced4493", size = 13418120, upload-time = "2025-09-29T23:22:10.109Z" }, + { url = "https://files.pythonhosted.org/packages/4f/c7/e54682c96a895d0c808453269e0b5928a07a127a15704fedb643e9b0a4c8/pandas-2.3.3-cp313-cp313-win_amd64.whl", hash = "sha256:f8bfc0e12dc78f777f323f55c58649591b2cd0c43534e8355c51d3fede5f4dee", size = 10993991, upload-time = "2025-09-29T23:25:04.889Z" }, + { url = "https://files.pythonhosted.org/packages/f9/ca/3f8d4f49740799189e1395812f3bf23b5e8fc7c190827d55a610da72ce55/pandas-2.3.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:75ea25f9529fdec2d2e93a42c523962261e567d250b0013b16210e1d40d7c2e5", size = 12048227, upload-time = "2025-09-29T23:22:24.343Z" }, + { url = "https://files.pythonhosted.org/packages/0e/5a/f43efec3e8c0cc92c4663ccad372dbdff72b60bdb56b2749f04aa1d07d7e/pandas-2.3.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:74ecdf1d301e812db96a465a525952f4dde225fdb6d8e5a521d47e1f42041e21", size = 11411056, upload-time = "2025-09-29T23:22:37.762Z" }, + { url = "https://files.pythonhosted.org/packages/46/b1/85331edfc591208c9d1a63a06baa67b21d332e63b7a591a5ba42a10bb507/pandas-2.3.3-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6435cb949cb34ec11cc9860246ccb2fdc9ecd742c12d3304989017d53f039a78", size = 11645189, upload-time = "2025-09-29T23:22:51.688Z" }, + { url = "https://files.pythonhosted.org/packages/44/23/78d645adc35d94d1ac4f2a3c4112ab6f5b8999f4898b8cdf01252f8df4a9/pandas-2.3.3-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:900f47d8f20860de523a1ac881c4c36d65efcb2eb850e6948140fa781736e110", size = 12121912, upload-time = "2025-09-29T23:23:05.042Z" }, + { url = "https://files.pythonhosted.org/packages/53/da/d10013df5e6aaef6b425aa0c32e1fc1f3e431e4bcabd420517dceadce354/pandas-2.3.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a45c765238e2ed7d7c608fc5bc4a6f88b642f2f01e70c0c23d2224dd21829d86", size = 12712160, upload-time = "2025-09-29T23:23:28.57Z" }, + { url = "https://files.pythonhosted.org/packages/bd/17/e756653095a083d8a37cbd816cb87148debcfcd920129b25f99dd8d04271/pandas-2.3.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:c4fc4c21971a1a9f4bdb4c73978c7f7256caa3e62b323f70d6cb80db583350bc", size = 13199233, upload-time = "2025-09-29T23:24:24.876Z" }, + { url = "https://files.pythonhosted.org/packages/04/fd/74903979833db8390b73b3a8a7d30d146d710bd32703724dd9083950386f/pandas-2.3.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:ee15f284898e7b246df8087fc82b87b01686f98ee67d85a17b7ab44143a3a9a0", size = 11540635, upload-time = "2025-09-29T23:25:52.486Z" }, + { url = "https://files.pythonhosted.org/packages/21/00/266d6b357ad5e6d3ad55093a7e8efc7dd245f5a842b584db9f30b0f0a287/pandas-2.3.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1611aedd912e1ff81ff41c745822980c49ce4a7907537be8692c8dbc31924593", size = 10759079, upload-time = "2025-09-29T23:26:33.204Z" }, + { url = "https://files.pythonhosted.org/packages/ca/05/d01ef80a7a3a12b2f8bbf16daba1e17c98a2f039cbc8e2f77a2c5a63d382/pandas-2.3.3-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6d2cefc361461662ac48810cb14365a365ce864afe85ef1f447ff5a1e99ea81c", size = 11814049, upload-time = "2025-09-29T23:27:15.384Z" }, + { url = "https://files.pythonhosted.org/packages/15/b2/0e62f78c0c5ba7e3d2c5945a82456f4fac76c480940f805e0b97fcbc2f65/pandas-2.3.3-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ee67acbbf05014ea6c763beb097e03cd629961c8a632075eeb34247120abcb4b", size = 12332638, upload-time = "2025-09-29T23:27:51.625Z" }, + { url = "https://files.pythonhosted.org/packages/c5/33/dd70400631b62b9b29c3c93d2feee1d0964dc2bae2e5ad7a6c73a7f25325/pandas-2.3.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c46467899aaa4da076d5abc11084634e2d197e9460643dd455ac3db5856b24d6", size = 12886834, upload-time = "2025-09-29T23:28:21.289Z" }, + { url = "https://files.pythonhosted.org/packages/d3/18/b5d48f55821228d0d2692b34fd5034bb185e854bdb592e9c640f6290e012/pandas-2.3.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:6253c72c6a1d990a410bc7de641d34053364ef8bcd3126f7e7450125887dffe3", size = 13409925, upload-time = "2025-09-29T23:28:58.261Z" }, + { url = "https://files.pythonhosted.org/packages/a6/3d/124ac75fcd0ecc09b8fdccb0246ef65e35b012030defb0e0eba2cbbbe948/pandas-2.3.3-cp314-cp314-win_amd64.whl", hash = "sha256:1b07204a219b3b7350abaae088f451860223a52cfb8a6c53358e7948735158e5", size = 11109071, upload-time = "2025-09-29T23:32:27.484Z" }, + { url = "https://files.pythonhosted.org/packages/89/9c/0e21c895c38a157e0faa1fb64587a9226d6dd46452cac4532d80c3c4a244/pandas-2.3.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:2462b1a365b6109d275250baaae7b760fd25c726aaca0054649286bcfbb3e8ec", size = 12048504, upload-time = "2025-09-29T23:29:31.47Z" }, + { url = "https://files.pythonhosted.org/packages/d7/82/b69a1c95df796858777b68fbe6a81d37443a33319761d7c652ce77797475/pandas-2.3.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:0242fe9a49aa8b4d78a4fa03acb397a58833ef6199e9aa40a95f027bb3a1b6e7", size = 11410702, upload-time = "2025-09-29T23:29:54.591Z" }, + { url = "https://files.pythonhosted.org/packages/f9/88/702bde3ba0a94b8c73a0181e05144b10f13f29ebfc2150c3a79062a8195d/pandas-2.3.3-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a21d830e78df0a515db2b3d2f5570610f5e6bd2e27749770e8bb7b524b89b450", size = 11634535, upload-time = "2025-09-29T23:30:21.003Z" }, + { url = "https://files.pythonhosted.org/packages/a4/1e/1bac1a839d12e6a82ec6cb40cda2edde64a2013a66963293696bbf31fbbb/pandas-2.3.3-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2e3ebdb170b5ef78f19bfb71b0dc5dc58775032361fa188e814959b74d726dd5", size = 12121582, upload-time = "2025-09-29T23:30:43.391Z" }, + { url = "https://files.pythonhosted.org/packages/44/91/483de934193e12a3b1d6ae7c8645d083ff88dec75f46e827562f1e4b4da6/pandas-2.3.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:d051c0e065b94b7a3cea50eb1ec32e912cd96dba41647eb24104b6c6c14c5788", size = 12699963, upload-time = "2025-09-29T23:31:10.009Z" }, + { url = "https://files.pythonhosted.org/packages/70/44/5191d2e4026f86a2a109053e194d3ba7a31a2d10a9c2348368c63ed4e85a/pandas-2.3.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:3869faf4bd07b3b66a9f462417d0ca3a9df29a9f6abd5d0d0dbab15dac7abe87", size = 13202175, upload-time = "2025-09-29T23:31:59.173Z" }, +] + [[package]] name = "pillow" version = "9.5.0" @@ -564,12 +698,24 @@ wheels = [ ] [[package]] -name = "python-dotenv" -version = "1.2.2" +name = "python-dateutil" +version = "2.9.0.post0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/82/ed/0301aeeac3e5353ef3d94b6ec08bbcabd04a72018415dcb29e588514bba8/python_dotenv-1.2.2.tar.gz", hash = "sha256:2c371a91fbd7ba082c2c1dc1f8bf89ca22564a087c2c287cd9b662adde799cf3", size = 50135, upload-time = "2026-03-01T16:00:26.196Z" } +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/0b/d7/1959b9648791274998a9c3526f6d0ec8fd2233e4d4acce81bbae76b44b2a/python_dotenv-1.2.2-py3-none-any.whl", hash = "sha256:1d8214789a24de455a8b8bd8ae6fe3c6b69a5e3d64aa8a8e5d68e694bbcb285a", size = 22101, upload-time = "2026-03-01T16:00:25.09Z" }, + { 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 = "python-dotenv" +version = "1.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f0/26/19cadc79a718c5edbec86fd4919a6b6d3f681039a2f6d66d14be94e75fb9/python_dotenv-1.2.1.tar.gz", hash = "sha256:42667e897e16ab0d66954af0e60a9caa94f0fd4ecf3aaf6d2d260eec1aa36ad6", size = 44221, upload-time = "2025-10-26T15:12:10.434Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/14/1b/a298b06749107c305e1fe0f814c6c74aea7b2f1e10989cb30f544a1b3253/python_dotenv-1.2.1-py3-none-any.whl", hash = "sha256:b81ee9561e9ca4004139c6cbba3a238c32b03e4894671e181b671e8cb8425d61", size = 21230, upload-time = "2025-10-26T15:12:09.109Z" }, ] [[package]] @@ -589,11 +735,14 @@ dependencies = [ { name = "brother-ql" }, { name = "fastapi", extra = ["standard"] }, { name = "jinja2" }, + { name = "pandas" }, { name = "pillow" }, { name = "pyasn1" }, { name = "pysnmp" }, + { name = "python-dotenv" }, { name = "python-telegram-bot" }, { name = "qrcode", extra = ["pil"] }, + { name = "requests" }, { name = "setuptools" }, ] @@ -601,12 +750,16 @@ dependencies = [ requires-dist = [ { name = "brother-ql", git = "https://github.com/hbrylkowski/brother_ql?rev=4225d13d209e8e4a2c17e87a75f42809e0da8fda" }, { name = "fastapi", extras = ["standard"], specifier = ">=0.114.0" }, + { name = "jinja2", specifier = "==3.1.6" }, { name = "jinja2", specifier = ">=3.1.2,<4" }, + { name = "pandas", specifier = "==2.3.3" }, { name = "pillow", specifier = ">=9.5.0,<10" }, { name = "pyasn1", specifier = "==0.4.8,<0.5" }, { name = "pysnmp", specifier = ">=4.4.12,<5" }, + { name = "python-dotenv", specifier = "==1.2.1" }, { name = "python-telegram-bot", specifier = ">=20.3,<21" }, { name = "qrcode", extras = ["pil"] }, + { name = "requests", specifier = "==2.32.5" }, { name = "setuptools", specifier = "<81" }, ] @@ -622,6 +775,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/6f/8e/4e4ed06986557fce0c41c3dfc60c5495b1095cf8a552bdc4c56e96aefdac/python_telegram_bot-20.8-py3-none-any.whl", hash = "sha256:a98ddf2f237d6584b03a2f8b20553e1b5e02c8d3a1ea8e17fd06cc955af78c14", size = 604866, upload-time = "2024-02-08T17:39:12.202Z" }, ] +[[package]] +name = "pytz" +version = "2026.1.post1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/56/db/b8721d71d945e6a8ac63c0fc900b2067181dbb50805958d4d4661cf7d277/pytz-2026.1.post1.tar.gz", hash = "sha256:3378dde6a0c3d26719182142c56e60c7f9af7e968076f31aae569d72a0358ee1", size = 321088, upload-time = "2026-03-03T07:47:50.683Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/10/99/781fe0c827be2742bcc775efefccb3b048a3a9c6ce9aec0cbf4a101677e5/pytz-2026.1.post1-py2.py3-none-any.whl", hash = "sha256:f2fd16142fda348286a75e1a524be810bb05d444e5a081f37f7affc635035f7a", size = 510489, upload-time = "2026-03-03T07:47:49.167Z" }, +] + [[package]] name = "pyusb" version = "1.3.1" @@ -763,6 +925,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755, upload-time = "2023-10-24T04:13:38.866Z" }, ] +[[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 = "sniffio" version = "1.3.1" @@ -808,6 +979,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614, upload-time = "2025-08-25T13:49:24.86Z" }, ] +[[package]] +name = "tzdata" +version = "2025.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5e/a7/c202b344c5ca7daf398f3b8a477eeb205cf3b6f32e7ec3a6bac0629ca975/tzdata-2025.3.tar.gz", hash = "sha256:de39c2ca5dc7b0344f2eba86f49d614019d29f060fc4ebc8a417896a620b56a7", size = 196772, upload-time = "2025-12-13T17:45:35.667Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c7/b0/003792df09decd6849a5e39c28b513c06e84436a54440380862b5aeff25d/tzdata-2025.3-py2.py3-none-any.whl", hash = "sha256:06a47e5700f3081aab02b2e513160914ff0694bce9947d6b76ebd6bf57cfc5d1", size = 348521, upload-time = "2025-12-13T17:45:33.889Z" }, +] + [[package]] name = "urllib3" version = "2.6.3"