From 3834e4811d2a293156795488481e69290bc823a5 Mon Sep 17 00:00:00 2001 From: dmitriylaukhin Date: Fri, 26 Jun 2026 12:30:00 +0500 Subject: [PATCH] =?UTF-8?q?chore:=20=D0=BA=D0=B0=D1=80=D0=BA=D0=B0=D1=81?= =?UTF-8?q?=20=D0=BF=D1=80=D0=BE=D0=B5=D0=BA=D1=82=D0=B0=20=E2=80=94=20?= =?UTF-8?q?=D0=BA=D0=BE=D0=BD=D1=82=D1=80=D0=B0=D0=BA=D1=82=D1=8B,=20?= =?UTF-8?q?=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BE=D1=87=D0=BD=D0=B8=D0=BA=20?= =?UTF-8?q?=D1=83=D1=81=D0=BB=D1=83=D0=B3,=20=D1=81=D0=B8=D0=BD=D1=82?= =?UTF-8?q?=D0=B5=D1=82=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0=B8=D0=B5=20=D1=84?= =?UTF-8?q?=D0=B8=D0=BA=D1=81=D1=82=D1=83=D1=80=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env.example | 11 + .gitignore | 29 + README.md | 58 ++ contracts/models.py | 84 ++ contracts/service_canon.json | 415 ++++++++ db/migrations/001_init.sql | 78 ++ etl/dictionary.py | 95 ++ fixtures/README.md | 25 + fixtures/normalized/golden.json | 782 +++++++++++++++ fixtures/raw/clinic_alpha_clean.xlsx | Bin 0 -> 5188 bytes fixtures/raw/clinic_beta_dirty.xlsx | Bin 0 -> 5569 bytes fixtures/raw/clinic_delta_messy.txt | 11 + fixtures/raw/clinic_epsilon_scan.png | Bin 0 -> 51113 bytes fixtures/raw/clinic_gamma.csv | 9 + fixtures/raw/clinic_zeta_prices.pdf | Bin 0 -> 41354 bytes pyproject.toml | 36 + scripts/gen_fixtures.py | 457 +++++++++ uv.lock | 1319 ++++++++++++++++++++++++++ 18 files changed, 3409 insertions(+) create mode 100644 .env.example create mode 100644 .gitignore create mode 100644 README.md create mode 100644 contracts/models.py create mode 100644 contracts/service_canon.json create mode 100644 db/migrations/001_init.sql create mode 100644 etl/dictionary.py create mode 100644 fixtures/README.md create mode 100644 fixtures/normalized/golden.json create mode 100644 fixtures/raw/clinic_alpha_clean.xlsx create mode 100644 fixtures/raw/clinic_beta_dirty.xlsx create mode 100644 fixtures/raw/clinic_delta_messy.txt create mode 100644 fixtures/raw/clinic_epsilon_scan.png create mode 100644 fixtures/raw/clinic_gamma.csv create mode 100644 fixtures/raw/clinic_zeta_prices.pdf create mode 100644 pyproject.toml create mode 100644 scripts/gen_fixtures.py create mode 100644 uv.lock diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..59ec151 --- /dev/null +++ b/.env.example @@ -0,0 +1,11 @@ +# Скопируй в .env и заполни значения. Файл .env в .gitignore — в публичный +# репозиторий секреты не попадают. + +# Пароль базы данных PostgreSQL +DB_PASSWORD= + +# Строка подключения к базе (для локального запуска API вне Docker) +DATABASE_URL=postgresql://medarchive:CHANGE_ME@localhost:5432/medarchive + +# Ключ Gemini для распознавания сложных страниц (Vision). Получить заранее. +GEMINI_API_KEY= diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..81e244b --- /dev/null +++ b/.gitignore @@ -0,0 +1,29 @@ +# Python +__pycache__/ +*.py[cod] +.venv/ +venv/ +.env +.env.* +!.env.example + +# Node / Next.js +node_modules/ +.next/ +out/ +dist/ +*.log + +# Claude Code worktrees (изоляция агентов) +.claude/worktrees/ + +# Вендоренные ассеты reveal.js (тянутся скриптом fetch-reveal.sh) +pitch/deck/reveal/ + +# OS +.DS_Store +Thumbs.db + +# Данные клиник: реальный архив и справочник в публичный репозиторий не коммитим +data/ +*.sqlite diff --git a/README.md b/README.md new file mode 100644 index 0000000..c164c1d --- /dev/null +++ b/README.md @@ -0,0 +1,58 @@ +# MedArchive — обработка архива прайсов клиник-партнёров + +Terricon Valley · Medtech Hackathon (26–28.06.2026). + +**Живой демо: https://med.secondbrain.tools** + +Система автоматически разбирает архив разнородных прайс-листов клиник (PDF, сканы, DOCX, +XLSX/XLS), извлекает услуги и цены, нормализует их к справочнику из 1281 услуги и даёт поиск +и сравнение «кто оказывает услугу и по какой цене». + +## Результат на тестовом архиве (8 клиник, 10 файлов) + +- **8 871 позиция** извлечена: 6 клиник из 8 — нативными парсерами, трудные PDF (битый + текстовый слой, нестандартная вёрстка) — через Gemini Vision. +- **73,9% позиций нормализованы автоматически** (цель ТЗ — не ниже 70%). +- Остальное уходит в очередь ручной разметки, как и предполагает ТЗ. + +Полный отчёт о качестве — `docs/quality_report.json`. + +## Стек и решения + +| Слой | Решение | +|---|---| +| Извлечение | Python: pdfplumber + PyMuPDF, openpyxl/xlrd, python-docx. Таблицы из PDF без линий восстанавливаются по координатам слов | +| Vision-добор | Gemini (`gemini-2.5-flash`) — для сканов и битого текстового слоя | +| Нормализация | Каскад: код тарификатора → точное совпадение → эмбеддинги Gemini → нечёткое сравнение → очередь `unmatched` | +| Валидация | Правила ТЗ §4.4: положительность цены, резидент ≥ нерезидент, аномалии, версионирование | +| Хранилище | SQLite (MVP, разворачивается без Docker). Боевая схема PostgreSQL + pgvector — в `db/migrations` | +| API | FastAPI: 7 эндпоинтов ТЗ + `/stats`, OpenAPI на `/docs` | +| Фронт | Одностраничный (Tailwind): поиск услуги и сравнение цен по клиникам | +| Деплой | Контейнер API за Caddy на Selectel KZ | + +## Запуск локально + +```bash +python -m venv .venv && .venv/bin/pip install -e . +# архив прайсов → data/raw/, справочник → data/reference/dictionary.xlsx +GEMINI_API_KEY=... python scripts/run_pipeline.py # → data/medarchive.db + отчёт +uvicorn api.main:app # → http://localhost:8000/docs +# открыть web/index.html?api=http://localhost:8000 +``` + +Эмбеддинги и Vision вызываются через Gemini API, поэтому локальная модель не нужна и контейнер +остаётся лёгким. Поиск и сравнение в готовой базе работают без обращений к API. + +## Структура + +``` +contracts/ — общие модели данных (контракт между модулями) +db/ — схема PostgreSQL + pgvector +etl/ — извлечение, нормализация, валидация, конвейер +api/ — REST API поиска и сравнения +web/ — одностраничный фронт +infra/ — деплой (compose, Caddyfile) +docs/ — отчёт о качестве, план +pitch/ — презентация и демо-сценарий +scripts/ — запуск конвейера и проверки +``` diff --git a/contracts/models.py b/contracts/models.py new file mode 100644 index 0000000..f048c25 --- /dev/null +++ b/contracts/models.py @@ -0,0 +1,84 @@ +"""Общие модели данных — контракт между агентами (Pydantic v2). + +`RawRow` и `ParsedDocument` — выход любого парсера (граница агентов B → C). +`MatchResult` — выход сопоставления (агент C). `*Out`-модели — выдача API (агент D), +её же потребляет фронт (агент E). Любая правка этих типов проходит через оркестратора. +""" + +from __future__ import annotations + +from datetime import date + +from pydantic import BaseModel, Field + +# Карта тарифов: ключ — тип цены, значение — сумма в KZT. +# Возможные ключи: resident, nonresident, cis, far, insurance, partner. +PriceTiers = dict[str, float] + + +class RawRow(BaseModel): + """Одна сырая строка прайса — единый выход любого парсера.""" + + service_name_raw: str + service_code_source: str | None = None + prices: PriceTiers = Field(default_factory=dict) + unit: str | None = None + section: str | None = None # заголовок секции — контекст специальности + + +class ParsedDocument(BaseModel): + """Результат разбора одного файла прайса.""" + + file_name: str + file_format: str # pdf / scan_pdf / docx / xlsx / xls + partner_name: str | None = None + city: str | None = None + effective_date: date | None = None + rows: list[RawRow] = Field(default_factory=list) + raw_content: str = "" + parse_log: list[str] = Field(default_factory=list) + + +class MatchResult(BaseModel): + """Результат сопоставления строки со справочником.""" + + service_id: str | None = None + method: str | None = None # code / exact / embedding / fuzzy / manual + confidence: float = 0.0 + # Лучший кандидат для очереди верификации, даже если ниже порога автосопоставления. + suggested_service_id: str | None = None + suggested_score: float = 0.0 + + +# --- выдача API --- +class ServiceOut(BaseModel): + service_id: str + specialty: str + name_ru: str + tarificator_code: str | None = None + + +class PartnerOut(BaseModel): + partner_id: str + name: str + city: str | None = None + is_active: bool = True + + +class PriceOut(BaseModel): + partner_id: str + partner_name: str + price_resident_kzt: float | None = None + price_nonresident_kzt: float | None = None + prices: PriceTiers = Field(default_factory=dict) + effective_date: date | None = None + + +class Stats(BaseModel): + """Сводка для дашборда и отчёта о качестве.""" + + documents_total: int = 0 + documents_done: int = 0 + items_total: int = 0 + auto_matched_pct: float = 0.0 + unmatched_total: int = 0 diff --git a/contracts/service_canon.json b/contracts/service_canon.json new file mode 100644 index 0000000..ea5be75 --- /dev/null +++ b/contracts/service_canon.json @@ -0,0 +1,415 @@ +[ + { + "canon_id": "cbc", + "canonical_ru": "Общий анализ крови", + "canonical_kz": "Қанның жалпы анализі", + "canonical_en": "Complete blood count (CBC)", + "category": "Лаборатория", + "code": "B03.016.003", + "unit": "1 иссл.", + "synonyms": [ + { + "text": "ОАК", + "lang": "ru" + }, + { + "text": "Общий анализ крови (развернутый)", + "lang": "ru" + }, + { + "text": "Клинический анализ крови", + "lang": "ru" + }, + { + "text": "КАК", + "lang": "ru" + }, + { + "text": "CBC", + "lang": "en" + }, + { + "text": "Қанның жалпы талдауы", + "lang": "kz" + } + ] + }, + { + "canon_id": "uzi_abd", + "canonical_ru": "УЗИ органов брюшной полости", + "canonical_kz": "Құрсақ қуысы ағзаларының УДЗ", + "canonical_en": "Abdominal ultrasound", + "category": "Диагностика/УЗИ", + "code": "A04.16.001", + "unit": "1 иссл.", + "synonyms": [ + { + "text": "УЗИ ОБП", + "lang": "ru" + }, + { + "text": "УЗИ брюшной полости", + "lang": "ru" + }, + { + "text": "Ультразвуковое исследование брюшной полости", + "lang": "ru" + }, + { + "text": "Құрсақ қуысы УДЗ", + "lang": "kz" + }, + { + "text": "Abdominal US", + "lang": "en" + } + ] + }, + { + "canon_id": "therapist", + "canonical_ru": "Приём врача-терапевта", + "canonical_kz": "Терапевт дәрігердің қабылдауы", + "canonical_en": "General practitioner consultation", + "category": "Приём специалистов", + "code": "B01.047.001", + "unit": "1 приём", + "synonyms": [ + { + "text": "Прием терапевта", + "lang": "ru" + }, + { + "text": "Консультация терапевта первичная", + "lang": "ru" + }, + { + "text": "Терапевт қабылдауы", + "lang": "kz" + }, + { + "text": "GP visit", + "lang": "en" + } + ] + }, + { + "canon_id": "ecg", + "canonical_ru": "Электрокардиография (ЭКГ)", + "canonical_kz": "Электрокардиография (ЭКГ)", + "canonical_en": "Electrocardiography (ECG)", + "category": "Диагностика", + "code": "A05.10.006", + "unit": "1 иссл.", + "synonyms": [ + { + "text": "ЭКГ", + "lang": "ru" + }, + { + "text": "ЭКГ с расшифровкой", + "lang": "ru" + }, + { + "text": "Электрокардиография", + "lang": "ru" + }, + { + "text": "ECG", + "lang": "en" + }, + { + "text": "ЭКГ + описание", + "lang": "ru" + } + ] + }, + { + "canon_id": "glucose", + "canonical_ru": "Глюкоза крови", + "canonical_kz": "Қандағы глюкоза", + "canonical_en": "Blood glucose", + "category": "Лаборатория", + "code": "B03.016.006", + "unit": "1 иссл.", + "synonyms": [ + { + "text": "Глюкоза", + "lang": "ru" + }, + { + "text": "Сахар крови", + "lang": "ru" + }, + { + "text": "Қандағы глюкоза", + "lang": "kz" + }, + { + "text": "Glucose", + "lang": "en" + } + ] + }, + { + "canon_id": "cardiologist", + "canonical_ru": "Консультация кардиолога", + "canonical_kz": "Кардиолог кеңесі", + "canonical_en": "Cardiologist consultation", + "category": "Приём специалистов", + "code": "B01.015.001", + "unit": "1 приём", + "synonyms": [ + { + "text": "Прием кардиолога", + "lang": "ru" + }, + { + "text": "Кардиолог консультация первичная", + "lang": "ru" + }, + { + "text": "Кардиолог қабылдауы", + "lang": "kz" + } + ] + }, + { + "canon_id": "mri_brain", + "canonical_ru": "МРТ головного мозга", + "canonical_kz": "Бас миының МРТ", + "canonical_en": "Brain MRI", + "category": "Диагностика/МРТ", + "code": "A05.23.009", + "unit": "1 иссл.", + "synonyms": [ + { + "text": "МРТ г/м", + "lang": "ru" + }, + { + "text": "Магнитно-резонансная томография головного мозга", + "lang": "ru" + }, + { + "text": "Бас миы МРТ", + "lang": "kz" + }, + { + "text": "Brain MRI", + "lang": "en" + } + ] + }, + { + "canon_id": "biochem", + "canonical_ru": "Биохимический анализ крови", + "canonical_kz": "Қанның биохимиялық анализі", + "canonical_en": "Blood chemistry panel", + "category": "Лаборатория", + "code": "B03.016.004", + "unit": "1 иссл.", + "synonyms": [ + { + "text": "Биохимия крови", + "lang": "ru" + }, + { + "text": "Б/х крови", + "lang": "ru" + }, + { + "text": "Биохимический анализ крови (базовый)", + "lang": "ru" + }, + { + "text": "Қан биохимиясы", + "lang": "kz" + } + ] + }, + { + "canon_id": "tooth_ext", + "canonical_ru": "Удаление зуба", + "canonical_kz": "Тісті жұлу", + "canonical_en": "Tooth extraction", + "category": "Стоматология", + "code": "A16.07.001", + "unit": "1 зуб", + "synonyms": [ + { + "text": "Удаление зуба простое", + "lang": "ru" + }, + { + "text": "Экстракция зуба", + "lang": "ru" + }, + { + "text": "Тіс жұлу", + "lang": "kz" + }, + { + "text": "Tooth removal", + "lang": "en" + } + ] + }, + { + "canon_id": "xray_chest", + "canonical_ru": "Рентген грудной клетки", + "canonical_kz": "Кеуде клеткасының рентгені", + "canonical_en": "Chest X-ray", + "category": "Диагностика", + "code": "A06.09.007", + "unit": "1 иссл.", + "synonyms": [ + { + "text": "Рентгенография ОГК", + "lang": "ru" + }, + { + "text": "Флюорография", + "lang": "ru" + }, + { + "text": "Кеуде рентгені", + "lang": "kz" + }, + { + "text": "Chest X-ray", + "lang": "en" + } + ] + }, + { + "canon_id": "tsh", + "canonical_ru": "Тиреотропный гормон (ТТГ)", + "canonical_kz": "Тиреотропты гормон (ТТГ)", + "canonical_en": "Thyroid-stimulating hormone (TSH)", + "category": "Лаборатория", + "code": "B03.016.021", + "unit": "1 иссл.", + "synonyms": [ + { + "text": "ТТГ", + "lang": "ru" + }, + { + "text": "Тиреотропный гормон", + "lang": "ru" + }, + { + "text": "TSH", + "lang": "en" + }, + { + "text": "ТТГ гормоны", + "lang": "kz" + } + ] + }, + { + "canon_id": "urinalysis", + "canonical_ru": "Общий анализ мочи", + "canonical_kz": "Зәрдің жалпы анализі", + "canonical_en": "Urinalysis", + "category": "Лаборатория", + "code": "B03.016.010", + "unit": "1 иссл.", + "synonyms": [ + { + "text": "ОАМ", + "lang": "ru" + }, + { + "text": "Общий анализ мочи", + "lang": "ru" + }, + { + "text": "Зәр анализі", + "lang": "kz" + }, + { + "text": "Urine test", + "lang": "en" + } + ] + }, + { + "canon_id": "gyn", + "canonical_ru": "Приём гинеколога", + "canonical_kz": "Гинеколог қабылдауы", + "canonical_en": "Gynecologist consultation", + "category": "Приём специалистов", + "code": "B01.001.001", + "unit": "1 приём", + "synonyms": [ + { + "text": "Прием гинеколога", + "lang": "ru" + }, + { + "text": "Консультация гинеколога первичная", + "lang": "ru" + }, + { + "text": "Гинеколог кеңесі", + "lang": "kz" + } + ] + }, + { + "canon_id": "covid_pcr", + "canonical_ru": "ПЦР на COVID-19", + "canonical_kz": "COVID-19 ПТР", + "canonical_en": "COVID-19 PCR test", + "category": "Лаборатория", + "code": "A26.08.027", + "unit": "1 иссл.", + "synonyms": [ + { + "text": "ПЦР COVID-19", + "lang": "ru" + }, + { + "text": "ПЦР-тест на коронавирус", + "lang": "ru" + }, + { + "text": "COVID PCR", + "lang": "en" + }, + { + "text": "COVID ПТР", + "lang": "kz" + } + ] + }, + { + "canon_id": "vit_d", + "canonical_ru": "Витамин D (25-OH)", + "canonical_kz": "D дәрумені (25-OH)", + "canonical_en": "Vitamin D (25-OH)", + "category": "Лаборатория", + "code": "B03.016.115", + "unit": "1 иссл.", + "synonyms": [ + { + "text": "25-OH витамин D", + "lang": "ru" + }, + { + "text": "Витамин Д", + "lang": "ru" + }, + { + "text": "Vitamin D", + "lang": "en" + }, + { + "text": "D витамині", + "lang": "kz" + } + ] + } +] \ No newline at end of file diff --git a/db/migrations/001_init.sql b/db/migrations/001_init.sql new file mode 100644 index 0000000..4e6e72f --- /dev/null +++ b/db/migrations/001_init.sql @@ -0,0 +1,78 @@ +-- Схема MedArchive. Четыре сущности из ТЗ §3, адаптированные под реальные данные: +-- многотарифные цены (резидент/нерезидент/СНГ/…) хранятся в prices (jsonb), +-- а два главных тарифа продублированы отдельными колонками под ТЗ и API. + +CREATE EXTENSION IF NOT EXISTS vector; -- pgvector для семантического сопоставления +CREATE EXTENSION IF NOT EXISTS pg_trgm; -- триграммы для нечёткого поиска + +-- Эталонный справочник услуг (1281 позиция, загружается из xlsx). +CREATE TABLE service ( + service_id text PRIMARY KEY, -- «-» из справочника + specialty text NOT NULL DEFAULT '', -- специальность = категория + сужение поиска + name_ru text NOT NULL, + name_norm text NOT NULL, -- нормализованная форма для точного совпадения + tarificator_code text, -- код тарификатора, если задан + synonyms jsonb NOT NULL DEFAULT '[]'::jsonb, -- наращиваем при ручной верификации + embedding vector(384), -- эмбеддинг name_ru (multilingual) + is_active boolean NOT NULL DEFAULT true +); +CREATE INDEX service_tarificator_idx ON service (tarificator_code) WHERE tarificator_code IS NOT NULL; +CREATE INDEX service_name_trgm_idx ON service USING gin (name_ru gin_trgm_ops); +CREATE INDEX service_embedding_idx ON service USING hnsw (embedding vector_cosine_ops); + +-- Клиника-партнёр. +CREATE TABLE partner ( + partner_id uuid PRIMARY KEY DEFAULT gen_random_uuid(), + name text NOT NULL, + city text, + address text, + bin varchar(12), -- БИН организации, для дедупликации + contact_email text, + contact_phone text, + is_active boolean NOT NULL DEFAULT true, + created_at timestamptz NOT NULL DEFAULT now(), + updated_at timestamptz NOT NULL DEFAULT now() +); +CREATE UNIQUE INDEX partner_bin_idx ON partner (bin) WHERE bin IS NOT NULL; + +-- Исходный прайс-документ (один файл = прайс одной клиники на дату). +CREATE TABLE price_document ( + doc_id uuid PRIMARY KEY DEFAULT gen_random_uuid(), + partner_id uuid NOT NULL REFERENCES partner(partner_id), + file_name text NOT NULL, + file_format text NOT NULL, -- pdf / scan_pdf / docx / xlsx / xls + effective_date date, -- дата вступления в силу (год из имени файла) + parsed_at timestamptz, + parse_status text NOT NULL DEFAULT 'pending', -- pending/processing/done/error/needs_review + parse_log text, + raw_content text -- сырой извлечённый текст для аудита +); + +-- Позиция прайса (услуга + цены). Это рабочая лошадка системы. +CREATE TABLE price_item ( + item_id uuid PRIMARY KEY DEFAULT gen_random_uuid(), + doc_id uuid NOT NULL REFERENCES price_document(doc_id), + partner_id uuid NOT NULL REFERENCES partner(partner_id), -- денормализация ради скорости + service_name_raw text NOT NULL, -- название как в документе + service_code_source text, -- код из источника (внутренний или тарификатора) + service_id text REFERENCES service(service_id), -- нормализованная услуга (nullable) + prices jsonb NOT NULL DEFAULT '{}'::jsonb, -- {resident, nonresident, cis, far, insurance, partner} + price_resident_kzt numeric, -- главный тариф, продублирован под ТЗ/API + price_nonresident_kzt numeric, + currency_original text NOT NULL DEFAULT 'KZT', + unit text, + effective_date date, + map_method text, -- code/exact/embedding/fuzzy/manual + map_confidence numeric, + is_verified boolean NOT NULL DEFAULT false, + verification_note text, + is_active boolean NOT NULL DEFAULT true, + created_at timestamptz NOT NULL DEFAULT now() +); +CREATE INDEX price_item_service_idx ON price_item (service_id); +CREATE INDEX price_item_partner_idx ON price_item (partner_id); +CREATE INDEX price_item_unmatched_idx ON price_item (service_id) WHERE service_id IS NULL; +CREATE INDEX price_item_raw_trgm_idx ON price_item USING gin (service_name_raw gin_trgm_ops); +-- Активная позиция уникальна по клинике, названию и дате прайса (версионирование — через is_active). +CREATE UNIQUE INDEX price_item_active_idx + ON price_item (partner_id, service_name_raw, effective_date) WHERE is_active; diff --git a/etl/dictionary.py b/etl/dictionary.py new file mode 100644 index 0000000..ba32cbd --- /dev/null +++ b/etl/dictionary.py @@ -0,0 +1,95 @@ +"""Загрузчик целевого справочника медицинских услуг. + +Справочник (`Справочник услуг.xlsx`) — это эталон, к которому нормализуются все +извлечённые из прайсов позиции. Колонки исходного файла: + + ID | Специальность | Code | Name_ru | TarificatrCode + +Синонимов в справочнике нет, поэтому автоматическое сопоставление опирается на +код тарификатора (точное совпадение) и на эмбеддинги названий. Этот модуль +отвечает только за загрузку и подготовку индексов; само сопоставление — в +`etl/normalize`. +""" + +from __future__ import annotations + +import re +from dataclasses import dataclass, field +from pathlib import Path + +from openpyxl import load_workbook + +# Код тарификатора в формате РК: буква + три группы цифр, например «A02.004.000». +TARIFICATOR_RE = re.compile(r"^[A-ZА-Я]\d{2}\.\d{3}\.\d{3}$") + +_WHITESPACE_RE = re.compile(r"\s+") + + +def normalize_name(text: str | None) -> str: + """Привести название услуги к форме для сравнения. + + Нижний регистр, унификация «ё»→«е», дефисы и кратные пробелы схлопываются в + один пробел. Исходное написание при этом нигде не теряется — нормализованная + форма используется только как ключ сопоставления. + """ + s = (text or "").strip().lower().replace("ё", "е") + s = s.replace("-", " ") + return _WHITESPACE_RE.sub(" ", s).strip() + + +@dataclass +class Service: + """Одна запись эталонного справочника услуг.""" + + service_id: str # стабильный идентификатор «-» + specialty: str # специальность — служит и категорией, и сужением поиска + name_ru: str # официальное название + tarificator_code: str | None # код тарификатора (если задан) + name_norm: str = field(default="") # нормализованная форма name_ru + + +def load_dictionary(path: str | Path) -> list[Service]: + """Загрузить справочник из xlsx и вернуть список услуг с нормализованными именами. + + Заголовки ищутся по именам колонок, а не по позиции, — так загрузчик переживёт + перестановку столбцов. Строки с пустым названием пропускаются. + """ + workbook = load_workbook(path, read_only=True, data_only=True) + sheet = workbook.active + rows = sheet.iter_rows(values_only=True) + + header = [str(c).strip() if c is not None else "" for c in next(rows)] + col = {name: header.index(name) for name in header if name} + name_idx = col.get("Name_ru") + if name_idx is None: + raise ValueError(f"В справочнике нет колонки Name_ru. Заголовки: {header}") + + services: list[Service] = [] + seen_ids: dict[str, int] = {} + for row in rows: + raw_name = row[name_idx] + if not raw_name or not str(raw_name).strip(): + continue + + tar_raw = row[col["TarificatrCode"]] if "TarificatrCode" in col else None + tar = str(tar_raw).strip() if tar_raw else None + if tar and not TARIFICATOR_RE.match(tar): + tar = None # отбрасываем мусорные коды, оставляем только валидный формат + + # «-» иногда повторяется в справочнике — гарантируем уникальность. + sid = f"{row[col['ID']]}-{row[col['Code']]}" + repeat = seen_ids.get(sid, 0) + seen_ids[sid] = repeat + 1 + if repeat: + sid = f"{sid}#{repeat}" + + service = Service( + service_id=sid, + specialty=str(row[col["Специальность"]]).strip() if row[col["Специальность"]] else "", + name_ru=str(raw_name).strip(), + tarificator_code=tar, + ) + service.name_norm = normalize_name(service.name_ru) + services.append(service) + + return services diff --git a/fixtures/README.md b/fixtures/README.md new file mode 100644 index 0000000..edea9f4 --- /dev/null +++ b/fixtures/README.md @@ -0,0 +1,25 @@ +# Fixtures — синтетические прайсы клиник + +Сгенерированы скриптом `scripts/gen_fixtures.py` (seed=42, детерминированно) для отладки pipeline **до** выдачи реальных данных от организатора. Намеренно разнородные и «грязные». + +## `raw/` — входные прайсы (6 форматов) + +| Файл | Формат | Особенности (что тестирует) | +|---|---|---| +| `clinic_alpha_clean.xlsx` | Excel | Чистая таблица — быстрый путь pandas, без LLM | +| `clinic_beta_dirty.xlsx` | Excel | Секции-заголовки, «от 12000», KZ-названия, лишние колонки | +| `clinic_gamma.csv` | CSV (`;`) | Смешанные RU/KZ, единицы измерения | +| `clinic_delta_messy.txt` | Текст | Прайс абзацем, разные разделители и валюты (тг/тенге/₸/KZT) | +| `clinic_epsilon_scan.png` | Картинка | Имитация фото/скана (наклон) → путь LLM-vision / OCR | +| `clinic_zeta_prices.pdf` | PDF | Текстовый PDF, RU/EN заголовок | + +Одни и те же услуги названы по-разному между файлами (ОАК / Общий анализ крови / Қанның жалпы анализі) — это материал для канонизации и дедупликации. + +## `normalized/golden.json` — эталон нормализации (52 строки) + +Оракул для TDD ETL: для каждой строки из `raw/` указан `canon_id`, `canonical_ru/kz/en`, `category`, `code`, `price`, `currency`, `unit`, `source_file`. Сгенерирован тем же скриптом, что и raw → гарантированно согласован. + +Справочник канонов: `../contracts/service_canon.json` (15 услуг, синонимы с lang-тегами). + +## TODO (Фаза 0 хакатона) +- `api/*.json` — эталонные ответы API (для MSW-моков фронта) diff --git a/fixtures/normalized/golden.json b/fixtures/normalized/golden.json new file mode 100644 index 0000000..4e6f46d --- /dev/null +++ b/fixtures/normalized/golden.json @@ -0,0 +1,782 @@ +[ + { + "source_file": "clinic_alpha_clean.xlsx", + "clinic": "Клиника «Аль-Шифа»", + "raw_name": "Тиреотропный гормон (ТТГ)", + "lang": "ru", + "canon_id": "tsh", + "canonical_ru": "Тиреотропный гормон (ТТГ)", + "canonical_kz": "Тиреотропты гормон (ТТГ)", + "canonical_en": "Thyroid-stimulating hormone (TSH)", + "category": "Лаборатория", + "code": "B03.016.021", + "price": 3600, + "currency": "KZT", + "unit": "1 иссл." + }, + { + "source_file": "clinic_alpha_clean.xlsx", + "clinic": "Клиника «Аль-Шифа»", + "raw_name": "Abdominal US", + "lang": "en", + "canon_id": "uzi_abd", + "canonical_ru": "УЗИ органов брюшной полости", + "canonical_kz": "Құрсақ қуысы ағзаларының УДЗ", + "canonical_en": "Abdominal ultrasound", + "category": "Диагностика/УЗИ", + "code": "A04.16.001", + "price": 12900, + "currency": "KZT", + "unit": "1 иссл." + }, + { + "source_file": "clinic_alpha_clean.xlsx", + "clinic": "Клиника «Аль-Шифа»", + "raw_name": "Общий анализ крови", + "lang": "ru", + "canon_id": "cbc", + "canonical_ru": "Общий анализ крови", + "canonical_kz": "Қанның жалпы анализі", + "canonical_en": "Complete blood count (CBC)", + "category": "Лаборатория", + "code": "B03.016.003", + "price": 3900, + "currency": "KZT", + "unit": "1 иссл." + }, + { + "source_file": "clinic_alpha_clean.xlsx", + "clinic": "Клиника «Аль-Шифа»", + "raw_name": "Общий анализ мочи", + "lang": "ru", + "canon_id": "urinalysis", + "canonical_ru": "Общий анализ мочи", + "canonical_kz": "Зәрдің жалпы анализі", + "canonical_en": "Urinalysis", + "category": "Лаборатория", + "code": "B03.016.010", + "price": 900, + "currency": "KZT", + "unit": "1 иссл." + }, + { + "source_file": "clinic_alpha_clean.xlsx", + "clinic": "Клиника «Аль-Шифа»", + "raw_name": "Глюкоза крови", + "lang": "ru", + "canon_id": "glucose", + "canonical_ru": "Глюкоза крови", + "canonical_kz": "Қандағы глюкоза", + "canonical_en": "Blood glucose", + "category": "Лаборатория", + "code": "B03.016.006", + "price": 1100, + "currency": "KZT", + "unit": "1 иссл." + }, + { + "source_file": "clinic_alpha_clean.xlsx", + "clinic": "Клиника «Аль-Шифа»", + "raw_name": "ЭКГ", + "lang": "ru", + "canon_id": "ecg", + "canonical_ru": "Электрокардиография (ЭКГ)", + "canonical_kz": "Электрокардиография (ЭКГ)", + "canonical_en": "Electrocardiography (ECG)", + "category": "Диагностика", + "code": "A05.10.006", + "price": 3600, + "currency": "KZT", + "unit": "1 иссл." + }, + { + "source_file": "clinic_alpha_clean.xlsx", + "clinic": "Клиника «Аль-Шифа»", + "raw_name": "Chest X-ray", + "lang": "en", + "canon_id": "xray_chest", + "canonical_ru": "Рентген грудной клетки", + "canonical_kz": "Кеуде клеткасының рентгені", + "canonical_en": "Chest X-ray", + "category": "Диагностика", + "code": "A06.09.007", + "price": 2600, + "currency": "KZT", + "unit": "1 иссл." + }, + { + "source_file": "clinic_alpha_clean.xlsx", + "clinic": "Клиника «Аль-Шифа»", + "raw_name": "GP visit", + "lang": "en", + "canon_id": "therapist", + "canonical_ru": "Приём врача-терапевта", + "canonical_kz": "Терапевт дәрігердің қабылдауы", + "canonical_en": "General practitioner consultation", + "category": "Приём специалистов", + "code": "B01.047.001", + "price": 5200, + "currency": "KZT", + "unit": "1 приём" + }, + { + "source_file": "clinic_alpha_clean.xlsx", + "clinic": "Клиника «Аль-Шифа»", + "raw_name": "Кардиолог қабылдауы", + "lang": "kz", + "canon_id": "cardiologist", + "canonical_ru": "Консультация кардиолога", + "canonical_kz": "Кардиолог кеңесі", + "canonical_en": "Cardiologist consultation", + "category": "Приём специалистов", + "code": "B01.015.001", + "price": 7800, + "currency": "KZT", + "unit": "1 приём" + }, + { + "source_file": "clinic_beta_dirty.xlsx", + "clinic": "Медцентр «Сункар»", + "raw_name": "Биохимия крови", + "lang": "ru", + "canon_id": "biochem", + "canonical_ru": "Биохимический анализ крови", + "canonical_kz": "Қанның биохимиялық анализі", + "canonical_en": "Blood chemistry panel", + "category": "Лаборатория", + "code": "B03.016.004", + "price": 8300, + "currency": "KZT", + "unit": "1 иссл." + }, + { + "source_file": "clinic_beta_dirty.xlsx", + "clinic": "Медцентр «Сункар»", + "raw_name": "Флюорография", + "lang": "ru", + "canon_id": "xray_chest", + "canonical_ru": "Рентген грудной клетки", + "canonical_kz": "Кеуде клеткасының рентгені", + "canonical_en": "Chest X-ray", + "category": "Диагностика", + "code": "A06.09.007", + "price": 3100, + "currency": "KZT", + "unit": "1 иссл." + }, + { + "source_file": "clinic_beta_dirty.xlsx", + "clinic": "Медцентр «Сункар»", + "raw_name": "Глюкоза крови", + "lang": "ru", + "canon_id": "glucose", + "canonical_ru": "Глюкоза крови", + "canonical_kz": "Қандағы глюкоза", + "canonical_en": "Blood glucose", + "category": "Лаборатория", + "code": "B03.016.006", + "price": 1400, + "currency": "KZT", + "unit": "1 иссл." + }, + { + "source_file": "clinic_beta_dirty.xlsx", + "clinic": "Медцентр «Сункар»", + "raw_name": "Общий анализ крови", + "lang": "ru", + "canon_id": "cbc", + "canonical_ru": "Общий анализ крови", + "canonical_kz": "Қанның жалпы анализі", + "canonical_en": "Complete blood count (CBC)", + "category": "Лаборатория", + "code": "B03.016.003", + "price": 3400, + "currency": "KZT", + "unit": "1 иссл." + }, + { + "source_file": "clinic_beta_dirty.xlsx", + "clinic": "Медцентр «Сункар»", + "raw_name": "Консультация терапевта первичная", + "lang": "ru", + "canon_id": "therapist", + "canonical_ru": "Приём врача-терапевта", + "canonical_kz": "Терапевт дәрігердің қабылдауы", + "canonical_en": "General practitioner consultation", + "category": "Приём специалистов", + "code": "B01.047.001", + "price": 7800, + "currency": "KZT", + "unit": "1 приём" + }, + { + "source_file": "clinic_beta_dirty.xlsx", + "clinic": "Медцентр «Сункар»", + "raw_name": "Магнитно-резонансная томография головного мозга", + "lang": "ru", + "canon_id": "mri_brain", + "canonical_ru": "МРТ головного мозга", + "canonical_kz": "Бас миының МРТ", + "canonical_en": "Brain MRI", + "category": "Диагностика/МРТ", + "code": "A05.23.009", + "price": 19100, + "currency": "KZT", + "unit": "1 иссл." + }, + { + "source_file": "clinic_beta_dirty.xlsx", + "clinic": "Медцентр «Сункар»", + "raw_name": "Кардиолог қабылдауы", + "lang": "kz", + "canon_id": "cardiologist", + "canonical_ru": "Консультация кардиолога", + "canonical_kz": "Кардиолог кеңесі", + "canonical_en": "Cardiologist consultation", + "category": "Приём специалистов", + "code": "B01.015.001", + "price": 11800, + "currency": "KZT", + "unit": "1 приём" + }, + { + "source_file": "clinic_beta_dirty.xlsx", + "clinic": "Медцентр «Сункар»", + "raw_name": "Приём гинеколога", + "lang": "ru", + "canon_id": "gyn", + "canonical_ru": "Приём гинеколога", + "canonical_kz": "Гинеколог қабылдауы", + "canonical_en": "Gynecologist consultation", + "category": "Приём специалистов", + "code": "B01.001.001", + "price": 10900, + "currency": "KZT", + "unit": "1 приём" + }, + { + "source_file": "clinic_beta_dirty.xlsx", + "clinic": "Медцентр «Сункар»", + "raw_name": "Ультразвуковое исследование брюшной полости", + "lang": "ru", + "canon_id": "uzi_abd", + "canonical_ru": "УЗИ органов брюшной полости", + "canonical_kz": "Құрсақ қуысы ағзаларының УДЗ", + "canonical_en": "Abdominal ultrasound", + "category": "Диагностика/УЗИ", + "code": "A04.16.001", + "price": 7000, + "currency": "KZT", + "unit": "1 иссл." + }, + { + "source_file": "clinic_gamma.csv", + "clinic": "Diagnostic Lab Astana", + "raw_name": "УЗИ ОБП", + "lang": "ru", + "canon_id": "uzi_abd", + "canonical_ru": "УЗИ органов брюшной полости", + "canonical_kz": "Құрсақ қуысы ағзаларының УДЗ", + "canonical_en": "Abdominal ultrasound", + "category": "Диагностика/УЗИ", + "code": "A04.16.001", + "price": 10700, + "currency": "KZT", + "unit": "1 иссл." + }, + { + "source_file": "clinic_gamma.csv", + "clinic": "Diagnostic Lab Astana", + "raw_name": "ПЦР-тест на коронавирус", + "lang": "ru", + "canon_id": "covid_pcr", + "canonical_ru": "ПЦР на COVID-19", + "canonical_kz": "COVID-19 ПТР", + "canonical_en": "COVID-19 PCR test", + "category": "Лаборатория", + "code": "A26.08.027", + "price": 9600, + "currency": "KZT", + "unit": "1 иссл." + }, + { + "source_file": "clinic_gamma.csv", + "clinic": "Diagnostic Lab Astana", + "raw_name": "ЭКГ + описание", + "lang": "ru", + "canon_id": "ecg", + "canonical_ru": "Электрокардиография (ЭКГ)", + "canonical_kz": "Электрокардиография (ЭКГ)", + "canonical_en": "Electrocardiography (ECG)", + "category": "Диагностика", + "code": "A05.10.006", + "price": 2800, + "currency": "KZT", + "unit": "1 иссл." + }, + { + "source_file": "clinic_gamma.csv", + "clinic": "Diagnostic Lab Astana", + "raw_name": "Витамин D (25-OH)", + "lang": "ru", + "canon_id": "vit_d", + "canonical_ru": "Витамин D (25-OH)", + "canonical_kz": "D дәрумені (25-OH)", + "canonical_en": "Vitamin D (25-OH)", + "category": "Лаборатория", + "code": "B03.016.115", + "price": 9800, + "currency": "KZT", + "unit": "1 иссл." + }, + { + "source_file": "clinic_gamma.csv", + "clinic": "Diagnostic Lab Astana", + "raw_name": "МРТ г/м", + "lang": "ru", + "canon_id": "mri_brain", + "canonical_ru": "МРТ головного мозга", + "canonical_kz": "Бас миының МРТ", + "canonical_en": "Brain MRI", + "category": "Диагностика/МРТ", + "code": "A05.23.009", + "price": 31600, + "currency": "KZT", + "unit": "1 иссл." + }, + { + "source_file": "clinic_gamma.csv", + "clinic": "Diagnostic Lab Astana", + "raw_name": "Глюкоза", + "lang": "ru", + "canon_id": "glucose", + "canonical_ru": "Глюкоза крови", + "canonical_kz": "Қандағы глюкоза", + "canonical_en": "Blood glucose", + "category": "Лаборатория", + "code": "B03.016.006", + "price": 1000, + "currency": "KZT", + "unit": "1 иссл." + }, + { + "source_file": "clinic_gamma.csv", + "clinic": "Diagnostic Lab Astana", + "raw_name": "Биохимический анализ крови (базовый)", + "lang": "ru", + "canon_id": "biochem", + "canonical_ru": "Биохимический анализ крови", + "canonical_kz": "Қанның биохимиялық анализі", + "canonical_en": "Blood chemistry panel", + "category": "Лаборатория", + "code": "B03.016.004", + "price": 5900, + "currency": "KZT", + "unit": "1 иссл." + }, + { + "source_file": "clinic_gamma.csv", + "clinic": "Diagnostic Lab Astana", + "raw_name": "Кардиолог консультация первичная", + "lang": "ru", + "canon_id": "cardiologist", + "canonical_ru": "Консультация кардиолога", + "canonical_kz": "Кардиолог кеңесі", + "canonical_en": "Cardiologist consultation", + "category": "Приём специалистов", + "code": "B01.015.001", + "price": 7800, + "currency": "KZT", + "unit": "1 приём" + }, + { + "source_file": "clinic_delta_messy.txt", + "clinic": "Медцентр «Тенгри»", + "raw_name": "TSH", + "lang": "en", + "canon_id": "tsh", + "canonical_ru": "Тиреотропный гормон (ТТГ)", + "canonical_kz": "Тиреотропты гормон (ТТГ)", + "canonical_en": "Thyroid-stimulating hormone (TSH)", + "category": "Лаборатория", + "code": "B03.016.021", + "price": 2300, + "currency": "KZT", + "unit": "1 иссл." + }, + { + "source_file": "clinic_delta_messy.txt", + "clinic": "Медцентр «Тенгри»", + "raw_name": "Консультация кардиолога", + "lang": "ru", + "canon_id": "cardiologist", + "canonical_ru": "Консультация кардиолога", + "canonical_kz": "Кардиолог кеңесі", + "canonical_en": "Cardiologist consultation", + "category": "Приём специалистов", + "code": "B01.015.001", + "price": 7700, + "currency": "KZT", + "unit": "1 приём" + }, + { + "source_file": "clinic_delta_messy.txt", + "clinic": "Медцентр «Тенгри»", + "raw_name": "Консультация гинеколога первичная", + "lang": "ru", + "canon_id": "gyn", + "canonical_ru": "Приём гинеколога", + "canonical_kz": "Гинеколог қабылдауы", + "canonical_en": "Gynecologist consultation", + "category": "Приём специалистов", + "code": "B01.001.001", + "price": 6300, + "currency": "KZT", + "unit": "1 приём" + }, + { + "source_file": "clinic_delta_messy.txt", + "clinic": "Медцентр «Тенгри»", + "raw_name": "CBC", + "lang": "en", + "canon_id": "cbc", + "canonical_ru": "Общий анализ крови", + "canonical_kz": "Қанның жалпы анализі", + "canonical_en": "Complete blood count (CBC)", + "category": "Лаборатория", + "code": "B03.016.003", + "price": 4300, + "currency": "KZT", + "unit": "1 иссл." + }, + { + "source_file": "clinic_delta_messy.txt", + "clinic": "Медцентр «Тенгри»", + "raw_name": "Электрокардиография", + "lang": "ru", + "canon_id": "ecg", + "canonical_ru": "Электрокардиография (ЭКГ)", + "canonical_kz": "Электрокардиография (ЭКГ)", + "canonical_en": "Electrocardiography (ECG)", + "category": "Диагностика", + "code": "A05.10.006", + "price": 4800, + "currency": "KZT", + "unit": "1 иссл." + }, + { + "source_file": "clinic_delta_messy.txt", + "clinic": "Медцентр «Тенгри»", + "raw_name": "Зәр анализі", + "lang": "kz", + "canon_id": "urinalysis", + "canonical_ru": "Общий анализ мочи", + "canonical_kz": "Зәрдің жалпы анализі", + "canonical_en": "Urinalysis", + "category": "Лаборатория", + "code": "B03.016.010", + "price": 1300, + "currency": "KZT", + "unit": "1 иссл." + }, + { + "source_file": "clinic_delta_messy.txt", + "clinic": "Медцентр «Тенгри»", + "raw_name": "ПЦР-тест на коронавирус", + "lang": "ru", + "canon_id": "covid_pcr", + "canonical_ru": "ПЦР на COVID-19", + "canonical_kz": "COVID-19 ПТР", + "canonical_en": "COVID-19 PCR test", + "category": "Лаборатория", + "code": "A26.08.027", + "price": 8700, + "currency": "KZT", + "unit": "1 иссл." + }, + { + "source_file": "clinic_epsilon_scan.png", + "clinic": "Клиника «Береке»", + "raw_name": "Рентген грудной клетки", + "lang": "ru", + "canon_id": "xray_chest", + "canonical_ru": "Рентген грудной клетки", + "canonical_kz": "Кеуде клеткасының рентгені", + "canonical_en": "Chest X-ray", + "category": "Диагностика", + "code": "A06.09.007", + "price": 3200, + "currency": "KZT", + "unit": "1 иссл." + }, + { + "source_file": "clinic_epsilon_scan.png", + "clinic": "Клиника «Береке»", + "raw_name": "Abdominal US", + "lang": "en", + "canon_id": "uzi_abd", + "canonical_ru": "УЗИ органов брюшной полости", + "canonical_kz": "Құрсақ қуысы ағзаларының УДЗ", + "canonical_en": "Abdominal ultrasound", + "category": "Диагностика/УЗИ", + "code": "A04.16.001", + "price": 12800, + "currency": "KZT", + "unit": "1 иссл." + }, + { + "source_file": "clinic_epsilon_scan.png", + "clinic": "Клиника «Береке»", + "raw_name": "Магнитно-резонансная томография головного мозга", + "lang": "ru", + "canon_id": "mri_brain", + "canonical_ru": "МРТ головного мозга", + "canonical_kz": "Бас миының МРТ", + "canonical_en": "Brain MRI", + "category": "Диагностика/МРТ", + "code": "A05.23.009", + "price": 34400, + "currency": "KZT", + "unit": "1 иссл." + }, + { + "source_file": "clinic_epsilon_scan.png", + "clinic": "Клиника «Береке»", + "raw_name": "Консультация гинеколога первичная", + "lang": "ru", + "canon_id": "gyn", + "canonical_ru": "Приём гинеколога", + "canonical_kz": "Гинеколог қабылдауы", + "canonical_en": "Gynecologist consultation", + "category": "Приём специалистов", + "code": "B01.001.001", + "price": 5700, + "currency": "KZT", + "unit": "1 приём" + }, + { + "source_file": "clinic_epsilon_scan.png", + "clinic": "Клиника «Береке»", + "raw_name": "Витамин Д", + "lang": "ru", + "canon_id": "vit_d", + "canonical_ru": "Витамин D (25-OH)", + "canonical_kz": "D дәрумені (25-OH)", + "canonical_en": "Vitamin D (25-OH)", + "category": "Лаборатория", + "code": "B03.016.115", + "price": 8700, + "currency": "KZT", + "unit": "1 иссл." + }, + { + "source_file": "clinic_epsilon_scan.png", + "clinic": "Клиника «Береке»", + "raw_name": "Биохимия крови", + "lang": "ru", + "canon_id": "biochem", + "canonical_ru": "Биохимический анализ крови", + "canonical_kz": "Қанның биохимиялық анализі", + "canonical_en": "Blood chemistry panel", + "category": "Лаборатория", + "code": "B03.016.004", + "price": 6400, + "currency": "KZT", + "unit": "1 иссл." + }, + { + "source_file": "clinic_epsilon_scan.png", + "clinic": "Клиника «Береке»", + "raw_name": "Удаление зуба", + "lang": "ru", + "canon_id": "tooth_ext", + "canonical_ru": "Удаление зуба", + "canonical_kz": "Тісті жұлу", + "canonical_en": "Tooth extraction", + "category": "Стоматология", + "code": "A16.07.001", + "price": 9300, + "currency": "KZT", + "unit": "1 зуб" + }, + { + "source_file": "clinic_epsilon_scan.png", + "clinic": "Клиника «Береке»", + "raw_name": "Glucose", + "lang": "en", + "canon_id": "glucose", + "canonical_ru": "Глюкоза крови", + "canonical_kz": "Қандағы глюкоза", + "canonical_en": "Blood glucose", + "category": "Лаборатория", + "code": "B03.016.006", + "price": 2000, + "currency": "KZT", + "unit": "1 иссл." + }, + { + "source_file": "clinic_epsilon_scan.png", + "clinic": "Клиника «Береке»", + "raw_name": "ТТГ", + "lang": "ru", + "canon_id": "tsh", + "canonical_ru": "Тиреотропный гормон (ТТГ)", + "canonical_kz": "Тиреотропты гормон (ТТГ)", + "canonical_en": "Thyroid-stimulating hormone (TSH)", + "category": "Лаборатория", + "code": "B03.016.021", + "price": 3100, + "currency": "KZT", + "unit": "1 иссл." + }, + { + "source_file": "clinic_zeta_prices.pdf", + "clinic": "Diagnostic Lab Astana", + "raw_name": "D витамині", + "lang": "kz", + "canon_id": "vit_d", + "canonical_ru": "Витамин D (25-OH)", + "canonical_kz": "D дәрумені (25-OH)", + "canonical_en": "Vitamin D (25-OH)", + "category": "Лаборатория", + "code": "B03.016.115", + "price": 10900, + "currency": "KZT", + "unit": "1 иссл." + }, + { + "source_file": "clinic_zeta_prices.pdf", + "clinic": "Diagnostic Lab Astana", + "raw_name": "Құрсақ қуысы УДЗ", + "lang": "kz", + "canon_id": "uzi_abd", + "canonical_ru": "УЗИ органов брюшной полости", + "canonical_kz": "Құрсақ қуысы ағзаларының УДЗ", + "canonical_en": "Abdominal ultrasound", + "category": "Диагностика/УЗИ", + "code": "A04.16.001", + "price": 6000, + "currency": "KZT", + "unit": "1 иссл." + }, + { + "source_file": "clinic_zeta_prices.pdf", + "clinic": "Diagnostic Lab Astana", + "raw_name": "ТТГ гормоны", + "lang": "kz", + "canon_id": "tsh", + "canonical_ru": "Тиреотропный гормон (ТТГ)", + "canonical_kz": "Тиреотропты гормон (ТТГ)", + "canonical_en": "Thyroid-stimulating hormone (TSH)", + "category": "Лаборатория", + "code": "B03.016.021", + "price": 2500, + "currency": "KZT", + "unit": "1 иссл." + }, + { + "source_file": "clinic_zeta_prices.pdf", + "clinic": "Diagnostic Lab Astana", + "raw_name": "Қандағы глюкоза", + "lang": "kz", + "canon_id": "glucose", + "canonical_ru": "Глюкоза крови", + "canonical_kz": "Қандағы глюкоза", + "canonical_en": "Blood glucose", + "category": "Лаборатория", + "code": "B03.016.006", + "price": 800, + "currency": "KZT", + "unit": "1 иссл." + }, + { + "source_file": "clinic_zeta_prices.pdf", + "clinic": "Diagnostic Lab Astana", + "raw_name": "Приём гинеколога", + "lang": "ru", + "canon_id": "gyn", + "canonical_ru": "Приём гинеколога", + "canonical_kz": "Гинеколог қабылдауы", + "canonical_en": "Gynecologist consultation", + "category": "Приём специалистов", + "code": "B01.001.001", + "price": 10900, + "currency": "KZT", + "unit": "1 приём" + }, + { + "source_file": "clinic_zeta_prices.pdf", + "clinic": "Diagnostic Lab Astana", + "raw_name": "Экстракция зуба", + "lang": "ru", + "canon_id": "tooth_ext", + "canonical_ru": "Удаление зуба", + "canonical_kz": "Тісті жұлу", + "canonical_en": "Tooth extraction", + "category": "Стоматология", + "code": "A16.07.001", + "price": 9900, + "currency": "KZT", + "unit": "1 зуб" + }, + { + "source_file": "clinic_zeta_prices.pdf", + "clinic": "Diagnostic Lab Astana", + "raw_name": "ЭКГ", + "lang": "ru", + "canon_id": "ecg", + "canonical_ru": "Электрокардиография (ЭКГ)", + "canonical_kz": "Электрокардиография (ЭКГ)", + "canonical_en": "Electrocardiography (ECG)", + "category": "Диагностика", + "code": "A05.10.006", + "price": 2100, + "currency": "KZT", + "unit": "1 иссл." + }, + { + "source_file": "clinic_zeta_prices.pdf", + "clinic": "Diagnostic Lab Astana", + "raw_name": "Прием терапевта", + "lang": "ru", + "canon_id": "therapist", + "canonical_ru": "Приём врача-терапевта", + "canonical_kz": "Терапевт дәрігердің қабылдауы", + "canonical_en": "General practitioner consultation", + "category": "Приём специалистов", + "code": "B01.047.001", + "price": 7600, + "currency": "KZT", + "unit": "1 приём" + }, + { + "source_file": "clinic_zeta_prices.pdf", + "clinic": "Diagnostic Lab Astana", + "raw_name": "Биохимический анализ крови", + "lang": "ru", + "canon_id": "biochem", + "canonical_ru": "Биохимический анализ крови", + "canonical_kz": "Қанның биохимиялық анализі", + "canonical_en": "Blood chemistry panel", + "category": "Лаборатория", + "code": "B03.016.004", + "price": 4000, + "currency": "KZT", + "unit": "1 иссл." + }, + { + "source_file": "clinic_zeta_prices.pdf", + "clinic": "Diagnostic Lab Astana", + "raw_name": "COVID PCR", + "lang": "en", + "canon_id": "covid_pcr", + "canonical_ru": "ПЦР на COVID-19", + "canonical_kz": "COVID-19 ПТР", + "canonical_en": "COVID-19 PCR test", + "category": "Лаборатория", + "code": "A26.08.027", + "price": 7800, + "currency": "KZT", + "unit": "1 иссл." + } +] \ No newline at end of file diff --git a/fixtures/raw/clinic_alpha_clean.xlsx b/fixtures/raw/clinic_alpha_clean.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..b21d4e4ac718422fd9ac236a6d64a4815cb3baad GIT binary patch literal 5188 zcmZ`-1yodP*B-iKXh}(>Te=-UKm|M#7<&N=I>b)J3Rz1Oq%e%`I8je|=A000O9j1JQl>fLuWlQD0Dn2Qo~ z*}L26dAWN)g&%r&2>H9Z+(q9d=@22sUue7U+wdZawUGR_LR9t}w2)7DJ+CY5bbAw5 z$t@tDhbdnul7pu{4YVt?>?$tSO{P4-d8*jomlu_{{HQ{7E-a>sk)n`|6{j=bbuu(u zlvH})b3^6&xR5%;2c4qoS1qg0)A`v%LbmD#Tj?w_G39C?w_-H4woEEN-et5wKdnLb zmp=D%d%QM+W_rCpT;Oc&qxp(idOsEb0Q|QLcJ5x_pFR}Dx9fI_kixCOU*GzqM-qc9 zh14>YRc)yv%$NPmZ;z=*>bEqM2$~Z-Vd_4pSRE)lp43nO9)0-O z@c2%-Ne<*OZBGS?DC%C=ttsvRQ}=D(?=MnRjhbG1nQnHKQ>o7NH1r-8T=E@c`8@hg zu>{I>K0b6mrT#N8FDx=SDe(b-%o_jzH6}3rF2ddpU{~<3yXeo*Y?_%vr=@8^wvogB zkRw+T)UB}kT571H?@a9r*rqO9IM4*)5?~(>d)%gRi?Tn3Y%}3*bA~*w!1~z`NMm(P zI$(cG$aW1Lk+kP;GbKDT(b6FNX~9^G3#cM;tpvIAj<`t2s?N+2&?z0 z<~v6PW3+@~WOA}uCPThKM_rpaF@4kC60VF3OS}Hk_5GvK9?ZB4`YqWVSqCm{g(^g~ z1&+h^ACIOh;)`D+4DOA651!x1aL6P^nBN<7_M01vjYO3X`;)cq-h0+r5s4}t_TF&h zxp7h9T)0l>psK#K5lBT_x1v0D9bn?&J25bdlVZht>XXDc#nLjTVzFbgB@+q!fqIWS z;W&CNMMB*xD-MqwAk{UZqZfo!sgGLdNEo${yCbve}Y>PCSRME$5UZPTo}=@^~Xaw0p*B{_xoiH#urAS!Rf85c=pS zzKB~4y?sKwp(_tzGfJtnM5C9pW4t(9=8jB)kM3!>aZbK^SHm%xq|OD(=@D#R21?i6 zArqrkBFuuPIq5ND7ZQo4fnY}!k&3V#P?G7bOqx)lRML}V@h?#&zaCK z&=Hq2f+F>iqX%zh3sOyJu~Hf4C0PRM^XAYzCfj{t0G9`(b@dfc9abb)YiTVx4z*13E*{V!#>jsBf$&)L{rkjoO z=F98IJa0t-^ohLnYV9D2xLSjk_SgEP);b<(t%Iro4_(%NQaOlx0!zJLE{o*Zk)`i4 zXOW0Os#+tXYAcRwbJnb^baq;N6Y<#nIQPzz_4odapJk?Sn}XAfT~|MjjGV2u>sJB62}?7@;5s)XuirISj{7nlj%n18(!NjNs`dvg=m+L| zm90(+wY0kEAExC!Iix^cIua^PyCnKzt^ECK2Cb|7ce)-(w}Hg#sZtrI|JRa1aDl;V}2lE{hY?Oytt|yH7!aS5Nfhdn)jFV{4-EGqxgsDG8qK1yUGXU z6{VSRGKV8F3Fde_E72GAw+fbZiREX1Y?D=Xbj2=iMz>-8*+7^~k0(>H0e~<}6Jhw( zK>XajoS_b2us2lr@5kR=BsqD|ZA_W6+Zwz=t*Iw>Xa9jr$~1=}x#ojX?8&>;k;Zjz zAHKc2hNvfi@p<-^6Ot=YyTg?Rpl!Ai7b16;czJd!Q=ZFpu}lS3WMrcPv+=vOm_KMy-#tA8Ih4eqd2m zj?G#ndFS({NTC-b9M5*VT5F=*F6(=6vaAc5Wms{>#t9mVN1 zw%Dl-nZQO(iiN^sA-a7qEC?OFe~07%01aS@>{b zuiH{gW#d|{+mn!RH3oX%*UNEfM9i=VrBN^)|K8WULOD>HI=R6u+w^P2j_>46In`L9 z54s$_Fnp+v)c4v_54V%8P)l2=3+l{Hvx5vg)Cvjd;*mi;-=mtN&b&qtUenR*_)_Y} zu+1t@D(fKn)wlhdJXjkK(`xj(c@ifJwx;!L<6`&f^|WB?qutiHiGet++eCR{YR{*? zA(t+&|0MG$-mdz644E~E0RXaJWQKYNxPYNQbl{A^2Afhk?$Tcg^V2X}-xDa^emRx)8?% zSEKTg$zgc}R$B^h_8YM#U49;rE68FXDXxUU8rCzUX-B>K!6V<`%9nAWAEa zjAi=*JhKd}b=Kf)0S1VQxyg2&H;etT#x`%l>ld*p?Lm~vxE*GC`1T;yvO}e#x~^al zC7*>NJSDBJtE}e{;e$nZ9ia4p-l0ig|IN*XBcl&?*Jx)u^K;oW32CVaCi0ygx9n5n zh=|^LoJQu~muQD$p3R{Daj$EL8uutp8cc)_nBX9nr;*m@!XD4p$0?I9fx?LwofWZ? zxnT~P?FV#t(=VU6d06dm_w85XQidt3XRAe6eIz36yUtG8w|~qYysywdG~e{?bkcL5 z=}+=CXlz8i!;p>+LqHPD)7lH{0u>hedCyAFcEc7WRYp>Qt#w{?VT+c1tW=92X^dPg zc+nMa*L84&`1tO+15o=iJ6jM*A(89L44o-*L5Xx(Oc_a*1FD^QZL&S{P530Wl?C%8 z;)V}DQVM+8=k5{gbem|avKpp}I@r63kzDY>M?77y${USTtTL1aA%l+Y(GzuqeSt3P| zqmv*a9{0)uGaVnUt7$pcvbpqfj&!u`W zMnO$O=doCZy&VI+r`5MVHqVC-t2240<*A0;1)UjP=Rn{~Zslr% zI5><)j#31+dMXX0XA|zfV(@;-ZGt*~{)X^Y4)}{%IQWQ0ti(3S-zIXxvt?wjNU8~| zZPtfuOp*^@E|F9!C7p5b_4{Ln-8->IG{K0N@wljq?nT$jrc2p31Z-A0^jSBKDidM8 zF(Edq?}0Nl#5YHjJ+~hUkp@-I=13-`NXWM_Se)V_?i*V@67l1TW`kaUOXmL!xA?|V zb2%o=XPA&P{tEXmYW+Ltf77fkUV;3n2x&NyY6ZaXay$>aSg4GaKH|vFSft@W92R`O9!#RUu2M(n z$UNW9cCET6R!3iu{E~gTcwJJlJmk6bE`>-?8QV)WdtSa3^JR+;m!n(lW(harif(RL zoL1`=hW1kdh4CGq*Q_T#4lGi7W;wfQ+$4$CXe?)6IN111@~4v-a8(!+#=%LPU;9{d zHFq~}u$#BFVSoo1YWb5_<%#H@TYQvt(N`ZQacK|b4WStRZ|_K8U6uu3a%|nb-Jj1? zYvopvC2JR;j=n?Bxl0@Da0g@|3Pu5HG;HC@A3_sN;Dp(nKAO5zm&I8T_v^d}K8G{~ zQS$j?-@`j(JPE7|GusjbqgmVwh+6xoO$KU8M5`bVnqo#6xg(c8FC0>6?SgJLdG)lT zZd-V$W=GaUupjU*8XgCRCdI&A_^ID&c01D$S?Ifi`@V93ZQn2F#)Ua!07c%#_M-`8Q6lOdS;V3OQVApJu&`-x{`bTO!HxEh-^$=B^lByl4TWG-#lPzMRp8ai_#3E4{?E$)Qzx&2ujcu0 va2uw|Vix>Avi_=_tEu$cP9bLc_g@lAPa6*-{s90Y%&CZ}={r9sY=Hj*zJmox literal 0 HcmV?d00001 diff --git a/fixtures/raw/clinic_beta_dirty.xlsx b/fixtures/raw/clinic_beta_dirty.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..b6c06a72947602e8383cff22b75cd18904765c41 GIT binary patch literal 5569 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 R01#nrSxhB&`laFl{sZ;&v$_BP literal 0 HcmV?d00001 diff --git a/fixtures/raw/clinic_delta_messy.txt b/fixtures/raw/clinic_delta_messy.txt new file mode 100644 index 0000000..6c2b505 --- /dev/null +++ b/fixtures/raw/clinic_delta_messy.txt @@ -0,0 +1,11 @@ +МЕДЦЕНТР «ТЕНГРИ» — действующие цены + +TSH ... 2300 ₸ (1 иссл.) +Консультация кардиолога 7700 KZT (1 приём) +Консультация гинеколога первичная: 6300 тенге (1 приём) +CBC ... 4300 KZT (1 иссл.) +Электрокардиография — 4800 тг (1 иссл.) +Зәр анализі — 1300 тенге (1 иссл.) +ПЦР-тест на коронавирус ... 8700 KZT (1 иссл.) + +* Цены справочные, уточняйте в регистратуре. Бағалар анықтамалық. diff --git a/fixtures/raw/clinic_epsilon_scan.png b/fixtures/raw/clinic_epsilon_scan.png new file mode 100644 index 0000000000000000000000000000000000000000..53ba6c4726c98a40b07aa4427d75d1892ce6a825 GIT binary patch literal 51113 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 OJ$L0*Zf7AMJoz`WkB0#O literal 0 HcmV?d00001 diff --git a/fixtures/raw/clinic_gamma.csv b/fixtures/raw/clinic_gamma.csv new file mode 100644 index 0000000..13605d3 --- /dev/null +++ b/fixtures/raw/clinic_gamma.csv @@ -0,0 +1,9 @@ +service;price_kzt;unit +УЗИ ОБП;10700;1 иссл. +ПЦР-тест на коронавирус;9600;1 иссл. +ЭКГ + описание;2800;1 иссл. +Витамин D (25-OH);9800;1 иссл. +МРТ г/м;31600;1 иссл. +Глюкоза;1000;1 иссл. +Биохимический анализ крови (базовый);5900;1 иссл. +Кардиолог консультация первичная;7800;1 приём diff --git a/fixtures/raw/clinic_zeta_prices.pdf b/fixtures/raw/clinic_zeta_prices.pdf new file mode 100644 index 0000000000000000000000000000000000000000..73565376f30780b9e92a6278d2683187dc9172bf GIT binary patch literal 41354 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 literal 0 HcmV?d00001 diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..ff5ffd2 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,36 @@ +[project] +name = "medarchive" +version = "0.1.0" +description = "Автоматическая обработка архива прайсов клиник-партнёров и база услуг с ценами" +requires-python = ">=3.12" +dependencies = [ + "fastapi>=0.115", + "uvicorn[standard]>=0.32", + "pydantic>=2.9", + "psycopg[binary]>=3.2", + "python-multipart>=0.0.12", # загрузка ZIP-архива + "openpyxl>=3.1", # xlsx + "xlrd>=2.0", # старый xls + "python-docx>=1.1", # docx (+ принятие правок) + "pdfplumber>=0.11", # PDF с текстовым слоем + "pymupdf>=1.24", # рендер страниц для Vision + "rapidfuzz>=3.10", # нечёткое сопоставление + "numpy>=2.0", # векторные операции при сопоставлении + "google-genai>=1.0", # Gemini Vision + эмбеддинги (API, без локального torch) +] + +[tool.ruff] +line-length = 100 +target-version = "py312" + +[tool.ruff.lint] +select = ["E", "F", "I", "UP", "B"] # стиль, ошибки, импорты, апгрейды, баги + +[tool.ruff.lint.flake8-bugbear] +# Вызовы-маркеры FastAPI в значениях по умолчанию — идиома фреймворка, не баг B008. +extend-immutable-calls = ["fastapi.File", "fastapi.Query", "fastapi.Depends"] + +[tool.ruff.lint.per-file-ignores] +# Разведочные скрипты этапа разбора форматов — черновики, не часть продукта. +"scripts/proof/*" = ["E402", "E501", "E741", "B007"] +"scripts/gen_fixtures.py" = ["E402", "E501", "E741"] diff --git a/scripts/gen_fixtures.py b/scripts/gen_fixtures.py new file mode 100644 index 0000000..d8bf684 --- /dev/null +++ b/scripts/gen_fixtures.py @@ -0,0 +1,457 @@ +#!/usr/bin/env python3 +"""Генератор синтетических прайсов клиник (RU/KZ/EN) + эталонная нормализация + справочник канонов. + +Выдаёт: + fixtures/raw/* — 6 форматов «сырых» прайсов (Excel/CSV/txt/PNG/PDF) + fixtures/normalized/golden.json — эталон: каждая строка → канон (оракул для TDD ETL) + contracts/service_canon.json — справочник канонических услуг (seed для нормализации) +Детерминированно (seed=42). +""" + +import csv +import json +import os +import random +import subprocess +import sys + +ROOT = sys.argv[1] if len(sys.argv) > 1 else "." +RAW = os.path.join(ROOT, "fixtures/raw") +NORM = os.path.join(ROOT, "fixtures/normalized") +CONTRACTS = os.path.join(ROOT, "contracts") +for d in (RAW, NORM, CONTRACTS): + os.makedirs(d, exist_ok=True) +random.seed(42) + + +def ensure(pkg, mod=None): + try: + __import__(mod or pkg) + except ImportError: + subprocess.check_call([sys.executable, "-m", "pip", "install", "-q", pkg]) + + +# Справочник канонических медуслуг. lang-тегированные синонимы — материал для нормализации. +CANONS = [ + { + "id": "cbc", + "ru": "Общий анализ крови", + "kz": "Қанның жалпы анализі", + "en": "Complete blood count (CBC)", + "category": "Лаборатория", + "code": "B03.016.003", + "unit": "1 иссл.", + "price": (1200, 4500), + "syn": [ + ("ОАК", "ru"), + ("Общий анализ крови (развернутый)", "ru"), + ("Клинический анализ крови", "ru"), + ("КАК", "ru"), + ("CBC", "en"), + ("Қанның жалпы талдауы", "kz"), + ], + }, + { + "id": "uzi_abd", + "ru": "УЗИ органов брюшной полости", + "kz": "Құрсақ қуысы ағзаларының УДЗ", + "en": "Abdominal ultrasound", + "category": "Диагностика/УЗИ", + "code": "A04.16.001", + "unit": "1 иссл.", + "price": (6000, 13000), + "syn": [ + ("УЗИ ОБП", "ru"), + ("УЗИ брюшной полости", "ru"), + ("Ультразвуковое исследование брюшной полости", "ru"), + ("Құрсақ қуысы УДЗ", "kz"), + ("Abdominal US", "en"), + ], + }, + { + "id": "therapist", + "ru": "Приём врача-терапевта", + "kz": "Терапевт дәрігердің қабылдауы", + "en": "General practitioner consultation", + "category": "Приём специалистов", + "code": "B01.047.001", + "unit": "1 приём", + "price": (4000, 9000), + "syn": [ + ("Прием терапевта", "ru"), + ("Консультация терапевта первичная", "ru"), + ("Терапевт қабылдауы", "kz"), + ("GP visit", "en"), + ], + }, + { + "id": "ecg", + "ru": "Электрокардиография (ЭКГ)", + "kz": "Электрокардиография (ЭКГ)", + "en": "Electrocardiography (ECG)", + "category": "Диагностика", + "code": "A05.10.006", + "unit": "1 иссл.", + "price": (2000, 5000), + "syn": [ + ("ЭКГ", "ru"), + ("ЭКГ с расшифровкой", "ru"), + ("Электрокардиография", "ru"), + ("ECG", "en"), + ("ЭКГ + описание", "ru"), + ], + }, + { + "id": "glucose", + "ru": "Глюкоза крови", + "kz": "Қандағы глюкоза", + "en": "Blood glucose", + "category": "Лаборатория", + "code": "B03.016.006", + "unit": "1 иссл.", + "price": (800, 2200), + "syn": [ + ("Глюкоза", "ru"), + ("Сахар крови", "ru"), + ("Қандағы глюкоза", "kz"), + ("Glucose", "en"), + ], + }, + { + "id": "cardiologist", + "ru": "Консультация кардиолога", + "kz": "Кардиолог кеңесі", + "en": "Cardiologist consultation", + "category": "Приём специалистов", + "code": "B01.015.001", + "unit": "1 приём", + "price": (5000, 12000), + "syn": [ + ("Прием кардиолога", "ru"), + ("Кардиолог консультация первичная", "ru"), + ("Кардиолог қабылдауы", "kz"), + ], + }, + { + "id": "mri_brain", + "ru": "МРТ головного мозга", + "kz": "Бас миының МРТ", + "en": "Brain MRI", + "category": "Диагностика/МРТ", + "code": "A05.23.009", + "unit": "1 иссл.", + "price": (18000, 35000), + "syn": [ + ("МРТ г/м", "ru"), + ("Магнитно-резонансная томография головного мозга", "ru"), + ("Бас миы МРТ", "kz"), + ("Brain MRI", "en"), + ], + }, + { + "id": "biochem", + "ru": "Биохимический анализ крови", + "kz": "Қанның биохимиялық анализі", + "en": "Blood chemistry panel", + "category": "Лаборатория", + "code": "B03.016.004", + "unit": "1 иссл.", + "price": (3500, 9000), + "syn": [ + ("Биохимия крови", "ru"), + ("Б/х крови", "ru"), + ("Биохимический анализ крови (базовый)", "ru"), + ("Қан биохимиясы", "kz"), + ], + }, + { + "id": "tooth_ext", + "ru": "Удаление зуба", + "kz": "Тісті жұлу", + "en": "Tooth extraction", + "category": "Стоматология", + "code": "A16.07.001", + "unit": "1 зуб", + "price": (6000, 15000), + "syn": [ + ("Удаление зуба простое", "ru"), + ("Экстракция зуба", "ru"), + ("Тіс жұлу", "kz"), + ("Tooth removal", "en"), + ], + }, + { + "id": "xray_chest", + "ru": "Рентген грудной клетки", + "kz": "Кеуде клеткасының рентгені", + "en": "Chest X-ray", + "category": "Диагностика", + "code": "A06.09.007", + "unit": "1 иссл.", + "price": (2500, 6000), + "syn": [ + ("Рентгенография ОГК", "ru"), + ("Флюорография", "ru"), + ("Кеуде рентгені", "kz"), + ("Chest X-ray", "en"), + ], + }, + { + "id": "tsh", + "ru": "Тиреотропный гормон (ТТГ)", + "kz": "Тиреотропты гормон (ТТГ)", + "en": "Thyroid-stimulating hormone (TSH)", + "category": "Лаборатория", + "code": "B03.016.021", + "unit": "1 иссл.", + "price": (1500, 4000), + "syn": [("ТТГ", "ru"), ("Тиреотропный гормон", "ru"), ("TSH", "en"), ("ТТГ гормоны", "kz")], + }, + { + "id": "urinalysis", + "ru": "Общий анализ мочи", + "kz": "Зәрдің жалпы анализі", + "en": "Urinalysis", + "category": "Лаборатория", + "code": "B03.016.010", + "unit": "1 иссл.", + "price": (900, 2500), + "syn": [ + ("ОАМ", "ru"), + ("Общий анализ мочи", "ru"), + ("Зәр анализі", "kz"), + ("Urine test", "en"), + ], + }, + { + "id": "gyn", + "ru": "Приём гинеколога", + "kz": "Гинеколог қабылдауы", + "en": "Gynecologist consultation", + "category": "Приём специалистов", + "code": "B01.001.001", + "unit": "1 приём", + "price": (5000, 11000), + "syn": [ + ("Прием гинеколога", "ru"), + ("Консультация гинеколога первичная", "ru"), + ("Гинеколог кеңесі", "kz"), + ], + }, + { + "id": "covid_pcr", + "ru": "ПЦР на COVID-19", + "kz": "COVID-19 ПТР", + "en": "COVID-19 PCR test", + "category": "Лаборатория", + "code": "A26.08.027", + "unit": "1 иссл.", + "price": (7000, 16000), + "syn": [ + ("ПЦР COVID-19", "ru"), + ("ПЦР-тест на коронавирус", "ru"), + ("COVID PCR", "en"), + ("COVID ПТР", "kz"), + ], + }, + { + "id": "vit_d", + "ru": "Витамин D (25-OH)", + "kz": "D дәрумені (25-OH)", + "en": "Vitamin D (25-OH)", + "category": "Лаборатория", + "code": "B03.016.115", + "unit": "1 иссл.", + "price": (6000, 12000), + "syn": [ + ("25-OH витамин D", "ru"), + ("Витамин Д", "ru"), + ("Vitamin D", "en"), + ("D витамині", "kz"), + ], + }, +] +CLINICS = [ + "Клиника «Аль-Шифа»", + "Медцентр «Сункар»", + "Diagnostic Lab Astana", + "Клиника «Береке»", + "Медцентр «Тенгри»", +] + + +def price(c): + return random.randint(c["price"][0] // 100, c["price"][1] // 100) * 100 + + +def variant(c): + return random.choice([(c["ru"], "ru")] + c["syn"]) + + +GOLDEN = [] + + +def build(file_name, clinic, n): + rows = [] + for c in random.sample(CANONS, k=min(n, len(CANONS))): + raw_name, lang = variant(c) + p = price(c) + rows.append({"raw_name": raw_name, "price": p, "unit": c["unit"]}) + GOLDEN.append( + { + "source_file": file_name, + "clinic": clinic, + "raw_name": raw_name, + "lang": lang, + "canon_id": c["id"], + "canonical_ru": c["ru"], + "canonical_kz": c["kz"], + "canonical_en": c["en"], + "category": c["category"], + "code": c["code"], + "price": p, + "currency": "KZT", + "unit": c["unit"], + } + ) + return rows + + +ensure("openpyxl") +from openpyxl import Workbook + +# 1) чистый Excel +rows = build("clinic_alpha_clean.xlsx", CLINICS[0], 9) +wb = Workbook() +ws = wb.active +ws.title = "Прайс" +ws.append(["Наименование услуги", "Цена, тг"]) +for r in rows: + ws.append([r["raw_name"], r["price"]]) +wb.save(f"{RAW}/clinic_alpha_clean.xlsx") + +# 2) грязный Excel +rows = build("clinic_beta_dirty.xlsx", CLINICS[1], 9) +wb = Workbook() +ws = wb.active +ws.title = "PRICE 2026" +ws.append(["Прайс-лист медцентра «Сункар» (с 01.06.2026)"]) +ws.append([]) +ws.append(["№", "Услуга / Қызмет", "Стоимость (тенге)", "Ед."]) +secs = ["— Лаборатория / Зертхана —", "— Диагностика —", "— Приём специалистов —"] +i = 1 +for k, r in enumerate(rows): + if k % 3 == 0 and secs: + ws.append([secs.pop(0), None, None, None]) + val = f"от {r['price']}" if random.random() < 0.3 else r["price"] + ws.append([i, r["raw_name"], val, r["unit"]]) + i += 1 +wb.save(f"{RAW}/clinic_beta_dirty.xlsx") + +# 3) CSV ; +rows = build("clinic_gamma.csv", CLINICS[2], 8) +with open(f"{RAW}/clinic_gamma.csv", "w", encoding="utf-8", newline="") as f: + w = csv.writer(f, delimiter=";") + w.writerow(["service", "price_kzt", "unit"]) + for r in rows: + w.writerow([r["raw_name"], r["price"], r["unit"]]) + +# 4) грязный текст +rows = build("clinic_delta_messy.txt", CLINICS[4], 7) +with open(f"{RAW}/clinic_delta_messy.txt", "w", encoding="utf-8") as f: + f.write("МЕДЦЕНТР «ТЕНГРИ» — действующие цены\n\n") + for r in rows: + sep = random.choice([" — ", " ... ", ": ", " "]) + cur = random.choice(["тг", "тенге", "₸", "KZT"]) + f.write(f"{r['raw_name']}{sep}{r['price']} {cur} ({r['unit']})\n") + f.write("\n* Цены справочные, уточняйте в регистратуре. Бағалар анықтамалық.\n") + +# 5) PNG-скан +rows = build("clinic_epsilon_scan.png", CLINICS[3], 9) +ensure("Pillow", "PIL") +from PIL import Image, ImageDraw, ImageFont + + +def font(sz): + for p in [ + "/System/Library/Fonts/Supplemental/Arial.ttf", + "/Library/Fonts/Arial.ttf", + "/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf", + ]: + if os.path.exists(p): + return ImageFont.truetype(p, sz) + return ImageFont.load_default() + + +img = Image.new("RGB", (900, 720), (250, 248, 244)) +d = ImageDraw.Draw(img) +d.text((40, 30), "Клиника «Береке» — прайс-лист", fill=(20, 20, 20), font=font(34)) +d.line((40, 85, 860, 85), fill=(180, 180, 180), width=2) +y = 110 +for r in rows: + d.text((50, y), r["raw_name"][:42], fill=(30, 30, 30), font=font(23)) + d.text((720, y), f"{r['price']} тг", fill=(30, 30, 30), font=font(23)) + y += 62 +img = img.rotate(-1.4, expand=False, fillcolor=(250, 248, 244)) +img.save(f"{RAW}/clinic_epsilon_scan.png") + +# 6) PDF +rows = build("clinic_zeta_prices.pdf", CLINICS[2], 10) +pdf = "skip" +try: + ensure("reportlab") + from reportlab.lib.pagesizes import A4 + from reportlab.pdfbase import pdfmetrics + from reportlab.pdfbase.ttfonts import TTFont + from reportlab.pdfgen import canvas + + fp = next( + ( + p + for p in [ + "/Library/Fonts/Arial.ttf", + "/System/Library/Fonts/Supplemental/Arial.ttf", + "/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf", + ] + if os.path.exists(p) + ), + None, + ) + if fp: + pdfmetrics.registerFont(TTFont("U", fp)) + c = canvas.Canvas(f"{RAW}/clinic_zeta_prices.pdf", pagesize=A4) + c.setFont("U", 18) + c.drawString(60, 790, "Diagnostic Lab Astana — Price list / Прайс") + c.setFont("U", 12) + y = 750 + for r in rows: + c.drawString(60, y, r["raw_name"][:55]) + c.drawRightString(540, y, f"{r['price']} KZT") + y -= 28 + c.save() + pdf = "ok" +except Exception as e: + pdf = f"skip ({e})" + +# эталон нормализации + справочник +with open(f"{NORM}/golden.json", "w", encoding="utf-8") as f: + json.dump(GOLDEN, f, ensure_ascii=False, indent=2) +canon_out = [ + { + "canon_id": c["id"], + "canonical_ru": c["ru"], + "canonical_kz": c["kz"], + "canonical_en": c["en"], + "category": c["category"], + "code": c["code"], + "unit": c["unit"], + "synonyms": [{"text": t, "lang": l} for t, l in c["syn"]], + } + for c in CANONS +] +with open(f"{CONTRACTS}/service_canon.json", "w", encoding="utf-8") as f: + json.dump(canon_out, f, ensure_ascii=False, indent=2) + +print("PDF:", pdf) +print("raw:", sorted(os.listdir(RAW))) +print("golden rows:", len(GOLDEN), "| canons:", len(CANONS)) diff --git a/uv.lock b/uv.lock new file mode 100644 index 0000000..6164ed8 --- /dev/null +++ b/uv.lock @@ -0,0 +1,1319 @@ +version = 1 +revision = 3 +requires-python = ">=3.12" + +[[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 = "annotated-types" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081, upload-time = "2024-05-20T21:33:25.928Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643, upload-time = "2024-05-20T21:33:24.1Z" }, +] + +[[package]] +name = "anyio" +version = "4.14.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/3b/72/5562aabb8dd7181e8e860622a38bea08d17842b99ecd4c91f84ac95251b0/anyio-4.14.1.tar.gz", hash = "sha256:8d648a3544c1a700e3ff78615cd679e4c5c3f149904287e73687b2596963629e", size = 254831, upload-time = "2026-06-24T20:56:06.017Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b0/7b/90df4a0a816d98d6ea26f559d87836d494a2cf1fcf063be67df50a7bcc30/anyio-4.14.1-py3-none-any.whl", hash = "sha256:4e5533c5b8ff0a24f5d7a176cbe6877129cd183893f66b537f8f227d10527d72", size = 124875, upload-time = "2026-06-24T20:56:04.413Z" }, +] + +[[package]] +name = "certifi" +version = "2026.6.17" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c9/c7/424b75da314c1045981bd9777432fad05a9e0c69daa4ed7e308bbaffe405/certifi-2026.6.17.tar.gz", hash = "sha256:024c88eeec92ca068db80f02b8b07c9cef7b9fe261d1d535abfd5abd6f6af432", size = 134594, upload-time = "2026-06-17T10:31:07.894Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ef/2f/c5464532e965badff2f4c4c1a3a83f5697f0d7c407ed0cda44aaa99bb451/certifi-2026.6.17-py3-none-any.whl", hash = "sha256:2227dcbaafe0d2f59279d1762ddddc37783ed4354594f194ffc31d20f41fc3db", size = 133289, upload-time = "2026-06-17T10:31:06.348Z" }, +] + +[[package]] +name = "cffi" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pycparser", marker = "implementation_name != 'PyPy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/eb/56/b1ba7935a17738ae8453301356628e8147c79dbb825bcbc73dc7401f9846/cffi-2.0.0.tar.gz", hash = "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529", size = 523588, upload-time = "2025-09-08T23:24:04.541Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ea/47/4f61023ea636104d4f16ab488e268b93008c3d0bb76893b1b31db1f96802/cffi-2.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6d02d6655b0e54f54c4ef0b94eb6be0607b70853c45ce98bd278dc7de718be5d", size = 185271, upload-time = "2025-09-08T23:22:44.795Z" }, + { url = "https://files.pythonhosted.org/packages/df/a2/781b623f57358e360d62cdd7a8c681f074a71d445418a776eef0aadb4ab4/cffi-2.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8eca2a813c1cb7ad4fb74d368c2ffbbb4789d377ee5bb8df98373c2cc0dee76c", size = 181048, upload-time = "2025-09-08T23:22:45.938Z" }, + { url = "https://files.pythonhosted.org/packages/ff/df/a4f0fbd47331ceeba3d37c2e51e9dfc9722498becbeec2bd8bc856c9538a/cffi-2.0.0-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:21d1152871b019407d8ac3985f6775c079416c282e431a4da6afe7aefd2bccbe", size = 212529, upload-time = "2025-09-08T23:22:47.349Z" }, + { url = "https://files.pythonhosted.org/packages/d5/72/12b5f8d3865bf0f87cf1404d8c374e7487dcf097a1c91c436e72e6badd83/cffi-2.0.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b21e08af67b8a103c71a250401c78d5e0893beff75e28c53c98f4de42f774062", size = 220097, upload-time = "2025-09-08T23:22:48.677Z" }, + { url = "https://files.pythonhosted.org/packages/c2/95/7a135d52a50dfa7c882ab0ac17e8dc11cec9d55d2c18dda414c051c5e69e/cffi-2.0.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:1e3a615586f05fc4065a8b22b8152f0c1b00cdbc60596d187c2a74f9e3036e4e", size = 207983, upload-time = "2025-09-08T23:22:50.06Z" }, + { url = "https://files.pythonhosted.org/packages/3a/c8/15cb9ada8895957ea171c62dc78ff3e99159ee7adb13c0123c001a2546c1/cffi-2.0.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:81afed14892743bbe14dacb9e36d9e0e504cd204e0b165062c488942b9718037", size = 206519, upload-time = "2025-09-08T23:22:51.364Z" }, + { url = "https://files.pythonhosted.org/packages/78/2d/7fa73dfa841b5ac06c7b8855cfc18622132e365f5b81d02230333ff26e9e/cffi-2.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3e17ed538242334bf70832644a32a7aae3d83b57567f9fd60a26257e992b79ba", size = 219572, upload-time = "2025-09-08T23:22:52.902Z" }, + { url = "https://files.pythonhosted.org/packages/07/e0/267e57e387b4ca276b90f0434ff88b2c2241ad72b16d31836adddfd6031b/cffi-2.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3925dd22fa2b7699ed2617149842d2e6adde22b262fcbfada50e3d195e4b3a94", size = 222963, upload-time = "2025-09-08T23:22:54.518Z" }, + { url = "https://files.pythonhosted.org/packages/b6/75/1f2747525e06f53efbd878f4d03bac5b859cbc11c633d0fb81432d98a795/cffi-2.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2c8f814d84194c9ea681642fd164267891702542f028a15fc97d4674b6206187", size = 221361, upload-time = "2025-09-08T23:22:55.867Z" }, + { url = "https://files.pythonhosted.org/packages/7b/2b/2b6435f76bfeb6bbf055596976da087377ede68df465419d192acf00c437/cffi-2.0.0-cp312-cp312-win32.whl", hash = "sha256:da902562c3e9c550df360bfa53c035b2f241fed6d9aef119048073680ace4a18", size = 172932, upload-time = "2025-09-08T23:22:57.188Z" }, + { url = "https://files.pythonhosted.org/packages/f8/ed/13bd4418627013bec4ed6e54283b1959cf6db888048c7cf4b4c3b5b36002/cffi-2.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:da68248800ad6320861f129cd9c1bf96ca849a2771a59e0344e88681905916f5", size = 183557, upload-time = "2025-09-08T23:22:58.351Z" }, + { url = "https://files.pythonhosted.org/packages/95/31/9f7f93ad2f8eff1dbc1c3656d7ca5bfd8fb52c9d786b4dcf19b2d02217fa/cffi-2.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:4671d9dd5ec934cb9a73e7ee9676f9362aba54f7f34910956b84d727b0d73fb6", size = 177762, upload-time = "2025-09-08T23:22:59.668Z" }, + { url = "https://files.pythonhosted.org/packages/4b/8d/a0a47a0c9e413a658623d014e91e74a50cdd2c423f7ccfd44086ef767f90/cffi-2.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:00bdf7acc5f795150faa6957054fbbca2439db2f775ce831222b66f192f03beb", size = 185230, upload-time = "2025-09-08T23:23:00.879Z" }, + { url = "https://files.pythonhosted.org/packages/4a/d2/a6c0296814556c68ee32009d9c2ad4f85f2707cdecfd7727951ec228005d/cffi-2.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:45d5e886156860dc35862657e1494b9bae8dfa63bf56796f2fb56e1679fc0bca", size = 181043, upload-time = "2025-09-08T23:23:02.231Z" }, + { url = "https://files.pythonhosted.org/packages/b0/1e/d22cc63332bd59b06481ceaac49d6c507598642e2230f201649058a7e704/cffi-2.0.0-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:07b271772c100085dd28b74fa0cd81c8fb1a3ba18b21e03d7c27f3436a10606b", size = 212446, upload-time = "2025-09-08T23:23:03.472Z" }, + { url = "https://files.pythonhosted.org/packages/a9/f5/a2c23eb03b61a0b8747f211eb716446c826ad66818ddc7810cc2cc19b3f2/cffi-2.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d48a880098c96020b02d5a1f7d9251308510ce8858940e6fa99ece33f610838b", size = 220101, upload-time = "2025-09-08T23:23:04.792Z" }, + { url = "https://files.pythonhosted.org/packages/f2/7f/e6647792fc5850d634695bc0e6ab4111ae88e89981d35ac269956605feba/cffi-2.0.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f93fd8e5c8c0a4aa1f424d6173f14a892044054871c771f8566e4008eaa359d2", size = 207948, upload-time = "2025-09-08T23:23:06.127Z" }, + { url = "https://files.pythonhosted.org/packages/cb/1e/a5a1bd6f1fb30f22573f76533de12a00bf274abcdc55c8edab639078abb6/cffi-2.0.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:dd4f05f54a52fb558f1ba9f528228066954fee3ebe629fc1660d874d040ae5a3", size = 206422, upload-time = "2025-09-08T23:23:07.753Z" }, + { url = "https://files.pythonhosted.org/packages/98/df/0a1755e750013a2081e863e7cd37e0cdd02664372c754e5560099eb7aa44/cffi-2.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c8d3b5532fc71b7a77c09192b4a5a200ea992702734a2e9279a37f2478236f26", size = 219499, upload-time = "2025-09-08T23:23:09.648Z" }, + { url = "https://files.pythonhosted.org/packages/50/e1/a969e687fcf9ea58e6e2a928ad5e2dd88cc12f6f0ab477e9971f2309b57c/cffi-2.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d9b29c1f0ae438d5ee9acb31cadee00a58c46cc9c0b2f9038c6b0b3470877a8c", size = 222928, upload-time = "2025-09-08T23:23:10.928Z" }, + { url = "https://files.pythonhosted.org/packages/36/54/0362578dd2c9e557a28ac77698ed67323ed5b9775ca9d3fe73fe191bb5d8/cffi-2.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6d50360be4546678fc1b79ffe7a66265e28667840010348dd69a314145807a1b", size = 221302, upload-time = "2025-09-08T23:23:12.42Z" }, + { url = "https://files.pythonhosted.org/packages/eb/6d/bf9bda840d5f1dfdbf0feca87fbdb64a918a69bca42cfa0ba7b137c48cb8/cffi-2.0.0-cp313-cp313-win32.whl", hash = "sha256:74a03b9698e198d47562765773b4a8309919089150a0bb17d829ad7b44b60d27", size = 172909, upload-time = "2025-09-08T23:23:14.32Z" }, + { url = "https://files.pythonhosted.org/packages/37/18/6519e1ee6f5a1e579e04b9ddb6f1676c17368a7aba48299c3759bbc3c8b3/cffi-2.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:19f705ada2530c1167abacb171925dd886168931e0a7b78f5bffcae5c6b5be75", size = 183402, upload-time = "2025-09-08T23:23:15.535Z" }, + { url = "https://files.pythonhosted.org/packages/cb/0e/02ceeec9a7d6ee63bb596121c2c8e9b3a9e150936f4fbef6ca1943e6137c/cffi-2.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:256f80b80ca3853f90c21b23ee78cd008713787b1b1e93eae9f3d6a7134abd91", size = 177780, upload-time = "2025-09-08T23:23:16.761Z" }, + { url = "https://files.pythonhosted.org/packages/92/c4/3ce07396253a83250ee98564f8d7e9789fab8e58858f35d07a9a2c78de9f/cffi-2.0.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fc33c5141b55ed366cfaad382df24fe7dcbc686de5be719b207bb248e3053dc5", size = 185320, upload-time = "2025-09-08T23:23:18.087Z" }, + { url = "https://files.pythonhosted.org/packages/59/dd/27e9fa567a23931c838c6b02d0764611c62290062a6d4e8ff7863daf9730/cffi-2.0.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c654de545946e0db659b3400168c9ad31b5d29593291482c43e3564effbcee13", size = 181487, upload-time = "2025-09-08T23:23:19.622Z" }, + { url = "https://files.pythonhosted.org/packages/d6/43/0e822876f87ea8a4ef95442c3d766a06a51fc5298823f884ef87aaad168c/cffi-2.0.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:24b6f81f1983e6df8db3adc38562c83f7d4a0c36162885ec7f7b77c7dcbec97b", size = 220049, upload-time = "2025-09-08T23:23:20.853Z" }, + { url = "https://files.pythonhosted.org/packages/b4/89/76799151d9c2d2d1ead63c2429da9ea9d7aac304603de0c6e8764e6e8e70/cffi-2.0.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:12873ca6cb9b0f0d3a0da705d6086fe911591737a59f28b7936bdfed27c0d47c", size = 207793, upload-time = "2025-09-08T23:23:22.08Z" }, + { url = "https://files.pythonhosted.org/packages/bb/dd/3465b14bb9e24ee24cb88c9e3730f6de63111fffe513492bf8c808a3547e/cffi-2.0.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:d9b97165e8aed9272a6bb17c01e3cc5871a594a446ebedc996e2397a1c1ea8ef", size = 206300, upload-time = "2025-09-08T23:23:23.314Z" }, + { url = "https://files.pythonhosted.org/packages/47/d9/d83e293854571c877a92da46fdec39158f8d7e68da75bf73581225d28e90/cffi-2.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:afb8db5439b81cf9c9d0c80404b60c3cc9c3add93e114dcae767f1477cb53775", size = 219244, upload-time = "2025-09-08T23:23:24.541Z" }, + { url = "https://files.pythonhosted.org/packages/2b/0f/1f177e3683aead2bb00f7679a16451d302c436b5cbf2505f0ea8146ef59e/cffi-2.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:737fe7d37e1a1bffe70bd5754ea763a62a066dc5913ca57e957824b72a85e205", size = 222828, upload-time = "2025-09-08T23:23:26.143Z" }, + { url = "https://files.pythonhosted.org/packages/c6/0f/cafacebd4b040e3119dcb32fed8bdef8dfe94da653155f9d0b9dc660166e/cffi-2.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:38100abb9d1b1435bc4cc340bb4489635dc2f0da7456590877030c9b3d40b0c1", size = 220926, upload-time = "2025-09-08T23:23:27.873Z" }, + { url = "https://files.pythonhosted.org/packages/3e/aa/df335faa45b395396fcbc03de2dfcab242cd61a9900e914fe682a59170b1/cffi-2.0.0-cp314-cp314-win32.whl", hash = "sha256:087067fa8953339c723661eda6b54bc98c5625757ea62e95eb4898ad5e776e9f", size = 175328, upload-time = "2025-09-08T23:23:44.61Z" }, + { url = "https://files.pythonhosted.org/packages/bb/92/882c2d30831744296ce713f0feb4c1cd30f346ef747b530b5318715cc367/cffi-2.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:203a48d1fb583fc7d78a4c6655692963b860a417c0528492a6bc21f1aaefab25", size = 185650, upload-time = "2025-09-08T23:23:45.848Z" }, + { url = "https://files.pythonhosted.org/packages/9f/2c/98ece204b9d35a7366b5b2c6539c350313ca13932143e79dc133ba757104/cffi-2.0.0-cp314-cp314-win_arm64.whl", hash = "sha256:dbd5c7a25a7cb98f5ca55d258b103a2054f859a46ae11aaf23134f9cc0d356ad", size = 180687, upload-time = "2025-09-08T23:23:47.105Z" }, + { url = "https://files.pythonhosted.org/packages/3e/61/c768e4d548bfa607abcda77423448df8c471f25dbe64fb2ef6d555eae006/cffi-2.0.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:9a67fc9e8eb39039280526379fb3a70023d77caec1852002b4da7e8b270c4dd9", size = 188773, upload-time = "2025-09-08T23:23:29.347Z" }, + { url = "https://files.pythonhosted.org/packages/2c/ea/5f76bce7cf6fcd0ab1a1058b5af899bfbef198bea4d5686da88471ea0336/cffi-2.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7a66c7204d8869299919db4d5069a82f1561581af12b11b3c9f48c584eb8743d", size = 185013, upload-time = "2025-09-08T23:23:30.63Z" }, + { url = "https://files.pythonhosted.org/packages/be/b4/c56878d0d1755cf9caa54ba71e5d049479c52f9e4afc230f06822162ab2f/cffi-2.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7cc09976e8b56f8cebd752f7113ad07752461f48a58cbba644139015ac24954c", size = 221593, upload-time = "2025-09-08T23:23:31.91Z" }, + { url = "https://files.pythonhosted.org/packages/e0/0d/eb704606dfe8033e7128df5e90fee946bbcb64a04fcdaa97321309004000/cffi-2.0.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:92b68146a71df78564e4ef48af17551a5ddd142e5190cdf2c5624d0c3ff5b2e8", size = 209354, upload-time = "2025-09-08T23:23:33.214Z" }, + { url = "https://files.pythonhosted.org/packages/d8/19/3c435d727b368ca475fb8742ab97c9cb13a0de600ce86f62eab7fa3eea60/cffi-2.0.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:b1e74d11748e7e98e2f426ab176d4ed720a64412b6a15054378afdb71e0f37dc", size = 208480, upload-time = "2025-09-08T23:23:34.495Z" }, + { url = "https://files.pythonhosted.org/packages/d0/44/681604464ed9541673e486521497406fadcc15b5217c3e326b061696899a/cffi-2.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:28a3a209b96630bca57cce802da70c266eb08c6e97e5afd61a75611ee6c64592", size = 221584, upload-time = "2025-09-08T23:23:36.096Z" }, + { url = "https://files.pythonhosted.org/packages/25/8e/342a504ff018a2825d395d44d63a767dd8ebc927ebda557fecdaca3ac33a/cffi-2.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:7553fb2090d71822f02c629afe6042c299edf91ba1bf94951165613553984512", size = 224443, upload-time = "2025-09-08T23:23:37.328Z" }, + { url = "https://files.pythonhosted.org/packages/e1/5e/b666bacbbc60fbf415ba9988324a132c9a7a0448a9a8f125074671c0f2c3/cffi-2.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6c6c373cfc5c83a975506110d17457138c8c63016b563cc9ed6e056a82f13ce4", size = 223437, upload-time = "2025-09-08T23:23:38.945Z" }, + { url = "https://files.pythonhosted.org/packages/a0/1d/ec1a60bd1a10daa292d3cd6bb0b359a81607154fb8165f3ec95fe003b85c/cffi-2.0.0-cp314-cp314t-win32.whl", hash = "sha256:1fc9ea04857caf665289b7a75923f2c6ed559b8298a1b8c49e59f7dd95c8481e", size = 180487, upload-time = "2025-09-08T23:23:40.423Z" }, + { url = "https://files.pythonhosted.org/packages/bf/41/4c1168c74fac325c0c8156f04b6749c8b6a8f405bbf91413ba088359f60d/cffi-2.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:d68b6cef7827e8641e8ef16f4494edda8b36104d79773a334beaa1e3521430f6", size = 191726, upload-time = "2025-09-08T23:23:41.742Z" }, + { url = "https://files.pythonhosted.org/packages/ae/3a/dbeec9d1ee0844c679f6bb5d6ad4e9f198b1224f4e7a32825f47f6192b0c/cffi-2.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:0a1527a803f0a659de1af2e1fd700213caba79377e27e4693648c2923da066f9", size = 184195, upload-time = "2025-09-08T23:23:43.004Z" }, +] + +[[package]] +name = "charset-normalizer" +version = "3.4.7" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/a1/67fe25fac3c7642725500a3f6cfe5821ad557c3abb11c9d20d12c7008d3e/charset_normalizer-3.4.7.tar.gz", hash = "sha256:ae89db9e5f98a11a4bf50407d4363e7b09b31e55bc117b4f7d80aab97ba009e5", size = 144271, upload-time = "2026-04-02T09:28:39.342Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0c/eb/4fc8d0a7110eb5fc9cc161723a34a8a6c200ce3b4fbf681bc86feee22308/charset_normalizer-3.4.7-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:eca9705049ad3c7345d574e3510665cb2cf844c2f2dcfe675332677f081cbd46", size = 311328, upload-time = "2026-04-02T09:26:24.331Z" }, + { url = "https://files.pythonhosted.org/packages/f8/e3/0fadc706008ac9d7b9b5be6dc767c05f9d3e5df51744ce4cc9605de7b9f4/charset_normalizer-3.4.7-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6178f72c5508bfc5fd446a5905e698c6212932f25bcdd4b47a757a50605a90e2", size = 208061, upload-time = "2026-04-02T09:26:25.568Z" }, + { url = "https://files.pythonhosted.org/packages/42/f0/3dd1045c47f4a4604df85ec18ad093912ae1344ac706993aff91d38773a2/charset_normalizer-3.4.7-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e1421b502d83040e6d7fb2fb18dff63957f720da3d77b2fbd3187ceb63755d7b", size = 229031, upload-time = "2026-04-02T09:26:26.865Z" }, + { url = "https://files.pythonhosted.org/packages/dc/67/675a46eb016118a2fbde5a277a5d15f4f69d5f3f5f338e5ee2f8948fcf43/charset_normalizer-3.4.7-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:edac0f1ab77644605be2cbba52e6b7f630731fc42b34cb0f634be1a6eface56a", size = 225239, upload-time = "2026-04-02T09:26:28.044Z" }, + { url = "https://files.pythonhosted.org/packages/4b/f8/d0118a2f5f23b02cd166fa385c60f9b0d4f9194f574e2b31cef350ad7223/charset_normalizer-3.4.7-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5649fd1c7bade02f320a462fdefd0b4bd3ce036065836d4f42e0de958038e116", size = 216589, upload-time = "2026-04-02T09:26:29.239Z" }, + { url = "https://files.pythonhosted.org/packages/b1/f1/6d2b0b261b6c4ceef0fcb0d17a01cc5bc53586c2d4796fa04b5c540bc13d/charset_normalizer-3.4.7-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:203104ed3e428044fd943bc4bf45fa73c0730391f9621e37fe39ecf477b128cb", size = 202733, upload-time = "2026-04-02T09:26:30.5Z" }, + { url = "https://files.pythonhosted.org/packages/6f/c0/7b1f943f7e87cc3db9626ba17807d042c38645f0a1d4415c7a14afb5591f/charset_normalizer-3.4.7-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:298930cec56029e05497a76988377cbd7457ba864beeea92ad7e844fe74cd1f1", size = 212652, upload-time = "2026-04-02T09:26:31.709Z" }, + { url = "https://files.pythonhosted.org/packages/38/dd/5a9ab159fe45c6e72079398f277b7d2b523e7f716acc489726115a910097/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:708838739abf24b2ceb208d0e22403dd018faeef86ddac04319a62ae884c4f15", size = 211229, upload-time = "2026-04-02T09:26:33.282Z" }, + { url = "https://files.pythonhosted.org/packages/d5/ff/531a1cad5ca855d1c1a8b69cb71abfd6d85c0291580146fda7c82857caa1/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:0f7eb884681e3938906ed0434f20c63046eacd0111c4ba96f27b76084cd679f5", size = 203552, upload-time = "2026-04-02T09:26:34.845Z" }, + { url = "https://files.pythonhosted.org/packages/c1/4c/a5fb52d528a8ca41f7598cb619409ece30a169fbdf9cdce592e53b46c3a6/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4dc1e73c36828f982bfe79fadf5919923f8a6f4df2860804db9a98c48824ce8d", size = 230806, upload-time = "2026-04-02T09:26:36.152Z" }, + { url = "https://files.pythonhosted.org/packages/59/7a/071feed8124111a32b316b33ae4de83d36923039ef8cf48120266844285b/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:aed52fea0513bac0ccde438c188c8a471c4e0f457c2dd20cdbf6ea7a450046c7", size = 212316, upload-time = "2026-04-02T09:26:37.672Z" }, + { url = "https://files.pythonhosted.org/packages/fd/35/f7dba3994312d7ba508e041eaac39a36b120f32d4c8662b8814dab876431/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:fea24543955a6a729c45a73fe90e08c743f0b3334bbf3201e6c4bc1b0c7fa464", size = 227274, upload-time = "2026-04-02T09:26:38.93Z" }, + { url = "https://files.pythonhosted.org/packages/8a/2d/a572df5c9204ab7688ec1edc895a73ebded3b023bb07364710b05dd1c9be/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:bb6d88045545b26da47aa879dd4a89a71d1dce0f0e549b1abcb31dfe4a8eac49", size = 218468, upload-time = "2026-04-02T09:26:40.17Z" }, + { url = "https://files.pythonhosted.org/packages/86/eb/890922a8b03a568ca2f336c36585a4713c55d4d67bf0f0c78924be6315ca/charset_normalizer-3.4.7-cp312-cp312-win32.whl", hash = "sha256:2257141f39fe65a3fdf38aeccae4b953e5f3b3324f4ff0daf9f15b8518666a2c", size = 148460, upload-time = "2026-04-02T09:26:41.416Z" }, + { url = "https://files.pythonhosted.org/packages/35/d9/0e7dffa06c5ab081f75b1b786f0aefc88365825dfcd0ac544bdb7b2b6853/charset_normalizer-3.4.7-cp312-cp312-win_amd64.whl", hash = "sha256:5ed6ab538499c8644b8a3e18debabcd7ce684f3fa91cf867521a7a0279cab2d6", size = 159330, upload-time = "2026-04-02T09:26:42.554Z" }, + { url = "https://files.pythonhosted.org/packages/9e/5d/481bcc2a7c88ea6b0878c299547843b2521ccbc40980cb406267088bc701/charset_normalizer-3.4.7-cp312-cp312-win_arm64.whl", hash = "sha256:56be790f86bfb2c98fb742ce566dfb4816e5a83384616ab59c49e0604d49c51d", size = 147828, upload-time = "2026-04-02T09:26:44.075Z" }, + { url = "https://files.pythonhosted.org/packages/c1/3b/66777e39d3ae1ddc77ee606be4ec6d8cbd4c801f65e5a1b6f2b11b8346dd/charset_normalizer-3.4.7-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:f496c9c3cc02230093d8330875c4c3cdfc3b73612a5fd921c65d39cbcef08063", size = 309627, upload-time = "2026-04-02T09:26:45.198Z" }, + { url = "https://files.pythonhosted.org/packages/2e/4e/b7f84e617b4854ade48a1b7915c8ccfadeba444d2a18c291f696e37f0d3b/charset_normalizer-3.4.7-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0ea948db76d31190bf08bd371623927ee1339d5f2a0b4b1b4a4439a65298703c", size = 207008, upload-time = "2026-04-02T09:26:46.824Z" }, + { url = "https://files.pythonhosted.org/packages/c4/bb/ec73c0257c9e11b268f018f068f5d00aa0ef8c8b09f7753ebd5f2880e248/charset_normalizer-3.4.7-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a277ab8928b9f299723bc1a2dabb1265911b1a76341f90a510368ca44ad9ab66", size = 228303, upload-time = "2026-04-02T09:26:48.397Z" }, + { url = "https://files.pythonhosted.org/packages/85/fb/32d1f5033484494619f701e719429c69b766bfc4dbc61aa9e9c8c166528b/charset_normalizer-3.4.7-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3bec022aec2c514d9cf199522a802bd007cd588ab17ab2525f20f9c34d067c18", size = 224282, upload-time = "2026-04-02T09:26:49.684Z" }, + { url = "https://files.pythonhosted.org/packages/fa/07/330e3a0dda4c404d6da83b327270906e9654a24f6c546dc886a0eb0ffb23/charset_normalizer-3.4.7-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e044c39e41b92c845bc815e5ae4230804e8e7bc29e399b0437d64222d92809dd", size = 215595, upload-time = "2026-04-02T09:26:50.915Z" }, + { url = "https://files.pythonhosted.org/packages/e3/7c/fc890655786e423f02556e0216d4b8c6bcb6bdfa890160dc66bf52dee468/charset_normalizer-3.4.7-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:f495a1652cf3fbab2eb0639776dad966c2fb874d79d87ca07f9d5f059b8bd215", size = 201986, upload-time = "2026-04-02T09:26:52.197Z" }, + { url = "https://files.pythonhosted.org/packages/d8/97/bfb18b3db2aed3b90cf54dc292ad79fdd5ad65c4eae454099475cbeadd0d/charset_normalizer-3.4.7-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e712b419df8ba5e42b226c510472b37bd57b38e897d3eca5e8cfd410a29fa859", size = 211711, upload-time = "2026-04-02T09:26:53.49Z" }, + { url = "https://files.pythonhosted.org/packages/6f/a5/a581c13798546a7fd557c82614a5c65a13df2157e9ad6373166d2a3e645d/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7804338df6fcc08105c7745f1502ba68d900f45fd770d5bdd5288ddccb8a42d8", size = 210036, upload-time = "2026-04-02T09:26:54.975Z" }, + { url = "https://files.pythonhosted.org/packages/8c/bf/b3ab5bcb478e4193d517644b0fb2bf5497fbceeaa7a1bc0f4d5b50953861/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:481551899c856c704d58119b5025793fa6730adda3571971af568f66d2424bb5", size = 202998, upload-time = "2026-04-02T09:26:56.303Z" }, + { url = "https://files.pythonhosted.org/packages/e7/4e/23efd79b65d314fa320ec6017b4b5834d5c12a58ba4610aa353af2e2f577/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f59099f9b66f0d7145115e6f80dd8b1d847176df89b234a5a6b3f00437aa0832", size = 230056, upload-time = "2026-04-02T09:26:57.554Z" }, + { url = "https://files.pythonhosted.org/packages/b9/9f/1e1941bc3f0e01df116e68dc37a55c4d249df5e6fa77f008841aef68264f/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:f59ad4c0e8f6bba240a9bb85504faa1ab438237199d4cce5f622761507b8f6a6", size = 211537, upload-time = "2026-04-02T09:26:58.843Z" }, + { url = "https://files.pythonhosted.org/packages/80/0f/088cbb3020d44428964a6c97fe1edfb1b9550396bf6d278330281e8b709c/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:3dedcc22d73ec993f42055eff4fcfed9318d1eeb9a6606c55892a26964964e48", size = 226176, upload-time = "2026-04-02T09:27:00.437Z" }, + { url = "https://files.pythonhosted.org/packages/6a/9f/130394f9bbe06f4f63e22641d32fc9b202b7e251c9aef4db044324dac493/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:64f02c6841d7d83f832cd97ccf8eb8a906d06eb95d5276069175c696b024b60a", size = 217723, upload-time = "2026-04-02T09:27:02.021Z" }, + { url = "https://files.pythonhosted.org/packages/73/55/c469897448a06e49f8fa03f6caae97074fde823f432a98f979cc42b90e69/charset_normalizer-3.4.7-cp313-cp313-win32.whl", hash = "sha256:4042d5c8f957e15221d423ba781e85d553722fc4113f523f2feb7b188cc34c5e", size = 148085, upload-time = "2026-04-02T09:27:03.192Z" }, + { url = "https://files.pythonhosted.org/packages/5d/78/1b74c5bbb3f99b77a1715c91b3e0b5bdb6fe302d95ace4f5b1bec37b0167/charset_normalizer-3.4.7-cp313-cp313-win_amd64.whl", hash = "sha256:3946fa46a0cf3e4c8cb1cc52f56bb536310d34f25f01ca9b6c16afa767dab110", size = 158819, upload-time = "2026-04-02T09:27:04.454Z" }, + { url = "https://files.pythonhosted.org/packages/68/86/46bd42279d323deb8687c4a5a811fd548cb7d1de10cf6535d099877a9a9f/charset_normalizer-3.4.7-cp313-cp313-win_arm64.whl", hash = "sha256:80d04837f55fc81da168b98de4f4b797ef007fc8a79ab71c6ec9bc4dd662b15b", size = 147915, upload-time = "2026-04-02T09:27:05.971Z" }, + { url = "https://files.pythonhosted.org/packages/97/c8/c67cb8c70e19ef1960b97b22ed2a1567711de46c4ddf19799923adc836c2/charset_normalizer-3.4.7-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:c36c333c39be2dbca264d7803333c896ab8fa7d4d6f0ab7edb7dfd7aea6e98c0", size = 309234, upload-time = "2026-04-02T09:27:07.194Z" }, + { url = "https://files.pythonhosted.org/packages/99/85/c091fdee33f20de70d6c8b522743b6f831a2f1cd3ff86de4c6a827c48a76/charset_normalizer-3.4.7-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1c2aed2e5e41f24ea8ef1590b8e848a79b56f3a5564a65ceec43c9d692dc7d8a", size = 208042, upload-time = "2026-04-02T09:27:08.749Z" }, + { url = "https://files.pythonhosted.org/packages/87/1c/ab2ce611b984d2fd5d86a5a8a19c1ae26acac6bad967da4967562c75114d/charset_normalizer-3.4.7-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:54523e136b8948060c0fa0bc7b1b50c32c186f2fceee897a495406bb6e311d2b", size = 228706, upload-time = "2026-04-02T09:27:09.951Z" }, + { url = "https://files.pythonhosted.org/packages/a8/29/2b1d2cb00bf085f59d29eb773ce58ec2d325430f8c216804a0a5cd83cbca/charset_normalizer-3.4.7-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:715479b9a2802ecac752a3b0efa2b0b60285cf962ee38414211abdfccc233b41", size = 224727, upload-time = "2026-04-02T09:27:11.175Z" }, + { url = "https://files.pythonhosted.org/packages/47/5c/032c2d5a07fe4d4855fea851209cca2b6f03ebeb6d4e3afdb3358386a684/charset_normalizer-3.4.7-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bd6c2a1c7573c64738d716488d2cdd3c00e340e4835707d8fdb8dc1a66ef164e", size = 215882, upload-time = "2026-04-02T09:27:12.446Z" }, + { url = "https://files.pythonhosted.org/packages/2c/c2/356065d5a8b78ed04499cae5f339f091946a6a74f91e03476c33f0ab7100/charset_normalizer-3.4.7-cp314-cp314-manylinux_2_31_armv7l.whl", hash = "sha256:c45e9440fb78f8ddabcf714b68f936737a121355bf59f3907f4e17721b9d1aae", size = 200860, upload-time = "2026-04-02T09:27:13.721Z" }, + { url = "https://files.pythonhosted.org/packages/0c/cd/a32a84217ced5039f53b29f460962abb2d4420def55afabe45b1c3c7483d/charset_normalizer-3.4.7-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3534e7dcbdcf757da6b85a0bbf5b6868786d5982dd959b065e65481644817a18", size = 211564, upload-time = "2026-04-02T09:27:15.272Z" }, + { url = "https://files.pythonhosted.org/packages/44/86/58e6f13ce26cc3b8f4a36b94a0f22ae2f00a72534520f4ae6857c4b81f89/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:e8ac484bf18ce6975760921bb6148041faa8fef0547200386ea0b52b5d27bf7b", size = 211276, upload-time = "2026-04-02T09:27:16.834Z" }, + { url = "https://files.pythonhosted.org/packages/8f/fe/d17c32dc72e17e155e06883efa84514ca375f8a528ba2546bee73fc4df81/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:a5fe03b42827c13cdccd08e6c0247b6a6d4b5e3cdc53fd1749f5896adcdc2356", size = 201238, upload-time = "2026-04-02T09:27:18.229Z" }, + { url = "https://files.pythonhosted.org/packages/6a/29/f33daa50b06525a237451cdb6c69da366c381a3dadcd833fa5676bc468b3/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:2d6eb928e13016cea4f1f21d1e10c1cebd5a421bc57ddf5b1142ae3f86824fab", size = 230189, upload-time = "2026-04-02T09:27:19.445Z" }, + { url = "https://files.pythonhosted.org/packages/b6/6e/52c84015394a6a0bdcd435210a7e944c5f94ea1055f5cc5d56c5fe368e7b/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:e74327fb75de8986940def6e8dee4f127cc9752bee7355bb323cc5b2659b6d46", size = 211352, upload-time = "2026-04-02T09:27:20.79Z" }, + { url = "https://files.pythonhosted.org/packages/8c/d7/4353be581b373033fb9198bf1da3cf8f09c1082561e8e922aa7b39bf9fe8/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:d6038d37043bced98a66e68d3aa2b6a35505dc01328cd65217cefe82f25def44", size = 227024, upload-time = "2026-04-02T09:27:22.063Z" }, + { url = "https://files.pythonhosted.org/packages/30/45/99d18aa925bd1740098ccd3060e238e21115fffbfdcb8f3ece837d0ace6c/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:7579e913a5339fb8fa133f6bbcfd8e6749696206cf05acdbdca71a1b436d8e72", size = 217869, upload-time = "2026-04-02T09:27:23.486Z" }, + { url = "https://files.pythonhosted.org/packages/5c/05/5ee478aa53f4bb7996482153d4bfe1b89e0f087f0ab6b294fcf92d595873/charset_normalizer-3.4.7-cp314-cp314-win32.whl", hash = "sha256:5b77459df20e08151cd6f8b9ef8ef1f961ef73d85c21a555c7eed5b79410ec10", size = 148541, upload-time = "2026-04-02T09:27:25.146Z" }, + { url = "https://files.pythonhosted.org/packages/48/77/72dcb0921b2ce86420b2d79d454c7022bf5be40202a2a07906b9f2a35c97/charset_normalizer-3.4.7-cp314-cp314-win_amd64.whl", hash = "sha256:92a0a01ead5e668468e952e4238cccd7c537364eb7d851ab144ab6627dbbe12f", size = 159634, upload-time = "2026-04-02T09:27:26.642Z" }, + { url = "https://files.pythonhosted.org/packages/c6/a3/c2369911cd72f02386e4e340770f6e158c7980267da16af8f668217abaa0/charset_normalizer-3.4.7-cp314-cp314-win_arm64.whl", hash = "sha256:67f6279d125ca0046a7fd386d01b311c6363844deac3e5b069b514ba3e63c246", size = 148384, upload-time = "2026-04-02T09:27:28.271Z" }, + { url = "https://files.pythonhosted.org/packages/94/09/7e8a7f73d24dba1f0035fbbf014d2c36828fc1bf9c88f84093e57d315935/charset_normalizer-3.4.7-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:effc3f449787117233702311a1b7d8f59cba9ced946ba727bdc329ec69028e24", size = 330133, upload-time = "2026-04-02T09:27:29.474Z" }, + { url = "https://files.pythonhosted.org/packages/8d/da/96975ddb11f8e977f706f45cddd8540fd8242f71ecdb5d18a80723dcf62c/charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fbccdc05410c9ee21bbf16a35f4c1d16123dcdeb8a1d38f33654fa21d0234f79", size = 216257, upload-time = "2026-04-02T09:27:30.793Z" }, + { url = "https://files.pythonhosted.org/packages/e5/e8/1d63bf8ef2d388e95c64b2098f45f84758f6d102a087552da1485912637b/charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:733784b6d6def852c814bce5f318d25da2ee65dd4839a0718641c696e09a2960", size = 234851, upload-time = "2026-04-02T09:27:32.44Z" }, + { url = "https://files.pythonhosted.org/packages/9b/40/e5ff04233e70da2681fa43969ad6f66ca5611d7e669be0246c4c7aaf6dc8/charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a89c23ef8d2c6b27fd200a42aa4ac72786e7c60d40efdc76e6011260b6e949c4", size = 233393, upload-time = "2026-04-02T09:27:34.03Z" }, + { url = "https://files.pythonhosted.org/packages/be/c1/06c6c49d5a5450f76899992f1ee40b41d076aee9279b49cf9974d2f313d5/charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6c114670c45346afedc0d947faf3c7f701051d2518b943679c8ff88befe14f8e", size = 223251, upload-time = "2026-04-02T09:27:35.369Z" }, + { url = "https://files.pythonhosted.org/packages/2b/9f/f2ff16fb050946169e3e1f82134d107e5d4ae72647ec8a1b1446c148480f/charset_normalizer-3.4.7-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:a180c5e59792af262bf263b21a3c49353f25945d8d9f70628e73de370d55e1e1", size = 206609, upload-time = "2026-04-02T09:27:36.661Z" }, + { url = "https://files.pythonhosted.org/packages/69/d5/a527c0cd8d64d2eab7459784fb4169a0ac76e5a6fc5237337982fd61347e/charset_normalizer-3.4.7-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3c9a494bc5ec77d43cea229c4f6db1e4d8fe7e1bbffa8b6f0f0032430ff8ab44", size = 220014, upload-time = "2026-04-02T09:27:38.019Z" }, + { url = "https://files.pythonhosted.org/packages/7e/80/8a7b8104a3e203074dc9aa2c613d4b726c0e136bad1cc734594b02867972/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8d828b6667a32a728a1ad1d93957cdf37489c57b97ae6c4de2860fa749b8fc1e", size = 218979, upload-time = "2026-04-02T09:27:39.37Z" }, + { url = "https://files.pythonhosted.org/packages/02/9a/b759b503d507f375b2b5c153e4d2ee0a75aa215b7f2489cf314f4541f2c0/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:cf1493cd8607bec4d8a7b9b004e699fcf8f9103a9284cc94962cb73d20f9d4a3", size = 209238, upload-time = "2026-04-02T09:27:40.722Z" }, + { url = "https://files.pythonhosted.org/packages/c2/4e/0f3f5d47b86bdb79256e7290b26ac847a2832d9a4033f7eb2cd4bcf4bb5b/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:0c96c3b819b5c3e9e165495db84d41914d6894d55181d2d108cc1a69bfc9cce0", size = 236110, upload-time = "2026-04-02T09:27:42.33Z" }, + { url = "https://files.pythonhosted.org/packages/96/23/bce28734eb3ed2c91dcf93abeb8a5cf393a7b2749725030bb630e554fdd8/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:752a45dc4a6934060b3b0dab47e04edc3326575f82be64bc4fc293914566503e", size = 219824, upload-time = "2026-04-02T09:27:43.924Z" }, + { url = "https://files.pythonhosted.org/packages/2c/6f/6e897c6984cc4d41af319b077f2f600fc8214eb2fe2d6bcb79141b882400/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:8778f0c7a52e56f75d12dae53ae320fae900a8b9b4164b981b9c5ce059cd1fcb", size = 233103, upload-time = "2026-04-02T09:27:45.348Z" }, + { url = "https://files.pythonhosted.org/packages/76/22/ef7bd0fe480a0ae9b656189ec00744b60933f68b4f42a7bb06589f6f576a/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ce3412fbe1e31eb81ea42f4169ed94861c56e643189e1e75f0041f3fe7020abe", size = 225194, upload-time = "2026-04-02T09:27:46.706Z" }, + { url = "https://files.pythonhosted.org/packages/c5/a7/0e0ab3e0b5bc1219bd80a6a0d4d72ca74d9250cb2382b7c699c147e06017/charset_normalizer-3.4.7-cp314-cp314t-win32.whl", hash = "sha256:c03a41a8784091e67a39648f70c5f97b5b6a37f216896d44d2cdcb82615339a0", size = 159827, upload-time = "2026-04-02T09:27:48.053Z" }, + { url = "https://files.pythonhosted.org/packages/7a/1d/29d32e0fb40864b1f878c7f5a0b343ae676c6e2b271a2d55cc3a152391da/charset_normalizer-3.4.7-cp314-cp314t-win_amd64.whl", hash = "sha256:03853ed82eeebbce3c2abfdbc98c96dc205f32a79627688ac9a27370ea61a49c", size = 174168, upload-time = "2026-04-02T09:27:49.795Z" }, + { url = "https://files.pythonhosted.org/packages/de/32/d92444ad05c7a6e41fb2036749777c163baf7a0301a040cb672d6b2b1ae9/charset_normalizer-3.4.7-cp314-cp314t-win_arm64.whl", hash = "sha256:c35abb8bfff0185efac5878da64c45dafd2b37fb0383add1be155a763c1f083d", size = 153018, upload-time = "2026-04-02T09:27:51.116Z" }, + { url = "https://files.pythonhosted.org/packages/db/8f/61959034484a4a7c527811f4721e75d02d653a35afb0b6054474d8185d4c/charset_normalizer-3.4.7-py3-none-any.whl", hash = "sha256:3dce51d0f5e7951f8bb4900c257dad282f49190fdbebecd4ba99bcc41fef404d", size = 61958, upload-time = "2026-04-02T09:28:37.794Z" }, +] + +[[package]] +name = "click" +version = "8.4.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/76/d4/81420972a676e8ffea40450d8c8c92943e7218a78fe9b64359836cc9876b/click-8.4.2.tar.gz", hash = "sha256:9a6cea6e60b17ebe0a44c5cc636d94f09bd66142c1cd7d8b4cd731c4917a15f6", size = 338000, upload-time = "2026-06-24T17:45:15.148Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fb/e2/79c688af8b210d232694e31e59da9f6ec747bae31c3f5946e4e9b98860d5/click-8.4.2-py3-none-any.whl", hash = "sha256:e6f9f66136c816745b9d65817da91d61d957fb16e02e4dcd0552553c5a197b76", size = 119243, upload-time = "2026-06-24T17:45:13.73Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "cryptography" +version = "49.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi", marker = "platform_python_implementation != 'PyPy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/1f/99/d1c90d6041656cc6ee229dc99cd67fd0cd5aec3c5f7d72fffc27cc750054/cryptography-49.0.0.tar.gz", hash = "sha256:f89660a348f4f78a92366240a61404e337586ef7f5909a2fef59ca88ef505493", size = 854345, upload-time = "2026-06-12T20:02:30.512Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9b/22/adf66990e63584a68dfb50c24f48a125c07b1699899381c8151e63ed458c/cryptography-49.0.0-cp311-abi3-macosx_11_0_arm64.whl", hash = "sha256:966fe0e9c67490071f14c0d2b1cb2dfb3023c5ce39457343931415f08382f2db", size = 4032100, upload-time = "2026-06-12T20:02:32.143Z" }, + { url = "https://files.pythonhosted.org/packages/09/41/3797cfaf69cae04a13ee78ebd83f0678d9c02b4779d21ce24445326f1a69/cryptography-49.0.0-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:36d1709f992593689b45bda411498d62c6e365f2ca00b84657d4dadd24de16db", size = 4692978, upload-time = "2026-06-12T20:01:21.305Z" }, + { url = "https://files.pythonhosted.org/packages/e6/8b/43011f7ebe515a8aa20d61f290a326cd890c2e738e16e59eaff8d9c3a412/cryptography-49.0.0-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0e959b578856a3924bc0cbb710fc12c387b9412a951389f3ca61704a9e25f325", size = 4716422, upload-time = "2026-06-12T20:01:48.566Z" }, + { url = "https://files.pythonhosted.org/packages/4a/91/01ce7303a4579e6d3a6abef01bd322848e9ea7a219adcabc5048b9033571/cryptography-49.0.0-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:53ecee2e23f7169b6117e99fc8a944e5e50f79e69758a83b52a00cb98ab2b2d2", size = 4700503, upload-time = "2026-06-12T20:02:47.091Z" }, + { url = "https://files.pythonhosted.org/packages/62/99/a2c95cf8293f07491e9e27c20cc4dcd18176d944e674679adeb1d0173fd6/cryptography-49.0.0-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:2eda353d8a27bcbcaa4cbed18994a74ab4d19a2ca897db188ea269ab9b71419b", size = 5309779, upload-time = "2026-06-12T20:02:08.987Z" }, + { url = "https://files.pythonhosted.org/packages/20/2c/0622f20ff02b2ef32558733443805dc82fd4c275be01b2d19d14676f3a1b/cryptography-49.0.0-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:2afe9051da7ae7bd5905da5a949280c7d2bb75682e188f650a9d0f2756b834c6", size = 4749683, upload-time = "2026-06-12T20:02:03.335Z" }, + { url = "https://files.pythonhosted.org/packages/a3/5b/c5246635d5fd3b64e0d45ae10e99fd32fe9676a79915ccfe5a61ba9af1a5/cryptography-49.0.0-cp311-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:0b82e28ee398a386f0807bba7884d30f25218855690f45115831bcce5d90822c", size = 4337874, upload-time = "2026-06-12T20:02:54.323Z" }, + { url = "https://files.pythonhosted.org/packages/6d/88/05563c7fe2e914e87d1a536d06fe83e66b4e1d95cb593e05aea375531da8/cryptography-49.0.0-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:ccac2bfebc306b862133e3bb71f3f6ee8bb525240089b2d952e4144b3a6d5da7", size = 4700283, upload-time = "2026-06-12T20:01:34.822Z" }, + { url = "https://files.pythonhosted.org/packages/c4/b6/d7696e4e890d6ae1469935164c9e5215c557671cb78d6e3f458ccceaa632/cryptography-49.0.0-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:d0527ce944105f257f605a827d6ebead966c752038b6e8656abb9c5edee6fc68", size = 5265844, upload-time = "2026-06-12T20:01:24.09Z" }, + { url = "https://files.pythonhosted.org/packages/a9/3c/f3ad17eecc1a57b0ba236dc01f90e783c51f4a2f35f64777cc4f47a184b2/cryptography-49.0.0-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:cbc77da8c523d5abd028635ba850a6966fcee2c82e2bf65a41d1d8afe0f98be9", size = 4749290, upload-time = "2026-06-12T20:01:30.848Z" }, + { url = "https://files.pythonhosted.org/packages/4f/01/339573cf1023163a400b0b5d16f6d507de413b9f60be6fd1b77feeaf6737/cryptography-49.0.0-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:b87e65d263b3e5d3bb92a57e2a6638e2f31110fa7aa890c7b2dbba42248d0a3f", size = 4834612, upload-time = "2026-06-12T20:01:29.246Z" }, + { url = "https://files.pythonhosted.org/packages/71/fd/577302e213a1be9468f92d1afef66fcf1ef83d516819d9992ca547f592bd/cryptography-49.0.0-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:66ec79c3904820572d7e987abdf304281f141d37ad9a489b8e97066e7b9b6459", size = 4980804, upload-time = "2026-06-12T20:01:42.853Z" }, + { url = "https://files.pythonhosted.org/packages/1f/09/f42b1d190c5ba75f72062a387f8030d1d75f6ab035788f1d9c4b01de6525/cryptography-49.0.0-cp311-abi3-win_amd64.whl", hash = "sha256:e5dfc1e64de5677cec922ffa8da89c546d0415bf6efdf081842e5d44c84e1f0e", size = 3810026, upload-time = "2026-06-12T20:02:39.262Z" }, + { url = "https://files.pythonhosted.org/packages/ec/9e/db72b3ae7fc9cfad53e630e56c6ae83b9b6ff0bf3718ffb8012d20b3aabf/cryptography-49.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:73a205dce83953d131a4aa1e0fd917a2fd1c5b1eef251e9d7152efefcbf5caf7", size = 4013892, upload-time = "2026-06-12T20:02:10.735Z" }, + { url = "https://files.pythonhosted.org/packages/86/12/c48a424f38db03027be9f7ed5c7dc5de9933dbee992865f98b13727a009d/cryptography-49.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:196ecd6a36e4e9aa10270393bb98d8df88fccee0bf1e5128b91ae4eb4375896d", size = 4678835, upload-time = "2026-06-12T20:02:48.743Z" }, + { url = "https://files.pythonhosted.org/packages/68/28/8a3ad4653662c93fc44dc4e5d8fd374c25c42e07b34bbfbadf49cf57a5a8/cryptography-49.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7abcee80084cda3f7691f3eb1ce480d8df49cec637b429aa35986c1de71738aa", size = 4697239, upload-time = "2026-06-12T20:02:56.03Z" }, + { url = "https://files.pythonhosted.org/packages/a8/b2/2193fc74f81aee4f9b62733133b73b5176718932ed8f2e4b03fa040480a6/cryptography-49.0.0-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:4ae387c9cb68ea569ca17e490d66d8142b81c3cc814bf179974b7d146e490bbb", size = 4685593, upload-time = "2026-06-12T20:02:50.666Z" }, + { url = "https://files.pythonhosted.org/packages/47/f1/1d3eaa243bfc5de4a187b22aa8c048b3e4980bfbe830ac46e6bac2e66947/cryptography-49.0.0-cp314-cp314t-manylinux_2_28_ppc64le.whl", hash = "sha256:f37d847238971164fdbc68ade6f6574aecc9c0af714190e2083429ff68f4ce9d", size = 5289961, upload-time = "2026-06-12T20:01:46.468Z" }, + { url = "https://files.pythonhosted.org/packages/58/39/2d51306721330c486495853eda1c567880ff036de15a14c4b74f399934af/cryptography-49.0.0-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:c2bc30226390d60ea19d9f82b19db005fe0452154a23c1c410c12ea801e43561", size = 4731145, upload-time = "2026-06-12T20:02:16.832Z" }, + { url = "https://files.pythonhosted.org/packages/17/50/983e838c7fd0d87fd8c969bcdd328edaf5f756e38df5281637424c155873/cryptography-49.0.0-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:07cab27cc7b7e0fd28e5e26bb9eeedde5c135c868b46de4a27845abe94af6122", size = 4321719, upload-time = "2026-06-12T20:02:52.611Z" }, + { url = "https://files.pythonhosted.org/packages/a7/f5/8f571d7e27c55bce9f76f026143bcb1e040a4233149ecca0bea5fa5dd5f7/cryptography-49.0.0-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:b20133d204d2bb56ba047642199603876c872026ca53e79c35b83772ab2cc505", size = 4685209, upload-time = "2026-06-12T20:02:07.282Z" }, + { url = "https://files.pythonhosted.org/packages/e7/84/0e27016a6fc5a0886f797018b26aa42f40c09a82332bff77822a451deaaa/cryptography-49.0.0-cp314-cp314t-manylinux_2_34_ppc64le.whl", hash = "sha256:b970c6da94d5bb18629db453d14f2a1300f6bf59b61e9b82377931ef95504866", size = 5246285, upload-time = "2026-06-12T20:01:32.439Z" }, + { url = "https://files.pythonhosted.org/packages/11/2d/5e1fb307cb5931881516b464c98774b3f2c36b5d4bb9a2830253cf553cad/cryptography-49.0.0-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:d8ecde755e2e91bf773fc94e8c9d730cd7f2007004cb492263a794ec3899a1c8", size = 4730441, upload-time = "2026-06-12T20:02:01.469Z" }, + { url = "https://files.pythonhosted.org/packages/e4/c0/bff5a02ee731d207d6a1ed51732549d8c53d2bc8da1d10ec6f2844201d68/cryptography-49.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e3fb64c420688e5319ae25113a354015abbd8dffbfbc41781a1ea66fc7622ac3", size = 4815869, upload-time = "2026-06-12T20:01:36.574Z" }, + { url = "https://files.pythonhosted.org/packages/b9/26/814681d14248d95d73d5c3eea0c39a94eb8302df966f670a2c60de90974b/cryptography-49.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:32703d93296f5c1f4b53349ad3a250c2cae0fdecd3a3dd5d47e616d8d616af27", size = 4960948, upload-time = "2026-06-12T20:02:18.688Z" }, + { url = "https://files.pythonhosted.org/packages/4c/fe/93ecac273d3738939d023612ad12cca9a3740a5345d69fda04134c43fd96/cryptography-49.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:33cd0565932807baddb67b96dbee92f2c374b5c89dee09fd74079aeb8c8dba61", size = 3799153, upload-time = "2026-06-12T20:01:39.059Z" }, + { url = "https://files.pythonhosted.org/packages/19/2a/5bb823f5bedcf80718cea7fbc95ec5515cca3769633c4b01a32be7f30e7c/cryptography-49.0.0-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:ec5e529fb80935c94fe7b729f9972b50e351a0e6b50aa294fd5cabb109fcc29a", size = 4025947, upload-time = "2026-06-12T20:01:25.745Z" }, + { url = "https://files.pythonhosted.org/packages/3d/df/40577043ca124e17012f408ddddaeb213b856336ac82ddb3bc915f39e29f/cryptography-49.0.0-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f78ff2c9ed8dc2d036b0f4d640e22522213d047c1b14e61205a7e55c80a494d4", size = 4692429, upload-time = "2026-06-12T20:01:53.628Z" }, + { url = "https://files.pythonhosted.org/packages/2c/99/2d13299eb3dd27b02dcfaafcc91d6b5cb3329f7cbd6d8f51921acd566c1a/cryptography-49.0.0-cp39-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:35b151772baff2c74cba7fa290ceaff4c3b11c0c881eb93eb5dbc05a7cfbba18", size = 4700968, upload-time = "2026-06-12T20:02:45.383Z" }, + { url = "https://files.pythonhosted.org/packages/a5/4d/9c0cd02f95e2602dd5e563da149ee0830abef3537be8b34dc56281ebe27a/cryptography-49.0.0-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:0f21641cf4b30fca7aee061ced0ec7ad7b073518088b7c9969a297c0ae796c69", size = 4697758, upload-time = "2026-06-12T20:01:41.13Z" }, + { url = "https://files.pythonhosted.org/packages/24/01/186c825898477d77e2324d5360fefe622ff1d8d1963ec0554e2cada8ec77/cryptography-49.0.0-cp39-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:9e82dcc8e56052715fb18b2429e3bca4823b1629136a2084fc45a9a5cecb9b64", size = 5298863, upload-time = "2026-06-12T20:02:24.579Z" }, + { url = "https://files.pythonhosted.org/packages/b8/7b/62cbbab75d0659865bf0273790031544a0b16c8072d258f9428dcd8190dc/cryptography-49.0.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:6f2debedf9ca60cf1d5bd466475638af5130f89965605cd818484d19987d3a21", size = 4735983, upload-time = "2026-06-12T20:01:50.14Z" }, + { url = "https://files.pythonhosted.org/packages/6c/72/3e798c064bc39e471008075d0f9bc9daf77a80879c092e4a8e170c585ed4/cryptography-49.0.0-cp39-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:8c25ceb16df5b9435f3f6a9829204985b0e0cbee3b48aacd432c7d2c850b44d9", size = 4334173, upload-time = "2026-06-12T20:01:44.743Z" }, + { url = "https://files.pythonhosted.org/packages/f0/ee/6fca21d1ac73e06f8bef71940abfd4d2f6472b4bca284d770f32bd4086f6/cryptography-49.0.0-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:28d8b15e6275f12c8a207dc309dfa957903c927d08d0cc937ee3f63f200693cc", size = 4697298, upload-time = "2026-06-12T20:02:20.918Z" }, + { url = "https://files.pythonhosted.org/packages/67/d0/a5fcd3515f0bae49a7b6d0413cc1bdccdcc1fc0047037a0d480642cdc5d6/cryptography-49.0.0-cp39-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:6fc361c34fb6aac015ce19435876635e5c6d21db31998b0920f675f131e043b8", size = 5254338, upload-time = "2026-06-12T20:02:22.737Z" }, + { url = "https://files.pythonhosted.org/packages/a0/84/84fe36f19caf857d61cb7fc9c63035a47ffabd84ea12d1d393148efa3615/cryptography-49.0.0-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:2400ef9c9e2299a25614eb1dea3db54a69b1349efd043bfac9c67630d136df36", size = 4735650, upload-time = "2026-06-12T20:02:41.389Z" }, + { url = "https://files.pythonhosted.org/packages/6c/a0/db537264e234f7273a73ec020873d6d6b39dfd8a53db78b550ca8320440e/cryptography-49.0.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:67e1d20ad9ef3a563c59ef22e7a8a0b8210bd26604369ea4a30a7c66aefe504e", size = 4834820, upload-time = "2026-06-12T20:01:51.847Z" }, + { url = "https://files.pythonhosted.org/packages/93/77/8df9eb486495979bccecd1062e2eaf435250e84437040295b57d09048b0b/cryptography-49.0.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:42b0684e0e40cf26122427802486f6d93aea593612603a94fbf260c7eb1e9c1b", size = 4967968, upload-time = "2026-06-12T20:02:12.524Z" }, + { url = "https://files.pythonhosted.org/packages/c2/e6/f60198ea8d9dfa15fff9ed4ca02ce362f6eadd9ba757dcc50634c4257b63/cryptography-49.0.0-cp39-abi3-win_amd64.whl", hash = "sha256:026ac7423e6fa66872d3bf889be5974507da3944f866f704fa200eadacd00001", size = 3785547, upload-time = "2026-06-12T20:02:26.847Z" }, +] + +[[package]] +name = "distro" +version = "1.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fc/f8/98eea607f65de6527f8a2e8885fc8015d3e6f5775df186e443e0964a11c3/distro-1.9.0.tar.gz", hash = "sha256:2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed", size = 60722, upload-time = "2023-12-24T09:54:32.31Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/12/b3/231ffd4ab1fc9d679809f356cebee130ac7daa00d6d6f3206dd4fd137e9e/distro-1.9.0-py3-none-any.whl", hash = "sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2", size = 20277, upload-time = "2023-12-24T09:54:30.421Z" }, +] + +[[package]] +name = "et-xmlfile" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d3/38/af70d7ab1ae9d4da450eeec1fa3918940a5fafb9055e934af8d6eb0c2313/et_xmlfile-2.0.0.tar.gz", hash = "sha256:dab3f4764309081ce75662649be815c4c9081e88f0837825f90fd28317d4da54", size = 17234, upload-time = "2024-10-25T17:25:40.039Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c1/8b/5fe2cc11fee489817272089c4203e679c63b570a5aaeb18d852ae3cbba6a/et_xmlfile-2.0.0-py3-none-any.whl", hash = "sha256:7a91720bc756843502c3b7504c77b8fe44217c85c537d85037f0f536151b2caa", size = 18059, upload-time = "2024-10-25T17:25:39.051Z" }, +] + +[[package]] +name = "fastapi" +version = "0.138.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "annotated-doc" }, + { name = "pydantic" }, + { name = "starlette" }, + { name = "typing-extensions" }, + { name = "typing-inspection" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8a/c9/5e8defe249899c0dc900643695fc07829a67fc88b4ff2cdb03fcbdbf5a4b/fastapi-0.138.1.tar.gz", hash = "sha256:96e3702dce09ee0dce48856135620d3d865ca684a79fe7513fd7b13a12f82862", size = 419646, upload-time = "2026-06-25T15:40:42.115Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/38/a9/69a6924f645eb4dd8cd625bf255b3625990eb3e14e073438a53c405dcd3e/fastapi-0.138.1-py3-none-any.whl", hash = "sha256:b994cae7ba8b82c976a728b544244de31333fa5f7d261f9a1dffe526444cae23", size = 129182, upload-time = "2026-06-25T15:40:40.771Z" }, +] + +[[package]] +name = "google-auth" +version = "2.55.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cryptography" }, + { name = "pyasn1-modules" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a3/6f/f3f4ac177c67bbee8fe8e88f2ab4f36af88c44a096e165c5217accf6e5d3/google_auth-2.55.1.tar.gz", hash = "sha256:fb2d9b730f2c9b8d326ec8d7222f21aef2ead15bf0513793d6442485d87af0a1", size = 349527, upload-time = "2026-06-25T23:39:27.182Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e8/1d/f6d3ca1ad0725f2e08a1c6915640748a52de2e66596160a4d53b010cccf0/google_auth-2.55.1-py3-none-any.whl", hash = "sha256:eada68dfd52b3b81191827601e2a0c3fa12540c818534b630ddc5355769c3995", size = 252349, upload-time = "2026-06-25T23:38:52.946Z" }, +] + +[package.optional-dependencies] +requests = [ + { name = "requests" }, +] + +[[package]] +name = "google-genai" +version = "2.10.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "distro" }, + { name = "google-auth", extra = ["requests"] }, + { name = "httpx" }, + { name = "pydantic" }, + { name = "requests" }, + { name = "sniffio" }, + { name = "tenacity" }, + { name = "typing-extensions" }, + { name = "websockets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/cd/fe/b796087493c3c55371aa58b9f264841ace5bfdf8c668cafa7afa33c44bec/google_genai-2.10.0.tar.gz", hash = "sha256:77912cd558cd7dfd5b75c25fd1c609e78d7954dde583331104022a46ea90f9ee", size = 600039, upload-time = "2026-06-24T01:33:18.157Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e0/39/00bcfd94de255d24249401efff4f48d77bf6066b46447e519fa193c0c299/google_genai-2.10.0-py3-none-any.whl", hash = "sha256:d5350311567ae660c24cbc1752aee4b3d660f89c0106d2dcd2a69978c35afe1e", size = 957974, upload-time = "2026-06-24T01:33:16.296Z" }, +] + +[[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.8.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/43/e5/d471fcb0e14523fe1c3f4ba58ca52480e7bd70ad7109a3846bc75892f7fb/httptools-0.8.0.tar.gz", hash = "sha256:6b2a32f18d97e16e90827d7a819ffa8dbd8cc245fc4e1fa9d1095b54ef4bd999", size = 271342, upload-time = "2026-05-25T22:17:48.841Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/14/88/1d21a36da8f5cb0fa49eafd4b169eba5608d57e75bbcf61845cbc6243216/httptools-0.8.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:880490234c10f70a9830743097e8958d6e4b9f5a0ffc24515023afeef984054d", size = 208247, upload-time = "2026-05-25T22:17:07.843Z" }, + { url = "https://files.pythonhosted.org/packages/a5/42/cc4feea2945cb3051038f090c9b36bd5b8a9d7f5a894a506a8983e33fd1c/httptools-0.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5931891fb7b441b8a3853cf1b85c82c903defce084dd5f6771ca46e31bf862c5", size = 113064, upload-time = "2026-05-25T22:17:09.136Z" }, + { url = "https://files.pythonhosted.org/packages/e3/a6/febbb8b8db0f58b38e44ad6cb946e6a255ae49b55f2e8543408fb7501ccd/httptools-0.8.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b15fc622b0f869d19207c4089a501d9bcc63ca5e071ffdd2f03f922df882dcb2", size = 523851, upload-time = "2026-05-25T22:17:10.106Z" }, + { url = "https://files.pythonhosted.org/packages/b7/e4/f90a0df0b83beff265b7e3b65f2a4cefd95792d4be0ac3e16049f2acd3c2/httptools-0.8.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:425f83884fd6343828d8c565f046cb72b6d19063f6924093e11bcd8e1548cd09", size = 518842, upload-time = "2026-05-25T22:17:11.218Z" }, + { url = "https://files.pythonhosted.org/packages/9e/2d/0c9ac76dd2c893841fbf6498d6acec4f2442e1b7067f6e3e316a80e494e8/httptools-0.8.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ef7c3c97f4311c7be57e2986629df89d49cb434dbff78eafcd48c2bff986b15a", size = 501238, upload-time = "2026-05-25T22:17:12.728Z" }, + { url = "https://files.pythonhosted.org/packages/ca/42/906adc91ae3a5fa9c59c0a2f21c139725bd7e5b41ae6acd485cd14123ebf/httptools-0.8.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a1afd7c9fbff0d9f5d489c4ce2768bd09c84a46ddefc7161e6aa82ae35c85745", size = 509567, upload-time = "2026-05-25T22:17:13.842Z" }, + { url = "https://files.pythonhosted.org/packages/05/0b/4240efeb672751ee5b9b380cb0e3fdc050bc05f68adc7a8aefc4fcd9a69a/httptools-0.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:cd96f29b4bab1d42fa6e3d008711c75e0f79e94e06827330160e3a304227f150", size = 90918, upload-time = "2026-05-25T22:17:15.155Z" }, + { url = "https://files.pythonhosted.org/packages/5e/e5/8cfcabc5546e8022f168be28bcdaa128a240a0befdd03b59d558b4f18bd6/httptools-0.8.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:614ceea8ea606848bece2338ac03b3ce5324bcb4be8dc7d377ed708012fa4db8", size = 205148, upload-time = "2026-05-25T22:17:16.333Z" }, + { url = "https://files.pythonhosted.org/packages/2a/0e/0fb14848c19a686c8062ff9067c1a48793e3224b47bc5b201535b6036fce/httptools-0.8.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2d689918c15a013c65ef52d9fd495d766893ab831a2c8d89f2ac5940a5df847c", size = 111368, upload-time = "2026-05-25T22:17:17.586Z" }, + { url = "https://files.pythonhosted.org/packages/2e/1b/46f1cecf06b9bbde8e4b8c88034ac7908989e5ff7a3a388ef38392949c1f/httptools-0.8.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:eb3028cca2fc0a6d720e52ef61d8ebb62fcbfeb1de56874546d858d3f25a26b7", size = 486447, upload-time = "2026-05-25T22:17:18.564Z" }, + { url = "https://files.pythonhosted.org/packages/77/00/258bfc0837221f81d9725c45f9b948a6a6b2994a147a4fb66e85100c668f/httptools-0.8.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:88bdd940f2b5d487b4d032c6afa5489a7dc4694410d43de3c38c4fb3af0dc45d", size = 482448, upload-time = "2026-05-25T22:17:19.912Z" }, + { url = "https://files.pythonhosted.org/packages/04/ab/d1cef3b5523f4d272a70f42a776c3169a2dddfe3a54de4b2ce4a36341528/httptools-0.8.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6a43c9dd399758ccc0531acb0a3c4a6c299ee893ee9400e9c893b7bdcfae0681", size = 464460, upload-time = "2026-05-25T22:17:20.882Z" }, + { url = "https://files.pythonhosted.org/packages/ce/48/5d1d072442277bb2b3434e0e60690b8e8c23840ef7de8b6ea54040a536d3/httptools-0.8.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:0770728beb05094c809b98e814edff5fef69d26ad7d21185f2f6d5884a0ba683", size = 471312, upload-time = "2026-05-25T22:17:22.085Z" }, + { url = "https://files.pythonhosted.org/packages/0d/66/b96623b27e51a68199ef4efdda0613cced9233fe3062ac74e50749c5ad37/httptools-0.8.0-cp313-cp313-win_amd64.whl", hash = "sha256:7685df791fad561384bfb139e77fde27a1ffd93134e016f95a0db424ffbf77b1", size = 90117, upload-time = "2026-05-25T22:17:23.074Z" }, + { url = "https://files.pythonhosted.org/packages/1a/12/fa3fbf5f9517b273edea2dc982aa82a8c634091e67c590792b729017bc6f/httptools-0.8.0-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:de242a49b5d18e0a8776e654e9f6bf6d89f3875a5c35b425a0e7ce940feb3fd6", size = 206183, upload-time = "2026-05-25T22:17:24.004Z" }, + { url = "https://files.pythonhosted.org/packages/30/fc/5e7c4cb443370f2090a3aba0453a07384d29ff66b7435bb90e77e1037599/httptools-0.8.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:159e9ab5f701ccd42e555a12f1ad8ff69702910fc1c996cf2bb66e5fcb7a231b", size = 112079, upload-time = "2026-05-25T22:17:25.216Z" }, + { url = "https://files.pythonhosted.org/packages/ba/53/771bd891eb0f236f32145d6a1775777ec85745f3cc983a1f23d1a3b8ddfe/httptools-0.8.0-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:c4a9f1707e4823d54dfec6c33fa3697d302aed536ed352a7ebb5a061ddb869d0", size = 481596, upload-time = "2026-05-25T22:17:26.186Z" }, + { url = "https://files.pythonhosted.org/packages/62/42/94e15bc68ce3d423243c45d7f1b0c7561f13844f97dc52ae23182fb65628/httptools-0.8.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d76ad7b951387e3632c8716a9bb03ac5b45c5f16119aa409db0459520887944e", size = 480865, upload-time = "2026-05-25T22:17:27.542Z" }, + { url = "https://files.pythonhosted.org/packages/1c/7c/fe2980fc03723272e30f135b62360b075f513dfe7cc73aef36c7f04012bd/httptools-0.8.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:a3b7387147361c3fd47a0bde763c5c91b5b4cd4dc9989b8ece84ff436c99843b", size = 463189, upload-time = "2026-05-25T22:17:28.546Z" }, + { url = "https://files.pythonhosted.org/packages/15/1b/47fc5fff68acd1bfa20b4734059c9a06cadb88119dcd5258b5b0d21d91c8/httptools-0.8.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:f256d6ce930c52ca1cb2a960b7da03548c454e7d28b06059ad41bfe789036ce0", size = 466610, upload-time = "2026-05-25T22:17:29.816Z" }, + { url = "https://files.pythonhosted.org/packages/60/bd/07b13c93ffd9bec9546e0d43f8e19378dd696dbd278511406bc07371ef1f/httptools-0.8.0-cp314-cp314-win_amd64.whl", hash = "sha256:19d1ee275bb59ba2643ba9a3a1e51cc0c788caf2b8df506368e03f56fdd08527", size = 92705, upload-time = "2026-05-25T22:17:31.133Z" }, + { url = "https://files.pythonhosted.org/packages/fd/c4/121648f68ce066d7bd762d6b6d97e620847642d38d54f3d90ff11d947629/httptools-0.8.0-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:de1ed58a974e75d56560acc7e7fed01a454994429456f65209789992e41f2568", size = 215023, upload-time = "2026-05-25T22:17:32.401Z" }, + { url = "https://files.pythonhosted.org/packages/b9/b0/312a062ae741ae3e8baa8c8bf20be81b2e67337b259ab4349bebc7b6142e/httptools-0.8.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:e93c227b595c6926c1acee96891dd9da4be338cfbe82e5cd3bb9d8dd7dc4ac0b", size = 117405, upload-time = "2026-05-25T22:17:33.742Z" }, + { url = "https://files.pythonhosted.org/packages/fc/37/fccd705f795386bb05bf413012fecff2a33e5aa8c2f069096de3e9fd8702/httptools-0.8.0-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:2a021c3a8e65cc125390d72f59b968afca3bdcaff25bd67965e0a055a14946ca", size = 558497, upload-time = "2026-05-25T22:17:34.732Z" }, + { url = "https://files.pythonhosted.org/packages/bd/39/f172e8003576de35f5ba77ff417cf0e34429d35dc014deef15afa337a72c/httptools-0.8.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:48774d39cbb70e2b1f71f88852a3087ae1d3a1eb80482bb48c13067ab080c14f", size = 571585, upload-time = "2026-05-25T22:17:35.813Z" }, + { url = "https://files.pythonhosted.org/packages/3e/b9/f5564760af99f3dbbf3f9104dc00e5da27e96cf433c6bdcf77617f70bf3f/httptools-0.8.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:88eead8ec8680a9f146c655bc88445a325bd7921cfd8194c7337e9467282427d", size = 543297, upload-time = "2026-05-25T22:17:37.08Z" }, + { url = "https://files.pythonhosted.org/packages/99/67/8d9f2c313618e161b82f3873188e7196126da1d6e29688df40eb3997c77a/httptools-0.8.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:2c032fa028f46871ec7e1fc59fc15e8023eab3e6bbe6ece786a1611719a5d081", size = 539535, upload-time = "2026-05-25T22:17:38.032Z" }, + { url = "https://files.pythonhosted.org/packages/48/63/b906c01e53f50d432c0defe43ce52764a111dc1bdd028bafbeb54dcfd008/httptools-0.8.0-cp314-cp314t-win_amd64.whl", hash = "sha256:384c17174464c8e873398b7af24f0b1f44d992c820328413951a625323155d77", size = 108209, upload-time = "2026-05-25T22:17:39.473Z" }, +] + +[[package]] +name = "httpx" +version = "0.28.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "certifi" }, + { name = "httpcore" }, + { name = "idna" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406, upload-time = "2024-12-06T15:37:23.222Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517, upload-time = "2024-12-06T15:37:21.509Z" }, +] + +[[package]] +name = "idna" +version = "3.18" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cd/63/9496c57188a2ee585e0f1db071d75089a11e98aa86eb99d9d7618fc1edce/idna-3.18.tar.gz", hash = "sha256:ffb385a7e039654cef1ab9ef32c6fafe283c0c0467bba1d9029738ce4a14a848", size = 196711, upload-time = "2026-06-02T14:34:07.794Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/5e/d4e9f1a599fb8e573b7b87160658329fbf28d19eac2718f51fc3def3aa5a/idna-3.18-py3-none-any.whl", hash = "sha256:7f952cbe720b688055e3f87de14f5c3e5fdaa8bc3928985c4077ca689de849a2", size = 65455, upload-time = "2026-06-02T14:34:06.319Z" }, +] + +[[package]] +name = "lxml" +version = "6.1.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/05/3b/aab6728cae887456f409b4d75e8a01856e4f04bd510de38052a47768b680/lxml-6.1.1.tar.gz", hash = "sha256:ba96ae44888e0185281e937633a743ea90d5a196c6000f82565ebb0580012d40", size = 4197430, upload-time = "2026-05-18T19:19:06.424Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6a/6e/c4add832b6fc1e887125b96f880d7b9b70aae5248718e046b1704bcac4b9/lxml-6.1.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:104c09bda8d2a562824c0e319d0768ce26a779b7601e0931d33b09b53c392ef7", size = 8570821, upload-time = "2026-05-18T19:17:42.068Z" }, + { url = "https://files.pythonhosted.org/packages/22/00/ff3009c88e65de8011630acf8ab5a09cb2becd2aaf47fba2f3449f6224e9/lxml-6.1.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:25c6997a9a534e016695a0ba06b2f07945de682731ff01065b6d5a4474179da1", size = 4624252, upload-time = "2026-05-18T19:17:47.897Z" }, + { url = "https://files.pythonhosted.org/packages/42/95/bb63f0fd62e554fe078e1fb3c8fe9083c14ddc7ad7fa178d10e57e071ac7/lxml-6.1.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c921ba5c51e4e9f63b8b00267d06566e1f63407408a0496da2d1d0bfc819c7fc", size = 4930746, upload-time = "2026-05-18T19:18:29.637Z" }, + { url = "https://files.pythonhosted.org/packages/eb/99/0013e8d9b5960f4f041cf0b73e2f80c23eb5205b1f7bfb20203243651359/lxml-6.1.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:54a7f95e4de5fb94e2f9f4b9055c6ba33bf3d628fd77a1d647c5923caa2cdcdc", size = 5093723, upload-time = "2026-05-18T19:18:34.168Z" }, + { url = "https://files.pythonhosted.org/packages/29/91/317b332636bfc7bddcff828d41b3307f50043f4b237e40849c333d80fa1a/lxml-6.1.1-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:96f2ec43df44b1f76249ee0a615334f9b5b060e1c8bd90e706dad2d14d02f383", size = 5005557, upload-time = "2026-05-18T19:18:39.798Z" }, + { url = "https://files.pythonhosted.org/packages/42/2f/cc9bf06afe70f9c9093ae60855d9759da9db601ec4080f7473319666ffd7/lxml-6.1.1-cp312-cp312-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:70ef8a7e102a1508f8121aae5b0867abd663f72c14f0a9c937e6554cb4587b7b", size = 5631036, upload-time = "2026-05-18T19:18:44.858Z" }, + { url = "https://files.pythonhosted.org/packages/08/f6/af32e23e563971ffb0fb86be52bc5be5c2c118858ffc119bf6a9039b173d/lxml-6.1.1-cp312-cp312-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ebe6af670449830d6d9b752c256a983291c766a1365ba5d5460048f9e33a7818", size = 5240367, upload-time = "2026-05-18T19:18:49.217Z" }, + { url = "https://files.pythonhosted.org/packages/78/83/8555d40948b09ce86f1bd0c68a7ac31d07b1929f92cc1b074006c97ef2d2/lxml-6.1.1-cp312-cp312-manylinux_2_28_i686.whl", hash = "sha256:27acc820660aaffa4f7c087f29120e12980f7779d56d8492d263170111284740", size = 5350171, upload-time = "2026-05-18T19:18:52.779Z" }, + { url = "https://files.pythonhosted.org/packages/63/75/5d92da93729b7bad783689e6496049fa40927b45bec7bf183c981de3ca70/lxml-6.1.1-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:1db753c9115ec7100d073b744d17e25e88a8f90f5c39b2f5dd878149af59671f", size = 4694874, upload-time = "2026-05-18T19:18:55.139Z" }, + { url = "https://files.pythonhosted.org/packages/c5/b5/3aad415a9a25b822e783f15deeb4dffccf5113030f1afa2222dd929313d9/lxml-6.1.1-cp312-cp312-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c4f469aebd783bb741c2ecb2a681008fd26bfe5c16a9a72ed5467f834e810df2", size = 5244492, upload-time = "2026-05-18T19:19:01.28Z" }, + { url = "https://files.pythonhosted.org/packages/f1/a1/5fcf7eb9904b80086aa47dcf0027de07b1bb990afad2e6823144c368ae04/lxml-6.1.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:766b010012d59470072c1816b5b6c69f1d243e5db36ea5968e94accf430a4635", size = 5048232, upload-time = "2026-05-18T19:18:12.67Z" }, + { url = "https://files.pythonhosted.org/packages/77/74/1f601b63c7a69fcdf10fa9b148c81da8442204194f6c55509cc485c786b9/lxml-6.1.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:b8d812c6011c08b8111a15e54dd990b8923692d80adf35488bee34026c35accf", size = 4777023, upload-time = "2026-05-18T19:18:15.928Z" }, + { url = "https://files.pythonhosted.org/packages/a2/b9/7a78f51aec95b1bf780d78e12705a9f6533284f8693dc5c0e6724fa53d3f/lxml-6.1.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:fe0306bd29505a9177aac19f1877174b0e7422c222a59f70b2cd41633448c3dc", size = 5645773, upload-time = "2026-05-18T19:18:23.223Z" }, + { url = "https://files.pythonhosted.org/packages/a5/6e/98a7b7ad54e4e74fa1f20fff776913980619d0ebe5558232d7da6580bdd8/lxml-6.1.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:5ba186ad207446c65d3bb3d3e0412b032b1d9f595e59861e2354798c5703d955", size = 5233088, upload-time = "2026-05-18T19:18:31.433Z" }, + { url = "https://files.pythonhosted.org/packages/65/d1/bc0ed2427bf609f2ee10da303a6a226f9c8bce94f945dc29a32ce55de6e4/lxml-6.1.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:aa366a1e55b8ebfe8ca8ddc3cfe75c8ebade181aeb0f661d0cb05986b647f72a", size = 5260995, upload-time = "2026-05-18T19:18:37.091Z" }, + { url = "https://files.pythonhosted.org/packages/69/8b/6772e1a4b513fc50a8d931f19edde0e13ae6918510a1e13ff67864f3e5ed/lxml-6.1.1-cp312-cp312-win32.whl", hash = "sha256:126c93f7f56f0eda92f6d8c619edc463a4f23d9252f1c9d0405a76f25fa9f11a", size = 3596382, upload-time = "2026-05-18T19:17:18.37Z" }, + { url = "https://files.pythonhosted.org/packages/1b/89/45198e9624762af2dfd2cb8782598477ceb29f6e59caab560388ae1f4ec1/lxml-6.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:26e6eda8d38c1fcab1090dd196ee87cbd13788e531937610e2589085de074e77", size = 3997255, upload-time = "2026-05-18T19:17:56.781Z" }, + { url = "https://files.pythonhosted.org/packages/90/a9/7a54b6834088d9ae528a7b780584ba6a39a9457b0ac330479f20ffbc9449/lxml-6.1.1-cp312-cp312-win_arm64.whl", hash = "sha256:6540377fbd53fe1b629172288c464fb18db11ce1fa7dc15891da10aa9dcc3e7f", size = 3659610, upload-time = "2026-05-19T19:22:50.843Z" }, + { url = "https://files.pythonhosted.org/packages/a5/eb/7e6f37c5584ccbb2ff267f56fd0339016938c1c8684cfefab9b33ffc2f36/lxml-6.1.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:68a9198d0fc122d14bb76837de9aa80cf84caed990b5b237f532ed87d3706736", size = 8559780, upload-time = "2026-05-18T19:17:57.661Z" }, + { url = "https://files.pythonhosted.org/packages/a1/36/587c2521cf23a2cd6c9c22108aa7528f683a1f195ed7ccd23a4b1786ad36/lxml-6.1.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7d47866cb32fb503450b6edc9df355d10dc49836af2e89901bd6ac6b0896d9d9", size = 4618006, upload-time = "2026-05-18T19:18:04.452Z" }, + { url = "https://files.pythonhosted.org/packages/6e/ca/ab7bfe2bf4c972af5e7878262845ead3a24a929a9b04bc11c7c1ece6c82a/lxml-6.1.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:eb7c9811bfaa8b1ed5ed319f5d370dfbcaa59d52ea64be2a5a85e18195930354", size = 4924139, upload-time = "2026-05-18T19:19:04.873Z" }, + { url = "https://files.pythonhosted.org/packages/6b/55/a0c72851dfee5ecc689f949723a73dea457758912542cb955b108eaf0d8f/lxml-6.1.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:762ff394d5bd56da0cf034a23dcce4e13923f15321a2adfa2ac00201dc6d3fca", size = 5082329, upload-time = "2026-05-18T19:19:09.728Z" }, + { url = "https://files.pythonhosted.org/packages/f0/b6/0608f7d61a3b96cc67e5648a3d906e31a5082093e10e7be65b3886289938/lxml-6.1.1-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a088f287f7d8275a33c07f2cac6c50b9319309a0200a39e7e75d80c707723099", size = 4993564, upload-time = "2026-05-18T19:19:13.608Z" }, + { url = "https://files.pythonhosted.org/packages/4c/66/ae227524b066d29d55bf0b453d93d2d793c40218657d643dcbbca13b8faf/lxml-6.1.1-cp313-cp313-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e902da4b04e6b52e5893900d4b8ab46068f75f3561f01bf1080957f9fd932ed6", size = 5613467, upload-time = "2026-05-18T19:19:16.228Z" }, + { url = "https://files.pythonhosted.org/packages/a6/76/dbe4a00b50385e40194231dcfe5a12c059de7cf90e89c83407d2b085b719/lxml-6.1.1-cp313-cp313-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1d4962d4c66bf830a7e59ed6cfc17d148149898a3aefa8ec6e59763e6e3ed085", size = 5228304, upload-time = "2026-05-18T19:19:19.354Z" }, + { url = "https://files.pythonhosted.org/packages/1c/01/00b1b8442ed2041793336868ba0b9ea4b13d7da7c085c6404c207a63bf79/lxml-6.1.1-cp313-cp313-manylinux_2_28_i686.whl", hash = "sha256:581d4c8ae690a6609e64862dd6b7c2489635c2d13907fc2b20f2bc200ff1d21e", size = 5341607, upload-time = "2026-05-18T19:19:22.297Z" }, + { url = "https://files.pythonhosted.org/packages/63/36/1ad29931e9a4638bb707869f01d423a6c815f82152138d1a40dfcfde2b95/lxml-6.1.1-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:876e1ff5930ed8bf295ec5ef9a8155e9b6b1876bbf1deed8b3a8069311875a8f", size = 4700168, upload-time = "2026-05-18T19:19:25.133Z" }, + { url = "https://files.pythonhosted.org/packages/3c/d1/a9536cecf9be18a0dc72d32bead283a2332d1ffebd2dd3ac70ce444686e5/lxml-6.1.1-cp313-cp313-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:9eb9b5a968f6e0f6d640092a567e14529ff8cea2e29d00da6f78a79fa49f013c", size = 5232487, upload-time = "2026-05-18T19:19:28.603Z" }, + { url = "https://files.pythonhosted.org/packages/0e/77/b4fb1e03bf5d130e879214d3100092e386418807fb74dd0adc4b0a48f351/lxml-6.1.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:aa49e06d94aba782c6a02eecb7e507969e7e7a41b267f1b359bb35585f295d5b", size = 5044231, upload-time = "2026-05-18T19:18:42.246Z" }, + { url = "https://files.pythonhosted.org/packages/26/4c/d00daeeb0a5530c4028a9232aa1b93db3ef4ed2158c116ea73c79a9765b3/lxml-6.1.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:70cdfd80589d59e43e18005dd7244e8895e93db8ab6a620b7e23df5445a4e3d2", size = 4769450, upload-time = "2026-05-18T19:18:48.013Z" }, + { url = "https://files.pythonhosted.org/packages/ed/6a/715a3a8d156ce42f29cf014706f5410c2ff3b02267774110fc23266409fe/lxml-6.1.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:aad9aa39483ed8ec44d6d2e59e5b98a0d80676ef0d92f44bfc374836111f62f5", size = 5635874, upload-time = "2026-05-18T19:18:51.914Z" }, + { url = "https://files.pythonhosted.org/packages/45/37/0544bc21dde2a88f3a17b504e6fc79c0e01d25a33c2f6079724e9e72b9c7/lxml-6.1.1-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:d49514be2f28d895c38cf9d2b72d7b9a07d00314519f456c0b50b53cfcf4c785", size = 5223987, upload-time = "2026-05-18T19:18:59.715Z" }, + { url = "https://files.pythonhosted.org/packages/4d/f8/f6a5e8185bcb28c2befae3d31f8e3df3b811cb0f47746517a81279fcafe1/lxml-6.1.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:47402e62c52ff5988c1e8c6c63177f5708bccf48e366dea4e3dcf1e645e04947", size = 5250276, upload-time = "2026-05-18T19:19:03.834Z" }, + { url = "https://files.pythonhosted.org/packages/c7/f2/1a2b9f1b7a49d45495369be7ef9ad05b262930f2eab3e3145706fca8083f/lxml-6.1.1-cp313-cp313-win32.whl", hash = "sha256:3483644525531e1d5762b0c44a8e18b6efba321b6dcf8a8952de10b037618bca", size = 3596903, upload-time = "2026-05-18T19:17:29.863Z" }, + { url = "https://files.pythonhosted.org/packages/e6/99/f4ffb024f238eec2131aaa09f3278fb6129cf892741bf68e1fc1afb8c100/lxml-6.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:a10bd2fd62e8ce916ececb342f348f190724a098c1faa056fdfb2a22ad5e8660", size = 3995869, upload-time = "2026-05-18T19:18:02.596Z" }, + { url = "https://files.pythonhosted.org/packages/d1/53/70eb8c5c6037f27448f1e3c54ebede9545a801ae63f0a7254afca4fe8e45/lxml-6.1.1-cp313-cp313-win_arm64.whl", hash = "sha256:424aa57aca0897eb922aef34395bd1289b3b6f04e6bae20ea123c0c7e333cffc", size = 3658490, upload-time = "2026-05-19T19:22:53.846Z" }, + { url = "https://files.pythonhosted.org/packages/13/e2/2e325795566de01d0d7c3bb57d3c370616b2d07b01214e84eec5d3b10963/lxml-6.1.1-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:19b7ab10b210b0b3ad7985d9ac4eb66ab09a90b20fe6e2f7ba55d01a234345d0", size = 8577146, upload-time = "2026-05-18T19:18:17.765Z" }, + { url = "https://files.pythonhosted.org/packages/93/cf/5630b5e4be7d2e6bee8efe83865c925221103cf0221303b104ce134b01e2/lxml-6.1.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:c08e5c694306507275f2290073350c4f32e383db15213b2c69e7ff39c1193840", size = 4623866, upload-time = "2026-05-18T19:18:30.669Z" }, + { url = "https://files.pythonhosted.org/packages/d2/51/3904907c063451cf8d4a5c9fe0cad95fa1f4ec57f4e3884fa0731bd7a305/lxml-6.1.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:74a9717fd0d82effef5c2854f0d917231d5324b5a3eb7275c43ac9fa32f97a14", size = 4950022, upload-time = "2026-05-18T19:19:31.958Z" }, + { url = "https://files.pythonhosted.org/packages/94/cd/9c7611a51c37a2830928405817cc5d56a97f64fab83cc3f628748b135749/lxml-6.1.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:efe0374196335f93b53269acd811b944f2e6bdc88e8894f214bd636455484909", size = 5086695, upload-time = "2026-05-18T19:19:34.764Z" }, + { url = "https://files.pythonhosted.org/packages/da/d6/24e3b5906abb0b674ff2ae195bc3ce59708df2bcd17cf17703b2d7dd643a/lxml-6.1.1-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ac931cdc9442c1763b8a8f6cd62c0c938737eafc5be75eff88df55fc73bc0d00", size = 5031642, upload-time = "2026-05-18T19:19:37.771Z" }, + { url = "https://files.pythonhosted.org/packages/2d/db/6ec54f99019838bff54785c51da07f189eb4676861c5f2730962b0d8d665/lxml-6.1.1-cp314-cp314-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:aee395f5d0927f947758b4ec119fd5fc8ec71f07a1c5c52077b30b04c0fa6955", size = 5647338, upload-time = "2026-05-18T19:19:40.553Z" }, + { url = "https://files.pythonhosted.org/packages/42/3d/ef4dcfffd22d27a61805d8ed9f7fb888495bc6aa88648fa07c1eaa5586b6/lxml-6.1.1-cp314-cp314-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9395002973c827b3ed67db77e6ec09f092919a587022174554096a269378fb13", size = 5239528, upload-time = "2026-05-18T19:19:43.657Z" }, + { url = "https://files.pythonhosted.org/packages/62/bb/37fb3f0dff146bdcfa78eec47879273820b2a0bf350ec236ce14bd0b1c26/lxml-6.1.1-cp314-cp314-manylinux_2_28_i686.whl", hash = "sha256:73bc2086f141224ebddb7fc5c6a36ca58b31b94b561e1dfe8e073e3270fad1e7", size = 5350730, upload-time = "2026-05-18T19:19:46.307Z" }, + { url = "https://files.pythonhosted.org/packages/90/42/43253f168388df4fae1f38c01df36ddb9bee39e2048167b54cdcbae85ea3/lxml-6.1.1-cp314-cp314-manylinux_2_31_armv7l.whl", hash = "sha256:3779def59032b81e44a5f70096ef6bf2082f8d901937dca354474ba09782e245", size = 4697530, upload-time = "2026-05-18T19:19:49.889Z" }, + { url = "https://files.pythonhosted.org/packages/eb/a8/c5a8504f81bbdfc8e7094c2c850cdb4ed6777fc4d5ddd9e5ab819f3b0d54/lxml-6.1.1-cp314-cp314-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:86c89b9d55ebf820ad7c90bc533410f0d098054f293351f10603c0c46ff598f5", size = 5250670, upload-time = "2026-05-18T19:19:53.199Z" }, + { url = "https://files.pythonhosted.org/packages/77/b7/c7e76ab18744d75e21f320ebf9ff9d1ceae2b54dd431ea5a64caf26c9672/lxml-6.1.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:19607c6bbff2a44cf3fe8250abccd20942d3462473e0a721d01d379ed017e462", size = 5084485, upload-time = "2026-05-18T19:19:08.422Z" }, + { url = "https://files.pythonhosted.org/packages/31/31/b35c53f8ef7b7c31cacd23d3638652fff7bcd1deb6eedb709ab43b685908/lxml-6.1.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:c6ed5141a5c7507cf3ee76bd363b0d6f801e3321adc35b5d825a23115faa5465", size = 4737635, upload-time = "2026-05-18T19:19:12.321Z" }, + { url = "https://files.pythonhosted.org/packages/d9/06/31f23c813a7fe8e0cb1b175e915b08c9bf4e86d225b210feadbdbe519667/lxml-6.1.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:62aeb7e85b5d60320b9d77eef2e773994e2c0ce10121b277e0a19804e1654a5a", size = 5670681, upload-time = "2026-05-18T19:19:15.001Z" }, + { url = "https://files.pythonhosted.org/packages/1a/bc/ce619bccc89b1fd9ad8a8e1330ee3f3beff9f2ff95b712d7bbcdd6e22fc3/lxml-6.1.1-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:b1b963fd8f5caa68e99dfae060d54de1fe9cba899b8718b44a00cdca53c3e590", size = 5238229, upload-time = "2026-05-18T19:19:18.131Z" }, + { url = "https://files.pythonhosted.org/packages/2f/5d/b329acbbedc0b619ebc2be6cf7ee9ed07e80892c88d4dfd612c33805789a/lxml-6.1.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:63876be28efefa04a1df615b46770e82042cce445cfdce55160522f57b231ccb", size = 5264191, upload-time = "2026-05-18T19:19:21.118Z" }, + { url = "https://files.pythonhosted.org/packages/d6/85/be36fb1425b30db3c3f9df75fe86343ebffb79e6320bd7f588e25bfeac39/lxml-6.1.1-cp314-cp314-win32.whl", hash = "sha256:7f7a92e8583f06b1fd49d01158143b8461cfcd135dcb10ec807270a3051bd603", size = 3657202, upload-time = "2026-05-18T19:17:39.509Z" }, + { url = "https://files.pythonhosted.org/packages/b8/ce/3cf9a827342269f54d405a6202397de63f07c69cbd6ce7d183a3f0cba1e9/lxml-6.1.1-cp314-cp314-win_amd64.whl", hash = "sha256:b2d444f2e66624d68e9c6b211e28a76e22fff5fcabcfff4deac18b529b7d4137", size = 4064497, upload-time = "2026-05-18T19:18:14.662Z" }, + { url = "https://files.pythonhosted.org/packages/d9/3e/1a957bde8f0760039e627f94699f82caa782c9d838d86c3d28245ee67212/lxml-6.1.1-cp314-cp314-win_arm64.whl", hash = "sha256:3fd9728a2735fda14f4e8235830c86b539e9661e849665bf926d3f867943b4bf", size = 3741991, upload-time = "2026-05-19T19:22:59.111Z" }, + { url = "https://files.pythonhosted.org/packages/78/b2/00ed55b3a2efa4658fb795c38d1090ec9b3e8a6c3683d4441fa517f09c3b/lxml-6.1.1-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:787b2496d0dbe8cd180984e8d29e3a6f76e7ea34db781cb3bd55e4ba1ef8b4ee", size = 8827545, upload-time = "2026-05-18T19:18:41.193Z" }, + { url = "https://files.pythonhosted.org/packages/c0/73/74573db19baa618d5f266f2407898b087ff6927115b00b71e5fc1b700847/lxml-6.1.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:2c8daa471358dc2d6fcf02165e80ec68f77871a286df95bc5cc3816153b0fd2c", size = 4735736, upload-time = "2026-05-18T19:18:46.761Z" }, + { url = "https://files.pythonhosted.org/packages/16/02/6f7061f4f95f51e545d48e87647c54791d204a4e881be4156e7a26ba5338/lxml-6.1.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:acd7d70b64c0aae0c7922cca83d288a16f5f6da523637697872253415269baef", size = 4970291, upload-time = "2026-05-18T19:19:56.215Z" }, + { url = "https://files.pythonhosted.org/packages/b0/02/55fc057d8283427dea7d6edb102e7a840239c77a64a983d92f62a304c0e9/lxml-6.1.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4f0dd2f01f9f8a89f565d000e03abcf0a13d692a346c8d22f628d49af098777a", size = 5102822, upload-time = "2026-05-18T19:19:59.223Z" }, + { url = "https://files.pythonhosted.org/packages/e4/48/8e1cf78d89d66850121d9255a2a24414c98f775da93b90cf976956c24b14/lxml-6.1.1-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0b7e8a14c8634bf6f7a568634cb395305a6d964aeb5b7ee32248094bed3a7e2c", size = 5027923, upload-time = "2026-05-18T19:20:01.549Z" }, + { url = "https://files.pythonhosted.org/packages/ed/00/0632a0647612c8af24d26997b3b961397daa9d5b2581444805933629a4cb/lxml-6.1.1-cp314-cp314t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:86281fbdd6a8162756f8d603f37e3435bfa38043adb79c6dc6a2dfee065e7525", size = 5595843, upload-time = "2026-05-18T19:20:03.93Z" }, + { url = "https://files.pythonhosted.org/packages/bc/86/ab008a7dc360711b66858d61c80a5979a70a09f2aa2b05d9698df80b803d/lxml-6.1.1-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c5d7152ec39ca7c402d8fb9bad86140a15b9503bd0c54484e3f1bbe3dd37ceca", size = 5224515, upload-time = "2026-05-18T19:20:06.381Z" }, + { url = "https://files.pythonhosted.org/packages/75/c6/2702ff375e728e34f56d9a45339a9cf7e4427e917f542225242d63a05afa/lxml-6.1.1-cp314-cp314t-manylinux_2_28_i686.whl", hash = "sha256:88d8cb75b9d82858497a5393e3c63cfbf03035225e4b35a49ed7ccb151e4dc0e", size = 5312511, upload-time = "2026-05-18T19:20:09.308Z" }, + { url = "https://files.pythonhosted.org/packages/b7/57/a5807c98f87a86f10ef9ffab35516df7c0f0c4b6d5d33e9f608ab9c04a31/lxml-6.1.1-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:f64ec5397ea6a41fc1b4af0380d79b44a755b5531dcaccd9940fb260dca93038", size = 4639206, upload-time = "2026-05-18T19:20:11.704Z" }, + { url = "https://files.pythonhosted.org/packages/1f/e1/8a0a2c35734812395f4da4eaf33748a7e5705bfb2a58b128da764339d5ec/lxml-6.1.1-cp314-cp314t-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d34bbf07dbc7ca5970671b1512e928991fb5e9d95365636c9b2d8b4f53af405e", size = 5232404, upload-time = "2026-05-18T19:20:14.064Z" }, + { url = "https://files.pythonhosted.org/packages/c2/e2/0e6a4dd5ad84d01d99aa7bae7cfefd4a760a0e0f8176818241de17d9b6c0/lxml-6.1.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:17e0e18d4ad8adbd0399291bc44845b69d9dd68439a3cdebdf35ff902ec05072", size = 5083769, upload-time = "2026-05-18T19:19:23.758Z" }, + { url = "https://files.pythonhosted.org/packages/a0/7e/161f33d463f6ffc1c7679104b65086dea120080d49dde4d238f015aaee2f/lxml-6.1.1-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:3ab541146f1f6968c462d6c2ac495148e8cdba2f8347700b2141b6ec5a75bf52", size = 4758936, upload-time = "2026-05-18T19:19:27.256Z" }, + { url = "https://files.pythonhosted.org/packages/f1/fb/2369825e3f6ca99305bf9f7b7085fda91c8b0922a89e54d900974aa3ef85/lxml-6.1.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:2a0217714657e023ef4293500f65aa20fce6164c8fd6b08fa5bd4a859fb14b9b", size = 5620296, upload-time = "2026-05-18T19:19:29.993Z" }, + { url = "https://files.pythonhosted.org/packages/30/90/d61e383146f74c5ab683947ea14dc7b82778838ab9b95ea73a23b60d0191/lxml-6.1.1-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:05a82eb6e1530a64f26225b55cbd178113bd0b5af1c2b625f25e5296742c26d2", size = 5228598, upload-time = "2026-05-18T19:19:33.523Z" }, + { url = "https://files.pythonhosted.org/packages/76/2d/2dafd8149e94b05bb070690efd5bb2680720681e03ff03fc57d2b70a1105/lxml-6.1.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:9e36f163528fc50cbef305f02a5fd66d404edf7049cdaff211dbc2cba5a7013e", size = 5247845, upload-time = "2026-05-18T19:19:36.649Z" }, + { url = "https://files.pythonhosted.org/packages/ce/68/b30e913340c380ddac9580c6e6230991fc37240ec4f64704833e4f3e2769/lxml-6.1.1-cp314-cp314t-win32.whl", hash = "sha256:649dda677cf3bd6ac9ae14007ba0c824ded8ce5808b53fc7431d9140399118c1", size = 3897345, upload-time = "2026-05-18T19:17:33.562Z" }, + { url = "https://files.pythonhosted.org/packages/3c/4e/9eb2af5335545f9fbcd7af57bcf87c6025d31eaa31b14ec184a6c8675328/lxml-6.1.1-cp314-cp314t-win_amd64.whl", hash = "sha256:793033d6c5cdf33a573f910d9bea14ef8f5771820411d118da8e1182edb53d5e", size = 4393350, upload-time = "2026-05-18T19:18:10.076Z" }, + { url = "https://files.pythonhosted.org/packages/7f/2c/0f1e93c636720e8a3eb59af2bfda99d98b55891e1c53bc30c2e0e865f01b/lxml-6.1.1-cp314-cp314t-win_arm64.whl", hash = "sha256:58bb955caba94e467d2a96da17660d2d704e0675894cba21ab8a775b8621fd1c", size = 3817223, upload-time = "2026-05-19T19:22:56.823Z" }, +] + +[[package]] +name = "medarchive" +version = "0.1.0" +source = { virtual = "." } +dependencies = [ + { name = "fastapi" }, + { name = "google-genai" }, + { name = "numpy" }, + { name = "openpyxl" }, + { name = "pdfplumber" }, + { name = "psycopg", extra = ["binary"] }, + { name = "pydantic" }, + { name = "pymupdf" }, + { name = "python-docx" }, + { name = "python-multipart" }, + { name = "rapidfuzz" }, + { name = "uvicorn", extra = ["standard"] }, + { name = "xlrd" }, +] + +[package.metadata] +requires-dist = [ + { name = "fastapi", specifier = ">=0.115" }, + { name = "google-genai", specifier = ">=1.0" }, + { name = "numpy", specifier = ">=2.0" }, + { name = "openpyxl", specifier = ">=3.1" }, + { name = "pdfplumber", specifier = ">=0.11" }, + { name = "psycopg", extras = ["binary"], specifier = ">=3.2" }, + { name = "pydantic", specifier = ">=2.9" }, + { name = "pymupdf", specifier = ">=1.24" }, + { name = "python-docx", specifier = ">=1.1" }, + { name = "python-multipart", specifier = ">=0.0.12" }, + { name = "rapidfuzz", specifier = ">=3.10" }, + { name = "uvicorn", extras = ["standard"], specifier = ">=0.32" }, + { name = "xlrd", specifier = ">=2.0" }, +] + +[[package]] +name = "numpy" +version = "2.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/05/3d27272d30698dc0ecb7fdfaa41ad70303b444f81722bb99bce1d818638a/numpy-2.5.0.tar.gz", hash = "sha256:5a129578019311b6e56bdd714250f19b518f7dceeeb8d1af5490f4942d3f891c", size = 20652461, upload-time = "2026-06-21T20:57:51.95Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fa/0a/11486d02add7b1384dff7374d124b1cfbb0ee864dcc9f6a2c0380638cf84/numpy-2.5.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:489780423903667933b4ed6197b6ec3b75ea5dd17d1d8f0f38d798feb6921561", size = 16789987, upload-time = "2026-06-21T20:56:16.657Z" }, + { url = "https://files.pythonhosted.org/packages/55/b2/285f48640a181947b4587a3766d21ec1eaa7fea833d4b49957e09da467a2/numpy-2.5.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ece55976ced6bca95a03ae2839e2e5ccffe8eb6a3e7022415645eb154a81e4e6", size = 11760322, upload-time = "2026-06-21T20:56:19.813Z" }, + { url = "https://files.pythonhosted.org/packages/dd/67/b032db1eb03ca30d16eda3b0c22aaa615338b9263c2fd559d0f29451aca4/numpy-2.5.0-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:c83b664b0e6eee9594fa920cf0639d8af796606d3fad6cc70180c87e4b97c7be", size = 5319605, upload-time = "2026-06-21T20:56:22.173Z" }, + { url = "https://files.pythonhosted.org/packages/b9/83/03fc7300c7c6b6c84c487b1dc80d322817b95fbd1f4dd57a85e23b7198de/numpy-2.5.0-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:bf80333980bf37f523341ddd72c783f39d6829ec7736b9eb99086388a2d52cc2", size = 6653628, upload-time = "2026-06-21T20:56:23.914Z" }, + { url = "https://files.pythonhosted.org/packages/82/49/2ec21730bc63ccfda829323f7040a8ed4715b3852ce658689cf74ee96a8c/numpy-2.5.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a1a4874217b36d5ac8fc876f52e39df56f8182c88463e9e2dceabf7ca8b7efb8", size = 15153691, upload-time = "2026-06-21T20:56:25.631Z" }, + { url = "https://files.pythonhosted.org/packages/bb/6b/f4a3d0637692c49da8ef99d72d52526f92e0a8d6ac4f0ca9f31441b9d9ea/numpy-2.5.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:aaa760137137e8d3c920d27927748215b56014f92667dc9b6c27dfc61249255a", size = 16660066, upload-time = "2026-06-21T20:56:28.009Z" }, + { url = "https://files.pythonhosted.org/packages/3a/2f/c354ec86d1f3f5c19649463b0d39652e160736e5b0a4cd18dff0576715c4/numpy-2.5.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7174ce8265fc7f7417d171c9ea8fe905220748893ea67a2a7abe726ec331c4b0", size = 16514638, upload-time = "2026-06-21T20:56:30.26Z" }, + { url = "https://files.pythonhosted.org/packages/06/34/43efdcb319988648580f93c11f1ae82cf7e2faa74925e98e454ae3aa95f8/numpy-2.5.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b8c3daaf99de52415d20b42f8e8155c78642cb04207d02f9d317a0dcf1b3fb54", size = 18419647, upload-time = "2026-06-21T20:56:32.41Z" }, + { url = "https://files.pythonhosted.org/packages/71/e2/f5d1676b1d7fb682eb5e9a1641e7ebd2414b3216c370661d1029778908b4/numpy-2.5.0-cp312-cp312-win32.whl", hash = "sha256:6206db0af545d73d068add6d992279145f158428d1da6cc49adc4b630c5d6ee5", size = 6056688, upload-time = "2026-06-21T20:56:34.657Z" }, + { url = "https://files.pythonhosted.org/packages/8f/7c/48f115d1c58a34032facebcd51fdf2d02df2c51d4a46a81dd1197bb2ea6b/numpy-2.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:6f2d6873e2940c860a309d21e25b1e69af6aaffdd80aa056b04c16380db1c4f2", size = 12419237, upload-time = "2026-06-21T20:56:36.24Z" }, + { url = "https://files.pythonhosted.org/packages/86/26/2e0882f4044d1b1a1b63e875151fb2393389032022a8b7f5657a7996d3b2/numpy-2.5.0-cp312-cp312-win_arm64.whl", hash = "sha256:a55e1eb2bca2cfd17a16b213c99dfc8502d47b0d494224d2122277d0400935ca", size = 10339912, upload-time = "2026-06-21T20:56:38.733Z" }, + { url = "https://files.pythonhosted.org/packages/8a/33/07675aaad7f26ea013d5e884d9a0d784b79c6bd7566c333f5a52fa3c610b/numpy-2.5.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:520e6b8be0a4b65840ac8090d4f51cef4bed66e2b0894d5a520f099adc24a9b2", size = 16784890, upload-time = "2026-06-21T20:56:40.799Z" }, + { url = "https://files.pythonhosted.org/packages/85/4b/953118a730ee3b35e28645e0eb4cf9beec5bdbb954e1ac2f5fcefba6bbc3/numpy-2.5.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:146b81cdd3967fdb6beca8ba25f00c58741d8f3cbd797f55af0fbe0bfec3469c", size = 11754584, upload-time = "2026-06-21T20:56:43.094Z" }, + { url = "https://files.pythonhosted.org/packages/44/9b/56dd530c367c74ae17411027cea4135ca57e1e0583bf5594cee18bd83217/numpy-2.5.0-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:126b88d95e8ff9b00c9e717aa540469f21d6180162f84c0caec51b16215d49cd", size = 5313904, upload-time = "2026-06-21T20:56:45.503Z" }, + { url = "https://files.pythonhosted.org/packages/ce/b0/bcd672edad27ecca7da1f7bb0ce72cd1706a4f2d79ae94990afc97c13e1c/numpy-2.5.0-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:d4313cef1594c5ce46c31b6e54e918338f63f16ee9322304e8c9114d6d81c8bd", size = 6648504, upload-time = "2026-06-21T20:56:47.567Z" }, + { url = "https://files.pythonhosted.org/packages/80/9e/15cdfcbd30a1544a46c9e487a00df331c4672450216538705a9e51fa6710/numpy-2.5.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:750fb097caf26fa878746d9d119f6f9da12dedcbff1eea966c3e3447647c4a9e", size = 15150086, upload-time = "2026-06-21T20:56:49.352Z" }, + { url = "https://files.pythonhosted.org/packages/32/4e/8d7656ccaab3e81e97258b8a9bc5f0c8502513a92fb4ceb0a2cbfebc17bf/numpy-2.5.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3893adc2dc7c0412ba76777db55a049215d99c9aa3113003be8f49f4f1290ab9", size = 16647250, upload-time = "2026-06-21T20:56:51.542Z" }, + { url = "https://files.pythonhosted.org/packages/3c/81/97060281b602ed07f21b12f4ec409eac1f75a2f91fbc829ed8b2becf3ad4/numpy-2.5.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:835e454dd99b238cdc5a3f63bce2371296f5ebc53ca1e0f8e6ddbb6d92a29aab", size = 16512864, upload-time = "2026-06-21T20:56:55.401Z" }, + { url = "https://files.pythonhosted.org/packages/33/ab/4496208146911f8d8ddb54f68a972aafa6c8d44babcb2ea03b0e5cc87c9d/numpy-2.5.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6f9836778081a0a3c02a6a21493f3e9f5b311f8d2541934f31f05583dc999ea4", size = 18408407, upload-time = "2026-06-21T20:56:57.75Z" }, + { url = "https://files.pythonhosted.org/packages/d4/9f/a4df67c181e4ee8b467aa3332dc2db10fd5c515136831302f3ca48bc0a01/numpy-2.5.0-cp313-cp313-win32.whl", hash = "sha256:0b525be4744b60bb0557ac872d53ef07d085b5f39622bc579c98d3809d05b988", size = 6054431, upload-time = "2026-06-21T20:57:00.016Z" }, + { url = "https://files.pythonhosted.org/packages/30/53/491e1c47c55b62ccc6a63c1c5b8635c73fc2258dddeb9bda27cae4a0ae96/numpy-2.5.0-cp313-cp313-win_amd64.whl", hash = "sha256:44353e2878930039db472b99dc353d749826e4010bd4d2a7f835e94a97a5c748", size = 12414420, upload-time = "2026-06-21T20:57:01.815Z" }, + { url = "https://files.pythonhosted.org/packages/eb/4a/25c2906f541e9d9f4c5769764db732e6627be91a13f4724fa10634d77db4/numpy-2.5.0-cp313-cp313-win_arm64.whl", hash = "sha256:48f54b00711f83a5f796b70c518e8c2b3c5848dda03a54911f23eb68519b9b60", size = 10339533, upload-time = "2026-06-21T20:57:03.961Z" }, + { url = "https://files.pythonhosted.org/packages/86/ad/abc44aaceaf7b17ee1edde2bbb4458da591bc79574cffff50c4bb35f00d1/numpy-2.5.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:f27582c55ba4c750b7c58c8faf021d2cd9324a662b466229db8a417b41368af9", size = 16783807, upload-time = "2026-06-21T20:57:06.253Z" }, + { url = "https://files.pythonhosted.org/packages/5d/39/b72e168daf9c00fb20c9fc996d00437ccecdef3102387775d29d7a62576d/numpy-2.5.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:28e7137057d551e4a83c4ae414e3451f50568409db7569aacc7f9811ee06a446", size = 11765215, upload-time = "2026-06-21T20:57:08.547Z" }, + { url = "https://files.pythonhosted.org/packages/f7/a0/8400a9c0e3625182347593f5e1f57da9a617a534794805c8df5518154ddc/numpy-2.5.0-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:e1da54b53e75cd9fcfc23efcc7edab2c6aecf97b6037566d8a0fe804af8ec57c", size = 5324493, upload-time = "2026-06-21T20:57:11.012Z" }, + { url = "https://files.pythonhosted.org/packages/f6/8c/0d104deaa0401c93395a629ec902891618a2eff76d19229139cb5a887bfc/numpy-2.5.0-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:694d8f74e156f7fd01179f1aa8faa2f648ab6ae0f70b6c3fe57a03249aea2303", size = 6645211, upload-time = "2026-06-21T20:57:12.919Z" }, + { url = "https://files.pythonhosted.org/packages/6a/d9/4a4a628c812750363786afc3d33492709a5cd64b215469c16b0f6c7bb811/numpy-2.5.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1a7569a7b53c77716f036bb28cb1c91f166a26ec7d9502cd1e4bdfe502fdec22", size = 15166004, upload-time = "2026-06-21T20:57:14.717Z" }, + { url = "https://files.pythonhosted.org/packages/a0/5e/2a902317d7fc4aa93236e80c932662dadfc459b323d758329e01775125e1/numpy-2.5.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:39a0433bd4086ebd462960cf375e19195bb07b53dc1d87dd5fcf47ad78576f03", size = 16650797, upload-time = "2026-06-21T20:57:16.906Z" }, + { url = "https://files.pythonhosted.org/packages/e9/a0/a0090e6329f4ca5992c07847bb579c5259a19953dc57255bb08793142ffb/numpy-2.5.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:929f0c79ac38bcbd7154fe631dc907abfeddbcc5027a896bd1f7767323271e7a", size = 16524647, upload-time = "2026-06-21T20:57:19.165Z" }, + { url = "https://files.pythonhosted.org/packages/5e/7d/6caf27734c42b65837e7461ed0dbbd6b6fc835060c9714ec59d673bb383a/numpy-2.5.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:cc4f247a47bbf070bfd70be53ccdcf47b800af563535e7bbe172322197c30e21", size = 18411841, upload-time = "2026-06-21T20:57:21.638Z" }, + { url = "https://files.pythonhosted.org/packages/13/dc/26edadbd812536769a82c2e9e002234e33feb5da43061d47a044f6d309b7/numpy-2.5.0-cp314-cp314-win32.whl", hash = "sha256:5dc71423499fab3f46f7a7201155ade1669ea101f2f429d332df9e72f8161731", size = 6106361, upload-time = "2026-06-21T20:57:23.844Z" }, + { url = "https://files.pythonhosted.org/packages/f2/9e/4dd1459282229a72d92dece2ae9138e5cac94a72263a7ceb48f37434c925/numpy-2.5.0-cp314-cp314-win_amd64.whl", hash = "sha256:ebb81d9d5443e0309d6c54894c3fbed74ad7da0714352a67b6d773cd189eae73", size = 12551749, upload-time = "2026-06-21T20:57:25.945Z" }, + { url = "https://files.pythonhosted.org/packages/05/a7/6bc6384c080b86c7f6c85c5bc5b540b24f4f679cd144791d99574e90d462/numpy-2.5.0-cp314-cp314-win_arm64.whl", hash = "sha256:3b94d0d0deceebfad3e67ae5c0e5eb87371e8f7a0581cd04a779928c2450cf1e", size = 10617072, upload-time = "2026-06-21T20:57:28.175Z" }, + { url = "https://files.pythonhosted.org/packages/86/6b/4a2b71d66ada5608ae02b63f150dfad520f6940721cb7f029ad270befc0e/numpy-2.5.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:22f3d43e362d650bc39db1f17851302874a148ca95ba6981c1dfb5fa6862f35b", size = 11881067, upload-time = "2026-06-21T20:57:30.104Z" }, + { url = "https://files.pythonhosted.org/packages/dc/b2/d365eb40a20efb49d67e9feb90494ed8511282ee1f5fa16006675c65397d/numpy-2.5.0-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:243563efb4cd7528a264567e9fd206c87826457322521d06206a00bfa316c927", size = 5440290, upload-time = "2026-06-21T20:57:32.193Z" }, + { url = "https://files.pythonhosted.org/packages/fa/5e/e9c03188de5f9b767e46a8fe988bcfd3efad066a4a3fda8b9cb11a93f895/numpy-2.5.0-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:84881d825ca75249b189bbee875fcfe3238aa5c479e6100893cda566e8e86826", size = 6748371, upload-time = "2026-06-21T20:57:33.933Z" }, + { url = "https://files.pythonhosted.org/packages/fd/1d/68c186a38a5027bae2c4ddd5ea681fdaf8b4d30fb7301def6d8ad270390f/numpy-2.5.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cda12aa4779d42b8771180aba759c96f527d43446d8f380ab59e2b35e8489efd", size = 15214643, upload-time = "2026-06-21T20:57:35.677Z" }, + { url = "https://files.pythonhosted.org/packages/8c/67/73f67b7c7e20635baae9c4c3ead4ae7326a005900297a6110971abd62eb5/numpy-2.5.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1c0121101093d2bd74981b10f8837d78e794a8ff57834eb27179f49e1ba11ac6", size = 16690128, upload-time = "2026-06-21T20:57:38.159Z" }, + { url = "https://files.pythonhosted.org/packages/eb/05/d4c1fb0c46d02a27d6b2b8b319a78c90937acec8631c1641874670b31e6f/numpy-2.5.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:d371c92cfa09da00022f501ab67fafaea813d752eb30ac44336d45b1e5b0268a", size = 16577902, upload-time = "2026-06-21T20:57:40.447Z" }, + { url = "https://files.pythonhosted.org/packages/9e/1d/771c797d50fa26e4888989cccf1d50ee51f530d4e455ad2692dcb64fa711/numpy-2.5.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:9990713e9c38154c6861e7547f1e3fc7a87e75ff09bab24ef1cc81d81c2835e9", size = 18452814, upload-time = "2026-06-21T20:57:42.875Z" }, + { url = "https://files.pythonhosted.org/packages/e8/46/52fc0d2a68d7643f0f149eeea5a5d8ea2a3507056ac8afa83c9212606e8b/numpy-2.5.0-cp314-cp314t-win32.whl", hash = "sha256:edadfbd4794b1086c0d822f81863e8a68fc129d132fd0bb9e31e955d7fbbbdb7", size = 6253168, upload-time = "2026-06-21T20:57:45.101Z" }, + { url = "https://files.pythonhosted.org/packages/2a/be/6c8d1118b5f13b2881dc095d5b345de19c6638b8959c17409b6eff84c8aa/numpy-2.5.0-cp314-cp314t-win_amd64.whl", hash = "sha256:f7e5fa4382967ae6548bd2f174219afb908e294b0d5f625af01166edd5f7d9aa", size = 12736286, upload-time = "2026-06-21T20:57:46.935Z" }, + { url = "https://files.pythonhosted.org/packages/fd/6a/d3a169aaf8536cf228d56a09e04bcb713a2fe4410d4e2105b9419b5a9c89/numpy-2.5.0-cp314-cp314t-win_arm64.whl", hash = "sha256:016623417bb330d719d579daf2d6b9a01ddc52e41a9ed61a47f39fde46dcd865", size = 10686451, upload-time = "2026-06-21T20:57:49.313Z" }, +] + +[[package]] +name = "openpyxl" +version = "3.1.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "et-xmlfile" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/3d/f9/88d94a75de065ea32619465d2f77b29a0469500e99012523b91cc4141cd1/openpyxl-3.1.5.tar.gz", hash = "sha256:cf0e3cf56142039133628b5acffe8ef0c12bc902d2aadd3e0fe5878dc08d1050", size = 186464, upload-time = "2024-06-28T14:03:44.161Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c0/da/977ded879c29cbd04de313843e76868e6e13408a94ed6b987245dc7c8506/openpyxl-3.1.5-py2.py3-none-any.whl", hash = "sha256:5282c12b107bffeef825f4617dc029afaf41d0ea60823bbb665ef3079dc79de2", size = 250910, upload-time = "2024-06-28T14:03:41.161Z" }, +] + +[[package]] +name = "pdfminer-six" +version = "20260107" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "charset-normalizer" }, + { name = "cryptography" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/34/a4/5cec1112009f0439a5ca6afa8ace321f0ab2f48da3255b7a1c8953014670/pdfminer_six-20260107.tar.gz", hash = "sha256:96bfd431e3577a55a0efd25676968ca4ce8fd5b53f14565f85716ff363889602", size = 8512094, upload-time = "2026-01-07T13:29:12.937Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/20/8b/28c4eaec9d6b036a52cb44720408f26b1a143ca9bce76cc19e8f5de00ab4/pdfminer_six-20260107-py3-none-any.whl", hash = "sha256:366585ba97e80dffa8f00cebe303d2f381884d8637af4ce422f1df3ef38111a9", size = 6592252, upload-time = "2026-01-07T13:29:10.742Z" }, +] + +[[package]] +name = "pdfplumber" +version = "0.11.10" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pdfminer-six" }, + { name = "pillow" }, + { name = "pypdfium2" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/05/56/6f450312ba05a27d7713b73857c1a25100dbda04fbc1331b13fb227a607d/pdfplumber-0.11.10.tar.gz", hash = "sha256:b95b2d28c66efb0a794a83b88c6c6aea5987532a445d20a1cbcfa657022e6e57", size = 102892, upload-time = "2026-06-15T03:31:31.035Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a2/9a/07d658e1e7fad860f1c541ab941348125dbdab773be3a0afaf32361866c7/pdfplumber-0.11.10-py3-none-any.whl", hash = "sha256:7741ea81bf165b474b153e6789d10d18e06b6ddcf3ec84289c3ef2fed6802580", size = 60047, upload-time = "2026-06-15T03:31:29.702Z" }, +] + +[[package]] +name = "pillow" +version = "12.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8c/21/c2bcdd5906101a30244eaffc1b6e6ce71a31bd0742a01eb89e660ebfac2d/pillow-12.2.0.tar.gz", hash = "sha256:a830b1a40919539d07806aa58e1b114df53ddd43213d9c8b75847eee6c0182b5", size = 46987819, upload-time = "2026-04-01T14:46:17.687Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/58/be/7482c8a5ebebbc6470b3eb791812fff7d5e0216c2be3827b30b8bb6603ed/pillow-12.2.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2d192a155bbcec180f8564f693e6fd9bccff5a7af9b32e2e4bf8c9c69dbad6b5", size = 5308279, upload-time = "2026-04-01T14:43:13.246Z" }, + { url = "https://files.pythonhosted.org/packages/d8/95/0a351b9289c2b5cbde0bacd4a83ebc44023e835490a727b2a3bd60ddc0f4/pillow-12.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f3f40b3c5a968281fd507d519e444c35f0ff171237f4fdde090dd60699458421", size = 4695490, upload-time = "2026-04-01T14:43:15.584Z" }, + { url = "https://files.pythonhosted.org/packages/de/af/4e8e6869cbed569d43c416fad3dc4ecb944cb5d9492defaed89ddd6fe871/pillow-12.2.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:03e7e372d5240cc23e9f07deca4d775c0817bffc641b01e9c3af208dbd300987", size = 6284462, upload-time = "2026-04-01T14:43:18.268Z" }, + { url = "https://files.pythonhosted.org/packages/e9/9e/c05e19657fd57841e476be1ab46c4d501bffbadbafdc31a6d665f8b737b6/pillow-12.2.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b86024e52a1b269467a802258c25521e6d742349d760728092e1bc2d135b4d76", size = 8094744, upload-time = "2026-04-01T14:43:20.716Z" }, + { url = "https://files.pythonhosted.org/packages/2b/54/1789c455ed10176066b6e7e6da1b01e50e36f94ba584dc68d9eebfe9156d/pillow-12.2.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7371b48c4fa448d20d2714c9a1f775a81155050d383333e0a6c15b1123dda005", size = 6398371, upload-time = "2026-04-01T14:43:23.443Z" }, + { url = "https://files.pythonhosted.org/packages/43/e3/fdc657359e919462369869f1c9f0e973f353f9a9ee295a39b1fea8ee1a77/pillow-12.2.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:62f5409336adb0663b7caa0da5c7d9e7bdbaae9ce761d34669420c2a801b2780", size = 7087215, upload-time = "2026-04-01T14:43:26.758Z" }, + { url = "https://files.pythonhosted.org/packages/8b/f8/2f6825e441d5b1959d2ca5adec984210f1ec086435b0ed5f52c19b3b8a6e/pillow-12.2.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:01afa7cf67f74f09523699b4e88c73fb55c13346d212a59a2db1f86b0a63e8c5", size = 6509783, upload-time = "2026-04-01T14:43:29.56Z" }, + { url = "https://files.pythonhosted.org/packages/67/f9/029a27095ad20f854f9dba026b3ea6428548316e057e6fc3545409e86651/pillow-12.2.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fc3d34d4a8fbec3e88a79b92e5465e0f9b842b628675850d860b8bd300b159f5", size = 7212112, upload-time = "2026-04-01T14:43:32.091Z" }, + { url = "https://files.pythonhosted.org/packages/be/42/025cfe05d1be22dbfdb4f264fe9de1ccda83f66e4fc3aac94748e784af04/pillow-12.2.0-cp312-cp312-win32.whl", hash = "sha256:58f62cc0f00fd29e64b29f4fd923ffdb3859c9f9e6105bfc37ba1d08994e8940", size = 6378489, upload-time = "2026-04-01T14:43:34.601Z" }, + { url = "https://files.pythonhosted.org/packages/5d/7b/25a221d2c761c6a8ae21bfa3874988ff2583e19cf8a27bf2fee358df7942/pillow-12.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:7f84204dee22a783350679a0333981df803dac21a0190d706a50475e361c93f5", size = 7084129, upload-time = "2026-04-01T14:43:37.213Z" }, + { url = "https://files.pythonhosted.org/packages/10/e1/542a474affab20fd4a0f1836cb234e8493519da6b76899e30bcc5d990b8b/pillow-12.2.0-cp312-cp312-win_arm64.whl", hash = "sha256:af73337013e0b3b46f175e79492d96845b16126ddf79c438d7ea7ff27783a414", size = 2463612, upload-time = "2026-04-01T14:43:39.421Z" }, + { url = "https://files.pythonhosted.org/packages/4a/01/53d10cf0dbad820a8db274d259a37ba50b88b24768ddccec07355382d5ad/pillow-12.2.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:8297651f5b5679c19968abefd6bb84d95fe30ef712eb1b2d9b2d31ca61267f4c", size = 4100837, upload-time = "2026-04-01T14:43:41.506Z" }, + { url = "https://files.pythonhosted.org/packages/0f/98/f3a6657ecb698c937f6c76ee564882945f29b79bad496abcba0e84659ec5/pillow-12.2.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:50d8520da2a6ce0af445fa6d648c4273c3eeefbc32d7ce049f22e8b5c3daecc2", size = 4176528, upload-time = "2026-04-01T14:43:43.773Z" }, + { url = "https://files.pythonhosted.org/packages/69/bc/8986948f05e3ea490b8442ea1c1d4d990b24a7e43d8a51b2c7d8b1dced36/pillow-12.2.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:766cef22385fa1091258ad7e6216792b156dc16d8d3fa607e7545b2b72061f1c", size = 3640401, upload-time = "2026-04-01T14:43:45.87Z" }, + { url = "https://files.pythonhosted.org/packages/34/46/6c717baadcd62bc8ed51d238d521ab651eaa74838291bda1f86fe1f864c9/pillow-12.2.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5d2fd0fa6b5d9d1de415060363433f28da8b1526c1c129020435e186794b3795", size = 5308094, upload-time = "2026-04-01T14:43:48.438Z" }, + { url = "https://files.pythonhosted.org/packages/71/43/905a14a8b17fdb1ccb58d282454490662d2cb89a6bfec26af6d3520da5ec/pillow-12.2.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:56b25336f502b6ed02e889f4ece894a72612fe885889a6e8c4c80239ff6e5f5f", size = 4695402, upload-time = "2026-04-01T14:43:51.292Z" }, + { url = "https://files.pythonhosted.org/packages/73/dd/42107efcb777b16fa0393317eac58f5b5cf30e8392e266e76e51cff28c3d/pillow-12.2.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f1c943e96e85df3d3478f7b691f229887e143f81fedab9b20205349ab04d73ed", size = 6280005, upload-time = "2026-04-01T14:43:54.242Z" }, + { url = "https://files.pythonhosted.org/packages/a8/68/b93e09e5e8549019e61acf49f65b1a8530765a7f812c77a7461bca7e4494/pillow-12.2.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:03f6fab9219220f041c74aeaa2939ff0062bd5c364ba9ce037197f4c6d498cd9", size = 8090669, upload-time = "2026-04-01T14:43:57.335Z" }, + { url = "https://files.pythonhosted.org/packages/4b/6e/3ccb54ce8ec4ddd1accd2d89004308b7b0b21c4ac3d20fa70af4760a4330/pillow-12.2.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5cdfebd752ec52bf5bb4e35d9c64b40826bc5b40a13df7c3cda20a2c03a0f5ed", size = 6395194, upload-time = "2026-04-01T14:43:59.864Z" }, + { url = "https://files.pythonhosted.org/packages/67/ee/21d4e8536afd1a328f01b359b4d3997b291ffd35a237c877b331c1c3b71c/pillow-12.2.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:eedf4b74eda2b5a4b2b2fb4c006d6295df3bf29e459e198c90ea48e130dc75c3", size = 7082423, upload-time = "2026-04-01T14:44:02.74Z" }, + { url = "https://files.pythonhosted.org/packages/78/5f/e9f86ab0146464e8c133fe85df987ed9e77e08b29d8d35f9f9f4d6f917ba/pillow-12.2.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:00a2865911330191c0b818c59103b58a5e697cae67042366970a6b6f1b20b7f9", size = 6505667, upload-time = "2026-04-01T14:44:05.381Z" }, + { url = "https://files.pythonhosted.org/packages/ed/1e/409007f56a2fdce61584fd3acbc2bbc259857d555196cedcadc68c015c82/pillow-12.2.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:1e1757442ed87f4912397c6d35a0db6a7b52592156014706f17658ff58bbf795", size = 7208580, upload-time = "2026-04-01T14:44:08.39Z" }, + { url = "https://files.pythonhosted.org/packages/23/c4/7349421080b12fb35414607b8871e9534546c128a11965fd4a7002ccfbee/pillow-12.2.0-cp313-cp313-win32.whl", hash = "sha256:144748b3af2d1b358d41286056d0003f47cb339b8c43a9ea42f5fea4d8c66b6e", size = 6375896, upload-time = "2026-04-01T14:44:11.197Z" }, + { url = "https://files.pythonhosted.org/packages/3f/82/8a3739a5e470b3c6cbb1d21d315800d8e16bff503d1f16b03a4ec3212786/pillow-12.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:390ede346628ccc626e5730107cde16c42d3836b89662a115a921f28440e6a3b", size = 7081266, upload-time = "2026-04-01T14:44:13.947Z" }, + { url = "https://files.pythonhosted.org/packages/c3/25/f968f618a062574294592f668218f8af564830ccebdd1fa6200f598e65c5/pillow-12.2.0-cp313-cp313-win_arm64.whl", hash = "sha256:8023abc91fba39036dbce14a7d6535632f99c0b857807cbbbf21ecc9f4717f06", size = 2463508, upload-time = "2026-04-01T14:44:16.312Z" }, + { url = "https://files.pythonhosted.org/packages/4d/a4/b342930964e3cb4dce5038ae34b0eab4653334995336cd486c5a8c25a00c/pillow-12.2.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:042db20a421b9bafecc4b84a8b6e444686bd9d836c7fd24542db3e7df7baad9b", size = 5309927, upload-time = "2026-04-01T14:44:18.89Z" }, + { url = "https://files.pythonhosted.org/packages/9f/de/23198e0a65a9cf06123f5435a5d95cea62a635697f8f03d134d3f3a96151/pillow-12.2.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:dd025009355c926a84a612fecf58bb315a3f6814b17ead51a8e48d3823d9087f", size = 4698624, upload-time = "2026-04-01T14:44:21.115Z" }, + { url = "https://files.pythonhosted.org/packages/01/a6/1265e977f17d93ea37aa28aa81bad4fa597933879fac2520d24e021c8da3/pillow-12.2.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:88ddbc66737e277852913bd1e07c150cc7bb124539f94c4e2df5344494e0a612", size = 6321252, upload-time = "2026-04-01T14:44:23.663Z" }, + { url = "https://files.pythonhosted.org/packages/3c/83/5982eb4a285967baa70340320be9f88e57665a387e3a53a7f0db8231a0cd/pillow-12.2.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d362d1878f00c142b7e1a16e6e5e780f02be8195123f164edf7eddd911eefe7c", size = 8126550, upload-time = "2026-04-01T14:44:26.772Z" }, + { url = "https://files.pythonhosted.org/packages/4e/48/6ffc514adce69f6050d0753b1a18fd920fce8cac87620d5a31231b04bfc5/pillow-12.2.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2c727a6d53cb0018aadd8018c2b938376af27914a68a492f59dfcaca650d5eea", size = 6433114, upload-time = "2026-04-01T14:44:29.615Z" }, + { url = "https://files.pythonhosted.org/packages/36/a3/f9a77144231fb8d40ee27107b4463e205fa4677e2ca2548e14da5cf18dce/pillow-12.2.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:efd8c21c98c5cc60653bcb311bef2ce0401642b7ce9d09e03a7da87c878289d4", size = 7115667, upload-time = "2026-04-01T14:44:32.773Z" }, + { url = "https://files.pythonhosted.org/packages/c1/fc/ac4ee3041e7d5a565e1c4fd72a113f03b6394cc72ab7089d27608f8aaccb/pillow-12.2.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9f08483a632889536b8139663db60f6724bfcb443c96f1b18855860d7d5c0fd4", size = 6538966, upload-time = "2026-04-01T14:44:35.252Z" }, + { url = "https://files.pythonhosted.org/packages/c0/a8/27fb307055087f3668f6d0a8ccb636e7431d56ed0750e07a60547b1e083e/pillow-12.2.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dac8d77255a37e81a2efcbd1fc05f1c15ee82200e6c240d7e127e25e365c39ea", size = 7238241, upload-time = "2026-04-01T14:44:37.875Z" }, + { url = "https://files.pythonhosted.org/packages/ad/4b/926ab182c07fccae9fcb120043464e1ff1564775ec8864f21a0ebce6ac25/pillow-12.2.0-cp313-cp313t-win32.whl", hash = "sha256:ee3120ae9dff32f121610bb08e4313be87e03efeadfc6c0d18f89127e24d0c24", size = 6379592, upload-time = "2026-04-01T14:44:40.336Z" }, + { url = "https://files.pythonhosted.org/packages/c2/c4/f9e476451a098181b30050cc4c9a3556b64c02cf6497ea421ac047e89e4b/pillow-12.2.0-cp313-cp313t-win_amd64.whl", hash = "sha256:325ca0528c6788d2a6c3d40e3568639398137346c3d6e66bb61db96b96511c98", size = 7085542, upload-time = "2026-04-01T14:44:43.251Z" }, + { url = "https://files.pythonhosted.org/packages/00/a4/285f12aeacbe2d6dc36c407dfbbe9e96d4a80b0fb710a337f6d2ad978c75/pillow-12.2.0-cp313-cp313t-win_arm64.whl", hash = "sha256:2e5a76d03a6c6dcef67edabda7a52494afa4035021a79c8558e14af25313d453", size = 2465765, upload-time = "2026-04-01T14:44:45.996Z" }, + { url = "https://files.pythonhosted.org/packages/bf/98/4595daa2365416a86cb0d495248a393dfc84e96d62ad080c8546256cb9c0/pillow-12.2.0-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:3adc9215e8be0448ed6e814966ecf3d9952f0ea40eb14e89a102b87f450660d8", size = 4100848, upload-time = "2026-04-01T14:44:48.48Z" }, + { url = "https://files.pythonhosted.org/packages/0b/79/40184d464cf89f6663e18dfcf7ca21aae2491fff1a16127681bf1fa9b8cf/pillow-12.2.0-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:6a9adfc6d24b10f89588096364cc726174118c62130c817c2837c60cf08a392b", size = 4176515, upload-time = "2026-04-01T14:44:51.353Z" }, + { url = "https://files.pythonhosted.org/packages/b0/63/703f86fd4c422a9cf722833670f4f71418fb116b2853ff7da722ea43f184/pillow-12.2.0-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:6a6e67ea2e6feda684ed370f9a1c52e7a243631c025ba42149a2cc5934dec295", size = 3640159, upload-time = "2026-04-01T14:44:53.588Z" }, + { url = "https://files.pythonhosted.org/packages/71/e0/fb22f797187d0be2270f83500aab851536101b254bfa1eae10795709d283/pillow-12.2.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:2bb4a8d594eacdfc59d9e5ad972aa8afdd48d584ffd5f13a937a664c3e7db0ed", size = 5312185, upload-time = "2026-04-01T14:44:56.039Z" }, + { url = "https://files.pythonhosted.org/packages/ba/8c/1a9e46228571de18f8e28f16fabdfc20212a5d019f3e3303452b3f0a580d/pillow-12.2.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:80b2da48193b2f33ed0c32c38140f9d3186583ce7d516526d462645fd98660ae", size = 4695386, upload-time = "2026-04-01T14:44:58.663Z" }, + { url = "https://files.pythonhosted.org/packages/70/62/98f6b7f0c88b9addd0e87c217ded307b36be024d4ff8869a812b241d1345/pillow-12.2.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:22db17c68434de69d8ecfc2fe821569195c0c373b25cccb9cbdacf2c6e53c601", size = 6280384, upload-time = "2026-04-01T14:45:01.5Z" }, + { url = "https://files.pythonhosted.org/packages/5e/03/688747d2e91cfbe0e64f316cd2e8005698f76ada3130d0194664174fa5de/pillow-12.2.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7b14cc0106cd9aecda615dd6903840a058b4700fcb817687d0ee4fc8b6e389be", size = 8091599, upload-time = "2026-04-01T14:45:04.5Z" }, + { url = "https://files.pythonhosted.org/packages/f6/35/577e22b936fcdd66537329b33af0b4ccfefaeabd8aec04b266528cddb33c/pillow-12.2.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8cbeb542b2ebc6fcdacabf8aca8c1a97c9b3ad3927d46b8723f9d4f033288a0f", size = 6396021, upload-time = "2026-04-01T14:45:07.117Z" }, + { url = "https://files.pythonhosted.org/packages/11/8d/d2532ad2a603ca2b93ad9f5135732124e57811d0168155852f37fbce2458/pillow-12.2.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4bfd07bc812fbd20395212969e41931001fd59eb55a60658b0e5710872e95286", size = 7083360, upload-time = "2026-04-01T14:45:09.763Z" }, + { url = "https://files.pythonhosted.org/packages/5e/26/d325f9f56c7e039034897e7380e9cc202b1e368bfd04d4cbe6a441f02885/pillow-12.2.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:9aba9a17b623ef750a4d11b742cbafffeb48a869821252b30ee21b5e91392c50", size = 6507628, upload-time = "2026-04-01T14:45:12.378Z" }, + { url = "https://files.pythonhosted.org/packages/5f/f7/769d5632ffb0988f1c5e7660b3e731e30f7f8ec4318e94d0a5d674eb65a4/pillow-12.2.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:deede7c263feb25dba4e82ea23058a235dcc2fe1f6021025dc71f2b618e26104", size = 7209321, upload-time = "2026-04-01T14:45:15.122Z" }, + { url = "https://files.pythonhosted.org/packages/6a/7a/c253e3c645cd47f1aceea6a8bacdba9991bf45bb7dfe927f7c893e89c93c/pillow-12.2.0-cp314-cp314-win32.whl", hash = "sha256:632ff19b2778e43162304d50da0181ce24ac5bb8180122cbe1bf4673428328c7", size = 6479723, upload-time = "2026-04-01T14:45:17.797Z" }, + { url = "https://files.pythonhosted.org/packages/cd/8b/601e6566b957ca50e28725cb6c355c59c2c8609751efbecd980db44e0349/pillow-12.2.0-cp314-cp314-win_amd64.whl", hash = "sha256:4e6c62e9d237e9b65fac06857d511e90d8461a32adcc1b9065ea0c0fa3a28150", size = 7217400, upload-time = "2026-04-01T14:45:20.529Z" }, + { url = "https://files.pythonhosted.org/packages/d6/94/220e46c73065c3e2951bb91c11a1fb636c8c9ad427ac3ce7d7f3359b9b2f/pillow-12.2.0-cp314-cp314-win_arm64.whl", hash = "sha256:b1c1fbd8a5a1af3412a0810d060a78b5136ec0836c8a4ef9aa11807f2a22f4e1", size = 2554835, upload-time = "2026-04-01T14:45:23.162Z" }, + { url = "https://files.pythonhosted.org/packages/b6/ab/1b426a3974cb0e7da5c29ccff4807871d48110933a57207b5a676cccc155/pillow-12.2.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:57850958fe9c751670e49b2cecf6294acc99e562531f4bd317fa5ddee2068463", size = 5314225, upload-time = "2026-04-01T14:45:25.637Z" }, + { url = "https://files.pythonhosted.org/packages/19/1e/dce46f371be2438eecfee2a1960ee2a243bbe5e961890146d2dee1ff0f12/pillow-12.2.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:d5d38f1411c0ed9f97bcb49b7bd59b6b7c314e0e27420e34d99d844b9ce3b6f3", size = 4698541, upload-time = "2026-04-01T14:45:28.355Z" }, + { url = "https://files.pythonhosted.org/packages/55/c3/7fbecf70adb3a0c33b77a300dc52e424dc22ad8cdc06557a2e49523b703d/pillow-12.2.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5c0a9f29ca8e79f09de89293f82fc9b0270bb4af1d58bc98f540cc4aedf03166", size = 6322251, upload-time = "2026-04-01T14:45:30.924Z" }, + { url = "https://files.pythonhosted.org/packages/1c/3c/7fbc17cfb7e4fe0ef1642e0abc17fc6c94c9f7a16be41498e12e2ba60408/pillow-12.2.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1610dd6c61621ae1cf811bef44d77e149ce3f7b95afe66a4512f8c59f25d9ebe", size = 8127807, upload-time = "2026-04-01T14:45:33.908Z" }, + { url = "https://files.pythonhosted.org/packages/ff/c3/a8ae14d6defd2e448493ff512fae903b1e9bd40b72efb6ec55ce0048c8ce/pillow-12.2.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0a34329707af4f73cf1782a36cd2289c0368880654a2c11f027bcee9052d35dd", size = 6433935, upload-time = "2026-04-01T14:45:36.623Z" }, + { url = "https://files.pythonhosted.org/packages/6e/32/2880fb3a074847ac159d8f902cb43278a61e85f681661e7419e6596803ed/pillow-12.2.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8e9c4f5b3c546fa3458a29ab22646c1c6c787ea8f5ef51300e5a60300736905e", size = 7116720, upload-time = "2026-04-01T14:45:39.258Z" }, + { url = "https://files.pythonhosted.org/packages/46/87/495cc9c30e0129501643f24d320076f4cc54f718341df18cc70ec94c44e1/pillow-12.2.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:fb043ee2f06b41473269765c2feae53fc2e2fbf96e5e22ca94fb5ad677856f06", size = 6540498, upload-time = "2026-04-01T14:45:41.879Z" }, + { url = "https://files.pythonhosted.org/packages/18/53/773f5edca692009d883a72211b60fdaf8871cbef075eaa9d577f0a2f989e/pillow-12.2.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:f278f034eb75b4e8a13a54a876cc4a5ab39173d2cdd93a638e1b467fc545ac43", size = 7239413, upload-time = "2026-04-01T14:45:44.705Z" }, + { url = "https://files.pythonhosted.org/packages/c9/e4/4b64a97d71b2a83158134abbb2f5bd3f8a2ea691361282f010998f339ec7/pillow-12.2.0-cp314-cp314t-win32.whl", hash = "sha256:6bb77b2dcb06b20f9f4b4a8454caa581cd4dd0643a08bacf821216a16d9c8354", size = 6482084, upload-time = "2026-04-01T14:45:47.568Z" }, + { url = "https://files.pythonhosted.org/packages/ba/13/306d275efd3a3453f72114b7431c877d10b1154014c1ebbedd067770d629/pillow-12.2.0-cp314-cp314t-win_amd64.whl", hash = "sha256:6562ace0d3fb5f20ed7290f1f929cae41b25ae29528f2af1722966a0a02e2aa1", size = 7225152, upload-time = "2026-04-01T14:45:50.032Z" }, + { url = "https://files.pythonhosted.org/packages/ff/6e/cf826fae916b8658848d7b9f38d88da6396895c676e8086fc0988073aaf8/pillow-12.2.0-cp314-cp314t-win_arm64.whl", hash = "sha256:aa88ccfe4e32d362816319ed727a004423aab09c5cea43c01a4b435643fa34eb", size = 2556579, upload-time = "2026-04-01T14:45:52.529Z" }, +] + +[[package]] +name = "psycopg" +version = "3.3.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, + { name = "tzdata", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/db/2f/cb91e5502ec9de1de6f1b76cfbf69531932725361168bb06963620c77e2e/psycopg-3.3.4.tar.gz", hash = "sha256:e21207764952cff81b6b8bdacad9a3939f2793367fdac2987b3aac36a651b5bc", size = 165799, upload-time = "2026-05-01T23:31:55.179Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5c/e0/7b3dee031daae7743609ce3c746565d4a3ed7c2c186479eb48e34e838c64/psycopg-3.3.4-py3-none-any.whl", hash = "sha256:b6bbc25ccf05c8fad3b061d9db2ef0909a555171b84b07f29458a447253d679a", size = 213001, upload-time = "2026-05-01T23:20:50.816Z" }, +] + +[package.optional-dependencies] +binary = [ + { name = "psycopg-binary", marker = "implementation_name != 'pypy'" }, +] + +[[package]] +name = "psycopg-binary" +version = "3.3.4" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/95/7d/03818e13ba7f36de93573c93ee3482006d3dfa8b0f8d28df511bad0a1a92/psycopg_binary-3.3.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:5ab28a2a7649df3b72e6b674b4c190e448e8e77cf496a65bd846472048de2089", size = 4591122, upload-time = "2026-05-01T23:27:56.162Z" }, + { url = "https://files.pythonhosted.org/packages/a5/b9/11b341edf8d54e2694726b273fe9652b254d989f4f63e3ac6816ad6b55f4/psycopg_binary-3.3.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6402a9d8146cf4b3974ded3fd28a971e83dc6a0333eb7822524a3aa20b546578", size = 4669943, upload-time = "2026-05-01T23:28:04.522Z" }, + { url = "https://files.pythonhosted.org/packages/8b/18/4665bacd65e7865b4372fcd8abb8b9186ada4b0025f8c2ca691b364a556c/psycopg_binary-3.3.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:580ae30a5f95ccd90008ec697d3ed6a4a2047a516407ad904283fa42086936e9", size = 5469697, upload-time = "2026-05-01T23:28:11.337Z" }, + { url = "https://files.pythonhosted.org/packages/7c/b1/b83136c6e510593d9b0c759ba5384337bc4ad82d19fda675adc4b2703c84/psycopg_binary-3.3.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e7510c37550f91a187e3660a8cc50d4b760f8c3b8b2f89ebc5698cd2c7f2c85d", size = 5152995, upload-time = "2026-05-01T23:28:20.529Z" }, + { url = "https://files.pythonhosted.org/packages/67/8d/a9821e2a648afe6091989929982a3b0f00b2631a859cb81379728f08fb75/psycopg_binary-3.3.4-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:77df19583501ea288eaf15ac0fe7ad01e6d8091a91d5c41df5c718f307d8e31b", size = 6738180, upload-time = "2026-05-01T23:28:30.654Z" }, + { url = "https://files.pythonhosted.org/packages/7e/58/2e349e8d23905dc2317b80ac65f48fb6f821a4777a4e994a60da91c4850f/psycopg_binary-3.3.4-cp312-cp312-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:018fbed325936da502feb546642c982dcc4b9ffdea32dfef78dbf3b7f7ad4070", size = 4978828, upload-time = "2026-05-01T23:28:37.277Z" }, + { url = "https://files.pythonhosted.org/packages/45/48/57b00d03b4721878326122a1f1e6b0a90b85bcaec56b5b2f8ea6cfa45235/psycopg_binary-3.3.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:17a21953a9e5ff3a16dab692625a3676e2f101db5e40072f39dbee2250194d68", size = 4509757, upload-time = "2026-05-01T23:28:43.078Z" }, + { url = "https://files.pythonhosted.org/packages/25/37/33b47d8c007df69aec500df5889767c4d313748e8e9e27a2fef8a6dabcee/psycopg_binary-3.3.4-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:eb05ee1c2b817d27c537333224c9e83c7afb86fe7296ba970990068baf819b16", size = 4190546, upload-time = "2026-05-01T23:28:50.016Z" }, + { url = "https://files.pythonhosted.org/packages/ca/c6/32b0835dbc2122617902b649d76a91c1e75406e76bf3d595b0c3bb5ffad6/psycopg_binary-3.3.4-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:773d573e11f437ce0bdb95b7c18dc58390494f96d43f8b45b9760436114f7652", size = 3926197, upload-time = "2026-05-01T23:28:55.55Z" }, + { url = "https://files.pythonhosted.org/packages/cd/68/d190ef0c0c5b16ded07831dabc8ddd412f4cdab07ec6e30ed38d9bda0e1f/psycopg_binary-3.3.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:71e55ccbdfae79a2ed9c6369c3008a3025817ff9d7e27b32a2d84e2a4267e66e", size = 4236627, upload-time = "2026-05-01T23:29:05.336Z" }, + { url = "https://files.pythonhosted.org/packages/25/8f/81dcbc2e8454b74d14881275ea45f00791052dac531a9fa8be1730d1685b/psycopg_binary-3.3.4-cp312-cp312-win_amd64.whl", hash = "sha256:494ca54901be8cf9eb7e02c25b731f2317c378efa44f43e8f9bd0e1184ae7be4", size = 3560782, upload-time = "2026-05-01T23:29:11.967Z" }, + { url = "https://files.pythonhosted.org/packages/09/43/13e9c406fbbf354580476e248a16b64802a376873ebe6339e30bb655572d/psycopg_binary-3.3.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:fbd1d4ed566895ad2d3bf4ddfd8bae90026930ddf29df3b9d91d32c8c47866a7", size = 4590377, upload-time = "2026-05-01T23:29:18.782Z" }, + { url = "https://files.pythonhosted.org/packages/22/be/2923cd7c3683e7afdecf4f10796a18de02f5c5ddc0969aa2ad0a8cdd3bbd/psycopg_binary-3.3.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:75a9067e236f9b9ae3535b66fe99bddb33d39c0de10112e49b9ab11eee53dc31", size = 4669023, upload-time = "2026-05-01T23:29:25.884Z" }, + { url = "https://files.pythonhosted.org/packages/96/a0/2c913d6fe13d6a8bd13597d36739bf47af063ad9399e402cfecab16f3c1e/psycopg_binary-3.3.4-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:b56b603ebcea8aa10b46228b8410ba7f13e7c2ee54389d4d9be0927fd8ce2a70", size = 5467423, upload-time = "2026-05-01T23:29:33.416Z" }, + { url = "https://files.pythonhosted.org/packages/e7/38/205d10bc1ad0df4a21c5c51659126bd3ea0ef98fcad1e852f78c249bb9c3/psycopg_binary-3.3.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c677c4ad433cb7150c8cd304a0769ae3bcfbe5ea0676eb53faa7b1443b16d0d3", size = 5151137, upload-time = "2026-05-01T23:29:42.013Z" }, + { url = "https://files.pythonhosted.org/packages/36/fc/f0381ddcd45eff3bb70dbca6823a996048d7f507b2ec3fc92c6fabc0fe87/psycopg_binary-3.3.4-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:26df2717e59c0473e4465a97dfb1b7afebaa479277870fd5784d1436470db47c", size = 6736671, upload-time = "2026-05-01T23:29:51.626Z" }, + { url = "https://files.pythonhosted.org/packages/95/40/fa545ae152c24327651e5624e4902121e808270be36c10b12e9939be09bc/psycopg_binary-3.3.4-cp313-cp313-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:1dc1f79fd16bb1f3f4421417a514607539f17804d95c7ed617265369d1981cae", size = 4979601, upload-time = "2026-05-01T23:29:56.961Z" }, + { url = "https://files.pythonhosted.org/packages/86/e4/2f8a47ee97f90cd2b933d0463081d35631ff419de2b8c984a5f369857de0/psycopg_binary-3.3.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:136f199a407b5348b9b857c504aff60c77622a28482e7195839ce1b51238c4cc", size = 4510513, upload-time = "2026-05-01T23:30:07.243Z" }, + { url = "https://files.pythonhosted.org/packages/0e/0e/94e842ff4a7f98ed162580ca2e8b8864b28c1e0350f2443f8ee47f821167/psycopg_binary-3.3.4-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:b6f5a29e9c775b9f12a1a717aa7a2c80f9e1db6f27ba44a5b59c80ac61d2ffcf", size = 4187243, upload-time = "2026-05-01T23:30:15.352Z" }, + { url = "https://files.pythonhosted.org/packages/d0/83/fc6c174b672e29b7de996ea77b6cbddf46c891751c3355f6974292baa6b4/psycopg_binary-3.3.4-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:ee17a2cf4943cde261adfad1bbc5bf38d6b3776d7afff74c7cabcbeaeb08c260", size = 3927347, upload-time = "2026-05-01T23:30:21.186Z" }, + { url = "https://files.pythonhosted.org/packages/e9/65/768364d4a97a15b1a7f47ba52688c1686f22941d8332a8398cefc468e25f/psycopg_binary-3.3.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5c4ab71be17bdca30cb34c34c4e1496e2f5d6f20c199c12bad226070b22ef9bf", size = 4236393, upload-time = "2026-05-01T23:30:26.211Z" }, + { url = "https://files.pythonhosted.org/packages/bd/3b/218efbc9e645becd80cdf651acda05f85cfe546b7a9c0458c7cbc8fe1f74/psycopg_binary-3.3.4-cp313-cp313-win_amd64.whl", hash = "sha256:dbfdb9b6cc79f31104a7b162a2b921b765fcc62af6c00540a167a8de47e4ed38", size = 3564592, upload-time = "2026-05-01T23:30:31.764Z" }, + { url = "https://files.pythonhosted.org/packages/48/a6/828c9185701dab71b234c2a76c38a08b098ebfec5020716b4e93807492b5/psycopg_binary-3.3.4-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:28b7398fdd19db3232c884fb24550bdfe951221f510e195e233299e4c9b78f97", size = 4607292, upload-time = "2026-05-01T23:30:38.962Z" }, + { url = "https://files.pythonhosted.org/packages/92/58/5b40dbc9d839045c9dae956960e4fb6d20bcabe6c59a2aa34fc3a371913f/psycopg_binary-3.3.4-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1fbaa292a3c8bb61b45df1ad3da1908ccee7cb889db9425e3557d9e34e2a4829", size = 4687023, upload-time = "2026-05-01T23:30:47.227Z" }, + { url = "https://files.pythonhosted.org/packages/85/a9/793f0ac107a9003b48441d0d1f9f616d96e0f37458dd8dc12528ceff55fb/psycopg_binary-3.3.4-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:94596f9e7633ee3f6440711d43bb70aa31cc0a46a900ab8b4201a366ace5c9e7", size = 5486985, upload-time = "2026-05-01T23:30:55.517Z" }, + { url = "https://files.pythonhosted.org/packages/8f/26/42e8533497e2592334f68ec529cf5f840f7fa4e99575a4bb61aa184dbfbf/psycopg_binary-3.3.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8c0056529e68dbe9184cd4019a1f3d8f3a4ead2f6fc7a5afcf27d3314edd1277", size = 5168745, upload-time = "2026-05-01T23:31:01.904Z" }, + { url = "https://files.pythonhosted.org/packages/15/af/b7151776cc08d5935d45c833ec818a9beb417cf7c08239af1aafbdae78ee/psycopg_binary-3.3.4-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2c09aad7051326e7603c14e50636db9c01f78272dc54b3accff03d46370461e6", size = 6761486, upload-time = "2026-05-01T23:31:14.511Z" }, + { url = "https://files.pythonhosted.org/packages/d0/ed/c92533b9124712d592cbf1cd6c76da933a2e0acea81dfe1fbe7e735f0cff/psycopg_binary-3.3.4-cp314-cp314-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:514404ed543efd620c85602b747df2a23cf1241b4067199e1a66f2d2757aaa41", size = 4997427, upload-time = "2026-05-01T23:31:20.901Z" }, + { url = "https://files.pythonhosted.org/packages/a2/23/ccadfd0de416aa188356daa199453af24087b042e296088706d190ae0295/psycopg_binary-3.3.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:46893c26858be12cc49ca4226ed6a60b4bfccadd946b3bebb783a60b38788228", size = 4533549, upload-time = "2026-05-01T23:31:26.204Z" }, + { url = "https://files.pythonhosted.org/packages/fd/a0/c8f43cee36386f7bc891ab41a9d31ea07cf9826038e732da79f26b1e5f34/psycopg_binary-3.3.4-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:df1d567fc430f6df15c9fcf67d87685fc49bdb325adc0db5af1adfb2f44eb5c9", size = 4210256, upload-time = "2026-05-01T23:31:33.884Z" }, + { url = "https://files.pythonhosted.org/packages/4e/2c/c1547871be3790676e8868b38655496422f94f0978dfb66b74bdba2f1676/psycopg_binary-3.3.4-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:6b9016b1714da4dd5ecaaa75b82098aa5a0b87854ce9b092e21c27c4ae23e014", size = 3946204, upload-time = "2026-05-01T23:31:39.626Z" }, + { url = "https://files.pythonhosted.org/packages/c4/b1/f6670f00fa7ea601584623f6c11602ab92117d83eaff885e0210f6de7418/psycopg_binary-3.3.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:47c656a8a7ba6eb0cff1801a4caaa9c8bdc12d03080e273aff1c8ac39971a77e", size = 4255811, upload-time = "2026-05-01T23:31:44.986Z" }, + { url = "https://files.pythonhosted.org/packages/eb/e6/5fff07a70d1f945ed90ae131c3bd76cab32beff7c58c6db15ad5820b6d1f/psycopg_binary-3.3.4-cp314-cp314-win_amd64.whl", hash = "sha256:c37e024c07308cd06cf3ec51bfd0e7f6157585a4d84d1bce4a7f5f7913719bf8", size = 3666849, upload-time = "2026-05-01T23:31:51.165Z" }, +] + +[[package]] +name = "pyasn1" +version = "0.6.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5c/5f/6583902b6f79b399c9c40674ac384fd9cd77805f9e6205075f828ef11fb2/pyasn1-0.6.3.tar.gz", hash = "sha256:697a8ecd6d98891189184ca1fa05d1bb00e2f84b5977c481452050549c8a72cf", size = 148685, upload-time = "2026-03-17T01:06:53.382Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5d/a0/7d793dce3fa811fe047d6ae2431c672364b462850c6235ae306c0efd025f/pyasn1-0.6.3-py3-none-any.whl", hash = "sha256:a80184d120f0864a52a073acc6fc642847d0be408e7c7252f31390c0f4eadcde", size = 83997, upload-time = "2026-03-17T01:06:52.036Z" }, +] + +[[package]] +name = "pyasn1-modules" +version = "0.4.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyasn1" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e9/e6/78ebbb10a8c8e4b61a59249394a4a594c1a7af95593dc933a349c8d00964/pyasn1_modules-0.4.2.tar.gz", hash = "sha256:677091de870a80aae844b1ca6134f54652fa2c8c5a52aa396440ac3106e941e6", size = 307892, upload-time = "2025-03-28T02:41:22.17Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/47/8d/d529b5d697919ba8c11ad626e835d4039be708a35b0d22de83a269a6682c/pyasn1_modules-0.4.2-py3-none-any.whl", hash = "sha256:29253a9207ce32b64c3ac6600edc75368f98473906e8fd1043bd6b5b1de2c14a", size = 181259, upload-time = "2025-03-28T02:41:19.028Z" }, +] + +[[package]] +name = "pycparser" +version = "3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1b/7d/92392ff7815c21062bea51aa7b87d45576f649f16458d78b7cf94b9ab2e6/pycparser-3.0.tar.gz", hash = "sha256:600f49d217304a5902ac3c37e1281c9fe94e4d0489de643a9504c5cdfdfc6b29", size = 103492, upload-time = "2026-01-21T14:26:51.89Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl", hash = "sha256:b727414169a36b7d524c1c3e31839a521725078d7b2ff038656844266160a992", size = 48172, upload-time = "2026-01-21T14:26:50.693Z" }, +] + +[[package]] +name = "pydantic" +version = "2.13.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "annotated-types" }, + { name = "pydantic-core" }, + { name = "typing-extensions" }, + { name = "typing-inspection" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/18/a5/b60d21ac674192f8ab0ba4e9fd860690f9b4a6e51ca5df118733b487d8d6/pydantic-2.13.4.tar.gz", hash = "sha256:c40756b57adaa8b1efeeced5c196f3f3b7c435f90e84ea7f443901bec8099ef6", size = 844775, upload-time = "2026-05-06T13:43:05.343Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl", hash = "sha256:45a282cde31d808236fd7ea9d919b128653c8b38b393d1c4ab335c62924d9aba", size = 472262, upload-time = "2026-05-06T13:43:02.641Z" }, +] + +[[package]] +name = "pydantic-core" +version = "2.46.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9d/56/921726b776ace8d8f5db44c4ef961006580d91dc52b803c489fafd1aa249/pydantic_core-2.46.4.tar.gz", hash = "sha256:62f875393d7f270851f20523dd2e29f082bcc82292d66db2b64ea71f64b6e1c1", size = 471464, upload-time = "2026-05-06T13:37:06.98Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ce/8c/af022f0af448d7747c5154288d46b5f2bc5f17366eaa0e23e9aa04d59f3b/pydantic_core-2.46.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:3245406455a5d98187ec35530fd772b1d799b26667980872c8d4614991e2c4a2", size = 2106158, upload-time = "2026-05-06T13:38:57.215Z" }, + { url = "https://files.pythonhosted.org/packages/19/95/6195171e385007300f0f5574592e467c568becce2d937a0b6804f218bc49/pydantic_core-2.46.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:962ccbab7b642487b1d8b7df90ef677e03134cf1fd8880bf698649b22a69371f", size = 1951724, upload-time = "2026-05-06T13:37:02.697Z" }, + { url = "https://files.pythonhosted.org/packages/8e/bc/f47d1ff9cbb1620e1b5b697eef06010035735f07820180e74178226b27b3/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8233f2947cf85404441fd7e0085f53b10c93e0ee78611099b5c7237e36aacbf7", size = 1975742, upload-time = "2026-05-06T13:37:09.448Z" }, + { url = "https://files.pythonhosted.org/packages/5b/11/9b9a5b0306345664a2da6410877af6e8082481b5884b3ddd78d47c6013ce/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3a233125ac121aa3ffba9a2b59edfc4a985a76092dc8279586ab4b71390875e7", size = 2052418, upload-time = "2026-05-06T13:37:38.234Z" }, + { url = "https://files.pythonhosted.org/packages/f1/b7/a65fec226f5d78fc39f4a13c4cc0c768c22b113438f60c14adc9d2865038/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b712b53160b79a5850310b912a5ef8e57e56947c8ad690c227f5c9d7e561712", size = 2232274, upload-time = "2026-05-06T13:38:27.753Z" }, + { url = "https://files.pythonhosted.org/packages/68/f0/92039db98b907ef49269a8271f67db9cb78ae2fc68062ef7e4e77adb5f61/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9401557acd873c3a7f3eb9383edef8ac4968f9510e340f4808d427e75667e7b4", size = 2309940, upload-time = "2026-05-06T13:38:05.353Z" }, + { url = "https://files.pythonhosted.org/packages/5f/97/2aab507d3d00ca626e8e57c1eac6a79e4e5fbcc63eb99733ff55d1717f65/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:926c9541b14b12b1681dca8a0b75feb510b06c6341b70a8e500c2fdcff837cce", size = 2094516, upload-time = "2026-05-06T13:39:10.577Z" }, + { url = "https://files.pythonhosted.org/packages/22/37/a8aca44d40d737dde2bc05b3c6c07dff0de07ce6f82e9f3167aeaf4d5dea/pydantic_core-2.46.4-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:56cb4851bcaf3d117eddcef4fe66afd750a50274b0da8e22be256d10e5611987", size = 2136854, upload-time = "2026-05-06T13:40:22.59Z" }, + { url = "https://files.pythonhosted.org/packages/24/99/fcef1b79238c06a8cbec70819ac722ba76e02bc8ada9b0fd66eba40da01b/pydantic_core-2.46.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c68fcd102d71ea85c5b2dfac3f4f8476eff42a9e078fd5faefff6d145063536b", size = 2180306, upload-time = "2026-05-06T13:40:10.666Z" }, + { url = "https://files.pythonhosted.org/packages/ae/6c/fc44000918855b42779d007ae63b0532794739027b2f417321cddbc44f6a/pydantic_core-2.46.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b2f69dec1725e79a012d920df1707de5caf7ed5e08f3be4435e25803efc47458", size = 2190044, upload-time = "2026-05-06T13:40:43.231Z" }, + { url = "https://files.pythonhosted.org/packages/6b/65/d9cadc9f1920d7a127ad2edba16c1db7916e59719285cd6c94600b0080ba/pydantic_core-2.46.4-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:8d0820e8192167f80d88d64038e609c31452eeca865b4e1d9950a27a4609b00b", size = 2329133, upload-time = "2026-05-06T13:39:57.365Z" }, + { url = "https://files.pythonhosted.org/packages/d0/cf/c873d91679f3a30bcf5e7ac280ce5573483e72295307685120d0d5ad3416/pydantic_core-2.46.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:fbdb89b3e1c94a30cc5edfce477c6e6a5dc4d8f84665b455c27582f211a1c72c", size = 2374464, upload-time = "2026-05-06T13:38:06.976Z" }, + { url = "https://files.pythonhosted.org/packages/47/bd/6f2fc8188f31bf10590f1e98e7b306336161fac930a8c514cd7bd828c7dc/pydantic_core-2.46.4-cp312-cp312-win32.whl", hash = "sha256:9aa768456404a8bf48a4406685ac2bec8e72b62c69313734fa3b73cf33b3a894", size = 1974823, upload-time = "2026-05-06T13:40:47.985Z" }, + { url = "https://files.pythonhosted.org/packages/40/8c/985c1d41ea1107c2534abd9870e4ed5c8e7669b5c308297835c001e7a1c4/pydantic_core-2.46.4-cp312-cp312-win_amd64.whl", hash = "sha256:e9c26f834c65f5752f3f06cb08cb86a913ceb7274d0db6e267808a708b46bc89", size = 2072919, upload-time = "2026-05-06T13:39:21.153Z" }, + { url = "https://files.pythonhosted.org/packages/c4/ba/f463d006e0c47373ca7ec5e1a261c59dc01ef4d62b2657af925fb0deee3a/pydantic_core-2.46.4-cp312-cp312-win_arm64.whl", hash = "sha256:4fc73cb559bdb54b1134a706a2802a4cddd27a0633f5abb7e53056268751ac6a", size = 2027604, upload-time = "2026-05-06T13:39:03.753Z" }, + { url = "https://files.pythonhosted.org/packages/51/a2/5d30b469c5267a17b39dec53208222f76a8d351dfac4af661888c5aee77d/pydantic_core-2.46.4-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:5d5902252db0d3cedf8d4a1bc68f70eeb430f7e4c7104c8c476753519b423008", size = 2106306, upload-time = "2026-05-06T13:37:48.029Z" }, + { url = "https://files.pythonhosted.org/packages/c1/81/4fa520eaffa8bd7d1525e644cd6d39e7d60b1592bc5b516693c7340b50f1/pydantic_core-2.46.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c94f0688e7b8d0a67abf40e57a7eaaecd17cc9586706a31b76c031f63df052b4", size = 1951906, upload-time = "2026-05-06T13:37:17.012Z" }, + { url = "https://files.pythonhosted.org/packages/03/d5/fd02da45b659668b05923b17ba3a0100a0a3d5541e3bd8fcc4ecb711309e/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f027324c56cd5406ca49c124b0db10e56c69064fec039acc571c29020cc87c76", size = 1976802, upload-time = "2026-05-06T13:37:35.113Z" }, + { url = "https://files.pythonhosted.org/packages/21/f2/95727e1368be3d3ed485eaab7adbd7dda408f33f7a36e8b48e0144002b91/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e739fee756ba1010f8bcccb534252e85a35fe45ae92c295a06059ce58b74ccd3", size = 2052446, upload-time = "2026-05-06T13:37:12.313Z" }, + { url = "https://files.pythonhosted.org/packages/9c/86/5d99feea3f77c7234b8718075b23db11532773c1a0dbd9b9490215dc2eeb/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9d56801be94b86a9da183e5f3766e6310752b99ff647e38b09a9500d88e46e76", size = 2232757, upload-time = "2026-05-06T13:39:01.149Z" }, + { url = "https://files.pythonhosted.org/packages/d2/3a/508ac615935ef7588cf6d9e9b91309fdc2da751af865e02a9098de88258c/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2412e734dcb48da14d4e4006b82b46b74f2518b8a26ee7e58c6844a6cd6d03c4", size = 2309275, upload-time = "2026-05-06T13:37:41.406Z" }, + { url = "https://files.pythonhosted.org/packages/07/f8/41db9de19d7987d6b04715a02b3b40aea467000275d9d758ffaa31af7d50/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9551187363ffc0de2a00b2e47c25aeaeb1020b69b668762966df15fc5659dd5a", size = 2094467, upload-time = "2026-05-06T13:39:18.847Z" }, + { url = "https://files.pythonhosted.org/packages/2c/e2/f35033184cb11d0052daf4416e8e10a502ea2ac006fc4f459aee872727d1/pydantic_core-2.46.4-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:0186750b482eefa11d7f435892b09c5c606193ef3375bcf94aa00ae6bfb66262", size = 2134417, upload-time = "2026-05-06T13:40:17.944Z" }, + { url = "https://files.pythonhosted.org/packages/7e/7b/6ceeb1cc90e193862f444ebe373d8fdf613f0a82572dde03fb10734c6c71/pydantic_core-2.46.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5855698a4856556d86e8e6cd8434bc3ac0314ee8e12089ae0e143f64c6256e4e", size = 2179782, upload-time = "2026-05-06T13:40:32.618Z" }, + { url = "https://files.pythonhosted.org/packages/5a/f2/c8d7773ede6af08036423a00ae0ceffce266c3c52a096c435d68c896083f/pydantic_core-2.46.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:cbaf13819775b7f769bf4a1f066cb6df7a28d4480081a589828ef190226881cd", size = 2188782, upload-time = "2026-05-06T13:36:51.018Z" }, + { url = "https://files.pythonhosted.org/packages/59/31/0c864784e31f09f05cdd87606f08923b9c9e7f6e51dd27f20f62f975ce9f/pydantic_core-2.46.4-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:633147d34cf4550417f12e2b1a0383973bdf5cdfde212cb09e9a581cf10820be", size = 2328334, upload-time = "2026-05-06T13:40:37.764Z" }, + { url = "https://files.pythonhosted.org/packages/c2/eb/4f6c8a41efa30baa755590f4141abf3a8c370fab610915733e74134a7270/pydantic_core-2.46.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:82cf5301172168103724d49a1444d3378cb20cdee30b116a1bd6031236298a5d", size = 2372986, upload-time = "2026-05-06T13:39:34.152Z" }, + { url = "https://files.pythonhosted.org/packages/5b/24/b375a480d53113860c299764bfe9f349a3dc9108b3adc0d7f0d786492ebf/pydantic_core-2.46.4-cp313-cp313-win32.whl", hash = "sha256:9fa8ae11da9e2b3126c6426f147e0fba88d96d65921799bb30c6abd1cb2c97fb", size = 1973693, upload-time = "2026-05-06T13:37:55.072Z" }, + { url = "https://files.pythonhosted.org/packages/7e/e8/cff247591966f2d22ec8c003cd7587e27b7ba7b81ab2fb888e3ab75dc285/pydantic_core-2.46.4-cp313-cp313-win_amd64.whl", hash = "sha256:6b3ace8194b0e5204818c92802dcdca7fc6d88aabbb799d7c795540d9cd6d292", size = 2071819, upload-time = "2026-05-06T13:38:49.139Z" }, + { url = "https://files.pythonhosted.org/packages/c6/1a/f4aee670d5670e9e148e0c82c7db98d780be566c6e6a97ee8035528ca0b3/pydantic_core-2.46.4-cp313-cp313-win_arm64.whl", hash = "sha256:184c081504d17f1c1066e430e117142b2c77d9448a97f7b65c6ac9fd9aee238d", size = 2027411, upload-time = "2026-05-06T13:40:45.796Z" }, + { url = "https://files.pythonhosted.org/packages/8d/74/228a26ddad29c6672b805d9fd78e8d251cd04004fa7eed0e622096cd0250/pydantic_core-2.46.4-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:428e04521a40150c85216fc8b85e8d39fece235a9cf5e383761238c7fa9b96fb", size = 2102079, upload-time = "2026-05-06T13:38:41.019Z" }, + { url = "https://files.pythonhosted.org/packages/ad/1f/8970b150a4b4365623ae00fc88603491f763c627311ae8031e3111356d6e/pydantic_core-2.46.4-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:23ace664830ee0bfe014a0c7bc248b1f7f25ed7ad103852c317624a1083af462", size = 1952179, upload-time = "2026-05-06T13:36:59.812Z" }, + { url = "https://files.pythonhosted.org/packages/95/30/5211a831ae054928054b2f79731661087a2bc5c01e825c672b3a4a8f1b3e/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce5c1d2a8b27468f433ca974829c44060b8097eedc39933e3c206a90ee49c4a9", size = 1978926, upload-time = "2026-05-06T13:37:39.933Z" }, + { url = "https://files.pythonhosted.org/packages/57/e9/689668733b1eb67adeef047db3c2e8788fcf65a7fd9c9e2b46b7744fe245/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7283d57845ecf5a163403eb0702dfc220cc4fbdd18919cb5ccea4f95ee1cdab4", size = 2046785, upload-time = "2026-05-06T13:38:01.995Z" }, + { url = "https://files.pythonhosted.org/packages/60/d9/6715260422ff50a2109878fd24d948a6c3446bb2664f34ee78cd972b3acd/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8daafc69c93ee8a0204506a3b6b30f586ef54028f52aeeeb5c4cfc5184fd5914", size = 2228733, upload-time = "2026-05-06T13:40:50.371Z" }, + { url = "https://files.pythonhosted.org/packages/18/ae/fdb2f64316afca925640f8e70bb1a564b0ec2721c1389e25b8eb4bf9a299/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd2213145bcc2ba85884d0ac63d222fece9209678f77b9b4d76f054c561adb28", size = 2307534, upload-time = "2026-05-06T13:37:21.531Z" }, + { url = "https://files.pythonhosted.org/packages/89/1d/8eff589b45bb8190a9d12c49cfad0f176a5cbd1534908a6b5125e2886239/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a5f930472650a82629163023e630d160863fce524c616f4e5186e5de9d9a49b", size = 2099732, upload-time = "2026-05-06T13:39:31.942Z" }, + { url = "https://files.pythonhosted.org/packages/06/d5/ee5a3366637fee41dee51a1fc91562dcf12ddbc68fda34e6b253da2324bb/pydantic_core-2.46.4-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:c1b3f518abeca3aa13c712fd202306e145abf59a18b094a6bafb2d2bbf59192c", size = 2129627, upload-time = "2026-05-06T13:37:25.033Z" }, + { url = "https://files.pythonhosted.org/packages/94/33/2414be571d2c6a6c4d08be21f9292b6d3fdb08949a97b6dfe985017821db/pydantic_core-2.46.4-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1a7dd0b3ee80d90150e3495a3a13ac34dbcbfd4f012996a6a1d8900e91b5c0fb", size = 2179141, upload-time = "2026-05-06T13:37:14.046Z" }, + { url = "https://files.pythonhosted.org/packages/7b/79/7daa95be995be0eecc4cf75064cb33f9bbbfe3fe0158caf2f0d4a996a5c7/pydantic_core-2.46.4-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:3fb702cd90b0446a3a1c5e470bfa0dd23c0233b676a9099ddcc964fa6ca13898", size = 2184325, upload-time = "2026-05-06T13:36:53.615Z" }, + { url = "https://files.pythonhosted.org/packages/9f/cb/d0a382f5c0de8a222dc61c65348e0ce831b1f68e0a018450d31c2cace3a5/pydantic_core-2.46.4-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:b8458003118a712e66286df6a707db01c52c0f52f7db8e4a38f0da1d3b94fc4e", size = 2323990, upload-time = "2026-05-06T13:40:29.971Z" }, + { url = "https://files.pythonhosted.org/packages/05/db/d9ba624cc4a5aced1598e88c04fdbd8310c8a69b9d38b9a3d39ce3a61ed7/pydantic_core-2.46.4-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:372429a130e469c9cd698925ce5fc50940b7a1336b0d82038e63d5bbc4edc519", size = 2369978, upload-time = "2026-05-06T13:37:23.027Z" }, + { url = "https://files.pythonhosted.org/packages/f2/20/d15df15ba918c423461905802bfd2981c3af0bfa0e40d05e13edbfa48bc3/pydantic_core-2.46.4-cp314-cp314-win32.whl", hash = "sha256:85bb3611ff1802f3ee7fdd7dbff26b56f343fb432d57a4728fdd49b6ef35e2f4", size = 1966354, upload-time = "2026-05-06T13:38:03.499Z" }, + { url = "https://files.pythonhosted.org/packages/fc/b6/6b8de4c0a7d7ab3004c439c80c5c1e0a3e8d78bbae19379b01960383d9e5/pydantic_core-2.46.4-cp314-cp314-win_amd64.whl", hash = "sha256:811ff8e9c313ab425368bcbb36e5c4ebd7108c2bbf4e4089cfbb0b01eff63fac", size = 2072238, upload-time = "2026-05-06T13:39:40.807Z" }, + { url = "https://files.pythonhosted.org/packages/32/36/51eb763beec1f4cf59b1db243a7dcc39cbb41230f050a09b9d69faaf0a48/pydantic_core-2.46.4-cp314-cp314-win_arm64.whl", hash = "sha256:bfec22eab3c8cc2ceec0248aec886624116dc079afa027ecc8ad4a7e62010f8a", size = 2018251, upload-time = "2026-05-06T13:37:26.72Z" }, + { url = "https://files.pythonhosted.org/packages/e8/91/855af51d625b23aa987116a19e231d2aaef9c4a415273ddc189b79a45fee/pydantic_core-2.46.4-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:af8244b2bef6aaad6d92cda81372de7f8c8d36c9f0c3ea36e827c60e7d9467a0", size = 2099593, upload-time = "2026-05-06T13:39:47.682Z" }, + { url = "https://files.pythonhosted.org/packages/fb/1b/8784a54c65edb5f49f0a14d6977cf1b209bba85a4c77445b255c2de58ab3/pydantic_core-2.46.4-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:5a4330cdbc57162e4b3aa303f588ba752257694c9c9be3e7ebb11b4aca659b5d", size = 1935226, upload-time = "2026-05-06T13:40:40.428Z" }, + { url = "https://files.pythonhosted.org/packages/e8/e7/1955d28d1afc56dd4b3ad7cc0cf39df1b9852964cf16e5d13912756d6d6b/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29c61fc04a3d840155ff08e475a04809278972fe6aef51e2720554e96367e34b", size = 1974605, upload-time = "2026-05-06T13:37:32.029Z" }, + { url = "https://files.pythonhosted.org/packages/93/e2/3fedbf0ba7a22850e6e9fd78117f1c0f10f950182344d8a6c535d468fdd8/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c50f2528cf200c5eed56faf3f4e22fcd5f38c157a8b78576e6ba3168ec35f000", size = 2030777, upload-time = "2026-05-06T13:38:55.239Z" }, + { url = "https://files.pythonhosted.org/packages/f8/61/46be275fcaaba0b4f5b9669dd852267ce1ff616592dccf7a7845588df091/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0cbe8b01f948de4286c74cdd6c667aceb38f5c1e26f0693b3983d9d74887c65e", size = 2236641, upload-time = "2026-05-06T13:37:08.096Z" }, + { url = "https://files.pythonhosted.org/packages/60/db/12e93e46a8bac9988be3c016860f83293daea8c716c029c9ace279036f2f/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:617d7e2ca7dcb8c5cf6bcb8c59b8832c94b36196bbf1cbd1bfb56ed341905edd", size = 2286404, upload-time = "2026-05-06T13:40:20.221Z" }, + { url = "https://files.pythonhosted.org/packages/e2/4a/4d8b19008f38d31c53b8219cfedc2e3d5de5fe99d90076b7e767de29274f/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7027560ee92211647d0d34e3f7cd6f50da56399d26a9c8ad0da286d3869a53f3", size = 2109219, upload-time = "2026-05-06T13:38:12.153Z" }, + { url = "https://files.pythonhosted.org/packages/88/70/3cbc40978fefb7bb09c6708d40d4ad1a5d70fd7213c3d17f971de868ec1f/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:f99626688942fb746e545232e7726926f3be91b5975f8b55327665fafda991c7", size = 2110594, upload-time = "2026-05-06T13:40:02.971Z" }, + { url = "https://files.pythonhosted.org/packages/9d/20/b8d36736216e29491125531685b2f9e61aa5b4b2599893f8268551da3338/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fc3e9034a63de20e15e8ade85358bc6efc614008cab72898b4b4952bea0509ff", size = 2159542, upload-time = "2026-05-06T13:39:27.506Z" }, + { url = "https://files.pythonhosted.org/packages/1d/a2/367df868eb584dacf6bf82a389272406d7178e301c4ac82545ab98bc2dd9/pydantic_core-2.46.4-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:97e7cf2be5c77b7d1a9713a05605d49460d02c6078d38d8bef3cbe323c548424", size = 2168146, upload-time = "2026-05-06T13:38:31.93Z" }, + { url = "https://files.pythonhosted.org/packages/c1/b8/4460f77f7e201893f649a29ab355dddd3beee8a97bcb1a320db414f9a06e/pydantic_core-2.46.4-cp314-cp314t-musllinux_1_1_armv7l.whl", hash = "sha256:3bf92c5d0e00fefaab325a4d27828fe6b6e2a21848686b5b60d2d9eeb09d76c6", size = 2306309, upload-time = "2026-05-06T13:37:44.717Z" }, + { url = "https://files.pythonhosted.org/packages/64/c4/be2639293acd87dc8ddbcec41a73cee9b2ebf996fe6d892a1a74e88ad3f7/pydantic_core-2.46.4-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:3ecbc122d18468d06ca279dc26a8c2e2d5acb10943bb35e36ae92096dc3b5565", size = 2369736, upload-time = "2026-05-06T13:37:05.645Z" }, + { url = "https://files.pythonhosted.org/packages/30/a6/9f9f380dbb301f67023bf8f707aaa75daadf84f7152d95c410fd7e81d994/pydantic_core-2.46.4-cp314-cp314t-win32.whl", hash = "sha256:e846ae7835bf0703ae43f534ab79a867146dadd59dc9ca5c8b53d5c8f7c9ef02", size = 1955575, upload-time = "2026-05-06T13:38:51.116Z" }, + { url = "https://files.pythonhosted.org/packages/40/1f/f1eb9eb350e795d1af8586289746f5c5677d16043040d63710e22abc43c9/pydantic_core-2.46.4-cp314-cp314t-win_amd64.whl", hash = "sha256:2108ba5c1c1eca18030634489dc544844144ee36357f2f9f780b93e7ddbb44b5", size = 2051624, upload-time = "2026-05-06T13:38:21.672Z" }, + { url = "https://files.pythonhosted.org/packages/f6/d2/42dd53d0a85c27606f316d3aa5d2869c4e8470a5ed6dec30e4a1abe19192/pydantic_core-2.46.4-cp314-cp314t-win_arm64.whl", hash = "sha256:4fcbe087dbc2068af7eda3aa87634eba216dbda64d1ae73c8684b621d33f6596", size = 2017325, upload-time = "2026-05-06T13:40:52.723Z" }, + { url = "https://files.pythonhosted.org/packages/9d/1d/8987ad40f65ae1432753072f214fb5c74fe47ffbd0698bb9cbbb585664f8/pydantic_core-2.46.4-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:1d8ba486450b14f3b1d63bc521d410ec7565e52f887b9fb671791886436a42f7", size = 2095527, upload-time = "2026-05-06T13:39:52.283Z" }, + { url = "https://files.pythonhosted.org/packages/64/d3/84c282a7eee1d3ac4c0377546ef5a1ea436ce26840d9ac3b7ed54a377507/pydantic_core-2.46.4-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:3009f12e4e90b7f88b4f9adb1b0c4a3d58fe7820f3238c190047209d148026df", size = 1936024, upload-time = "2026-05-06T13:40:15.671Z" }, + { url = "https://files.pythonhosted.org/packages/d7/ca/eac61596cdeb4d7e174d3dc0bd8a6238f14f75f97a24e7b7db4c7e7340a0/pydantic_core-2.46.4-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad785e92e6dc634c21555edc8bd6b64957ab844541bcb96a1366c202951ae526", size = 1990696, upload-time = "2026-05-06T13:38:34.717Z" }, + { url = "https://files.pythonhosted.org/packages/fa/c3/7c8b240552251faf6b3a957db200fcfbbcec36763c050428b601e0c9b83b/pydantic_core-2.46.4-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00c603d540afdd6b80eb39f078f33ebd46211f02f33e34a32d9f053bba711de0", size = 2147590, upload-time = "2026-05-06T13:39:29.883Z" }, +] + +[[package]] +name = "pymupdf" +version = "1.27.2.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/22/32/708bedc9dde7b328d45abbc076091769d44f2f24ad151ad92d56a6ec142b/pymupdf-1.27.2.3.tar.gz", hash = "sha256:7a92faa25129e8bbec5e50eeb9214f187665428c31b05c4ef6e36c58c0b1c6d2", size = 85759618, upload-time = "2026-04-24T14:13:14.42Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/dc/09/ddbdfa7ee91fbabd6f63d7d744884cbdfe3e7ff9b8604749fb38bddf5c5d/pymupdf-1.27.2.3-cp310-abi3-macosx_10_9_x86_64.whl", hash = "sha256:fc1bc3cae6e9e150b0dbb0a9221bdfd411d65f0db2fe359eaa22467d7cc2a05f", size = 24002636, upload-time = "2026-04-24T14:09:17.459Z" }, + { url = "https://files.pythonhosted.org/packages/01/89/3f8edd6c4f50ca370e2a2f2a3011face36f3760728ffe76dffec91c0fca0/pymupdf-1.27.2.3-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:660d93cb6da5bbddf11d3982ae27745dd3a9902d9f24cdb69adab83962294b5a", size = 23278238, upload-time = "2026-04-24T14:09:32.882Z" }, + { url = "https://files.pythonhosted.org/packages/c3/26/b7e5a70eb83bd189f8b5df87ec442746b992f2f632662839b288170d357d/pymupdf-1.27.2.3-cp310-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:1dd460a3ae4597a755f00a3bd9771f5ebf1531dc111f6a36bf05dd00a6b84425", size = 24333923, upload-time = "2026-04-24T14:09:47.341Z" }, + { url = "https://files.pythonhosted.org/packages/e4/a0/aa1ee2240f29481a04a827c313333b4ecd8a14d6ac3e15d3f41a30574781/pymupdf-1.27.2.3-cp310-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:857842b4888827bd6155a1131341b2822a7ebe9a8c15a975fd7d490d7a64a30c", size = 24963198, upload-time = "2026-04-24T14:10:07.408Z" }, + { url = "https://files.pythonhosted.org/packages/69/49/4f742451f980840829fc00ba158bebb25d389c846d8f4f8c65936ee55de8/pymupdf-1.27.2.3-cp310-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:580983849c64a08d08344ca3d1580e87c01f046a8392421797bc850efd72a5b6", size = 25184609, upload-time = "2026-04-24T14:10:22.911Z" }, + { url = "https://files.pythonhosted.org/packages/f6/3f/3853d6608f394faf6eec2bd4e8ea9f6a00beea329b071abdb29f4164cc3d/pymupdf-1.27.2.3-cp310-abi3-win32.whl", hash = "sha256:a5c1088a87189891a4946ab314a14b7934ac4c5b6077f7e74ebee956f8906d0e", size = 18019286, upload-time = "2026-04-24T14:10:34.239Z" }, + { url = "https://files.pythonhosted.org/packages/44/47/5fb10fe73f96b31253a41647c362ea9e0380920bddf16028414a051247fc/pymupdf-1.27.2.3-cp310-abi3-win_amd64.whl", hash = "sha256:d20f68ef15195e073071dbc4ae7455257c7889af7584e39df490c0a92728526e", size = 19249102, upload-time = "2026-04-24T14:10:46.72Z" }, + { url = "https://files.pythonhosted.org/packages/53/a4/b9e91aac82293f9c954654c85581ee8212b5b05efadc534b581141241e6f/pymupdf-1.27.2.3-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:77691604c5d1d0233827139bbcdea61fd57879c84712b8e49b1f45520f7ab9c2", size = 25000393, upload-time = "2026-04-24T14:11:01.669Z" }, +] + +[[package]] +name = "pypdfium2" +version = "5.10.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1d/78/d9b45abb97a3686643f7c6472a5f7688f2013a373226121dc76b9debbacf/pypdfium2-5.10.1.tar.gz", hash = "sha256:f257d2011eb43c846b7e9f5a802e28646b29732763e4a35dd6ca76f9be580538", size = 272963, upload-time = "2026-06-15T10:09:16.179Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/98/49/0b85fcc0d236582143a25cf275b0b4f5d786f51eb07a89ec9c79d43efe18/pypdfium2-5.10.1-py3-none-android_23_arm64_v8a.whl", hash = "sha256:13abf7a9f5e0ddebc8bbcccea5f13ae5abe8a298ea219e125b0fc24c1d2171b4", size = 3409176, upload-time = "2026-06-15T10:08:36.017Z" }, + { url = "https://files.pythonhosted.org/packages/20/d2/2f522c5b2ad5166edf256bb4dbab97de5d07b2573f8a5630ddfcd1f8d4ee/pypdfium2-5.10.1-py3-none-android_23_armeabi_v7a.whl", hash = "sha256:a0dc52b56631e2f7edcdb22bae3b155aa840bec32c5bd05781e90baaecee88e7", size = 2866175, upload-time = "2026-06-15T10:08:37.955Z" }, + { url = "https://files.pythonhosted.org/packages/a7/be/477548c026c2badfdbf4afc3358b7135121fb5bec2e2effcb67e3a674d0b/pypdfium2-5.10.1-py3-none-macosx_12_0_arm64.whl", hash = "sha256:ebb9e63f92d15fc41b359fe7a187233dfae37548800e1fa09cb2fc466ac89951", size = 3621427, upload-time = "2026-06-15T10:08:39.969Z" }, + { url = "https://files.pythonhosted.org/packages/8c/9b/0131c7f711b62c6edd6b200e9eb6340be6de4f6dc5baae625e3394d8d5fb/pypdfium2-5.10.1-py3-none-macosx_12_0_x86_64.whl", hash = "sha256:d04f2050b6b32bb18624688b600543342a4ab3aacf64bf66521a5af72bbc7de1", size = 3682825, upload-time = "2026-06-15T10:08:42.181Z" }, + { url = "https://files.pythonhosted.org/packages/9d/3d/bddfceb6e67e54d6dd1ab6c0f1feff796a89596e40f6345a3b4cc6a3d408/pypdfium2-5.10.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0de53d2710ca9509fc2812340acc57c3f043697609068592d87de654f8cabf44", size = 3682206, upload-time = "2026-06-15T10:08:44.087Z" }, + { url = "https://files.pythonhosted.org/packages/58/08/dedeb25c6645fc8a5eda24f54e0b1d083b7334ababf5f518bb939d729cc0/pypdfium2-5.10.1-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:10a26ce04795f8ec079e81c707fcb5737061e8a78025babc3d6e36642e9c903a", size = 3413720, upload-time = "2026-06-15T10:08:45.739Z" }, + { url = "https://files.pythonhosted.org/packages/cc/48/69e1fc8b1216005243c6415183bbf6de1cda3f5a06758b3fa4a26a7385c6/pypdfium2-5.10.1-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:be6d2a8d1bcfd777188e7aa55a25c83f34d54e8350ad8810fb32017787d9b0d9", size = 3812913, upload-time = "2026-06-15T10:08:47.45Z" }, + { url = "https://files.pythonhosted.org/packages/72/7f/132455a58ad736d76815c6cd1307532c3f433299d945b9d2f8cc2387c309/pypdfium2-5.10.1-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cf4d2527f79f31c550490cc74c9f32e19385a944630a3ef4cd4d9b6f961fbf77", size = 4223220, upload-time = "2026-06-15T10:08:49.099Z" }, + { url = "https://files.pythonhosted.org/packages/bf/8c/4d5804eca598bbe894e0a9a510807e221c1623e7276ce6b68fa2660dc933/pypdfium2-5.10.1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ba127750bc3f4161461538d532d74491cd976f584f1753a6cee9cb821338ec1", size = 3738950, upload-time = "2026-06-15T10:08:50.821Z" }, + { url = "https://files.pythonhosted.org/packages/d1/7f/baac59bf14ff914d97789ee0368c22ae233aa857aa9c0726bcb515dbc4d7/pypdfium2-5.10.1-py3-none-manylinux_2_27_s390x.manylinux_2_28_s390x.whl", hash = "sha256:80f30517ee089dfbbc6e9de6da365b6e8c0ce8f80c40b7d4025a3b1d3bbd8a70", size = 4029869, upload-time = "2026-06-15T10:08:52.494Z" }, + { url = "https://files.pythonhosted.org/packages/d0/d7/a5d58a0bcba31a0e37ed636a76ef3d2d215733f28af61637287d061b0c54/pypdfium2-5.10.1-py3-none-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ad5f5de15febb788c6eb3853e58aceda9cd8c5187c92472abaeecf9558deb0cf", size = 3990927, upload-time = "2026-06-15T10:08:54.555Z" }, + { url = "https://files.pythonhosted.org/packages/da/1a/98eebd14b36812176297cf765d504ebeebc982f895c8a3a9fbd2717797de/pypdfium2-5.10.1-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:8947fa3cd808da33960bdf8ff9e5247aa94ccd94f0b09bb3402e99498d83bcc9", size = 4989624, upload-time = "2026-06-15T10:08:56.284Z" }, + { url = "https://files.pythonhosted.org/packages/1c/20/f2e124d607b8bb90a9f1ce976afff38c70e215cd7ea86af784cb2e8a19dd/pypdfium2-5.10.1-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:139a6387a3a2652f288e53164268bb03af4fa221d78484ee18407053a60082a3", size = 4535124, upload-time = "2026-06-15T10:08:58.214Z" }, + { url = "https://files.pythonhosted.org/packages/59/ef/469ea87f668a32ff3280ea15e522e3a7858d2c80f1ecc320ece1244624c9/pypdfium2-5.10.1-py3-none-musllinux_1_2_i686.whl", hash = "sha256:172ff3e10358d66456e27fb0b8b5098e28ec24e51072eb4b5b86077d550e21bb", size = 5229373, upload-time = "2026-06-15T10:09:00.702Z" }, + { url = "https://files.pythonhosted.org/packages/c3/48/c7ed3001f0c5e28114c98bf918c8121e422a65ba7323e1e12f3f28e2d278/pypdfium2-5.10.1-py3-none-musllinux_1_2_ppc64le.whl", hash = "sha256:09fda0609dc4749c9865a0315c447d6f2583a580693bcabd69980d3fbb22ad51", size = 5140010, upload-time = "2026-06-15T10:09:02.734Z" }, + { url = "https://files.pythonhosted.org/packages/b2/bc/00b731bfc1fdc0f3c7d91108fceb54978ff4f5a92336820e5ed6c12535ff/pypdfium2-5.10.1-py3-none-musllinux_1_2_riscv64.whl", hash = "sha256:6b01adcfe9aaf7a635a59bed5687fd4fd7b0da292664f050d4ebd2bfa5c70584", size = 4643310, upload-time = "2026-06-15T10:09:04.794Z" }, + { url = "https://files.pythonhosted.org/packages/9a/e8/3ad242233f657c19092a8c83684c8154b8d02a826535a6a2591d91aa5dde/pypdfium2-5.10.1-py3-none-musllinux_1_2_s390x.whl", hash = "sha256:610e14c37d2090b826dccc0604fc7e7612c0ce591190780ae228abdb9abb971e", size = 5087879, upload-time = "2026-06-15T10:09:06.861Z" }, + { url = "https://files.pythonhosted.org/packages/80/3f/9d0747a02ac3021ed3db7ac27c5187d97e78b0253a4bdfbf386666968474/pypdfium2-5.10.1-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:f2803020952afa57e1e148adc19369b835154e1fa251a1ca85008ab6466a710f", size = 5047369, upload-time = "2026-06-15T10:09:08.883Z" }, + { url = "https://files.pythonhosted.org/packages/9e/41/7d5187e9527eae81890a3b13193442112ef788d61ddaa68a6d59ac447bec/pypdfium2-5.10.1-py3-none-win32.whl", hash = "sha256:8702bb4f01ddfc8e7757b41b4c2c8392ac17c9f0234476e1e69672ea7c6d6aa0", size = 3680056, upload-time = "2026-06-15T10:09:10.95Z" }, + { url = "https://files.pythonhosted.org/packages/16/1d/c62bd59dd8345cc4b640f942f465633f6b07b859d01ddb648610a7bf5c7c/pypdfium2-5.10.1-py3-none-win_amd64.whl", hash = "sha256:58da5b51fb7884c7d21a05062ab13edb011d1a08dfd9694f3d5d685df62796b9", size = 3812105, upload-time = "2026-06-15T10:09:12.684Z" }, + { url = "https://files.pythonhosted.org/packages/10/d5/21bac39125df8a93e99c04583486b58a62b5997d6b3541e3ad0f69053392/pypdfium2-5.10.1-py3-none-win_arm64.whl", hash = "sha256:e3301c2f7a66fb8cb57dba857d0c9e90215e178f6602a87c5a306cd98513dab8", size = 3600043, upload-time = "2026-06-15T10:09:14.606Z" }, +] + +[[package]] +name = "python-docx" +version = "1.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "lxml" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a9/f7/eddfe33871520adab45aaa1a71f0402a2252050c14c7e3009446c8f4701c/python_docx-1.2.0.tar.gz", hash = "sha256:7bc9d7b7d8a69c9c02ca09216118c86552704edc23bac179283f2e38f86220ce", size = 5723256, upload-time = "2025-06-16T20:46:27.921Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d0/00/1e03a4989fa5795da308cd774f05b704ace555a70f9bf9d3be057b680bcf/python_docx-1.2.0-py3-none-any.whl", hash = "sha256:3fd478f3250fbbbfd3b94fe1e985955737c145627498896a8a6bf81f4baf66c7", size = 252987, upload-time = "2025-06-16T20:46:22.506Z" }, +] + +[[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.32" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5b/42/55c32bb9b12693c092ad250a0e82edb5b31ddeda6eb772de5f308b3804ad/python_multipart-0.0.32.tar.gz", hash = "sha256:be54b7f3fa167bb83e4fcd936b887b708f4e57fe75911c02aebf53efaf8d938e", size = 46881, upload-time = "2026-06-04T16:18:58.647Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e1/04/e8135ebd1ad02c56ec633277529b2602ff99ff634be76cdba5744cf554fd/python_multipart-0.0.32-py3-none-any.whl", hash = "sha256:ff6d3f776f16878c894e52e107296ffc890e913c611b1a4ec6c44e2821fe2e23", size = 30042, upload-time = "2026-06-04T16:18:57.319Z" }, +] + +[[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/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 = "rapidfuzz" +version = "3.14.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2c/21/ef6157213316e85790041254259907eb722e00b03480256c0545d98acd33/rapidfuzz-3.14.5.tar.gz", hash = "sha256:ba10ac57884ce82112f7ed910b67e7fb6072d8ef2c06e30dc63c0f604a112e0e", size = 57901753, upload-time = "2026-04-07T11:16:31.931Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d3/e3/574435c6aafb80254c191ef40d7aca2cb2bb97a095ec9395e9fa59ac307a/rapidfuzz-3.14.5-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:0d3378f471ef440473a396ce2f8e97ee12f89a78b495540e0a5617bbfe895638", size = 1944601, upload-time = "2026-04-07T11:14:18.771Z" }, + { url = "https://files.pythonhosted.org/packages/d0/1f/fbad3102a255ecc112ce9a7e779bacab7fd14398217be8868dc9082ba363/rapidfuzz-3.14.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1e910eebca9fd0eba245c0555e764597e8a0cccb673a92da2dc2397050725f48", size = 1164293, upload-time = "2026-04-07T11:14:20.534Z" }, + { url = "https://files.pythonhosted.org/packages/88/37/a3eb7ff6121ed3a5f199a8c38cc86c8e481816f879cb0e0b738b078c9a7e/rapidfuzz-3.14.5-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:01550fe5f60fd176aa66b7611289d46dc4aa4b1b904874c7b6d1d54e581c5ec1", size = 1371999, upload-time = "2026-04-07T11:14:22.63Z" }, + { url = "https://files.pythonhosted.org/packages/79/72/97a9728c711c7c1b06e107d3f0623880fb4ef90e147ed13c551a1730e7cc/rapidfuzz-3.14.5-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:48bee0b91bebfaec41e1081e351000659ab7570cc4598d617aa04d5bf827f9e6", size = 3145715, upload-time = "2026-04-07T11:14:24.508Z" }, + { url = "https://files.pythonhosted.org/packages/ed/54/d5caabbea233ac90c286c87c260e49d7641467e87438a18d858e41c82e91/rapidfuzz-3.14.5-cp312-cp312-manylinux_2_39_riscv64.whl", hash = "sha256:7e580cb04ad849ae9b786fa21383c6b994b6e6c1444ad1cb9f22392759d72741", size = 1456304, upload-time = "2026-04-07T11:14:26.515Z" }, + { url = "https://files.pythonhosted.org/packages/fc/a7/2d1a81250ac8c01a0100c026018e76f0e7a097ff63e4c553e02a6938c6fb/rapidfuzz-3.14.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:09d6c9ba091854f07817055d795d604179c12a8f308ba4c7d56f3719dfea1646", size = 2389089, upload-time = "2026-04-07T11:14:28.635Z" }, + { url = "https://files.pythonhosted.org/packages/65/0d/c47c3872203ae88e6506997c0b576ad731f5261daa25d559be09c9756658/rapidfuzz-3.14.5-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:1e989f86113be66574113b9c7bdf4793f3f863d248e47d911b355e05ca6b6b10", size = 2493404, upload-time = "2026-04-07T11:14:30.577Z" }, + { url = "https://files.pythonhosted.org/packages/8f/2f/71e0a5a3130792146c8a200a2dd1e52aa16f7c1074012e17f2601eea9a90/rapidfuzz-3.14.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0ebd1a18e2e47bc0b292a07e6ed9c3642f8aaa672d12253885f599b50807a4f9", size = 4251709, upload-time = "2026-04-07T11:14:32.451Z" }, + { url = "https://files.pythonhosted.org/packages/86/45/d39874901abacef325adb5b34ae416817c8486dfb4fb87c7a9b74ec5b072/rapidfuzz-3.14.5-cp312-cp312-win32.whl", hash = "sha256:9981d38a703b86f0e315a3cd229fd1906fe1d91c989ed121fb975b3c849f89f5", size = 1710069, upload-time = "2026-04-07T11:14:34.37Z" }, + { url = "https://files.pythonhosted.org/packages/85/0b/f65572c53de8a1c704bda707f63a447b67bdbe95d7cdc70d18885e191df5/rapidfuzz-3.14.5-cp312-cp312-win_amd64.whl", hash = "sha256:d8375e3da319593389727c3187ccaf3e0e84199accc530866b8e0f2b79af05e9", size = 1540630, upload-time = "2026-04-07T11:14:36.287Z" }, + { url = "https://files.pythonhosted.org/packages/5e/c3/143be3a578f989758cae516f3270d5cbb49783a7bfdf57cc27a670e00456/rapidfuzz-3.14.5-cp312-cp312-win_arm64.whl", hash = "sha256:478b59bb018a6780d73f33e38d0b3ec5e968a6c1ed42876b993dd456b7aa20e8", size = 813137, upload-time = "2026-04-07T11:14:38.289Z" }, + { url = "https://files.pythonhosted.org/packages/11/66/252803f2010ba699618cdc048b6e1f7cc1f433c08b4a9a17579b92ab0142/rapidfuzz-3.14.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ebd8fd343bf8492a1e60bcb6dc99f90f74f65d98d8241a6b3e1fed225b76ecd6", size = 1940205, upload-time = "2026-04-07T11:14:40.319Z" }, + { url = "https://files.pythonhosted.org/packages/ea/59/b2afd98e41af9cd54554a4c1c423d84cdd60e6b1c0a09496f033b55f60ec/rapidfuzz-3.14.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6737b35d5af7479c5bf9710f7b17edd9d2c43128d974d25fb4ea653e42c64609", size = 1159639, upload-time = "2026-04-07T11:14:42.52Z" }, + { url = "https://files.pythonhosted.org/packages/a3/31/7aa7e62c4c516a7af322ed0c4f0774208b72d457d0cfec808bad0df12f4a/rapidfuzz-3.14.5-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b002c7994cc9f2bc9d9856f0fbaee6e8072c983873846c92f25cefba5b2a925f", size = 1367194, upload-time = "2026-04-07T11:14:44.25Z" }, + { url = "https://files.pythonhosted.org/packages/90/79/2fc252a63bc91d3c3b234d0a3a6ad4ebc460037a23cdcdaf9285f986e6c9/rapidfuzz-3.14.5-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:17a34330cd2a538c1ce5d400b61ba358c5b72c654b928ff87b362e88f8b864c7", size = 3151805, upload-time = "2026-04-07T11:14:46.21Z" }, + { url = "https://files.pythonhosted.org/packages/17/54/0c83508f2683ea70e2d05f8527eb07328acf7bb1e9d97a3bece5702378e7/rapidfuzz-3.14.5-cp313-cp313-manylinux_2_39_riscv64.whl", hash = "sha256:95d937e74c1a7a1287dfb03b62a827be08ede10a155cf1af73bbf47f2b73ee6e", size = 1455667, upload-time = "2026-04-07T11:14:47.991Z" }, + { url = "https://files.pythonhosted.org/packages/71/1b/070175e873177814d58850a01ebe80e20ae11e93eb4da894d563988660fa/rapidfuzz-3.14.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:46b92a9970dcc34f0096901c792644094cab49554ac3547f35e3aebbdf0a3610", size = 2388246, upload-time = "2026-04-07T11:14:50.098Z" }, + { url = "https://files.pythonhosted.org/packages/c9/dd/77caf7aaf9c2be050ad1f128d7c24ff0f59079aa62c5f62f9df41c0af45e/rapidfuzz-3.14.5-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:e012177c8e8a8a0754ae0d6027d63042aa5ff036d9f40f07cb3466a6082e21b8", size = 2494333, upload-time = "2026-04-07T11:14:52.303Z" }, + { url = "https://files.pythonhosted.org/packages/2c/e2/dd7e1f2aa31a8fbbfc16b0610af1d770ffaf1287490f3c8c5b1c52da264f/rapidfuzz-3.14.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a2ae6f53f99c9a0eca7a0afc5b4e45fc73bc1dd4ac74c00509031d76df80ed98", size = 4258579, upload-time = "2026-04-07T11:14:54.538Z" }, + { url = "https://files.pythonhosted.org/packages/9c/0a/ac99e1ba347ba0e85e0bb60b74231d55fb93c0eff43f2920ccb413d0be08/rapidfuzz-3.14.5-cp313-cp313-win32.whl", hash = "sha256:4a60f0057231188e3bd30216f7b4e0f279b11fa4ec818bb6c1d9f014d1562fbc", size = 1709231, upload-time = "2026-04-07T11:14:56.524Z" }, + { url = "https://files.pythonhosted.org/packages/cf/cb/0e251d731b3166378644238e8f0cf9e89858c024e19f75ca9f7e3ae83fd5/rapidfuzz-3.14.5-cp313-cp313-win_amd64.whl", hash = "sha256:11bfc2ed8fbe4ab86bd516fadefab126f90e6dcadffa761739fcb304707dfd35", size = 1538519, upload-time = "2026-04-07T11:14:58.635Z" }, + { url = "https://files.pythonhosted.org/packages/30/6f/4548132acc947db6d5346a248e44a8b3a22d608ef30e770fb578caaf2d00/rapidfuzz-3.14.5-cp313-cp313-win_arm64.whl", hash = "sha256:b486b5218808f6f4dc471b114b1054e63553db69705c97da0271f47bd706aedd", size = 812628, upload-time = "2026-04-07T11:15:00.552Z" }, + { url = "https://files.pythonhosted.org/packages/00/60/69b177577290c5eab892c6f75fe89c3aff3f9ae80298a78d9372b1cecb9a/rapidfuzz-3.14.5-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:39ef8658aaf67d51667e7bdaf7096f432333377d8302ac43c70b5df8a4cf89b8", size = 1970231, upload-time = "2026-04-07T11:15:02.603Z" }, + { url = "https://files.pythonhosted.org/packages/48/38/2fd790052659cc4e2907b63c25433f0987864b445c1aeec1a302ef5ad948/rapidfuzz-3.14.5-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:9ad37a0be705b544af6296da8edddc260d10a8ae5462530fc9991f66498bb1f9", size = 1194394, upload-time = "2026-04-07T11:15:04.572Z" }, + { url = "https://files.pythonhosted.org/packages/80/f4/28430ad8472fc3536e8ebd51a864a226e979cfe924c6e3f83d111373aa74/rapidfuzz-3.14.5-cp313-cp313t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d45e06f60729e07d9b20c205f7e5cff90b6ef2584e852eecf46e045aea69627d", size = 1377051, upload-time = "2026-04-07T11:15:06.728Z" }, + { url = "https://files.pythonhosted.org/packages/77/7e/9aeacabcfd1e77397968362e5b98fe14248b8307011136b17daf99752a8e/rapidfuzz-3.14.5-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e52da10236aa6212de71b9e170bace65b64b129c0dea7fc243d6c9ce976f5074", size = 3160565, upload-time = "2026-04-07T11:15:08.667Z" }, + { url = "https://files.pythonhosted.org/packages/56/f4/db4dd7be0cd2f2022117ac5407d905f435d60e48baaea313a567ad27e865/rapidfuzz-3.14.5-cp313-cp313t-manylinux_2_39_riscv64.whl", hash = "sha256:440d30faaf682ca496170a7f0cc5453ec942e3e079f0fd802c9a7f938dfb50a3", size = 1442113, upload-time = "2026-04-07T11:15:11.138Z" }, + { url = "https://files.pythonhosted.org/packages/a4/99/0e9f6aa57f3e32a767216f797e56dc96b720fcecfb9d8ee907ecc82f8d66/rapidfuzz-3.14.5-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:56227a61fd3d17b0cd9793132431f3a3d07c8654be96794ba9f89fe0fc8b2d09", size = 2396618, upload-time = "2026-04-07T11:15:13.154Z" }, + { url = "https://files.pythonhosted.org/packages/60/94/44a78e39ffce17cbdd3e2b53b696acc751d5d153be0f499d052b07a4d904/rapidfuzz-3.14.5-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:2e83cd2e25bb4edd97b689d9979d9c3acccdaaf26ceac08212ceece202febcfa", size = 2478220, upload-time = "2026-04-07T11:15:15.193Z" }, + { url = "https://files.pythonhosted.org/packages/dd/df/454311469a09a507e9d784a35796742bec22e4cebe75551e2da4e0e290fd/rapidfuzz-3.14.5-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:af3b859726cd3374287e405e14b9634563c078c5531a4f62375508addebddad1", size = 4265027, upload-time = "2026-04-07T11:15:17.28Z" }, + { url = "https://files.pythonhosted.org/packages/fc/01/175465a9ab3e3b70ba669058372f009d1d49c1746e2dcd56b69df188d3a5/rapidfuzz-3.14.5-cp313-cp313t-win32.whl", hash = "sha256:8ce1d850b3c0178440efde9e884d98421b5e87ff925f364d6d79e23910d7593f", size = 1766814, upload-time = "2026-04-07T11:15:19.687Z" }, + { url = "https://files.pythonhosted.org/packages/1b/a0/a9b84a47af06ebed94a1439eb2f02adebfb8628bcd30af1fe3e02f5ef56c/rapidfuzz-3.14.5-cp313-cp313t-win_amd64.whl", hash = "sha256:c84af70bcf34e99aee894e46a0f1ac77f17d0ef828179c387407642e2466d28a", size = 1582448, upload-time = "2026-04-07T11:15:21.98Z" }, + { url = "https://files.pythonhosted.org/packages/1e/f1/5937800238b3f8248e70860d79f69ba8f73e764fff47e36bc9e2f26dbcc6/rapidfuzz-3.14.5-cp313-cp313t-win_arm64.whl", hash = "sha256:aac0ad28c686a5e72b81668b906c030ee28050b244544b8af68e12fb32543895", size = 832932, upload-time = "2026-04-07T11:15:24.358Z" }, + { url = "https://files.pythonhosted.org/packages/81/41/aa3ffb3355e62e1bf91f6599b3092e866bc88487a07c524004943c7676df/rapidfuzz-3.14.5-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:1a31cc6d7d03e7318a0974c038959c59e19c752b81115f2e9138b3331cd64d45", size = 1943327, upload-time = "2026-04-07T11:15:26.266Z" }, + { url = "https://files.pythonhosted.org/packages/2d/e1/c2141f1840a41e07ad2db6f724945f8f8ff3065463899a22939152dd6e09/rapidfuzz-3.14.5-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0298d357e2bc59d572da4db0bc631009b6f8f6c9bc8c11e99a12b833f16b6575", size = 1161755, upload-time = "2026-04-07T11:15:28.659Z" }, + { url = "https://files.pythonhosted.org/packages/ca/07/66e753eeaa353161d1d331b7dd517bb349b0bacfebe8496d7b26be26f81f/rapidfuzz-3.14.5-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:59b3dba758661a318995655435c6ab20a04ade79fa51e75bc8dc107cac8df280", size = 1376571, upload-time = "2026-04-07T11:15:31.225Z" }, + { url = "https://files.pythonhosted.org/packages/c8/85/9535df0b78ba51f478c9ce7eb6d1f85535cc31fe356773b48fd9d3e563ca/rapidfuzz-3.14.5-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4900143d82071bdda533b00300c40b14b963ff826b3642cc463b6dd0f036585e", size = 3156468, upload-time = "2026-04-07T11:15:33.428Z" }, + { url = "https://files.pythonhosted.org/packages/81/ee/b667eb93bba6dc4e0de658edd778e1619dc4d6aab68fa5e5c7f075152735/rapidfuzz-3.14.5-cp314-cp314-manylinux_2_39_riscv64.whl", hash = "sha256:feedf219672eef83ea6be6f3bb093bba396a8560fc75be85ba225f082903df0a", size = 1458311, upload-time = "2026-04-07T11:15:35.557Z" }, + { url = "https://files.pythonhosted.org/packages/7d/ce/479074f5624364a48df3403c538797ef22d3ac49c19dc76c3f79fcdcc70c/rapidfuzz-3.14.5-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:419e4397a36e2665ec992d8d64c20ba4b2a42500c76ecadeca78a4f19cb9cc32", size = 2398228, upload-time = "2026-04-07T11:15:37.669Z" }, + { url = "https://files.pythonhosted.org/packages/0b/15/a8982f649150fffbdcd6f17565974501f6ab33b2795267bffbd4a7ba905b/rapidfuzz-3.14.5-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:97131ab2be39043054ee28d99e09efe316e6d53449b7e962dfcf3c2de8b2b246", size = 2497226, upload-time = "2026-04-07T11:15:39.857Z" }, + { url = "https://files.pythonhosted.org/packages/19/52/5267c03ef6759831b7d4625a0c9c06e87baa2fae084b61ac9c388858317b/rapidfuzz-3.14.5-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:593c00dac4e30231c35bf3b4f1da8ec0998762e9e94425586a5d636fcd57f9d0", size = 4262283, upload-time = "2026-04-07T11:15:42.279Z" }, + { url = "https://files.pythonhosted.org/packages/71/c0/2579f343a97f5254c43bb5853baccc01488357dcb64a27bcb869b7888a4a/rapidfuzz-3.14.5-cp314-cp314-win32.whl", hash = "sha256:0084b687b02b4e569b46d8d6d4ad25659528e6081cd6d067ca453a69035f07e4", size = 1744614, upload-time = "2026-04-07T11:15:44.498Z" }, + { url = "https://files.pythonhosted.org/packages/17/eb/8edfed1e80119dc9c35b11df4bc701eea85622ad681fff0263b6961d3224/rapidfuzz-3.14.5-cp314-cp314-win_amd64.whl", hash = "sha256:5dfa89d78f22cd773054caff44827b846161a29f2dcf7e78b8f90d086621e502", size = 1588971, upload-time = "2026-04-07T11:15:46.86Z" }, + { url = "https://files.pythonhosted.org/packages/f6/04/5676df93c85cfa57a3045d8047318df9f3cd58c7b8a99340dd95f874795e/rapidfuzz-3.14.5-cp314-cp314-win_arm64.whl", hash = "sha256:67f3f9d2b444268ab53e47d31bab89954888d23c04c6789f2c727e51fe4b1d13", size = 834985, upload-time = "2026-04-07T11:15:49.411Z" }, + { url = "https://files.pythonhosted.org/packages/f7/0d/4a8988cea658fe335048ddef8c876addff1b6daa3c9ca8ad65a5a2196e69/rapidfuzz-3.14.5-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:77eac0526899b3c3ad1454bb2b03cdb491d67358ec8ef0c9c48bd61b632b431d", size = 1972517, upload-time = "2026-04-07T11:15:51.819Z" }, + { url = "https://files.pythonhosted.org/packages/1c/a3/f5cfd9965a9d9a9e32249159797c47b5d6299ea6d1629f9126b25f1c10a3/rapidfuzz-3.14.5-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:b9c6bd754d11f6e78ac54e3d86b4b11dc1ba2f13e5fc958899574532897f5a99", size = 1196056, upload-time = "2026-04-07T11:15:54.292Z" }, + { url = "https://files.pythonhosted.org/packages/64/07/561c2e40cfd10e6630a7b0ac5a2a813aef50d944bcd1f3d260319d659d5b/rapidfuzz-3.14.5-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:738c96944d076deeaff70e92b65696ab4f7ecb8081d7791c5403a3257dfaf8ff", size = 1374732, upload-time = "2026-04-07T11:15:56.584Z" }, + { url = "https://files.pythonhosted.org/packages/c2/39/123bb94fee40e2fb3b7c49b80827c7ef42d838e18def3fc2fef5a3cf817a/rapidfuzz-3.14.5-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f4c1bca487a17fe4226b4ffb2d30e799d2b274d692cffa76bd0746f56235fca3", size = 3166902, upload-time = "2026-04-07T11:15:58.768Z" }, + { url = "https://files.pythonhosted.org/packages/75/0a/45716fafc9fd2e028cf20b5ac5bc704887081cd312f84edb0e325599414b/rapidfuzz-3.14.5-cp314-cp314t-manylinux_2_39_riscv64.whl", hash = "sha256:af6a90a4ed2a48fa1a2d17e9d824e6c7c950bea5bad0b707c77fd55751e6bfef", size = 1452130, upload-time = "2026-04-07T11:16:01.453Z" }, + { url = "https://files.pythonhosted.org/packages/ca/49/4e96c413114398481c0a5b0086af32c364a18613c9a2ea578d17c4bea4ee/rapidfuzz-3.14.5-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:bf5018938208d4597b2e679a4f8cff9fd252f1df53583130ae56281a21801b64", size = 2396308, upload-time = "2026-04-07T11:16:03.588Z" }, + { url = "https://files.pythonhosted.org/packages/89/b7/49fea9fc6878d59bd259d01dd1972d9b86117992b1c66d9b16f0a65273c3/rapidfuzz-3.14.5-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:c0919d1f89ddf91129906705723118ea09754171e4116f5a5dbc667c7bc9b261", size = 2488210, upload-time = "2026-04-07T11:16:05.871Z" }, + { url = "https://files.pythonhosted.org/packages/0c/44/a1f732b93ffacbdad077b7c801149549b2938e1bece6addb5ad85ed74df8/rapidfuzz-3.14.5-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:93d8da883a35116d6813432177f35e570db5b0a5e30ecb0cbd7cb39c815735df", size = 4270621, upload-time = "2026-04-07T11:16:08.483Z" }, + { url = "https://files.pythonhosted.org/packages/bb/ce/ff942d19fce5385054650bb71a58495ddda299d94661ccc4e6e7fa44868b/rapidfuzz-3.14.5-cp314-cp314t-win32.whl", hash = "sha256:0f23e37019ec07712d58976b1ab2b889f8649a7f7c2f626a2f34ea9139e79279", size = 1803950, upload-time = "2026-04-07T11:16:10.873Z" }, + { url = "https://files.pythonhosted.org/packages/5c/0f/9aafc63f9661222b819b391c187eed29fc90ad5935f9690e5ecc2d2047a4/rapidfuzz-3.14.5-cp314-cp314t-win_amd64.whl", hash = "sha256:7d5ca9c7832e6879a707296d1463685f7c243a27846227044504741640caec66", size = 1632357, upload-time = "2026-04-07T11:16:13.1Z" }, + { url = "https://files.pythonhosted.org/packages/70/a6/51fc1b0e61e3326e1c68a61cfd0c6b3c34c843681c4b1eefbf0596f59162/rapidfuzz-3.14.5-cp314-cp314t-win_arm64.whl", hash = "sha256:3e91dcd2549b8f8d843f98ba03a17e01f3d8b72ce942adbbb6761bc58ffce813", size = 855409, upload-time = "2026-04-07T11:16:15.787Z" }, +] + +[[package]] +name = "requests" +version = "2.34.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "charset-normalizer" }, + { name = "idna" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ac/c3/e2a2b89f2d3e2179abd6d00ebd70bff6273f37fb3e0cc209f48b39d00cbf/requests-2.34.2.tar.gz", hash = "sha256:f288924cae4e29463698d6d60bc6a4da69c89185ad1e0bcc4104f584e960b9ed", size = 142856, upload-time = "2026-05-14T19:25:27.735Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/f4/c67b0b3f1b9245e8d266f0f112c500d50e5b4e83cb6f3b71b6528104182a/requests-2.34.2-py3-none-any.whl", hash = "sha256:2a0d60c172f83ac6ab31e4554906c0f3b3588d37b5cb939b1c061f4907e278e0", size = 73075, upload-time = "2026-05-14T19:25:26.443Z" }, +] + +[[package]] +name = "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 = "1.3.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/eb/e3/7c1dc7381d9f8ab7d854328ebfa884e62cb3f3d8549ddfd37c7814f42afa/starlette-1.3.1.tar.gz", hash = "sha256:05d0213193f2fbaae60e2ecb593b4add4262ad4e46536b54abe36f11a71724e0", size = 2703240, upload-time = "2026-06-12T09:23:11.602Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/bb/2799cc2ede3ed41131f8975621e7213dfc7ef4acbbaadfa440f32500c370/starlette-1.3.1-py3-none-any.whl", hash = "sha256:c7372aae11c3c3f26a42df7bd626cec2f47d03483d261d369516a615a53714c6", size = 73632, upload-time = "2026-06-12T09:23:10.017Z" }, +] + +[[package]] +name = "tenacity" +version = "9.1.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/47/c6/ee486fd809e357697ee8a44d3d69222b344920433d3b6666ccd9b374630c/tenacity-9.1.4.tar.gz", hash = "sha256:adb31d4c263f2bd041081ab33b498309a57c77f9acf2db65aadf0898179cf93a", size = 49413, upload-time = "2026-02-07T10:45:33.841Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d7/c1/eb8f9debc45d3b7918a32ab756658a0904732f75e555402972246b0b8e71/tenacity-9.1.4-py3-none-any.whl", hash = "sha256:6095a360c919085f28c6527de529e76a06ad89b23659fa881ae0649b867a9d55", size = 28926, upload-time = "2026-02-07T10:45:32.24Z" }, +] + +[[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 = "typing-inspection" +version = "0.4.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/55/e3/70399cb7dd41c10ac53367ae42139cf4b1ca5f36bb3dc6c9d33acdb43655/typing_inspection-0.4.2.tar.gz", hash = "sha256:ba561c48a67c5958007083d386c3295464928b01faa735ab8547c5692e87f464", size = 75949, upload-time = "2025-10-01T02:14:41.687Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl", hash = "sha256:4ed1cacbdc298c220f1bd249ed5287caa16f34d44ef4e9c3d0cbad5b521545e7", size = 14611, upload-time = "2025-10-01T02:14:40.154Z" }, +] + +[[package]] +name = "tzdata" +version = "2026.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ba/19/1b9b0e29f30c6d35cb345486df41110984ea67ae69dddbc0e8a100999493/tzdata-2026.2.tar.gz", hash = "sha256:9173fde7d80d9018e02a662e168e5a2d04f87c41ea174b139fbef642eda62d10", size = 198254, upload-time = "2026-04-24T15:22:08.651Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ce/e4/dccd7f47c4b64213ac01ef921a1337ee6e30e8c6466046018326977efd95/tzdata-2026.2-py2.py3-none-any.whl", hash = "sha256:bbe9af844f658da81a5f95019480da3a89415801f6cc966806612cc7169bffe7", size = 349321, upload-time = "2026-04-24T15:22:05.876Z" }, +] + +[[package]] +name = "urllib3" +version = "2.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/53/0c/06f8b233b8fd13b9e5ee11424ef85419ba0d8ba0b3138bf360be2ff56953/urllib3-2.7.0.tar.gz", hash = "sha256:231e0ec3b63ceb14667c67be60f2f2c40a518cb38b03af60abc813da26505f4c", size = 433602, upload-time = "2026-05-07T16:13:18.596Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl", hash = "sha256:9fb4c81ebbb1ce9531cce37674bbc6f1360472bc18ca9a553ede278ef7276897", size = 131087, upload-time = "2026-05-07T16:13:17.151Z" }, +] + +[[package]] +name = "uvicorn" +version = "0.49.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "h11" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c4/1f/fa18009dea8469069cca78a4e877a008ab78f08b064bfc9ab891579077ff/uvicorn-0.49.0.tar.gz", hash = "sha256:ebf4271aa580d9de97f93192d4595176df6e91f9aae919ca73e4fc07df1e66a3", size = 91284, upload-time = "2026-06-03T22:01:30.448Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/88/fa/e1388bbcf24ef3274f45c0c1c7b501fd14971037c1b6ee23610553307497/uvicorn-0.49.0-py3-none-any.whl", hash = "sha256:ba3d14c3ee7e41c6c654c46c9eb489d33213cdd30aa1696eab1374337c13f68f", size = 71376, upload-time = "2026-06-03T22:01:29.037Z" }, +] + +[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/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.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/cd/41/5e1a4bb12aac5f1493fa1bdc11154eca3b258ca4eba65d39c473fe19d8e9/watchfiles-1.2.0.tar.gz", hash = "sha256:c995fba777f1ea992f090f9236e9284cf7a5d1a0130dd5a3d82c598cacd76838", size = 108252, upload-time = "2026-05-18T04:32:04.251Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b8/2f/e42c992d2afda3108ea1c02acecc991b9f31d05c14adc2a7cee9ee211fc4/watchfiles-1.2.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:bc13eb17538be00c874699dc0abe4ee2bc8d50bb1166a6b9e175ef3fd7eb8f26", size = 400115, upload-time = "2026-05-18T04:32:02.06Z" }, + { url = "https://files.pythonhosted.org/packages/5f/8f/6af2ea19065c91d8b0ea3516fdfc8c0d349f407e8e9fbf4e5a17360de8ad/watchfiles-1.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2d95ddc1eb6914154253d239089900813f6a767e174b8e6a50e7fdacb7e4236c", size = 393659, upload-time = "2026-05-18T04:30:50.951Z" }, + { url = "https://files.pythonhosted.org/packages/13/01/b32a967c56fb3e3e5be3db52c3d3b87fa4513aa367d8ed1ad96d42952e5f/watchfiles-1.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f70d8b291ef6e88d19b1f297a6905ddb978888d9272b0d05e6f53309856bcfc", size = 453207, upload-time = "2026-05-18T04:31:04.231Z" }, + { url = "https://files.pythonhosted.org/packages/04/98/97557a812180338cb1abd32e1cffcc4588f59b5f23e0cb006b2ba95ba64a/watchfiles-1.2.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:56d8641cf834c2836922899105bd3ce3d0dfc69291d52edf0b4d0436829b34c0", size = 459273, upload-time = "2026-05-18T04:31:50.377Z" }, + { url = "https://files.pythonhosted.org/packages/e8/a8/b4b08dcb7653b8087c6586f7ce649505900e866bbcfe40dc9587af02e686/watchfiles-1.2.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2581a94056e55d7d0a31a823ea92bf73749c489ca2285bfdc0fbe6b2bb49d50c", size = 489927, upload-time = "2026-05-18T04:31:42.485Z" }, + { url = "https://files.pythonhosted.org/packages/50/94/3dceea03545d2e5ddfd839f0ddd5e1cecbf1697b5a428d5ba11cef6af95d/watchfiles-1.2.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:41bc1199f7523b3f82843c88cbb979180c949caef0342cf90968f178e5d49b01", size = 570476, upload-time = "2026-05-18T04:31:03.071Z" }, + { url = "https://files.pythonhosted.org/packages/cc/f2/d39a5450c3532092b91f81d274360e613c2371bc874a89c7a1a3c5e8d138/watchfiles-1.2.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7571e4464cb6e434958f867f7f730b8ab0b75e3f8e5eac0499168486ab3c33a8", size = 465650, upload-time = "2026-05-18T04:30:12.701Z" }, + { url = "https://files.pythonhosted.org/packages/22/24/ed72f68cbc1333ca9b9f2200aa048bb6658ae41709bc1caad4310f4bdffd/watchfiles-1.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e53a384f76b631c3ae5334ce6a52f0baa3a911eb94a4eac7f160079868b716d5", size = 456398, upload-time = "2026-05-18T04:30:13.784Z" }, + { url = "https://files.pythonhosted.org/packages/0d/64/982ef4a4e5bab5b6e5b6becc8cd5e732f6130a78b855f0abec6439a9a135/watchfiles-1.2.0-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:d20029a60a71a052a24c4db7673bc4de39ab89adbaccbfb5d67987c5d73f424d", size = 465140, upload-time = "2026-05-18T04:31:52.111Z" }, + { url = "https://files.pythonhosted.org/packages/a0/0c/95282abf4ed680b6096010bcfc30c5fa7a041fc5aa5a2ad17a2cc6c75bba/watchfiles-1.2.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:2cb93af48550faf1cea04c303107c8b75833de7013e57ce27d3b8d21d8d0f58c", size = 630259, upload-time = "2026-05-18T04:31:25.676Z" }, + { url = "https://files.pythonhosted.org/packages/30/45/607c1de1530c4bdcf2cf1d1ecc2505ddba5d96bd43ba9f2b0e79876f850f/watchfiles-1.2.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2995c176de7692b86a2e4c58d9ec718f753150a979cb4a754e2b4ffa38e70906", size = 659859, upload-time = "2026-05-18T04:30:24.333Z" }, + { url = "https://files.pythonhosted.org/packages/fa/08/d9e2e0f9e8e6791d33aefc694ad7eefa7f901f63caff84a81ded38692f9c/watchfiles-1.2.0-cp312-cp312-win32.whl", hash = "sha256:7a2cffd17d27d2ecbb310c2b1d8174f222a5495b1a721894afa88ec11e25b898", size = 275480, upload-time = "2026-05-18T04:30:31.307Z" }, + { url = "https://files.pythonhosted.org/packages/1c/e6/9d42569c0102645cc8cea5d8c7d8a1e9d4ada2cb7f05f75e554b8aa2202a/watchfiles-1.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:f155b3a1b2a5fc89cdc70d47ee5d54e3b75e88efa34982028a35daef9ba00379", size = 288718, upload-time = "2026-05-18T04:32:10.745Z" }, + { url = "https://files.pythonhosted.org/packages/0a/26/88e0dc6ee3898169d7fa22bb6a69cabf2502d2ee25cb8c876d1262d204f8/watchfiles-1.2.0-cp312-cp312-win_arm64.whl", hash = "sha256:8fa585ede612ee9f9e91b18bebf9ba11b9ae29a4e3a0d0cf6fca3e382133f0d5", size = 281026, upload-time = "2026-05-18T04:30:22.23Z" }, + { url = "https://files.pythonhosted.org/packages/d1/4d/70a7feced9f87e2ff26dba42667290f41694fc64646c67261fbb8cab5d5c/watchfiles-1.2.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:01ea8d66f0693b9b60a6541c8d10263091ca9a9060d242f3c1f3143f9aad2c98", size = 399730, upload-time = "2026-05-18T04:31:38.162Z" }, + { url = "https://files.pythonhosted.org/packages/31/3a/0da302f2307aee316922806ebd5726c542cbd787c938271cf14a074c7daf/watchfiles-1.2.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7ba0480b9a74af058f43b337e937a451e109295c420916d68ad24e3dc02f5e44", size = 392842, upload-time = "2026-05-18T04:30:27.051Z" }, + { url = "https://files.pythonhosted.org/packages/db/ef/d5bdb705c224dbc256aa0c1ec47bf4e61ec52558f2afb44a71a1fe4d7015/watchfiles-1.2.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f34e26a19f91f710c08e0183429f0d1d15df734e6bc78c31e77b9ea9c433658", size = 452989, upload-time = "2026-05-18T04:31:11.945Z" }, + { url = "https://files.pythonhosted.org/packages/71/29/5495f2c1661949ef7a35e4d71111d129cfe7606414a26887a919d0a55406/watchfiles-1.2.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b4e77f6a55f858504069abd35d336a637555c09bca453dde1ee1e5ada8a6a1fb", size = 458978, upload-time = "2026-05-18T04:30:52.606Z" }, + { url = "https://files.pythonhosted.org/packages/d5/8c/7f9c07c433811c2fffd93e13fdfb7135de9aab5f2ae41be08960fa0047dc/watchfiles-1.2.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0cb4d80e212f116474a545c21c912b445f16bb0cef9e6a73a498164223e14e2f", size = 490248, upload-time = "2026-05-18T04:31:36.003Z" }, + { url = "https://files.pythonhosted.org/packages/3c/11/d93632febc52fbc21be90231bb7c17fd5387f46c9076fd40a5f9c2ae6910/watchfiles-1.2.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b974946a10af379d425e2eef5b62f5c6ebeaccf91d45eaad6f5b27ecd4f91aa0", size = 571847, upload-time = "2026-05-18T04:31:10.862Z" }, + { url = "https://files.pythonhosted.org/packages/55/b4/383173e73aabb07ad1d9c7aa859d95437ac46a6d6a1e11005facda0c9d19/watchfiles-1.2.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:86bc13c25a8d1fcd70b51d0ce7c9b65e90de5666fcbfd3e34957cc73ee19aeb5", size = 465974, upload-time = "2026-05-18T04:30:17.006Z" }, + { url = "https://files.pythonhosted.org/packages/a7/6c/89b1a230a78f57c52dd8893adb1f92f94411721b6ec12596c56d98c74356/watchfiles-1.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ca148d73dea36c9763aaa351e4d7a51780ec1584217c45276f4fe8239c768b71", size = 454782, upload-time = "2026-05-18T04:30:35.656Z" }, + { url = "https://files.pythonhosted.org/packages/24/62/1732118367cfff0a9fce3bf62ff4bfded09ef5df21d9d446b858b3f70a96/watchfiles-1.2.0-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:c525543d91961c6955b2636b308569e84a1d1c5f5f2932041ab9ef46422f43e3", size = 465182, upload-time = "2026-05-18T04:30:20.846Z" }, + { url = "https://files.pythonhosted.org/packages/28/96/716f7e5f51339bf22963f3345f9f27d7f3b30e2eadc597e257c881dd3c53/watchfiles-1.2.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:a204794696ffb8f9b10fba6f7cb5216d42f3b2b71860ccac6b6e42f5f10973b0", size = 629841, upload-time = "2026-05-18T04:31:05.397Z" }, + { url = "https://files.pythonhosted.org/packages/4c/fe/c40783950fd771ccf66ab3ec2722d188a9af1c7f96c6e811f36e40c6e03f/watchfiles-1.2.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:10d86db20695afe7997ac9e1717637d6714a8d0220458c33f3d2061f54cec427", size = 658028, upload-time = "2026-05-18T04:31:48.22Z" }, + { url = "https://files.pythonhosted.org/packages/71/72/4508db1856d1d87fcbb3b63f4839bab1b5682cb0e8d224d122263c09654a/watchfiles-1.2.0-cp313-cp313-win32.whl", hash = "sha256:eb283ee99e21ad6443c8cdb06ac5b34b1308c329cbdf03fa02b445363714c799", size = 275183, upload-time = "2026-05-18T04:30:59.57Z" }, + { url = "https://files.pythonhosted.org/packages/f9/36/14b76ca57652e5cc5fd1c11f32a261292c08a0d19a00351013c2549cbfb2/watchfiles-1.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:a0f27f01bee51861392bb6b7c4fdb290b27d1eb194e9e28788d68102a0e898d9", size = 288059, upload-time = "2026-05-18T04:32:07.937Z" }, + { url = "https://files.pythonhosted.org/packages/1b/8d/0a85e395398d8d20fadfe5c5d32c726eee17a519e78fb356f2cf7531bffe/watchfiles-1.2.0-cp313-cp313-win_arm64.whl", hash = "sha256:3651aa7058595e9cfb75d35dd5ada2bf9f48a5b8a0f3562821d3e210c507e077", size = 280186, upload-time = "2026-05-18T04:31:54.484Z" }, + { url = "https://files.pythonhosted.org/packages/37/68/36db056f1fdcc5f07302f56e631774d6835bcd6fa3ace402304621d5f9e5/watchfiles-1.2.0-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:faea288b6f0ab1902ef08f4ca6de005dccf856c4e0c4f21b8c5fce02d90a1b08", size = 399031, upload-time = "2026-05-18T04:30:44.576Z" }, + { url = "https://files.pythonhosted.org/packages/c1/64/01a9d6f66a82a5c101ce939274106cc72759d62427e153f01edd2b9f87c2/watchfiles-1.2.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:01859b11fd9fbca670f4d5da00fbac282cfea9bd67a2125d8b2833a3b5617ea9", size = 391205, upload-time = "2026-05-18T04:30:25.413Z" }, + { url = "https://files.pythonhosted.org/packages/84/2c/0a44fe058cb4bb7b8ede6b6670698bbb7c0400740e378d00022189b7b31d/watchfiles-1.2.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fff610d7bb2256a317bb1e96f0d7862c7aa8076733ee5df0fd41bbe76a24a4f4", size = 451892, upload-time = "2026-05-18T04:32:14.005Z" }, + { url = "https://files.pythonhosted.org/packages/67/a1/351e0d56cd35e6488b5c8b4fb11a809a5bc923e8fe8fed9faf8920be0c89/watchfiles-1.2.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b141a4891c995a039cd89e9a49e62df1dc8a559a5d1a6e4c7106d16c12777a55", size = 458867, upload-time = "2026-05-18T04:31:22.279Z" }, + { url = "https://files.pythonhosted.org/packages/d5/7d/9d09605187f1b838998624049fcf8bf47b73c1a3b76901fcac1782f62277/watchfiles-1.2.0-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f22943b7770483f6ea0721c6b11d022947a98eb0acae14694de034f4d0d38925", size = 490217, upload-time = "2026-05-18T04:31:43.657Z" }, + { url = "https://files.pythonhosted.org/packages/60/5d/a17a16eccb182f04188cd308ec24b1a71a9b5c4e7098269cf35d9fa56d02/watchfiles-1.2.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1bc6195825b7dcd217968bb1f801a60fd4c16e8eeab5bedc7fe917d7d5995ab4", size = 571458, upload-time = "2026-05-18T04:32:11.875Z" }, + { url = "https://files.pythonhosted.org/packages/d3/3d/4dd457062083ab1938e5dfd45032eb425cee2ac817287ca8ff4356183e5d/watchfiles-1.2.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d4a4b147f5dca2a5d325a06a832fb43f345751adfbc63204aec30e0d9ca965a2", size = 464707, upload-time = "2026-05-18T04:30:43.492Z" }, + { url = "https://files.pythonhosted.org/packages/c6/71/ea8c57b128f5383de74d0c7d2d9c57ad7c9a65a930c451bd25d524b295b7/watchfiles-1.2.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4543579a9bdb0c9560039b4ffddbdb39545707659fbc430ce4c10f3f68d557f9", size = 454663, upload-time = "2026-05-18T04:30:16.061Z" }, + { url = "https://files.pythonhosted.org/packages/53/fd/2e812bf938406d7db351f0703ddd3fc6c061cf30d96153a77bc79a943a44/watchfiles-1.2.0-cp313-cp313t-manylinux_2_31_riscv64.whl", hash = "sha256:20aa0e708b920bde876a4aa82dc7dd6ebea228a63a67cda6632c2fc87b787efa", size = 463537, upload-time = "2026-05-18T04:31:44.9Z" }, + { url = "https://files.pythonhosted.org/packages/86/56/d17a7f1dd1bc3035f1072694a551301272f1739c2d8e319c927cb9e29b38/watchfiles-1.2.0-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:d413349d565dab74297f2a63e84a097936be69bf8f3b3801f27f380e32040f44", size = 629194, upload-time = "2026-05-18T04:31:14.141Z" }, + { url = "https://files.pythonhosted.org/packages/be/06/f1ff66bf5cae50aa4062779a0ecd0bbaf15e466195719074078947d9a17d/watchfiles-1.2.0-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:f28b2725eb8cce327b9b3ab02415c853011dc55c95832fe90de6bc56f5315f72", size = 656194, upload-time = "2026-05-18T04:31:47.14Z" }, + { url = "https://files.pythonhosted.org/packages/e7/54/a9c7ea9a82a4ac65e7004c0a03920b5cdd2f9c3b678757d9cd425aa51d53/watchfiles-1.2.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:b8c8358484d5fa12ef34f05b7f4168eaf1932f408725ff6d023c33ec17bd79d4", size = 400205, upload-time = "2026-05-18T04:32:05.153Z" }, + { url = "https://files.pythonhosted.org/packages/aa/5d/c9ab3534374a4a67450696905d6ef16a04405448b8dc52bd752ae50423d4/watchfiles-1.2.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:9f04b092229ad2c50126dd3c922c8822e51e605993764a33058d4a791ab42281", size = 392508, upload-time = "2026-05-18T04:30:54.849Z" }, + { url = "https://files.pythonhosted.org/packages/26/ca/1ad30103535cf0cecd7b993e8d50edc5351b1820e38f2d22e3df58962feb/watchfiles-1.2.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7a7ce236284f002a156f70add88efe5c70879cccbb658be0822c54b1306fc09d", size = 452448, upload-time = "2026-05-18T04:30:53.727Z" }, + { url = "https://files.pythonhosted.org/packages/37/a1/ceee2cdf2afbd715fa07758d39c9859513eae411b23196f7fd039e5feedd/watchfiles-1.2.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b9909cc2b48468b575eefa944919e1fe8a36c5849d5c7c168f80a8c1db69398e", size = 459605, upload-time = "2026-05-18T04:30:23.312Z" }, + { url = "https://files.pythonhosted.org/packages/e8/f6/421e30fd1cb3907a84ed92ab3f1983e37ba2dca015e9a894a048418417a2/watchfiles-1.2.0-cp314-cp314-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a37faaed405c67e28e6be45a1fa4f206ef5a2860f27c237db9fa30704c38242", size = 490757, upload-time = "2026-05-18T04:30:47.358Z" }, + { url = "https://files.pythonhosted.org/packages/41/b0/55ed1b97ed08be7bba6f9a541cac15f2a858e1d74d2b07b6da70a82aab00/watchfiles-1.2.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9649193aa27bd9ff2e80ff29bfaa93085496c7a3a377592823cc58b77ee88add", size = 568672, upload-time = "2026-05-18T04:30:38.915Z" }, + { url = "https://files.pythonhosted.org/packages/d1/cf/d8ae8a80dd7bafab395ea7681c10237311bbf34d37704a8c744e7cf31fc7/watchfiles-1.2.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4e4ff8e37f99cf1da89e255e07c9c4b37c214038c4283707bdec308cb1b0ea1f", size = 464197, upload-time = "2026-05-18T04:30:09.914Z" }, + { url = "https://files.pythonhosted.org/packages/7c/8a/3076c496ca8dafe0e8cd03fcebdfc47be4b1174b4e5b24ff6e396e6b3af2/watchfiles-1.2.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:054dc20fd2e3132b4c3883b4a00d72fd6e1f56fdaf89fccd12e8057d74cd74d7", size = 453181, upload-time = "2026-05-18T04:30:14.829Z" }, + { url = "https://files.pythonhosted.org/packages/e5/10/9745e17c98e7b8a86454df0a3c7b5686bd650383f1e9f26e4ebcbd6cc0c0/watchfiles-1.2.0-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:e140ed30ebde76796b686e67c182cff10ea2fbab186fafd1560f74bb5a473a6e", size = 465109, upload-time = "2026-05-18T04:30:28.123Z" }, + { url = "https://files.pythonhosted.org/packages/8f/95/8ef4a95481d3e0cb52d62a06fa6e972e81424be2d9698b91a2fecca9904c/watchfiles-1.2.0-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:bb7e52ecf68ba46d22df23467b87cffeb2146908aa523ebfe803019618cfda06", size = 630653, upload-time = "2026-05-18T04:31:49.304Z" }, + { url = "https://files.pythonhosted.org/packages/fd/e4/3b3bf36b0f829b50c6ebcb8d031583863c59f923d6a6af3d485e470d0fac/watchfiles-1.2.0-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:23282a321c8baf9b3a3c4afff673f9fe65eb7fdc2338d765ccad9d3d1916a5ba", size = 657838, upload-time = "2026-05-18T04:31:06.497Z" }, + { url = "https://files.pythonhosted.org/packages/21/b1/6cbbb50c1f3002ab568777d44aa21206dfb8807a840990c4037523b51812/watchfiles-1.2.0-cp314-cp314-win32.whl", hash = "sha256:c0db965c5f79aa49fe672d297cf1febc5ad149b658594944f49a54a2b96270a7", size = 275108, upload-time = "2026-05-18T04:30:06.891Z" }, + { url = "https://files.pythonhosted.org/packages/92/45/190ce6db8dcb4536682cf75d3889ff1a27182a58cb519d343cb6d9ea63d8/watchfiles-1.2.0-cp314-cp314-win_amd64.whl", hash = "sha256:71283b39fd17e5408eb123bd37aeecfd9d54c81fc184421943208aadb879d103", size = 288441, upload-time = "2026-05-18T04:32:12.901Z" }, + { url = "https://files.pythonhosted.org/packages/74/0d/3eae1c2313ab08378431d907c3f8095ecca00f3eda33111cf4f0f2591799/watchfiles-1.2.0-cp314-cp314-win_arm64.whl", hash = "sha256:c5c19526f4e54a00f2666a6c0e9e40d582c09e865055ea7378bf0009aab857b3", size = 280684, upload-time = "2026-05-18T04:31:26.902Z" }, + { url = "https://files.pythonhosted.org/packages/b1/75/fb64e6c25d6b5ca636d03df34ffb1c6e9873303e76d27967e045f8df088f/watchfiles-1.2.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:d73a585accffa5ae39c17264c36ec3166d2fad7000c780f5ef83b2722afb9dd2", size = 398857, upload-time = "2026-05-18T04:32:17.108Z" }, + { url = "https://files.pythonhosted.org/packages/73/4e/9f7adf01754cbf81843722ccfec169d8f26c69778281a302855cecd2ee08/watchfiles-1.2.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ae99b14c5f21e026e0e9d96f40e07d8570ebee6cafd9d8fc318354606daa7a28", size = 392413, upload-time = "2026-05-18T04:31:07.911Z" }, + { url = "https://files.pythonhosted.org/packages/47/c8/bec626bcc2d69f44b9acb24ce7d60ed7b16b73628eea747fcbd169d8edda/watchfiles-1.2.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4429f3b105524a10b72c3a819b091c495d2811d419c1e1e8df773a5a5974f831", size = 452409, upload-time = "2026-05-18T04:31:20.142Z" }, + { url = "https://files.pythonhosted.org/packages/00/b7/b6362068e81e7c556d155a34c35d40ac3ef42d747b06d7f6e5bf58e359c2/watchfiles-1.2.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:43d818978d06062d9b22c4fab2ebe44cf5213d42dc8e62bda8c2760cfa2eeb33", size = 458827, upload-time = "2026-05-18T04:32:06.219Z" }, + { url = "https://files.pythonhosted.org/packages/67/f8/9a813fa42afb1e0b4625e75f0479826644d3ee8dc287e093799bc01f390c/watchfiles-1.2.0-cp314-cp314t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b9f732dc58b2dbe69e464ccf8fff7a03b0dd0be439da4c0720d3558527d3d6b4", size = 490104, upload-time = "2026-05-18T04:31:56.034Z" }, + { url = "https://files.pythonhosted.org/packages/2f/bf/27dfb6094ca4c9aad21298b5525b6c53cb36121ee454331d05161e58d130/watchfiles-1.2.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8f200104103feb097de4cab8fe4f5dd18a2026934c7dea98c55a2f5fd6d5a33b", size = 571360, upload-time = "2026-05-18T04:31:57.133Z" }, + { url = "https://files.pythonhosted.org/packages/fb/39/44a096d67270ea93df91d33877dbe91fbda3aa4f8ec2edf799d93eda8736/watchfiles-1.2.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:63ac26eefbf4af1741247d6fb68b11c49a25b2f7413fbd318a83a12aaa9cf666", size = 464644, upload-time = "2026-05-18T04:30:57.33Z" }, + { url = "https://files.pythonhosted.org/packages/0e/80/c7472203bad6268e3ef1ad260739704847898938ad7ea8b63a5131f46b50/watchfiles-1.2.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c4997d4e4a55f0d02b6cde327322daf3a0400e5df6c6b15948994bf72497925", size = 454771, upload-time = "2026-05-18T04:30:48.736Z" }, + { url = "https://files.pythonhosted.org/packages/51/cf/3b10b268b4b7f0fc26e9debb5eef1998b515887840f444cd3ec80c688755/watchfiles-1.2.0-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:4c887eba18b7945ac73067a8b4a66f21cd46c2539b2bc68588f7be6c7eb6d26b", size = 463494, upload-time = "2026-05-18T04:31:33.826Z" }, + { url = "https://files.pythonhosted.org/packages/3d/3e/a4302545cd589262a0dc7d140e86f7688eba3f9c72776c27f7e23b8864c4/watchfiles-1.2.0-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:3416ff151bb6b5a8d8d11664974fbef4d9305b9b2957839ab5a270468fd8df30", size = 629383, upload-time = "2026-05-18T04:31:15.596Z" }, + { url = "https://files.pythonhosted.org/packages/db/99/d5649df0a9a410d45b7c882304d0b790903ac9b6e8f2cfd12114e0c6b9f2/watchfiles-1.2.0-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:0e831a271c035d89789cffc386b6aa1375f39f1cd25eb7ca0997e4970d152fc5", size = 656093, upload-time = "2026-05-18T04:31:58.707Z" }, + { url = "https://files.pythonhosted.org/packages/92/b9/362702539275019a54dd2e94511b31a9b89c5f9e6a21966de7eb692549fc/watchfiles-1.2.0-cp315-cp315-macosx_10_12_x86_64.whl", hash = "sha256:37a6721cdf3f65dbb13aa9503510ccb4451603ac837e44d265d7992a597e1374", size = 400109, upload-time = "2026-05-18T04:31:16.879Z" }, + { url = "https://files.pythonhosted.org/packages/8f/75/71d5ba62db781e5587bded1d944c675374bc4aa37ff33d5018d98e8b6538/watchfiles-1.2.0-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:2b37d10b5a63bd4d87e18472d80fa525bd670586fae62e5dd580452764879b65", size = 392167, upload-time = "2026-05-18T04:31:28.058Z" }, + { url = "https://files.pythonhosted.org/packages/3c/01/c66dd95d0423fe30d31820e2d1d5bda773764131bbb6ac0cb1cf303ac328/watchfiles-1.2.0-cp315-cp315-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a105bc2283f67e8fbec74253ec2d94925de92ed72c0393f1206bf326b7b7b69", size = 452372, upload-time = "2026-05-18T04:31:00.836Z" }, + { url = "https://files.pythonhosted.org/packages/91/15/2fe99557e72f85627c6a8eed50d889e8d101623e060a22ad75b875cb932d/watchfiles-1.2.0-cp315-cp315-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5327989a465505f05cfe06f04fa9d0c2fd5432bb243e10e6f012b1bdca3c8579", size = 459596, upload-time = "2026-05-18T04:31:34.96Z" }, + { url = "https://files.pythonhosted.org/packages/ed/23/d4acfa0023367428ed48351b3b9b267893037b6cadae55620c61c24bcfd4/watchfiles-1.2.0-cp315-cp315-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ecb47f183a8025b2aa18b546725c3657e542112ae9c0613a2af79b4fa8d04ad7", size = 490869, upload-time = "2026-05-18T04:31:59.923Z" }, + { url = "https://files.pythonhosted.org/packages/a4/5f/3164cbdce06c9fb95c4f7b9e2f9760b5e2797af43a9ecc317ef42a23a278/watchfiles-1.2.0-cp315-cp315-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8520a4ab0e37f770afc34459c4f8f7019e153f9124dc101c15538365875d1ab2", size = 571641, upload-time = "2026-05-18T04:32:00.948Z" }, + { url = "https://files.pythonhosted.org/packages/41/e6/85d3731c55e65cd7690f3f803d24c139588aaf863e4bf2148fe7a7fa1a19/watchfiles-1.2.0-cp315-cp315-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:71cd71740ed2c15211ebb237ced4e39a1cdf6f80566e5fe95428da1626f4fde6", size = 464444, upload-time = "2026-05-18T04:30:34.298Z" }, + { url = "https://files.pythonhosted.org/packages/f4/7d/562641012b8b09872742c3b8adf9629ec479fd78f8d68ae4a0c13da8add6/watchfiles-1.2.0-cp315-cp315-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f88af53d6ddaf72179ef613ddc905e6f4785f712b49b80b3bef9f3525e6194b4", size = 453593, upload-time = "2026-05-18T04:31:23.464Z" }, + { url = "https://files.pythonhosted.org/packages/56/fe/cb8ef3d6f929d14158fdaaad9925985b7310abc9384dcd4d82dd0016fb59/watchfiles-1.2.0-cp315-cp315-manylinux_2_31_riscv64.whl", hash = "sha256:cee9d5efd929efdac5f7e58f72b3376f676b64050a91c5b99a7094c5b2317488", size = 465096, upload-time = "2026-05-18T04:31:30.384Z" }, + { url = "https://files.pythonhosted.org/packages/25/91/80908e835e100527a9267147b08c0eee1fa6ab0ffec15edc04d1d44885f7/watchfiles-1.2.0-cp315-cp315-musllinux_1_1_aarch64.whl", hash = "sha256:b718bf356bbc15e559bd8ef41782b573b8ae0e3f177ab244b440568d7ea02cfb", size = 630638, upload-time = "2026-05-18T04:30:49.89Z" }, + { url = "https://files.pythonhosted.org/packages/46/4b/95ab2f256bb4af3cb2eb23b9317bda984ee6e0f11733a5c004a6c95b06e3/watchfiles-1.2.0-cp315-cp315-musllinux_1_1_x86_64.whl", hash = "sha256:922c0e019fe68b3ae392965a766b02a71ba1168c932cebc3733cd52c5fe5b377", size = 657684, upload-time = "2026-05-18T04:31:32.027Z" }, +] + +[[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/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/6f/28/258ebab549c2bf3e64d2b0217b973467394a9cea8c42f70418ca2c5d0d2e/websockets-16.0-py3-none-any.whl", hash = "sha256:1637db62fad1dc833276dded54215f2c7fa46912301a24bd94d45d46a011ceec", size = 171598, upload-time = "2026-01-10T09:23:45.395Z" }, +] + +[[package]] +name = "xlrd" +version = "2.0.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/07/5a/377161c2d3538d1990d7af382c79f3b2372e880b65de21b01b1a2b78691e/xlrd-2.0.2.tar.gz", hash = "sha256:08b5e25de58f21ce71dc7db3b3b8106c1fa776f3024c54e45b45b374e89234c9", size = 100167, upload-time = "2025-06-14T08:46:39.039Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1a/62/c8d562e7766786ba6587d09c5a8ba9f718ed3fa8af7f4553e8f91c36f302/xlrd-2.0.2-py2.py3-none-any.whl", hash = "sha256:ea762c3d29f4cca48d82df517b6d89fbce4db3107f9d78713e48cd321d5c9aa9", size = 96555, upload-time = "2025-06-14T08:46:37.766Z" }, +]