diff --git a/.gitignore b/.gitignore index 92c05b7..a94b999 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,10 @@ __pycache__/ # IDE .idea/ .vscode/ + +# macOS +.DS_Store + +# Réponse à l'appel d'offres BDD (BPU/DQE, mémoire technique, résumés CA) — +# volet commercial CONFIDENTIEL : ce dépôt est public, ces pièces n'y entrent pas. +audits/bdd/ diff --git a/adr/0003-format-table-iceberg-lakehouse.md b/adr/0003-format-table-iceberg-lakehouse.md new file mode 100644 index 0000000..1541c3a --- /dev/null +++ b/adr/0003-format-table-iceberg-lakehouse.md @@ -0,0 +1,112 @@ +# ADR-0003 — Apache Iceberg comme format de table du lakehouse d'observations + +- Statut : acceptée (cadre R&D) +- Date : 2026-07-11 +- Décideurs : data engineer (pam) + +> Issue de l'étude R&D « évolution de schéma » du 2026-07-11 (hub sémantique en lakehouse, +> couches Bronze/Silver/Gold, table canonique `observation`). Cette ADR fixe le format de +> table ; le vocabulaire des paramètres et l'identité des stations sont traités par +> ADR-0004 et ADR-0005. Cadre : R&D open-source, sans contrainte d'infra ni de budget. + +## Contexte + +Le patrimoine d'observations vit dans deux systèmes aux modèles divergents : MariaDB +`V5_data_*` (~794 GiB, 4,4 Md lignes, sharding par nommage — 20 292 tables) et +TimescaleDB (~780 GiB, wide Météo-France). L'étude R&D conclut à un lakehouse ouvert : +Parquet sur stockage objet + format de table transactionnel + catalogue, moteurs de +requête interchangeables. + +Un pilote existe déjà : `climato-froid` a migré le synop pré-2000 (392,7 M lignes) en +**Delta Lake** sur R2 — compression 6× index compris, requêtes sub-secondes en DuckDB, +principes acquis (tri `(station, date)` + zstd + partition pruning, fidélité d'archive, +overwrite prédiqué par partition, réconciliation d'historiques divergents). + +Trois candidats pour généraliser : + +- **Delta Lake** (continuité du pilote) : delta-rs mûr en Python/Rust, mais catalogue + ouvert moins standardisé hors écosystème Databricks, et features récentes (variant, + row lineage) tirées par un seul éditeur. +- **Apache Iceberg** : le format le plus neutre — spec v3 (type `variant` pour le + semi-structuré, deletion vectors, row lineage), catalogues REST open-source + interchangeables (Lakekeeper, Apache Polaris, Nessie), lu/écrit par DuckDB, Trino, + Spark, ClickHouse, pyiceberg/iceberg-rust. +- **DuckLake** : catalogue = un simple Postgres, très peu de pièces mobiles — séduisant + pour une équipe mono-steward, mais jeune et couplé à l'écosystème DuckDB. + +## Décision + +**Apache Iceberg (spec v3) est le format de table des nouvelles tables du lakehouse** +(Bronze, Silver, Gold de l'étude). Modalités : + +1. **Catalogue REST léger.** Un catalogue Iceberg REST open-source auto-hébergé ; + le choix de l'implémentation (Lakekeeper vs Polaris) se fait par un **spike mesuré** + (critères : coût opérationnel mono-steward, auth simple, backup trivial) — c'est un + détail d'exécution, pas une décision d'architecture, il ne bloque rien : pyiceberg + sait démarrer sur un catalogue SQL minimal. + + *Précision du 2026-07-11 (décision d'hébergement full OVH, critère de + souveraineté européenne)* : les catalogues Iceberg **managés** hors UE + (ex. Cloudflare R2 Data Catalog, qui inclut aussi la compaction managée) + sont **exclus par principe**, bien qu'économiquement attractifs — + l'auto-hébergé est confirmé. Conséquence assumée : la **maintenance des + tables (expire_snapshots + compaction) reste à notre charge**, job + hebdomadaire non optionnel (leçon du POC : 1 227 snapshots = + +400 ms/requête en lecture par métadonnées). +2. **Conventions physiques héritées du pilote** : partition par `annee` (+ bucket sur + le paramètre pour la table canonique long, cf. étude), tri `(station_uid, dh_utc)`, + compression zstd, schémas Arrow explicites dérivés des contrats — famille sans + contrat = refus d'écrire. +3. **`variant` pour les payloads bruts.** `raw_msg` (synop, bouées), `donnees` + (ACARS, profils) vont en Bronze dans une colonne `variant` typée — fin du `text` + non requêtable, sans inventer un schéma pour du semi-structuré. +4. **Le pilote Delta reste tel quel.** `climatologie-cold` (R2) n'est pas re-commité : + DuckDB lit les deux formats, l'API climato-froid ne change pas. Migration éventuelle + vers Iceberg = décision d'exécution future, sur besoin réel (ex. unification du + catalogue), jamais par principe. +5. **Chaque table Iceberg = un contrat ODCS** (`physicalType: iceberg-table`), versionnée + selon ADR-0002 (bump semver + `changelog:` + RunEvent OpenLineage). Le namespace + lineage s'étend : `iceberg:///` à ajouter aux conventions + (`lineage/namespaces.md`). + +## Justification + +- **Neutralité moteur = la garantie R&D.** Le même jeu de tables doit être requêtable + par DuckDB (notebooks, API), Trino (SQL fédéré), Spark (ML distribué) et polars sans + copie. Iceberg est le seul des trois candidats dont le catalogue REST est un standard + multi-implémentations. +- **v3 couvre deux besoins précis du dossier** : `variant` (payloads bruts en Bronze) + et row lineage (traçabilité au grain ligne, complète OpenLineage au grain job). +- **L'expérience acquise transfère.** Les concepts delta-rs (log, snapshots, overwrite + prédiqué, vacuum) ont leurs équivalents directs Iceberg ; les pièges documentés du + pilote (historiques divergents, sync fichiers interdite) s'appliquent à l'identique. +- **DuckLake écarté comme choix par défaut, pas enterré** : la frugalité opérationnelle + est réelle, mais parier le schéma canonique sur un format jeune et mono-écosystème + contredit l'objectif d'interopérabilité. Voir critère de réouverture. + +## Conséquences + +- (+) Toute table du lakehouse est lisible par l'écosystème entier sans export ; les + datasets publics (phase 3 de l'étude) sont des tables Iceberg exposées telles quelles. +- (+) Schéma évolutif sans réécriture (add column, rename sûrs par ID de colonne) — + cohérent avec le versioning ODCS. +- (−) **Une pièce d'infra en plus** (le catalogue REST) à opérer, sauvegarder, + superviser — le point faible assumé face à DuckLake. Mitigation : spike de choix + orienté « coût mono-steward », et démarrage possible sur catalogue SQL pyiceberg. +- (−) Deux formats coexistent (Delta du pilote + Iceberg) tant que `climatologie-cold` + n'est pas migrée — acceptable car lecteurs communs, mais à documenter au catalogue. +- (−) L'écriture Python passe de delta-rs à pyiceberg : re-valider les débits + d'extraction du pilote (counts exacts, reprise idempotente) sur une année témoin. + +**Critère de réouverture** : si après 6 mois le catalogue REST s'avère être le poste +de coût opérationnel dominant du chantier (incidents, temps d'admin), ré-évaluer +DuckLake — la donnée reste en Parquet, le coût de conversion est un re-commit de +métadonnées, pas une réécriture. + +## Références + +- Étude R&D « évolution de schéma data » 2026-07-11 (workspace, hors repo — à ranger) +- Pilote : repo local `climato-froid/` (README — conventions physiques, pièges Delta/R2) +- ADR-0002 (versioning de schéma = fait de lineage — s'applique aux tables Iceberg) +- `lineage/namespaces.md` (namespace `iceberg://` à ajouter) +- Apache Iceberg spec v3 ; pyiceberg / iceberg-rust ; Lakekeeper, Apache Polaris (spike) diff --git a/adr/0004-vocabulaire-parametres-observation.md b/adr/0004-vocabulaire-parametres-observation.md new file mode 100644 index 0000000..4e22cae --- /dev/null +++ b/adr/0004-vocabulaire-parametres-observation.md @@ -0,0 +1,178 @@ +# ADR-0004 — Vocabulaire contrôlé des paramètres d'observation (`dim_parametre`) + +- Statut : proposée +- Date : 2026-07-11 +- Décideurs : data engineer (pam) + +> Phase 0 de l'étude R&D « évolution de schéma » du 2026-07-11, volet 1/2 (le volet +> identité des stations est ADR-0005). Principe directeur hérité d'ADR-0002 : +> **git fait foi, les tables et les tools sont des vues.** + +> **Amendée le 2026-07-11** (audit de traduisibilité legacy, +> `audit-traduisibilite-legacy-2026-07.md`) : ajout des conventions §7 +> (dimensions verticales/couches dans la clé, marqueur `porte_occurrence`, +> frontière profils verticaux) et recadrage du volume cible (~140 entrées — +> l'audit a inventorié les 94 colonnes wide MF réellement consommées, les 34 +> sous-champs packés de `static.complements` et les codes `_H` de `mf_data` +> lus par mobile-api). + +## Contexte + +Il n'existe aucune définition partagée de « ce qu'est un paramètre mesuré ». La même +grandeur physique vit sous des formes incompatibles selon le système : + +- **Noms** : `temperature` (familles IC), `T` (wide MF historique), `t` (temps réel MF, + en Kelvin dans l'API source), codes `_H` MF (`TSV_H`, `GLO2_H`…), éléments ECA&D + (`TX`, `TN`, `RR`), colonnes climato (`tn`, `tx`, `rr`, `ens`). +- **Types** : `temperature` en `float` (synop/static), `tinyint` (metar — troncature + au degré entier), `double` (bouées, mf_data) ; `nebulosite` en `enum('0'..'8')` ici, + `int(2)` ou `tinyint(4)` là. +- **Unités** : unités RÉELLES (°C, hPa, mm) dans l'historique Timescale — corrigé par + l'amendement du 2026-07-13 ci-dessous : le contrat annonçait une convention au 1/10, + l'échantillonnage prod l'a réfutée — unités usuelles converties (°C, hPa, m/s) dans + les tables temps réel, SI (K, Pa) dans l'API brute ; le piège K vs °C est déjà + documenté comme incohérence entre contrats (`climato-mf-timescale` vs + `horaire-mf-timescale`). +- **Support temporel encodé dans les noms de colonnes** : `pluie_1h`/`pluie_3h`/ + `pluie_6h`/`pluie_12h`/`pluie_24h`/`pluie_cumul_0h`, `temperature_min`/`_max` sur des + fenêtres implicites, `vent_rafales` vs `vent_rafales_10min` — la durée est une + dimension, pas une grandeur, mais le schéma actuel les confond. +- **Dictionnaires hors modèle** : `static_qualite.id_parametre` et + `static_instruments.id_instrument` définis dans des `COMMENT` SQL (0=Température, + 1=Vent…), non requêtables, non versionnés. + +Toute fusion multi-source, tout export harmonisé, toute réponse LLM sur la donnée bute +sur cette absence de vocabulaire. Le repo a déjà l'embryon : `catalog/glossary.md` +(prose) et les contrats sources MF qui documentent champ par champ unités et types. + +## Décision + +Créer un **vocabulaire contrôlé des paramètres**, artefact versionné du repo, source +unique de vérité dont tables et outils dérivent. + +1. **Source de vérité : `catalog/parametres.yaml`.** Une entrée par grandeur, clés : + - `parametre` (clé stable snake_case, ex. `air_temperature`, `precipitation_amount`, + `wind_speed_of_gust`) ; + - `cf_standard_name` (conventions CF quand il existe, sinon `null` + justification) ; + - `unite_si` (unité de stockage canonique : K, Pa, m/s, kg m-2, %…) ; + - `domaine` (bornes physiques plausibles min/max — socle des contrôles qualité) ; + - `description_fr` ; + - `sources` : le **mapping par système** — colonne famille IC (`synop.temperature`), + code MF historique (`T`, facteur 1 — °C réels, amendement 2026-07-13), colonne + temps réel (`t`, K), code `_H`, + élément ECA&D, id du dictionnaire `static_qualite` — avec pour chacun le facteur + et l'offset de conversion vers l'unité SI. + Ordre de grandeur : ~150 entrées ; la matière existe déjà (contrats + `source-meteofrance-*`, DDL MariaDB, glossaire) — c'est une transcription outillée, + pas une découverte. +2. **Le support temporel est une dimension, pas un paramètre.** Le couple + `(parametre, duree_s)` remplace les familles de colonnes : `precipitation_amount` × + {3600, 10800, 21600, 43200, 86400} couvre `pluie_1h`…`pluie_24h` ; + `air_temperature_min` disparaît au profit de (`air_temperature`, agrégat min, + `duree_s`). Le vocabulaire liste pour chaque paramètre les supports **attendus** par + source (sert de test de complétude à l'ingestion). +3. **Convention de nommage : CF d'abord.** Quand CF définit un standard name, la clé le + suit ; les spécificités Infoclimat (ex. qualité déclarée StatIC) prennent un préfixe + `ic_`. Ni français ni codes MF dans les clés — le français vit dans `description_fr`, + les codes MF dans les mappings. +4. **Matérialisations dérivées** (jamais éditées à la main) : + - table Iceberg `dim_parametre` (ADR-0003) régénérée depuis le YAML ; + - blocs `schema.properties` des futurs contrats ODCS des tables canoniques, + **générés** depuis le vocabulaire (fin de la double saisie contrat/vocab) ; + - vue MCP/bot (précédent ADR-0001/0002 : le tool lit git) — le text-to-SQL et les + réponses du bot s'appuient sur le vocabulaire, pas sur une tradition orale. +5. **Évolution selon ADR-0002** : ajout de paramètre = MR + entrée changelog + (`non-breaking`) ; changement d'unité ou de sémantique d'une clé existante = + `breaking` (et donc, en pratique, création d'une nouvelle clé + dépréciation — + patron `replace` d'ADR-0002, qui s'applique tel quel). +6. **Validation en CI** : lint du YAML (unicité des clés, unités reconnues, bornes + cohérentes, mappings sans collision) + test croisé contre les contrats sources + (tout champ actif d'un contrat `source-meteofrance-*` doit être mappé ou + explicitement listé `non_retenu`). +7. **Conventions d'extension** (amendement 2026-07-11, issues de l'audit de + traduisibilité) : + - **Dimensions verticales et couches encodées dans la clé** quand la + cardinalité est **bornée et fixe** : `soil_temperature_10cm/_20cm/_50cm/ + _100cm`, `cloud_layer_1_area_fraction`…`cloud_layer_4_*` — précédent + GHCN-Daily (profondeur et couverture encodées dans le code élément). + **Frontière explicite** : cette convention ne s'étend PAS aux niveaux + nombreux ou variables — les profils verticaux (radiosondages, ACARS) + exigeront une vraie colonne de niveau ou une modélisation `profile` + dédiée (featureType CF), jamais une explosion de clés. + - **Marqueur `porte_occurrence: true`** sur les paramètres agrégés dont la + source fournit l'heure/date d'occurrence (TN/HTN, TX/HTX, rafales/HXY, + records de normales…) : déclare que la mesure alimente la colonne + `dh_occurrence` du modèle canonique (cf. ADR-0007 amendée). Le couple + (valeur, occurrence) reste atomique — c'est le motif retenu contre le + « paramètre apparié » (`time_of_maximum` séparé), qui expose des couples + orphelins au QC et au filtrage. + - **Mesures techniques** (tension batterie, facteur qualité SR50 — issues de + `static.complements`) : entrées de plein droit avec `domaine` technique, + taguées `technique: true` pour exclusion par défaut des produits météo. + +## Justification + +- **Les conversions d'unités deviennent structurellement uniques.** Un seul endroit + (le mapping) porte par exemple « uv StatIC = centi-index, facteur 1/100 » (vérifié + par échantillon prod, revue A3) ; la conversion vers l'affichage vit dans les vues + Gold, une fois, testée. Le bug K vs °C cesse d'être possible par construction. +- **Évolution additive sans ALTER.** Un nouveau capteur StatIC ou un nouveau champ MF + = une entrée YAML + une ligne de mapping — pas de migration sur des tables de + centaines de GiB, pas de bump majeur en cascade. +- **C'est le prérequis du format long.** La table canonique `observation` de l'étude + n'a de sens que si `parametre` référence un vocabulaire fermé et versionné. +- **Interopérabilité gratuite** : les clés CF alignent les exports sur ce que xarray, + MetPy, les catalogues climat et les équipes recherche attendent. + +## Conséquences + +- (+) Fin des dictionnaires en COMMENT SQL : `static_qualite`/`static_instruments` + se raccordent au vocabulaire par mapping explicite. +- (+) Les ~150 entrées documentent au passage les décisions d'harmonisation + (ex. metar tronqué au degré : mappé avec `qc_detail` de précision — la perte est + tracée, pas silencieuse). +- (+) Le MCP répond « quelles variables de vent existe-t-il et dans quelles sources ? » + depuis git, offline. +- (−) Coût initial de transcription et d'arbitrage (~150 entrées, quelques cas + ambigus : grandeurs MF sans équivalent CF, cumuls à heure d'occurrence en `char(5)`) ; + mitigé en démarrant par le noyau commun aux 3 modèles (~30 paramètres couvrent >95 % + des lignes). +- (−) Une dépendance de plus pour les pipelines (le vocabulaire devient bloquant à + l'ingestion canonique) — c'est voulu : paramètre inconnu = refus d'écrire en Silver, + la donnée reste en Bronze en attendant la MR de vocabulaire. + +**Critère de réouverture** : si le YAML unique devient ingérable (>500 entrées, +conflits de MR fréquents), éclater par domaine (`parametres/{thermo,vent,precip}.yaml`) +sans changer le contrat d'interface des vues. + +## Amendement 2026-07-13 — unités de l'historique Timescale MF (NOTE-A) + +La version initiale de cet ADR affirmait, sur la foi du contrat +`source-meteofrance-*`, que l'historique Timescale MF suivait les « conventions +MF au 1/10 » (°C, mm stockés en dixièmes). **C'est faux, et corrigé** : +l'échantillonnage prod du 2026-07-12 (SELECT sur `Horaire`, années 1980/1989/ +2024 : T min −30,3 / max 36,9 / moyenne 13,1 en 1980 ; PMER en hPa réels) est +sans ambiguïté — **les valeurs sont en unités réelles, `facteur = 1`** dans +tous les mappings concernés du vocabulaire. + +Conséquences : +1. le contrat ODCS source est à corriger (il documentait une convention que la + donnée ne suit pas) ; +2. règle de méthode ajoutée à la revue A3 : **toute unité douteuse se tranche + par échantillon prod, jamais par le seul contrat ou la seule doc** (patron + `sample_unites`) — le contrat décrit une intention, l'échantillon décrit la + donnée ; +3. les 20 mappings encore `unite_incertaine` restent exclus de l'unpivot + (garde `load_vocab`) tant qu'ils n'ont pas leur échantillon. + +## Références + +- Étude R&D « évolution de schéma data » 2026-07-11 (§4.4, §8 mapping de convergence) +- `catalog/glossary.md` (embryon prose), `contracts/source-meteofrance-*.odcs.yaml` + (unités/champs bruts déjà transcrits) +- Dump `schemas/mariadb/schema.sql.gz` (dictionnaires en COMMENT, familles de colonnes) +- ADR-0002 (changelog, patron `replace`, sévérités) ; ADR-0003 (matérialisation Iceberg) +- Audit de traduisibilité legacy 2026-07-11 (`audit-traduisibilite-legacy-2026-07.md`, + workspace — inventaire des colonnes réellement consommées, source du §7) +- CF Standard Names (conventions Climate & Forecast) ; vocabulaire OMM/WIGOS ; + GHCN-Daily (précédent de l'encodage profondeur/couche dans le code élément) diff --git a/adr/0005-identite-stations-unifiee.md b/adr/0005-identite-stations-unifiee.md new file mode 100644 index 0000000..a626c88 --- /dev/null +++ b/adr/0005-identite-stations-unifiee.md @@ -0,0 +1,131 @@ +# ADR-0005 — Identité unifiée des stations (`dim_station`, crosswalk historisé) + +- Statut : proposée +- Date : 2026-07-11 +- Décideurs : data engineer (pam) + +> Phase 0 de l'étude R&D « évolution de schéma » du 2026-07-11, volet 2/2 (le volet +> vocabulaire des paramètres est ADR-0004). Cadre R&D open-source : le champ licence +> par station est **explicitement hors périmètre** de cette ADR. + +## Contexte + +Quatre systèmes d'identifiants de stations coexistent sans réconciliation d'ensemble : + +| Identifiant | Système | Format | +|---|---|---| +| `stations.id` | `V5_data_params.stations` (54 781 lignes, annuaire IC, genre enum) | char(15) | +| `NUM_POSTE` | TimescaleDB historique MF (Horaire, Quotidienne…) | char(8) | +| `geo_id_insee` | TimescaleDB temps réel MF | `ddnnnpp` | +| OACI / OMM / MFID | metar (`id_station` char(4)), `mf_stations`, normales (`ID_wmo`) | divers | + +Le crosswalk existe **en morceaux** : `ommid` (mapping mfid↔stid), `metsyn` +(id textuel↔numérique), `mf_stations.STID`, et la règle documentée au glossaire +« `NUM_POSTE` = `geo_id_insee` tronqué à 7 caractères, avec précision » — un +appariement non trivial appliqué au cas par cas dans le code. S'ajoutent : +`stations_europe` dupliquée dans 2 bases, `communes` en 3 exemplaires, aucune FK +nulle part (MyISAM), et des métadonnées riches mais orphelines — `static_qualite` +(qualité déclarée par paramètre), `static_instruments` (historique d'équipement, +hauteurs, emplacements), datées mais non reliées à une entité station stable. + +Conséquences : toute fusion multi-source (le cœur de la table canonique `observation` +de l'étude), tout dataset publiable, tout appariement obs↔grille repose sur des +jointures conventionnelles fragiles refaites à chaque usage. C'est le blocage n° 1 +identifié par l'étude. + +## Décision + +Créer une **entité station pivot, historisée, source de vérité du rattachement de +toute observation**. + +1. **`station_uid` : identifiant pivot interne, opaque et stable.** Jamais réutilisé, + jamais porteur de sémantique (pas de département encodé dedans — les identifiants + « intelligents » sont précisément ce qui a créé le problème `geo_id_insee`). + Toute table canonique référence `station_uid`, jamais un identifiant source. +2. **Crosswalk explicite** : `ids` = map `type → valeur` (`ic_id`, `num_poste`, + `geo_id_insee`, `oaci`, `omm`, `mfid`, `ecad`…), chaque appariement portant sa + **méthode** (`declared` — présent dans une table de mapping source ; `derived` — + règle documentée type troncature ; `manual` — arbitrage humain en MR) et sa + confiance. La règle de troncature `NUM_POSTE`↔`geo_id_insee` devient du code + versionné et testé, plus une tradition. +3. **Historisation SCD2** (`valid_from`/`valid_to`) : position, altitude, nom, réseau, + statut d'ouverture. Une station déplacée = deux versions, pas un UPDATE — les + études de séries longues (homogénéisation, cas d'usage IA de l'étude) exigent de + savoir *quand* une station a bougé. +4. **Les cas insolubles ont un statut, pas une résolution forcée.** `resolution: + resolved | ambiguous | conflicting`, avec les candidats conservés. Un appariement + douteux marqué `ambiguous` est une information ; un appariement faux silencieux est + une corruption. Jamais de fusion automatique de deux stations sur simple proximité + géo + nom. +5. **Rattachement des métadonnées orphelines** : `static_qualite` et + `static_instruments` (dictionnaires décodés via ADR-0004) deviennent des attributs + datés de l'entité — l'historique d'instrumentation est une métadonnée de rupture + de série de première classe. +6. **Alignement WIGOS en cible** : structure des identifiants compatible OMM + (`0-250-x-` pour un réseau tiers). La demande d'un bloc d'identifiants OMM + pour StatIC est une **piste ouverte** (visibilité WIS 2.0), pas un prérequis — la + colonne `wigos_id` existe, nullable. +7. **Matérialisation et gouvernance** : sources du crosswalk (règles + arbitrages + manuels) versionnées dans le repo ; pipeline de résolution **reproductible** qui + régénère la table `dim_station` (Iceberg + GeoParquet, ADR-0003) ; contrat ODCS + dédié ; évolutions selon ADR-0002 (un appariement corrigé = changelog + MR). + Sorties auditables : rapport de résolution chiffré (résolus/ambigus/conflits) à + chaque run, comparable dans le temps. +8. **Tranches** (chaque tranche autonome) : + 1. **Squelette + crosswalk déclaré** : entité pivot sur `stations` (IC) ⋈ `ommid` ⋈ + `metsyn` ⋈ `mf_stations` — les appariements déjà présents dans les données. + 2. **Appariements dérivés** : règle de troncature codée + testée, metar OACI, + ECA&D ; rapport d'ambiguïtés. + 3. **SCD2 + métadonnées datées** (positions historiques, instruments, qualité). + 4. **Dédoublonnage des référentiels annexes** (`stations_europe`, `communes`) + par rattachement au pivot. + +## Justification + +- **Prérequis de tout le reste.** La table canonique `observation` (étude §4.2), le + wide harmonisé, le benchmark nowcasting et les datasets publics référencent + `station_uid` : sans identité résolue, la fusion multi-source produit des doublons + ou des trous invisibles. +- **SCD2 plutôt qu'annuaire plat** : l'annuaire actuel (`stations`, une ligne par + station, `last_report` écrasé) perd l'histoire ; or les séries font un siècle, et + les déplacements/changements d'instruments sont la première cause de rupture. +- **La méthode d'appariement tracée** transforme le crosswalk en objet scientifique + auditable — condition pour que des tiers (recherche, DataForGood) fassent confiance + aux jointures. +- **Statut `ambiguous` assumé** : l'expérience des morceaux existants (troncature à + précision variable, ids réutilisés) garantit des cas limites ; les nier les ferait + ressortir en aval, en pire. + +## Conséquences + +- (+) Une seule réponse à « c'est quelle station ? » ; les jointures + historique↔temps réel↔IC deviennent mécaniques. +- (+) Les 970 M d'obs StatIC deviennent appariables aux réseaux officiels — condition + du QC par voisinage et des cas d'usage IA de l'étude. +- (+) `stations_europe`/`communes` dédupliquées par rattachement, au lieu de trois + vérités parallèles. +- (−) Chantier de résolution d'identité : des dizaines de cas manuels probables + (arbitrages en MR — c'est le coût de la traçabilité). Mitigé par les tranches : + la tranche 1 ne traite que le déclaré, valeur immédiate sans arbitrage. +- (−) `station_uid` introduit une indirection : les consommateurs habitués aux ids + source passent par le crosswalk (vue de traduction fournie — les ids source restent + des colonnes requêtables, ils cessent juste d'être des clés). +- (−) La qualité du résultat dépend de sources amont parfois fausses + (lat/lon `float` dans `mf_stations`, altitudes douteuses) : le rapport de résolution + doit chiffrer les incohérences géo détectées, pas les corriger silencieusement. + +**Critère de réouverture** : si la part d'`ambiguous` reste >10 % des stations actives +après la tranche 2, le modèle d'appariement (règles + manuel) est insuffisant — +ouvrir une ADR sur une résolution assistée (blocking géo + scoring), sans jamais +retirer la boucle humaine. + +## Références + +- Étude R&D « évolution de schéma data » 2026-07-11 (§2.2, §4.3, §7.3) +- `catalog/glossary.md` (identifiants NUM_POSTE/geo_id_insee/MFID, règle de troncature) +- Dump `schemas/mariadb/schema.sql.gz` : `V5_data_params.{stations,metsyn, + static_qualite,static_instruments}`, `V5_data_mf.mf_stations`, doublons + `stations_europe`/`communes` +- Timescale : `ommid`, `Station`/`StationTempsReel` (inventaire 2026-06-09) +- ADR-0003 (matérialisation Iceberg/GeoParquet) ; ADR-0004 (dictionnaires paramètres) +- WIGOS Station Identifiers (OMM) ; GeoParquet 1.1 diff --git a/adr/0006-postgres-gateway-legacy-lakehouse.md b/adr/0006-postgres-gateway-legacy-lakehouse.md new file mode 100644 index 0000000..e24f48f --- /dev/null +++ b/adr/0006-postgres-gateway-legacy-lakehouse.md @@ -0,0 +1,160 @@ +# ADR-0006 — Postgres comme gateway unique du legacy vers le lakehouse + +- Statut : proposée +- Date : 2026-07-11 +- Décideurs : data engineer (pam) + +> Découle du POC lakehouse 2025 (année complète d'observations en Iceberg/Parquet, +> 2,44 Md de mesures canoniques) et du spike gateway mesuré le 2026-07-11 : +> PHP 7.4 + PDO pgsql — le driver exact de `combined.php` — requêtant le lakehouse +> à travers une extension Postgres, sans changement de driver côté monolithe. +> S'appuie sur ADR-0003 (Iceberg), ADR-0004 (vocabulaire), ADR-0005 (identité). + +## Contexte + +Le monolithe PHP 7.4 (~2 200 fichiers) est couplé au stockage de deux façons : + +- **241 fichiers** référencent les bases shardées `V5_data_*` en MySQL, dont ~130 + interpolent l'année dans le nom de base (`V5_data_{$year}`) — une requête + pluriannuelle assemble à la main des dizaines de tables ; +- les lectures Météo-France passent déjà par **une couche unique**, + `include/MeteoFrance/combined.php` (~5 400 lignes), en **PDO `pgsql:`** vers + TimescaleDB — requêtes à FULL JOIN 4 sources + COALESCE en cascade. + +Si le lakehouse (ADR-0003) devient la source de vérité de l'historique, il faut +un chemin d'accès pour ce code. Trois options examinées : + +1. **API HTTP intermédiaire** (pattern climato-froid, prouvé en prod) : robuste, + mais chaque page legacy migrée exige de passer du SQL à des appels HTTP — + un changement de paradigme pour 241 fichiers. +2. **Réécriture directe** vers un client Iceberg : inexistant en PHP 7.4, exclu. +3. **Gateway protocole Postgres** : une extension Postgres embarquant DuckDB + (pg_duckdb, ou pg_lake) expose les tables Iceberg/Parquet comme des tables + SQL. Le legacy garde PDO `pgsql:`, seule la requête change — et elle se + simplifie (le FULL JOIN multi-sources devient un GROUP BY sur la table + canonique `observation`). + +Le spike (POC itération 3, conteneur `pgduckdb/pgduckdb:17-main`, vues générées +depuis les fichiers actifs Iceberg, bench PDO PHP 7.4.33 sur les 2,44 Md de +mesures 2025, table **non triée ni partitionnée** = borne haute) : + +| Pattern legacy rejoué | p50 mesuré | +|---|---| +| Page station, wide 8 jours (équiv. `get_combined_between`) | 473 ms | +| Série climato tn/tx sur l'année | 425 ms | +| Snapshot carte France à une heure | 183 ms | +| **Dernière observation d'une station (chemin chaud)** | **1 494 ms** | + +## Décision + +**Le protocole Postgres est l'interface unique du legacy vers la donnée : les +lectures chaudes restent sur les tables natives (TimescaleDB), les lectures +d'historique et d'analytique passent par des vues gateway sur les tables +Iceberg — dans la même connexion PDO `pgsql:`.** + +1. **Répartition chaud/froid par latence mesurée, pas par principe.** + - *Chaud* (dernière obs, live, upserts de modération, continuous aggregates) : + tables natives Postgres/Timescale. Le spike confirme que le point-lookup + n'est pas le métier du lakehouse (1,5 s). + - *Froid/analytique* (pages climato, séries longues, cartes historiques, + exports) : vues gateway sur Iceberg. **Confirmé par le spike + tri/partitionnement** (réécriture des 2,44 Md de mesures en partition + month(dh_utc) + tri (station_uid, dh_utc), même count exact, 62 min) — + p50 mesurés : page station 8 j **473 → 109 ms (4,3×)**, série année + **425 → 118 ms (3,6×)**, dernière obs **1 494 → 215 ms (7×)**, snapshot + carte 183 → 273 ms (le tri station-major dégrade légèrement la coupe + temporelle pure — arbitrage assumé, la partition mensuelle borne le coût). + Toutes les requêtes analytiques tiennent en 100-300 ms via PDO PHP 7.4. + Nota : la table triée pèse +13 % (l'entrelacement des paramètres par + station compresse moins bien que l'écriture par branches) — le tri + s'achète en octets, se paie en latence. +2. **TimescaleDB est repositionnée : serving chaud, plus jamais archive.** + Rétention glissante (~2 ans, à calibrer par l'usage réel des pages) + + compression ; le lakehouse est la seule source de vérité de l'historique. + Conséquence sur le plan BDD (`audits/bdd/`) : le P2 « migrer StatIC vers + TimescaleDB » (~1 Tio) est re-scopé en « StatIC live → serving chaud ; + historique StatIC → lakehouse » ; le P-parallèle « cold storage Parquet » + devient le chantier principal. +3. **Choix d'extension : pg_duckdb d'abord, pg_lake en challenger.** pg_duckdb a + fait le spike (fonctionnel, syntaxe `r['col']`, vues sur `read_parquet`) ; + pg_lake (ex-Crunchy, open-sourcé 2025) apporte l'intégration catalogue + Iceberg + écritures transactionnelles et sera évalué au même banc. Critère : + lecture du **catalogue** Iceberg (pas de listes de fichiers générées) et + cohabitation avec l'extension timescaledb sur la même instance — sinon, + instance gateway dédiée à côté du serving (deux Postgres, un seul protocole). + + *Spike métadonnées du 2026-07-11* : pg_lake n'a **pas d'images publiées** + (build depuis les sources — évaluation différée) ; testé à la place : + pg_duckdb + extension DuckDB `iceberg` (installable depuis le conteneur), + vue par `iceberg_scan(metadata.json)` — fonctionne (count exact, zéro liste + de fichiers) mais coûte **~+400 ms par requête** (498-1004 ms vs 109-215 ms + en liste statique) : les manifests sont relus à chaque requête, et la table + du POC traîne **1 227 snapshots** (un par append de 2 M de lignes). + Enseignements prod : (a) commits gros et rares à l'écriture, (b) maintenance + de table obligatoire (expire_snapshots/rewrite_manifests — absents de + pyiceberg 0.11, nécessitent un moteur ou une lib plus récente), (c) le + cache de métadonnées est LE critère d'évaluation de pg_lake. D'ici là, les + vues à liste statique restent le chemin rapide — régénérées à chaque commit, + acceptable pour des archives en lecture seule. +4. **Migration en strangler, par chemin de lecture.** `combined.php` est la + couture naturelle (les lectures MF y sont déjà centralisées) ; chaque page + migrée supprime sa gymnastique `V5_data_{$year}` multi-bases. Jamais de + bascule globale. Chaque vue gateway exposée = un contrat ODCS (les vues sont + des produits dérivés reconstructibles, ADR-0004 §4). +5. **L'API HTTP reste le canal externe** (opendata, MCP, tiers — pattern + climato-froid) ; la gateway est un canal **interne** pour le legacy. Les deux + lisent les mêmes tables Iceberg. + +## Justification + +- **Le spike l'a prouvé au lieu de le supposer** : PHP 7.4 inchangé (driver, + connexion, `fetchAll`) lit 2,44 Md de mesures en sub-seconde sur les patterns + analytiques — sur une table même pas optimisée. +- **Coût de migration minimal par page** : changer une requête SQL (en la + simplifiant), pas un paradigme. La couture `combined.php` existe déjà. +- **Un seul protocole à opérer et superviser** côté legacy ; l'alternative API + aurait ajouté un saut HTTP et un service à la disponibilité duquel chaque page + du site serait suspendue. +- **La répartition chaud/froid suit une mesure reproductible** (le bench est + versionné dans le POC) — la frontière pourra bouger quand le tri/partition + changera les chiffres, sans rouvrir l'architecture. + +## Conséquences + +- (+) Le décommissionnement du sharding `V5_data_*` a enfin un chemin incrémental + chiffrable (nombre de fichiers legacy encore couplés = métrique de progrès). +- (+) TimescaleDB passe de 780 GiB (et croissant) à un serving borné (~<100 GiB + compressé estimé) — la compression P0 reste utile, la crainte capacitaire + disparaît. +- (+) Les requêtes legacy migrées se simplifient (suppression des FULL JOIN + multi-sources : la fusion est faite une fois, en Silver). +- (−) Une extension non triviale (pg_duckdb/pg_lake) entre en prod dans le + chemin de lecture du site : à isoler (instance gateway dédiée si la + cohabitation timescaledb+pg_duckdb n'est pas sereine), à superviser (mémoire + DuckDB bornée — `duckdb.max_memory`). +- (−) Le chemin chaud et le chemin froid divergent dans le code le temps de la + migration : la couture `combined.php` doit router explicitement (fenêtre + temporelle demandée → chaud ou gateway), règle simple mais à tester. +- (−) Les vues gateway du spike reposent sur des listes de fichiers générées + (`gen_init.py`) : fragile face aux commits Iceberg. Levée par l'intégration + catalogue (critère du point 3) — c'est le principal écart spike → prod. + +**Critères de réouverture** : les requêtes mono-station plafonnent à ~105-120 ms +p50 (plancher protocole + vue à ~1 200 fichiers inclus) — acceptable pour des +pages archives ; si un usage exige mieux, la piste est l'intégration catalogue +(pruning de partitions au lieu d'une liste plate) avant de rouvrir la frontière +chaud/froid ; si ni pg_duckdb ni +pg_lake ne cohabitent proprement avec timescaledb ET que l'instance dédiée est +jugée trop lourde, revenir à l'option API interne (le pattern existe déjà). + +## Références + +- POC : `poc-lakehouse-2025/` (README §Itération 3, `deploy/pg-gateway/` — + compose, gen_init.py, bench.php avec les chiffres) +- Étude R&D « évolution de schéma data » 2026-07-11 (§5.4, question serving) +- `site-infoclimat/include/MeteoFrance/combined.php` (la couture) ; + `audits/bdd/reconciliation-proposition-migration.md` (P0-P3 à re-scoper) +- ADR-0003 (Iceberg), ADR-0004 (vocabulaire — vues = produits dérivés), + ADR-0005 (identité stations) +- pg_duckdb (MotherDuck/Hydra) ; pg_lake ; contrats `mf-data-fallback` / + `dual-source-targets.yaml` (le pattern de bascule mesurée à répliquer) diff --git a/adr/0007-serving-chaud-modele-canonique.md b/adr/0007-serving-chaud-modele-canonique.md new file mode 100644 index 0000000..294946b --- /dev/null +++ b/adr/0007-serving-chaud-modele-canonique.md @@ -0,0 +1,192 @@ +# ADR-0007 — Serving chaud : le modèle canonique long sur Postgres/Timescale + +- Statut : proposée +- Date : 2026-07-11 +- Décideurs : data engineer (pam) + +> Referme la boucle ouverte par ADR-0006 (qui repositionne TimescaleDB en +> « serving chaud, plus jamais archive ») : à quoi ressemble ce serving chaud +> refait à l'état de l'art, sans contrainte legacy. Source : étude compagnon +> « serving chaud » du 2026-07-11. S'appuie sur ADR-0004 (vocabulaire) et +> ADR-0005 (identité stations). + +> **Amendée le 2026-07-11** (audit de traduisibilité legacy) : la table +> canonique `observation` — au chaud COMME au lakehouse (Silver) — gagne deux +> attributs optionnels issus des trous de modélisation identifiés : +> `dh_occurrence` et la position par observation (voir Décision §1bis). + +## Contexte + +Le TimescaleDB actuel (780 GiB) est un produit d'accrétion : 4 hypertables wide +Météo-France (~200 colonnes `PARAM`/`QPARAM`) aux identifiants et unités +divergents entre historique et temps réel, 12 matviews non versionnées +rafraîchies par Kestra, base en SQL_ASCII, compression jamais activée, et un +monolithe qui fusionne les 4 sources à chaque requête (FULL JOIN + COALESCE +dans `combined.php`). ADR-0006 lui retire le rôle d'archive ; reste à décider +le format du chaud (~2 ans glissants). + +Profil de charge du serving, mesuré ou connu : point-lookups à la milliseconde +(« dernière obs », des milliers/min sur les pages), petites fenêtres récentes +par station, snapshots carte, upserts continus (flux 6 min, corrections de +modération, réémissions MF), agrégats quotidiens/mensuels temps réel, records. + +## Décision + +**Le chaud adopte le modèle canonique du lakehouse — la table `observation` au +format long (ADR-0004/0005) — sur Postgres/TimescaleDB, avec deux mécanismes +dédiés aux lectures à la milliseconde. Chaud et froid deviennent deux fenêtres +temporelles du même modèle logique.** + +1. **Même modèle logique, deux moteurs.** Une hypertable `observation` + (station_id int, dh_utc timestamptz, parametre_id smallint, duree_s, valeur, + qc_flag smallint, version_obs, source_id), clés entières compactes issues + des référentiels répliqués depuis le lakehouse (jamais édités à chaud). + La fusion des sources est faite **une fois, à l'ingestion** — le FULL JOIN + 4 sources disparaît ; la frontière chaud/froid dans la couture `combined.php` + (ADR-0006 §4) devient un prédicat de temps sur le même SQL. +1bis. **Deux attributs optionnels sur `observation`** (amendement 2026-07-11, + valables au chaud ET en Silver — même modèle logique) : + - **`dh_occurrence timestamptz NULL`** : heure/date d'occurrence d'un + extrême ou d'un événement dans la période de la mesure (TN/HTN, TX/HTX, + rafale/HXY, record de normale). NULL pour les mesures instantanées. + Précédents : descripteurs associés BUFR/OMM, couples TN/HTN du wide MF, + MIDAS Met Office. Colonne d'attribut plutôt que paramètre apparié : le + couple (valeur, occurrence) reste insécable au QC et au filtrage. + - **`lat float8 NULL, lon float8 NULL`** : position PAR observation pour + les plateformes mobiles (bouées dérivantes, navires, demain AMDAR/ACARS). + NULL = la position est celle de `dim_station`. Précédents : ICOADS + (l'archive marine de référence stocke lat/lon par relevé), Argo, + featureType `trajectory` des conventions CF. Les vues Gold exposent la + **position effective** `COALESCE(obs.lat, station.lat)` pour des requêtes + spatiales uniformes. + Coût : colonnes creuses (NULL massivement dominant), négligeable en + columnar compressé des deux côtés. +2. **Postgres/Timescale est conservé, par convergence et non par legacy.** + Le profil (point-lookups, upserts, petites fenêtres) est le métier d'un + Postgres, et ADR-0006 en fait déjà le protocole unique vers le froid — un + seul dialecte, une opération mono-steward. ClickHouse est le challenger + documenté, avec critère de réouverture explicite (voir Conséquences). +3. **Physique de la table** : chunks 7 jours ; Hypercore + (`compress_segmentby = station_id, parametre_id`, `compress_orderby = + dh_utc`) au bout de 7 jours — le long segmenté est le cas d'école de la + compression Timescale (2-4 o/ligne attendus) ; **rétention 24 mois** + (à calibrer sur la distribution réelle des fenêtres demandées), le lakehouse + ayant l'intégralité. Cible : **20-40 GiB compressés** contre 780 GiB + aujourd'hui. +4. **Les lectures milliseconde ne touchent jamais le long** : + - `obs_last` (station × paramètre × durée → dernière valeur, ~1,6 M lignes, + UPSERT à l'ingestion) : « dernière obs » = index scan <1 ms — le chemin + que la gateway froide sert en 215 ms au mieux (bench ADR-0006) ; + - **continuous aggregates hiérarchiques temps réel** (`cagg_hourly_wide` — + le wide redevient un dérivé, ici aussi — → `cagg_daily` tn/tx/rr/raf → + `cagg_monthly`) : remplacent les 12 matviews + refresh Kestra — le P1 du + plan BDD (`audits/bdd/`) prend cette forme définitive. Les records battus + = `cagg_daily` × table des records synchronisée du lakehouse. +5. **Base neuve, pas de migration in place** : UTF-8 (l'actuelle est en + SQL_ASCII), `timestamptz` UTC. **Trajectoire choisie par le CA + (2026-07-11), pour minimiser la charge des développeurs** : le Timescale + legacy reste la cible de l'ingestion actuelle et n'est PAS modifié ; un + **pipeline de tail incrémental** micro-batch (~6 min) lit la fenêtre + récente des 4 tables wide legacy (avec chevauchement de quelques heures + pour les réémissions/corrections MF), convertit wide→long via le + vocabulaire (ADR-0004) et le crosswalk (ADR-0005), et **UPSERT idempotent** + dans le nouveau Timescale canonique. Pas de CDC Debezium/Kafka (déjà écarté + au recadrage prestataire ; réplication logique piégeuse sur hypertables) — + un watermark + fenêtre de relecture suffit sur des tables append-mostly à + clés temporelles. Les pages basculent une à une ; readiness mesurée au + pattern `check_dual_source` ; le jour où plus rien ne lit le wide, on coupe + le tail et on adapte enfin l'ingestion (pointage direct sur le canonique) — + c'est la DERNIÈRE étape, pas la première. +6. **Corrections = versions**, comme au lakehouse (`version_obs`, la vue de + serving prend la dernière) ; l'`UPDATE qc_flag` reste toléré à chaud + (pragmatisme modération) mais est répercaté au froid par le flux de + synchronisation — **jamais l'inverse**. +7. **Un seul flux chaud → froid** : export quotidien des jours clos (J-2) vers + Iceberg, idempotent (overwrite de partition), counts contrôlés. Le chaud + n'est jamais une archive, le froid n'est jamais écrit à la main. + +## Justification + +- **Un seul modèle à maintenir** : vocabulaire, identité, QC et sémantique des + durées sont définis une fois (ADR-0004/0005) et valent pour les deux moteurs ; + plus aucune réconciliation de schémas chaud/froid, plus de piège d'unités. +- **Le long à chaud est éprouvé** : c'est le modèle « narrow » recommandé pour + capteurs hétérogènes par Timescale même, et la sparsité des familles (2 à + ~90 paramètres selon la source) le rend inévitable — le wide MF actuel le + prouve par ses cimetières de NULL. +- **Les deux objections classiques au long à chaud tombent** avec les mécanismes + dédiés : le point-lookup par `obs_last` (O(1)), le wide de page par les caggs + (pré-pivotés, temps réel). Le long n'est le chemin de personne, il est la + vérité de tous. +- **La volumétrie cesse d'être un sujet** : 20-40 GiB compressés tiennent en + RAM d'un serveur modeste — les questions réplicas/capacité du dossier BDD + changent d'échelle. + +## Conséquences + +- (+) `combined.php` se réduit à un routage temporel + un GROUP BY ; les + contrats `horaire-mf-timescale`/`infrahoraire-mf`/`mf-data-fallback` + convergent vers un contrat unique `observation-chaud`. +- (+) Extinction programmée : 4 hypertables wide, 12 matviews, refresh Kestra, + fallback `mf_data` — chaque pièce a un remplaçant nommé dans cette ADR. +- (+) L'ingestion TS/Prisma existante se simplifie (une table cible au lieu de + 18 modèles wide), mais doit intégrer le mapping vocabulaire (ADR-0004) — + c'est le vrai chantier de code. +- (−) Réécriture des flux d'ingestion et double-alimentation transitoire : + coût réel, borné par le pattern de bascule mesurée déjà rodé (dual-source). +- (−) `obs_last` et les caggs sont des états supplémentaires à surveiller + (lag de matérialisation, dérive vs le long) — checks de cohérence à ajouter + aux contrôles CI/prod existants. +- (−) Questions ouvertes assumées : sentinelle `duree_s` (0 vs NULL vs -1), + `float4` vs `float8` pour `valeur`, PostGIS à chaud pour les cartes live, + et co-hébergement gateway pg_duckdb / serving sur la même instance (dépend + du spike de cohabitation ADR-0006 §3). + +**Critères de réouverture** : si un produit exige de l'analytique sub-seconde +sur l'intégralité du chaud (au-delà des caggs), ré-évaluer ClickHouse comme +moteur du chaud ; si la rétention nécessaire dépasse ~3-4 ans (usage réel des +pages), la frontière chaud/froid d'ADR-0006 est à recalibrer avant d'agrandir +le chaud. + +## Amendement 2026-07-16 — `obs_last.source_prio` (préséance à l'upsert) + +Le POC D1 a révélé que la coquille `obs_last` déployée (PK `station_id, +parametre_id, duree_s` ; colonnes `dh_utc, valeur, qc_flag`) **ne stocke pas +la source** — or la règle de préséance A2 à l'upsert (« une source moins +prioritaire ne remplace jamais une valeur plus prioritaire au même dh_utc », +qui empêche le ping-pong entre D2 et D2b sur la même case) a besoin de +connaître la source de la valeur en place pour arbitrer. + +**Décision (pam, 16/07)** : ajouter `source_prio smallint NOT NULL` à +`obs_last` — le **rang de préséance** (petit = prioritaire), directement +comparable, plus compact qu'un `source_id` + jointure. Ordre v1 (préséance A2, +AMB-1 « natif IC prioritaire par défaut ») : + +| source_prio | source | | +|---|---|---| +| 0 | moderation (saisie humaine) | AMB-3, priorité absolue | +| 10-14 | synop-ic, static-ic, metar-ic, bouees-ic, mae-ic | natif IC | +| 20-22 | mf-h, mf-i, mf-q | Météo-France | + +Règle d'upsert : `ON CONFLICT (station_id, parametre_id, duree_s) DO UPDATE` +si `excluded.dh_utc > obs_last.dh_utc` (récence) **OU** (`=` ET +`excluded.source_prio < obs_last.source_prio`, préséance à dh_utc égal). +Backfill équivalent : par clé, `ORDER BY dh_utc DESC, source_prio ASC LIMIT 1`. +Les exceptions par paramètre d'AMB-1 (certains params où MF écrase) sont une +**raffinement Gold/v2**, pas portées dans ce rang total v1 (obs_last = +« dernière valeur » live, IC-natif-gagne par défaut est défendable). + +## Références + +- Étude compagnon « serving chaud » 2026-07-11 (workspace — DDL cible complet, + volumétries, trajectoire en Y) ; étude R&D « évolution de schéma » (§4, §5.4) +- Bench ADR-0006 (chemin chaud 215 ms au mieux via gateway → besoin d'obs_last) +- POC `poc-lakehouse-2025/` (vocabulaire et crosswalk réutilisables tels quels) +- `audits/bdd/reconciliation-proposition-migration.md` (P0 compression, P1 + continuous aggregates — absorbés par cette ADR), inventaire TimescaleDB + 2026-06-09 (SQL_ASCII, 0 policy, matviews non versionnées) +- Audit de traduisibilité legacy 2026-07-11 (`audit-traduisibilite-legacy-2026-07.md`, + workspace — source des amendements §1bis et de la table de préséance à venir) +- ADR-0004, ADR-0005, ADR-0006 ; Timescale Hypercore / continuous aggregates +- BUFR/OMM (heure d'occurrence associée) ; ICOADS, Argo, CF `trajectory` + (position par relevé) diff --git a/adr/0008-modele-canonique-previsions.md b/adr/0008-modele-canonique-previsions.md new file mode 100644 index 0000000..cc3ac46 --- /dev/null +++ b/adr/0008-modele-canonique-previsions.md @@ -0,0 +1,227 @@ +# ADR-0008 — Prévisions numériques : dimensions partagées, table séparée + +- Statut : proposée +- Date : 2026-07-27 +- Décideurs : data engineer (pam) + +> Répond à une question posée pendant le POC canonique : faut-il verser les +> sorties des modèles de prévision (AROME, ARPEGE, GFS…) dans la table +> `observation` du canonique « pour tout harmoniser » ? Prolonge ADR-0004 +> (vocabulaire, explicitement borné à l'observation), ADR-0005 (identité +> stations) et ADR-0007 (modèle canonique long, chaud et froid). + +## Contexte + +Les modèles vivent aujourd'hui dans un monde parallèle au reste de la donnée. +`modeles-ncl` télécharge et décode les runs (AROME, ARPEGE, GEFS, COAMPS, BOM, +WRF…), `modeles-php` orchestre les lancements sur srx-modeles-2, et la sortie +utile est une **image** : des cartes NCL. Entre le GRIB décodé et la carte, il +n'existe aucune matérialisation requêtable, aucun vocabulaire commun avec +l'observation, aucun rattachement au référentiel stations. + +Conséquences concrètes, toutes constatées : + +- **Impossible de comparer prévu et observé** sans réécrire un mapping ad hoc : + le modèle sort `T2M` ou `t2m` en kelvin sur une grille, l'observation sort + `air_temperature` en kelvin sur une station — les deux disent la même chose et + ne se joignent pas. +- **Aucun score de vérification** n'est calculé ni publié (biais, RMSE, taux de + bonne détection), alors que c'est la métrique la plus demandée sur un service + météo participatif et le premier argument de transparence. +- **Une page station ne peut pas juxtaposer** la mesure et la prévision au même + point : il n'y a pas de prévision « au point station », seulement des rasters. + +D'où la tentation d'unifier par le bas : une seule table `observation`, on y met +tout, le problème de vocabulaire disparaît. Cette ADR tranche ce point. + +Rappel du grain canonique (ADR-0007) : `(station_id, dh_utc, parametre_id, +duree_s)` → `valeur`, avec `qc_flag`, `version_obs`, `source_id`. + +## Décision + +**Les sorties de modèle ne rejoignent pas la table `observation`. Elles +réutilisent en revanche l'intégralité des dimensions du canonique — vocabulaire, +identité des stations, sémantique des durées, unités SI — et se matérialisent +dans une table sœur `prevision`, réservée aux prévisions ponctuelles extraites +aux stations. Les champs grillés restent dans leur format natif.** + +### 1. `observation` reste la table des observations + +Quatre raisons, dont la première est dirimante. + +**1a. La clé n'a pas les bons axes.** Une prévision n'est pas identifiée par +`(station, instant, paramètre, durée)`. Il y manque le **run** (heure +d'analyse) : pour un même instant valide, les runs successifs produisent +plusieurs prévisions qui coexistent légitimement. Il y manque le **modèle** et, +pour les ensembles, le **membre**. + +Et `version_obs` n'est pas le refuge de ces axes. Ce champ versionne la +**correction d'une vérité unique** — une mesure re-validée remplace la +précédente, la dernière version fait foi. Deux prévisions de runs différents ne +se corrigent pas l'une l'autre. Les confondre ferait mentir `obs_last` +(« dernière valeur connue » n'aurait plus de sens) et la contrainte d'unicité de +la PK. + +**1b. La géométrie diffère.** `dim_station` (ADR-0005) référence un site +physique : coordonnées, altitude, classe de siting, période d'activité, +rattachement INSEE. Un modèle produit un champ sur une grille régulière. Inscrire +les points de grille comme pseudo-stations ferait passer `dim_station` de ~15 750 +entrées à des millions de lignes sans métadonnée de siting, sans historique, sans +commune — ce qui viderait de sens tout ce qui s'appuie dessus : `/ref/stations`, +le crosswalk canicule, la carte de couverture, les filtres par réseau. + +**1c. Le volume est d'un autre ordre.** Ordre de grandeur pour AROME seul, +hypothèses explicites : ~10⁶ points de grille × ~40 paramètres × ~50 échéances × +8 runs/jour ≈ **10 milliards de valeurs par jour**. L'archive d'observations +complète, remontant à 1777, en compte 39 milliards. Le modèle réécrirait +l'équivalent du fonds tous les quatre jours. + +Le tuning physique suit la même logique : `observation` est partitionnée en +tranches de 7 jours et compressée `segmentby (station_id, parametre_id)`, ce qui +suppose peu de stations et beaucoup d'historique. Le profil prévision est +exactement l'inverse. + +**1d. Le cycle de vie est opposé.** Une observation se garde indéfiniment. Une +prévision perd sa valeur d'usage passée son échéance ; seule une fraction est +conservée, et pour un autre motif (le calcul de scores). Mélanger les deux dans +une table impose la rétention la plus longue au volume le plus gros. + +### 2. Les dimensions, elles, sont partagées — c'est là qu'est l'harmonisation + +- **`dim_parametre` (ADR-0004) est étendu, pas dupliqué.** Une grandeur + pronostiquée porte la même clé que la grandeur observée : le T2M d'AROME est + `air_temperature`, en kelvin, avec les mêmes bornes de plausibilité. Le + nommage CF est issu des conventions *Climate and Forecast* — prévu dès + l'origine pour couvrir les sorties de modèle. Les grandeurs sans équivalent + observé (CAPE, hauteur de couche limite, précipitations convectives) entrent + comme nouvelles clés du même vocabulaire, avec la même règle d'unité SI. +- **`dim_station` (ADR-0005) est partagé tel quel.** La prévision au point + Grenoble-St-Geoirs porte le `station_uid` de Grenoble-St-Geoirs. +- **`duree_s` garde sa sémantique.** Le Tx prévu sur 24 h et le Tx observé sur + 24 h ont la même durée d'accumulation : la comparaison est licite sans + retraitement. +- **Nouvelle dimension `dim_modele`** : identité du modèle (nom, centre + producteur, résolution, domaine, version de cycle), versionnée comme les + autres référentiels — git fait foi, la table est une vue (ADR-0002). + +Avec ces dimensions communes, comparer prévu et observé devient une **jointure**, +pas une couche de traduction. C'est tout l'objet de l'ADR. + +### 3. Table sœur `prevision`, prévisions ponctuelles aux stations + +| Colonne | Type | Rôle | +|---|---|---| +| `modele_id` | smallint | → `dim_modele` | +| `run_utc` | timestamptz | heure d'analyse | +| `dh_utc` | timestamptz | instant valide (l'échéance se dérive : `dh_utc − run_utc`) | +| `station_id` | int | → `dim_station`, **même référentiel** | +| `parametre_id` | smallint | → `dim_parametre`, **même vocabulaire**, unités SI | +| `duree_s` | int | même sémantique d'accumulation | +| `membre` | smallint | 0 = déterministe, n = membre d'ensemble | +| `valeur` | float8 | | + +PK : `(modele_id, run_utc, station_id, parametre_id, duree_s, membre, dh_utc)`. + +Deux différences assumées avec `observation` : + +- **pas de `qc_flag`** — une prévision ne se contrôle pas à l'ingestion, elle se + vérifie a posteriori. Sa qualité est un produit dérivé (§5), pas un attribut + de ligne ; +- **pas de `version_obs`** — l'axe `run_utc` porte déjà la temporalité des + révisions, et deux runs ne se remplacent pas. + +Volumétrie cible : ~15 000 stations au lieu de ~10⁶ points de grille, soit trois +ordres de grandeur en moins. Rétention courte par défaut sur les runs, longue sur +l'échantillon conservé pour les scores. + +### 4. Les champs grillés restent dans leur format natif + +GRIB2 en réception, converti en **Zarr** (ou équivalent chunké) pour l'accès +analytique, stocké sur S3 et **référencé par le catalogue** — jamais dépivoté en +lignes. Un champ grillé compressé coûte 1 à 2 octets par valeur ; la même valeur +en modèle long en coûte 5 à 20 fois plus, les clés étant répétées à chaque point. +Le lakehouse indexe les rasters, il ne les avale pas. + +`prevision` est donc un **produit d'extraction** de ces champs (interpolation au +point station, méthode et voisinage documentés dans le contrat), pas leur +matérialisation exhaustive. + +### 5. La vérification est un dataset Gold + +Les scores (biais, RMSE, MAE par échéance et par modèle, taux de détection sur +seuils) se calculent par jointure `prevision × observation` sur +`(station_id, parametre_id, duree_s, dh_utc)` — jointure devenue triviale par +construction. Ils se publient comme les autres datasets Gold, avec contrat ODCS. + +## Justification + +- **L'harmonisation réelle est dans les dimensions, pas dans la table.** Ce que + coûte aujourd'hui l'hétérogénéité — impossibilité de joindre, pièges d'unités, + double vocabulaire — est intégralement réglé par le partage de + `dim_parametre`/`dim_station`. Fusionner les tables n'apporte rien de plus et + détruit les invariants de chacune. +- **Le précédent existe partout.** Aucun système d'état ne mélange observations + et prévisions dans la même table : le WMO les sépare jusque dans les formats + d'échange (BUFR pour l'observation, GRIB pour le champ prévu) ; les archives de + vérification (ECMWF, MET Norway, NOAA MDL) modélisent la prévision avec l'axe + `reference_time` × `valid_time` distinct, exactement la structure retenue ici. +- **Le coût de l'erreur inverse est asymétrique.** Séparer et devoir joindre est + un coût de requête, borné et connu. Fusionner et devoir re-séparer, c'est une + migration de plusieurs dizaines de milliards de lignes avec un modèle dont la + PK est fausse — ce que le POC a précisément passé six mois à défaire sur le + legacy. +- **La sparsité qui justifiait le long pour l'observation ne vaut pas ici.** Une + sortie de modèle est **dense** : tous les points ont toutes les valeurs. Le + modèle long, choisi en ADR-0007 parce que le wide MF était un cimetière de + NULL, perd son argument principal face à un champ grillé complet — d'où le + format natif au §4. + +## Conséquences + +- (+) Comparaison prévu/observé et scores de vérification deviennent + atteignables : une jointure sur des clés partagées, un dataset Gold, un + endpoint. C'est le produit qui manque le plus visiblement aujourd'hui. +- (+) `dim_parametre` gagne un second consommateur, ce qui **valide le pari + d'ADR-0004** : un vocabulaire contrôlé n'a d'intérêt que s'il traverse les + domaines. Le nommage CF y était déjà prêt. +- (+) Les invariants d'`observation` sont préservés : `obs_last` garde son sens, + la PK reste vraie, la compression reste adaptée au profil, `dim_station` + reste un référentiel de sites physiques. +- (+) `modeles-ncl`/`modeles-php` cessent d'être une impasse : leur sortie + devient de la donnée requêtable, pas seulement des images. +- (−) **Une chaîne d'extraction à construire** : décodage GRIB → conversion Zarr + → interpolation au point station → écriture `prevision`. C'est le vrai + chantier, non trivial, avec des choix à documenter (méthode d'interpolation, + traitement du relief, gestion des points de mer). +- (−) **Le mapping des paramètres modèles est à faire** (~40-60 clés par modèle, + dont plusieurs sans équivalent observé). Travail comparable au mapping des 280 + entrées de l'observation, mais mieux outillé puisque le vocabulaire existe. +- (−) **Une dimension et une table de plus** à gouverner : contrat ODCS, + lineage OpenLineage, politique de rétention par modèle. +- (−) `prevision` ne couvre pas les usages cartographiques (carte de prévision + France entière) : ceux-ci restent servis par les champs grillés, donc **deux + chemins de lecture** coexistent selon qu'on veut un point ou un champ. + +**Critères de réouverture** : si un usage exige des prévisions sur un maillage +dense et non plus aux stations (post-traitement statistique type MOS sur grille, +downscaling par maille), réexaminer l'ajout d'un axe `cellule_id` à `prevision` +plutôt qu'un élargissement de `dim_station` — la frontière à tenir reste +« une station est un site physique ». Si le volume de `prevision` dépasse celui +d'`observation` malgré la restriction aux stations, revoir la rétention avant le +modèle. + +## Références + +- ADR-0004 (vocabulaire `dim_parametre`, périmètre observation — étendu ici), + ADR-0005 (identité stations, réutilisée telle quelle), ADR-0007 (modèle + canonique long, chaud et froid), ADR-0002 (versioning des schémas de sources + externes — `dim_modele` suit le même régime), ADR-0003 (Iceberg) +- POC CHOM : `chom-poc-data/docs/utiliser-les-donnees.md` (format canonique tel + que servi), `deploy/staging/initdb-canonical/01-schema.sql` (DDL `observation`) +- Repos concernés : `modeles-ncl` (downloaders et décodage AROME/ARPEGE/GEFS/ + COAMPS/BOM), `modeles-php` (orchestration des runs) +- Conventions CF (*Climate and Forecast*) — le vocabulaire d'ADR-0004 couvre par + construction les grandeurs pronostiquées ; WMO GRIB2 (champs prévus) vs BUFR + (observations), séparation des formats d'échange +- Pratique des archives de vérification (`reference_time` × `valid_time` × membre) + chez ECMWF, MET Norway (Thredds/Zarr), NOAA MDL diff --git a/audits/rgpd/README.md b/audits/rgpd/README.md index 7f2d33e..ba7f187 100644 --- a/audits/rgpd/README.md +++ b/audits/rgpd/README.md @@ -6,18 +6,25 @@ dans le système d'information, regroupées par finalité. | Fichier | Rôle | |---|---| -| `traitements.yaml` | **Source** — traitements (finalité, personnes, données, base légale, conservation) et tables rattachées. À éditer ici. | +| `traitements.yaml` | **Source** — en-tête `meta` (responsable, socle de sécurité, réserve juridique) + traitements (finalité, personnes, données, destinataires, transferts, base légale, conservation, localisation, sécurité) et tables rattachées. À éditer ici. | | `registre-traitements.md` | **Généré** par `tools/build_rgpd_register.py`. Ne pas éditer à la main. | +Modèle de fiche calqué sur un registre art. 30 de référence. Champs par traitement : +`finalite`, `personnes`, `donnees`, `destinataires?`, `transferts?`, `base_legale`, +`conservation`, `localisation`, `securite?`, `contrat?`, `note?`, `tables` (les `?` sont +optionnels — une fiche sans `securite` retombe sur le socle commun de l'en-tête). + ## Périmètre et limites - Le **périmètre des données personnelles** fait foi depuis `inventory/tables.yaml` (flag `personal_data: true`). Le générateur échoue si une table flaggée manque au registre ou inversement — le registre ne peut pas dériver en silence de l'inventaire. -- Les champs **juridiques** (base légale, durée de conservation, mesures de sécurité, - exercice des droits) relèvent du **bureau de l'association** et sont à confirmer. Ce - volet documente le *factuel data* (quelles données, où, pour quelle finalité), pas la - position légale arrêtée. +- Le **factuel data** (quelles données, où — `localisation`, destinataires/transferts + constatés, mesures de sécurité techniques connues) est renseigné par le volet + data-platform à partir de l'inventaire et du code. +- Les champs **juridiques** (base légale, durée de conservation, qualification des + transferts, exercice des droits) relèvent du **bureau de l'association** et restent + marqués « à confirmer » : ce sont des constats, pas la position légale arrêtée. ## Régénérer / vérifier diff --git a/audits/rgpd/registre-traitements.md b/audits/rgpd/registre-traitements.md index 5b916bf..30286c0 100644 --- a/audits/rgpd/registre-traitements.md +++ b/audits/rgpd/registre-traitements.md @@ -4,10 +4,12 @@ Ce registre recense **où vivent les données personnelles** dans le système d'information, regroupées par finalité. Il constitue la contribution technique de la data-platform au registre des traitements de l'association (art. 30 RGPD). -Les champs juridiques (**base légale**, **durée de conservation**, mesures de sécurité) relèvent du bureau de l'association et sont à confirmer — ils figurent ici en l'état pour être complétés, non comme position arrêtée. - **10 traitements**, **32 tables** porteuses de données personnelles (source de vérité du périmètre : `inventory/tables.yaml`, flag `personal_data`). +- **Responsable de traitement** : Association Infoclimat (responsable de traitement). Délégué / référent à la protection des données : à désigner — bureau. +- **Socle de sécurité commun** : Hébergement auto-hébergé (Proxmox/LXC, infrastructure interne) ; accès réseau restreint ; chiffrement TLS en bordure (Cloudflare) ; base principale répliquée. Le détail d'exploitation (adresses, ports, sauvegardes) est tenu en interne. +- **Réserve juridique** : Base légale, durée de conservation, destinataires et transferts hors-UE doivent être validés par le bureau. Les valeurs « à confirmer » sont des constats data, pas une position juridique arrêtée. + ## Gestion des comptes utilisateurs et de l'authentification - **Identifiant** : `comptes-authentification` @@ -15,6 +17,8 @@ Les champs juridiques (**base légale**, **durée de conservation**, mesures de - **Données** : Identité (pseudo), secret (mot de passe haché), email de contact, IP et user-agent de connexion, jetons de session et de réinitialisation - **Base légale** : à confirmer (exécution du service / consentement à l'inscription) - **Conservation** : à confirmer (jetons à expiration ; comptes ?) +- **Localisation** : MariaDB `ct-mariadb-1` (table `connectes` en ENGINE=MEMORY, fenêtre ~5 min) +- **Mesures de sécurité** : Mots de passe hachés ; jetons de session et de réinitialisation à expiration - **Contrat de données** : [`v5-comptes-utilisateurs`](../../contracts/v5-comptes-utilisateurs.odcs.yaml) - **Tables** : - `mariadb://V5/comptes` @@ -29,8 +33,12 @@ Les champs juridiques (**base légale**, **durée de conservation**, mesures de - **Identifiant** : `applications-mobiles` - **Personnes concernées** : Utilisateurs des applications iOS/Android - **Données** : Jetons d'appareil (APNS/FCM), paramètres applicatifs liés au compte +- **Destinataires** : Apple Push Notification service (APNS) et Google Firebase Cloud Messaging (FCM) pour l'acheminement des notifications +- **Transferts hors-UE** : Oui — Apple / Google (États-Unis), hors UE — encadrement à confirmer (bureau) - **Base légale** : à confirmer (consentement aux notifications) - **Conservation** : à confirmer +- **Localisation** : MariaDB `ct-mariadb-1` +- **Mesures de sécurité** : socle commun (cf. en-tête) - **Contrat de données** : — - **Tables** : - `mariadb://V5/apns_devices` @@ -45,6 +53,8 @@ Les champs juridiques (**base légale**, **durée de conservation**, mesures de - **Données** : Lien compte (id_compte), géolocalisation des contributions, contenus, messages privés - **Base légale** : à confirmer - **Conservation** : à confirmer +- **Localisation** : MariaDB `ct-mariadb-1` +- **Mesures de sécurité** : Messages privés (`mp_mp`) — chiffrement au repos à confirmer (bureau) - **Contrat de données** : [`photolive`](../../contracts/photolive.odcs.yaml) - **Tables** : - `mariadb://V5/personnes` @@ -58,8 +68,12 @@ Les champs juridiques (**base légale**, **durée de conservation**, mesures de - **Identifiant** : `vie-associative` - **Personnes concernées** : Adhérents de l'association - **Données** : Identité, coordonnées, paiements (dont HelloAsso), pouvoirs de vote +- **Destinataires** : HelloAsso (encaissement des cotisations / dons en ligne) +- **Transferts hors-UE** : Non (HelloAsso — France / UE) — à confirmer (bureau) - **Base légale** : à confirmer (obligation légale comptable / exécution de l'adhésion) - **Conservation** : à confirmer (obligations comptables et statutaires) +- **Localisation** : MariaDB `ct-mariadb-1` +- **Mesures de sécurité** : socle commun (cf. en-tête) - **Contrat de données** : — - **Tables** : - `mariadb://asso/asso_adherants` @@ -72,8 +86,11 @@ Les champs juridiques (**base légale**, **durée de conservation**, mesures de - **Identifiant** : `boutique` - **Personnes concernées** : Clients de la boutique - **Données** : Identité, coordonnées de livraison, données de commande +- **Destinataires** : Prestataires de paiement et de livraison — à confirmer (bureau) - **Base légale** : à confirmer (exécution du contrat de vente) - **Conservation** : à confirmer (obligations comptables) +- **Localisation** : MariaDB `ct-mariadb-1` +- **Mesures de sécurité** : socle commun (cf. en-tête) - **Contrat de données** : — - **Tables** : - `mariadb://V5/boutique_commandes` @@ -85,6 +102,8 @@ Les champs juridiques (**base légale**, **durée de conservation**, mesures de - **Données** : Lien compte, inscriptions - **Base légale** : à confirmer - **Conservation** : à confirmer +- **Localisation** : MariaDB `ct-mariadb-1` +- **Mesures de sécurité** : socle commun (cf. en-tête) - **Contrat de données** : — - **Tables** : - `mariadb://concoursprevi/participants_v5` @@ -97,6 +116,8 @@ Les champs juridiques (**base légale**, **durée de conservation**, mesures de - **Données** : Lien compte, pseudo, périmètre d'habilitation - **Base légale** : à confirmer - **Conservation** : à confirmer +- **Localisation** : MariaDB `ct-mariadb-1` +- **Mesures de sécurité** : socle commun (cf. en-tête) - **Contrat de données** : [`previsions-bulletins`](../../contracts/previsions-bulletins.odcs.yaml) - **Tables** : - `mariadb://V5_prevs/previsionnistes` @@ -109,6 +130,8 @@ Les champs juridiques (**base légale**, **durée de conservation**, mesures de - **Données** : Lien compte propriétaire, adresses IP des stations - **Base légale** : à confirmer - **Conservation** : à confirmer +- **Localisation** : MariaDB `ct-mariadb-1` +- **Mesures de sécurité** : Authentification HMAC des stations autonomes (serveur-station-autonome) - **Contrat de données** : [`static-stations-obs`](../../contracts/static-stations-obs.odcs.yaml) - **Tables** : - `mariadb://V5_data_params/static_ip` @@ -121,6 +144,8 @@ Les champs juridiques (**base légale**, **durée de conservation**, mesures de - **Données** : Identifiants FTP - **Base légale** : à confirmer - **Conservation** : à confirmer +- **Localisation** : MariaDB `ct-mariadb-1` (table d'auth ProFTPD) +- **Mesures de sécurité** : Transport FTP (en clair ?) — à confirmer (bureau) - **Contrat de données** : — - **Tables** : - `mariadb://proftpd/ftpuser` @@ -132,6 +157,8 @@ Les champs juridiques (**base légale**, **durée de conservation**, mesures de - **Données** : Profils et sessions des membres - **Base légale** : à confirmer - **Conservation** : gérée par IPBoard — hors périmètre data-platform +- **Localisation** : MariaDB `ct-mariadb-1`, via l'application tierce IPBoard (gestion autonome) +- **Mesures de sécurité** : socle commun (cf. en-tête) - **Contrat de données** : [`forums2-ipboard`](../../contracts/forums2-ipboard.odcs.yaml) - **Note** : Base applicative tierce (IPBoard), gestion autonome. Les tables forums/ibf_* sont mortes (ancienne version, candidates à suppression — à confirmer côté RGPD). - **Tables** : diff --git a/audits/rgpd/traitements.yaml b/audits/rgpd/traitements.yaml index cff5a2c..e1c8701 100644 --- a/audits/rgpd/traitements.yaml +++ b/audits/rgpd/traitements.yaml @@ -3,12 +3,32 @@ # Recense OÙ vivent les données personnelles dans le SI, regroupées par finalité. # C'est la contribution technique de la data-platform au registre des traitements # de l'association (art. 30 RGPD) — les champs juridiques (base légale, durée de -# conservation, mesures de sécurité) relèvent du bureau et restent à confirmer. +# conservation) relèvent du bureau et restent à confirmer. # # Chaque table `personal_data: true` de inventory/tables.yaml DOIT figurer ici # (sinon `tools/build_rgpd_register.py` échoue). Réciproquement, retirer une table # de l'inventaire impose de la retirer ici. -version: 1 +# +# Champs par traitement (modèle art. 30, calqué sur un registre de référence) : +# finalite, personnes, donnees, destinataires?, transferts?, base_legale, +# conservation, localisation, securite?, contrat?, note?, tables +# Les champs `?` sont optionnels (omis = retombe sur le socle commun de `meta`). +version: 2 + +# Identité et socle communs à tous les traitements (art. 30, en-tête du registre). +meta: + responsable: >- + Association Infoclimat (responsable de traitement). Délégué / référent à la + protection des données : à désigner — bureau. + socle_securite: >- + Hébergement auto-hébergé (Proxmox/LXC, infrastructure interne) ; accès réseau + restreint ; chiffrement TLS en bordure (Cloudflare) ; base principale répliquée. + Le détail d'exploitation (adresses, ports, sauvegardes) est tenu en interne. + note_juridique: >- + Base légale, durée de conservation, destinataires et transferts hors-UE doivent + être validés par le bureau. Les valeurs « à confirmer » sont des constats data, + pas une position juridique arrêtée. + traitements: - id: comptes-authentification finalite: Gestion des comptes utilisateurs et de l'authentification @@ -16,6 +36,8 @@ traitements: donnees: Identité (pseudo), secret (mot de passe haché), email de contact, IP et user-agent de connexion, jetons de session et de réinitialisation base_legale: à confirmer (exécution du service / consentement à l'inscription) conservation: à confirmer (jetons à expiration ; comptes ?) + localisation: MariaDB `ct-mariadb-1` (table `connectes` en ENGINE=MEMORY, fenêtre ~5 min) + securite: Mots de passe hachés ; jetons de session et de réinitialisation à expiration contrat: v5-comptes-utilisateurs tables: - mariadb://V5/comptes @@ -29,8 +51,11 @@ traitements: finalite: Notifications push et paramètres des applications mobiles personnes: Utilisateurs des applications iOS/Android donnees: Jetons d'appareil (APNS/FCM), paramètres applicatifs liés au compte + destinataires: Apple Push Notification service (APNS) et Google Firebase Cloud Messaging (FCM) pour l'acheminement des notifications + transferts: Oui — Apple / Google (États-Unis), hors UE — encadrement à confirmer (bureau) base_legale: à confirmer (consentement aux notifications) conservation: à confirmer + localisation: MariaDB `ct-mariadb-1` contrat: null tables: - mariadb://V5/apns_devices @@ -44,6 +69,8 @@ traitements: donnees: Lien compte (id_compte), géolocalisation des contributions, contenus, messages privés base_legale: à confirmer conservation: à confirmer + localisation: MariaDB `ct-mariadb-1` + securite: Messages privés (`mp_mp`) — chiffrement au repos à confirmer (bureau) contrat: photolive tables: - mariadb://V5/personnes @@ -56,8 +83,11 @@ traitements: finalite: Gestion des adhérents, cotisations et votes de l'association personnes: Adhérents de l'association donnees: Identité, coordonnées, paiements (dont HelloAsso), pouvoirs de vote + destinataires: HelloAsso (encaissement des cotisations / dons en ligne) + transferts: Non (HelloAsso — France / UE) — à confirmer (bureau) base_legale: à confirmer (obligation légale comptable / exécution de l'adhésion) conservation: à confirmer (obligations comptables et statutaires) + localisation: MariaDB `ct-mariadb-1` contrat: null tables: - mariadb://asso/asso_adherants @@ -69,8 +99,10 @@ traitements: finalite: Traitement des commandes de la boutique personnes: Clients de la boutique donnees: Identité, coordonnées de livraison, données de commande + destinataires: Prestataires de paiement et de livraison — à confirmer (bureau) base_legale: à confirmer (exécution du contrat de vente) conservation: à confirmer (obligations comptables) + localisation: MariaDB `ct-mariadb-1` contrat: null tables: - mariadb://V5/boutique_commandes @@ -81,6 +113,7 @@ traitements: donnees: Lien compte, inscriptions base_legale: à confirmer conservation: à confirmer + localisation: MariaDB `ct-mariadb-1` contrat: null tables: - mariadb://concoursprevi/participants_v5 @@ -92,6 +125,7 @@ traitements: donnees: Lien compte, pseudo, périmètre d'habilitation base_legale: à confirmer conservation: à confirmer + localisation: MariaDB `ct-mariadb-1` contrat: previsions-bulletins tables: - mariadb://V5_prevs/previsionnistes @@ -103,6 +137,8 @@ traitements: donnees: Lien compte propriétaire, adresses IP des stations base_legale: à confirmer conservation: à confirmer + localisation: MariaDB `ct-mariadb-1` + securite: Authentification HMAC des stations autonomes (serveur-station-autonome) contrat: static-stations-obs tables: - mariadb://V5_data_params/static_ip @@ -114,6 +150,8 @@ traitements: donnees: Identifiants FTP base_legale: à confirmer conservation: à confirmer + localisation: MariaDB `ct-mariadb-1` (table d'auth ProFTPD) + securite: Transport FTP (en clair ?) — à confirmer (bureau) contrat: null tables: - mariadb://proftpd/ftpuser @@ -124,10 +162,11 @@ traitements: donnees: Profils et sessions des membres base_legale: à confirmer conservation: gérée par IPBoard — hors périmètre data-platform - contrat: forums2-ipboard + localisation: MariaDB `ct-mariadb-1`, via l'application tierce IPBoard (gestion autonome) note: >- Base applicative tierce (IPBoard), gestion autonome. Les tables forums/ibf_* sont mortes (ancienne version, candidates à suppression — à confirmer côté RGPD). + contrat: forums2-ipboard tables: - mariadb://forums2/core_members - mariadb://forums2/core_sessions diff --git a/catalog/parametres.yaml b/catalog/parametres.yaml new file mode 100644 index 0000000..6dcffcf --- /dev/null +++ b/catalog/parametres.yaml @@ -0,0 +1,1680 @@ +# Vocabulaire contrôlé des paramètres d'observation — ADR-0004 (§7 amendée 2026-07-11) +# +# BROUILLON — lot A3, à revoir par une humaine avant fusion. Rigueur > vitesse : +# les zones d'incertitude sont marquées `unite_incertaine: true` plutôt que devinées. +# +# Structure du fichier (5 tranches d'extension, dans l'ordre demandé par le mandat) : +# 0. Entrées existantes du POC (poc-lakehouse-2025/catalog/parametres.yaml + +# parametres_mf_tr.yaml) — 33 entrées, fusionnées en un seul fichier. Les champs +# cf_standard_name / unite_si / domaine / description_fr / sources pré-existants +# sont repris À L'IDENTIQUE. Extension : de nouvelles clés sont ajoutées au bloc +# `sources:` de plusieurs de ces entrées quand une colonne des tranches 1-5 +# s'avère être la MÊME grandeur (ex. RR1 du Horaire MF = precipitation_amount_1h +# existant) — sinon on aurait soit une collision de clé, soit une perte de +# traçabilité pour ~20 colonnes wide MF qui n'ont pas de grandeur distincte. +# Voir le rapport de restitution pour la discussion de ce choix d'interprétation. +# 1. Colonnes wide MF consommées — table Timescale `Horaire` (historique, 99 colonnes +# utiles hors indicateurs Q*), doc source site-infoclimat/include/MeteoFrance/docs/ +# H_HTR_I_ITR.txt (section « H »), structure vérifiée contre +# data-platform/schemas/timescaledb/schema.sql.gz et le contrat +# contracts/horaire-mf-timescale.odcs.yaml. +# 2. `static.complements` — 33 sous-champs packés (@-séparés), désérialisés par +# deserialize_complements() dans site-infoclimat/data/complements.inc.php +# (constat : 33 champs réels, pas 34 — l'audit de traduisibilité comptait large). +# 3. Codes `_H` de `mf_data` (MariaDB, fallback dual-source) — PAS de nouvelles clés : +# mf_data_{AAAA}_{MM} porte les MÊMES grandeurs que la tranche 1 (mêmes noms MF +# sans le suffixe _H, cf. site-infoclimat/include/MeteoFrance/docs/mf_data.txt qui +# liste les deux nomenclatures côte à côte). Cette tranche ajoute donc des sources +# `mf_data` sur des entrées déjà créées en tranche 1, uniquement pour les champs +# explicitement cités par l'audit comme lus par mobile-api (W1_H/W2_H, B1_H, +# TNSOL_H, HNEIGEFI1_H/HNEIGEFI3_H, ETATMER_H). mf_data est en fin de vie planifiée +# (contracts/mf-data-fallback.odcs.yaml : ~0% de couverture, un seul écrivain vivant +# hors-sujet ici) — dupliquer une source par entrée n'apportait pas de valeur de +# gouvernance proportionnée à l'effort. +# 4. Bouées / mer — table MariaDB `bouees_{MM}_d{d}`, DDL avec COMMENT SQL dans +# site-infoclimat/cron/yearly/creer_tables_annee.php:41-68 (source la plus fiable : +# commentaires SQL explicites sur les unités/tables OMM). +# 5. Enneigement (nivo) — source-meteofrance-donnees-libres-nivo.odcs.yaml, alimente +# V5_data_mf.enneigement via cron/enneigement/recup_donneespub_mf.php. +# 6. `mf_quotidienne` — 26 colonnes de mesures de la table Timescale `Quotidienne` +# (climatologie quotidienne à mensuelle MF, contracts/quotidienne-mf-timescale.odcs.yaml), +# alimentée par telechargement-climatologie-meteo-data-gouv (mêmes CSV data.gouv que le +# contrat cite en sourceRepo). 17 colonnes rejoignent des clés EXISTANTES via un bloc +# `sources: mf_quotidienne:` supplémentaire à duree_s: 86400 (même grandeur, fenêtre +# journalière — RR→precipitation_amount_24h, TN/TX→air_temperature_min/max, +# TNSOL/TN50→grass_minimum_temperature_10cm/50cm, DG→duration_of_frost, +# DRR→duration_of_precipitation_1h [nom de clé hérité, non renommé — hors périmètre], +# FFM/FF2M→wind_speed/wind_speed_2m, FXY/DXY/FXI/DXI/FXI2/DXI2/FXI3S/DXI3S→les 4 couples +# wind_speed_of_gust*/wind_from_direction_of_gust*). 6 colonnes (HTN/HTX/HXY/HXI/HXI2/HXI3S) +# sont des heures d'occurrence pures → `porte_occurrence: true` sur la clé valeur +# correspondante, PAS d'entrée séparée (ADR-0004 §7) ; au passage, deux gaps +# pré-existants sont comblés (wind_speed_of_gust_2m/_3s n'avaient pas encore +# `porte_occurrence: true` alors que mf_horaire HXI2/HFXI3S existent déjà). 3 colonnes +# sont des grandeurs distinctes sans équivalent → nouvelles clés air_temperature_mean +# (TM, moyenne vraie horaire), air_temperature_midrange (TNTXM, (TN+TX)/2 — volontairement +# PAS fusionnée avec TM) et air_temperature_range (TAMPLI, écart TX-TN, offset=0 car +# delta). Le contrat ne documente explicitement que RR/TN/TX (mm, °C) ; les 17 autres +# colonnes n'ont ni commentaire d'unité dans le DDL (schemas/timescaledb/schema.sql.gz, +# toutes `double precision`/`integer`) ni description dans le contrat — l'unité retenue +# vient de la doc source amont (telechargement-climatologie-meteo-data-gouv/src/csv/ +# quotidiennes/rr-t-vent/parseCSV.ts, qui transcrit la doc MF officielle), facteur=1 +# partout (cf. NOTE-A : la mention MF « et 1/10 » y est une précision décimale, pas un +# facteur d'échelle — les exemples parseCSV.ts sont déjà des décimaux, ex. RR: 1.1). +# DG/DRR (durées en minutes) sont marquées `unite_incertaine: true` : seule la doc source +# amont confirme l'unité, le contrat est muet même indirectement sur ces deux champs. +# +# AVERTISSEMENT DE LECTURE — l'ordre physique du fichier NE suit PAS strictement ces +# 5 tranches : les entrées sont groupées par PROXIMITÉ THÉMATIQUE pour la relecture +# humaine (ex. wind_speed_2m est juste après wind_speed, pas dans le bloc « TRANCHE 1 » +# plus bas). Les commentaires `# TRANCHE N` marquent seulement où commence le GROS des +# entrées propres à chaque tranche qui n'ont pas de parent thématique en tranche 0. +# Décompte exact par tranche : voir le rapport de restitution de l'agent (pas +# reconstituable depuis les seuls marqueurs de section de ce fichier). +# +# ─── NOTE-A — TRANCHÉE le 2026-07-12 : échantillon prod Horaire (1980/1989/2024) +# = unités RÉELLES (°C, hPa), PAS de 1/10 — l'ADR-0004 est à corriger, le contrat +# horaire-mf-timescale faisait foi. Bornes réelles de la table : 1777 → now. ──────────────────────────────────────── +# H_HTR_I_ITR.txt (doc MF officielle transcrite dans site-infoclimat) documente les +# colonnes de la table Horaire en convention MF « et 1/10 » (T, RR1, FF, TSV, PMER, +# PSTAT, PMERMIN, TMER, T10-T100, TNSOL, TN50, TCHAUSSEE, HVAGUE, PVAGUE... = valeurs +# entières en dixièmes). Mais : +# - le contrat contracts/horaire-mf-timescale.odcs.yaml décrit T comme +# « REAL — Température sous abri (°C) » SANS mention de 1/10 ; +# - le schéma réel (data-platform/schemas/timescaledb/schema.sql.gz) déclare ces +# colonnes en `double precision`, compatible avec les deux hypothèses ; +# - la vue de production `v_quotidienne_realtime` (schema.sql.gz, définition autour de +# la ligne 1605) UNIONne directement `"Horaire"."T"` avec `"HoraireTempsReel".t` (qui +# est confirmé en °C réel par le contrat infrahoraire/horaire temps réel) SANS +# aucune division par 10 — ce qui n'aurait pas de sens si Horaire.T était encore en +# dixièmes. +# Faisceau d'indices en faveur d'un facteur déjà réel (1) au moment de l'ingestion dans +# Horaire, contredisant la doc source MF sur le fichier brut. Facteur retenu ICI = 1 +# (aligné sur le contrat et la vue de prod, « les contrats font foi »), mais chaque +# champ concerné est marqué `unite_incertaine: true` — À CONFIRMER par échantillonnage +# (`SELECT "T","RR1" FROM "Horaire" ORDER BY "AAAAMMJJHH" DESC LIMIT 20`) avant toute +# mise en production du vocabulaire. C'est la plus grosse zone d'incertitude de ce +# brouillon — elle touche ~25 champs numériques continus de la tranche 1. +# ─────────────────────────────────────────────────────────────────────────────────── + +version: 0.3.0 + +parametres: + + # ══════════════════════════════════════════════════════════════════════════════ + # TRANCHE 0 — entrées existantes du POC (33), fusion base + overlay TR + # ══════════════════════════════════════════════════════════════════════════════ + + air_temperature: + cf_standard_name: air_temperature + unite_si: K + domaine: {min: 180.0, max: 340.0} + description_fr: Température de l'air sous abri + sources: + synop: {colonne: temperature, unite: degC, facteur: 1, offset: 273.15, duree_s: 0} + static: {colonne: temperature, unite: degC, facteur: 1, offset: 273.15, duree_s: 0} + metar: {colonne: temperature, unite: degC, facteur: 1, offset: 273.15, duree_s: 0, + note: entier tronqué au degré à la source (tinyint)} + bouees: {colonne: temperature, unite: degC, facteur: 1, offset: 273.15, duree_s: 0} + mae: {colonne: temperature, unite: degC, facteur: 1, offset: 273.15, duree_s: 0} + mf_horaire_tr: {colonne: t, unite: degC, facteur: 1, offset: 273.15, duree_s: 0} + mf_infrahoraire_tr: {colonne: t, unite: degC, facteur: 1, offset: 273.15, duree_s: 0} + mf_horaire: {colonne: T, unite: degC, facteur: 1, offset: 273.15, duree_s: 0, + note: "CONFIRMÉ 13/07 (échantillon prod : °C réels, NOTE-A par colonne) — NOTE-A TRANCHÉE 2026-07-12 (échantillon prod : unités réelles, facteur=1 confirmé). Source : site-infoclimat/include/MeteoFrance/docs/H_HTR_I_ITR.txt (section H) ; data-platform/contracts/horaire-mf-timescale.odcs.yaml"} + mf_nivo: {colonne: temperature, unite: K, facteur: 1, offset: 0, duree_s: 0, + note: "source déjà en Kelvin, offset -273.15 appliqué par le consommateur PHP. Source : data-platform/contracts/source-meteofrance-donnees-libres-nivo.odcs.yaml"} + + air_temperature_min: + cf_standard_name: air_temperature + unite_si: K + domaine: {min: 180.0, max: 340.0} + description_fr: Température minimale sur la période de la source (agrégat min) + porte_occurrence: true # cf. ADR-0004 §7 — HTN (mf_horaire), HTN (mf_quotidienne), tn_1h_heure (complements) alimentent dh_occurrence + sources: + synop: {colonne: temperature_min, unite: degC, facteur: 1, offset: 273.15, duree_s: null, + note: période variable selon heure synoptique (12 h à 06 UTC)} + static: {colonne: temperature_min, unite: degC, facteur: 1, offset: 273.15, duree_s: null} + mf_horaire_tr: {colonne: tn, unite: degC, facteur: 1, offset: 273.15, duree_s: 3600} + mf_horaire: {colonne: TN, unite: degC, facteur: 1, offset: 273.15, duree_s: 3600, + note: "CONFIRMÉ 13/07 (échantillon 2024 : −31,0→40,9 °C) — min « dans l'heure ». NOTE-A TRANCHÉE 2026-07-12 (échantillon prod : unités réelles, facteur=1 confirmé). Source : H_HTR_I_ITR.txt section H"} + complements_1h: {colonne: tn_1h, unite: degC, facteur: 1, offset: 273.15, duree_s: 3600, + note: "site-infoclimat/data/complements.inc.php:205 (@Unit °C @Timespan 1h)"} + mf_nivo_12h: {colonne: tn_12h, unite: K, facteur: 1, offset: 0, duree_s: 43200, + note: "data-platform/contracts/source-meteofrance-donnees-libres-nivo.odcs.yaml"} + mf_nivo_24h: {colonne: tn_24h, unite: K, facteur: 1, offset: 0, duree_s: 86400, + note: "data-platform/contracts/source-meteofrance-donnees-libres-nivo.odcs.yaml"} + mf_quotidienne: {colonne: TN, unite: degC, facteur: 1, offset: 273.15, duree_s: 86400, + note: "« température minimale sous abri (en °C et 1/10) » — min journalier, heure d'occurrence HTN portée par porte_occurrence (pas d'entrée séparée). Unité confirmée explicitement par contracts/quotidienne-mf-timescale.odcs.yaml (property TN : REAL, °C, sans mention 1/10 — cohérent avec NOTE-A). Source : contracts/quotidienne-mf-timescale.odcs.yaml ; telechargement-climatologie-meteo-data-gouv/src/csv/quotidiennes/rr-t-vent/parseCSV.ts"} + + air_temperature_max: + cf_standard_name: air_temperature + unite_si: K + domaine: {min: 180.0, max: 340.0} + description_fr: Température maximale sur la période de la source (agrégat max) + porte_occurrence: true # cf. ADR-0004 §7 — HTX (mf_horaire), HTX (mf_quotidienne), tx_1h_heure (complements) alimentent dh_occurrence + sources: + synop: {colonne: temperature_max, unite: degC, facteur: 1, offset: 273.15, duree_s: null} + static: {colonne: temperature_max, unite: degC, facteur: 1, offset: 273.15, duree_s: null} + mf_horaire_tr: {colonne: tx, unite: degC, facteur: 1, offset: 273.15, duree_s: 3600} + mf_horaire: {colonne: TX, unite: degC, facteur: 1, offset: 273.15, duree_s: 3600, + note: "CONFIRMÉ 13/07 (échantillon 2024 : −29,0→41,7 °C) — max « dans l'heure ». NOTE-A TRANCHÉE 2026-07-12 (échantillon prod : unités réelles, facteur=1 confirmé). Source : H_HTR_I_ITR.txt section H"} + complements_1h: {colonne: tx_1h, unite: degC, facteur: 1, offset: 273.15, duree_s: 3600, + note: "site-infoclimat/data/complements.inc.php:212 (@Unit °C @Timespan 1h)"} + mf_nivo_12h: {colonne: tx_12h, unite: K, facteur: 1, offset: 0, duree_s: 43200, + note: "data-platform/contracts/source-meteofrance-donnees-libres-nivo.odcs.yaml"} + mf_nivo_24h: {colonne: tx_24h, unite: K, facteur: 1, offset: 0, duree_s: 86400, + note: "data-platform/contracts/source-meteofrance-donnees-libres-nivo.odcs.yaml"} + mf_quotidienne: {colonne: TX, unite: degC, facteur: 1, offset: 273.15, duree_s: 86400, + note: "« température maximale sous abri (en °C et 1/10) » — max journalier, heure d'occurrence HTX portée par porte_occurrence (pas d'entrée séparée). Unité confirmée explicitement par contracts/quotidienne-mf-timescale.odcs.yaml (property TX : REAL, °C, sans mention 1/10 — cohérent avec NOTE-A). Source : contracts/quotidienne-mf-timescale.odcs.yaml ; telechargement-climatologie-meteo-data-gouv/src/csv/quotidiennes/rr-t-vent/parseCSV.ts"} + + dew_point_temperature: + cf_standard_name: dew_point_temperature + unite_si: K + domaine: {min: 180.0, max: 320.0} + description_fr: Température du point de rosée + sources: + synop: {colonne: point_de_rosee, unite: degC, facteur: 1, offset: 273.15, duree_s: 0} + static: {colonne: point_de_rosee, unite: degC, facteur: 1, offset: 273.15, duree_s: 0} + metar: {colonne: point_de_rosee, unite: degC, facteur: 1, offset: 273.15, duree_s: 0} + bouees: {colonne: point_de_rosee, unite: degC, facteur: 1, offset: 273.15, duree_s: 0} + mf_horaire_tr: {colonne: td, unite: degC, facteur: 1, offset: 273.15, duree_s: 0} + mf_infrahoraire_tr: {colonne: td, unite: degC, facteur: 1, offset: 273.15, duree_s: 0} + mf_horaire: {colonne: TD, unite: degC, facteur: 1, offset: 273.15, duree_s: 0, + note: "NOTE-A TRANCHÉE 2026-07-12 (échantillon prod : °C/hPa réels, facteur=1 confirmé). Source : H_HTR_I_ITR.txt section H"} + mf_nivo: {colonne: point_de_rosee, unite: K, facteur: 1, offset: 0, duree_s: 0, + note: "data-platform/contracts/source-meteofrance-donnees-libres-nivo.odcs.yaml"} + + relative_humidity: + cf_standard_name: relative_humidity + unite_si: "%" + domaine: {min: 0.0, max: 100.0} + description_fr: Humidité relative + sources: + synop: {colonne: humidite, unite: "%", facteur: 1, offset: 0, duree_s: 0} + static: {colonne: humidite, unite: "%", facteur: 1, offset: 0, duree_s: 0} + bouees: {colonne: humidite, unite: "%", facteur: 1, offset: 0, duree_s: 0} + mf_horaire_tr: {colonne: u, unite: "%", facteur: 1, offset: 0, duree_s: 0} + mf_infrahoraire_tr: {colonne: u, unite: "%", facteur: 1, offset: 0, duree_s: 0} + mf_horaire: {colonne: U, unite: "%", facteur: 1, offset: 0, duree_s: 0, + note: "% déjà entier dans la doc source (pas de mention 1/10) — pas d'incertitude ici. Source : H_HTR_I_ITR.txt section H"} + mf_nivo: {colonne: humidite, unite: "%", facteur: 1, offset: 0, duree_s: 0, + note: "data-platform/contracts/source-meteofrance-donnees-libres-nivo.odcs.yaml"} + + relative_humidity_min: + cf_standard_name: relative_humidity + unite_si: "%" + domaine: {min: 0.0, max: 100.0} + description_fr: Humidité relative minimale sur la période de la source (agrégat min, réseau MF extérieur) + porte_occurrence: true # HUN + sources: + mf_horaire: {colonne: UN, unite: "%", facteur: 1, offset: 0, duree_s: 3600, + note: "min « dans l'heure ». Source : H_HTR_I_ITR.txt section H"} + + relative_humidity_max: + cf_standard_name: relative_humidity + unite_si: "%" + domaine: {min: 0.0, max: 100.0} + description_fr: Humidité relative maximale sur la période de la source (agrégat max, réseau MF extérieur) + porte_occurrence: true # HUX + sources: + mf_horaire: {colonne: UX, unite: "%", facteur: 1, offset: 0, duree_s: 3600, + note: "max « dans l'heure ». Source : H_HTR_I_ITR.txt section H"} + + air_pressure_at_sea_level: + cf_standard_name: air_pressure_at_sea_level + unite_si: Pa + domaine: {min: 87000.0, max: 108500.0} + description_fr: Pression ramenée au niveau de la mer + sources: + synop: {colonne: pression, unite: hPa, facteur: 100, offset: 0, duree_s: 0} + static: {colonne: pression, unite: hPa, facteur: 100, offset: 0, duree_s: 0} + metar: {colonne: pression, unite: hPa, facteur: 100, offset: 0, duree_s: 0} + bouees: {colonne: pression, unite: hPa, facteur: 100, offset: 0, duree_s: 0} + mf_horaire_tr: {colonne: pmer, unite: hPa, facteur: 100, offset: 0, duree_s: 0} + mf_infrahoraire_tr: {colonne: pmer, unite: hPa, facteur: 100, offset: 0, duree_s: 0} + mf_horaire: {colonne: PMER, unite: hPa, facteur: 100, offset: 0, duree_s: 0, + note: "NOTE-A (documenté 1/10 hPa). Source : H_HTR_I_ITR.txt section H"} + + air_pressure_at_sea_level_min_1h: + cf_standard_name: air_pressure_at_sea_level + unite_si: Pa + domaine: {min: 87000.0, max: 108500.0} + description_fr: Minimum horaire de la pression ramenée au niveau de la mer (PMERMIN) + sources: + mf_horaire: {colonne: PMERMIN, unite: hPa, facteur: 100, offset: 0, duree_s: 3600, + note: "NOTE-A TRANCHÉE 2026-07-12 (échantillon prod : °C/hPa réels, facteur=1 confirmé). Source : H_HTR_I_ITR.txt section H"} + + tendency_of_air_pressure: + cf_standard_name: tendency_of_air_pressure + unite_si: Pa + domaine: {min: -3000.0, max: 3000.0} + description_fr: Variation de pression sur 3 heures + sources: + synop: {colonne: pression_variation_3h, unite: hPa, facteur: 100, offset: 0, duree_s: 10800} + static: {colonne: pression_variation_3h, unite: hPa, facteur: 100, offset: 0, duree_s: 10800} + bouees: {colonne: pression_variation_3h, unite: hPa, facteur: 100, offset: 0, duree_s: 10800} + + visibility_in_air: + cf_standard_name: visibility_in_air + unite_si: m + domaine: {min: 0.0, max: 100000.0} + description_fr: Visibilité horizontale + sources: + synop: {colonne: visibilite, unite: m, facteur: 1, offset: 0, duree_s: 0} + static: {colonne: visibilite, unite: m, facteur: 1, offset: 0, duree_s: 0} + metar: {colonne: visibilite, unite: m, facteur: 1, offset: 0, duree_s: 0, + note: 9999 = « 10 km ou plus » (valeur censurée, pas une mesure)} + bouees: {colonne: visibilite, unite: m, facteur: 1, offset: 0, duree_s: 0} + mf_horaire_tr: {colonne: vv, unite: m, facteur: 1, offset: 0, duree_s: 0} + mf_infrahoraire_tr: {colonne: vv, unite: m, facteur: 1, offset: 0, duree_s: 0} + mf_horaire: {colonne: VV, unite: m, facteur: 1, offset: 0, duree_s: 0, + note: "en m, pas de mention 1/10. Source : H_HTR_I_ITR.txt section H"} + + wind_speed: + cf_standard_name: wind_speed + unite_si: m s-1 + domaine: {min: 0.0, max: 75.0} + description_fr: Vitesse du vent moyen (moyenne 10 min) + sources: + synop: {colonne: vent_moyen, unite: km h-1, facteur: 0.2777777778, offset: 0, duree_s: 600} + static: {colonne: vent_moyen, unite: km h-1, facteur: 0.2777777778, offset: 0, duree_s: 600} + metar: {colonne: vent_moyen, unite: km h-1, facteur: 0.2777777778, offset: 0, duree_s: 600, + note: converti des nœuds à l'acquisition (granularité 1,85 km/h)} + bouees: {colonne: vent_moyen, unite: km h-1, facteur: 0.2777777778, offset: 0, duree_s: 600} + mf_horaire_tr: {colonne: ff, unite: m s-1, facteur: 1, offset: 0, duree_s: 600, + note: ff MF nativement en m/s (pas de conversion)} + mf_infrahoraire_tr: {colonne: ff, unite: m s-1, facteur: 1, offset: 0, duree_s: 600} + mf_horaire: {colonne: FF, unite: m s-1, facteur: 1, offset: 0, duree_s: 600, + note: "NOTE-A (documenté 1/10 m/s). Source : H_HTR_I_ITR.txt section H"} + mf_nivo: {colonne: vent_moyen, unite: m s-1, facteur: 1, offset: 0, duree_s: 600, + note: "data-platform/contracts/source-meteofrance-donnees-libres-nivo.odcs.yaml"} + mf_quotidienne: {colonne: FFM, unite: m s-1, facteur: 1, offset: 0, duree_s: 86400, + note: "« moyenne quotidienne de la force du vent moyenné sur 10 mn, à 10 m » — moyenne journalière de la même mesure 10-min que wind_speed (duree_s du sous-jacent inchangé, 600 s ; 86400 est la fenêtre d'agrégation quotidienne, cohérent avec le modèle (paramètre, duree_s) d'ADR-0004 §2). Unité non documentée explicitement par le contrat (DDL : double precision) ; confirmée par la doc source amont. Source : telechargement-climatologie-meteo-data-gouv/src/csv/quotidiennes/rr-t-vent/parseCSV.ts"} + + wind_speed_2m: + cf_standard_name: wind_speed + unite_si: m s-1 + domaine: {min: 0.0, max: 60.0} + description_fr: Vitesse du vent moyen, variante mesurée à 2 m (FF2, au lieu de 10 m par défaut) + sources: + mf_horaire: {colonne: FF2, unite: m s-1, facteur: 1, offset: 0, duree_s: 600, + note: "NOTE-A TRANCHÉE 2026-07-12 (échantillon prod : °C/hPa réels, facteur=1 confirmé). Hauteur de mesure (2 m) bornée et fixe, encodée dans la clé (ADR-0004 §7, précédent profondeur/couche). Source : H_HTR_I_ITR.txt section H"} + mf_quotidienne: {colonne: FF2M, unite: m s-1, facteur: 1, offset: 0, duree_s: 86400, + note: "« moyenne quotidienne de la force du vent moyenné sur 10 mn, à 2 m » — même remarque que wind_speed/FFM (mf_quotidienne). Unité non documentée explicitement par le contrat ; confirmée par la doc source amont. Source : telechargement-climatologie-meteo-data-gouv/src/csv/quotidiennes/rr-t-vent/parseCSV.ts"} + + wind_from_direction_2m: + cf_standard_name: wind_from_direction + unite_si: degree + domaine: {min: 0.0, max: 360.0} + description_fr: Direction d'origine du vent, variante mesurée à 2 m (DD2) + sources: + mf_horaire: {colonne: DD2, unite: degree, facteur: 1, offset: 0, duree_s: 600, + note: "direction jamais en 1/10 dans la doc source. Source : H_HTR_I_ITR.txt section H"} + + wind_speed_of_gust: + cf_standard_name: wind_speed_of_gust + unite_si: m s-1 + domaine: {min: 0.0, max: 120.0} + description_fr: Rafale maximale instantanée sur la période de la source + porte_occurrence: true # HXI (mf_horaire) + sources: + synop: {colonne: vent_rafales, unite: km h-1, facteur: 0.2777777778, offset: 0, duree_s: null} + static: {colonne: vent_rafales, unite: km h-1, facteur: 0.2777777778, offset: 0, duree_s: null} + bouees: {colonne: vent_rafales, unite: km h-1, facteur: 0.2777777778, offset: 0, duree_s: null} + mf_horaire_tr: {colonne: fxi, unite: m s-1, facteur: 1, offset: 0, duree_s: null, + note: rafale instantanée max, période source} + mf_horaire: {colonne: FXI, unite: m s-1, facteur: 1, offset: 0, duree_s: 3600, + note: "« instantané dans l'heure ». NOTE-A TRANCHÉE 2026-07-12 (échantillon prod : °C/hPa réels, facteur=1 confirmé). Source : H_HTR_I_ITR.txt section H"} + complements_day: {colonne: rafale_max_day, unite: km h-1, facteur: 0.2777777778, offset: 0, duree_s: 86400, + note: "site-infoclimat/data/complements.inc.php:58 (@Unit km/h @Timespan day)"} + mf_quotidienne: {colonne: FXI, unite: m s-1, facteur: 1, offset: 0, duree_s: 86400, + note: "« maximum quotidien de la force maximale horaire du vent instantané, à 10 m » — max journalier du même FXI horaire (mf_horaire), heure d'occurrence HXI portée par porte_occurrence. Unité non documentée explicitement par le contrat (DDL : double precision) ; confirmée par la doc source amont. Source : telechargement-climatologie-meteo-data-gouv/src/csv/quotidiennes/rr-t-vent/parseCSV.ts"} + + wind_from_direction_of_gust: + cf_standard_name: null # pas de standard name CF distinct pour la direction de rafale + unite_si: degree + domaine: {min: 0.0, max: 360.0} + description_fr: Direction associée à la rafale instantanée maximale (DXI) + sources: + mf_horaire: {colonne: DXI, unite: degree, facteur: 1, offset: 0, duree_s: 3600, + note: "Source : H_HTR_I_ITR.txt section H"} + mf_quotidienne: {colonne: DXI, unite: degree, facteur: 1, offset: 0, duree_s: 86400, + note: "« direction de FXI (en rose de 360) » — direction associée au max journalier de FXI. Direction jamais en 1/10. Source : telechargement-climatologie-meteo-data-gouv/src/csv/quotidiennes/rr-t-vent/parseCSV.ts"} + + wind_speed_of_gust_hourly: + cf_standard_name: wind_speed_of_gust + unite_si: m s-1 + domaine: {min: 0.0, max: 120.0} + description_fr: Rafale maximale horaire (FXY MF) + porte_occurrence: true # HXY (mf_horaire, mf_quotidienne) + sources: + mf_horaire_tr: {colonne: fxy, unite: m s-1, facteur: 1, offset: 0, duree_s: 3600} + mf_horaire: {colonne: FXY, unite: m s-1, facteur: 1, offset: 0, duree_s: 3600, + note: "NOTE-A TRANCHÉE 2026-07-12 (échantillon prod : °C/hPa réels, facteur=1 confirmé). Source : H_HTR_I_ITR.txt section H"} + mf_quotidienne: {colonne: FXY, unite: m s-1, facteur: 1, offset: 0, duree_s: 86400, + note: "« maximum quotidien de la force maximale horaire du vent moyenné sur 10 mn, à 10 m » — max journalier du même FXY horaire, heure d'occurrence HXY portée par porte_occurrence. Unité non documentée explicitement par le contrat ; confirmée par la doc source amont. Source : telechargement-climatologie-meteo-data-gouv/src/csv/quotidiennes/rr-t-vent/parseCSV.ts"} + + wind_from_direction_of_gust_hourly: + cf_standard_name: null + unite_si: degree + domaine: {min: 0.0, max: 360.0} + description_fr: Direction associée à la rafale maximale horaire (DXY) + sources: + mf_horaire: {colonne: DXY, unite: degree, facteur: 1, offset: 0, duree_s: 3600, + note: "Source : H_HTR_I_ITR.txt section H"} + mf_quotidienne: {colonne: DXY, unite: degree, facteur: 1, offset: 0, duree_s: 86400, + note: "« direction de FXY (rose de 360) » — direction associée au max journalier de FXY. Source : telechargement-climatologie-meteo-data-gouv/src/csv/quotidiennes/rr-t-vent/parseCSV.ts"} + + wind_speed_of_gust_2m: + cf_standard_name: wind_speed_of_gust + unite_si: m s-1 + domaine: {min: 0.0, max: 100.0} + description_fr: Rafale instantanée maximale, variante mesurée à 2 m (FXI2) + porte_occurrence: true # HXI2 — gap comblé ici : mf_horaire H_HTR_I_ITR.txt documente déjà HXI2 (heure de FXI2) sans qu'une entrée précédente ne l'ait signalé ; mf_quotidienne HXI2 (heure du max journalier) s'y ajoute + sources: + mf_horaire: {colonne: FXI2, unite: m s-1, facteur: 1, offset: 0, duree_s: 3600, + note: "NOTE-A TRANCHÉE 2026-07-12 (échantillon prod : °C/hPa réels, facteur=1 confirmé). Source : H_HTR_I_ITR.txt section H"} + mf_quotidienne: {colonne: FXI2, unite: m s-1, facteur: 1, offset: 0, duree_s: 86400, + note: "« maximum quotidien de la force maximale horaire du vent instantané, à 2 m » — max journalier du même FXI2 horaire, heure d'occurrence HXI2 portée par porte_occurrence. Unité non documentée explicitement par le contrat ; confirmée par la doc source amont. Source : telechargement-climatologie-meteo-data-gouv/src/csv/quotidiennes/rr-t-vent/parseCSV.ts"} + + wind_from_direction_of_gust_2m: + cf_standard_name: null + unite_si: degree + domaine: {min: 0.0, max: 360.0} + description_fr: Direction associée à la rafale maximale à 2 m (DXI2) + sources: + mf_horaire: {colonne: DXI2, unite: degree, facteur: 1, offset: 0, duree_s: 3600, + note: "Source : H_HTR_I_ITR.txt section H"} + mf_quotidienne: {colonne: DXI2, unite: degree, facteur: 1, offset: 0, duree_s: 86400, + note: "« direction de FXI2 (rose de 360) » — direction associée au max journalier de FXI2. Source : telechargement-climatologie-meteo-data-gouv/src/csv/quotidiennes/rr-t-vent/parseCSV.ts"} + + wind_speed_of_gust_3s: + cf_standard_name: wind_speed_of_gust + unite_si: m s-1 + domaine: {min: 0.0, max: 120.0} + description_fr: >- + Rafale maximale sur moyenne glissante 3 secondes dans l'heure (FXI3S) — technique + de mesure distincte de FXI (« instantané », fréquence d'échantillonnage non + documentée) + porte_occurrence: true # HFXI3S (mf_horaire, gap comblé ici — même remarque que wind_speed_of_gust_2m/HXI2), HXI3S (mf_quotidienne). Colonnes de noms différents (HFXI3S vs HXI3S) selon la table, même sémantique (heure d'occurrence) + sources: + mf_horaire: {colonne: FXI3S, unite: m s-1, facteur: 1, offset: 0, duree_s: 3600, + note: "NOTE-A TRANCHÉE 2026-07-12 (échantillon prod : °C/hPa réels, facteur=1 confirmé). Source : H_HTR_I_ITR.txt section H"} + mf_quotidienne: {colonne: FXI3S, unite: m s-1, facteur: 1, offset: 0, duree_s: 86400, + note: "« maximum quotidien de la force maximale horaire du vent moyenné sur 3 s, à 10 m » — max journalier du même FXI3S horaire, heure d'occurrence HXI3S portée par porte_occurrence. Unité non documentée explicitement par le contrat ; confirmée par la doc source amont. Source : telechargement-climatologie-meteo-data-gouv/src/csv/quotidiennes/rr-t-vent/parseCSV.ts"} + + wind_from_direction_of_gust_3s: + cf_standard_name: null + unite_si: degree + domaine: {min: 0.0, max: 360.0} + description_fr: Direction associée à la rafale 3 s maximale (DXI3S) + sources: + mf_horaire: {colonne: DXI3S, unite: degree, facteur: 1, offset: 0, duree_s: 3600, + note: "Source : H_HTR_I_ITR.txt section H"} + mf_quotidienne: {colonne: DXI3S, unite: degree, facteur: 1, offset: 0, duree_s: 86400, + note: "« direction de FXI3S (rose de 360) » — direction associée au max journalier de FXI3S. Source : telechargement-climatologie-meteo-data-gouv/src/csv/quotidiennes/rr-t-vent/parseCSV.ts"} + + wind_speed_of_gust_10min: + cf_standard_name: wind_speed_of_gust + unite_si: m s-1 + domaine: {min: 0.0, max: 120.0} + description_fr: Rafale maximale sur les 10 dernières minutes + sources: + synop: {colonne: vent_rafales_10min, unite: km h-1, facteur: 0.2777777778, offset: 0, duree_s: 600} + static: {colonne: vent_rafales_10min, unite: km h-1, facteur: 0.2777777778, offset: 0, duree_s: 600} + metar: {colonne: vent_rafales_10min, unite: km h-1, facteur: 0.2777777778, offset: 0, duree_s: 600} + mf_infrahoraire_tr: {colonne: fxi10, unite: m s-1, facteur: 1, offset: 0, duree_s: 600} + + wind_from_direction: + cf_standard_name: wind_from_direction + unite_si: degree + domaine: {min: 0.0, max: 360.0} + description_fr: Direction d'origine du vent + sources: + synop: {colonne: vent_direction, unite: degree, facteur: 1, offset: 0, duree_s: 600} + static: {colonne: vent_direction, unite: degree, facteur: 1, offset: 0, duree_s: 600} + metar: {colonne: vent_direction, unite: degree, facteur: 1, offset: 0, duree_s: 600} + bouees: {colonne: vent_direction, unite: degree, facteur: 1, offset: 0, duree_s: 600} + mf_horaire_tr: {colonne: dd, unite: degree, facteur: 1, offset: 0, duree_s: 600} + mf_infrahoraire_tr: {colonne: dd, unite: degree, facteur: 1, offset: 0, duree_s: 600} + mf_horaire: {colonne: DD, unite: degree, facteur: 1, offset: 0, duree_s: 600, + note: "direction jamais en 1/10. Source : H_HTR_I_ITR.txt section H"} + mf_nivo: {colonne: vent_direction, unite: degree, facteur: 1, offset: 0, duree_s: 600, + note: "data-platform/contracts/source-meteofrance-donnees-libres-nivo.odcs.yaml"} + + precipitation_amount_1h: + cf_standard_name: precipitation_amount + unite_si: kg m-2 + domaine: {min: 0.0, max: 150.0} + description_fr: Cumul de précipitations sur 1 heure + sources: + synop: {colonne: pluie_1h, unite: mm, facteur: 1, offset: 0, duree_s: 3600} + static: {colonne: pluie_1h, unite: mm, facteur: 1, offset: 0, duree_s: 3600} + mae: {colonne: pluie_1h, unite: mm, facteur: 1, offset: 0, duree_s: 3600} + mf_horaire_tr: {colonne: rr1, unite: mm, facteur: 1, offset: 0, duree_s: 3600} + mf_horaire: {colonne: RR1, unite: mm, facteur: 1, offset: 0, duree_s: 3600, + note: "NOTE-A (documenté 1/10 mm). Source : H_HTR_I_ITR.txt section H"} + + precipitation_amount_6min: + cf_standard_name: precipitation_amount + unite_si: kg m-2 + domaine: {min: 0.0, max: 60.0} + description_fr: Cumul de précipitations sur le pas infrahoraire (6 min) + sources: + mf_infrahoraire_tr: {colonne: rr_per, unite: mm, facteur: 1, offset: 0, duree_s: 360} + mf_infrahoraire: {colonne: RR, unite: mm, facteur: 1, offset: 0, duree_s: 360, + note: "archive Timescale Infrahoraire (2,84 Md lignes) — contrat infrahoraire-mf:101-107 (REAL, mm)"} + + duration_of_precipitation_1h: + cf_standard_name: null # durée, pas une grandeur météo CF standard + unite_si: s + domaine: {min: 0.0, max: 86400.0} # borne élargie à 86400 (mf_quotidienne, fenêtre journalière) — était 3600 (mf_horaire seul) + description_fr: >- + Durée effective des précipitations sur la période de la source — horaire (DRR1 + mf_horaire) ou quotidienne (DRR mf_quotidienne). Le suffixe `_1h` de la clé est un + héritage pré-ADR-0004 §7 (créé avant la convention « durée = dimension duree_s, pas + de clé suffixée ») ; non renommé ici (renommage = breaking, patron `replace` + d'ADR-0002, hors périmètre de cette extension) — la source mf_quotidienne ci-dessous + encode correctement sa fenêtre via duree_s: 86400 malgré le nom de clé. + sources: + mf_horaire: {colonne: DRR1, unite: min, facteur: 60, offset: 0, duree_s: 3600, + note: "Source : H_HTR_I_ITR.txt section H"} + mf_quotidienne: {colonne: DRR, unite: min, facteur: 60, offset: 0, duree_s: 86400, + note: "CONFIRMÉ 13/07 : minutes (max échantillon = 1440 exactement) — « durée des précipitations (en mn) » — cumul journalier, même grandeur que DRR1 mf_horaire (facteur 60 identique). unite_incertaine car le contrat ne documente pas cette colonne (DDL : integer, sans commentaire d'unité) ; minutes confirmées uniquement par la doc source amont. Source : telechargement-climatologie-meteo-data-gouv/src/csv/quotidiennes/rr-t-vent/parseCSV.ts"} + + precipitation_amount_3h: + cf_standard_name: precipitation_amount + unite_si: kg m-2 + domaine: {min: 0.0, max: 300.0} + description_fr: Cumul de précipitations sur 3 heures + sources: + synop: {colonne: pluie_3h, unite: mm, facteur: 1, offset: 0, duree_s: 10800} + static: {colonne: pluie_3h, unite: mm, facteur: 1, offset: 0, duree_s: 10800} + + precipitation_amount_6h: + cf_standard_name: precipitation_amount + unite_si: kg m-2 + domaine: {min: 0.0, max: 400.0} + description_fr: Cumul de précipitations sur 6 heures + sources: + synop: {colonne: pluie_6h, unite: mm, facteur: 1, offset: 0, duree_s: 21600} + static: {colonne: pluie_6h, unite: mm, facteur: 1, offset: 0, duree_s: 21600} + + precipitation_amount_12h: + cf_standard_name: precipitation_amount + unite_si: kg m-2 + domaine: {min: 0.0, max: 600.0} + description_fr: Cumul de précipitations sur 12 heures + sources: + synop: {colonne: pluie_12h, unite: mm, facteur: 1, offset: 0, duree_s: 43200} + static: {colonne: pluie_12h, unite: mm, facteur: 1, offset: 0, duree_s: 43200} + + precipitation_amount_24h: + cf_standard_name: precipitation_amount + unite_si: kg m-2 + domaine: {min: 0.0, max: 1000.0} + description_fr: Cumul de précipitations sur 24 heures + sources: + synop: {colonne: pluie_24h, unite: mm, facteur: 1, offset: 0, duree_s: 86400} + static: {colonne: pluie_24h, unite: mm, facteur: 1, offset: 0, duree_s: 86400} + mf_nivo: {colonne: pluie_24h, unite: mm, facteur: 1, offset: 0, duree_s: 86400, + note: "data-platform/contracts/source-meteofrance-donnees-libres-nivo.odcs.yaml"} + mf_quotidienne: {colonne: RR, unite: mm, facteur: 1, offset: 0, duree_s: 86400, + note: "« quantité de précipitation tombée en 24 heures (de 06h FU le jour J à 06h FU le jour J+1), affectée au jour J ». Unité confirmée explicitement par contracts/quotidienne-mf-timescale.odcs.yaml (property RR : REAL, mm, sans mention 1/10 — cohérent avec NOTE-A). Support = 06 UTC→06 UTC, pas minuit→minuit (différent de pluie_24h synop/static, dont le support est aussi variable — non fusionné plus finement faute d'un sous-typage par borne horaire dans ce vocabulaire). Source : contracts/quotidienne-mf-timescale.odcs.yaml ; telechargement-climatologie-meteo-data-gouv/src/csv/quotidiennes/rr-t-vent/parseCSV.ts"} + + precipitation_amount_10min: + cf_standard_name: precipitation_amount + unite_si: kg m-2 + domaine: {min: 0.0, max: 50.0} + description_fr: Cumul de précipitations sur 10 minutes (station StatIC weatherlink) + sources: + complements: {colonne: rr_10mn, unite: mm, facteur: 1, offset: 0, duree_s: 600, + note: "site-infoclimat/data/complements.inc.php:241 (@Unit mm @Timespan 10 minutes)"} + + precipitation_amount_since_0h: + cf_standard_name: precipitation_amount + unite_si: kg m-2 + domaine: {min: 0.0, max: 1000.0} + description_fr: Cumul de précipitations depuis 00 UTC (support variable dans la journée) + sources: + static: {colonne: pluie_cumul_0h, unite: mm, facteur: 1, offset: 0, duree_s: null, + note: support = minuit→dh_utc, normalisable en aval seulement} + + precipitation_amount_year: + cf_standard_name: precipitation_amount + unite_si: kg m-2 + domaine: {min: 0.0, max: 15000.0} + description_fr: Cumul de précipitations glissant sur l'année (compteur StatIC weatherlink) + sources: + complements: {colonne: rr_year, unite: mm, facteur: 1, offset: 0, duree_s: 31536000, + note: "site-infoclimat/data/complements.inc.php:37 (@Unit mm @Timespan year)"} + + rainfall_rate: + cf_standard_name: rainfall_rate + unite_si: kg m-2 h-1 + domaine: {min: 0.0, max: 500.0} + description_fr: Intensité de précipitation instantanée + sources: + static: {colonne: pluie_intensite, unite: mm h-1, facteur: 1, offset: 0, duree_s: 0} + + rainfall_rate_max_1h: + cf_standard_name: rainfall_rate + unite_si: kg m-2 h-1 + domaine: {min: 0.0, max: 500.0} + description_fr: Intensité maximale de précipitation sur 1 heure + sources: + static: {colonne: pluie_intensite_max_1h, unite: mm h-1, facteur: 1, offset: 0, duree_s: 3600} + + uv_index: + cf_standard_name: null # pas de standard name CF pour l'index UV + unite_si: "1" + domaine: {min: 0.0, max: 20.0} + description_fr: Index UV + sources: + static: {colonne: uv, unite: centi-index, facteur: 0.01, offset: 0, duree_s: 0, + note: "CONFIRMÉ 13/07 : centi-index (échantillon max 1782 ↔ uv_index complements max 17 — les deux sources concordent après /100)"} + complements: {colonne: uv_index, unite: "1", facteur: 1, offset: 0, duree_s: 0, + note: "CONFIRMÉ 13/07 : index UV direct (échantillon 0→17, n=1,85 M) — @Unit littéralement 'None' dans le code (site-infoclimat/data/complements.inc.php:9). CAS AMBIGU : deuxième source d'« UV index » distincte de static.uv, relation entre les deux non établie (même grandeur ? capteurs différents selon logiciel d'acquisition weatherlink/vws ?) — à échantillonner avant de fusionner ou de choisir une source prioritaire."} + mf_horaire: {colonne: UV_INDICE, unite: "1", facteur: 1, offset: 0, duree_s: 3600, + note: "indice UV horaire MF, sans unité — trou détecté par check_couverture 12/07"} + + uv_index_max: + cf_standard_name: null + unite_si: "1" + domaine: {min: 0.0, max: 20.0} + description_fr: Index UV maximal (agrégat max, timespan non documenté à la source) + porte_occurrence: false + sources: + complements: {colonne: uv_index_max, unite: "1", facteur: 1, offset: 0, duree_s: null, + note: "CONFIRMÉ 13/07 : index UV direct (échantillon 0→17) — @Unit 'None', @Timespan 'TODO' dans le code source — aucune des deux n'est documentée. site-infoclimat/data/complements.inc.php:16"} + + duration_of_sunshine: + cf_standard_name: duration_of_sunshine + unite_si: s + domaine: {min: 0.0, max: 86400.0} + description_fr: Durée d'ensoleillement sur la période de la source + sources: + synop: {colonne: ensoleillement, unite: h, facteur: 3600, offset: 0, duree_s: null, + note: échantillon max 22,8 → heures ; support quotidien probable, à confirmer} + static: {colonne: ensoleillement, unite: h, facteur: 3600, offset: 0, duree_s: null, + unite_incertaine: true, + note: "trou détecté par check_couverture 12/07 (colonne Bronze non mappée) ; unité SUPPOSÉE = synop, à échantillonner"} + mf_horaire_tr: {colonne: insolh, unite: min, facteur: 60, offset: 0, duree_s: 3600, + note: HYPOTHÈSE minutes sur l'heure — à valider} + mf_infrahoraire_tr: {colonne: insolh, unite: min, facteur: 60, offset: 0, duree_s: 360} + mf_horaire: {colonne: INS, unite: min, facteur: 60, offset: 0, duree_s: 3600, + note: "« en mn », pas de mention 1/10 pour les durées. Source : H_HTR_I_ITR.txt section H"} + + surface_downwelling_shortwave_flux_in_air: + cf_standard_name: surface_downwelling_shortwave_flux_in_air + unite_si: W m-2 + domaine: {min: 0.0, max: 1500.0} + description_fr: Rayonnement global instantané + sources: + synop: {colonne: radiations, unite: W m-2, facteur: 1, offset: 0, duree_s: 0} + + soil_temperature: + cf_standard_name: soil_temperature + unite_si: K + domaine: {min: 220.0, max: 340.0} + description_fr: >- + Température du sol (profondeur non précisée à la source synop/static — CAS + AMBIGU : possible doublon partiel avec soil_temperature_10cm si la convention + WMO à 10 cm est celle réellement utilisée, non confirmé) + sources: + synop: {colonne: temperature_sol, unite: degC, facteur: 1, offset: 273.15, duree_s: 0} + static: {colonne: temperature_sol, unite: degC, facteur: 1, offset: 273.15, duree_s: 0, + note: "PIÈGE, colonne quasi non alimentée (NULL en base le 2026-06-15) — cf. contracts/static-stations-obs.odcs.yaml"} + + surface_snow_thickness: + cf_standard_name: surface_snow_thickness + unite_si: m + domaine: {min: 0.0, max: 10.0} + description_fr: Épaisseur de neige au sol + sources: + synop: {colonne: neige_au_sol, unite: cm, facteur: 0.01, offset: 0, duree_s: 0} + mf_horaire: {colonne: NEIGETOT, unite: cm, facteur: 0.01, offset: 0, duree_s: 0, + note: "« en cm », pas de mention 1/10. Source : H_HTR_I_ITR.txt section H"} + mf_nivo: {colonne: ht_neige, unite: cm, facteur: 0.01, offset: 0, duree_s: 0, + note: "data-platform/contracts/source-meteofrance-donnees-libres-nivo.odcs.yaml"} + complements: {colonne: snow_height, unite: cm, facteur: 0.01, offset: 0, duree_s: 0, + note: "site-infoclimat/data/complements.inc.php:184 (@Unit cm @Timespan instant)"} + + cloud_area_fraction: + cf_standard_name: cloud_area_fraction + unite_si: "1" + domaine: {min: 0.0, max: 1.0} + description_fr: Nébulosité totale (octas convertis en fraction) + sources: + synop: {colonne: nebulosite, unite: okta, facteur: 0.125, offset: 0, duree_s: 0, + note: enum '0'..'8' à la source, casté numérique} + metar: {colonne: nebulosite, unite: okta, facteur: 0.125, offset: 0, duree_s: 0} + bouees: {colonne: nebulosite, unite: okta, facteur: 0.125, offset: 0, duree_s: 0, + note: "site-infoclimat/cron/yearly/creer_tables_annee.php:66 (int(2), pas de COMMENT unité — hypothèse octa par cohérence avec synop/metar)"} + mf_horaire_tr: {colonne: n, unite: okta, facteur: 0.125, offset: 0, duree_s: 0} + mf_infrahoraire_tr: {colonne: n, unite: okta, facteur: 0.125, offset: 0, duree_s: 0} + mf_horaire: {colonne: N, unite: okta, facteur: 0.125, offset: 0, duree_s: 0, + note: "9 = ciel invisible (brouillard/etc.), à traiter en QC hors domaine [0,8]. Source : H_HTR_I_ITR.txt section H"} + mf_nivo: {colonne: nebulosite, unite: okta, facteur: 0.125, offset: 0, duree_s: 0, + note: "data-platform/contracts/source-meteofrance-donnees-libres-nivo.odcs.yaml"} + + cloud_area_fraction_lowest_layer: + cf_standard_name: cloud_area_fraction + unite_si: "1" + domaine: {min: 0.0, max: 1.0} + description_fr: >- + Nébulosité de la couche nuageuse principale la plus basse (NBAS) — CAS AMBIGU : + relation avec cloud_layer_1_area_fraction (N1, « 1ère couche ») non établie ; les + deux pourraient désigner la même couche sous deux conventions MF différentes + (couche « principale la plus basse » vs couche numérotée 1) ou être réellement + distinctes. À échantillonner en base avant de trancher un éventuel alias. + sources: + mf_horaire: {colonne: NBAS, unite: okta, facteur: 0.125, offset: 0, duree_s: 0, + note: "Source : H_HTR_I_ITR.txt section H"} + mf_nivo: {colonne: nbas, unite: okta, facteur: 0.125, offset: 0, duree_s: 0, + unite_incertaine: true, + note: "colonne 'nbas' du fichier nivo, unité non explicitée dans le contrat (description : « nébulosité basse »). Un second champ 'nnuage1' existe dans le même enregistrement nivo sans que sa relation à nbas soit documentée — cas ambigu supplémentaire, non modélisé séparément. data-platform/contracts/source-meteofrance-donnees-libres-nivo.odcs.yaml"} + + present_weather: + cf_standard_name: null # code OMM 4677/4680, pas une grandeur physique + unite_si: "1" + domaine: {min: 0.0, max: 510.0} + description_fr: Temps présent (code OMM) + sources: + synop: {colonne: temps_omm, unite: code, facteur: 1, offset: 0, duree_s: 0} + static: {colonne: temps_omm, unite: code, facteur: 1, offset: 0, duree_s: 0} + metar: {colonne: temps_omm, unite: code, facteur: 1, offset: 0, duree_s: 0} + bouees: {colonne: temps_omm, unite: code, facteur: 1, offset: 0, duree_s: 0} + mf_horaire: {colonne: WW, unite: code, facteur: 1, offset: 0, duree_s: 0, + note: "table OMM 4677/4680. Source : H_HTR_I_ITR.txt section H"} + mf_nivo: {colonne: temps_omm, unite: code, facteur: 1, offset: 0, duree_s: 0, + note: "data-platform/contracts/source-meteofrance-donnees-libres-nivo.odcs.yaml"} + + sea_surface_temperature: + cf_standard_name: sea_surface_temperature + unite_si: K + domaine: {min: 250.0, max: 310.0} + description_fr: Température de surface de la mer + sources: + bouees: {colonne: temperature_eau, unite: degC, facteur: 1, offset: 273.15, duree_s: 0} + mf_horaire: {colonne: TMER, unite: degC, facteur: 1, offset: 273.15, duree_s: 0, + note: "NOTE-A TRANCHÉE 2026-07-12 (échantillon prod : °C/hPa réels, facteur=1 confirmé). Source : H_HTR_I_ITR.txt section H"} + + sea_surface_wave_significant_height: + cf_standard_name: sea_surface_wave_significant_height + unite_si: m + domaine: {min: 0.0, max: 25.0} + description_fr: Hauteur significative des vagues + sources: + bouees: {colonne: hauteur_vagues_1, unite: m, facteur: 1, offset: 0, duree_s: null, + note: colonne hauteur_vagues_1 — sémantique exacte (H1/3 vs Hmax) à confirmer} + mf_horaire: {colonne: HVAGUE, unite: m, facteur: 0.1, offset: 0, duree_s: null, + unite_incertaine: true, + note: "H_HTR_I_ITR.txt documente explicitement « en m et 1/10 » pour ce champ précis (contrairement à T, où l'évidence est contradictoire — cf. NOTE-A) : facteur 0.1 retenu avec une confiance modérément plus élevée, mais toujours à confirmer par échantillonnage. Source : H_HTR_I_ITR.txt section H"} + + sea_surface_wave_maximum_height: + cf_standard_name: null # non confirmé dans la table CF officielle (recherche 2026-07-12) — laissé null par prudence + unite_si: m + domaine: {min: 0.0, max: 30.0} + description_fr: >- + Deuxième mesure de hauteur de vagues (hauteur_vagues_5, bouées) — CAS AMBIGU : + la sémantique exacte de « _5 » (Hmax ? période de calcul différente ?) n'est + documentée nulle part dans le code consulté ; relation avec + sea_surface_wave_significant_height (hauteur_vagues_1) non établie. + sources: + bouees: {colonne: hauteur_vagues_5, unite: m, facteur: 1, offset: 0, duree_s: null, + unite_incertaine: true, + note: "site-infoclimat/cron/yearly/creer_tables_annee.php:57 (double, pas de COMMENT SQL sur l'unité — hypothèse m par cohérence avec hauteur_vagues_1)"} + + sea_surface_wave_mean_period: + cf_standard_name: sea_surface_wave_mean_period + unite_si: s + domaine: {min: 0.0, max: 30.0} + description_fr: Période moyenne des vagues + sources: + bouees: {colonne: periode_vagues, unite: s, facteur: 1, offset: 0, duree_s: null} + mf_horaire: {colonne: PVAGUE, unite: s, facteur: 0.1, offset: 0, duree_s: null, + unite_incertaine: true, + note: "« en s et 1/10 » documenté explicitement. Facteur 0.1 retenu, confiance modérée (cf. note sur HVAGUE). Source : H_HTR_I_ITR.txt section H"} + + sea_surface_wave_from_direction: + cf_standard_name: sea_surface_wave_from_direction + unite_si: degree + domaine: {min: 0.0, max: 360.0} + description_fr: Direction de la houle (sémaphores) — 999 = direction variable (sentinelle, pas une mesure) + sources: + mf_horaire: {colonne: DIRHOULE, unite: degree, facteur: 1, offset: 0, duree_s: null, + note: "999 = variable, à traiter comme sentinelle QC. Source : H_HTR_I_ITR.txt section H"} + + surface_air_pressure: + cf_standard_name: surface_air_pressure + unite_si: Pa + domaine: {min: 45000.0, max: 108500.0} + description_fr: Pression au niveau de la station (non ramenée mer) + sources: + mf_horaire_tr: {colonne: pres, unite: hPa, facteur: 100, offset: 0, duree_s: 0} + mf_infrahoraire_tr: {colonne: pres, unite: hPa, facteur: 100, offset: 0, duree_s: 0} + mf_horaire: {colonne: PSTAT, unite: hPa, facteur: 100, offset: 0, duree_s: 0, + note: "NOTE-A TRANCHÉE 2026-07-12 (échantillon prod : °C/hPa réels, facteur=1 confirmé). Source : H_HTR_I_ITR.txt section H"} + + # ══════════════════════════════════════════════════════════════════════════════ + # TRANCHE 1 — colonnes wide MF `Horaire` (Timescale, historique) consommées, + # nouvelles grandeurs (pas de correspondance dans les 33 entrées ci-dessus) + # ══════════════════════════════════════════════════════════════════════════════ + + duration_of_frost: + cf_standard_name: null + unite_si: s + domaine: {min: 0.0, max: 86400.0} # borne élargie à 86400 (mf_quotidienne, fenêtre journalière) — était 3600 (mf_horaire seul) + description_fr: Durée de gel sous abri (T ≤ 0 °C) sur la période de la source — horaire (DG mf_horaire) ou quotidienne (DG mf_quotidienne) + sources: + mf_horaire: {colonne: DG, unite: min, facteur: 60, offset: 0, duree_s: 3600, + note: "Source : H_HTR_I_ITR.txt section H"} + mf_quotidienne: {colonne: DG, unite: min, facteur: 60, offset: 0, duree_s: 86400, + note: "CONFIRMÉ 13/07 : minutes (max échantillon = 1440 exactement) — « durée de gel sous abri (T ≤ 0°C) (en mn) » — cumul journalier, même grandeur que DG mf_horaire (facteur 60 identique). unite_incertaine car contracts/quotidienne-mf-timescale.odcs.yaml ne documente PAS cette colonne (seuls RR/TN/TX ont une property explicite) ; DDL (schemas/timescaledb/schema.sql.gz) déclare seulement `integer`, sans commentaire d'unité. Minutes confirmées uniquement par la doc source amont. Source : telechargement-climatologie-meteo-data-gouv/src/csv/quotidiennes/rr-t-vent/parseCSV.ts"} + + soil_temperature_10cm: + cf_standard_name: soil_temperature + unite_si: K + domaine: {min: 220.0, max: 320.0} + description_fr: Température du sol à 10 cm de profondeur (T10 — n'existe pas pour les sémaphores) + sources: + mf_horaire: {colonne: T10, unite: degC, facteur: 1, offset: 273.15, duree_s: 0, + note: "NOTE-A TRANCHÉE 2026-07-12 (échantillon prod : °C/hPa réels, facteur=1 confirmé). Source : H_HTR_I_ITR.txt section H"} + mf_horaire_tr: {colonne: t_10, unite: degC, facteur: 1, offset: 273.15, duree_s: 0, + note: "confirmé °C réel (pas 1/10) par contracts/infrahoraire-mf.odcs.yaml"} + mf_infrahoraire_tr: {colonne: t_10, unite: degC, facteur: 1, offset: 273.15, duree_s: 0} + + soil_temperature_20cm: + cf_standard_name: soil_temperature + unite_si: K + domaine: {min: 220.0, max: 320.0} + description_fr: Température du sol à 20 cm de profondeur (T20) + sources: + mf_horaire: {colonne: T20, unite: degC, facteur: 1, offset: 273.15, duree_s: 0, + note: "NOTE-A TRANCHÉE 2026-07-12 (échantillon prod : °C/hPa réels, facteur=1 confirmé). Source : H_HTR_I_ITR.txt section H"} + mf_horaire_tr: {colonne: t_20, unite: degC, facteur: 1, offset: 273.15, duree_s: 0} + mf_infrahoraire_tr: {colonne: t_20, unite: degC, facteur: 1, offset: 273.15, duree_s: 0} + + soil_temperature_50cm: + cf_standard_name: soil_temperature + unite_si: K + domaine: {min: 230.0, max: 315.0} + description_fr: Température du sol à 50 cm de profondeur (T50) + sources: + mf_horaire: {colonne: T50, unite: degC, facteur: 1, offset: 273.15, duree_s: 0, + note: "NOTE-A TRANCHÉE 2026-07-12 (échantillon prod : °C/hPa réels, facteur=1 confirmé). Source : H_HTR_I_ITR.txt section H"} + mf_horaire_tr: {colonne: t_50, unite: degC, facteur: 1, offset: 273.15, duree_s: 0} + mf_infrahoraire_tr: {colonne: t_50, unite: degC, facteur: 1, offset: 273.15, duree_s: 0} + + soil_temperature_100cm: + cf_standard_name: soil_temperature + unite_si: K + domaine: {min: 240.0, max: 310.0} + description_fr: Température du sol à 1 m de profondeur (T100) + sources: + mf_horaire: {colonne: T100, unite: degC, facteur: 1, offset: 273.15, duree_s: 0, + note: "NOTE-A TRANCHÉE 2026-07-12 (échantillon prod : °C/hPa réels, facteur=1 confirmé). Source : H_HTR_I_ITR.txt section H"} + mf_horaire_tr: {colonne: t_100, unite: degC, facteur: 1, offset: 273.15, duree_s: 0} + mf_infrahoraire_tr: {colonne: t_100, unite: degC, facteur: 1, offset: 273.15, duree_s: 0} + + grass_minimum_temperature_10cm: + cf_standard_name: null # pas de standard name CF pour la « température minimale au-dessus du sol » (grass minimum) + unite_si: K + domaine: {min: 200.0, max: 330.0} + description_fr: >- + Température minimale à 10 cm AU-DESSUS du sol (TNSOL) — CAS AMBIGU DE NOMMAGE : + malgré le même nombre « 10 », cette grandeur n'a rien à voir avec + soil_temperature_10cm (qui est à 10 cm EN DESSOUS du sol) ; ce sont deux capteurs + différents mesurant deux positions opposées. Clé volontairement distincte + (grass_minimum_temperature_*) pour éviter toute confusion — à signaler + explicitement en revue. + porte_occurrence: false + sources: + mf_horaire: {colonne: TNSOL, unite: degC, facteur: 1, offset: 273.15, duree_s: 3600, + note: "NOTE-A TRANCHÉE 2026-07-12 (échantillon prod : °C/hPa réels, facteur=1 confirmé). Source : H_HTR_I_ITR.txt section H"} + mf_data: {colonne: TNSOL_H, unite: degC, facteur: 1, offset: 273.15, duree_s: 3600, + note: "citée par l'audit comme lue par mobile-api. Source : site-infoclimat/include/MeteoFrance/docs/mf_data.txt ; data-platform/contracts/mf-data-fallback.odcs.yaml"} + mf_quotidienne: {colonne: TNSOL, unite: degC, facteur: 1, offset: 273.15, duree_s: 86400, + note: "« température quotidienne minimale à 10 cm au-dessus du sol ». Même colonne MF (TNSOL) que la source mf_horaire ci-dessus, fenêtre journalière au lieu d'horaire — pas de collision (famille, colonne) distincte (mf_quotidienne vs mf_horaire). Unité non documentée explicitement par contracts/quotidienne-mf-timescale.odcs.yaml (DDL : double precision, sans commentaire) ; confirmée par la doc source amont. Source : telechargement-climatologie-meteo-data-gouv/src/csv/quotidiennes/rr-t-vent/parseCSV.ts"} + + grass_minimum_temperature_50cm: + cf_standard_name: null + unite_si: K + domaine: {min: 210.0, max: 325.0} + description_fr: >- + Température minimale à 50 cm AU-DESSUS du sol (TN50) — même remarque que + grass_minimum_temperature_10cm vis-à-vis de soil_temperature_50cm (positions + opposées, ne pas fusionner). + sources: + mf_horaire: {colonne: TN50, unite: degC, facteur: 1, offset: 273.15, duree_s: 3600, + note: "NOTE-A TRANCHÉE 2026-07-12 (échantillon prod : °C/hPa réels, facteur=1 confirmé). Source : H_HTR_I_ITR.txt section H"} + mf_quotidienne: {colonne: TN50, unite: degC, facteur: 1, offset: 273.15, duree_s: 86400, + note: "« température quotidienne minimale à 50 cm au-dessus du sol ». Même remarque que grass_minimum_temperature_10cm/TNSOL (mf_quotidienne). Unité non documentée explicitement par le contrat (DDL : double precision) ; confirmée par la doc source amont. Source : telechargement-climatologie-meteo-data-gouv/src/csv/quotidiennes/rr-t-vent/parseCSV.ts"} + + road_surface_temperature: + cf_standard_name: null + unite_si: K + domaine: {min: 230.0, max: 345.0} + description_fr: >- + Température de surface mesurée sur herbe OU sur bitume selon le poste (TCHAUSSEE) + — CAS AMBIGU : la doc source ne permet pas de distinguer, pour une station + donnée, laquelle des deux surfaces est réellement mesurée ; la clé « route » + est un choix de nommage par défaut (majorité des postes équipés = stations + routières), possiblement trompeur pour les postes « herbe ». + sources: + mf_horaire: {colonne: TCHAUSSEE, unite: degC, facteur: 1, offset: 273.15, duree_s: 0, + note: "NOTE-A TRANCHÉE 2026-07-12 (échantillon prod : °C/hPa réels, facteur=1 confirmé). Source : H_HTR_I_ITR.txt section H"} + + surface_wetness_duration: + cf_standard_name: null + unite_si: s + domaine: {min: 0.0, max: 3600.0} + description_fr: Durée d'humectation de la surface dans l'heure (DHUMEC) + sources: + mf_horaire: {colonne: DHUMEC, unite: min, facteur: 60, offset: 0, duree_s: 3600, + note: "Source : H_HTR_I_ITR.txt section H"} + + duration_relative_humidity_below_40pct: + cf_standard_name: null + unite_si: s + domaine: {min: 0.0, max: 3600.0} + description_fr: Durée avec humidité relative ≤ 40 % dans l'heure (DHUMI40) + sources: + mf_horaire: {colonne: DHUMI40, unite: min, facteur: 60, offset: 0, duree_s: 3600, + note: "Source : H_HTR_I_ITR.txt section H"} + + duration_relative_humidity_above_80pct: + cf_standard_name: null + unite_si: s + domaine: {min: 0.0, max: 3600.0} + description_fr: Durée avec humidité relative ≥ 80 % dans l'heure (DHUMI80) + sources: + mf_horaire: {colonne: DHUMI80, unite: min, facteur: 60, offset: 0, duree_s: 3600, + note: "Source : H_HTR_I_ITR.txt section H"} + + water_vapor_partial_pressure_in_air: + cf_standard_name: water_vapor_partial_pressure_in_air # confirmé NERC Vocabulary Server (miroir CF), non revérifié contre la table officielle cfconventions.org + unite_si: Pa + domaine: {min: 0.0, max: 7000.0} + description_fr: Tension de vapeur (TSV) + sources: + mf_horaire: {colonne: TSV, unite: hPa, facteur: 100, offset: 0, duree_s: 0, + note: "NOTE-A (documenté 1/10 hPa). Source : H_HTR_I_ITR.txt section H"} + mf_data: {colonne: TSV_H, unite: hPa, facteur: 100, offset: 0, duree_s: 0, + note: "Source : site-infoclimat/include/MeteoFrance/docs/mf_data.txt"} + + geopotential_height: + cf_standard_name: geopotential_height + unite_si: m + domaine: {min: 700.0, max: 3000.0} + description_fr: >- + Géopotentiel du poste (GEOP), renseigné uniquement pour les stations d'altitude + supérieure à 750 m + sources: + mf_horaire: {colonne: GEOP, unite: mgp, facteur: 1, offset: 0, duree_s: 0, + note: "CONFIRMÉ 13/07 : mètres géopotentiels (échantillon 1200→1661) — mètre géopotentiel (mgp) assimilé au mètre standard par approximation usuelle — écart réel négligeable aux altitudes concernées mais non vérifié formellement ici. Source : H_HTR_I_ITR.txt section H"} + + cloud_layer_1_area_fraction: + cf_standard_name: cloud_area_fraction + unite_si: "1" + domaine: {min: 0.0, max: 1.0} + description_fr: Nébulosité de la 1ère couche nuageuse (N1) + sources: + mf_horaire: {colonne: N1, unite: okta, facteur: 0.125, offset: 0, duree_s: 0, + note: "Source : H_HTR_I_ITR.txt section H"} + + cloud_layer_1_type: + cf_standard_name: null # code SYNOP, pas une grandeur physique + unite_si: "1" + domaine: {min: 0.0, max: 9.0} + description_fr: Genre (code SYNOP OMM-N°407) de la 1ère couche nuageuse (C1) + sources: + mf_horaire: {colonne: C1, unite: code, facteur: 1, offset: 0, duree_s: 0, + note: "Source : H_HTR_I_ITR.txt section H"} + + cloud_layer_1_base_height: + cf_standard_name: null # CF a cloud_base_altitude (référentiel MSL) ; B1 est une hauteur AGL, pas confirmé équivalent — laissé null par prudence + unite_si: m + domaine: {min: 0.0, max: 15000.0} + description_fr: Base de la 1ère couche nuageuse (B1) + sources: + mf_horaire: {colonne: B1, unite: m, facteur: 1, offset: 0, duree_s: 0, + note: "Source : H_HTR_I_ITR.txt section H"} + mf_data: {colonne: B1_H, unite: m, facteur: 1, offset: 0, duree_s: 0, + note: "citée par l'audit comme « plafond » lu par mobile-api. Source : site-infoclimat/include/MeteoFrance/docs/mf_data.txt"} + + cloud_layer_2_area_fraction: + cf_standard_name: cloud_area_fraction + unite_si: "1" + domaine: {min: 0.0, max: 1.0} + description_fr: Nébulosité de la 2ème couche nuageuse (N2) + sources: + mf_horaire: {colonne: N2, unite: okta, facteur: 0.125, offset: 0, duree_s: 0, + note: "Source : H_HTR_I_ITR.txt section H"} + + cloud_layer_2_type: + cf_standard_name: null + unite_si: "1" + domaine: {min: 0.0, max: 9.0} + description_fr: Genre de la 2ème couche nuageuse (C2) + sources: + mf_horaire: {colonne: C2, unite: code, facteur: 1, offset: 0, duree_s: 0, + note: "Source : H_HTR_I_ITR.txt section H"} + + cloud_layer_2_base_height: + cf_standard_name: null + unite_si: m + domaine: {min: 0.0, max: 15000.0} + description_fr: Base de la 2ème couche nuageuse (B2) + sources: + mf_horaire: {colonne: B2, unite: m, facteur: 1, offset: 0, duree_s: 0, + note: "Source : H_HTR_I_ITR.txt section H"} + + cloud_layer_3_area_fraction: + cf_standard_name: cloud_area_fraction + unite_si: "1" + domaine: {min: 0.0, max: 1.0} + description_fr: Nébulosité de la 3ème couche nuageuse (N3) + sources: + mf_horaire: {colonne: N3, unite: okta, facteur: 0.125, offset: 0, duree_s: 0, + note: "Source : H_HTR_I_ITR.txt section H"} + + cloud_layer_3_type: + cf_standard_name: null + unite_si: "1" + domaine: {min: 0.0, max: 9.0} + description_fr: Genre de la 3ème couche nuageuse (C3) + sources: + mf_horaire: {colonne: C3, unite: code, facteur: 1, offset: 0, duree_s: 0, + note: "Source : H_HTR_I_ITR.txt section H"} + + cloud_layer_3_base_height: + cf_standard_name: null + unite_si: m + domaine: {min: 0.0, max: 15000.0} + description_fr: Base de la 3ème couche nuageuse (B3) + sources: + mf_horaire: {colonne: B3, unite: m, facteur: 1, offset: 0, duree_s: 0, + note: "Source : H_HTR_I_ITR.txt section H"} + + cloud_layer_4_area_fraction: + cf_standard_name: cloud_area_fraction + unite_si: "1" + domaine: {min: 0.0, max: 1.0} + description_fr: Nébulosité de la 4ème couche nuageuse (N4) + sources: + mf_horaire: {colonne: N4, unite: okta, facteur: 0.125, offset: 0, duree_s: 0, + note: "Source : H_HTR_I_ITR.txt section H"} + + cloud_layer_4_type: + cf_standard_name: null + unite_si: "1" + domaine: {min: 0.0, max: 9.0} + description_fr: Genre de la 4ème couche nuageuse (C4) + sources: + mf_horaire: {colonne: C4, unite: code, facteur: 1, offset: 0, duree_s: 0, + note: "Source : H_HTR_I_ITR.txt section H"} + + cloud_layer_4_base_height: + cf_standard_name: null + unite_si: m + domaine: {min: 0.0, max: 15000.0} + description_fr: Base de la 4ème couche nuageuse (B4) + sources: + mf_horaire: {colonne: B4, unite: m, facteur: 1, offset: 0, duree_s: 0, + note: "Source : H_HTR_I_ITR.txt section H"} + + duration_low_visibility_200m: + cf_standard_name: null + unite_si: s + domaine: {min: 0.0, max: 3600.0} + description_fr: Durée avec visibilité < 200 m dans l'heure (DVV200) + sources: + mf_horaire: {colonne: DVV200, unite: min, facteur: 60, offset: 0, duree_s: 3600, + note: "Source : H_HTR_I_ITR.txt section H"} + + past_weather_1: + cf_standard_name: null # code OMM 4687, pas une grandeur physique + unite_si: "1" + domaine: {min: 0.0, max: 9.0} + description_fr: Temps passé 1 (code OMM W1) + sources: + mf_horaire: {colonne: W1, unite: code, facteur: 1, offset: 0, duree_s: 0, + note: "Source : H_HTR_I_ITR.txt section H"} + mf_data: {colonne: W1_H, unite: code, facteur: 1, offset: 0, duree_s: 0, + note: "citée explicitement par l'audit comme lue par mobile-api. Source : site-infoclimat/include/MeteoFrance/docs/mf_data.txt ; data-platform/contracts/mf-data-fallback.odcs.yaml"} + + past_weather_2: + cf_standard_name: null + unite_si: "1" + domaine: {min: 0.0, max: 9.0} + description_fr: Temps passé 2 (code OMM W2) + sources: + mf_horaire: {colonne: W2, unite: code, facteur: 1, offset: 0, duree_s: 0, + note: "Source : H_HTR_I_ITR.txt section H"} + mf_data: {colonne: W2_H, unite: code, facteur: 1, offset: 0, duree_s: 0, + note: "citée explicitement par l'audit. Source : site-infoclimat/include/MeteoFrance/docs/mf_data.txt"} + + ground_state: + cf_standard_name: null # code OMM (table SOL), pas une grandeur physique + unite_si: "1" + domaine: {min: 0.0, max: 9.0} + description_fr: État du sol sans neige (code SOL, table OMM — 0=sec ... 9=très sec avec fissures) + sources: + mf_horaire: {colonne: SOL, unite: code, facteur: 1, offset: 0, duree_s: 0, + note: "Source : H_HTR_I_ITR.txt section H"} + mf_data: {colonne: SOL_H, unite: code, facteur: 1, offset: 0, duree_s: 0, + note: "Source : site-infoclimat/include/MeteoFrance/docs/mf_data.txt"} + + ground_state_snow: + cf_standard_name: null + unite_si: "1" + domaine: {min: 0.0, max: 9.0} + description_fr: État du sol avec neige (code SOLNG, table OMM) + sources: + mf_horaire: {colonne: SOLNG, unite: code, facteur: 1, offset: 0, duree_s: 0, + note: "Source : H_HTR_I_ITR.txt section H"} + mf_data: {colonne: SOLNG_H, unite: code, facteur: 1, offset: 0, duree_s: 0, + note: "Source : site-infoclimat/include/MeteoFrance/docs/mf_data.txt"} + + sea_visibility_code: + cf_standard_name: null # code OMM (0-9), pas une grandeur physique continue — distinct de visibility_in_air (mètres) + unite_si: "1" + domaine: {min: 0.0, max: 9.0} + description_fr: Visibilité vers la mer pour les sémaphores, codée 0 (< 50 m) à 9 (≥ 50 km) — VVMER + sources: + mf_horaire: {colonne: VVMER, unite: code, facteur: 1, offset: 0, duree_s: 0, + note: "Source : H_HTR_I_ITR.txt section H"} + + sea_state_code: + cf_standard_name: null # échelle Douglas codée, pas une hauteur de vague continue + unite_si: "1" + domaine: {min: 0.0, max: 9.0} + description_fr: >- + État de la mer pour les sémaphores, code 0 (calme) à 9 (énorme, > 14 m) — ETATMER. + CAS AMBIGU : recouvre partiellement sea_surface_wave_significant_height (échelle + Douglas codée vs mesure continue en mètres) ; les deux entrées sont conservées + distinctes car les échelles ne sont pas interconvertibles terme à terme. + sources: + mf_horaire: {colonne: ETATMER, unite: code, facteur: 1, offset: 0, duree_s: 0, + note: "Source : H_HTR_I_ITR.txt section H"} + mf_data: {colonne: ETATMER_H, unite: code, facteur: 1, offset: 0, duree_s: 0, + note: "citée explicitement par l'audit. Source : site-infoclimat/include/MeteoFrance/docs/mf_data.txt"} + + snowfall_thickness_1h: + cf_standard_name: thickness_of_snowfall_amount # confirmé NERC Vocabulary Server (miroir CF) + unite_si: m + domaine: {min: 0.0, max: 1.0} + description_fr: Hauteur de neige fraîche tombée en 1 h (HNEIGEFI1, facultatif hors heures synoptiques) + sources: + mf_horaire: {colonne: HNEIGEFI1, unite: cm, facteur: 0.01, offset: 0, duree_s: 3600, + note: "Source : H_HTR_I_ITR.txt section H"} + mf_data: {colonne: HNEIGEFI1_H, unite: cm, facteur: 0.01, offset: 0, duree_s: 3600, + note: "citée explicitement par l'audit. Source : site-infoclimat/include/MeteoFrance/docs/mf_data.txt"} + + snowfall_thickness_3h: + cf_standard_name: thickness_of_snowfall_amount + unite_si: m + domaine: {min: 0.0, max: 1.5} + description_fr: Hauteur de neige fraîche tombée en 3 h (HNEIGEFI3, facultatif aux heures intermédiaires) + sources: + mf_horaire: {colonne: HNEIGEFI3, unite: cm, facteur: 0.01, offset: 0, duree_s: 10800, + note: "Source : H_HTR_I_ITR.txt section H"} + mf_data: {colonne: HNEIGEFI3_H, unite: cm, facteur: 0.01, offset: 0, duree_s: 10800, + note: "citée explicitement par l'audit. Source : site-infoclimat/include/MeteoFrance/docs/mf_data.txt"} + + snowfall_thickness_6h: + cf_standard_name: thickness_of_snowfall_amount + unite_si: m + domaine: {min: 0.0, max: 2.0} + description_fr: Hauteur de neige fraîche tombée en 6 h, toujours renseignée aux heures synoptiques principales (HNEIGEF) + sources: + mf_horaire: {colonne: HNEIGEF, unite: cm, facteur: 0.01, offset: 0, duree_s: 21600, + note: "Source : H_HTR_I_ITR.txt section H"} + + snow_surface_temperature: + cf_standard_name: null # pas de standard name CF distinct pour la température de surface de la neige + unite_si: K + domaine: {min: 200.0, max: 275.0} + description_fr: Température de surface de la neige (TSNEIGE) + sources: + mf_horaire: {colonne: TSNEIGE, unite: degC, facteur: 1, offset: 273.15, duree_s: 0, + note: "NOTE-A TRANCHÉE 2026-07-12 (échantillon prod : °C/hPa réels, facteur=1 confirmé). Source : H_HTR_I_ITR.txt section H"} + mf_nivo: {colonne: t_neige, unite: K, facteur: 1, offset: 0, duree_s: 0, + note: "data-platform/contracts/source-meteofrance-donnees-libres-nivo.odcs.yaml"} + + snow_tube_penetration_depth: + cf_standard_name: null + unite_si: m + domaine: {min: 0.0, max: 5.0} + description_fr: Enfoncement du tube de neige (TUBENEIGE) + sources: + mf_horaire: {colonne: TUBENEIGE, unite: cm, facteur: 0.01, offset: 0, duree_s: 0, + note: "« en cm », pas de mention 1/10. Source : H_HTR_I_ITR.txt section H"} + + surface_downwelling_shortwave_energy_1h: + cf_standard_name: null # accumulation horaire (J/m2), distincte de surface_downwelling_shortwave_flux_in_air (flux instantané W/m2) — pas de standard name CF « intégré dans le temps » confirmé pour cette forme précise + unite_si: J m-2 + domaine: {min: 0.0, max: 5400000.0} + description_fr: Rayonnement global cumulé sur l'heure, référentiel UTC (GLO) + sources: + mf_horaire: {colonne: GLO, unite: J cm-2, facteur: 10000, offset: 0, duree_s: 3600, + note: "Source : H_HTR_I_ITR.txt section H"} + + surface_downwelling_shortwave_energy_1h_tsv: + cf_standard_name: null + unite_si: J m-2 + domaine: {min: 0.0, max: 5400000.0} + description_fr: >- + Rayonnement global cumulé sur l'heure, référentiel temps solaire vrai (GLO2) — + même grandeur que surface_downwelling_shortwave_energy_1h, référentiel temporel + différent (heure TSV et non UTC) ; conservée comme entrée distincte car les deux + colonnes coexistent dans le même enregistrement Horaire sans relation triviale + (bornes d'heure décalées, pas une simple conversion de fuseau constant) + sources: + mf_horaire: {colonne: GLO2, unite: J cm-2, facteur: 10000, offset: 0, duree_s: 3600, + note: "seul le _H (GLO2_H) apparaît consommé par mobile-api d'après mf_data.txt — DIR2/DIF2/UV2/INFRAR2/INS2 (mêmes variantes TSV pour d'autres rayonnements) ne le sont pas, cf. non_retenus. Source : H_HTR_I_ITR.txt section H"} + mf_data: {colonne: GLO2_H, unite: J cm-2, facteur: 10000, offset: 0, duree_s: 3600, + note: "Source : site-infoclimat/include/MeteoFrance/docs/mf_data.txt"} + + surface_direct_downwelling_shortwave_energy_1h: + cf_standard_name: null + unite_si: J m-2 + domaine: {min: 0.0, max: 5400000.0} + description_fr: Rayonnement direct cumulé sur l'heure, référentiel UTC (DIR) + sources: + mf_horaire: {colonne: DIR, unite: J cm-2, facteur: 10000, offset: 0, duree_s: 3600, + note: "Source : H_HTR_I_ITR.txt section H"} + + surface_diffuse_downwelling_shortwave_energy_1h: + cf_standard_name: null + unite_si: J m-2 + domaine: {min: 0.0, max: 2000000.0} + description_fr: Rayonnement diffus cumulé sur l'heure, référentiel UTC (DIF) + sources: + mf_horaire: {colonne: DIF, unite: J cm-2, facteur: 10000, offset: 0, duree_s: 3600, + note: "Source : H_HTR_I_ITR.txt section H"} + + surface_downwelling_infrared_energy_1h: + cf_standard_name: null # MF documente « infra-rouge », non confirmé équivalent au longwave CF (bande spectrale non précisée dans la doc source) + unite_si: J m-2 + domaine: {min: 0.0, max: 1800000.0} + description_fr: Rayonnement infrarouge cumulé sur l'heure, référentiel UTC (INFRAR) + sources: + mf_horaire: {colonne: INFRAR, unite: J cm-2, facteur: 10000, offset: 0, duree_s: 3600, + note: "Source : H_HTR_I_ITR.txt section H"} + + # ══════════════════════════════════════════════════════════════════════════════ + # TRANCHE 2 — static.complements (33 sous-champs packés, site-infoclimat/data/ + # complements.inc.php) : nouvelles grandeurs. Les fusions (uv_index, snow_height, + # tn_1h/tx_1h, rafale_max_day) sont déjà faites dans les entrées de la tranche 0. + # fuseau (offset de fuseau horaire de la station) est un métadonnée, pas une + # observation → non_retenus. heure_tn_interieur/heure_tx_interieur/ + # heure_hr_interieur_min/heure_hr_interieur_max/tx_heure/tn_heure sont des heures + # d'occurrence pures → portées par porte_occurrence, pas d'entrée séparée. + # ══════════════════════════════════════════════════════════════════════════════ + + surface_downwelling_shortwave_flux_in_air_max_day: + cf_standard_name: null # variante « max journalier » de surface_downwelling_shortwave_flux_in_air ; pas de standard name CF pour l'agrégat max + unite_si: W m-2 + domaine: {min: 0.0, max: 1500.0} + description_fr: Rayonnement global maximal instantané sur la journée (solar_rad_max) + sources: + complements: {colonne: solar_rad_max, unite: "W m-2", facteur: 1, offset: 0, duree_s: 86400, + note: "CONFIRMÉ 13/07 : W/m² (99,9985 % ≤ 1500 ; ~30 aberrantes → QC) — @Unit 'None' dans le code — unité W/m2 supposée par cohérence avec radiations/GLO, NON confirmée. site-infoclimat/data/complements.inc.php:23"} + + air_temperature_max_month: + cf_standard_name: air_temperature + unite_si: K + domaine: {min: 180.0, max: 340.0} + description_fr: Température maximale du mois glissant (compteur StatIC weatherlink, tx_month) + sources: + complements: {colonne: tx_month, unite: degC, facteur: 1, offset: 273.15, duree_s: 2678400, + note: "site-infoclimat/data/complements.inc.php:30 (@Unit °C @Timespan month)"} + + air_temperature_min_month: + cf_standard_name: air_temperature + unite_si: K + domaine: {min: 180.0, max: 340.0} + description_fr: Température minimale du mois glissant (compteur StatIC weatherlink, tn_month) + sources: + complements: {colonne: tn_month, unite: degC, facteur: 1, offset: 273.15, duree_s: 2678400, + note: "site-infoclimat/data/complements.inc.php:51 (@Unit °C @Timespan month)"} + + evapotranspiration_month: + cf_standard_name: null # pas d'équivalent CF direct pour l'évapotranspiration potentielle (ET_month, non distingué actual/potential dans la source) + unite_si: kg m-2 + domaine: {min: 0.0, max: 300.0} + description_fr: Évapotranspiration cumulée du mois glissant (ET_month) + sources: + complements: {colonne: ET_month, unite: "unknown", facteur: 1, offset: 0, duree_s: 2678400, + unite_incertaine: true, + note: "@Unit littéralement 'TODO' dans le code — mm (kg/m2) supposé par convention météo usuelle, NON confirmé. site-infoclimat/data/complements.inc.php:44"} + + evapotranspiration_year: + cf_standard_name: null + unite_si: kg m-2 + domaine: {min: 0.0, max: 2500.0} + description_fr: Évapotranspiration cumulée glissante sur l'année (ET_year) + sources: + complements: {colonne: ET_year, unite: "unknown", facteur: 1, offset: 0, duree_s: 31536000, + unite_incertaine: true, + note: "@Unit 'TODO' dans le code. site-infoclimat/data/complements.inc.php:114"} + + ic_indoor_air_temperature: + cf_standard_name: null # air_temperature CF suppose implicitement une mesure extérieure sous abri météo standard ; distinction volontaire pour une mesure intérieure + unite_si: K + domaine: {min: 250.0, max: 330.0} + description_fr: Température intérieure (capteur console StatIC weatherlink, t_interieur) + sources: + complements: {colonne: t_interieur, unite: degC, facteur: 1, offset: 273.15, duree_s: 0, + note: "site-infoclimat/data/complements.inc.php:65 (@Unit °C @Timespan instant)"} + + ic_indoor_air_temperature_min_day: + cf_standard_name: null + unite_si: K + domaine: {min: 250.0, max: 330.0} + description_fr: Température intérieure minimale du jour (tn_interieur_day) + porte_occurrence: true # heure_tn_interieur + sources: + complements: {colonne: tn_interieur_day, unite: degC, facteur: 1, offset: 273.15, duree_s: 86400, + note: "site-infoclimat/data/complements.inc.php:72 (@Timespan TODO — jour supposé par le nom du champ, non confirmé)"} + + ic_indoor_air_temperature_max_day: + cf_standard_name: null + unite_si: K + domaine: {min: 250.0, max: 330.0} + description_fr: Température intérieure maximale du jour (tx_interieur_day) + porte_occurrence: true # heure_tx_interieur + sources: + complements: {colonne: tx_interieur_day, unite: degC, facteur: 1, offset: 273.15, duree_s: 86400, + note: "site-infoclimat/data/complements.inc.php:79 (@Timespan TODO)"} + + wind_chill_of_temperature: + cf_standard_name: wind_chill_of_temperature # nom plausible d'après connaissance générale des conventions CF, NON revérifié contre la table officielle + unite_si: K + domaine: {min: 200.0, max: 320.0} + description_fr: Refroidissement éolien ressenti (windchill) + sources: + complements: {colonne: windchill, unite: "unknown", facteur: 1, offset: 0, duree_s: 0, + unite_incertaine: true, + note: "@Unit littéralement 'None' — impossible de déterminer si la valeur stockée est déjà en °C, en K, ou dans une autre échelle (le calcul windchill des consoles Davis peut être en °F selon la locale). site-infoclimat/data/complements.inc.php:100"} + + ic_heat_index: + cf_standard_name: null # heat index = indice empirique NWS US, pas de standard name CF + unite_si: K + domaine: {min: 270.0, max: 330.0} + description_fr: Indice de chaleur ressentie (heat_index) + sources: + complements: {colonne: heat_index, unite: "unknown", facteur: 1, offset: 0, duree_s: 0, + unite_incertaine: true, + note: "@Unit 'None' — même réserve que windchill. site-infoclimat/data/complements.inc.php:107"} + + ic_indoor_relative_humidity: + cf_standard_name: null + unite_si: "%" + domaine: {min: 0.0, max: 100.0} + description_fr: Humidité relative intérieure (hr_interieur) + sources: + complements: {colonne: hr_interieur, unite: "%", facteur: 1, offset: 0, duree_s: 0, + note: "site-infoclimat/data/complements.inc.php:122 (@Unit % @Timespan instant)"} + + ic_indoor_relative_humidity_min: + cf_standard_name: null + unite_si: "%" + domaine: {min: 0.0, max: 100.0} + description_fr: Humidité relative intérieure minimale (hr_interieur_min) + porte_occurrence: true # heure_hr_interieur_min + sources: + complements: {colonne: hr_interieur_min, unite: "%", facteur: 1, offset: 0, duree_s: null, + note: "@Timespan TODO. site-infoclimat/data/complements.inc.php:130"} + + ic_indoor_relative_humidity_max: + cf_standard_name: null + unite_si: "%" + domaine: {min: 0.0, max: 100.0} + description_fr: Humidité relative intérieure maximale (hr_interieur_max) + porte_occurrence: true # heure_hr_interieur_max + sources: + complements: {colonne: hr_interieur_max, unite: "%", facteur: 1, offset: 0, duree_s: null, + note: "@Timespan TODO. site-infoclimat/data/complements.inc.php:138"} + + ic_battery_voltage: + cf_standard_name: null + unite_si: V + domaine: {min: 0.0, max: 15.0} + description_fr: Tension de la batterie de la station (battery_tension) + technique: true # ADR-0004 §7 — mesure technique, exclue par défaut des produits météo + sources: + complements: {colonne: battery_tension, unite: V, facteur: 1, offset: 0, duree_s: 0, + note: "site-infoclimat/data/complements.inc.php:191 (@Unit V @Timespan instant)"} + + surface_downwelling_shortwave_energy_10min: + cf_standard_name: null + unite_si: J m-2 + domaine: {min: 0.0, max: 900000.0} + description_fr: Énergie solaire cumulée sur 10 minutes (solar_energy_10mn, StatIC) + sources: + complements: {colonne: solar_energy_10mn, unite: MJ m-2, facteur: 1000000, offset: 0, duree_s: 600, + note: "site-infoclimat/data/complements.inc.php:198 (@Unit MJ/m² @Timespan 10 minutes)"} + + ic_snow_depth_sensor_quality_factor: + cf_standard_name: null + unite_si: "1" + domaine: {min: 0.0, max: 600.0} # plage constructeur SR50, échantillon 13/07 max 422 + description_fr: Facteur qualité du capteur de hauteur de neige SR50A, lié à surface_snow_thickness (sr50_qfactor) + technique: true # ADR-0004 §7 — facteur qualité instrument, exemple cité explicitement par l'ADR + sources: + complements: {colonne: sr50_qfactor, unite: "1", facteur: 1, offset: 0, duree_s: 0, + note: "CONFIRMÉ 13/07 : facteur qualité SR50 sans unité (échantillon 0→422, plage constructeur ~0-600) — @Unit littéralement 'arbitrary' dans le code — pas d'unité SI réelle, domaine de valeur du capteur SR50A à vérifier auprès du fabricant. site-infoclimat/data/complements.inc.php:233"} + + # ══════════════════════════════════════════════════════════════════════════════ + # TRANCHE 3 — codes `_H` de mf_data (MariaDB fallback) : voir note en tête de + # fichier. Les grandeurs sont IDENTIQUES à la tranche 1 ; seules les sources + # explicitement citées par l'audit comme lues par mobile-api ont reçu un bloc + # `mf_data` dédié (déjà ajouté ci-dessus : past_weather_1/2, cloud_layer_1_base_height, + # grass_minimum_temperature_10cm, snowfall_thickness_1h/3h, sea_state_code, + # ground_state, ground_state_snow, water_vapor_partial_pressure_in_air). + # Aucune nouvelle entrée dans cette tranche. + # ══════════════════════════════════════════════════════════════════════════════ + + # ══════════════════════════════════════════════════════════════════════════════ + # TRANCHE 4 — bouées / mer (site-infoclimat/cron/yearly/creer_tables_annee.php:41-68) + # ══════════════════════════════════════════════════════════════════════════════ + + sea_ice_accretion_code: + cf_standard_name: null # code OMM 1751, pas une grandeur physique continue + unite_si: "1" + domaine: {min: 0.0, max: 9.0} + description_fr: Accrétion de glace sur la structure (code table OMM 1751, acc_glace) + sources: + bouees: {colonne: acc_glace, unite: code, facteur: 1, offset: 0, duree_s: 0, + note: "site-infoclimat/cron/yearly/creer_tables_annee.php:63 (COMMENT SQL : 'table omm 1751')"} + + sea_ice_thickness: + cf_standard_name: sea_ice_thickness + unite_si: m + domaine: {min: 0.0, max: 5.0} + description_fr: Épaisseur de la glace de mer accrétée (epaisseur_glace) + sources: + bouees: {colonne: epaisseur_glace, unite: cm, facteur: 0.01, offset: 0, duree_s: 0, + note: "site-infoclimat/cron/yearly/creer_tables_annee.php:64 (COMMENT SQL : 'centimetres')"} + + sea_ice_accretion_rate_code: + cf_standard_name: null # code OMM 3551, pas une grandeur physique continue + unite_si: "1" + domaine: {min: 0.0, max: 9.0} + description_fr: Taux d'accrétion de glace (code table OMM 3551, vitesse_glace) + sources: + bouees: {colonne: vitesse_glace, unite: code, facteur: 1, offset: 0, duree_s: 0, + note: "site-infoclimat/cron/yearly/creer_tables_annee.php:65 (COMMENT SQL : 'table omm 3551')"} + + cloud_type_low: + cf_standard_name: null # code SYNOP (Atlas international des nuages OMM-N°407), pas une grandeur physique + unite_si: "1" + domaine: {min: 0.0, max: 9.0} + description_fr: Genre des nuages bas (code SYNOP, CL) + sources: + bouees: {colonne: CL, unite: code, facteur: 1, offset: 0, duree_s: 0, + note: "site-infoclimat/cron/yearly/creer_tables_annee.php:60"} + mf_horaire: {colonne: CL, unite: code, facteur: 1, offset: 0, duree_s: 0, + note: "Source : H_HTR_I_ITR.txt section H"} + mf_nivo: {colonne: cl, unite: code, facteur: 1, offset: 0, duree_s: 0, + note: "data-platform/contracts/source-meteofrance-donnees-libres-nivo.odcs.yaml"} + + cloud_type_medium: + cf_standard_name: null + unite_si: "1" + domaine: {min: 0.0, max: 9.0} + description_fr: Genre des nuages moyens (code SYNOP, CM) + sources: + bouees: {colonne: CM, unite: code, facteur: 1, offset: 0, duree_s: 0, + note: "site-infoclimat/cron/yearly/creer_tables_annee.php:61"} + mf_horaire: {colonne: CM, unite: code, facteur: 1, offset: 0, duree_s: 0, + note: "Source : H_HTR_I_ITR.txt section H"} + mf_nivo: {colonne: cm, unite: code, facteur: 1, offset: 0, duree_s: 0, + note: "data-platform/contracts/source-meteofrance-donnees-libres-nivo.odcs.yaml"} + + cloud_type_high: + cf_standard_name: null + unite_si: "1" + domaine: {min: 0.0, max: 9.0} + description_fr: Genre des nuages élevés (code SYNOP, CH) + sources: + bouees: {colonne: CH, unite: code, facteur: 1, offset: 0, duree_s: 0, + note: "site-infoclimat/cron/yearly/creer_tables_annee.php:62"} + mf_horaire: {colonne: CH, unite: code, facteur: 1, offset: 0, duree_s: 0, + note: "Source : H_HTR_I_ITR.txt section H"} + mf_nivo: {colonne: ch, unite: code, facteur: 1, offset: 0, duree_s: 0, + note: "data-platform/contracts/source-meteofrance-donnees-libres-nivo.odcs.yaml"} + + # ══════════════════════════════════════════════════════════════════════════════ + # TRANCHE 5 — enneigement (nivo), data-platform/contracts/ + # source-meteofrance-donnees-libres-nivo.odcs.yaml. Champs avalanche/nivologie + # ultra-spécialisés (codes bulletin) volontairement laissés en non_retenus — voir + # bloc non_retenus.mf_nivo en fin de fichier pour la justification du périmètre. + # ══════════════════════════════════════════════════════════════════════════════ + + cloud_base_height_lowest_layer: + cf_standard_name: null + unite_si: m + domaine: {min: 0.0, max: 15000.0} + description_fr: >- + Hauteur de la base de la couche nuageuse basse (hbas, nivo) — CAS AMBIGU : relation + avec cloud_layer_1_base_height (B1) non établie, même remarque que + cloud_area_fraction_lowest_layer vis-à-vis de N1/NBAS. + sources: + mf_nivo: {colonne: hbas, unite: m, facteur: 1, offset: 0, duree_s: 0, + unite_incertaine: true, + note: "unité non explicitée dans le contrat, m supposé par cohérence avec B1-B4. data-platform/contracts/source-meteofrance-donnees-libres-nivo.odcs.yaml"} + + snow_state_code: + cf_standard_name: null # code descriptif OMM (ESNEIGE), pas une grandeur physique + unite_si: "1" + domaine: {min: 0.0, max: 9.0} + description_fr: >- + État descriptif de la neige pour les postes nivométéorologiques (etat_neige) — + même échelle que le code ESNEIGE documenté dans H_HTR_I_ITR.txt (0=neige fraîche + sèche ... 9=surface lisse et glacée), colonne ESNEIGE elle-même non consommée côté + wide MF (cf. non_retenus.mf_horaire) + sources: + mf_nivo: {colonne: etat_neige, unite: code, facteur: 1, offset: 0, duree_s: 0, + note: "data-platform/contracts/source-meteofrance-donnees-libres-nivo.odcs.yaml"} + + fresh_snow_thickness: + cf_standard_name: thickness_of_snowfall_amount + unite_si: m + domaine: {min: 0.0, max: 2.0} + description_fr: >- + Épaisseur de neige fraîche (ssfrai, nivo), fenêtre temporelle variable donnée par + le champ compagnon perssfrai (non modélisé séparément — durée de mesure, pas une + grandeur météo) + sources: + mf_nivo: {colonne: ssfrai, unite: cm, facteur: 0.01, offset: 0, duree_s: null, + note: "durée réelle dans perssfrai (h), variable. data-platform/contracts/source-meteofrance-donnees-libres-nivo.odcs.yaml"} + + ic_fresh_snow_thickness_secondary: + cf_standard_name: thickness_of_snowfall_amount + unite_si: m + domaine: {min: 0.0, max: 2.0} + description_fr: >- + Second champ « neige fraîche » du même enregistrement nivo (neige_fraiche) — CAS + AMBIGU : sémantique exacte non distinguée de fresh_snow_thickness (ssfrai) dans la + documentation source ; conservé comme entrée séparée plutôt que fusionné, faute de + certitude sur l'équivalence + sources: + mf_nivo: {colonne: neige_fraiche, unite: cm, facteur: 0.01, offset: 0, duree_s: null, + unite_incertaine: true, + note: "data-platform/contracts/source-meteofrance-donnees-libres-nivo.odcs.yaml"} + + snow_probe_depth: + cf_standard_name: null + unite_si: m + domaine: {min: 0.0, max: 10.0} + description_fr: Profondeur de sondage du manteau neigeux (prof_sonde, nivo) + sources: + mf_nivo: {colonne: prof_sonde, unite: cm, facteur: 0.01, offset: 0, duree_s: 0, + note: "data-platform/contracts/source-meteofrance-donnees-libres-nivo.odcs.yaml"} + + snow_water_content: + cf_standard_name: null + unite_si: "%" + domaine: {min: 0.0, max: 100.0} + description_fr: Teneur en eau du manteau neigeux (teneur_eau, nivo) + sources: + mf_nivo: {colonne: teneur_eau, unite: "%", facteur: 1, offset: 0, duree_s: 0, + note: "data-platform/contracts/source-meteofrance-donnees-libres-nivo.odcs.yaml"} + + snow_grain_diameter: + cf_standard_name: null + unite_si: m + domaine: {min: 0.0, max: 0.02} + description_fr: Diamètre du grain de neige prédominant (grain_diametre, nivo) + sources: + mf_nivo: {colonne: grain_diametre, unite: mm, facteur: 0.001, offset: 0, duree_s: 0, + note: "data-platform/contracts/source-meteofrance-donnees-libres-nivo.odcs.yaml"} + + ic_snow_grain_type_code: + cf_standard_name: null # classification internationale de la neige (UNESCO 1990), pas une grandeur physique continue + unite_si: "1" + domaine: {min: 0.0, max: 9.0} + description_fr: >- + Type de grain prédominant du manteau neigeux (grain_predom, nivo) — classification + internationale de la neige saisonnière, cardinalité exacte du code non vérifiée + (domaine 0-9 par défaut, à confirmer) + sources: + mf_nivo: {colonne: grain_predom, unite: code, facteur: 1, offset: 0, duree_s: 0, + unite_incertaine: true, + note: "domaine du code non documenté dans le contrat. data-platform/contracts/source-meteofrance-donnees-libres-nivo.odcs.yaml"} + + snow_density: + cf_standard_name: snow_density # confirmé NERC Vocabulary Server (miroir CF) + unite_si: kg m-3 + domaine: {min: 0.0, max: 1000.0} + description_fr: Masse volumique de la neige (m_vol_neige, nivo) + sources: + mf_nivo: {colonne: m_vol_neige, unite: kg m-3, facteur: 1, offset: 0, duree_s: 0, + note: "data-platform/contracts/source-meteofrance-donnees-libres-nivo.odcs.yaml"} + + ic_wind_speed_at_altitude_station: + cf_standard_name: wind_speed + unite_si: m s-1 + domaine: {min: 0.0, max: 75.0} + description_fr: >- + Vitesse du vent d'un point de mesure en altitude compagnon (ff_alti, nivo) — + second point de mesure dans le même enregistrement, sans identifiant de station + propre dans le contrat consulté (limitation de modélisation, non résolue ici) + sources: + mf_nivo: {colonne: ff_alti, unite: m s-1, facteur: 1, offset: 0, duree_s: 600, + note: "data-platform/contracts/source-meteofrance-donnees-libres-nivo.odcs.yaml"} + + ic_wind_from_direction_at_altitude_station: + cf_standard_name: wind_from_direction + unite_si: degree + domaine: {min: 0.0, max: 360.0} + description_fr: Direction du vent au point de mesure en altitude compagnon (dd_alti, nivo) + sources: + mf_nivo: {colonne: dd_alti, unite: degree, facteur: 1, offset: 0, duree_s: 600, + note: "data-platform/contracts/source-meteofrance-donnees-libres-nivo.odcs.yaml"} + + ic_snow_thickness_at_altitude_station: + cf_standard_name: surface_snow_thickness + unite_si: m + domaine: {min: 0.0, max: 15.0} + description_fr: Hauteur de neige au point de mesure en altitude compagnon (ht_neige_alti, nivo) + sources: + mf_nivo: {colonne: ht_neige_alti, unite: cm, facteur: 0.01, offset: 0, duree_s: 0, + note: "data-platform/contracts/source-meteofrance-donnees-libres-nivo.odcs.yaml"} + + ic_snow_drifting_indicator: + cf_standard_name: null + unite_si: "1" + domaine: {min: 0.0, max: 9.0} + description_fr: Indicateur de chasse-neige (chasse_neige, nivo) + sources: + mf_nivo: {colonne: chasse_neige, unite: "unknown", facteur: 1, offset: 0, duree_s: 0, + unite_incertaine: true, + note: "échelle du code non documentée dans le contrat (booléen ? intensité ?). data-platform/contracts/source-meteofrance-donnees-libres-nivo.odcs.yaml"} + + # ══════════════════════════════════════════════════════════════════════════════ + # TRANCHE 6 — table Timescale `Quotidienne` (climatologie quotidienne MF, + # contracts/quotidienne-mf-timescale.odcs.yaml), famille `mf_quotidienne`. + # 23 des 26 colonnes rejoignent des clés existantes (tranches 0/1 ci-dessus, + # sources ajoutées en place). Les 3 grandeurs ci-dessous n'ont pas d'équivalent : + # TM (moyenne vraie horaire) et TNTXM ((TN+TX)/2) sont DISTINCTES par construction + # (cf. site-infoclimat/include/MeteoFrance/quotidiennes.php:556, COALESCE(TNTXM, TM) + # — un repli de l'une vers l'autre, pas une fusion) ; TAMPLI est une différence de + # température (TX-TN), pas une température absolue. + # ══════════════════════════════════════════════════════════════════════════════ + + air_temperature_mean: + cf_standard_name: air_temperature # même base que air_temperature_min/_max (cell_methods mean, pas de standard name CF distinct) + unite_si: K + domaine: {min: 180.0, max: 340.0} + description_fr: >- + Moyenne quotidienne des températures horaires sous abri (TM) — moyenne calculée à + partir des relevés horaires effectivement observés dans la journée, DISTINCTE de + air_temperature_midrange (TNTXM, moyenne arithmétique des seuls extrêmes TN/TX). + site-infoclimat/include/MeteoFrance/quotidiennes.php:556 traite TNTXM comme un + repli (COALESCE) vers TM quand TM est absent, ce qui confirme que ce sont deux + calculs différents et non des synonymes. + sources: + mf_quotidienne: {colonne: TM, unite: degC, facteur: 1, offset: 273.15, duree_s: 86400, + note: "« moyenne quotidienne des températures horaires sous abri ». Unité non documentée explicitement par contracts/quotidienne-mf-timescale.odcs.yaml (DDL : double precision, sans commentaire) ; confirmée par la doc source amont (parseCSV.ts), facteur=1 par cohérence avec RR/TN/TX (NOTE-A : « et 1/10 » = précision décimale, pas facteur d'échelle). Source : telechargement-climatologie-meteo-data-gouv/src/csv/quotidiennes/rr-t-vent/parseCSV.ts"} + + air_temperature_midrange: + cf_standard_name: null # pas de standard name CF pour la moyenne des seuls extrêmes (« midrange » climatologique) ; distinct de air_temperature (cell_methods mean, qui couvrirait plutôt TM) + unite_si: K + domaine: {min: 180.0, max: 340.0} + description_fr: >- + Moyenne quotidienne (TN+TX)/2 (TNTXM) — moyenne arithmétique des seuls extrêmes + journaliers (« midrange »), DISTINCTE de air_temperature_mean (TM, moyenne vraie + des relevés horaires). Volontairement non fusionnée avec TM malgré la parenté + sémantique : ce sont deux estimateurs différents de la température moyenne du + jour, coexistant dans le même enregistrement Quotidienne (cf. note sur + air_temperature_mean). + sources: + mf_quotidienne: {colonne: TNTXM, unite: degC, facteur: 1, offset: 273.15, duree_s: 86400, + note: "« moyenne quotidienne (TN+TX)/2 » — calcul arithmétique des extrêmes, pas une moyenne des observations horaires. Unité non documentée explicitement par le contrat ; confirmée par la doc source amont. Source : telechargement-climatologie-meteo-data-gouv/src/csv/quotidiennes/rr-t-vent/parseCSV.ts"} + + air_temperature_range: + cf_standard_name: null # pas de standard name CF officiel confirmé pour l'amplitude thermique diurne (DTR climatologique, ETCCDI) — à revérifier + unite_si: K + domaine: {min: 0.0, max: 40.0} + description_fr: >- + Amplitude thermique quotidienne, écart entre TX et TN quotidiens (TAMPLI) — DELTA + de température, pas une température absolue. site-infoclimat/include/MeteoFrance/ + quotidiennes.php:718 calcule d'ailleurs COALESCE(TAMPLI, TX-TN), confirmant + l'identité entre la colonne et le calcul TX-TN. + sources: + mf_quotidienne: {colonne: TAMPLI, unite: degC, facteur: 1, offset: 0, duree_s: 86400, + note: "« amplitude thermique quotidienne : écart entre TX et TN quotidiens (TX-TN) ». offset=0 volontairement (une différence en °C égale la même différence en K — ne PAS appliquer +273.15, contrairement à toute température absolue de ce fichier). Unité non documentée explicitement par le contrat ; confirmée par la doc source amont et par le calcul PHP de repli. Source : telechargement-climatologie-meteo-data-gouv/src/csv/quotidiennes/rr-t-vent/parseCSV.ts ; site-infoclimat/include/MeteoFrance/quotidiennes.php:718"} + +# Colonnes vues et volontairement NON retenues dans ce vocabulaire (traçabilité +# ADR-0004). Reprend le bloc du POC (synop/static/metar/bouees/mae inchangé, SAUF +# bouees : CL, CM, CH, acc_glace, epaisseur_glace, vitesse_glace et hauteur_vagues_5 +# sont RETIRÉS de cette liste car désormais modélisés en tranche 4 — laisser une +# colonne à la fois "non retenue" et "définie comme paramètre" serait incohérent. +# nebulosite (bouees) était déjà non_retenu mais rejoint cloud_area_fraction (source +# ajoutée en tranche 0) pour la même raison ; lat/lng restent non_retenus (position +# par observation, cf. ADR-0007 amendée §4.2, colonnes observation.lat/lon dédiées et +# non un paramètre du vocabulaire) ; raw_msg reste hors périmètre (archivistique, +# Bronze). +non_retenus: + synop: [temps_passe1, temps_passe2, etat_sol, plafond_nuageux, type_nuages, raw_msg, source] + static: [complements, source] + metar: [source] + bouees: [lat, lng, raw_msg] + mae: [source] + # Tranche 1 — colonnes wide MF Horaire confirmées NON consommées (mf_data.txt, + # marquées "--COLONNE--" = absentes de la table mf_data malgré leur présence dans + # Horaire). ESNEIGE et CHARGENEIGE : le nom ESNEIGE de la table Horaire n'est pas + # consommé, mais la même sémantique de code EST consommée côté nivo → voir + # snow_state_code (tranche 5), pas une contradiction. + mf_horaire: [DIR2, DIF2, UV, UV2, INFRAR2, INS2, TLAGON, TVEGETAUX, ECOULEMENT, + ESNEIGE, CHARGENEIGE] + # Tranche 5 — champs nivo hors périmètre météo (codes bulletin avalanche, codes + # internes sans grandeur physique associée, ou doublons non résolus jugés trop + # spéculatifs pour être modélisés sans confirmation). + mf_nivo: [phenspe1, phenspe2, nuage_val, grain_nombre, homogeneite, + aval_descr, aval_genre, aval_depart, aval_expo, aval_risque] diff --git a/catalog/preseance.yaml b/catalog/preseance.yaml new file mode 100644 index 0000000..edc836f --- /dev/null +++ b/catalog/preseance.yaml @@ -0,0 +1,195 @@ +# Table de préséance des sources — transcription des règles de fusion du +# monolithe (lot A2 du chantier schéma canonique, ADR-0004/0007). +# +# STATUT : VALIDÉ ET GELÉ le 2026-07-14 (pam) — v1.0.0. Décisions actées le +# 13/07 (adoption des recommandations issues de la contre-revue sceptique), +# consultation Discord rendue sans objet par la validation directe. Toute +# réouverture passe par une nouvelle version majeure. Chaque règle cite sa +# source fichier:ligne dans le monolithe ; chaque ambiguïté porte sa décision. +# Reste ouvert (hors gel, porté par D1/E3) : la revue champ par champ des +# exceptions MF d'AMB-1 au moment d'implémenter la fusion obs_last. +# +# Sémantique : `priorite` = liste ordonnée, LA PREMIÈRE VALEUR NON NULLE GAGNE +# (transcription des COALESCE SQL). `regle` explicite les autres mécanismes +# (ecrase, min, max, premier_charge…). + +meta: + version: 1.0.0 + date_extraction: "2026-07-12" + date_decisions: "2026-07-13" + statut_decisions: "VALIDÉ-GELÉ (pam, 14/07) — v1.0.0" + contre_revue: "2026-07-13 — chaque AMB attaquée par un agent sceptique (code, + appelants, git log) ; corrections intégrées : lignes climato décalées, + AMB-5/6 = code mort, AMB-3 = masquage affichage (aucune écriture base dans + climato.php), max() rr/ens introduit 2025-03-21, bloc enneigement = toute + synop FR >= 2021 ; AMB-8/AMB-9 ajoutées" + fichiers_analyses: + - include/MeteoFrance/combined.php + - stations-meteo/climato.php + - stations-meteo/tableaux.php + - stations-meteo/stations.inc.php + - include/MeteoFrance/load_data.php + - mobile-api/inc/station-meteo_api.model.php + statut: valide-gele-v1 + +# Dictionnaire des sources (aligne dim_source du modèle canonique) +sources: + synop-ic: {description: "réseau IC synop, shards V5_data_YYYY.synop_*"} + static-ic: {description: "réseau IC StatIC, shards static_*"} + metar-ic: {description: "réseau IC metar, shards metar_*"} + mf-h: {description: "Météo-France archive horaire (mf_data H)"} + mf-htr: {description: "Météo-France temps réel horaire (HTR)"} + mf-i: {description: "Météo-France archive infra-horaire 6 min (I)"} + mf-itr: {description: "Météo-France temps réel infra-horaire (ITR)"} + mf-noaa: {description: "MF via fichiers NOAA (mf_data['noaa'])"} + eca: {description: "ECA&D, tables eca_*_FR (1881-1999)"} + gsod: {description: "NOAA GSOD (1975-2010)"} + climato-auto: {description: "climato_journaliere_auto (agrégats IC)"} + climato-manu: {description: "climato_journaliere_injectee (saisie manuelle, tag MANU)"} + nivose: {description: "enneigement NIVOSE (synop FR, an >= 2021)"} + +# --------------------------------------------------------------------------- +# CONTEXTE 1 — SQL combined.php : fusion intra-MF (tables H/HTR/I/ITR) +# Règle transversale : H > HTR > I/ITR, câblée dans l'ordre des COALESCE. +# --------------------------------------------------------------------------- +sql_combined: + regle_globale: "archive horaire (H) > temps réel horaire (HTR) > infra-horaire (I/ITR)" + ordres_standards: # fonctions adapted_to_synop/mf *_from_at (COALESCE croisés) + id_station: {priorite: [mf-i.NUM_POSTE, mf-itr.geo_id_insee, mf-h.NUM_POSTE, mf-htr.geo_id_insee], source: "combined.php:26,414"} + dh_utc: {priorite: [mf-i.AAAAMMJJHHMN, mf-itr.validity_time, mf-h.AAAAMMJJHH, mf-htr.validity_time], source: "combined.php:27,415"} + temperature: {priorite: [mf-h.T, mf-htr.t, mf-itr.t], source: "combined.php:28,434"} + pression: {priorite: [mf-h.PMER, mf-h.PSTAT, mf-htr.pmer, mf-htr.pres, mf-itr.pmer, mf-itr.pres], source: "combined.php:29,457"} + humidite: {priorite: [mf-h.U, mf-htr.u, mf-itr.u], source: "combined.php:31,449"} + point_de_rosee: {priorite: [mf-h.TD, mf-htr.td, mf-itr.td], source: "combined.php:32,435"} + visibilite: {priorite: [mf-h.VV, mf-htr.vv, mf-itr.vv], source: "combined.php:33,478"} + vent_moyen: {priorite: [mf-h.FF, mf-h.FF2, mf-htr.ff, mf-itr.ff], conversion: "x3.6 (m/s -> km/h)", source: "combined.php:34,418"} + vent_rafales: {priorite: [mf-h.FXI3S, mf-h.FXI, mf-h.FXY, mf-h.FXI2, mf-htr.raf, mf-htr.fxi, mf-htr.fxy, mf-itr.raf10, mf-itr.fxi10, mf-h.FF, mf-h.FF2, mf-htr.ff, mf-itr.ff], conversion: "x3.6", note: "fallback final sur le vent moyen", source: "combined.php:35,423"} + vent_rafales_10min: {priorite: [mf-h.FXY, mf-h.FXI, mf-h.FXI2, mf-h.FXI3S, mf-htr.fxy, mf-htr.raf, mf-htr.fxi, mf-itr.raf10, mf-itr.fxi10, mf-h.FF, mf-h.FF2, mf-htr.ff, mf-itr.ff], conversion: "x3.6", source: "combined.php:36,420"} + vent_direction: {priorite: [mf-h.DD, mf-h.DD2, mf-htr.dd, mf-itr.dd], source: "combined.php:37,419"} + temperature_min: {priorite: [mf-h.TN, mf-htr.tn, mf-h.TNSOL, mf-h.TN50], source: "combined.php:38,436"} + temperature_max: {priorite: [mf-h.TX, mf-htr.tx], source: "combined.php:39,438"} + pluie_6mn: {priorite: [mf-i.RR, mf-itr.rr_per], source: "combined.php:40"} + pluie_1h: {priorite: [mf-h.RR1, mf-htr.rr1], source: "combined.php:41,416"} + rayonnement_glo: {priorite: [mf-h.GLO, mf-h.GLO2, mf-h.UV, mf-h.UV2, mf-htr.ray_glo01, mf-itr.ray_glo01], source: "combined.php:49-50,495"} + ensoleillement: {priorite: [mf-h.INS, mf-htr.insolh, mf-itr.insolh, mf-h.INS2], source: "combined.php:51,501"} + neige_au_sol: {priorite: [mf-h.NEIGETOT, mf-htr.sss, mf-itr.sss], conversion: "sss x100 (m -> cm)", source: "combined.php:58,490"} + nebulosite: {priorite: [mf-h.N, mf-h.NBAS, mf-h.N1, mf-h.N2, mf-h.N3, mf-h.N4, mf-htr.n, mf-itr.n], source: "combined.php:461"} + sol_etat: {priorite: [mf-h.SOL, mf-htr.etat_sol, mf-itr.etat_sol], source: "combined.php:483"} + profondeur_temp: {priorite: [mf-h.T10, mf-htr.t_10, mf-itr.t_10], note: "idem T20/T50/T100", source: "combined.php:441-444"} + variantes: + - contexte: "fonctions *_from_between (blocs H / HTR / ITR unionnés)" + regle: "AUCUN fallback croisé entre tables — chaque bloc mono-source, ordres internes identiques" + source: "combined.php:116-149,299-334,557-655,857-957,1148-1151" + - contexte: "get_combined_adapted_to_mf_from_between_H — ⚠️ CODE MORT (contre-revue 13/07 : seul appelant = _merged_manually:1565, lui-même jamais appelé)" + champ: rayonnement_glo + priorite: [mf-h.UV, mf-h.UV2, mf-h.GLO] + note: "ORDRE INVERSÉ (UV avant GLO) — seule inversion sur 16 COALESCE GLO/UV du fichier (15 GLO-first), sans commentaire ; sans effet à l'exécution (code mort)" + source: "combined.php:1429" + - contexte: "get_combined_adapted_to_mf_from_between_H — ⚠️ CODE MORT (idem)" + champ: neige_au_sol + priorite: [mf-h.NEIGETOT, mf-h.HNEIGEFI1] + note: "fallback sur neige fraîche 1h — unique" + source: "combined.php:1424" + - contexte: "ordre majoritaire réel (contre-revue) : famille synop = COALESCE(GLO, GLO2, UV, UV2) (6 occ., l.49-50,124-125,307-308) ; famille mf = COALESCE(GLO, UV, UV2) SANS GLO2 (8 occ., ex. l.495,632,2702) ; l.2106 (get_live_for_mobile_api, pas get_image_mf_data) = somme de composantes" + champ: rayonnement_glo + - contexte: "get_image_mf_data (rayo)" + regle: "somme de composantes : GLO, sinon GLO2, sinon UV+INFRAR, sinon UV2+INFRAR2, sinon DIR+DIF, sinon DIR2+DIF2" + source: "combined.php:2106" + - contexte: "get_combined_adapted_to_mf_from_between_merged_manually — ⚠️ CODE MORT (contre-revue 13/07 : AUCUN appelant dans le repo ; îlot mort avec _from_between_H et _from_between_HTR)" + regle: "fusion PHP par timestamp : array_merge(HTR, H) l.1574 — les deux SELECT ayant des alias identiques, la ligne HTR est INTÉGRALEMENT remplacée par la ligne H, valeurs NULL comprises ; la prod passe par les variantes SQL COALESCE (H préféré aussi, mais NULL tombe)" + source: "combined.php:1562-1582" + +# --------------------------------------------------------------------------- +# CONTEXTE 2 — PHP live ($_DATA_LIVE) : fusion natif IC <-> MF <-> METAR +# Règle : ordre de chargement + gardes !isset => premier chargé gagne, +# SAUF exceptions où MF écrase explicitement. +# --------------------------------------------------------------------------- +php_live: + ordre_chargement: + - {rang: 1, source: "natif IC (loadData, genre de la station)", note: "priorité maximale", source_code: "tableaux.php:1373-1429, stations.inc.php:1689"} + - {rang: 2, source: nivose, regle: "REMPLACE LA LIGNE ENTIÈRE au timestamp (sans garde) — contre-revue 13/07 : concerne TOUTE station synop FR an >= 2021 (condition l.1431), pas seulement les balises NIVOSE ; clé $dh_utc arrondie à l'heure (natif = 5 min) donc collision aux heures rondes ; le SELECT enneigement n'a ni vent ni pression ni visibilité -> perdus sur collision", source_code: "tableaux.php:1431-1470"} + - {rang: 3, source: "VENTOUX synop MF (station spéciale)", source_code: "tableaux.php:1519-1569"} + - {rang: 4, source: "MF mf_data (champ par champ, gardes ci-dessous)", source_code: "tableaux.php:1627-1892"} + - {rang: 5, source: metar-ic, regle: "générique !isset — ne comble que les trous", source_code: "tableaux.php:1904-1938"} + champs: + temperature: {regle: "natif gagne SAUF source native == meteo24 (MF écrase)", source: "tableaux.php:1648-1652, station-meteo_api.model.php:32"} + pluie_1h: {regle: "MF ÉCRASE TOUJOURS si non vide", source: "tableaux.php:1643-1646, station-meteo_api.model.php:26-29"} + vent_rafales: {regle: "MF ÉCRASE TOUJOURS si non vide", source: "tableaux.php:1665-1668"} + mf_ecrase_si_non_vide: + champs: [neige_au_sol, TNSOL_H, neige_tombee_1h, neige_tombee_3h, plafond_nuageux, duree_precips, PMERMIN_H, ens_h, etat_mer, visi_mer, temps_passe1, temps_passe2, nebulosite, visibilite, tn_h, htn, tx_h, htx, uv] + note: "contre-revue 13/07 : nebulosite (l.1702), visibilite (l.1707), tn_h/htn (l.1712-1714), tx_h/htx (l.1716-1718), uv (l.1743-1749) écrasent AUSSI sans !isset — l'écrasement est la RÈGLE (~19 champs), la protection l'exception (6)" + source: "tableaux.php:1643-1749" + natif_gagne: + champs: [humidite, point_de_rosee, vent_moyen, vent_direction, pression] + regle: "MF seulement si !isset (l.1653,1657,1661,1669,1673) ; + temperature sauf source native == meteo24 (l.1648-1649)" + source: "tableaux.php:1648-1673" + contradiction_point_entree: + regle: "load_data.php (graphiques MF) écrase TOUT inconditionnellement, sans gardes — préséance IC/MF INCOHÉRENTE selon le point d'entrée du site" + source: "include/MeteoFrance/load_data.php:58-68 vs tableaux.php:1627-1892" + decision_canonique: "À TRANCHER EN REVUE — le modèle canonique doit choisir UNE règle" + +# --------------------------------------------------------------------------- +# CONTEXTE 3 — Climato quotidienne (agrégats journaliers, climato.php) +# --------------------------------------------------------------------------- +climato_quotidienne: + # ⚠️ Contre-revue 13/07 : climato.php = AFFICHAGE SEULEMENT (zéro INSERT/UPDATE + # dans le fichier). La table stockée climato_journaliere_auto est écrite par + # cron/climato_annuelle.inc.php:1794 avec une AUTRE règle (null-fill-ou- + # supérieur, l.566-571) -> l'affiché et le stocké peuvent diverger (AMB-9). + agregats: + tn: {regle: "min(natif, mf, existant) — le minimum toutes sources gagne", source: "climato.php:1111-1116"} + tx: {regle: "max(natif, mf, existant)", source: "climato.php:1117-1122"} + rr: {regle: "max à 3 termes : rr direct (pluie_24h ou somme rr1h), cumul horaire natif, cumul horaire MF — le terme MF n'est dans le max QUE depuis 2025-03-21 (commit 3bc3747ba « WIP add timescale ») ; écrasable en aval par static (l.1225) et MANU (l.1419-1421)", todo: "TODO l.1133-1134 : forcer MF si toutes les données MF, MÊME SI INFÉRIEURE (arrondis SYNOP) — NON implémenté (ni ici ni dans le cron, qui porte le même commentaire d'intention l.384,616)", source: "climato.php:1130-1136"} + ens: {regle: "idem rr avec garde !is_null et round(...,1) avant comparaison", todo: "TODO l.1140 : forcer MF si complet — NON implémenté", source: "climato.php:1138-1142"} + pmoy: {regle: "MF gagne si comptage MF >= comptage natif", source: "climato.php:1144-1147"} + divers_max: {champs: [DG_H, dgel, dhr40, dhr80, drr], regle: "max(natif, mf)", source: "climato.php:1148-1152"} + cluster_vent2: {regle: "MF remplace si count(mf) >= count(natif)", source: "climato.php:1154-1156"} + sources_archives_ordre_effectif: + regle: "ordre final effectif (AFFICHAGE) : quotidiennes-mf > climato-manu (MANU) > (eca | gsod | climato-auto selon nullité) ; en amont, ECA écrase aussi les obs synop natives déjà chargées (>= 1920)" + note_nommage: "le bloc « noaa » l.1304 = GSOD (table V5_climato_noaa) ; mf_data['noaa'] l.1431 = quotidiennes MF officielles lues via Timescale au format noaa — deux choses différentes" + detail: + - {source: synop-natif, periode: ">= 1920", regle: "chargé d'abord (bloc l.527), écrasé ensuite par ECA sans garde", source_code: "climato.php:527,860-1074"} + - {source: eca, periode: "1881-1999 (condition l.1251)", regle: "écrit sans garde de nullité là où ECA a la donnée (station dans eca_stations + jour présent)", source_code: "climato.php:1251-1302"} + - {source: gsod, periode: "1975-2010 (condition l.1304)", regle: "tn/tx/rr seulement si null (is_null/is_nullv) — ECA gagne le recouvrement par ordre + asymétrie des gardes ; temps_omm appendé sans garde ; bug latent : (float)null -> 0.0 mm sur rr", source_code: "climato.php:1304-1362"} + - {source: climato-auto, regle: "seulement si null ; exclut VENTOUX", source_code: "climato.php:1377-1388"} + - {source: climato-manu, regle: "force si non null, tag MANU, pose $output[d]['manual']=true (jamais reconsulté ensuite)", source_code: "climato.php:1407-1428"} + - {source: quotidiennes-mf, regle: "force si isset, champ par champ, source réécrite en 'mf' — MASQUE la saisie manuelle À L'AFFICHAGE (la ligne MANU reste intacte en base) ; stations avec MFID seulement ; non borné en année", source_code: "climato.php:1431-1485"} + fenetres_jour: + regle: "h>18 -> Tn attribuée à J+1 ; h>6 -> Tx à J, sinon J-1" + source: "climato.php:1046-1080" + cas_stations: + - {station: "98404003 (DDU)", regle: "fenêtres Tx 21Z-21Z, Tn 9Z-9Z, vent 15Z-15Z", source: "climato.php:1018-1045"} + - {station: "VENTOUX", regle: "exclu de climato-auto ; synop MF dédié", source: "climato.php:1365, tableaux.php:1473"} + +# --------------------------------------------------------------------------- +# AMBIGUÏTÉS À TRANCHER EN REVUE (le canonique ne doit PAS les reproduire +# aveuglément — chacune demande une décision) +# --------------------------------------------------------------------------- +ambiguites: # résumés amendés par la contre-revue du 13/07 ; décisions actées 13/07 (pam) + - id: AMB-1 + resume: "préséance IC/MF dépend du point d'entrée : tableaux.php protège 6 champs (!isset) et en écrase ~19 ; la page graphiques (graphiques.inc.php:176 -> load_data.php:68) réapplique MF sur TOUT sans garde" + decision: "règle canonique = natif IC prioritaire par défaut + exceptions MF explicites REVUES CHAMP PAR CHAMP (base : gardes tableaux.php, mais la liste actuelle est incohérente — nebulosite/visibilite écrasées sans justification documentée, à statuer champ par champ au moment du gel) ; la règle 'MF écrase tout' des graphiques n'est PAS portée. AMPLEUR (prod RO, 13/07) : 15 752 correspondances mf_stations, TOUTES de genre synop (15 745 FR + 3 PF + 2 NC, 2 STID hors annuaire) — le conflit concerne le réseau synop, pas les StatIC" + - id: AMB-2 + resume: "rr/ens : trois règles concurrentes — page (max 3 termes, terme MF depuis 2025-03-21), cron stocké (null-fill-ou-supérieur), TODO jamais codé (forcer MF si complet, même si inférieure)" + decision: "la règle du CRON (le stocké, climato_annuelle.inc.php:566-571 null-fill-ou-supérieur) fait foi pour le Gold — c'est la référence de la réconciliation F1 ; l'intention TODO (forcer MF si complet) = amélioration candidate post-bascule, rejeu dédié et mesurable" + - id: AMB-3 + resume: "les quotidiennes MF officielles MASQUENT la saisie manuelle MANU à l'affichage (ordre d'exécution, badge source réécrit 'mf') — pas de perte en base aujourd'hui, mais le canonique matérialisera la fusion" + decision: "climato-manu AU SOMMET (une correction humaine ne cède que devant un humain) + JOURNAL DES CONFLITS : quand une source auto contredit une valeur MANU au même (jour, champ), MANU tient et le conflit est loggé pour revue (canal admin, lot G2) ; écart d'affichage vs prod assumé et documenté" + - id: AMB-4 + resume: "ECA > GSOD sur 1975-1999 par ordre + asymétrie des gardes (pas de règle explicite) ; ECA écrase aussi les obs synop natives chargées (1920-1999)" + decision: "ordre explicite gravé : eca > gsod sur le recouvrement 1975-1999 (ECA&D homogénéisée), ET eca > synop-natif sur 1881-1999 (l'homogénéisation corrige les biais des obs brutes anciennes) — zéro écart vs l'affichage actuel ; rouvrable sur objection climatologique argumentée en consultation" + - id: AMB-5 + resume: "ordre rayonnement inversé [UV,UV2,GLO] (combined.php:1429, 1 occ. sur 16) — dans du CODE MORT" + decision: "ordre canonique = GLO d'abord (l'ordre majoritaire vivant, 15/16) ; l'îlot mort n'est pas porté (suppression au lot E3) ; GIT BLAME FAIT (13/07) : l'inversion date du commit de CRÉATION de la fonction (1c66ca63f, WIP 2026-02-19, migration Timescale) qui contient LES DEUX ordres le même jour — coquille de copie jamais relue car fonction jamais branchée, pas un choix documenté ; dans le modèle long GLO et UV restent des paramètres distincts, cet ordre ne sert qu'aux vues de compatibilité" + - id: AMB-6 + resume: "_merged_manually : array_merge remplace la ligne HTR entière par la ligne H, NULL compris — CODE MORT" + decision: "sémantique UNIVERSELLE de la table : « source prioritaire » = première valeur NON NULLE gagne (COALESCE) — un NULL ne remplace JAMAIS une valeur ; l'îlot mort n'est pas porté ; le besoin d'invalidation explicite d'une mesure relève du canal qualité/flags du modèle canonique, pas de la préséance" + - id: AMB-7 + resume: "bloc enneigement (toute synop FR >= 2021, pas seulement NIVOSE) remplace la ligne $_DATA_LIVE entière à l'heure ronde — champs natifs hors SELECT (vent, pression, visibilité) perdus sur collision" + decision: "préséance PAR PARAMÈTRE : l'enneigement ne gagne que sur les paramètres qu'il fournit, les autres champs du même horodatage survivent ; le comportement ligne-entière est traité comme bug non porté ; CONTRÔLE FAIT (prod RO, 13/07) : janvier 2026 = 1 164 lignes enneigement / 101 stations, ZÉRO ligne synop native pour ces stations → aucune collision observée, décision sans écart vs prod" + - id: AMB-8 + resume: "DÉCOUVERTE contre-revue : les blocs MF MariaDB (elseif tableaux.php:1579) et TimescaleDB (:1762, inconditionnel) s'exécutent TOUS LES DEUX -> double application, mélange possible si les magasins divergent ; conversion uv différente entre blocs (:1744 vs :1885)" + decision: "dans le canonique, UNE SEULE source MF par observation — le dual-source se résout à l'INGESTION, jamais à l'affichage ; côté legacy, clarifier avec l'équipe si la double passe est un état transitoire connu et si le bloc MariaDB doit être retiré (hors périmètre A2, à porter au lot E3)" + - id: AMB-9 + resume: "DÉCOUVERTE contre-revue : climato affichée (climato.php, fusion au rendu) != climato stockée (cron climato_annuelle.inc.php:566-571,1794) — deux règles, deux résultats possibles selon le consommateur" + decision: "le STOCKÉ fait foi (cohérent avec AMB-2) : le Gold canonique matérialise la fusion du cron, et les pages deviennent des consommateurs du stocké au lieu de recalculer leur propre fusion au rendu" diff --git a/contracts/gold-canicule.odcs.yaml b/contracts/gold-canicule.odcs.yaml new file mode 100644 index 0000000..c49f31e --- /dev/null +++ b/contracts/gold-canicule.odcs.yaml @@ -0,0 +1,110 @@ +apiVersion: v3.0.2 +kind: DataContract +id: urn:infoclimat:contract:gold-canicule +name: gold-canicule +version: 0.1.0 +status: draft +domain: climatologie +dataProduct: gold-canicule +description: + purpose: > + Socle "observatoire canicule" : indicateurs de chaleur mesurés (nuits + tropicales, jours de forte chaleur) par station et par territoire INSEE + (commune/EPCI/département), avec rattachement géographique et comptage par + source (StatIC / Météo-France principale / secondaire). + usage: > + Alimente le serving canicule et les surfaces carte/bulletin destinées aux + collectivités. Données mesurées uniquement — aucune interpolation. + limitations: > + station_saison / territoire_saison ne matérialisent que les territoires + réellement mesurés (>= 1 station). commune_couverture précalcule au contraire + le statut de couverture (mesuree/approchee/angle_mort) pour TOUTES les + communes métropolitaines (rayon 25 km ; DROM absents du référentiel géo). + saison_annee = année civile ; rang/n_saisons sur l'ère >= 1950 (normales OMM). +tags: [gold, diffusion, schema-canonique, canicule, climatologie] +servers: + - server: diffusion-iceberg + type: s3 + environment: production + location: s3://chom-ic-lake-diffusion/gold_canicule + format: iceberg +schema: + - name: station_insee + physicalName: gold_canicule.station_insee + physicalType: table + description: Rattachement station -> commune/EPCI/département + source. + properties: + - {name: station_uid, physicalType: TEXT, required: true, description: UID station canonique} + - {name: ic_id, physicalType: TEXT, required: false, description: identifiant Infoclimat} + - {name: source, physicalType: TEXT, required: true, description: statIC|mf_principale|mf_secondaire|autre} + - {name: latitude, physicalType: DOUBLE, required: true, description: latitude WGS84} + - {name: longitude, physicalType: DOUBLE, required: true, description: longitude WGS84} + - {name: insee_com, physicalType: TEXT, required: true, description: code INSEE commune} + - {name: nom_com, physicalType: TEXT, required: false, description: nom de la commune} + - {name: siren_epci, physicalType: TEXT, required: false, description: code SIREN de l'EPCI} + - {name: insee_dep, physicalType: TEXT, required: false, description: code département} + - name: station_saison + physicalName: gold_canicule.station_saison + physicalType: table + description: Indicateurs de chaleur par station et par année. + properties: + - {name: station_uid, physicalType: TEXT, required: true, description: UID station canonique} + - {name: ic_id, physicalType: TEXT, required: false, description: identifiant Infoclimat} + - {name: source, physicalType: TEXT, required: true, description: source de la station} + - {name: insee_com, physicalType: TEXT, required: true, description: code INSEE commune} + - {name: siren_epci, physicalType: TEXT, required: false, description: code SIREN EPCI} + - {name: insee_dep, physicalType: TEXT, required: false, description: code département} + - {name: latitude, physicalType: DOUBLE, required: true, description: latitude WGS84} + - {name: longitude, physicalType: DOUBLE, required: true, description: longitude WGS84} + - {name: saison_annee, physicalType: INTEGER, required: true, description: année civile} + - {name: nb_nuits_tropicales, physicalType: INTEGER, required: true, description: nb nuits Tn>=20 degC} + - {name: nb_jours_tx30, physicalType: INTEGER, required: true, description: nb jours Tx>=30 degC} + - {name: nb_jours_tx35, physicalType: INTEGER, required: true, description: nb jours Tx>=35 degC} + - {name: n_jours_tn, physicalType: INTEGER, required: true, description: nb jours avec Tn valide} + - {name: n_jours_tx, physicalType: INTEGER, required: true, description: nb jours avec Tx valide} + - name: territoire_saison + physicalName: gold_canicule.territoire_saison + physicalType: table + description: Roll-up par territoire INSEE + comptage source + rang historique. + properties: + - {name: niveau, physicalType: TEXT, required: true, description: commune|epci|departement} + - {name: code, physicalType: TEXT, required: true, description: code INSEE/SIREN du territoire} + - {name: saison_annee, physicalType: INTEGER, required: true, description: année civile} + - {name: n_stations, physicalType: INTEGER, required: true, description: nb stations mesurées} + - {name: n_statIC, physicalType: INTEGER, required: true, description: dont StatIC} + - {name: n_mf_principale, physicalType: INTEGER, required: true, description: dont MF principale} + - {name: n_mf_secondaire, physicalType: INTEGER, required: true, description: dont MF secondaire} + - {name: nuits_trop_moy, physicalType: DOUBLE, required: true, description: moyenne nuits tropicales} + - {name: nuits_trop_max, physicalType: INTEGER, required: true, description: max nuits tropicales} + - {name: jours_tx30_moy, physicalType: DOUBLE, required: true, description: moyenne jours Tx>=30} + - {name: jours_tx30_max, physicalType: INTEGER, required: true, description: max jours Tx>=30} + - {name: jours_tx35_moy, physicalType: DOUBLE, required: true, description: moyenne jours Tx>=35} + - {name: jours_tx35_max, physicalType: INTEGER, required: true, description: max jours Tx>=35} + - {name: rang_nuits_trop, physicalType: INTEGER, required: true, description: rang de l'année (1=plus chaude)} + - {name: n_saisons, physicalType: INTEGER, required: true, description: nb d'années disponibles} + - name: commune_couverture + physicalName: gold_canicule.commune_couverture + physicalType: table + description: Statut de couverture (mesuree/approchee/angle_mort) par commune INSEE, rayon 25 km. + properties: + - {name: insee_com, physicalType: TEXT, required: true, description: code INSEE commune} + - {name: statut, physicalType: TEXT, required: true, description: mesuree|approchee|angle_mort} + - {name: n_stations, physicalType: INTEGER, required: true, description: nb stations mesurées dans la commune} + - {name: nearest_station_uid, physicalType: TEXT, required: false, description: UID station mesurée la plus proche (si non mesuree)} + - {name: nearest_ic_id, physicalType: TEXT, required: false, description: ic_id de la station la plus proche} + - {name: nearest_km, physicalType: DOUBLE, required: false, description: distance à la station la plus proche (km)} + - {name: h3_maille, physicalType: TEXT, required: true, description: cellule H3 res 5 du centroïde communal} +team: + - username: pam + role: owner +support: + - channel: data + tool: email + url: mailto:pamahe@proton.me +customProperties: + - property: lineage + value: gold_ref.station + communes IGN + INSEE COG -> gold_canicule.station_insee ; silver.observation_v2 + gold_canicule.station_insee -> gold_canicule.station_saison -> gold_canicule.territoire_saison ; gold_canicule.station_insee + communes IGN -> gold_canicule.commune_couverture (rayon 25 km) + - property: dataLicense + value: à préciser (aligné legacy/v2 — données multi-sources StatIC + Météo-France) + - property: attribution + value: Infoclimat diff --git a/contracts/gold-climato-legacy.odcs.yaml b/contracts/gold-climato-legacy.odcs.yaml new file mode 100644 index 0000000..65b4536 --- /dev/null +++ b/contracts/gold-climato-legacy.odcs.yaml @@ -0,0 +1,130 @@ +apiVersion: v3.0.2 +kind: DataContract +id: urn:infoclimat:contract:gold-climato-legacy +name: Gold climato legacy (copie MF retro-compat) +version: 0.1.0 +status: draft +domain: climato +dataProduct: gold-climato-legacy + +description: + purpose: >- + Les données climatologiques Météo-France (mensuelles, décadaires, quotidiennes), + dans leur format d'origine — pour les sites, apps ou scripts déjà construits sur + le schéma Météo-France et qui veulent continuer à s'en servir sans rien changer. + usage: Serving public via climato.chom.engineering /legacy/* + +tags: + - meteo + - climatologie + - meteofrance + - gold + - diffusion + +servers: + - server: diffusion-iceberg + type: s3 + environment: production + location: s3://chom-ic-lake-diffusion/gold_legacy + format: iceberg + +schema: + - name: mensuelle + physicalName: gold_legacy.mensuelle + physicalType: table + description: >- + Le résumé de chaque mois par station — moyenne et extrêmes (jour le plus + froid / le plus chaud) : pour des bilans mensuels, au format Météo-France + d'origine. + properties: + - name: NUM_POSTE + physicalType: TEXT + required: true + - name: AAAAMM + physicalType: TIMESTAMPTZ + required: true + + - name: decadaire + physicalName: gold_legacy.decadaire + physicalType: table + description: >- + Cumuls et moyennes par décade (période de 10 jours) par station, au format + Météo-France d'origine — utile pour l'agronomie et le suivi des cultures. + properties: + - name: NUM_POSTE + physicalType: TEXT + required: true + - name: AAAAMM + physicalType: TIMESTAMPTZ + required: true + - name: NUM_DECADE + physicalType: INTEGER + required: true + description: 3e composante de la clé naturelle (1/2/3, 3 décades par mois) + + - name: decadaire_agro + physicalName: gold_legacy.decadaire_agro + physicalType: table + description: >- + Cumuls et moyennes agrométéo par décade (période de 10 jours) par station, + au format Météo-France d'origine — pensé pour le suivi des cultures. + properties: + - name: NUM_POSTE + physicalType: TEXT + required: true + - name: AAAAMM + physicalType: TIMESTAMPTZ + required: true + - name: NUM_DECADE + physicalType: INTEGER + required: true + description: 3e composante de la clé naturelle (1/2/3, 3 décades par mois) + + - name: quotidienne + physicalName: gold_legacy.quotidienne + physicalType: table + description: >- + Températures et précipitations journalières par station, au format + Météo-France d'origine : pour tracer des courbes de température ou + alimenter un tableau de bord compatible avec les outils existants. + properties: + - name: NUM_POSTE + physicalType: TEXT + required: true + - name: AAAAMMJJ + physicalType: TIMESTAMPTZ + required: true + + - name: quotidienne_autres + physicalName: gold_legacy.quotidienne_autres + physicalType: table + description: >- + Les autres paramètres journaliers (pression, humidité, ensoleillement, + vent, neige…) au-delà de la température et de la pluie, au format + Météo-France d'origine. + properties: + - name: NUM_POSTE + physicalType: TEXT + required: true + - name: AAAAMMJJ + physicalType: TIMESTAMPTZ + required: true + +team: + - username: pam + role: owner + +support: + - channel: data + tool: email + url: mailto:pamahe@proton.me + +customProperties: + - property: lineage + value: bronze.mf_mensuelle -> gold_legacy.mensuelle + - property: dataLicense + value: >- + Données source Météo-France, Licence Ouverte (Etalab) 2.0 + (meteo.data.gouv.fr) — attribution Météo-France requise. + - property: attribution + value: Météo-France / Infoclimat diff --git a/contracts/gold-climato-v2.odcs.yaml b/contracts/gold-climato-v2.odcs.yaml new file mode 100644 index 0000000..4354bd7 --- /dev/null +++ b/contracts/gold-climato-v2.odcs.yaml @@ -0,0 +1,197 @@ +apiVersion: v3.0.2 +kind: DataContract +id: urn:infoclimat:contract:gold-climato-v2 +name: Gold climato v2 (recalcul canonique) +version: 0.1.0 +status: draft +domain: climato +dataProduct: gold-climato-v2 + +description: + purpose: >- + Les mêmes données climatologiques que la version legacy, mais recalculées avec un + contrôle qualité qui écarte les valeurs physiquement impossibles (températures ou + cumuls de pluie aberrants), et exprimées en unités simples (°C, mm). Destiné aux + usages publics (site web, API, tableaux de bord) qui veulent des chiffres fiables + sans avoir à filtrer les données eux-mêmes. + usage: Serving public via climato.chom.engineering /v2/* + +tags: + - meteo + - climatologie + - meteofrance + - gold + - diffusion + - schema-canonique + +servers: + - server: diffusion-iceberg + type: s3 + environment: production + location: s3://chom-ic-lake-diffusion/gold_v2 + format: iceberg + +schema: + - name: journaliere + physicalName: gold_v2.journaliere + physicalType: table + description: >- + Températures journalières (min, max, moyenne) et cumul de précipitation par + station, en °C et mm : pour tracer des courbes de température ou alimenter un + tableau de bord. Recalculé avec un contrôle qualité qui écarte les valeurs + aberrantes. + properties: + - name: ic_id + physicalType: TEXT + required: true + description: Identifiant station Infoclimat (crosswalk dim_station) + - name: mfid + physicalType: TEXT + required: true + description: NUM_POSTE Météo-France (crosswalk dim_station) + - name: date + physicalType: DATE + required: true + - name: tn + physicalType: DOUBLE + description: Température min du jour (°C) + - name: tx + physicalType: DOUBLE + description: Température max du jour (°C) + - name: tm + physicalType: DOUBLE + description: (tn+tx)/2 (°C) + - name: tntxm + physicalType: DOUBLE + description: alias de tm (°C) + - name: rr + physicalType: DOUBLE + description: Cumul de précipitation du jour (mm) + + - name: mensuelle + physicalName: gold_v2.mensuelle + physicalType: table + description: >- + Le résumé de chaque mois par station — moyennes, extrêmes datés (jour le plus + froid / le plus chaud), nombre de jours de gel : pour des bilans mensuels. + properties: + - name: ic_id + physicalType: TEXT + required: true + - name: mfid + physicalType: TEXT + required: true + - name: mois + physicalType: TIMESTAMP + required: true + description: Premier jour du mois (date_trunc('month', date)) + - name: tnm + physicalType: DOUBLE + description: Moyenne mensuelle des tn (°C) + - name: txm + physicalType: DOUBLE + description: Moyenne mensuelle des tx (°C) + - name: tmm + physicalType: DOUBLE + description: Moyenne mensuelle des tm (°C) + - name: rr + physicalType: DOUBLE + description: Cumul de précipitation du mois (mm) + - name: tnn + physicalType: DOUBLE + description: Température min du mois (°C) + - name: tnn_date + physicalType: DATE + - name: txx + physicalType: DOUBLE + description: Température max du mois (°C) + - name: txx_date + physicalType: DATE + - name: nb_jours_gel + physicalType: INTEGER + description: Nombre de jours du mois avec tn < 0 °C + + - name: records + physicalName: gold_v2.records + physicalType: table + description: >- + Les records de température (chaud/froid) de chaque station, par mois + calendaire sur tout l'historique : pour afficher « record battu » et les + extrêmes historiques. + properties: + - name: ic_id + physicalType: TEXT + required: true + - name: mfid + physicalType: TEXT + required: true + - name: mois_calendaire + physicalType: INTEGER + required: true + description: Mois calendaire (1-12), 3e composante de la clé naturelle + - name: txx_max + physicalType: DOUBLE + description: Record absolu de température max sur le mois calendaire (°C) + - name: txx_max_date + physicalType: DATE + - name: tnn_min + physicalType: DOUBLE + description: Record absolu de température min sur le mois calendaire (°C) + - name: tnn_min_date + physicalType: DATE + + - name: itn + physicalName: gold_v2.itn + physicalType: table + description: >- + L'Indicateur Thermique National — la température moyenne quotidienne de la + France (30 stations de référence) : pour suivre vagues de chaleur et de froid + à l'échelle du pays. + properties: + - name: date + physicalType: DATE + required: true + - name: year + physicalType: INTEGER + required: true + - name: month + physicalType: INTEGER + required: true + - name: day_of_month + physicalType: INTEGER + required: true + - name: is_fictive + physicalType: BOOLEAN + description: 29/02 synthétique des années non-bissextiles (toujours FALSE dans ce build) + - name: itn + physicalType: DOUBLE + description: Indicateur Thermique National du jour (°C) + +team: + - username: pam + role: owner + +support: + - channel: data + tool: email + url: mailto:pamahe@proton.me + +customProperties: + - property: lineage + value: silver.observation_v2 -> gold_v2.journaliere -> {mensuelle, records, itn} + - property: dataLicense + value: >- + Agrégats dérivés de données Météo-France (Licence Ouverte Etalab 2.0) + + valeur ajoutée Infoclimat, politique opendata IC. + - property: attribution + value: Météo-France / Infoclimat + - property: methodologyRef + value: >- + github.com/dataforgoodfr/14_ValorisationDonneeMeteo (backend/sql) — + ITN 30 stations réf. ≥29/30, records absolus par mois. + - property: units + value: >- + Unités conventionnelles (°C, mm), pas les unités SI internes du + canonique. QC de plausibilité physique appliqué en amont de + gold_v2.journaliere (air_temperature ∈ [-90, +60] °C, précipitation + horaire ∈ [0, 500] mm) — hérité par mensuelle/records/itn. diff --git a/contracts/gold-dataclimat.odcs.yaml b/contracts/gold-dataclimat.odcs.yaml new file mode 100644 index 0000000..8617db7 --- /dev/null +++ b/contracts/gold-dataclimat.odcs.yaml @@ -0,0 +1,305 @@ +apiVersion: v3.0.2 +kind: DataContract +id: urn:infoclimat:contract:gold-dataclimat +name: Gold dataclimat (drop-in dataclimat.fr / Data For Good) +version: 0.1.0 +status: draft +domain: climato +dataProduct: gold-dataclimat + +description: + purpose: >- + Les indicateurs climatiques du projet dataclimat.fr (Data For Good) : températures + journalières et mensuelles par station, records de chaleur et de froid, normales + 1991-2020, et l'Indicateur Thermique National — la température moyenne quotidienne de + la France. Toutes ces données proviennent de Météo-France. + usage: >- + Serving public via /dataclimat/*. Cible : backend dataclimat.fr (remplacement des + lectures `FROM mv_*` par des appels API). Relevé des règles métier le 2026-07-18 depuis + leur repo public + API prod (voir chom-poc-data/.superpowers/dataclimat-discovery.md). + +tags: [meteo, climatologie, meteofrance, gold, diffusion, dataclimat, dataforgood] + +servers: + - server: diffusion-iceberg + type: s3 + environment: production + location: s3://chom-ic-lake-diffusion/gold_dataclimat + format: iceberg + +schema: + - name: quotidienne + physicalName: gold_dataclimat.quotidienne + physicalType: table + description: >- + Températures journalières (min, max, moyenne) par station, valeurs officielles + Météo-France, historique depuis 1816 : pour tracer des courbes de température ou + alimenter un tableau de bord. + properties: + - name: station_code + physicalType: TEXT + required: true + description: NUM_POSTE Météo-France + - name: date + physicalType: DATE + required: true + - name: tntxm + physicalType: DOUBLE + description: Moyenne (tn+tx)/2 — midrange officiel MF (°C) + - name: tn + physicalType: DOUBLE + description: Température minimale du jour climatologique (°C) + - name: tx + physicalType: DOUBLE + description: Température maximale du jour climatologique (°C) + + - name: mensuelle + physicalName: gold_dataclimat.mensuelle + physicalType: table + description: >- + Le résumé de chaque mois par station — moyenne et extrêmes (jour le plus froid / + le plus chaud) : pour des bilans mensuels. + properties: + - name: station_code + physicalType: TEXT + required: true + description: NUM_POSTE Météo-France + - name: date + physicalType: DATE + required: true + description: Mois (premier jour du mois) + - name: tnn + physicalType: DOUBLE + description: Tn minimale du mois (°C) + - name: tnn_date + physicalType: DATE + description: Jour du Tn minimal (tie-break date la plus ancienne) + - name: txx + physicalType: DOUBLE + description: Tx maximale du mois (°C) + - name: txx_date + physicalType: DATE + description: Jour du Tx maximal + - name: tmm + physicalType: DOUBLE + description: Moyenne mensuelle de tntxm, arrondie à 0,1 °C + + - name: records_absolus + physicalName: gold_dataclimat.records_absolus + physicalType: table + description: >- + Les records de température (chaud/froid) de chaque station, toute l'année / par + mois / par saison : pour afficher « record battu » et les extrêmes historiques. + properties: + - name: period_type + physicalType: TEXT + required: true + description: all_time | month | season + - name: period_value + physicalType: TEXT + description: NULL (all_time) | '1'..'12' (mois) | spring|summer|autumn|winter + - name: record_type + physicalType: TEXT + required: true + description: TX (chaud) | TN (froid) + - name: station_code + physicalType: TEXT + required: true + description: NUM_POSTE Météo-France + - name: station_name + physicalType: TEXT + - name: department + physicalType: TEXT + - name: record_value + physicalType: DOUBLE + description: Valeur du record (°C) + - name: record_date + physicalType: DATE + description: Date du record (tie-break date la plus ancienne) + - name: lat + physicalType: DOUBLE + - name: lon + physicalType: DOUBLE + - name: alt + physicalType: DOUBLE + - name: classe_recente + physicalType: INTEGER + description: >- + Classe d'homogénéité MF de la station (1 = meilleure … 5), valeur courante + (station_classe.date_fin IS NULL). Le dataset ne retient que classe_recente <= 3 + (iso-comportement D4G v_station_records). + + - name: records_battus + physicalName: gold_dataclimat.records_battus + physicalType: table + description: >- + L'HISTORIQUE des records progressivement battus par station : une ligne par date où + la station a établi un nouvel extrême (chaud/froid), toute l'année / par mois / par + saison. Distinct de records_absolus (extrême figé) — sert la timeline « records + battus » de dataclimat.fr (API /records, alias /records/historical). + properties: + - name: period_type + physicalType: TEXT + required: true + description: all_time | month | season + - name: period_value + physicalType: TEXT + description: NULL (all_time) | '1'..'12' (mois) | spring|summer|autumn|winter + - name: record_type + physicalType: TEXT + required: true + description: TX (chaud) | TN (froid) + - name: station_code + physicalType: TEXT + required: true + description: NUM_POSTE Météo-France + - name: station_name + physicalType: TEXT + - name: department + physicalType: TEXT + - name: record_value + physicalType: DOUBLE + description: Valeur du record établi ce jour-là (°C) + - name: record_date + physicalType: DATE + description: Date à laquelle ce nouvel extrême a été atteint + - name: lat + physicalType: DOUBLE + - name: lon + physicalType: DOUBLE + - name: alt + physicalType: DOUBLE + - name: classe_recente + physicalType: INTEGER + description: >- + Classe d'homogénéité MF (1 = meilleure … 5), valeur courante. Filtre + classe_recente <= 3 (iso-comportement D4G v_records_battus). + + - name: itn + physicalName: gold_dataclimat.itn + physicalType: table + description: >- + L'Indicateur Thermique National — la température moyenne quotidienne de la France + (30 stations de référence) : pour suivre vagues de chaleur et de froid à l'échelle + du pays. + properties: + - name: date + physicalType: DATE + required: true + - name: year + physicalType: INTEGER + - name: month + physicalType: INTEGER + - name: day_of_month + physicalType: INTEGER + - name: is_fictive + physicalType: BOOLEAN + description: TRUE si 29 février synthétique (année non bissextile) + - name: itn + physicalType: DOUBLE + description: Indicateur Thermique National du jour (°C) + + - name: itn_baseline + physicalName: gold_dataclimat.itn_baseline + physicalType: table + description: >- + La normale 1991-2020 de l'ITN, jour par jour : la référence pour dire si une + journée est au-dessus ou en dessous de la normale nationale. + properties: + - name: month + physicalType: INTEGER + required: true + - name: day_of_month + physicalType: INTEGER + required: true + - name: sample_size + physicalType: INTEGER + - name: itn_mean + physicalType: DOUBLE + - name: itn_stddev + physicalType: DOUBLE + description: Écart-type de population (STDDEV_POP) + - name: itn_p20 + physicalType: DOUBLE + - name: itn_p80 + physicalType: DOUBLE + + - name: baseline_1991_2020 + physicalName: gold_dataclimat.baseline_1991_2020 + physicalType: table + description: >- + La normale de température 1991-2020 de chaque station, jour par jour de l'année : + pour calculer l'écart à la normale. + properties: + - name: station_code + physicalType: TEXT + required: true + description: NUM_POSTE Météo-France + - name: month + physicalType: INTEGER + required: true + - name: day + physicalType: INTEGER + required: true + - name: sample_count + physicalType: INTEGER + description: Nombre d'années contributrices (>= 24) + - name: baseline_mean_tntxm + physicalType: DOUBLE + description: Moyenne 1991-2020 de tntxm pour ce jour calendaire (°C) + - name: classe_recente + physicalType: INTEGER + description: >- + Classe d'homogénéité MF de la station (1 = meilleure … 5), valeur courante + (station_classe.date_fin IS NULL). Le dataset ne retient que classe_recente <= 4 + (iso-comportement D4G v_station_deviation). + + - name: first_temperature_date + physicalName: gold_dataclimat.first_temperature_date + physicalType: table + description: >- + Depuis quel mois chaque station mesure la température : pour connaître + l'ancienneté d'une station. La date est un texte au format AAAAMM (année + puis mois sur deux chiffres) — par exemple « 187206 » = juin 1872. + properties: + - name: station_code + physicalType: TEXT + required: true + description: NUM_POSTE Météo-France + - name: first_temperature_date + physicalType: TEXT + description: >- + Mois du premier relevé de température, texte au format AAAAMM (année + + mois sur deux chiffres), ex. « 187206 » = juin 1872. Ni date ISO ni + nombre. + +customProperties: + - property: lineage + value: >- + silver.observation_v2 (source mf-q/mf-h) -> gold_dataclimat.quotidienne -> + {mensuelle, records_absolus, records_battus, itn, itn_baseline, baseline_1991_2020, + first_temperature_date} + - property: dataLicense + value: >- + Données source Météo-France, Licence Ouverte (Etalab) 2.0 (data.gouv.fr). Méthodologie + des agrégats : Data For Good, saison 14 (dataforgoodfr/14_ValorisationDonneeMeteo). + - property: attribution + value: Météo-France + - property: methodologyRef + value: >- + github.com/dataforgoodfr/14_ValorisationDonneeMeteo (backend/sql/materialized_views). + Règles reproduites en drop-in. + - property: classeRecente + value: >- + classe_recente (classification d'homogénéité MF, 1=meilleure..5) sourcée depuis la table + station_classe du socle dataclimat de production (valeur courante = date_fin IS NULL). + Filtres iso-D4G appliqués : records_absolus + records_battus classe_recente<=3 + (v_station_records), baseline_1991_2020 classe_recente<=4 (v_station_deviation) ; + colonne exposée partout. + - property: deviations + value: >- + first_temperature_date >= now()-50 ans (records_absolus/records_battus) non appliqué + (dates d'ouverture/fermeture de poste absentes du lac) ; l'antériorité est approximée + par « au moins une observation avant 1997-01-01 » (baseline) — records_battus émet donc + l'historique complet dès la 1re observation. date_de_creation/date_de_fermeture du + payload D4G omises. diff --git a/contracts/gold-ic.odcs.yaml b/contracts/gold-ic.odcs.yaml new file mode 100644 index 0000000..f2fb41f --- /dev/null +++ b/contracts/gold-ic.odcs.yaml @@ -0,0 +1,183 @@ +apiVersion: v3.0.2 +kind: DataContract +id: urn:infoclimat:contract:gold-ic +name: Gold collecte IC (climatologie des sources collectées par Infoclimat, hors Météo-France) +version: 0.1.0 +status: draft +domain: climato +dataProduct: gold-ic + +description: + purpose: >- + Les agrégats climatologiques calculés sur TOUTES les sources collectées par + Infoclimat À L'EXCLUSION du flux officiel Météo-France : réseaux synoptiques et + METAR officiels (décodés depuis les diffusions internationales SYNOP/BUFR), + bouées marines, le réseau participatif StatIC et Météo-à-l'École. Ce n'est donc + PAS un réseau propre à Infoclimat mais l'ensemble de sa collecte hors + Météo-France — un regroupement technique par source. Pour les SEULES stations + opérées par Infoclimat, voir gold-statIC (réseau participatif). Températures + journalières et mensuelles, records par station ; QC et unités (°C, mm) + identiques à v2. + usage: Serving public via climato.chom.engineering /ic/* + +tags: + - meteo + - climatologie + - infoclimat + - collecte-multi-sources + - gold + - diffusion + - schema-canonique + +servers: + - server: diffusion-iceberg + type: s3 + environment: production + location: s3://chom-ic-lake-diffusion/gold_ic + format: iceberg + +schema: + - name: journaliere + physicalName: gold_ic.journaliere + physicalType: table + description: >- + Températures journalières (min, max, moyenne) et cumul de précipitation par + station, en °C et mm, à partir des sources collectées par Infoclimat hors + Météo-France (synop/metar/bouées officiels relayés + StatIC + Météo-à-l'École). + Contrôle qualité qui écarte les valeurs aberrantes. + properties: + - name: ic_id + physicalType: TEXT + required: true + description: Identifiant station Infoclimat (crosswalk dim_station) + - name: mfid + physicalType: TEXT + description: NUM_POSTE Météo-France si la station est aussi référencée MF, sinon vide + - name: date + physicalType: DATE + required: true + - name: tn + physicalType: DOUBLE + description: Température min du jour (°C) + - name: tx + physicalType: DOUBLE + description: Température max du jour (°C) + - name: tm + physicalType: DOUBLE + description: (tn+tx)/2 (°C) + - name: tntxm + physicalType: DOUBLE + description: alias de tm (°C) + - name: rr + physicalType: DOUBLE + description: Cumul de précipitation du jour (mm) + + - name: mensuelle + physicalName: gold_ic.mensuelle + physicalType: table + description: >- + Le résumé de chaque mois par station — moyennes, extrêmes datés (jour le plus + froid / le plus chaud), nombre de jours de gel — sur les sources collectées par + Infoclimat hors Météo-France. + properties: + - name: ic_id + physicalType: TEXT + required: true + - name: mfid + physicalType: TEXT + description: NUM_POSTE Météo-France si la station est aussi référencée MF, sinon vide + - name: mois + physicalType: TIMESTAMP + required: true + description: Premier jour du mois (date_trunc('month', date)) + - name: tnm + physicalType: DOUBLE + description: Moyenne mensuelle des tn (°C) + - name: txm + physicalType: DOUBLE + description: Moyenne mensuelle des tx (°C) + - name: tmm + physicalType: DOUBLE + description: Moyenne mensuelle des tm (°C) + - name: rr + physicalType: DOUBLE + description: Cumul de précipitation du mois (mm) + - name: tnn + physicalType: DOUBLE + description: Température min du mois (°C) + - name: tnn_date + physicalType: DATE + - name: txx + physicalType: DOUBLE + description: Température max du mois (°C) + - name: txx_date + physicalType: DATE + - name: nb_jours_gel + physicalType: INTEGER + description: Nombre de jours du mois avec tn < 0 °C + + - name: records + physicalName: gold_ic.records + physicalType: table + description: >- + Les records de température (chaud/froid) de chaque station, par mois calendaire + sur tout l'historique, sur les sources collectées par Infoclimat hors + Météo-France : pour afficher « record battu » et les extrêmes historiques. + properties: + - name: ic_id + physicalType: TEXT + required: true + - name: mfid + physicalType: TEXT + description: NUM_POSTE Météo-France si la station est aussi référencée MF, sinon vide + - name: mois_calendaire + physicalType: INTEGER + required: true + description: Mois calendaire (1-12), 3e composante de la clé naturelle + - name: txx_max + physicalType: DOUBLE + description: Record absolu de température max sur le mois calendaire (°C) + - name: txx_max_date + physicalType: DATE + - name: tnn_min + physicalType: DOUBLE + description: Record absolu de température min sur le mois calendaire (°C) + - name: tnn_min_date + physicalType: DATE + +team: + - username: pam + role: owner + +support: + - channel: data + tool: email + url: mailto:pamahe@proton.me + +customProperties: + - property: lineage + value: silver.observation_v2 (source LIKE '%-ic') -> gold_ic.journaliere -> {mensuelle, records} + - property: dataLicense + value: >- + Sources multiples collectées par Infoclimat hors Météo-France : réseaux + officiels SYNOP/METAR/bouées (diffusions internationales) et réseaux + participatifs StatIC / Météo-à-l'École, redistribués sous la politique + opendata Infoclimat. Les données officielles restent sous la licence de leur + producteur. + - property: attribution + value: Infoclimat (collecte multi-sources hors Météo-France) + - property: methodologyRef + value: >- + Kernels identiques à gold_v2 (github.com/dataforgoodfr/14_ValorisationDonneeMeteo, + backend/sql) — mêmes agrégats journaliers/mensuels/records, appliqués aux seules + sources IC. + - property: sourceFilter + value: >- + source LIKE '%-ic' : synop-ic (SYNOP officiel relayé), metar-ic (METAR), + bouees-ic (bouées), static-ic (StatIC participatif), mae-ic (Météo-à-l'École). + Exclut les sources Météo-France (mf-*) et les anciens agrégats IC (climato-auto). + - property: units + value: >- + Unités conventionnelles (°C, mm). QC de plausibilité physique appliqué en amont + de gold_ic.journaliere (air_temperature ∈ [-90, +60] °C, précipitation horaire + ∈ [0, 500] mm) — hérité par mensuelle/records. diff --git a/contracts/gold-ref.odcs.yaml b/contracts/gold-ref.odcs.yaml new file mode 100644 index 0000000..538fbfe --- /dev/null +++ b/contracts/gold-ref.odcs.yaml @@ -0,0 +1,157 @@ +apiVersion: v3.0.2 +kind: DataContract +id: urn:infoclimat:contract:gold-ref +name: Gold référentiel stations (annuaire géolocalisé + réseau + activité par paramètre) +version: 0.1.0 +status: draft +domain: referentiel +dataProduct: gold-ref + +description: + purpose: >- + Le référentiel unique des stations météo connues d'Infoclimat : identité + (ic_id, mfid), géolocalisation, réseau (StatIC participatif / synop, et pour + Météo-France le type de poste principale/secondaire), état d'ouverture, et la + liste des paramètres réellement mesurés avec leur activité (première/dernière + observation, volume). Remplace le feed live stations_xhr.php et les exports + GeoJSON figés côté cartes. + usage: Serving public via climato.chom.engineering /ref/* + +tags: + - meteo + - referentiel + - stations + - infoclimat + - gold + - diffusion + - schema-canonique + +servers: + - server: diffusion-iceberg + type: s3 + environment: production + location: s3://chom-ic-lake-diffusion/gold_ref + format: iceberg + +schema: + - name: station + physicalName: gold_ref.station + physicalType: table + description: >- + Une ligne par station : identité, géolocalisation, réseau, état d'ouverture, + paramètres mesurés (tableau) et date de dernière activité. + properties: + - name: station_uid + physicalType: TEXT + required: true + description: >- + Pivot de jointure interne. uuid5(ns, "ic:" + ic_id) — DÉRIVÉ de ic_id, + donc pas plus stable que lui : il change si ic_id change. L'identifiant + canonique est ic_id. + - name: ic_id + physicalType: TEXT + required: true + description: >- + Identifiant station Infoclimat — IDENTIFIANT CANONIQUE, celui qui fait + foi. Hétérogène par conception : code OACI pour les metar (FMEE), + indicatif OMM à 5 chiffres pour les synop (61980). Les stations StatIC + n'ont AUCUNE forme unique (00006, STATIC0253, MNWERO090) : ne présumez + d'aucun format, lisez la valeur. + - name: mfid + physicalType: TEXT + description: NUM_POSTE Météo-France si la station est aussi référencée MF, sinon vide + - name: genre + physicalType: TEXT + description: Réseau (static = StatIC participatif, synop = synoptique) + - name: type_poste + physicalType: TEXT + description: Type de poste Météo-France (principale/secondaire), sinon vide + - name: libelle + physicalType: TEXT + - name: libelle_source + physicalType: TEXT + description: >- + Libellé brut du référentiel amont, avant normalisation. Conservé pour + traçabilité : 13 087 libellés portent un préfixe laissé par l'import CSV + Météo-France (« TEST MF CSV … ») qui ne désigne PAS des stations de + test — ce sont des postes Météo-France réels. + - name: latitude + physicalType: DOUBLE + required: true + - name: longitude + physicalType: DOUBLE + required: true + - name: altitude + physicalType: INTEGER + description: Altitude (m) + - name: departement + physicalType: TEXT + - name: pays + physicalType: TEXT + - name: ouverte + physicalType: BOOLEAN + description: Station déclarée ouverte dans l'annuaire + - name: dh_ouverture + physicalType: TIMESTAMP + - name: publiable + physicalType: BOOLEAN + required: true + description: >- + La station porte au moins une observation dans gold_ref.station_parametre. + Seul critère de quarantaine du référentiel diffusé : les endpoints + /stations et /ref/stations écartent les lignes à false par défaut + (publiable=0 les rouvre). + - name: parametres_mesures + physicalType: ARRAY + description: Clés canoniques des paramètres réellement observés + - name: derniere_activite + physicalType: TIMESTAMP + description: Dernière observation, tous paramètres confondus + + - name: station_parametre + physicalName: gold_ref.station_parametre + physicalType: table + description: >- + Pont station × paramètre : pour chaque paramètre observé par une station, + première/dernière observation et volume. Fait autorité sur « quelles stations + mesurent quoi ». + properties: + - name: station_uid + physicalType: TEXT + required: true + - name: parametre + physicalType: TEXT + required: true + description: Clé canonique du paramètre (vocabulaire dim_parametre) + - name: premiere_obs + physicalType: TIMESTAMP + - name: derniere_obs + physicalType: TIMESTAMP + - name: n_obs + physicalType: BIGINT + description: Nombre d'observations du couple (station, paramètre) + +team: + - username: pam + role: owner + +support: + - channel: data + tool: email + url: mailto:pamahe@proton.me + +customProperties: + - property: lineage + value: dim.station + silver.observation_v2 -> gold_ref.station_parametre -> gold_ref.station + - property: dataLicense + value: >- + Référentiel multi-sources (réseau participatif StatIC Infoclimat + stations + officielles Météo-France et autres producteurs), redistribué sous la politique + opendata Infoclimat ; les métadonnées officielles restent sous la licence de + leur producteur. + - property: attribution + value: Infoclimat / réseau StatIC + - property: activityWindow + value: >- + Le serving /ref/stations filtre par défaut sur derniere_activite >= aujourd'hui + - 365 jours (paramètre actif_depuis pour élargir/restreindre). diff --git a/contracts/gold-statIC.odcs.yaml b/contracts/gold-statIC.odcs.yaml new file mode 100644 index 0000000..45b1110 --- /dev/null +++ b/contracts/gold-statIC.odcs.yaml @@ -0,0 +1,283 @@ +apiVersion: v3.0.2 +kind: DataContract +id: urn:infoclimat:contract:gold-statIC +name: Gold StatIC (climato du réseau participatif Infoclimat) +version: 0.1.0 +status: draft +domain: climato +dataProduct: gold-statIC + +description: + purpose: >- + La climatologie du réseau de stations participatives StatIC (Infoclimat) : + températures journalières et mensuelles, records par station — servie comme un + produit Météo-France, mais en assumant la nature participative des stations + (emplacements et capteurs hétérogènes) par la TRANSPARENCE plutôt que le + masquage : chaque valeur est accompagnée de sa densité d'observations et de son + taux de mesures physiquement plausibles. Rien n'est retiré d'autorité ; + l'utilisateur filtre selon son besoin. + usage: Serving public via climato.chom.engineering /statIC/* + limitations: >- + classe_station (classification siting StatIC) est présente mais NON RENSEIGNÉE + (NULL) : cette classification n'est pas disponible comme donnée sourçable dans + le canonique ni la métadata IC inventoriée (décision 2026-07-18). Elle sera + renseignée quand la source sera identifiée. Le taux_qc_valide s'appuie sur la + plausibilité physique (les obs StatIC sont qc_flag='raw', sans QC amont). + +tags: + - meteo + - climatologie + - infoclimat + - statIC + - reseau-participatif + - gold + - diffusion + +servers: + - server: diffusion-iceberg + type: s3 + environment: production + location: s3://chom-ic-lake-diffusion/gold_statIC + format: iceberg + +schema: + - name: journaliere + physicalName: gold_statIC.journaliere + physicalType: table + description: >- + Températures journalières (min, max, moyenne) et cumul de précipitation par + station StatIC, en °C et mm, avec la densité d'observations et le taux de + mesures plausibles : pour exploiter le réseau participatif en connaissance de + cause. + properties: + - name: ic_id + physicalType: TEXT + required: true + description: Identifiant station StatIC (Infoclimat) + - name: date + physicalType: DATE + required: true + - name: tn + physicalType: DOUBLE + description: Température min du jour (°C) + - name: tx + physicalType: DOUBLE + description: Température max du jour (°C) + - name: tm + physicalType: DOUBLE + description: (tn+tx)/2 (°C) + - name: tntxm + physicalType: DOUBLE + description: alias de tm (°C) + - name: rr + physicalType: DOUBLE + description: Cumul de précipitation du jour (mm), nul si > 2000 mm (impossible) + - name: n_obs + physicalType: INTEGER + description: Nombre d'observations de température agrégées ce jour (densité) + - name: taux_qc_valide + physicalType: DOUBLE + description: Part des obs de température dans les bornes physiques [-90,+60] °C (0-1) + - name: classe_station + physicalType: INTEGER + description: Classe siting StatIC (1-5) — NON RENSEIGNÉE (déviation, cf. limitations) + + - name: mensuelle + physicalName: gold_statIC.mensuelle + physicalType: table + description: >- + Le résumé de chaque mois par station StatIC — moyennes, extrêmes datés, jours + de gel — avec la densité et le taux de mesures plausibles du mois. + properties: + - name: ic_id + physicalType: TEXT + required: true + - name: mois + physicalType: TIMESTAMP + required: true + description: Premier jour du mois + - name: tnm + physicalType: DOUBLE + description: Moyenne mensuelle des tn (°C) + - name: txm + physicalType: DOUBLE + description: Moyenne mensuelle des tx (°C) + - name: tmm + physicalType: DOUBLE + description: Moyenne mensuelle des tm (°C) + - name: rr + physicalType: DOUBLE + description: Cumul de précipitation du mois (mm) + - name: tnn + physicalType: DOUBLE + description: Température min du mois (°C) + - name: tnn_date + physicalType: DATE + - name: txx + physicalType: DOUBLE + description: Température max du mois (°C) + - name: txx_date + physicalType: DATE + - name: nb_jours_gel + physicalType: INTEGER + description: Nombre de jours du mois avec tn < 0 °C + - name: n_obs + physicalType: INTEGER + description: Nombre d'observations de température du mois + - name: taux_qc_valide + physicalType: DOUBLE + description: Taux d'obs plausibles du mois, pondéré par la densité (0-1) + - name: classe_station + physicalType: INTEGER + description: Classe siting StatIC — NON RENSEIGNÉE (déviation) + + - name: records + physicalName: gold_statIC.records + physicalType: table + description: >- + Les records de température (chaud/froid) de chaque station StatIC, par mois + calendaire sur tout l'historique : extrêmes bruts du réseau participatif (à + lire avec la densité/qualité de la station). + properties: + - name: ic_id + physicalType: TEXT + required: true + - name: mois_calendaire + physicalType: INTEGER + required: true + description: Mois calendaire (1-12) + - name: txx_max + physicalType: DOUBLE + description: Record de température max sur le mois calendaire (°C) + - name: txx_max_date + physicalType: DATE + - name: tnn_min + physicalType: DOUBLE + description: Record de température min sur le mois calendaire (°C) + - name: tnn_min_date + physicalType: DATE + + - name: indicateur_reseau + physicalName: gold_statIC.indicateur_reseau + physicalType: table + description: >- + L'indicateur thermique national du réseau StatIC — la température moyenne + quotidienne de la France, calculée pour être SPATIALEMENT REPRÉSENTATIVE : + moyenne par département puis moyenne des départements couverts (et non moyenne + brute des stations, qui sur-pondérerait les zones denses). La couverture + (nombre de stations, de départements) et la dispersion sont exposées pour la + transparence. V1 national ; régional et anomalies vs normales = suite. + properties: + - name: date + physicalType: DATE + required: true + - name: echelle + physicalType: TEXT + description: Échelle spatiale ('national' en V1) + - name: itn_statIC + physicalType: DOUBLE + description: Indicateur thermique StatIC du jour, représentatif (°C) + - name: tn_moy + physicalType: DOUBLE + description: Moyenne réseau des tn (par maille puis des mailles) (°C) + - name: tx_moy + physicalType: DOUBLE + description: Moyenne réseau des tx (°C) + - name: n_stations + physicalType: INTEGER + description: Nombre de stations StatIC contribuant ce jour (transparence) + - name: n_mailles + physicalType: INTEGER + description: Nombre de départements couverts ce jour (représentativité) + - name: ecart_type + physicalType: DOUBLE + description: Écart-type inter-stations des tm (dispersion, transparence) + - name: stations + physicalName: gold_statIC.stations + physicalType: table + description: >- + L'annuaire du réseau StatIC, triable par département : pour chaque station, + tous les paramètres réellement mesurés et leur profondeur temporelle + (première/dernière observation, volume). Grain : 1 ligne par + (station, paramètre). Stations fermées incluses — les colonnes ouverte et + derniere_obs permettent de filtrer. Dérivée de gold_ref (référentiel), + refresh quotidien. + properties: + - name: ic_id + physicalType: TEXT + required: true + description: Identifiant station StatIC (Infoclimat) + - name: libelle + physicalType: TEXT + description: Nom de la station + - name: departement + physicalType: TEXT + description: Département (code, ex. « 31 ») — null hors France + - name: pays + physicalType: TEXT + description: Code pays (ex. FR) + - name: latitude + physicalType: DOUBLE + required: true + - name: longitude + physicalType: DOUBLE + required: true + - name: altitude + physicalType: INTEGER + description: Altitude (m) + - name: ouverte + physicalType: BOOLEAN + required: true + description: Station encore ouverte dans le référentiel + - name: dh_ouverture + physicalType: TIMESTAMP + description: Date d'ouverture de la station + - name: parametre + physicalType: TEXT + required: true + description: Paramètre mesuré (vocabulaire canonique, cf. /params) + - name: premiere_obs + physicalType: TIMESTAMP + required: true + description: Première observation de ce paramètre sur cette station + - name: derniere_obs + physicalType: TIMESTAMP + required: true + description: Dernière observation de ce paramètre sur cette station + - name: n_obs + physicalType: BIGINT + required: true + description: Nombre total d'observations de ce paramètre + +team: + - username: pam + role: owner + +support: + - channel: data + tool: email + url: mailto:pamahe@proton.me + +customProperties: + - property: lineage + value: >- + silver.observation_v2 (source='static-ic') -> gold_statIC.journaliere -> + {mensuelle, records, indicateur_reseau (+ dim.station pour la stratification département)} + - property: dataLicense + value: >- + Données du réseau participatif StatIC (Infoclimat), Licence Ouverte (Etalab) + 2.0 (cf. infoclimat.fr/opendata). Licence propre à trancher au besoin (gate CA). + - property: attribution + value: Infoclimat / réseau StatIC + - property: methodologyRef + value: >- + Kernels identiques à gold_v2 appliqués aux seules obs source='static-ic' ; + transparence qualité (n_obs, taux_qc_valide) au lieu d'homogénéisation MF. + - property: deviations + value: >- + classe_station (siting StatIC) NON sourçable dans le canonique/métadata IC + inventoriée -> colonne NULL (décision 2026-07-18), à renseigner au sourcing. + Indicateur réseau : V1 national, stratification par DÉPARTEMENT (approximation + surfacique ; grille équi-surface = raffinement futur), DOM-TOM exclus. + - property: units + value: Unités conventionnelles (°C, mm), QC plausibilité amont comme gold_v2. diff --git a/contracts/infrahoraire-mf.odcs.yaml b/contracts/infrahoraire-mf.odcs.yaml index c76c3eb..0baeaa6 100644 --- a/contracts/infrahoraire-mf.odcs.yaml +++ b/contracts/infrahoraire-mf.odcs.yaml @@ -18,6 +18,7 @@ description: Unités : la table temps réel (InfrahoraireTempsReel) est en conventions météo usuelles — °C, hPa, m/s (vérifié en base le 2026-06-15). La table historique (Infrahoraire) suit les conventions MF (°C et 1/10, mm et 1/10). + Lecture correcte (NOTE-A, échantillon prod 2026-07-12, amendement ADR-0004) : « °C et 1/10 » = valeurs RÉELLES en °C à précision 0,1 — PAS un facteur x10 ; facteur=1 dans le vocabulaire. limitations: >- Couverture limitée aux stations MF. Les données temps réel peuvent être révisées par la passe historique. Pas de garantie de complétude par station (pannes capteurs). diff --git a/contracts/source-meteofrance-climato-data-gouv.odcs.yaml b/contracts/source-meteofrance-climato-data-gouv.odcs.yaml index 95638f2..3baced5 100644 --- a/contracts/source-meteofrance-climato-data-gouv.odcs.yaml +++ b/contracts/source-meteofrance-climato-data-gouv.odcs.yaml @@ -55,7 +55,7 @@ customProperties: auth: none probeUrl: https://object.files.data.gouv.fr/meteofrance/data/synchro_ftp/BASE/HOR/H_descriptif_champs.csv verified: "✅ open data (sans token)" - unitsNote: Unités CONVENTIONNELLES (°C, 1/10) — pas SI. Indicateur qualité Q* (ou C* pour DecadaireAgro). + unitsNote: "Unités CONVENTIONNELLES (°C, 1/10) — pas SI. Lecture correcte (NOTE-A, échantillon prod 2026-07-12, amendement ADR-0004) : « °C et 1/10 » = valeurs RÉELLES en °C à précision 0,1 — PAS un facteur x10 ; facteur=1 dans le vocabulaire. Indicateur qualité Q* (ou C* pour DecadaireAgro)." descriptor: BASE/{FREQ}/{FREQ}_descriptif_champs.csv (ex. H_descriptif_champs.csv) quirks: - Sans auth (Licence Ouverte Etalab 2.0). diff --git a/contracts/source-meteofrance-dpclim.odcs.yaml b/contracts/source-meteofrance-dpclim.odcs.yaml index 5e983d5..01b22bd 100644 --- a/contracts/source-meteofrance-dpclim.odcs.yaml +++ b/contracts/source-meteofrance-dpclim.odcs.yaml @@ -12,6 +12,7 @@ description: Contrat de la SOURCE API DPClim (climatologie stations, données historiques sur commande) — référentiel stations + commandes de fichiers CSV horaire / infrahoraire / quotidien / mensuel / décadaire / décadaire-agro. Schéma en unités CONVENTIONNELLES (°C, 1/10, m/s). + Lecture correcte (NOTE-A, échantillon prod 2026-07-12, amendement ADR-0004) : « °C et 1/10 » = valeurs RÉELLES en °C à précision 0,1 — PAS un facteur x10 ; facteur=1 dans le vocabulaire. usage: >- Consommé par les pipelines d'ingestion climatologie. Workflow asynchrone : POST /commande-station/{freq} → id de commande → GET /commande/fichier?id-cmde={id} → CSV. diff --git a/tools/build_rgpd_register.py b/tools/build_rgpd_register.py index 8a8df3c..1c23ec6 100644 --- a/tools/build_rgpd_register.py +++ b/tools/build_rgpd_register.py @@ -36,9 +36,15 @@ def check(data: dict, inventory: set[str]) -> list[str]: return errors +def _flat(value) -> str: + """Aplatit un scalaire YAML multi-ligne (bloc `>-`) en une ligne.""" + return ' '.join(str(value).split()) + + def render(data: dict, inventory: set[str]) -> str: n_tr = len(data['traitements']) n_tab = len({t for tr in data['traitements'] for t in tr['tables']}) + meta = data.get('meta', {}) lines = [ "# Registre des traitements de données personnelles — volet data-platform", "", @@ -49,22 +55,34 @@ def render(data: dict, inventory: set[str]) -> str: "d'information, regroupées par finalité. Il constitue la contribution technique " "de la data-platform au registre des traitements de l'association (art. 30 RGPD).", "", - "Les champs juridiques (**base légale**, **durée de conservation**, mesures de " - "sécurité) relèvent du bureau de l'association et sont à confirmer — ils figurent " - "ici en l'état pour être complétés, non comme position arrêtée.", - "", f"**{n_tr} traitements**, **{n_tab} tables** porteuses de données personnelles " f"(source de vérité du périmètre : `inventory/tables.yaml`, flag `personal_data`).", "", ] + if meta.get('responsable'): + lines += [f"- **Responsable de traitement** : {_flat(meta['responsable'])}"] + if meta.get('socle_securite'): + lines += [f"- **Socle de sécurité commun** : {_flat(meta['socle_securite'])}"] + if meta.get('note_juridique'): + lines += [f"- **Réserve juridique** : {_flat(meta['note_juridique'])}"] + lines.append("") + for tr in data['traitements']: lines.append(f"## {tr['finalite']}") lines.append("") lines.append(f"- **Identifiant** : `{tr['id']}`") lines.append(f"- **Personnes concernées** : {tr['personnes']}") lines.append(f"- **Données** : {tr['donnees']}") + if tr.get('destinataires'): + lines.append(f"- **Destinataires** : {_flat(tr['destinataires'])}") + if tr.get('transferts'): + lines.append(f"- **Transferts hors-UE** : {_flat(tr['transferts'])}") lines.append(f"- **Base légale** : {tr['base_legale']}") lines.append(f"- **Conservation** : {tr['conservation']}") + if tr.get('localisation'): + lines.append(f"- **Localisation** : {_flat(tr['localisation'])}") + lines.append(f"- **Mesures de sécurité** : " + f"{_flat(tr['securite']) if tr.get('securite') else 'socle commun (cf. en-tête)'}") contrat = tr.get('contrat') if contrat: lines.append(f"- **Contrat de données** : [`{contrat}`]" @@ -72,7 +90,7 @@ def render(data: dict, inventory: set[str]) -> str: else: lines.append("- **Contrat de données** : —") if tr.get('note'): - lines.append(f"- **Note** : {' '.join(str(tr['note']).split())}") + lines.append(f"- **Note** : {_flat(tr['note'])}") lines.append("- **Tables** :") for t in tr['tables']: dead = t not in inventory diff --git a/tools/tests/test_preseance.py b/tools/tests/test_preseance.py new file mode 100644 index 0000000..d35f067 --- /dev/null +++ b/tools/tests/test_preseance.py @@ -0,0 +1,110 @@ +"""Tests de non-régression de catalog/preseance.yaml (lot A2) : les règles +transcrites doivent rester fidèles aux cas extraits du monolithe (citations +fichier:ligne dans le YAML). Si un test casse, c'est que la table a été +éditée — vérifier contre le code source cité avant d'adapter le test.""" + +from pathlib import Path + +import yaml + +YAML_PATH = Path(__file__).resolve().parents[2] / "catalog" / "preseance.yaml" + + +def load(): + return yaml.safe_load(YAML_PATH.read_text()) + + +def test_yaml_valide_et_sections(): + doc = load() + for section in ("meta", "sources", "sql_combined", "php_live", + "climato_quotidienne", "ambiguites"): + assert section in doc, f"section manquante: {section}" + + +def test_regle_transversale_h_htr_itr(): + """combined.php : H > HTR > ITR — vérifié sur temperature (ligne 28/434).""" + ordres = load()["sql_combined"]["ordres_standards"] + assert ordres["temperature"]["priorite"] == ["mf-h.T", "mf-htr.t", "mf-itr.t"] + + +def test_vent_rafales_fallback_vent_moyen(): + """combined.php:35 — la cascade rafales finit sur le vent moyen.""" + prio = load()["sql_combined"]["ordres_standards"]["vent_rafales"]["priorite"] + assert prio[0] == "mf-h.FXI3S" + assert prio[-4:] == ["mf-h.FF", "mf-h.FF2", "mf-htr.ff", "mf-itr.ff"] + + +def test_pression_pmer_avant_pstat(): + prio = load()["sql_combined"]["ordres_standards"]["pression"]["priorite"] + assert prio.index("mf-h.PMER") < prio.index("mf-h.PSTAT") + + +def test_php_live_exceptions_mf_ecrase(): + """tableaux.php:1643/1665 — pluie_1h et vent_rafales : MF écrase toujours.""" + champs = load()["php_live"]["champs"] + assert "ÉCRASE TOUJOURS" in champs["pluie_1h"]["regle"] + assert "ÉCRASE TOUJOURS" in champs["vent_rafales"]["regle"] + + +def test_php_live_temperature_exception_meteo24(): + assert "meteo24" in load()["php_live"]["champs"]["temperature"]["regle"] + + +def test_php_live_natif_gagne_champs_standard(): + """Contre-revue 13/07 : seuls 5 champs sont gardés !isset (tableaux.php: + 1648-1673) ; visibilite (l.1707) et nebulosite (l.1702) écrasent SANS + garde et appartiennent à mf_ecrase_si_non_vide.""" + champs = load()["php_live"]["champs"] + natif = champs["natif_gagne"]["champs"] + for c in ("humidite", "pression", "vent_moyen", "vent_direction", "point_de_rosee"): + assert c in natif + ecrase = champs["mf_ecrase_si_non_vide"]["champs"] + for c in ("visibilite", "nebulosite"): + assert c not in natif and c in ecrase + + +def test_ordre_chargement_natif_premier_metar_dernier(): + ordre = load()["php_live"]["ordre_chargement"] + assert ordre[0]["rang"] == 1 and "natif" in ordre[0]["source"] + assert ordre[-1]["source"] == "metar-ic" + + +def test_climato_tn_min_tx_max(): + ag = load()["climato_quotidienne"]["agregats"] + assert ag["tn"]["regle"].startswith("min(") + assert ag["tx"]["regle"].startswith("max(") + + +def test_ordre_archives_quotidiennes_mf_prioritaires(): + """Contre-revue 13/07 : le bloc final climato.php:1431-1485 lit les + quotidiennes MF officielles (via Timescale, format noaa) — renommé + quotidiennes-mf pour ne pas confondre avec GSOD (V5_climato_noaa).""" + archives = load()["climato_quotidienne"]["sources_archives_ordre_effectif"] + assert archives["regle"].split(">")[0].strip().endswith("quotidiennes-mf") + assert "noaa" in archives["note_nommage"] + + +def test_ambiguites_documentees(): + """AMB-8 et AMB-9 découvertes par la contre-revue du 13/07.""" + ids = [a["id"] for a in load()["ambiguites"]] + assert ids == [f"AMB-{i}" for i in range(1, 10)] + + +def test_ambiguites_toutes_tranchees(): + """Décisions actées le 13/07 (adoption des recommandations de la + contre-revue) — chaque ambiguïté doit porter une décision non vide.""" + for a in load()["ambiguites"]: + assert a.get("decision", "").strip(), f"{a['id']} sans décision" + + +def test_decision_amb6_semantique_coalesce(): + """AMB-6 fixe la sémantique universelle de la table : un NULL ne gagne + jamais. Toute édition qui la retire doit casser un test.""" + amb6 = next(a for a in load()["ambiguites"] if a["id"] == "AMB-6") + assert "NON NULLE" in amb6["decision"] + + +def test_toutes_les_regles_citent_leur_source(): + """Chaque ordre standard doit citer combined.php:.""" + for champ, spec in load()["sql_combined"]["ordres_standards"].items(): + assert "combined.php:" in spec.get("source", ""), f"{champ} sans citation" diff --git a/tools/uv.lock b/tools/uv.lock new file mode 100644 index 0000000..150d62a --- /dev/null +++ b/tools/uv.lock @@ -0,0 +1,1949 @@ +version = 1 +revision = 3 +requires-python = ">=3.10" +resolution-markers = [ + "python_full_version >= '3.12'", + "python_full_version == '3.11.*'", + "python_full_version < '3.11'", +] + +[[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 = "exceptiongroup", marker = "python_full_version < '3.11'" }, + { 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 = "attrs" +version = "26.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9a/8e/82a0fe20a541c03148528be8cac2408564a6c9a0cc7e9171802bc1d26985/attrs-26.1.0.tar.gz", hash = "sha256:d03ceb89cb322a8fd706d4fb91940737b6642aa36998fe130a9bc96c985eff32", size = 952055, upload-time = "2026-03-19T14:22:25.026Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/64/b4/17d4b0b2a2dc85a6df63d1157e028ed19f90d4cd97c36717afef2bc2f395/attrs-26.1.0-py3-none-any.whl", hash = "sha256:c647aa4a12dfbad9333ca4e71fe62ddc36f4e63b2d260a37a8b83d2f043ac309", size = 67548, upload-time = "2026-03-19T14:22:23.645Z" }, +] + +[[package]] +name = "boto3" +version = "1.43.46" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "botocore" }, + { name = "jmespath" }, + { name = "s3transfer" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f2/e7/976bf3dfe0aa5d7f31bec2f2cf57c79641620c910a39bc843a237aa9592d/boto3-1.43.46.tar.gz", hash = "sha256:66c0d943b049a46a492ec4ec2ebe73c930b1842c7137bee83aad6d93e95d4d96", size = 112654, upload-time = "2026-07-10T19:32:12.498Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ef/1d/c52e66ff32ba7911664e6c4c2ac62e1c6d2d1e7550c7ac185d3f4b70a8a4/boto3-1.43.46-py3-none-any.whl", hash = "sha256:69453e2c1bcb9fd9806527ab99950cacfc2826cb0dce9a3a0414d19270c06c3c", size = 140031, upload-time = "2026-07-10T19:32:11.129Z" }, +] + +[[package]] +name = "botocore" +version = "1.43.46" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jmespath" }, + { name = "python-dateutil" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7d/f1/1917891851ac5ac09bb9f4862b8fc9252a009d7c24e8688bb67e4383d9e7/botocore-1.43.46.tar.gz", hash = "sha256:59f2e1ac3cdc66d191cae91c0804bc41847ce817dc8147cf43eaada8f76a5533", size = 15694635, upload-time = "2026-07-10T19:32:00.437Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0e/f2/4bd8f2f419088feb3ce55f0ca91040ff902f402edfd197450b20a2e1d533/botocore-1.43.46-py3-none-any.whl", hash = "sha256:cb673891e623ae6e6a1bf24d94ef169504f3eb02584adb5d5bee2f6aae819b60", size = 15380350, upload-time = "2026-07-10T19:31:57.616Z" }, +] + +[[package]] +name = "cachebox" +version = "5.2.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/36/f6/85f176d2518cf1d1be5f981fc2dadf6b131e33fefd721f36b330e3434d6c/cachebox-5.2.3.tar.gz", hash = "sha256:b1f68246685aa739bbbd2734befb1465363a1e1042407c154feadb065f17a099", size = 63686, upload-time = "2026-04-10T12:21:35.028Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/13/9e/88193fcb7a2a43fe8ed9d9888374d43fa5c7176aa802651e68b28f1aee4a/cachebox-5.2.3-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:c2c89720547271d36e10cad2c7302bbe11f46eb39eead0a2c321c2d371b8f8b6", size = 374393, upload-time = "2026-04-10T12:20:20.424Z" }, + { url = "https://files.pythonhosted.org/packages/98/8d/e0b13d9bfd43f295cce7824ebaac1970f818a7027c16f290de404934cafe/cachebox-5.2.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e7f33d24e90dc8aa26762e25898c91a1223b66685420a28a3628fa2e006924f5", size = 356318, upload-time = "2026-04-10T12:20:07.518Z" }, + { url = "https://files.pythonhosted.org/packages/bc/02/8ae1b63dbdebb2ebf600523f48b54e9bfb10db5a28551c3432346f49e1dd/cachebox-5.2.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56cb03ec6289a2ac5daf7422d755683324f02d821bfa796087100df2a7ebd5de", size = 395782, upload-time = "2026-04-10T12:18:50.054Z" }, + { url = "https://files.pythonhosted.org/packages/e4/2f/79a8a0057f354581c25a1a00ddabbd5db4b8631d192670d7a0cc4271dbb7/cachebox-5.2.3-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a71a71df463ba4c86bc843fa01c3a2a721033adefad888af28c6b65e1915a75c", size = 353194, upload-time = "2026-04-10T12:19:03.083Z" }, + { url = "https://files.pythonhosted.org/packages/3b/57/a1fead35cf481432bd87def0653cd4a069b1ea5847589255795e49ae74b8/cachebox-5.2.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bbe4655371d19fc9f4f5874312bcb6e5b5b6182989979ac33d93c34c8d10c012", size = 371090, upload-time = "2026-04-10T12:19:16.019Z" }, + { url = "https://files.pythonhosted.org/packages/8c/58/53f1fab8bcc3238fd6c533ef3ab146097986a8acb722863c688a2410c1b2/cachebox-5.2.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4974476d1779961df89d6e6f79e6103a1659289d3ee11c92adcb52e236a8aaeb", size = 390902, upload-time = "2026-04-10T12:19:28.258Z" }, + { url = "https://files.pythonhosted.org/packages/11/2f/5abff74666f8388d2c9516c265f99c33484c827f7fcb3cd703c2f3cbb17e/cachebox-5.2.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad16d733219f4cab3eec6533af30ab7b9c919c6e3e22ad1ef4eb82629a62edef", size = 395855, upload-time = "2026-04-10T12:19:54.207Z" }, + { url = "https://files.pythonhosted.org/packages/dd/11/30b429db12ab5df663aa108bcfac42805f733da65b0bf452f60bfaf4a530/cachebox-5.2.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:12a9e0a93774ca2b3a9fe8a2a0d0812e399fac4af0fce6246a5bca1e7009b8fc", size = 425760, upload-time = "2026-04-10T12:19:41.138Z" }, + { url = "https://files.pythonhosted.org/packages/cd/b4/fdac1bb902b954c03d23eb301d645a328c9664caff5898930fdbd92fde80/cachebox-5.2.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:be89497a011eb7a638d13cc520244d77579c0f515b95bf759b3de0b90a015203", size = 564988, upload-time = "2026-04-10T12:20:34.673Z" }, + { url = "https://files.pythonhosted.org/packages/4e/63/76cd5405b0339f15bf86593258bf9bc5608f10a5e0fa6f37a282b42a6caa/cachebox-5.2.3-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:dd01fc0c1934cccb76493eb4b149a9232d299e5e0275f557adf875c3d25cec81", size = 669110, upload-time = "2026-04-10T12:20:49.039Z" }, + { url = "https://files.pythonhosted.org/packages/d9/bc/52d154aa0407bafce94d1d8d3ff27ca5e842f8311be43cfabdefcbb0f6b7/cachebox-5.2.3-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:a0dfd97b0968f8bd48c33098a03d10f797964559c3a437c84bf97a9973545714", size = 643768, upload-time = "2026-04-10T12:21:04.095Z" }, + { url = "https://files.pythonhosted.org/packages/51/d9/82627eb8cecaf5e7e601bbc65d474a1c3053a2fbc21618ddc6aac19c47dc/cachebox-5.2.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:223ccf7ac60f595def258e7bc74c0b1d6f43991c9cae6d06749c803d22786d99", size = 610047, upload-time = "2026-04-10T12:21:19.469Z" }, + { url = "https://files.pythonhosted.org/packages/6e/2e/cc5b303746418fde00c93ddbc295733b4e2d131d2e8f5afbc6f45f50454e/cachebox-5.2.3-cp310-cp310-win32.whl", hash = "sha256:745b805fdd99931c3ce1d87d2ee21ca3fb62cba6b4e1f674907af87aad73dce4", size = 275529, upload-time = "2026-04-10T12:21:49.84Z" }, + { url = "https://files.pythonhosted.org/packages/31/72/fb10d6f779d041f701b89f0b7830329f51d1846fbc600869f9f7d635b7b5/cachebox-5.2.3-cp310-cp310-win_amd64.whl", hash = "sha256:a87b19c0a3d8d665a9805b5b4afd64b40082395b70ebe2756131ed1edb0c8f02", size = 287988, upload-time = "2026-04-10T12:21:36.41Z" }, + { url = "https://files.pythonhosted.org/packages/81/88/154179d492f2c000fe6efab3c3ff6b8eb94fbfaa09efe47999bce6b1e29f/cachebox-5.2.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:996f49d04b234082530afcc650bdd00556afbebc19c6c0daaafb85950340cb3c", size = 374245, upload-time = "2026-04-10T12:20:22.042Z" }, + { url = "https://files.pythonhosted.org/packages/7d/9d/3b03f2e063161bcb1a5e0969d521b5c622c2da02252a5c8bd4ef0e4f9914/cachebox-5.2.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:23a3300ebbb526fa12ce6fa53699002f5fba6da23b4bbbaf8ba8b18a3f03e6b3", size = 356308, upload-time = "2026-04-10T12:20:09.149Z" }, + { url = "https://files.pythonhosted.org/packages/bb/9b/8da38af731e3832e9f987548e4bfb610d7f3054019e12c44a94ba9272b37/cachebox-5.2.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79c63ee1589364caa04c018405e625d2e44e0bf9994f2715b2f322075d8c45b6", size = 395666, upload-time = "2026-04-10T12:18:51.89Z" }, + { url = "https://files.pythonhosted.org/packages/01/dd/1522aa808f94c904c5eb3640991799fed14dd43c1dd99a9f7b71bd95b1e3/cachebox-5.2.3-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ebd0f8d4ebc3943c1ddcbbdc54f1a8ddf95505c862ed5731319cebd1eb98ae41", size = 353362, upload-time = "2026-04-10T12:19:04.536Z" }, + { url = "https://files.pythonhosted.org/packages/dd/52/95bf883ec9b69a76f3a7d9fb14d015d9a4bdab0143a3eff62ceebc8b1419/cachebox-5.2.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:569966efcc6309aa7d774443e3513cdbb8671efae0158138ba2ebb7d8cc9d8ed", size = 371007, upload-time = "2026-04-10T12:19:17.484Z" }, + { url = "https://files.pythonhosted.org/packages/4b/3d/cc02066d5ccfcb8b35adbaf867977fdb54572cda56ace56da396f0caa3bf/cachebox-5.2.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5774d06f0da37dd566239a4376d6ca8cf983d3e4c3228712ec22b4130f662f21", size = 390670, upload-time = "2026-04-10T12:19:29.685Z" }, + { url = "https://files.pythonhosted.org/packages/b3/50/8e4d59b3e344405d8393d6cc5cc92754d3cc1d81134041ebffd3f5ab73e6/cachebox-5.2.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ae5bf8755bc66bcf42e7ca5c42d703a041a7aaad58f9a0c3be54d5b1cefd2641", size = 395765, upload-time = "2026-04-10T12:19:56.169Z" }, + { url = "https://files.pythonhosted.org/packages/e5/d4/d731cff1c4cec22404bd3ddda05b233c5efaa5f13d7abf4e2728905b7cdd/cachebox-5.2.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:63f061cc6a5ca70bbce2e6be0588fe2fee00a93a1b0581b1086d54b10288cdb6", size = 425707, upload-time = "2026-04-10T12:19:42.714Z" }, + { url = "https://files.pythonhosted.org/packages/36/01/3ec8aadceb0dcc66dbd0b9b32966cf7b6928ed84471424c24d21b0af62d0/cachebox-5.2.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:577c781f18b559f4dc9eea176c6aed008843ef4b8e045cf61bb519e09dccc9ef", size = 564759, upload-time = "2026-04-10T12:20:36.268Z" }, + { url = "https://files.pythonhosted.org/packages/db/23/31cbc8623ecc2e25900f7e8f20f11bfb84786989a59a8046e70b27cbea6d/cachebox-5.2.3-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:7f691e25572a3ddbb018e19d796f774713bd6b0f7ce9be2e71f6e18572de264a", size = 669309, upload-time = "2026-04-10T12:20:51.117Z" }, + { url = "https://files.pythonhosted.org/packages/34/29/5a9e92bdc7b32dc865e73dd776638244f900136daee5bb0591a67e1530fa/cachebox-5.2.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:33368adf86669c29b936fbae5d6219cf90aacd4b1db71dae2e23d584a8219cd6", size = 643705, upload-time = "2026-04-10T12:21:05.882Z" }, + { url = "https://files.pythonhosted.org/packages/04/90/5273a412855fdc11f674e4749aee6d5ec0a91f5c1a9f6e922f7fa0cb7a83/cachebox-5.2.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:38ce67b7b45713e49459a09411d07f82de04022c04aecde6202cd32f934c2b1f", size = 609751, upload-time = "2026-04-10T12:21:21.331Z" }, + { url = "https://files.pythonhosted.org/packages/a1/a4/0fadb5e6a00f373cc3fe56b4415cdea2fc0147f6ec475611762d16eb4b05/cachebox-5.2.3-cp311-cp311-win32.whl", hash = "sha256:a7cd2c81347063ab6c512d0f569aeb5f75fc2dfe686c8486258ffd08052324f4", size = 275485, upload-time = "2026-04-10T12:21:51.563Z" }, + { url = "https://files.pythonhosted.org/packages/03/83/67c1bf83f815294d2c3acd7631f25b5cbe6067e1d56495f76829dd60057b/cachebox-5.2.3-cp311-cp311-win_amd64.whl", hash = "sha256:7e45798d6b969794840bb302857946d710ecb32af78dfcb3ab40f4e68ee7fdaf", size = 288024, upload-time = "2026-04-10T12:21:37.999Z" }, + { url = "https://files.pythonhosted.org/packages/e4/e7/6fa6abfc9c4c07b88f09a88466fa93c7081fd679d8e06f8f558bb4ac845c/cachebox-5.2.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:09c0340e9daa7b4530801e5a570cb0c1a1ad941a85d245d360020d3986d0e787", size = 377791, upload-time = "2026-04-10T12:20:23.87Z" }, + { url = "https://files.pythonhosted.org/packages/3a/79/89e4423352d0ca33bbf80fc1b4b665e654a93de8b16cf41e96fcac81801a/cachebox-5.2.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f3162758792626685ec34950eedd565d015b115d0ff0d751d2716031fc32d51b", size = 359562, upload-time = "2026-04-10T12:20:10.626Z" }, + { url = "https://files.pythonhosted.org/packages/d2/ab/e533c2751e6a3411ebe369277aaed03199b9e4586a48f0a3712a1f4b418b/cachebox-5.2.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a189a780c3ccd7b9d157074ba6bf3e191e522b39abbdb590075111851f02d50d", size = 397910, upload-time = "2026-04-10T12:18:53.336Z" }, + { url = "https://files.pythonhosted.org/packages/7a/0d/b8492d6ca53278499a37c9f9d51afd4ad77bfbe813d6281944d45b97a1e7/cachebox-5.2.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:410b67baa99d433644199b11289627f7ebba4ee5786f95ca9858f238afcee157", size = 353699, upload-time = "2026-04-10T12:19:06.248Z" }, + { url = "https://files.pythonhosted.org/packages/78/d4/fd20b3a5362651303fa12d3ee62f56af2bd396e4a7303d7014a1a1e5b392/cachebox-5.2.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f81474dc19d3865fa5e57263f834bc6bbc00e471a594fb9d934ed552732c02fd", size = 372510, upload-time = "2026-04-10T12:19:18.997Z" }, + { url = "https://files.pythonhosted.org/packages/71/94/3ec55c946d300cc4eaed3a0f79740051ac6e11ef4032421332c6ca15f5d5/cachebox-5.2.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:85ccd827193b3e3e887a88a16b88ef7ed174e7e65be515b5253322aa75e665c3", size = 392802, upload-time = "2026-04-10T12:19:31.196Z" }, + { url = "https://files.pythonhosted.org/packages/01/b1/1a3c4e436ad8a4c4ba3e70f4c62e1f927cbbb3c943a9bba5813b8b815bde/cachebox-5.2.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2a1e7d3cb8a5e7e68996a8619e3ef8771a124d14568c251f9e586eba88d759c1", size = 398223, upload-time = "2026-04-10T12:19:57.583Z" }, + { url = "https://files.pythonhosted.org/packages/0a/ea/d36ad3976c4396b350b96a1582411b7a00e56c144eec0bb5ba5f36ce7d86/cachebox-5.2.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:adcedfcfcb933b21e7fdcfe560c79887bc8287abceab0586aa3730417dd0277d", size = 427696, upload-time = "2026-04-10T12:19:44.361Z" }, + { url = "https://files.pythonhosted.org/packages/a8/36/71845b5c7a9ffbd85e6fdb470c11a174f499bd5238fa37b1214157c2454d/cachebox-5.2.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c7f0c72c51a3a9e7049ea6ff2a43cd3877ab7fee966eb65771a59621563b75e3", size = 567854, upload-time = "2026-04-10T12:20:38.357Z" }, + { url = "https://files.pythonhosted.org/packages/e8/a2/baf0e5a8392e64e352b137ccd7356b3d98068c842fd19f510a7790c05d34/cachebox-5.2.3-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:c48c10e498d573511aafbd545570e7f43b40a7428dc282183bf5adc334d9e1a8", size = 670306, upload-time = "2026-04-10T12:20:52.903Z" }, + { url = "https://files.pythonhosted.org/packages/a5/22/cd4e4c1d624b8ef9fb4b8bebf0bf5d2d74a399cf1ac46b667bb79d15359a/cachebox-5.2.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:2f1e086ab5ffd082a68bb63699d517655a59b06414927bfc84e01df91b81e34d", size = 645943, upload-time = "2026-04-10T12:21:08.238Z" }, + { url = "https://files.pythonhosted.org/packages/0a/d6/55859981f5ec6a9e412baaa4db6aa5973a00008750b3f054cdefcb6491fc/cachebox-5.2.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:649d18399f13735bb82daa33800196f815529c49e967767c40ca221723e68afa", size = 612309, upload-time = "2026-04-10T12:21:23.404Z" }, + { url = "https://files.pythonhosted.org/packages/d7/1e/313f650467ac85824c4199188f8f1ee3386cd12eb665dbf7c88d372e4956/cachebox-5.2.3-cp312-cp312-win32.whl", hash = "sha256:0a17aeb4e5b1c6ef1c3db8fc5186f9986e215ba5ea5a5d08baa45bcf55f261b2", size = 279789, upload-time = "2026-04-10T12:21:53.215Z" }, + { url = "https://files.pythonhosted.org/packages/c5/50/3b334f887accfa811cf5c7533b8ce22c523eb009363a86401198899dadd2/cachebox-5.2.3-cp312-cp312-win_amd64.whl", hash = "sha256:cfd69114141ab362acaa2099e425a1b965cf7b021a539a4e953143d593930b74", size = 290917, upload-time = "2026-04-10T12:21:39.696Z" }, + { url = "https://files.pythonhosted.org/packages/31/3b/16d5c295f6ec2913ef595b39986dc7b7cc179fdd2e73f5ebd1814c38fd51/cachebox-5.2.3-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:9527c5c70f8735f2d696331d8bcf77254f03b4dc8542046807823bd36ed4e8ba", size = 377408, upload-time = "2026-04-10T12:20:25.444Z" }, + { url = "https://files.pythonhosted.org/packages/cd/87/45f834154f79721e5b64a80ffab4f9710834c4f9c01fa977f94a9116c32a/cachebox-5.2.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:40ac878af00d5969862c1f6bc076de1e34ca248662fce6aecca1761f52e33e32", size = 359274, upload-time = "2026-04-10T12:20:12.127Z" }, + { url = "https://files.pythonhosted.org/packages/46/17/794e5f93e0a172aa14ecd692f6d89bdf094f71eb35fa923d0a0af25cef1c/cachebox-5.2.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5ff26bfd8f7e95b3becf6d5f65c25edaca50fa68078868648b70d79bcccc260", size = 397520, upload-time = "2026-04-10T12:18:54.807Z" }, + { url = "https://files.pythonhosted.org/packages/23/19/9470b1a96de6e480192b1a92b2fafa72aa052efc2509a5418a5652205b33/cachebox-5.2.3-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:82e7002dd343afeeba2fcf0e483131b342a27ec3bc34b2214dc617691bda40d6", size = 353183, upload-time = "2026-04-10T12:19:07.797Z" }, + { url = "https://files.pythonhosted.org/packages/6c/2b/72813f80397ed4640e337cbd1a14ab7eaafe33e479291d3623b6a6a55fec/cachebox-5.2.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ccbdc54a6c4b5758408c1083bdfa217bd382894a8331c7d0a54b84ba0cf51e5b", size = 372239, upload-time = "2026-04-10T12:19:20.44Z" }, + { url = "https://files.pythonhosted.org/packages/05/17/47dc9687288fa55486573627089ecd9aae124de5924a4bce008af96d80b6/cachebox-5.2.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:df5135a168f143d186b1cc3be0ca16b66446897ab5cedc03bd80bcc926fcd403", size = 392568, upload-time = "2026-04-10T12:19:32.73Z" }, + { url = "https://files.pythonhosted.org/packages/13/95/450765b971a3bed9d7cf003c3833c1976482eb83b0241b6dbb840a25b43b/cachebox-5.2.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10bedf96db8f9766cc956f9adcc623e604264e5d6fa2e255432f8c2ed7519143", size = 397920, upload-time = "2026-04-10T12:19:59.314Z" }, + { url = "https://files.pythonhosted.org/packages/5f/3e/dd8f4c1f92e58d479913ce9cbaa3227c911128e6046c82f4fd44309f685a/cachebox-5.2.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f22732d0d69bb84ad2dca7480bffdfd0430c647152d488936e152ecbbfee52fb", size = 427332, upload-time = "2026-04-10T12:19:45.888Z" }, + { url = "https://files.pythonhosted.org/packages/7e/20/80d8c26ce63e78da3874a5bb07a3a78de53a2b0356ba80583a4927f0a074/cachebox-5.2.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:26ae0b68979204d360327f4c0725cfdc95cfc34ab73ab1a8f528e3bd2f6d023c", size = 567494, upload-time = "2026-04-10T12:20:40.373Z" }, + { url = "https://files.pythonhosted.org/packages/10/35/7249885dfed3602b3b48c1e67781197dcdc536c50f72caeabe3944348af8/cachebox-5.2.3-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:f3d628b816e28a6e7661d460e02dd5b421247cc2cd275814f80ea79621245fc4", size = 669968, upload-time = "2026-04-10T12:20:55.155Z" }, + { url = "https://files.pythonhosted.org/packages/2d/8a/e5b58f0bbd6fef74da5d8e5ab49e67898ce7e6df28c16280a0f2b78461f7/cachebox-5.2.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:64057caa6b741320655cd3c5997fe642dae5dbff571eb530e6f53e58272bb43b", size = 645547, upload-time = "2026-04-10T12:21:09.948Z" }, + { url = "https://files.pythonhosted.org/packages/d8/25/51783a4c6f25ca87ef1b4b762ff0364bd98053a02d597b30d26ff4cf13c5/cachebox-5.2.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa325306084aa2dc0b21e07723d7700f4d43dece3732c7fdaf7a269dc5e35aa7", size = 611844, upload-time = "2026-04-10T12:21:25.286Z" }, + { url = "https://files.pythonhosted.org/packages/c5/c5/b26c4b046e296d0e249448fe297626b3caca2e851837712f03c358662cb7/cachebox-5.2.3-cp313-cp313-win32.whl", hash = "sha256:55003089d21c2f5515089c307be063b45558e884a4a1cc9593944374c89975c4", size = 279421, upload-time = "2026-04-10T12:21:54.921Z" }, + { url = "https://files.pythonhosted.org/packages/e0/7f/a49420670393bfea618de7a893d45cae9294cf3293d7b158e7af20e8f39e/cachebox-5.2.3-cp313-cp313-win_amd64.whl", hash = "sha256:dcc5edb6ecf2b516e90b773d232360c5e4ed8fdcda038b19441da2ed9cf208ab", size = 290702, upload-time = "2026-04-10T12:21:41.458Z" }, + { url = "https://files.pythonhosted.org/packages/c9/0b/bf83bda13ef6fc490d208a1d4dd712034624526a88f61713cca0edc9884f/cachebox-5.2.3-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:a4b7559fa4994c4032dd07466c2041d57e055feb814762e1f73f4e8beef188d0", size = 371704, upload-time = "2026-04-10T12:20:27.253Z" }, + { url = "https://files.pythonhosted.org/packages/8e/ea/aa5162273238e84f9e41b33600c69299572dc1c8f0f768d07660b71be07d/cachebox-5.2.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f57afada3d9327adf87f3b5cf0094348c6fd49354ab2e9bd20b044648eb094ae", size = 353385, upload-time = "2026-04-10T12:20:13.668Z" }, + { url = "https://files.pythonhosted.org/packages/47/96/3ca013e2e48df5c1d7855669b208f4bf8014ccb842ccf7a3a0eaac07bee0/cachebox-5.2.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8342ff350ce86f062492752d612e9f056ac5dc56375713d75c3bf6e83b4d18db", size = 392181, upload-time = "2026-04-10T12:18:56.385Z" }, + { url = "https://files.pythonhosted.org/packages/63/ca/1bacb4efa0b0ce8065d1fb7c8dc7c382ec4e1cc3f007eb08417732be2725/cachebox-5.2.3-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:405f9cc8492fc9d953b5a6b9e2b661e99583755c6639ab8d09a287fdf336503c", size = 349494, upload-time = "2026-04-10T12:19:09.505Z" }, + { url = "https://files.pythonhosted.org/packages/d7/2e/75db4bda3768658f5baa5a54f6a4f643bc2de1a16788e40581a080e803c7/cachebox-5.2.3-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:94aae393ec1d9b26565d346445bb6afa3963d2a0d3eb5e4188d0e510fab871a0", size = 369216, upload-time = "2026-04-10T12:19:22.224Z" }, + { url = "https://files.pythonhosted.org/packages/f5/82/e1f833be0d57e29a8c5eb0a0275cd34b962f3c7f5b9e0517ec4bf75e7cc3/cachebox-5.2.3-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8b0b575066fc09f6fae0d4bd30d6ff56584a6870cbe7d202916c5e0d725cfd4", size = 385922, upload-time = "2026-04-10T12:19:34.198Z" }, + { url = "https://files.pythonhosted.org/packages/53/d6/615a3c16c1d63839f2c67644eb414c4dc9769ab2e169d935110fd8e268d5/cachebox-5.2.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:41e99c1240106d39b63ce7868a6cd8c9da9243fef08848b85d428164e0769fd2", size = 393276, upload-time = "2026-04-10T12:20:00.925Z" }, + { url = "https://files.pythonhosted.org/packages/2f/a6/7844c9c84b170dae1005b22da174639968e64c8055d66a209a1598663771/cachebox-5.2.3-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:432ca62b99f7eafc21af669d76c88c1b7377db179b89fb6fca3ea93b8f9fff19", size = 421355, upload-time = "2026-04-10T12:19:47.691Z" }, + { url = "https://files.pythonhosted.org/packages/c9/0f/43f62355846cae3dc41cb4daccac0a4bb2b7b8b3c7d77d1b6a220bae6d54/cachebox-5.2.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:e51d9c59006b53447f806145406eb37a7fc3c25553d4fd24c3887f3b268d214e", size = 561656, upload-time = "2026-04-10T12:20:42.161Z" }, + { url = "https://files.pythonhosted.org/packages/9b/fc/a453813c6d000d69a41a06c6a3143a6c4d0d0e41f23c155db2f82ea0edfa/cachebox-5.2.3-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:5e48a405f699fb001b8af120a6e0b4a981277f84eb5dd66a1faa21e4b6fe9485", size = 665791, upload-time = "2026-04-10T12:20:56.842Z" }, + { url = "https://files.pythonhosted.org/packages/aa/a3/f6a9e75f1e602b67b6d67088a9a766adfc4e0a740a9c4b68e4e6207c1006/cachebox-5.2.3-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:8cbfc007ea78af61d75d7d26e5854df53dc5da6877d074afd4b4696c074f4ee7", size = 640975, upload-time = "2026-04-10T12:21:11.641Z" }, + { url = "https://files.pythonhosted.org/packages/a3/15/4ac98277f7fd9d855c8ed337e8e2a3386d17997cce2dd3eadb23dedc08e3/cachebox-5.2.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6a94d0da8133b3a0707ae11c9ea321f8fc37e3b5a14517019a05d632218b0f56", size = 607242, upload-time = "2026-04-10T12:21:27.27Z" }, + { url = "https://files.pythonhosted.org/packages/9c/0b/ce61907a803f75854e0cc91b84c16e14dce0e4e939efbda26293eb4c8784/cachebox-5.2.3-cp313-cp313t-win32.whl", hash = "sha256:5fee33549877c03c2494ec5359a57a7667f872fe8e296a7f39d3dfe08dd3914c", size = 271619, upload-time = "2026-04-10T12:21:56.768Z" }, + { url = "https://files.pythonhosted.org/packages/b0/06/fece190ad5173d06b2779494aaad5528907f2e55c809618e5b67c2e3dbb5/cachebox-5.2.3-cp313-cp313t-win_amd64.whl", hash = "sha256:67548a05cd41fcc4f7af80a2f97f742fef3d436537ac2e1a1dce0fcba5d41190", size = 283133, upload-time = "2026-04-10T12:21:43.037Z" }, + { url = "https://files.pythonhosted.org/packages/b8/8b/72c0e80aad08e09867ce14a621bce689a733552f20cdf2ef96d4b052da10/cachebox-5.2.3-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:37fa0891f0defee053c09f5f43f802f731e36e6e6ca055d7d174af07f77232ca", size = 380523, upload-time = "2026-04-10T12:20:29.345Z" }, + { url = "https://files.pythonhosted.org/packages/fc/62/33aaade81b181d5191cc39c867c297aa7c65f3191aa9749bf99b77496b88/cachebox-5.2.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:dc6315902f2ef4afbf10bc8e08c54ff34de5ce124546b8e0016c9b0d327be21e", size = 362424, upload-time = "2026-04-10T12:20:15.215Z" }, + { url = "https://files.pythonhosted.org/packages/9e/0b/3eedaf9ea4b41c931f4340bfa42056efe2bb5fe3a79649d6c8a1dce585a5/cachebox-5.2.3-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7df1735ca778480d51b8232fed397ffe3935158f20d34fb1c5ed171b53d5a6e2", size = 399572, upload-time = "2026-04-10T12:18:58.331Z" }, + { url = "https://files.pythonhosted.org/packages/be/69/c79b8a6a5b889ac4a60800bacea3553cb3b86f6fd13b2262bade1cb962c6/cachebox-5.2.3-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e22451cde8f884051e941b21870e4fc91fcf58d0d8c285bb8964107e1f02445c", size = 353803, upload-time = "2026-04-10T12:19:11.21Z" }, + { url = "https://files.pythonhosted.org/packages/d4/c3/bc7838de51039f8c50506d8dc82f22ff9a652794339a223b12af595e1d2f/cachebox-5.2.3-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dcbccf3015d9a42bcf41260fa5cc048a5bdb75aa10997d514d6c976117f30ee2", size = 374474, upload-time = "2026-04-10T12:19:23.658Z" }, + { url = "https://files.pythonhosted.org/packages/65/61/e5231ad2ae952ca482f9b9df55df4b96add1a80de28de537c5f574605987/cachebox-5.2.3-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:311eae5079e256cbbfafdc3dcff1714b6598a767f9c1ef8c3709e74ea0cc12b0", size = 393045, upload-time = "2026-04-10T12:19:35.651Z" }, + { url = "https://files.pythonhosted.org/packages/78/c4/c9b3fa764ac5420a9e079ad53fa8840d4a26b74c4ccda56acbef49cf76ff/cachebox-5.2.3-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f4d2a80a5cd3380739c67f7d89e596634f5897b8d5a4a3dc1598312cb077535", size = 398700, upload-time = "2026-04-10T12:20:02.513Z" }, + { url = "https://files.pythonhosted.org/packages/9b/3e/c4e3acd4cb04e01c5fb7cc7a4de16059b9594d90672fff85af8670275267/cachebox-5.2.3-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3977515b727a5203f494c44c4566fb936c4b940351c01d3d8e7b5d104dff4f53", size = 426725, upload-time = "2026-04-10T12:19:49.385Z" }, + { url = "https://files.pythonhosted.org/packages/25/5d/610b79479719951581109d985244d34c97f86a308c3d7c83443e2b1dac46/cachebox-5.2.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c5be17dd5c4fabcfecd5bcf6d54f9c6fb719daed3ef01ac1c03a14af0e2b26c1", size = 570042, upload-time = "2026-04-10T12:20:43.793Z" }, + { url = "https://files.pythonhosted.org/packages/8c/63/cad8a05db4d0c0f5ba6bccb32e57d15c472276de9476f56004445b40711f/cachebox-5.2.3-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:6d37334fc218fdaee31db8a4f938938716e7c3b1b4059e25de27c8447fc95fde", size = 670974, upload-time = "2026-04-10T12:20:58.528Z" }, + { url = "https://files.pythonhosted.org/packages/54/d1/9cff7c2b9048d1c38b7ad8199ce856596d09720b3bea74043f3bad71970b/cachebox-5.2.3-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:1e5f1b7e23411b748d919348c3b65db1f9f8927ab8f6f3acae19bd617543df2d", size = 646213, upload-time = "2026-04-10T12:21:13.619Z" }, + { url = "https://files.pythonhosted.org/packages/27/ae/2e1ad162ec13903e84469c8a753baf385f1bc324279d6c7cb6365e7099df/cachebox-5.2.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:e7b06a75a898b31fd73c4d8bf727a9b9f8b5b7738cccd0ab5e6fd2a9cf659d3c", size = 612787, upload-time = "2026-04-10T12:21:29.271Z" }, + { url = "https://files.pythonhosted.org/packages/c8/8a/07b5ffd841e1ff534bb6e8721c39fdfe0d7cdaac1398e1783b2a0c37bd22/cachebox-5.2.3-cp314-cp314-win32.whl", hash = "sha256:3b798052719f09a2ce7bf9fa9452dc0a7d4dc53b50a2d3aba6ce6ebc12d39df7", size = 278559, upload-time = "2026-04-10T12:21:58.482Z" }, + { url = "https://files.pythonhosted.org/packages/c4/f8/b88a82ce9ec7a2fa0f09ed1cdd031692c8664c41f9ab71831e177c7ce2df/cachebox-5.2.3-cp314-cp314-win_amd64.whl", hash = "sha256:4afc8b8575e3228a42ad8d819de5fbbecc6bd0b521295966b00244be37ae3b9b", size = 291928, upload-time = "2026-04-10T12:21:44.621Z" }, + { url = "https://files.pythonhosted.org/packages/4a/01/8c79c07c8c6517fb2fe7d479dd87044e38aac5b9af0245b33fcd695eae37/cachebox-5.2.3-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:0e8a34b82be30d3d9fb7dfaf9a86ec2b3ab9bc264715909ef27fc3d3587324d2", size = 374325, upload-time = "2026-04-10T12:20:30.923Z" }, + { url = "https://files.pythonhosted.org/packages/7f/51/0fc26b923e80ab857ac99d5f7f3784dc941e7b4de361c204835233176ddf/cachebox-5.2.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:4d4e336aebf866463878ccd28a4d0ef4003ea216708cf4a02a7f198481b3af81", size = 355444, upload-time = "2026-04-10T12:20:16.879Z" }, + { url = "https://files.pythonhosted.org/packages/c1/6d/a6b399221f8dc4b3e01b37d3240ef5b8a7eb78cd9bfbb99b0e655dd01649/cachebox-5.2.3-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b102fcdd97b0602bf5d6ba1a571bba3e3d6fa912b89fd768b0da5427408eab8", size = 393978, upload-time = "2026-04-10T12:18:59.753Z" }, + { url = "https://files.pythonhosted.org/packages/bd/f1/4c8f998c117c1941a82bd824d6687280c50167f21fea6392e41531d641e2/cachebox-5.2.3-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:245a79fb2c5d3bff252f4263f76210ef3ad7c2ff9b0234859b26974830a80491", size = 349298, upload-time = "2026-04-10T12:19:12.843Z" }, + { url = "https://files.pythonhosted.org/packages/d1/dd/683bc5a32a0da660d02fa248b880b71a2b834e9b54b8d272b5801282f402/cachebox-5.2.3-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dd0e8dbd8fd4cf664c645c08f9e10508e133353756705c4a738e90a5406224b5", size = 370619, upload-time = "2026-04-10T12:19:25.298Z" }, + { url = "https://files.pythonhosted.org/packages/81/49/d6c47c78a7769b355076c5b635c2b538c8b88e8ceeb408e104d0f269b515/cachebox-5.2.3-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fdb74294bdc33e39e26606919a9b2229038d5fac0edb80c9056683c08584d4a9", size = 385988, upload-time = "2026-04-10T12:19:37.638Z" }, + { url = "https://files.pythonhosted.org/packages/70/e2/b669555ada7fa1392e4cdb8a19f3367db5c6abef0fde8ab034a9747760df/cachebox-5.2.3-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bba3e9a7f52fa196b434522f39675f3b32a076976ef2373ded6f1065e99f4d20", size = 394090, upload-time = "2026-04-10T12:20:03.978Z" }, + { url = "https://files.pythonhosted.org/packages/8f/01/42916249e53fe4fcbdf0419fb55dbc09b9f377475376e1d7f4ae9c9bd6cd/cachebox-5.2.3-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:abb21f0f937fb66528f1b9f1a04874d6aa503e78bbb26f4cf33bf67faddbdd68", size = 421632, upload-time = "2026-04-10T12:19:51.048Z" }, + { url = "https://files.pythonhosted.org/packages/a1/54/34eebe18c6ed8ba27b1331b5e3d08bd8bb62f03ba81fbf47a2db0fa646f7/cachebox-5.2.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:dab6fd3189b0c746fb03e1915fd947aaca9112cedf26ef3a0c39383acf87d2e5", size = 563871, upload-time = "2026-04-10T12:20:45.417Z" }, + { url = "https://files.pythonhosted.org/packages/ba/b2/f92da0d54e4f18609588709090de8c81dd7c8b20ed6ac30f9b91bedbedf5/cachebox-5.2.3-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:b4e7d2935b9df11d3717f99c7237b6780f1f8c70e6a99b69b8430d89929ec825", size = 665677, upload-time = "2026-04-10T12:21:00.512Z" }, + { url = "https://files.pythonhosted.org/packages/43/9d/bf2d3dc949afe4d21fc7eb15b7524255e834b9252df6bba111e6686d1c6f/cachebox-5.2.3-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:611aa260fe1b2506330ff72f415e2cb4053c9c4e3776ac68fe2eedee0e1b91b1", size = 642067, upload-time = "2026-04-10T12:21:15.727Z" }, + { url = "https://files.pythonhosted.org/packages/6e/4f/a789eda189550d239fbaf165b9810f148e733e97a2a4eda7c4192295c7f8/cachebox-5.2.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:a424ffb8514a9cb49bacff7995b7c767625cb2239692bd6524245e8579e375cc", size = 608048, upload-time = "2026-04-10T12:21:31.156Z" }, + { url = "https://files.pythonhosted.org/packages/41/c3/590e161c04ffbd36e33933e6dcca5ffa40b5548e3121a21d77aad42af138/cachebox-5.2.3-cp314-cp314t-win32.whl", hash = "sha256:83988dd8e9075ee837e8407e26db49a9944ae74924d5db57b477444d7d98622c", size = 271694, upload-time = "2026-04-10T12:22:00.589Z" }, + { url = "https://files.pythonhosted.org/packages/66/f4/f60b8506df467261178afe918801df37c02c46ec2b8ce019760a14e2abe7/cachebox-5.2.3-cp314-cp314t-win_amd64.whl", hash = "sha256:dbda6390fa5070a19157ae35ab8066d3fe468634e0e9e21452c68ce7999c7d0c", size = 284212, upload-time = "2026-04-10T12:21:46.241Z" }, + { url = "https://files.pythonhosted.org/packages/ce/7b/5eead1ca0d437b1993a742c6571079ae58ae4db50d94d42e87b514aed6c3/cachebox-5.2.3-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:c798cddfb780156db09d3d96ed5da4c2d5fc01dad4bc7b54db5b20c34f221926", size = 376199, upload-time = "2026-04-10T12:20:32.674Z" }, + { url = "https://files.pythonhosted.org/packages/77/e3/5e45042f9b552a5087cafc2e0fed834e632531fca17818201d72e78593ce/cachebox-5.2.3-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:c8f3de4afeb3fd721620be3d02f2338bcbc3fdbd464ca14e1c474088c9669db0", size = 357109, upload-time = "2026-04-10T12:20:18.554Z" }, + { url = "https://files.pythonhosted.org/packages/d4/51/3c4743b718b42e4b80166fa61f8722b603eba7bf206768a7892c4699dce7/cachebox-5.2.3-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b39022c258872185327acffa9ad42d6bdf42f37d006d35c825a684eb5fa98d40", size = 396433, upload-time = "2026-04-10T12:19:01.463Z" }, + { url = "https://files.pythonhosted.org/packages/f8/9b/678da91187bdb2836db2b8da62519da75359b46bc28697799a7caa314519/cachebox-5.2.3-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5a0599fb85dcb6df9a86502435643fe90c793bbcd50b5d85217c70f2bc2e38fc", size = 354287, upload-time = "2026-04-10T12:19:14.55Z" }, + { url = "https://files.pythonhosted.org/packages/df/06/769446da6c9f2855499aaa19e2d7260aa47934bc2e15a931e5b737f8685a/cachebox-5.2.3-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3cdbe8f1b7716a44dc82ef3a6830a612260c7379478cfa80804632e2e6252b8e", size = 372507, upload-time = "2026-04-10T12:19:26.763Z" }, + { url = "https://files.pythonhosted.org/packages/79/cf/86c60994a7be734abef0395e440dc11714f84ffcd369cbcd8e61c3d58126/cachebox-5.2.3-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:783d1b9a0b3c77c43e7ae331b9d6561ad75827e16b2484e2a6cc289ec4d392ee", size = 390831, upload-time = "2026-04-10T12:19:39.591Z" }, + { url = "https://files.pythonhosted.org/packages/9d/db/acfb55f8d5ee4ea1c5f2d32ede25d4d04e944ba09d2832c27c085022490d/cachebox-5.2.3-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5c6476a2a842906fee782d92f8fbcb03ecfd22eecc39adb7fb5b047d7e1cf020", size = 396277, upload-time = "2026-04-10T12:20:05.735Z" }, + { url = "https://files.pythonhosted.org/packages/dc/4f/35e27e85a48e15671c5863addcabde910eb311800a621c3e47c04bd36d17/cachebox-5.2.3-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:184bbcfa1370415b6d1f09e4fb74ab697dac8df09f522aa217a2fac65f973744", size = 426980, upload-time = "2026-04-10T12:19:52.622Z" }, + { url = "https://files.pythonhosted.org/packages/09/4b/50f2cadf20c02db9e449f2e9fee95f3eb5768ab1804dd0a5eba6c98119ad/cachebox-5.2.3-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:f89df36b46f8f5e11c0c49701ec3cebddf51191f96afb7bb75c394faf3c1cbc8", size = 565539, upload-time = "2026-04-10T12:20:47.051Z" }, + { url = "https://files.pythonhosted.org/packages/43/53/b8e948cadb48b8bcf1d13c2aa4a788ff0e95b50ddb808c18e998499b4680/cachebox-5.2.3-pp311-pypy311_pp73-musllinux_1_2_armv7l.whl", hash = "sha256:fb0bdcd9e28686e3b91d5210c843542858f0f10de151181aee27a7978fe4992e", size = 670870, upload-time = "2026-04-10T12:21:02.141Z" }, + { url = "https://files.pythonhosted.org/packages/29/7b/d68ca3f59a9d6963c2f6b19bc4b1926a37db2e4a4f6c9891d12788e49ce2/cachebox-5.2.3-pp311-pypy311_pp73-musllinux_1_2_i686.whl", hash = "sha256:5196f0d2c2f99c92ddf0d2c37803ff90509d14a5df211b7754feb8b61ffd8740", size = 644542, upload-time = "2026-04-10T12:21:17.541Z" }, + { url = "https://files.pythonhosted.org/packages/f8/c8/44ae6d5dff09f044d61a92591e6a8db17f3b2ee51a54d375cce90271527b/cachebox-5.2.3-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:73671850d8c3634ab217398c83715d3feb52589ec97bd8e2f4d22e472741ea48", size = 610235, upload-time = "2026-04-10T12:21:32.93Z" }, + { url = "https://files.pythonhosted.org/packages/9a/1b/31cf2449da9a296f6c6c0002c7ae91a25c3a4bfef071763bbeb85300b402/cachebox-5.2.3-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:70c718f6bb77e6ba142b9a055b81ce85412a0c0e5e82a154489b45e6f91d09ec", size = 287614, upload-time = "2026-04-10T12:21:47.909Z" }, +] + +[[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 = "charset-normalizer" +version = "3.4.9" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/bd/2a/23f34ec9d04624958e137efdc394888716353190e75f25dd22c7a2c7a8aa/charset_normalizer-3.4.9.tar.gz", hash = "sha256:673611bbd43f0810bec0b0f028ddeaaa501190339cac411f347ac76917c3ae7b", size = 152439, upload-time = "2026-07-07T14:34:58.454Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ad/81/8e983840c6e5b93b33c2ba81aa3d52c2e42f0e9a690ce7607a2e61da4a5c/charset_normalizer-3.4.9-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cd6280cf040f233bd7d3407b743b4b4c74f70e8e1c4199cb112a62c941c0772a", size = 322240, upload-time = "2026-07-07T14:32:36.236Z" }, + { url = "https://files.pythonhosted.org/packages/de/d1/b4319dc3229d8272fba305e206fc0a148e2de8d4087917ce62ae6382f359/charset_normalizer-3.4.9-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:aa99adc8f081b475a12843953db36831eaf83ec33eb46a90629ca6a5de45a616", size = 216475, upload-time = "2026-07-07T14:32:38.142Z" }, + { url = "https://files.pythonhosted.org/packages/80/33/6c99c1b3e6b8bf730e1bc809b9a2608f224145069114c479a2e9e1494346/charset_normalizer-3.4.9-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c1225416b463483160e4af85d5fc3a9690ccb53fd4b1865a6437825f5ede3209", size = 238670, upload-time = "2026-07-07T14:32:39.658Z" }, + { url = "https://files.pythonhosted.org/packages/7f/f4/ffbb83546e1f198ecc70ecd372b65cf2b50f9068b380abd67640f17a8e18/charset_normalizer-3.4.9-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:16d10d789dd9bcca1173c95af82c58433122564b7bc39385124be735a35cbe99", size = 233476, upload-time = "2026-07-07T14:32:41.155Z" }, + { url = "https://files.pythonhosted.org/packages/e8/5f/b98b8da398637b551e427e7be922bdec19177dc54d6811dcdaa503f23aac/charset_normalizer-3.4.9-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9bb41182d93ea91f60b4bc8fbf4c820c69ef8a12ab2d917f3f1834f1acad07e8", size = 223817, upload-time = "2026-07-07T14:32:42.592Z" }, + { url = "https://files.pythonhosted.org/packages/36/31/a276bb2e66243072a3fd06fdcab9cbb61a305b02143d70d2bda21d888fa8/charset_normalizer-3.4.9-cp310-cp310-manylinux_2_31_armv7l.whl", hash = "sha256:bcf74c1df76758a395bf0af608c04c82257523f55c9868b334f06270d0f2112b", size = 207974, upload-time = "2026-07-07T14:32:44.258Z" }, + { url = "https://files.pythonhosted.org/packages/5e/be/7ee4453d7e88dfbc4104ccd34900b9f2c7c17dac22881865fe0e82424a25/charset_normalizer-3.4.9-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b5314963fce9b0b12743891de876e724997864ee22aa496f903f426c7e2fa5b2", size = 221655, upload-time = "2026-07-07T14:32:45.64Z" }, + { url = "https://files.pythonhosted.org/packages/1d/85/181c652953eb5276d198f375b1dd641047392050098100a3a02d6534f657/charset_normalizer-3.4.9-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e9701d0049d92c16703a42771b98d560b95248949f23f8cf7b4eddd201814fb9", size = 219229, upload-time = "2026-07-07T14:32:47.376Z" }, + { url = "https://files.pythonhosted.org/packages/0c/e7/aaf6da33fc9f4691cda8f7efbc9f69179d3d39ec8a4799baf273ee1d8db0/charset_normalizer-3.4.9-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:65a7ff3f705e57d392f7261b6d0550fe137c3019477431f1c355e0db0a7d3e15", size = 209704, upload-time = "2026-07-07T14:32:48.855Z" }, + { url = "https://files.pythonhosted.org/packages/63/01/f2fb3bd3a73be48b173ee0c6aa8d2497af97d5663a8c4c4b491de4c62f7a/charset_normalizer-3.4.9-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:79580094b00d1789d1f93ea55bc43cb2f611910c72235b7657f3482ddcc1b22d", size = 226243, upload-time = "2026-07-07T14:32:50.239Z" }, + { url = "https://files.pythonhosted.org/packages/c4/02/c57a22739fe05246b0b5783b3bfb6afaac4eebb46f3ececdfb2f048f780e/charset_normalizer-3.4.9-cp310-cp310-win32.whl", hash = "sha256:432786d3561e69aeeae6c7e8648964ce0ad05736120135601f87ac26b9c83381", size = 150935, upload-time = "2026-07-07T14:32:51.676Z" }, + { url = "https://files.pythonhosted.org/packages/37/8d/ca39a7559a4797505530d084fd3a49a2c959efbbbff146302fb7be4e3b35/charset_normalizer-3.4.9-cp310-cp310-win_amd64.whl", hash = "sha256:8c041122946b7ba21bb32c45b1aa57b1be35527690aeb3c5c234521085632eee", size = 162314, upload-time = "2026-07-07T14:32:53.193Z" }, + { url = "https://files.pythonhosted.org/packages/01/da/a44bd7a13d426e69e4894557106cd58669097bfad4a8681123b618fbfc5d/charset_normalizer-3.4.9-cp310-cp310-win_arm64.whl", hash = "sha256:375b83ed0aecfce76c16d198fbc21f3b11b337d68662bea0a995046682a11419", size = 153075, upload-time = "2026-07-07T14:32:54.554Z" }, + { url = "https://files.pythonhosted.org/packages/0b/e3/85ec501f206fb049259288c1f3506e53876937fb00edb47009348e66756b/charset_normalizer-3.4.9-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0e94703ec9684807f20cfb5eed95c70f67f2a8f21ad620146d7b5a13677b93e5", size = 317075, upload-time = "2026-07-07T14:32:56.021Z" }, + { url = "https://files.pythonhosted.org/packages/c3/69/2a5385192e67175f7d8bd5ce4f57c24bc956439adeae5c13a99aa28a53d1/charset_normalizer-3.4.9-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2a441ea71902098ffe78c5abe6c494f44160b4af614ed16c3d9a3b1d17fd8ee2", size = 213837, upload-time = "2026-07-07T14:32:57.78Z" }, + { url = "https://files.pythonhosted.org/packages/b3/46/03ddc7da576d814fe0a36dd1f0fd3258e95404b4b2e3c026b7923d7e133f/charset_normalizer-3.4.9-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:304b13570067b2547562e308af560b3963857b1fa90bd6afd978130130fe2d6a", size = 235503, upload-time = "2026-07-07T14:32:59.205Z" }, + { url = "https://files.pythonhosted.org/packages/4e/6e/de0229a7ef40f6f9d28a837eebf4ec47bdca5dab4e900c84f22919af636a/charset_normalizer-3.4.9-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:4773092f8019072343a7447203308b176e10199920eb02d6195e81bbb3274c29", size = 229944, upload-time = "2026-07-07T14:33:00.803Z" }, + { url = "https://files.pythonhosted.org/packages/a5/34/49b9060e8418b14fb5cba9cf6bfb383111e2538a03a1fb18e66a95aeb3d5/charset_normalizer-3.4.9-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:04ce310cb89c15df659582aee80a0603788732a5e017d5bd5c81158106ce249c", size = 221276, upload-time = "2026-07-07T14:33:02.199Z" }, + { url = "https://files.pythonhosted.org/packages/44/95/80282cce0fae9c3061203d723ee87da996aed79679e65d8935050ee7ca1f/charset_normalizer-3.4.9-cp311-cp311-manylinux_2_31_armv7l.whl", hash = "sha256:c0323c9daef75ef2e5083624b4585018a0c9d5e3b40f607eed81a311270b934b", size = 205260, upload-time = "2026-07-07T14:33:03.698Z" }, + { url = "https://files.pythonhosted.org/packages/0c/74/2f62c8821b969ea3bd67cc2e6976834f48ca5d12664d2559ebcd9bcfbed7/charset_normalizer-3.4.9-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:871ff67ea1aad4dfd91736464934d56b32dac49f9fbe16cddba36198a7b3a0db", size = 217786, upload-time = "2026-07-07T14:33:05.12Z" }, + { url = "https://files.pythonhosted.org/packages/d9/8d/feabb82cb49fcad14515b1d7d1ca4787b0da7fc723a212bf89bc9e0fac52/charset_normalizer-3.4.9-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:67830fc78e67501f47bb950471b2dcb9b35b140084429318e862895a8e89c993", size = 216798, upload-time = "2026-07-07T14:33:06.629Z" }, + { url = "https://files.pythonhosted.org/packages/a5/ff/c946d63bc3786d5b84d960b0f7ab7e25b828486a946b5aa997625bcaf6a6/charset_normalizer-3.4.9-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:3d92613ec25e43b05f042302531ec0f00b8445190e43325880cbd6ab7c2581da", size = 206429, upload-time = "2026-07-07T14:33:08.006Z" }, + { url = "https://files.pythonhosted.org/packages/af/ba/5e5007c370702f85d2ef75791fac7943ed41e080364a673b20142e430e3e/charset_normalizer-3.4.9-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:280081916dc341820640489a66e4696049401ef1cf6dd672f672e70ad915aca3", size = 223066, upload-time = "2026-07-07T14:33:09.783Z" }, + { url = "https://files.pythonhosted.org/packages/83/d5/9096aa3cf532dfad237861544eb47a0f20d5adbf1039760fed8eaae935d9/charset_normalizer-3.4.9-cp311-cp311-win32.whl", hash = "sha256:ac351b3b8014eead140e77e9717e2992c6bbe30b63bc3422422eb84865412e3d", size = 150456, upload-time = "2026-07-07T14:33:11.217Z" }, + { url = "https://files.pythonhosted.org/packages/ed/a1/e29995109e455dc8eff8d0fac6ae509be39561318a7cfeac5d33ad029213/charset_normalizer-3.4.9-cp311-cp311-win_amd64.whl", hash = "sha256:6366a16e1a25018694d6a5d784d09b046edc9eac40ea2b54065c3052672516a1", size = 161410, upload-time = "2026-07-07T14:33:12.743Z" }, + { url = "https://files.pythonhosted.org/packages/4f/8d/1569f4d0032d6ba2a4fe4591c35bf87868c600c41a71eb5c2e1ffa8464c2/charset_normalizer-3.4.9-cp311-cp311-win_arm64.whl", hash = "sha256:1d22856ffbe153a602df38e4a5464f0b748a54002e0d69ac6d2ad0a197cc99ec", size = 152649, upload-time = "2026-07-07T14:33:14.173Z" }, + { url = "https://files.pythonhosted.org/packages/70/4a/ecbd131485c07fcdfad54e28946d513e3da22ef3b4bd854dcafae54ec739/charset_normalizer-3.4.9-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:45b0cc4e3556cd875e09102988d1ab8356c998b596c9fced84547c8138b487a0", size = 319300, upload-time = "2026-07-07T14:33:15.666Z" }, + { url = "https://files.pythonhosted.org/packages/ec/96/5d9364e3342d69f3a045e1777bc47c85c383e6e9466d561b33fdb419d1f9/charset_normalizer-3.4.9-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9b2aff1c7b3884512b9512c3eaadd9bab39fb45042ffaaa1dd08ff2b9f8109d9", size = 215802, upload-time = "2026-07-07T14:33:17.031Z" }, + { url = "https://files.pythonhosted.org/packages/4b/4c/5361f9aa7f2cb58d94f2ab831b3d493f69efb1d239654b4744e3c09527cb/charset_normalizer-3.4.9-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9104ed0bd76a429d46f9ec0dbc9b08ad1d2dcdf2b00a5a0daa1c145329b35b44", size = 237171, upload-time = "2026-07-07T14:33:18.576Z" }, + { url = "https://files.pythonhosted.org/packages/50/78/ce342ca4ff30b2eb49fe6d9578df85974f90c67d294113e94efdd9664cbd/charset_normalizer-3.4.9-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7b86a2b16095d250c6f58b3d9b2eee6f4147754344f3dab0922f7c9bf7d226c9", size = 233075, upload-time = "2026-07-07T14:33:20.084Z" }, + { url = "https://files.pythonhosted.org/packages/01/c4/4fa4c8b3097a11f3c5f09a35b72ed6855fb1d332469504962ab7bafcc702/charset_normalizer-3.4.9-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5e226f6218febc71f6c1fc2fafb91c226f75bdc1d8fb12d66823716e891608fd", size = 224256, upload-time = "2026-07-07T14:33:21.747Z" }, + { url = "https://files.pythonhosted.org/packages/87/3a/ad914516df7e358a81aae018caa5e0470ba827fa6d763b1d2e87d920a5f6/charset_normalizer-3.4.9-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:90c44bc373b7687f6948b693cceaea1348ae0975d7474746559494468e3c1d84", size = 208784, upload-time = "2026-07-07T14:33:23.313Z" }, + { url = "https://files.pythonhosted.org/packages/d7/74/3c12f9755717dfe5c5c87da63f35d765fa0c00382ec26bf23f7fae34f2ba/charset_normalizer-3.4.9-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:9cdef90ae47919cae358d8ab15797a800ed41da7aba5d72419fb510729e2ed4b", size = 219928, upload-time = "2026-07-07T14:33:24.814Z" }, + { url = "https://files.pythonhosted.org/packages/33/9a/895095b83e7907abd6d3d99aad3a38ad0d9686cc186cb0c94c24320fe63e/charset_normalizer-3.4.9-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:60f44ade2cf573dad7a277e6f8ca9a51a21dda572b13bd7d8539bb3cd5dbedde", size = 218489, upload-time = "2026-07-07T14:33:26.42Z" }, + { url = "https://files.pythonhosted.org/packages/a1/34/ef5c05f412f42520d7709b7d3784d19640839eb7366ded1755511585429f/charset_normalizer-3.4.9-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:a1786910334ed46ab1dd73222f2cd1e05c2c3bb39f6dddb4f8b36fc382058a39", size = 210267, upload-time = "2026-07-07T14:33:27.952Z" }, + { url = "https://files.pythonhosted.org/packages/83/dc/9b29fa4412b318bf3bfea985c35d67eb55e04b59a7c3f2237168b0e0be6f/charset_normalizer-3.4.9-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:03d07803992c6c7bbc976327f34b18b6160327fc81cb82c9d504720ac0be3b62", size = 226030, upload-time = "2026-07-07T14:33:29.397Z" }, + { url = "https://files.pythonhosted.org/packages/0e/42/6dbc00b8cd16011691203e33570fa42ed5746599a2e878112d16eab403a3/charset_normalizer-3.4.9-cp312-cp312-win32.whl", hash = "sha256:78841cccf1af7b40f6f716338d50c0902dbe88d9f800b3c973b7a9a0a693a642", size = 151185, upload-time = "2026-07-07T14:33:30.781Z" }, + { url = "https://files.pythonhosted.org/packages/80/cc/f920afd1a23c58ccd53c1d36085a71893a4737ff5e66e0371efab6809850/charset_normalizer-3.4.9-cp312-cp312-win_amd64.whl", hash = "sha256:4b3dac63058cc36820b0dd072f89898604e2d39686fe05321729d00d8ac185a0", size = 162557, upload-time = "2026-07-07T14:33:32.176Z" }, + { url = "https://files.pythonhosted.org/packages/f0/e6/0386d43a261ff4e4b30c5857af7df877254b46bec7b9d1b74b6bf969a90b/charset_normalizer-3.4.9-cp312-cp312-win_arm64.whl", hash = "sha256:78fa18e436a1a0e58dbd7e02fc4473f3f32cceb12df9dfca542d075961c307d2", size = 152665, upload-time = "2026-07-07T14:33:33.711Z" }, + { url = "https://files.pythonhosted.org/packages/b2/06/97ec2aeae780b31d742b6352218b43841a6871e2564578ca522dce4a45c3/charset_normalizer-3.4.9-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:440eede837960000d74978f0eba527be106b5b9aee0daf779d395276ed0b0614", size = 317688, upload-time = "2026-07-07T14:33:35.408Z" }, + { url = "https://files.pythonhosted.org/packages/d0/39/8ff066c672434225f8d25f8b739f992af250944392173dcc88362681c9bf/charset_normalizer-3.4.9-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:21e764fd1e70b6a3e205a0e46f3051701f98a8cb3fad66eeb80e48bb502f8698", size = 214982, upload-time = "2026-07-07T14:33:36.996Z" }, + { url = "https://files.pythonhosted.org/packages/92/8f/3a47a3667c83c2df9483d91644c6c107de3bf8874aa1793da9d3012eb986/charset_normalizer-3.4.9-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e4fd89cc178bced6ad29cb3e6dd4aa63fa5017c3524dbd0b25998fb64a87cc8b", size = 236460, upload-time = "2026-07-07T14:33:38.536Z" }, + { url = "https://files.pythonhosted.org/packages/f1/60/b22cdbee7e4013dab8b0d7647fc6181120fbbbc8f7025c226d15bd5a47fc/charset_normalizer-3.4.9-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:bd47ba7fc3ca94896759ea0109775132d3e7ab921fbf54038e1bab2e46c313c9", size = 232003, upload-time = "2026-07-07T14:33:40.059Z" }, + { url = "https://files.pythonhosted.org/packages/ea/f8/72eb13dcabe7257035cea8aefd922caad2f110d252bf9f67c4c2ca763aee/charset_normalizer-3.4.9-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:84fd18bcc17526fc2b3c1af7d2b9217d32c9c04448c16ec693b9b4f1985c3d33", size = 223149, upload-time = "2026-07-07T14:33:41.631Z" }, + { url = "https://files.pythonhosted.org/packages/b0/3e/faee8f9de92b14ee1198e9163252bb15efee7301b31256a3b6d9ebfdd0dd/charset_normalizer-3.4.9-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:5b10cd92fc5c498b35a8635df6d5a100207f88b63a4dc1de7ef9a548e1e2cd63", size = 207901, upload-time = "2026-07-07T14:33:43.209Z" }, + { url = "https://files.pythonhosted.org/packages/3a/25/45f30093ae27dd7b92a793b61882a38685f993700113ca36e0c9c14965e1/charset_normalizer-3.4.9-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a4fbdde9dd4a9ce5fd52c2b3a347bb50cc89483ef783f1cb00d408c13f7a96c0", size = 219176, upload-time = "2026-07-07T14:33:44.725Z" }, + { url = "https://files.pythonhosted.org/packages/48/18/c8f397329c35e32f6a837e488986f4ae03bd2abebc453b48714991630c2f/charset_normalizer-3.4.9-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:416c229f77e5ea25b3dfd4b582f8d73d7e43c22320302b9ab128a2d3a0b38efe", size = 217356, upload-time = "2026-07-07T14:33:46.192Z" }, + { url = "https://files.pythonhosted.org/packages/86/7e/5ce0bba863470fd1902d5e5843968951bddf38abe4742fc97116ef4598b3/charset_normalizer-3.4.9-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:75286256590a6320cf106a0d28970d3560aad9ee09aa7b34fb40524792436d35", size = 209614, upload-time = "2026-07-07T14:33:47.705Z" }, + { url = "https://files.pythonhosted.org/packages/6c/ef/2473d3c4d869155be4af1191111d59c4d5c4e0173026f7e85b176e23bf65/charset_normalizer-3.4.9-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:69b157c5d3292bcd443faca052f3096f637f1e074b98212a933c074ae23dc3b8", size = 224991, upload-time = "2026-07-07T14:33:49.238Z" }, + { url = "https://files.pythonhosted.org/packages/d0/a3/53ddae3db108a088156aa8ddfafd411ebbc1340f48c5573f697b27f69a39/charset_normalizer-3.4.9-cp313-cp313-win32.whl", hash = "sha256:51307f5c71007673a2bf8232ad973483d281e74cb99c8c5a990af1eefa6277d9", size = 150622, upload-time = "2026-07-07T14:33:50.711Z" }, + { url = "https://files.pythonhosted.org/packages/e8/ef/6953a77c7cf2c2ff9998e6f575ab3e380119f100223381565a4f94c1f836/charset_normalizer-3.4.9-cp313-cp313-win_amd64.whl", hash = "sha256:fe2c7201c642b7c308f1675355ad7ff7b66acfe3541625efe5a3ad38f29d6115", size = 161947, upload-time = "2026-07-07T14:33:52.197Z" }, + { url = "https://files.pythonhosted.org/packages/6e/fb/d560d1d1555debbfe7849d9cac6145c1b537709d79576bf22557ed803b82/charset_normalizer-3.4.9-cp313-cp313-win_arm64.whl", hash = "sha256:611057cc5d5c0afc743ba8be6bd828c17e0aaa8643f9d0a9b9bb7dea80eb8012", size = 152594, upload-time = "2026-07-07T14:33:53.486Z" }, + { url = "https://files.pythonhosted.org/packages/7e/8d/496817fa0944239ecae662dd57ea765cfeaec6a735f9f025d4b7b72e7143/charset_normalizer-3.4.9-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:0327fcd59a935777d83410750c50600ee9571af2846f71ce40f25b13da1ef380", size = 317253, upload-time = "2026-07-07T14:33:54.994Z" }, + { url = "https://files.pythonhosted.org/packages/2b/f9/ef4a69ea338ad3c0deceea0f5f7d2380ae8b52132b06d652cb0d2cd86706/charset_normalizer-3.4.9-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8a79d9f4d8001473a30c163556b3c3bfebec837495a412dde78b51672f6134f9", size = 215898, upload-time = "2026-07-07T14:33:56.334Z" }, + { url = "https://files.pythonhosted.org/packages/8c/e7/5ddfd76fc061eb52de219658a4aa431cbacadf0a0219c8854f00da50d289/charset_normalizer-3.4.9-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:33bdcc2a32c0a0e861f60841a512c8acc658c87c2ac59d89e3a46dacf7d866e4", size = 236718, upload-time = "2026-07-07T14:33:57.9Z" }, + { url = "https://files.pythonhosted.org/packages/49/ba/768fa3f36048d81c477a0ce61f813bc1454d80917ccfe550abd9f44f5e24/charset_normalizer-3.4.9-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f840ed6d8ecba8255df8c42b87fadeda98ddfc6eeec05e2dc66e26d46dd6f58a", size = 232519, upload-time = "2026-07-07T14:33:59.811Z" }, + { url = "https://files.pythonhosted.org/packages/f4/c4/b3e049d2aa3766180c78507110543d9d50894cc97f57de543f1be521dcdc/charset_normalizer-3.4.9-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c25fe15c70c59eb7c5ce8c06a1f3fa1da0ecc5ea1e7a5922c40fd2fa9b0d5046", size = 223143, upload-time = "2026-07-07T14:34:01.517Z" }, + { url = "https://files.pythonhosted.org/packages/19/79/55c32d06d76ae4feafe053f061f3e3ab70bcf19f4007797ce8c3efda7830/charset_normalizer-3.4.9-cp314-cp314-manylinux_2_31_armv7l.whl", hash = "sha256:f7fb7d750cfa0a070d2c24e831fd3481019a60dd317ea2b39acbcebc08b6ed81", size = 206742, upload-time = "2026-07-07T14:34:03.04Z" }, + { url = "https://files.pythonhosted.org/packages/10/e0/47c079dd82d217c807479cd59ffd30af56307ea31c108b75758970459ad3/charset_normalizer-3.4.9-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:4d1c96a7a18b9690a4d46df09e3e3382406ae3213727cd1019ebade1c4a81917", size = 219191, upload-time = "2026-07-07T14:34:04.657Z" }, + { url = "https://files.pythonhosted.org/packages/42/ab/b9bc2e77d6b44a7e46ef62ec5cac1c9a6ba7b9135a5d560f002696ec9995/charset_normalizer-3.4.9-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:a4cfde78a9f2880208d16a93b795726a3017d5977e08d1e162a7a31322479c41", size = 218328, upload-time = "2026-07-07T14:34:06.115Z" }, + { url = "https://files.pythonhosted.org/packages/f1/78/c9c71d599f5aa2d42bcdd35cbbd46d7f535351a57e40ff7d8e5a7e219401/charset_normalizer-3.4.9-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:d4d6fcde76f94f5cb9e43e9e9a61f16dacefd228cbbf6f1a09bd9b219a92f1a1", size = 207406, upload-time = "2026-07-07T14:34:07.554Z" }, + { url = "https://files.pythonhosted.org/packages/f6/39/c914445c321a845097ce4f6ac7de9a18228a77b766272125a1ce00d851eb/charset_normalizer-3.4.9-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:898f0e9068ca27d37f8e83a5b962821df851532e6c4a7d615c1c033f9da6eedf", size = 225157, upload-time = "2026-07-07T14:34:09.061Z" }, + { url = "https://files.pythonhosted.org/packages/9b/f2/c0d4b8508565a36bc5c624e88ed297f5b0b1095011034d7f5b83a69908b5/charset_normalizer-3.4.9-cp314-cp314-win32.whl", hash = "sha256:c1c948747b03be832dceed96ca815cef7360de9aa19d37c730f8e3f6101aca48", size = 151095, upload-time = "2026-07-07T14:34:10.901Z" }, + { url = "https://files.pythonhosted.org/packages/49/fd/a1d26144398c67486422a72bf5812cda22cb4ccfcd95a290fb41ceb4b8e2/charset_normalizer-3.4.9-cp314-cp314-win_amd64.whl", hash = "sha256:16b65ea0f2465b6fb52aa22de5eca612aa964ddfec00a912e26f4656cbef890b", size = 162796, upload-time = "2026-07-07T14:34:12.47Z" }, + { url = "https://files.pythonhosted.org/packages/20/95/d75e82f8ce9fd323ebf059c16c9aadefb22a1ecde13b7840b35835e4886c/charset_normalizer-3.4.9-cp314-cp314-win_arm64.whl", hash = "sha256:40a126142a56b2dfc0aacbad1de8310cbf60da7656db0e6b16eebd48e3e93519", size = 153334, upload-time = "2026-07-07T14:34:14.044Z" }, + { url = "https://files.pythonhosted.org/packages/00/5e/17398df3a139985ba9d11ed072531986f408c8fca952835ef1ab1820c02b/charset_normalizer-3.4.9-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:609b3ba8fcc0fb5ab7af00719d0fb6ad0cb518e48e7712d12fd68f1327951198", size = 338848, upload-time = "2026-07-07T14:34:15.688Z" }, + { url = "https://files.pythonhosted.org/packages/cd/91/7253a32e86b7e1d1239b1b36ba6dd0f021a21107ab33054b53119cc083b9/charset_normalizer-3.4.9-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:51447e9aa2684679af07ca5021c3db526e0284347ebf4ffcec1154c3350cfe32", size = 223022, upload-time = "2026-07-07T14:34:17.248Z" }, + { url = "https://files.pythonhosted.org/packages/cb/32/2e64bd2be10e89c61e57ebe6a93fd98ae88eb7ebe414b5121f22c96c69eb/charset_normalizer-3.4.9-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:cc1b0fff8ead343dae06305f954eb8468ba0ec1a97881f42489d198e4ce3c632", size = 241590, upload-time = "2026-07-07T14:34:18.813Z" }, + { url = "https://files.pythonhosted.org/packages/3d/ef/d96ec496cfea0c21db43b0ad03891308b02388d054cc902cf0e5a1ad6a88/charset_normalizer-3.4.9-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:fa36ec09ef71d158186bc79e359ff5fdd6e7996fe8ab638f00d6b93139ba4fcf", size = 239584, upload-time = "2026-07-07T14:34:20.52Z" }, + { url = "https://files.pythonhosted.org/packages/d4/ce/9af95f7876194bd7a14e3dfe4a4de2e0bff02666a3910d72beafd06cc297/charset_normalizer-3.4.9-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:df115d4d83168fdf2cae48ef1ff6d1cb4c466364e30861b37121de0f3bf1b990", size = 230224, upload-time = "2026-07-07T14:34:22.189Z" }, + { url = "https://files.pythonhosted.org/packages/52/94/af74dde74a3996bd959c350709bfe50e297823d70a8c1cbd54b838880863/charset_normalizer-3.4.9-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:f86c6358749bd4fda175388691e3ba8c46e24c5347d0afd20f9b7edfc9faf07d", size = 212667, upload-time = "2026-07-07T14:34:23.857Z" }, + { url = "https://files.pythonhosted.org/packages/ee/f0/f1c4fe746c395922961b5916ed1d7d6e7d4c84851d19ed43cc89980ec953/charset_normalizer-3.4.9-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:32286a2c8d167e897177b673176c1e3e00d4057caf5d2b64eef9a3666b03018e", size = 227179, upload-time = "2026-07-07T14:34:25.586Z" }, + { url = "https://files.pythonhosted.org/packages/e4/56/6c745619ac397e8871e2bcd3cea1eec86b877488f33888b3aef5c3ed506e/charset_normalizer-3.4.9-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:83aed2c10721ddd90f68140685391b50811a880af20654c59af6b6c66c40513c", size = 225372, upload-time = "2026-07-07T14:34:27.212Z" }, + { url = "https://files.pythonhosted.org/packages/78/ad/98aae8630ac71f16711968e38a5acfecce41b778bf2f0312851020f565a8/charset_normalizer-3.4.9-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:cd6c3d4b783c556fa00bf540854e42f135e2f256abd29669fcd0da0f2dec79c2", size = 215222, upload-time = "2026-07-07T14:34:28.774Z" }, + { url = "https://files.pythonhosted.org/packages/f7/40/9593d54209765207a7f11073c06494c1721e4ca4a0a426c597679bf7f91e/charset_normalizer-3.4.9-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ee2f2a527e3c1a6e6411eb4209642e138b544a2d72fe5d0d76daf77b24063534", size = 231958, upload-time = "2026-07-07T14:34:30.345Z" }, + { url = "https://files.pythonhosted.org/packages/b1/27/693ee5e8a18191eb38647360c51cd505013e2bd3b366aa43fd5344c21e3c/charset_normalizer-3.4.9-cp314-cp314t-win32.whl", hash = "sha256:0d861473f743244d349b50f850d10eb87aeb22bbdcc8e64f79273c94af5a8226", size = 155580, upload-time = "2026-07-07T14:34:31.884Z" }, + { url = "https://files.pythonhosted.org/packages/80/3f/bd97d3d9c613013d07cb7733d299385b41df37f0471310f5a73dc359f0b8/charset_normalizer-3.4.9-cp314-cp314t-win_amd64.whl", hash = "sha256:9b8e0f3107e2200b76f6054de99016eac3ee6762713587b36baaa7e4bd2ae177", size = 167620, upload-time = "2026-07-07T14:34:33.438Z" }, + { url = "https://files.pythonhosted.org/packages/3d/c6/eee9dca4439b1061f76373f06ea855678cc4a64c1c3c90b50e479edbb8eb/charset_normalizer-3.4.9-cp314-cp314t-win_arm64.whl", hash = "sha256:19ac87f93086ce37b86e098888555c4b4bc48102279bae3350098c0ed664b501", size = 158037, upload-time = "2026-07-07T14:34:35.018Z" }, + { url = "https://files.pythonhosted.org/packages/98/2b/f97f1c193fb855c345d678f5077d6926034db0722df74c8f057020e05a25/charset_normalizer-3.4.9-py3-none-any.whl", hash = "sha256:68e5f26a1ad57ded6d1cfb85331d1c1a195314756471d97758c48498bb4dcdf5", size = 64538, upload-time = "2026-07-07T14:34:56.993Z" }, +] + +[[package]] +name = "click" +version = "8.4.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/76/d4/81420972a676e8ffea40450d8c8c92943e7218a78fe9b64359836cc9876b/click-8.4.2.tar.gz", hash = "sha256:9a6cea6e60b17ebe0a44c5cc636d94f09bd66142c1cd7d8b4cd731c4917a15f6", size = 338000, upload-time = "2026-06-24T17:45:15.148Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fb/e2/79c688af8b210d232694e31e59da9f6ec747bae31c3f5946e4e9b98860d5/click-8.4.2-py3-none-any.whl", hash = "sha256:e6f9f66136c816745b9d65817da91d61d957fb16e02e4dcd0552553c5a197b76", size = 119243, upload-time = "2026-06-24T17:45:13.73Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "datacontract-cli" +version = "1.0.12" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "boto3" }, + { name = "click" }, + { name = "datacontract-specification" }, + { name = "deepdiff" }, + { name = "fastjsonschema" }, + { name = "jinja-partials" }, + { name = "jinja2" }, + { name = "jsonschema" }, + { name = "open-data-contract-standard" }, + { name = "pydantic" }, + { name = "python-dotenv" }, + { name = "python-multipart" }, + { name = "pytz" }, + { name = "pyyaml" }, + { name = "requests" }, + { name = "rich" }, + { name = "ruamel-yaml" }, + { name = "sqlglot" }, + { name = "truststore" }, + { name = "typer" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/67/65/5e9dea0f69ee7f7e564b2c150a9f92b989eb6d6d98ec802d54d9f6b5f029/datacontract_cli-1.0.12.tar.gz", hash = "sha256:6775fea8431697382bdad7889997739f343f95d6f6ff12cf9e782e5078ee7578", size = 3048918, upload-time = "2026-07-10T15:58:35.98Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ff/84/6ce1dd559bb3163e58c1d4c29f4416b471659790ed63ae50a0c6cfe7e617/datacontract_cli-1.0.12-py3-none-any.whl", hash = "sha256:ad521e1492b2e3a746ab9edb155483bd9954b65e396150aec76c2b4e4358e39a", size = 3047292, upload-time = "2026-07-10T15:58:34.174Z" }, +] + +[[package]] +name = "datacontract-specification" +version = "1.2.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pydantic" }, + { name = "pyyaml" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d3/a5/3ee2bc8671b08e0c350091308386d2171bb03f8255647466ddcfab8717ca/datacontract_specification-1.2.3.tar.gz", hash = "sha256:5fc612255667581321b480e3f646c76ece618632a4aca4cd6ea5f647d98cbb61", size = 16162, upload-time = "2025-09-25T14:25:49.494Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/67/0e/ec63c117fbdb5ecfd6625e7527a267b85eaf26b4227e94a144509859a3dd/datacontract_specification-1.2.3-py3-none-any.whl", hash = "sha256:3d5a998a33be33ca95a20e3681a693b4d720baf0b956ff8970f3e85a77d6f35a", size = 15231, upload-time = "2025-09-25T14:25:48.107Z" }, +] + +[[package]] +name = "deepdiff" +version = "9.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cachebox" }, + { name = "orderly-set" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f9/6b/6a4a5aaf38535eb332c2856aa08e73ed7c549d0851b1215401af0a2db1a7/deepdiff-9.1.0.tar.gz", hash = "sha256:07e9e366fab4297755153c4eab795ad4ef3cbd0d51660e847f5751c6bd727687", size = 382149, upload-time = "2026-05-15T20:18:05.751Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c7/26/4a2bad8eb430d8d805a4642c4bff25103a37548d74ab346f8b1e024abcc5/deepdiff-9.1.0-py3-none-any.whl", hash = "sha256:80c0460e1993b04f6f0ca79abf25548b129fd218478c4ebb08f80560f5d10610", size = 184662, upload-time = "2026-05-15T20:18:03.956Z" }, +] + +[[package]] +name = "deprecation" +version = "2.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "packaging" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5a/d3/8ae2869247df154b64c1884d7346d412fed0c49df84db635aab2d1c40e62/deprecation-2.1.0.tar.gz", hash = "sha256:72b3bde64e5d778694b0cf68178aed03d15e15477116add3fb773e581f9518ff", size = 173788, upload-time = "2020-04-20T14:23:38.738Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/02/c3/253a89ee03fc9b9682f1541728eb66db7db22148cd94f89ab22528cd1e1b/deprecation-2.1.0-py2.py3-none-any.whl", hash = "sha256:a10811591210e1fb0e768a8c25517cabeabcba6f0bf96564f8ff45189f90b14a", size = 11178, upload-time = "2020-04-20T14:23:36.581Z" }, +] + +[[package]] +name = "eval-type-backport" +version = "0.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1c/15/273a4baf8248d6d76220723c3caf039d283774b31a7c46ba686120145b76/eval_type_backport-0.4.0.tar.gz", hash = "sha256:8397d25e6524c2e67b9576bb0636be27dea2192017711220c534ec2de921e9b0", size = 10260, upload-time = "2026-06-02T13:22:06.059Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/50/a7/bb99bf5e6f78736ddb53480f2c3ff3702ffe2196a7c5e1661c03081d398e/eval_type_backport-0.4.0-py3-none-any.whl", hash = "sha256:ad5e2a8db71b6696a56eafb938b0f5a337d3217f256b8e158b469422b4772b20", size = 6432, upload-time = "2026-06-02T13:22:04.827Z" }, +] + +[[package]] +name = "exceptiongroup" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions", marker = "python_full_version < '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8a/0e/97c33bf5009bdbac74fd2beace167cab3f978feb69cc36f1ef79360d6c4e/exceptiongroup-1.3.1-py3-none-any.whl", hash = "sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598", size = 16740, upload-time = "2025-11-21T23:01:53.443Z" }, +] + +[[package]] +name = "fastjsonschema" +version = "2.21.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/20/b5/23b216d9d985a956623b6bd12d4086b60f0059b27799f23016af04a74ea1/fastjsonschema-2.21.2.tar.gz", hash = "sha256:b1eb43748041c880796cd077f1a07c3d94e93ae84bba5ed36800a33554ae05de", size = 374130, upload-time = "2025-08-14T18:49:36.666Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl", hash = "sha256:1c797122d0a86c5cace2e54bf4e819c36223b552017172f32c5c024a6b77e463", size = 24024, upload-time = "2025-08-14T18:49:34.776Z" }, +] + +[[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 = "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 = "importlib-metadata" +version = "8.7.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "zipp" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f3/49/3b30cad09e7771a4982d9975a8cbf64f00d4a1ececb53297f1d9a7be1b10/importlib_metadata-8.7.1.tar.gz", hash = "sha256:49fef1ae6440c182052f407c8d34a68f72efc36db9ca90dc0113398f2fdde8bb", size = 57107, upload-time = "2025-12-21T10:00:19.278Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fa/5e/f8e9a1d23b9c20a551a8a02ea3637b4642e22c2626e3a13a9a29cdea99eb/importlib_metadata-8.7.1-py3-none-any.whl", hash = "sha256:5a1f80bf1daa489495071efbb095d75a634cf28a8bc299581244063b53176151", size = 27865, upload-time = "2025-12-21T10:00:18.329Z" }, +] + +[[package]] +name = "infoclimat-data-platform-tools" +version = "0.1.0" +source = { virtual = "." } +dependencies = [ + { name = "psycopg", extra = ["binary"] }, + { name = "pymysql" }, + { name = "pyyaml" }, +] + +[package.optional-dependencies] +code-index = [ + { name = "lancedb" }, + { name = "mistralai" }, + { name = "tree-sitter-language-pack" }, +] +contracts = [ + { name = "datacontract-cli" }, +] + +[package.metadata] +requires-dist = [ + { name = "datacontract-cli", marker = "extra == 'contracts'", specifier = ">=0.10" }, + { name = "lancedb", marker = "extra == 'code-index'", specifier = ">=0.13" }, + { name = "mistralai", marker = "extra == 'code-index'", specifier = ">=2.4" }, + { name = "psycopg", extras = ["binary"], specifier = ">=3.1" }, + { name = "pymysql", specifier = ">=1.1" }, + { name = "pyyaml", specifier = ">=6.0" }, + { name = "tree-sitter-language-pack", marker = "extra == 'code-index'", specifier = ">=0.9" }, +] +provides-extras = ["contracts", "code-index"] + +[[package]] +name = "jinja-partials" +version = "0.3.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jinja2" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/07/d3/ef7bea796d230199e6b36d4466148d92503d937d82a9f55f54b14e81708e/jinja_partials-0.3.2.tar.gz", hash = "sha256:4ecaeb02735b48dd7643d0cb6f112e4669fa69cf83ce1c601b6f3c882283d013", size = 2974521, upload-time = "2026-06-11T16:43:05.572Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8c/7f/eab7def87914f272500236e3d765649c64a7bc83e24cf1b8303f76bfc6cf/jinja_partials-0.3.2-py3-none-any.whl", hash = "sha256:331219b75db8b8b5289a8e0aace2854c74d36b3b993ba960748f7f2ed049743b", size = 9295, upload-time = "2026-06-11T16:43:06.848Z" }, +] + +[[package]] +name = "jinja2" +version = "3.1.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markupsafe" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115, upload-time = "2025-03-05T20:05:02.478Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload-time = "2025-03-05T20:05:00.369Z" }, +] + +[[package]] +name = "jmespath" +version = "1.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d3/59/322338183ecda247fb5d1763a6cbe46eff7222eaeebafd9fa65d4bf5cb11/jmespath-1.1.0.tar.gz", hash = "sha256:472c87d80f36026ae83c6ddd0f1d05d4e510134ed462851fd5f754c8c3cbb88d", size = 27377, upload-time = "2026-01-22T16:35:26.279Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/14/2f/967ba146e6d58cf6a652da73885f52fc68001525b4197effc174321d70b4/jmespath-1.1.0-py3-none-any.whl", hash = "sha256:a5663118de4908c91729bea0acadca56526eb2698e83de10cd116ae0f4e97c64", size = 20419, upload-time = "2026-01-22T16:35:24.919Z" }, +] + +[[package]] +name = "jsonpath-python" +version = "1.1.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/98/18/4ca8742534a5993ff383f7602e325ce2d5d7cc93d72ac5e1cdedbea8a458/jsonpath_python-1.1.6.tar.gz", hash = "sha256:dded9932b4ec41fb8726e09c83afa4e6be618f938c2db287cc2a81723c639671", size = 88178, upload-time = "2026-05-07T01:26:34.482Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/55/8a/1270a6803bd821cbfcdda387eaa13cb41a7b1f7b9bd145979b3bfb9d6cb7/jsonpath_python-1.1.6-py3-none-any.whl", hash = "sha256:a1c50afd8d3fbbaf47a4873bc890dcb3c15da96f5c020327977d844d8731a2d4", size = 14453, upload-time = "2026-05-07T01:26:33.306Z" }, +] + +[[package]] +name = "jsonschema" +version = "4.26.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "attrs" }, + { name = "jsonschema-specifications" }, + { name = "referencing" }, + { name = "rpds-py", version = "0.30.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "rpds-py", version = "2026.6.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b3/fc/e067678238fa451312d4c62bf6e6cf5ec56375422aee02f9cb5f909b3047/jsonschema-4.26.0.tar.gz", hash = "sha256:0c26707e2efad8aa1bfc5b7ce170f3fccc2e4918ff85989ba9ffa9facb2be326", size = 366583, upload-time = "2026-01-07T13:41:07.246Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl", hash = "sha256:d489f15263b8d200f8387e64b4c3a75f06629559fb73deb8fdfb525f2dab50ce", size = 90630, upload-time = "2026-01-07T13:41:05.306Z" }, +] + +[[package]] +name = "jsonschema-specifications" +version = "2025.9.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "referencing" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/19/74/a633ee74eb36c44aa6d1095e7cc5569bebf04342ee146178e2d36600708b/jsonschema_specifications-2025.9.1.tar.gz", hash = "sha256:b540987f239e745613c7a9176f3edb72b832a4ac465cf02712288397832b5e8d", size = 32855, upload-time = "2025-09-08T01:34:59.186Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl", hash = "sha256:98802fee3a11ee76ecaca44429fda8a41bff98b00a0f2838151b113f210cc6fe", size = 18437, upload-time = "2025-09-08T01:34:57.871Z" }, +] + +[[package]] +name = "lance-namespace" +version = "0.9.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "lance-namespace-urllib3-client" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/00/81/4cf8d0412e1f37b2bfa70d0aeb9c7ae4ab73607534e44d60b55efb485306/lance_namespace-0.9.0.tar.gz", hash = "sha256:f738b641cc615b17323baa4eb47900f184688739ee3d2ea9fe39396b9588e53d", size = 11637, upload-time = "2026-07-01T07:42:41.78Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e1/fe/f38747c9610ade83dd9a99a0470b9432b6f21ce4e2bb5524edbe66f626fd/lance_namespace-0.9.0-py3-none-any.whl", hash = "sha256:f785ff10927e4ce0db69986576670fedd37f8a33521e8a4630c6be22db8061b2", size = 13501, upload-time = "2026-07-01T07:42:39.372Z" }, +] + +[[package]] +name = "lance-namespace-urllib3-client" +version = "0.9.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pydantic" }, + { name = "python-dateutil" }, + { name = "typing-extensions" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d3/c3/32d0e2618549ace857c80a457e5915ef3e1145661baff876c8a5ec27be5b/lance_namespace_urllib3_client-0.9.0.tar.gz", hash = "sha256:cf796fa5307fa4dde91fe4bec2af28b90ba79191852d4394e8fe44276538e40f", size = 235805, upload-time = "2026-07-01T07:42:42.563Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cc/ab/c8754da0a1efc817f8480100cfe12b7e04034df834759de8ecf02beff3cc/lance_namespace_urllib3_client-0.9.0-py3-none-any.whl", hash = "sha256:be819c8cffb1e460a3a504dbf52d1ca009560a48e7202b8c4279998e4adf9fe4", size = 405586, upload-time = "2026-07-01T07:42:40.503Z" }, +] + +[[package]] +name = "lancedb" +version = "0.34.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "deprecation" }, + { name = "lance-namespace" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.11.*'" }, + { name = "numpy", version = "2.5.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, + { name = "overrides", marker = "python_full_version < '3.12'" }, + { name = "packaging" }, + { name = "pyarrow" }, + { name = "pydantic" }, + { name = "tqdm" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/df/f7/5262b9aa593f790757163c0165ab0da1dda054758901bea7e4f02c9cb633/lancedb-0.34.0-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:c462f2e6f933cad659fd0179394eaab578acbc9151fe2ef41bc29b36ecca5058", size = 52654213, upload-time = "2026-07-02T17:13:31.102Z" }, + { url = "https://files.pythonhosted.org/packages/69/99/05ea0d32229ebea695193ff20c15d6ecae25785ad82a9d4723d98832a284/lancedb-0.34.0-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:48829e88e708947d0520454ab9e4f8efa35f3e3626469eadd3a6e061b89cb223", size = 55434501, upload-time = "2026-07-02T17:13:34.81Z" }, + { url = "https://files.pythonhosted.org/packages/cd/4e/4325c13d5afa93c466428a5a0f168ad4d96f5eb4a77bbe7c5100d39c9897/lancedb-0.34.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:05ba8a5b58e064edfbe5be71b1abf2e411b4eaf295d1a173dcb1a55c5bfb5285", size = 58659359, upload-time = "2026-07-02T17:13:38.424Z" }, + { url = "https://files.pythonhosted.org/packages/d9/5d/8ca165f1386caf6c4d1c515afd52f345b66432264eecfdfb7fd33eefd9af/lancedb-0.34.0-cp39-abi3-win_amd64.whl", hash = "sha256:51cbc11808f9e3332819b9367c975b3a888541447a8e7bea09c57c852a279153", size = 63530726, upload-time = "2026-07-02T17:13:41.612Z" }, +] + +[[package]] +name = "markdown-it-py" +version = "4.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mdurl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/06/ff/7841249c247aa650a76b9ee4bbaeae59370dc8bfd2f6c01f3630c35eb134/markdown_it_py-4.2.0.tar.gz", hash = "sha256:04a21681d6fbb623de53f6f364d352309d4094dd4194040a10fd51833e418d49", size = 82454, upload-time = "2026-05-07T12:08:28.36Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl", hash = "sha256:9f7ebbcd14fe59494226453aed97c1070d83f8d24b6fc3a3bcf9a38092641c4a", size = 91687, upload-time = "2026-05-07T12:08:27.182Z" }, +] + +[[package]] +name = "markupsafe" +version = "3.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7e/99/7690b6d4034fffd95959cbe0c02de8deb3098cc577c67bb6a24fe5d7caa7/markupsafe-3.0.3.tar.gz", hash = "sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698", size = 80313, upload-time = "2025-09-27T18:37:40.426Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e8/4b/3541d44f3937ba468b75da9eebcae497dcf67adb65caa16760b0a6807ebb/markupsafe-3.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2f981d352f04553a7171b8e44369f2af4055f888dfb147d55e42d29e29e74559", size = 11631, upload-time = "2025-09-27T18:36:05.558Z" }, + { url = "https://files.pythonhosted.org/packages/98/1b/fbd8eed11021cabd9226c37342fa6ca4e8a98d8188a8d9b66740494960e4/markupsafe-3.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e1c1493fb6e50ab01d20a22826e57520f1284df32f2d8601fdd90b6304601419", size = 12057, upload-time = "2025-09-27T18:36:07.165Z" }, + { url = "https://files.pythonhosted.org/packages/40/01/e560d658dc0bb8ab762670ece35281dec7b6c1b33f5fbc09ebb57a185519/markupsafe-3.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1ba88449deb3de88bd40044603fafffb7bc2b055d626a330323a9ed736661695", size = 22050, upload-time = "2025-09-27T18:36:08.005Z" }, + { url = "https://files.pythonhosted.org/packages/af/cd/ce6e848bbf2c32314c9b237839119c5a564a59725b53157c856e90937b7a/markupsafe-3.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f42d0984e947b8adf7dd6dde396e720934d12c506ce84eea8476409563607591", size = 20681, upload-time = "2025-09-27T18:36:08.881Z" }, + { url = "https://files.pythonhosted.org/packages/c9/2a/b5c12c809f1c3045c4d580b035a743d12fcde53cf685dbc44660826308da/markupsafe-3.0.3-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c0c0b3ade1c0b13b936d7970b1d37a57acde9199dc2aecc4c336773e1d86049c", size = 20705, upload-time = "2025-09-27T18:36:10.131Z" }, + { url = "https://files.pythonhosted.org/packages/cf/e3/9427a68c82728d0a88c50f890d0fc072a1484de2f3ac1ad0bfc1a7214fd5/markupsafe-3.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0303439a41979d9e74d18ff5e2dd8c43ed6c6001fd40e5bf2e43f7bd9bbc523f", size = 21524, upload-time = "2025-09-27T18:36:11.324Z" }, + { url = "https://files.pythonhosted.org/packages/bc/36/23578f29e9e582a4d0278e009b38081dbe363c5e7165113fad546918a232/markupsafe-3.0.3-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:d2ee202e79d8ed691ceebae8e0486bd9a2cd4794cec4824e1c99b6f5009502f6", size = 20282, upload-time = "2025-09-27T18:36:12.573Z" }, + { url = "https://files.pythonhosted.org/packages/56/21/dca11354e756ebd03e036bd8ad58d6d7168c80ce1fe5e75218e4945cbab7/markupsafe-3.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:177b5253b2834fe3678cb4a5f0059808258584c559193998be2601324fdeafb1", size = 20745, upload-time = "2025-09-27T18:36:13.504Z" }, + { url = "https://files.pythonhosted.org/packages/87/99/faba9369a7ad6e4d10b6a5fbf71fa2a188fe4a593b15f0963b73859a1bbd/markupsafe-3.0.3-cp310-cp310-win32.whl", hash = "sha256:2a15a08b17dd94c53a1da0438822d70ebcd13f8c3a95abe3a9ef9f11a94830aa", size = 14571, upload-time = "2025-09-27T18:36:14.779Z" }, + { url = "https://files.pythonhosted.org/packages/d6/25/55dc3ab959917602c96985cb1253efaa4ff42f71194bddeb61eb7278b8be/markupsafe-3.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:c4ffb7ebf07cfe8931028e3e4c85f0357459a3f9f9490886198848f4fa002ec8", size = 15056, upload-time = "2025-09-27T18:36:16.125Z" }, + { url = "https://files.pythonhosted.org/packages/d0/9e/0a02226640c255d1da0b8d12e24ac2aa6734da68bff14c05dd53b94a0fc3/markupsafe-3.0.3-cp310-cp310-win_arm64.whl", hash = "sha256:e2103a929dfa2fcaf9bb4e7c091983a49c9ac3b19c9061b6d5427dd7d14d81a1", size = 13932, upload-time = "2025-09-27T18:36:17.311Z" }, + { url = "https://files.pythonhosted.org/packages/08/db/fefacb2136439fc8dd20e797950e749aa1f4997ed584c62cfb8ef7c2be0e/markupsafe-3.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1cc7ea17a6824959616c525620e387f6dd30fec8cb44f649e31712db02123dad", size = 11631, upload-time = "2025-09-27T18:36:18.185Z" }, + { url = "https://files.pythonhosted.org/packages/e1/2e/5898933336b61975ce9dc04decbc0a7f2fee78c30353c5efba7f2d6ff27a/markupsafe-3.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4bd4cd07944443f5a265608cc6aab442e4f74dff8088b0dfc8238647b8f6ae9a", size = 12058, upload-time = "2025-09-27T18:36:19.444Z" }, + { url = "https://files.pythonhosted.org/packages/1d/09/adf2df3699d87d1d8184038df46a9c80d78c0148492323f4693df54e17bb/markupsafe-3.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b5420a1d9450023228968e7e6a9ce57f65d148ab56d2313fcd589eee96a7a50", size = 24287, upload-time = "2025-09-27T18:36:20.768Z" }, + { url = "https://files.pythonhosted.org/packages/30/ac/0273f6fcb5f42e314c6d8cd99effae6a5354604d461b8d392b5ec9530a54/markupsafe-3.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0bf2a864d67e76e5c9a34dc26ec616a66b9888e25e7b9460e1c76d3293bd9dbf", size = 22940, upload-time = "2025-09-27T18:36:22.249Z" }, + { url = "https://files.pythonhosted.org/packages/19/ae/31c1be199ef767124c042c6c3e904da327a2f7f0cd63a0337e1eca2967a8/markupsafe-3.0.3-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc51efed119bc9cfdf792cdeaa4d67e8f6fcccab66ed4bfdd6bde3e59bfcbb2f", size = 21887, upload-time = "2025-09-27T18:36:23.535Z" }, + { url = "https://files.pythonhosted.org/packages/b2/76/7edcab99d5349a4532a459e1fe64f0b0467a3365056ae550d3bcf3f79e1e/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:068f375c472b3e7acbe2d5318dea141359e6900156b5b2ba06a30b169086b91a", size = 23692, upload-time = "2025-09-27T18:36:24.823Z" }, + { url = "https://files.pythonhosted.org/packages/a4/28/6e74cdd26d7514849143d69f0bf2399f929c37dc2b31e6829fd2045b2765/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:7be7b61bb172e1ed687f1754f8e7484f1c8019780f6f6b0786e76bb01c2ae115", size = 21471, upload-time = "2025-09-27T18:36:25.95Z" }, + { url = "https://files.pythonhosted.org/packages/62/7e/a145f36a5c2945673e590850a6f8014318d5577ed7e5920a4b3448e0865d/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f9e130248f4462aaa8e2552d547f36ddadbeaa573879158d721bbd33dfe4743a", size = 22923, upload-time = "2025-09-27T18:36:27.109Z" }, + { url = "https://files.pythonhosted.org/packages/0f/62/d9c46a7f5c9adbeeeda52f5b8d802e1094e9717705a645efc71b0913a0a8/markupsafe-3.0.3-cp311-cp311-win32.whl", hash = "sha256:0db14f5dafddbb6d9208827849fad01f1a2609380add406671a26386cdf15a19", size = 14572, upload-time = "2025-09-27T18:36:28.045Z" }, + { url = "https://files.pythonhosted.org/packages/83/8a/4414c03d3f891739326e1783338e48fb49781cc915b2e0ee052aa490d586/markupsafe-3.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:de8a88e63464af587c950061a5e6a67d3632e36df62b986892331d4620a35c01", size = 15077, upload-time = "2025-09-27T18:36:29.025Z" }, + { url = "https://files.pythonhosted.org/packages/35/73/893072b42e6862f319b5207adc9ae06070f095b358655f077f69a35601f0/markupsafe-3.0.3-cp311-cp311-win_arm64.whl", hash = "sha256:3b562dd9e9ea93f13d53989d23a7e775fdfd1066c33494ff43f5418bc8c58a5c", size = 13876, upload-time = "2025-09-27T18:36:29.954Z" }, + { url = "https://files.pythonhosted.org/packages/5a/72/147da192e38635ada20e0a2e1a51cf8823d2119ce8883f7053879c2199b5/markupsafe-3.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d53197da72cc091b024dd97249dfc7794d6a56530370992a5e1a08983ad9230e", size = 11615, upload-time = "2025-09-27T18:36:30.854Z" }, + { url = "https://files.pythonhosted.org/packages/9a/81/7e4e08678a1f98521201c3079f77db69fb552acd56067661f8c2f534a718/markupsafe-3.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1872df69a4de6aead3491198eaf13810b565bdbeec3ae2dc8780f14458ec73ce", size = 12020, upload-time = "2025-09-27T18:36:31.971Z" }, + { url = "https://files.pythonhosted.org/packages/1e/2c/799f4742efc39633a1b54a92eec4082e4f815314869865d876824c257c1e/markupsafe-3.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a7e8ae81ae39e62a41ec302f972ba6ae23a5c5396c8e60113e9066ef893da0d", size = 24332, upload-time = "2025-09-27T18:36:32.813Z" }, + { url = "https://files.pythonhosted.org/packages/3c/2e/8d0c2ab90a8c1d9a24f0399058ab8519a3279d1bd4289511d74e909f060e/markupsafe-3.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d6dd0be5b5b189d31db7cda48b91d7e0a9795f31430b7f271219ab30f1d3ac9d", size = 22947, upload-time = "2025-09-27T18:36:33.86Z" }, + { url = "https://files.pythonhosted.org/packages/2c/54/887f3092a85238093a0b2154bd629c89444f395618842e8b0c41783898ea/markupsafe-3.0.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:94c6f0bb423f739146aec64595853541634bde58b2135f27f61c1ffd1cd4d16a", size = 21962, upload-time = "2025-09-27T18:36:35.099Z" }, + { url = "https://files.pythonhosted.org/packages/c9/2f/336b8c7b6f4a4d95e91119dc8521402461b74a485558d8f238a68312f11c/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:be8813b57049a7dc738189df53d69395eba14fb99345e0a5994914a3864c8a4b", size = 23760, upload-time = "2025-09-27T18:36:36.001Z" }, + { url = "https://files.pythonhosted.org/packages/32/43/67935f2b7e4982ffb50a4d169b724d74b62a3964bc1a9a527f5ac4f1ee2b/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:83891d0e9fb81a825d9a6d61e3f07550ca70a076484292a70fde82c4b807286f", size = 21529, upload-time = "2025-09-27T18:36:36.906Z" }, + { url = "https://files.pythonhosted.org/packages/89/e0/4486f11e51bbba8b0c041098859e869e304d1c261e59244baa3d295d47b7/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:77f0643abe7495da77fb436f50f8dab76dbc6e5fd25d39589a0f1fe6548bfa2b", size = 23015, upload-time = "2025-09-27T18:36:37.868Z" }, + { url = "https://files.pythonhosted.org/packages/2f/e1/78ee7a023dac597a5825441ebd17170785a9dab23de95d2c7508ade94e0e/markupsafe-3.0.3-cp312-cp312-win32.whl", hash = "sha256:d88b440e37a16e651bda4c7c2b930eb586fd15ca7406cb39e211fcff3bf3017d", size = 14540, upload-time = "2025-09-27T18:36:38.761Z" }, + { url = "https://files.pythonhosted.org/packages/aa/5b/bec5aa9bbbb2c946ca2733ef9c4ca91c91b6a24580193e891b5f7dbe8e1e/markupsafe-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:26a5784ded40c9e318cfc2bdb30fe164bdb8665ded9cd64d500a34fb42067b1c", size = 15105, upload-time = "2025-09-27T18:36:39.701Z" }, + { url = "https://files.pythonhosted.org/packages/e5/f1/216fc1bbfd74011693a4fd837e7026152e89c4bcf3e77b6692fba9923123/markupsafe-3.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:35add3b638a5d900e807944a078b51922212fb3dedb01633a8defc4b01a3c85f", size = 13906, upload-time = "2025-09-27T18:36:40.689Z" }, + { url = "https://files.pythonhosted.org/packages/38/2f/907b9c7bbba283e68f20259574b13d005c121a0fa4c175f9bed27c4597ff/markupsafe-3.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e1cf1972137e83c5d4c136c43ced9ac51d0e124706ee1c8aa8532c1287fa8795", size = 11622, upload-time = "2025-09-27T18:36:41.777Z" }, + { url = "https://files.pythonhosted.org/packages/9c/d9/5f7756922cdd676869eca1c4e3c0cd0df60ed30199ffd775e319089cb3ed/markupsafe-3.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:116bb52f642a37c115f517494ea5feb03889e04df47eeff5b130b1808ce7c219", size = 12029, upload-time = "2025-09-27T18:36:43.257Z" }, + { url = "https://files.pythonhosted.org/packages/00/07/575a68c754943058c78f30db02ee03a64b3c638586fba6a6dd56830b30a3/markupsafe-3.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:133a43e73a802c5562be9bbcd03d090aa5a1fe899db609c29e8c8d815c5f6de6", size = 24374, upload-time = "2025-09-27T18:36:44.508Z" }, + { url = "https://files.pythonhosted.org/packages/a9/21/9b05698b46f218fc0e118e1f8168395c65c8a2c750ae2bab54fc4bd4e0e8/markupsafe-3.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ccfcd093f13f0f0b7fdd0f198b90053bf7b2f02a3927a30e63f3ccc9df56b676", size = 22980, upload-time = "2025-09-27T18:36:45.385Z" }, + { url = "https://files.pythonhosted.org/packages/7f/71/544260864f893f18b6827315b988c146b559391e6e7e8f7252839b1b846a/markupsafe-3.0.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:509fa21c6deb7a7a273d629cf5ec029bc209d1a51178615ddf718f5918992ab9", size = 21990, upload-time = "2025-09-27T18:36:46.916Z" }, + { url = "https://files.pythonhosted.org/packages/c2/28/b50fc2f74d1ad761af2f5dcce7492648b983d00a65b8c0e0cb457c82ebbe/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4afe79fb3de0b7097d81da19090f4df4f8d3a2b3adaa8764138aac2e44f3af1", size = 23784, upload-time = "2025-09-27T18:36:47.884Z" }, + { url = "https://files.pythonhosted.org/packages/ed/76/104b2aa106a208da8b17a2fb72e033a5a9d7073c68f7e508b94916ed47a9/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:795e7751525cae078558e679d646ae45574b47ed6e7771863fcc079a6171a0fc", size = 21588, upload-time = "2025-09-27T18:36:48.82Z" }, + { url = "https://files.pythonhosted.org/packages/b5/99/16a5eb2d140087ebd97180d95249b00a03aa87e29cc224056274f2e45fd6/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8485f406a96febb5140bfeca44a73e3ce5116b2501ac54fe953e488fb1d03b12", size = 23041, upload-time = "2025-09-27T18:36:49.797Z" }, + { url = "https://files.pythonhosted.org/packages/19/bc/e7140ed90c5d61d77cea142eed9f9c303f4c4806f60a1044c13e3f1471d0/markupsafe-3.0.3-cp313-cp313-win32.whl", hash = "sha256:bdd37121970bfd8be76c5fb069c7751683bdf373db1ed6c010162b2a130248ed", size = 14543, upload-time = "2025-09-27T18:36:51.584Z" }, + { url = "https://files.pythonhosted.org/packages/05/73/c4abe620b841b6b791f2edc248f556900667a5a1cf023a6646967ae98335/markupsafe-3.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:9a1abfdc021a164803f4d485104931fb8f8c1efd55bc6b748d2f5774e78b62c5", size = 15113, upload-time = "2025-09-27T18:36:52.537Z" }, + { url = "https://files.pythonhosted.org/packages/f0/3a/fa34a0f7cfef23cf9500d68cb7c32dd64ffd58a12b09225fb03dd37d5b80/markupsafe-3.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:7e68f88e5b8799aa49c85cd116c932a1ac15caaa3f5db09087854d218359e485", size = 13911, upload-time = "2025-09-27T18:36:53.513Z" }, + { url = "https://files.pythonhosted.org/packages/e4/d7/e05cd7efe43a88a17a37b3ae96e79a19e846f3f456fe79c57ca61356ef01/markupsafe-3.0.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:218551f6df4868a8d527e3062d0fb968682fe92054e89978594c28e642c43a73", size = 11658, upload-time = "2025-09-27T18:36:54.819Z" }, + { url = "https://files.pythonhosted.org/packages/99/9e/e412117548182ce2148bdeacdda3bb494260c0b0184360fe0d56389b523b/markupsafe-3.0.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3524b778fe5cfb3452a09d31e7b5adefeea8c5be1d43c4f810ba09f2ceb29d37", size = 12066, upload-time = "2025-09-27T18:36:55.714Z" }, + { url = "https://files.pythonhosted.org/packages/bc/e6/fa0ffcda717ef64a5108eaa7b4f5ed28d56122c9a6d70ab8b72f9f715c80/markupsafe-3.0.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4e885a3d1efa2eadc93c894a21770e4bc67899e3543680313b09f139e149ab19", size = 25639, upload-time = "2025-09-27T18:36:56.908Z" }, + { url = "https://files.pythonhosted.org/packages/96/ec/2102e881fe9d25fc16cb4b25d5f5cde50970967ffa5dddafdb771237062d/markupsafe-3.0.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8709b08f4a89aa7586de0aadc8da56180242ee0ada3999749b183aa23df95025", size = 23569, upload-time = "2025-09-27T18:36:57.913Z" }, + { url = "https://files.pythonhosted.org/packages/4b/30/6f2fce1f1f205fc9323255b216ca8a235b15860c34b6798f810f05828e32/markupsafe-3.0.3-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b8512a91625c9b3da6f127803b166b629725e68af71f8184ae7e7d54686a56d6", size = 23284, upload-time = "2025-09-27T18:36:58.833Z" }, + { url = "https://files.pythonhosted.org/packages/58/47/4a0ccea4ab9f5dcb6f79c0236d954acb382202721e704223a8aafa38b5c8/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9b79b7a16f7fedff2495d684f2b59b0457c3b493778c9eed31111be64d58279f", size = 24801, upload-time = "2025-09-27T18:36:59.739Z" }, + { url = "https://files.pythonhosted.org/packages/6a/70/3780e9b72180b6fecb83a4814d84c3bf4b4ae4bf0b19c27196104149734c/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:12c63dfb4a98206f045aa9563db46507995f7ef6d83b2f68eda65c307c6829eb", size = 22769, upload-time = "2025-09-27T18:37:00.719Z" }, + { url = "https://files.pythonhosted.org/packages/98/c5/c03c7f4125180fc215220c035beac6b9cb684bc7a067c84fc69414d315f5/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8f71bc33915be5186016f675cd83a1e08523649b0e33efdb898db577ef5bb009", size = 23642, upload-time = "2025-09-27T18:37:01.673Z" }, + { url = "https://files.pythonhosted.org/packages/80/d6/2d1b89f6ca4bff1036499b1e29a1d02d282259f3681540e16563f27ebc23/markupsafe-3.0.3-cp313-cp313t-win32.whl", hash = "sha256:69c0b73548bc525c8cb9a251cddf1931d1db4d2258e9599c28c07ef3580ef354", size = 14612, upload-time = "2025-09-27T18:37:02.639Z" }, + { url = "https://files.pythonhosted.org/packages/2b/98/e48a4bfba0a0ffcf9925fe2d69240bfaa19c6f7507b8cd09c70684a53c1e/markupsafe-3.0.3-cp313-cp313t-win_amd64.whl", hash = "sha256:1b4b79e8ebf6b55351f0d91fe80f893b4743f104bff22e90697db1590e47a218", size = 15200, upload-time = "2025-09-27T18:37:03.582Z" }, + { url = "https://files.pythonhosted.org/packages/0e/72/e3cc540f351f316e9ed0f092757459afbc595824ca724cbc5a5d4263713f/markupsafe-3.0.3-cp313-cp313t-win_arm64.whl", hash = "sha256:ad2cf8aa28b8c020ab2fc8287b0f823d0a7d8630784c31e9ee5edea20f406287", size = 13973, upload-time = "2025-09-27T18:37:04.929Z" }, + { url = "https://files.pythonhosted.org/packages/33/8a/8e42d4838cd89b7dde187011e97fe6c3af66d8c044997d2183fbd6d31352/markupsafe-3.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:eaa9599de571d72e2daf60164784109f19978b327a3910d3e9de8c97b5b70cfe", size = 11619, upload-time = "2025-09-27T18:37:06.342Z" }, + { url = "https://files.pythonhosted.org/packages/b5/64/7660f8a4a8e53c924d0fa05dc3a55c9cee10bbd82b11c5afb27d44b096ce/markupsafe-3.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c47a551199eb8eb2121d4f0f15ae0f923d31350ab9280078d1e5f12b249e0026", size = 12029, upload-time = "2025-09-27T18:37:07.213Z" }, + { url = "https://files.pythonhosted.org/packages/da/ef/e648bfd021127bef5fa12e1720ffed0c6cbb8310c8d9bea7266337ff06de/markupsafe-3.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f34c41761022dd093b4b6896d4810782ffbabe30f2d443ff5f083e0cbbb8c737", size = 24408, upload-time = "2025-09-27T18:37:09.572Z" }, + { url = "https://files.pythonhosted.org/packages/41/3c/a36c2450754618e62008bf7435ccb0f88053e07592e6028a34776213d877/markupsafe-3.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:457a69a9577064c05a97c41f4e65148652db078a3a509039e64d3467b9e7ef97", size = 23005, upload-time = "2025-09-27T18:37:10.58Z" }, + { url = "https://files.pythonhosted.org/packages/bc/20/b7fdf89a8456b099837cd1dc21974632a02a999ec9bf7ca3e490aacd98e7/markupsafe-3.0.3-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e8afc3f2ccfa24215f8cb28dcf43f0113ac3c37c2f0f0806d8c70e4228c5cf4d", size = 22048, upload-time = "2025-09-27T18:37:11.547Z" }, + { url = "https://files.pythonhosted.org/packages/9a/a7/591f592afdc734f47db08a75793a55d7fbcc6902a723ae4cfbab61010cc5/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ec15a59cf5af7be74194f7ab02d0f59a62bdcf1a537677ce67a2537c9b87fcda", size = 23821, upload-time = "2025-09-27T18:37:12.48Z" }, + { url = "https://files.pythonhosted.org/packages/7d/33/45b24e4f44195b26521bc6f1a82197118f74df348556594bd2262bda1038/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:0eb9ff8191e8498cca014656ae6b8d61f39da5f95b488805da4bb029cccbfbaf", size = 21606, upload-time = "2025-09-27T18:37:13.485Z" }, + { url = "https://files.pythonhosted.org/packages/ff/0e/53dfaca23a69fbfbbf17a4b64072090e70717344c52eaaaa9c5ddff1e5f0/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2713baf880df847f2bece4230d4d094280f4e67b1e813eec43b4c0e144a34ffe", size = 23043, upload-time = "2025-09-27T18:37:14.408Z" }, + { url = "https://files.pythonhosted.org/packages/46/11/f333a06fc16236d5238bfe74daccbca41459dcd8d1fa952e8fbd5dccfb70/markupsafe-3.0.3-cp314-cp314-win32.whl", hash = "sha256:729586769a26dbceff69f7a7dbbf59ab6572b99d94576a5592625d5b411576b9", size = 14747, upload-time = "2025-09-27T18:37:15.36Z" }, + { url = "https://files.pythonhosted.org/packages/28/52/182836104b33b444e400b14f797212f720cbc9ed6ba34c800639d154e821/markupsafe-3.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:bdc919ead48f234740ad807933cdf545180bfbe9342c2bb451556db2ed958581", size = 15341, upload-time = "2025-09-27T18:37:16.496Z" }, + { url = "https://files.pythonhosted.org/packages/6f/18/acf23e91bd94fd7b3031558b1f013adfa21a8e407a3fdb32745538730382/markupsafe-3.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:5a7d5dc5140555cf21a6fefbdbf8723f06fcd2f63ef108f2854de715e4422cb4", size = 14073, upload-time = "2025-09-27T18:37:17.476Z" }, + { url = "https://files.pythonhosted.org/packages/3c/f0/57689aa4076e1b43b15fdfa646b04653969d50cf30c32a102762be2485da/markupsafe-3.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:1353ef0c1b138e1907ae78e2f6c63ff67501122006b0f9abad68fda5f4ffc6ab", size = 11661, upload-time = "2025-09-27T18:37:18.453Z" }, + { url = "https://files.pythonhosted.org/packages/89/c3/2e67a7ca217c6912985ec766c6393b636fb0c2344443ff9d91404dc4c79f/markupsafe-3.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1085e7fbddd3be5f89cc898938f42c0b3c711fdcb37d75221de2666af647c175", size = 12069, upload-time = "2025-09-27T18:37:19.332Z" }, + { url = "https://files.pythonhosted.org/packages/f0/00/be561dce4e6ca66b15276e184ce4b8aec61fe83662cce2f7d72bd3249d28/markupsafe-3.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1b52b4fb9df4eb9ae465f8d0c228a00624de2334f216f178a995ccdcf82c4634", size = 25670, upload-time = "2025-09-27T18:37:20.245Z" }, + { url = "https://files.pythonhosted.org/packages/50/09/c419f6f5a92e5fadde27efd190eca90f05e1261b10dbd8cbcb39cd8ea1dc/markupsafe-3.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fed51ac40f757d41b7c48425901843666a6677e3e8eb0abcff09e4ba6e664f50", size = 23598, upload-time = "2025-09-27T18:37:21.177Z" }, + { url = "https://files.pythonhosted.org/packages/22/44/a0681611106e0b2921b3033fc19bc53323e0b50bc70cffdd19f7d679bb66/markupsafe-3.0.3-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f190daf01f13c72eac4efd5c430a8de82489d9cff23c364c3ea822545032993e", size = 23261, upload-time = "2025-09-27T18:37:22.167Z" }, + { url = "https://files.pythonhosted.org/packages/5f/57/1b0b3f100259dc9fffe780cfb60d4be71375510e435efec3d116b6436d43/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e56b7d45a839a697b5eb268c82a71bd8c7f6c94d6fd50c3d577fa39a9f1409f5", size = 24835, upload-time = "2025-09-27T18:37:23.296Z" }, + { url = "https://files.pythonhosted.org/packages/26/6a/4bf6d0c97c4920f1597cc14dd720705eca0bf7c787aebc6bb4d1bead5388/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:f3e98bb3798ead92273dc0e5fd0f31ade220f59a266ffd8a4f6065e0a3ce0523", size = 22733, upload-time = "2025-09-27T18:37:24.237Z" }, + { url = "https://files.pythonhosted.org/packages/14/c7/ca723101509b518797fedc2fdf79ba57f886b4aca8a7d31857ba3ee8281f/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5678211cb9333a6468fb8d8be0305520aa073f50d17f089b5b4b477ea6e67fdc", size = 23672, upload-time = "2025-09-27T18:37:25.271Z" }, + { url = "https://files.pythonhosted.org/packages/fb/df/5bd7a48c256faecd1d36edc13133e51397e41b73bb77e1a69deab746ebac/markupsafe-3.0.3-cp314-cp314t-win32.whl", hash = "sha256:915c04ba3851909ce68ccc2b8e2cd691618c4dc4c4232fb7982bca3f41fd8c3d", size = 14819, upload-time = "2025-09-27T18:37:26.285Z" }, + { url = "https://files.pythonhosted.org/packages/1a/8a/0402ba61a2f16038b48b39bccca271134be00c5c9f0f623208399333c448/markupsafe-3.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4faffd047e07c38848ce017e8725090413cd80cbc23d86e55c587bf979e579c9", size = 15426, upload-time = "2025-09-27T18:37:27.316Z" }, + { url = "https://files.pythonhosted.org/packages/70/bc/6f1c2f612465f5fa89b95bead1f44dcb607670fd42891d8fdcd5d039f4f4/markupsafe-3.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:32001d6a8fc98c8cb5c947787c5d08b0a50663d139f1305bac5885d98d9b40fa", size = 14146, upload-time = "2025-09-27T18:37:28.327Z" }, +] + +[[package]] +name = "mdurl" +version = "0.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload-time = "2022-08-14T12:40:10.846Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" }, +] + +[[package]] +name = "mistralai" +version = "2.6.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "eval-type-backport" }, + { name = "httpx" }, + { name = "jsonpath-python" }, + { name = "opentelemetry-api" }, + { name = "opentelemetry-semantic-conventions" }, + { name = "pydantic" }, + { name = "python-dateutil" }, + { name = "typing-inspection" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/39/c1/c6452c81a3d7fc0423b4cfcd84840cf7141c93a0c50755abc27a7619a988/mistralai-2.6.0.tar.gz", hash = "sha256:531a86292ad498fc0fcd6dfcd480a3f4db9e92f558e14ffb22172824831e3a6e", size = 518760, upload-time = "2026-07-06T14:40:08.578Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e3/d5/6b9c08ab9b5b890970e8949bf00a9f8f82653826de5cc5ad506fe1c1fb73/mistralai-2.6.0-py3-none-any.whl", hash = "sha256:4b7202b0cab84ea03f8ff4a933c8cfc615b3057520d9d76467c07aa23939dab2", size = 1235945, upload-time = "2026-07-06T14:40:06.226Z" }, +] + +[[package]] +name = "numpy" +version = "2.2.6" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.11'", +] +sdist = { url = "https://files.pythonhosted.org/packages/76/21/7d2a95e4bba9dc13d043ee156a356c0a8f0c6309dff6b21b4d71a073b8a8/numpy-2.2.6.tar.gz", hash = "sha256:e29554e2bef54a90aa5cc07da6ce955accb83f21ab5de01a62c8478897b264fd", size = 20276440, upload-time = "2025-05-17T22:38:04.611Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9a/3e/ed6db5be21ce87955c0cbd3009f2803f59fa08df21b5df06862e2d8e2bdd/numpy-2.2.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b412caa66f72040e6d268491a59f2c43bf03eb6c96dd8f0307829feb7fa2b6fb", size = 21165245, upload-time = "2025-05-17T21:27:58.555Z" }, + { url = "https://files.pythonhosted.org/packages/22/c2/4b9221495b2a132cc9d2eb862e21d42a009f5a60e45fc44b00118c174bff/numpy-2.2.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e41fd67c52b86603a91c1a505ebaef50b3314de0213461c7a6e99c9a3beff90", size = 14360048, upload-time = "2025-05-17T21:28:21.406Z" }, + { url = "https://files.pythonhosted.org/packages/fd/77/dc2fcfc66943c6410e2bf598062f5959372735ffda175b39906d54f02349/numpy-2.2.6-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:37e990a01ae6ec7fe7fa1c26c55ecb672dd98b19c3d0e1d1f326fa13cb38d163", size = 5340542, upload-time = "2025-05-17T21:28:30.931Z" }, + { url = "https://files.pythonhosted.org/packages/7a/4f/1cb5fdc353a5f5cc7feb692db9b8ec2c3d6405453f982435efc52561df58/numpy-2.2.6-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:5a6429d4be8ca66d889b7cf70f536a397dc45ba6faeb5f8c5427935d9592e9cf", size = 6878301, upload-time = "2025-05-17T21:28:41.613Z" }, + { url = "https://files.pythonhosted.org/packages/eb/17/96a3acd228cec142fcb8723bd3cc39c2a474f7dcf0a5d16731980bcafa95/numpy-2.2.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:efd28d4e9cd7d7a8d39074a4d44c63eda73401580c5c76acda2ce969e0a38e83", size = 14297320, upload-time = "2025-05-17T21:29:02.78Z" }, + { url = "https://files.pythonhosted.org/packages/b4/63/3de6a34ad7ad6646ac7d2f55ebc6ad439dbbf9c4370017c50cf403fb19b5/numpy-2.2.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc7b73d02efb0e18c000e9ad8b83480dfcd5dfd11065997ed4c6747470ae8915", size = 16801050, upload-time = "2025-05-17T21:29:27.675Z" }, + { url = "https://files.pythonhosted.org/packages/07/b6/89d837eddef52b3d0cec5c6ba0456c1bf1b9ef6a6672fc2b7873c3ec4e2e/numpy-2.2.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:74d4531beb257d2c3f4b261bfb0fc09e0f9ebb8842d82a7b4209415896adc680", size = 15807034, upload-time = "2025-05-17T21:29:51.102Z" }, + { url = "https://files.pythonhosted.org/packages/01/c8/dc6ae86e3c61cfec1f178e5c9f7858584049b6093f843bca541f94120920/numpy-2.2.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8fc377d995680230e83241d8a96def29f204b5782f371c532579b4f20607a289", size = 18614185, upload-time = "2025-05-17T21:30:18.703Z" }, + { url = "https://files.pythonhosted.org/packages/5b/c5/0064b1b7e7c89137b471ccec1fd2282fceaae0ab3a9550f2568782d80357/numpy-2.2.6-cp310-cp310-win32.whl", hash = "sha256:b093dd74e50a8cba3e873868d9e93a85b78e0daf2e98c6797566ad8044e8363d", size = 6527149, upload-time = "2025-05-17T21:30:29.788Z" }, + { url = "https://files.pythonhosted.org/packages/a3/dd/4b822569d6b96c39d1215dbae0582fd99954dcbcf0c1a13c61783feaca3f/numpy-2.2.6-cp310-cp310-win_amd64.whl", hash = "sha256:f0fd6321b839904e15c46e0d257fdd101dd7f530fe03fd6359c1ea63738703f3", size = 12904620, upload-time = "2025-05-17T21:30:48.994Z" }, + { url = "https://files.pythonhosted.org/packages/da/a8/4f83e2aa666a9fbf56d6118faaaf5f1974d456b1823fda0a176eff722839/numpy-2.2.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f9f1adb22318e121c5c69a09142811a201ef17ab257a1e66ca3025065b7f53ae", size = 21176963, upload-time = "2025-05-17T21:31:19.36Z" }, + { url = "https://files.pythonhosted.org/packages/b3/2b/64e1affc7972decb74c9e29e5649fac940514910960ba25cd9af4488b66c/numpy-2.2.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c820a93b0255bc360f53eca31a0e676fd1101f673dda8da93454a12e23fc5f7a", size = 14406743, upload-time = "2025-05-17T21:31:41.087Z" }, + { url = "https://files.pythonhosted.org/packages/4a/9f/0121e375000b5e50ffdd8b25bf78d8e1a5aa4cca3f185d41265198c7b834/numpy-2.2.6-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:3d70692235e759f260c3d837193090014aebdf026dfd167834bcba43e30c2a42", size = 5352616, upload-time = "2025-05-17T21:31:50.072Z" }, + { url = "https://files.pythonhosted.org/packages/31/0d/b48c405c91693635fbe2dcd7bc84a33a602add5f63286e024d3b6741411c/numpy-2.2.6-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:481b49095335f8eed42e39e8041327c05b0f6f4780488f61286ed3c01368d491", size = 6889579, upload-time = "2025-05-17T21:32:01.712Z" }, + { url = "https://files.pythonhosted.org/packages/52/b8/7f0554d49b565d0171eab6e99001846882000883998e7b7d9f0d98b1f934/numpy-2.2.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b64d8d4d17135e00c8e346e0a738deb17e754230d7e0810ac5012750bbd85a5a", size = 14312005, upload-time = "2025-05-17T21:32:23.332Z" }, + { url = "https://files.pythonhosted.org/packages/b3/dd/2238b898e51bd6d389b7389ffb20d7f4c10066d80351187ec8e303a5a475/numpy-2.2.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba10f8411898fc418a521833e014a77d3ca01c15b0c6cdcce6a0d2897e6dbbdf", size = 16821570, upload-time = "2025-05-17T21:32:47.991Z" }, + { url = "https://files.pythonhosted.org/packages/83/6c/44d0325722cf644f191042bf47eedad61c1e6df2432ed65cbe28509d404e/numpy-2.2.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:bd48227a919f1bafbdda0583705e547892342c26fb127219d60a5c36882609d1", size = 15818548, upload-time = "2025-05-17T21:33:11.728Z" }, + { url = "https://files.pythonhosted.org/packages/ae/9d/81e8216030ce66be25279098789b665d49ff19eef08bfa8cb96d4957f422/numpy-2.2.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9551a499bf125c1d4f9e250377c1ee2eddd02e01eac6644c080162c0c51778ab", size = 18620521, upload-time = "2025-05-17T21:33:39.139Z" }, + { url = "https://files.pythonhosted.org/packages/6a/fd/e19617b9530b031db51b0926eed5345ce8ddc669bb3bc0044b23e275ebe8/numpy-2.2.6-cp311-cp311-win32.whl", hash = "sha256:0678000bb9ac1475cd454c6b8c799206af8107e310843532b04d49649c717a47", size = 6525866, upload-time = "2025-05-17T21:33:50.273Z" }, + { url = "https://files.pythonhosted.org/packages/31/0a/f354fb7176b81747d870f7991dc763e157a934c717b67b58456bc63da3df/numpy-2.2.6-cp311-cp311-win_amd64.whl", hash = "sha256:e8213002e427c69c45a52bbd94163084025f533a55a59d6f9c5b820774ef3303", size = 12907455, upload-time = "2025-05-17T21:34:09.135Z" }, + { url = "https://files.pythonhosted.org/packages/82/5d/c00588b6cf18e1da539b45d3598d3557084990dcc4331960c15ee776ee41/numpy-2.2.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:41c5a21f4a04fa86436124d388f6ed60a9343a6f767fced1a8a71c3fbca038ff", size = 20875348, upload-time = "2025-05-17T21:34:39.648Z" }, + { url = "https://files.pythonhosted.org/packages/66/ee/560deadcdde6c2f90200450d5938f63a34b37e27ebff162810f716f6a230/numpy-2.2.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:de749064336d37e340f640b05f24e9e3dd678c57318c7289d222a8a2f543e90c", size = 14119362, upload-time = "2025-05-17T21:35:01.241Z" }, + { url = "https://files.pythonhosted.org/packages/3c/65/4baa99f1c53b30adf0acd9a5519078871ddde8d2339dc5a7fde80d9d87da/numpy-2.2.6-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:894b3a42502226a1cac872f840030665f33326fc3dac8e57c607905773cdcde3", size = 5084103, upload-time = "2025-05-17T21:35:10.622Z" }, + { url = "https://files.pythonhosted.org/packages/cc/89/e5a34c071a0570cc40c9a54eb472d113eea6d002e9ae12bb3a8407fb912e/numpy-2.2.6-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:71594f7c51a18e728451bb50cc60a3ce4e6538822731b2933209a1f3614e9282", size = 6625382, upload-time = "2025-05-17T21:35:21.414Z" }, + { url = "https://files.pythonhosted.org/packages/f8/35/8c80729f1ff76b3921d5c9487c7ac3de9b2a103b1cd05e905b3090513510/numpy-2.2.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f2618db89be1b4e05f7a1a847a9c1c0abd63e63a1607d892dd54668dd92faf87", size = 14018462, upload-time = "2025-05-17T21:35:42.174Z" }, + { url = "https://files.pythonhosted.org/packages/8c/3d/1e1db36cfd41f895d266b103df00ca5b3cbe965184df824dec5c08c6b803/numpy-2.2.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd83c01228a688733f1ded5201c678f0c53ecc1006ffbc404db9f7a899ac6249", size = 16527618, upload-time = "2025-05-17T21:36:06.711Z" }, + { url = "https://files.pythonhosted.org/packages/61/c6/03ed30992602c85aa3cd95b9070a514f8b3c33e31124694438d88809ae36/numpy-2.2.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:37c0ca431f82cd5fa716eca9506aefcabc247fb27ba69c5062a6d3ade8cf8f49", size = 15505511, upload-time = "2025-05-17T21:36:29.965Z" }, + { url = "https://files.pythonhosted.org/packages/b7/25/5761d832a81df431e260719ec45de696414266613c9ee268394dd5ad8236/numpy-2.2.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fe27749d33bb772c80dcd84ae7e8df2adc920ae8297400dabec45f0dedb3f6de", size = 18313783, upload-time = "2025-05-17T21:36:56.883Z" }, + { url = "https://files.pythonhosted.org/packages/57/0a/72d5a3527c5ebffcd47bde9162c39fae1f90138c961e5296491ce778e682/numpy-2.2.6-cp312-cp312-win32.whl", hash = "sha256:4eeaae00d789f66c7a25ac5f34b71a7035bb474e679f410e5e1a94deb24cf2d4", size = 6246506, upload-time = "2025-05-17T21:37:07.368Z" }, + { url = "https://files.pythonhosted.org/packages/36/fa/8c9210162ca1b88529ab76b41ba02d433fd54fecaf6feb70ef9f124683f1/numpy-2.2.6-cp312-cp312-win_amd64.whl", hash = "sha256:c1f9540be57940698ed329904db803cf7a402f3fc200bfe599334c9bd84a40b2", size = 12614190, upload-time = "2025-05-17T21:37:26.213Z" }, + { url = "https://files.pythonhosted.org/packages/f9/5c/6657823f4f594f72b5471f1db1ab12e26e890bb2e41897522d134d2a3e81/numpy-2.2.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0811bb762109d9708cca4d0b13c4f67146e3c3b7cf8d34018c722adb2d957c84", size = 20867828, upload-time = "2025-05-17T21:37:56.699Z" }, + { url = "https://files.pythonhosted.org/packages/dc/9e/14520dc3dadf3c803473bd07e9b2bd1b69bc583cb2497b47000fed2fa92f/numpy-2.2.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:287cc3162b6f01463ccd86be154f284d0893d2b3ed7292439ea97eafa8170e0b", size = 14143006, upload-time = "2025-05-17T21:38:18.291Z" }, + { url = "https://files.pythonhosted.org/packages/4f/06/7e96c57d90bebdce9918412087fc22ca9851cceaf5567a45c1f404480e9e/numpy-2.2.6-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:f1372f041402e37e5e633e586f62aa53de2eac8d98cbfb822806ce4bbefcb74d", size = 5076765, upload-time = "2025-05-17T21:38:27.319Z" }, + { url = "https://files.pythonhosted.org/packages/73/ed/63d920c23b4289fdac96ddbdd6132e9427790977d5457cd132f18e76eae0/numpy-2.2.6-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:55a4d33fa519660d69614a9fad433be87e5252f4b03850642f88993f7b2ca566", size = 6617736, upload-time = "2025-05-17T21:38:38.141Z" }, + { url = "https://files.pythonhosted.org/packages/85/c5/e19c8f99d83fd377ec8c7e0cf627a8049746da54afc24ef0a0cb73d5dfb5/numpy-2.2.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f92729c95468a2f4f15e9bb94c432a9229d0d50de67304399627a943201baa2f", size = 14010719, upload-time = "2025-05-17T21:38:58.433Z" }, + { url = "https://files.pythonhosted.org/packages/19/49/4df9123aafa7b539317bf6d342cb6d227e49f7a35b99c287a6109b13dd93/numpy-2.2.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1bc23a79bfabc5d056d106f9befb8d50c31ced2fbc70eedb8155aec74a45798f", size = 16526072, upload-time = "2025-05-17T21:39:22.638Z" }, + { url = "https://files.pythonhosted.org/packages/b2/6c/04b5f47f4f32f7c2b0e7260442a8cbcf8168b0e1a41ff1495da42f42a14f/numpy-2.2.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e3143e4451880bed956e706a3220b4e5cf6172ef05fcc397f6f36a550b1dd868", size = 15503213, upload-time = "2025-05-17T21:39:45.865Z" }, + { url = "https://files.pythonhosted.org/packages/17/0a/5cd92e352c1307640d5b6fec1b2ffb06cd0dabe7d7b8227f97933d378422/numpy-2.2.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b4f13750ce79751586ae2eb824ba7e1e8dba64784086c98cdbbcc6a42112ce0d", size = 18316632, upload-time = "2025-05-17T21:40:13.331Z" }, + { url = "https://files.pythonhosted.org/packages/f0/3b/5cba2b1d88760ef86596ad0f3d484b1cbff7c115ae2429678465057c5155/numpy-2.2.6-cp313-cp313-win32.whl", hash = "sha256:5beb72339d9d4fa36522fc63802f469b13cdbe4fdab4a288f0c441b74272ebfd", size = 6244532, upload-time = "2025-05-17T21:43:46.099Z" }, + { url = "https://files.pythonhosted.org/packages/cb/3b/d58c12eafcb298d4e6d0d40216866ab15f59e55d148a5658bb3132311fcf/numpy-2.2.6-cp313-cp313-win_amd64.whl", hash = "sha256:b0544343a702fa80c95ad5d3d608ea3599dd54d4632df855e4c8d24eb6ecfa1c", size = 12610885, upload-time = "2025-05-17T21:44:05.145Z" }, + { url = "https://files.pythonhosted.org/packages/6b/9e/4bf918b818e516322db999ac25d00c75788ddfd2d2ade4fa66f1f38097e1/numpy-2.2.6-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0bca768cd85ae743b2affdc762d617eddf3bcf8724435498a1e80132d04879e6", size = 20963467, upload-time = "2025-05-17T21:40:44Z" }, + { url = "https://files.pythonhosted.org/packages/61/66/d2de6b291507517ff2e438e13ff7b1e2cdbdb7cb40b3ed475377aece69f9/numpy-2.2.6-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:fc0c5673685c508a142ca65209b4e79ed6740a4ed6b2267dbba90f34b0b3cfda", size = 14225144, upload-time = "2025-05-17T21:41:05.695Z" }, + { url = "https://files.pythonhosted.org/packages/e4/25/480387655407ead912e28ba3a820bc69af9adf13bcbe40b299d454ec011f/numpy-2.2.6-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:5bd4fc3ac8926b3819797a7c0e2631eb889b4118a9898c84f585a54d475b7e40", size = 5200217, upload-time = "2025-05-17T21:41:15.903Z" }, + { url = "https://files.pythonhosted.org/packages/aa/4a/6e313b5108f53dcbf3aca0c0f3e9c92f4c10ce57a0a721851f9785872895/numpy-2.2.6-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:fee4236c876c4e8369388054d02d0e9bb84821feb1a64dd59e137e6511a551f8", size = 6712014, upload-time = "2025-05-17T21:41:27.321Z" }, + { url = "https://files.pythonhosted.org/packages/b7/30/172c2d5c4be71fdf476e9de553443cf8e25feddbe185e0bd88b096915bcc/numpy-2.2.6-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e1dda9c7e08dc141e0247a5b8f49cf05984955246a327d4c48bda16821947b2f", size = 14077935, upload-time = "2025-05-17T21:41:49.738Z" }, + { url = "https://files.pythonhosted.org/packages/12/fb/9e743f8d4e4d3c710902cf87af3512082ae3d43b945d5d16563f26ec251d/numpy-2.2.6-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f447e6acb680fd307f40d3da4852208af94afdfab89cf850986c3ca00562f4fa", size = 16600122, upload-time = "2025-05-17T21:42:14.046Z" }, + { url = "https://files.pythonhosted.org/packages/12/75/ee20da0e58d3a66f204f38916757e01e33a9737d0b22373b3eb5a27358f9/numpy-2.2.6-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:389d771b1623ec92636b0786bc4ae56abafad4a4c513d36a55dce14bd9ce8571", size = 15586143, upload-time = "2025-05-17T21:42:37.464Z" }, + { url = "https://files.pythonhosted.org/packages/76/95/bef5b37f29fc5e739947e9ce5179ad402875633308504a52d188302319c8/numpy-2.2.6-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8e9ace4a37db23421249ed236fdcdd457d671e25146786dfc96835cd951aa7c1", size = 18385260, upload-time = "2025-05-17T21:43:05.189Z" }, + { url = "https://files.pythonhosted.org/packages/09/04/f2f83279d287407cf36a7a8053a5abe7be3622a4363337338f2585e4afda/numpy-2.2.6-cp313-cp313t-win32.whl", hash = "sha256:038613e9fb8c72b0a41f025a7e4c3f0b7a1b5d768ece4796b674c8f3fe13efff", size = 6377225, upload-time = "2025-05-17T21:43:16.254Z" }, + { url = "https://files.pythonhosted.org/packages/67/0e/35082d13c09c02c011cf21570543d202ad929d961c02a147493cb0c2bdf5/numpy-2.2.6-cp313-cp313t-win_amd64.whl", hash = "sha256:6031dd6dfecc0cf9f668681a37648373bddd6421fff6c66ec1624eed0180ee06", size = 12771374, upload-time = "2025-05-17T21:43:35.479Z" }, + { url = "https://files.pythonhosted.org/packages/9e/3b/d94a75f4dbf1ef5d321523ecac21ef23a3cd2ac8b78ae2aac40873590229/numpy-2.2.6-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0b605b275d7bd0c640cad4e5d30fa701a8d59302e127e5f79138ad62762c3e3d", size = 21040391, upload-time = "2025-05-17T21:44:35.948Z" }, + { url = "https://files.pythonhosted.org/packages/17/f4/09b2fa1b58f0fb4f7c7963a1649c64c4d315752240377ed74d9cd878f7b5/numpy-2.2.6-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:7befc596a7dc9da8a337f79802ee8adb30a552a94f792b9c9d18c840055907db", size = 6786754, upload-time = "2025-05-17T21:44:47.446Z" }, + { url = "https://files.pythonhosted.org/packages/af/30/feba75f143bdc868a1cc3f44ccfa6c4b9ec522b36458e738cd00f67b573f/numpy-2.2.6-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce47521a4754c8f4593837384bd3424880629f718d87c5d44f8ed763edd63543", size = 16643476, upload-time = "2025-05-17T21:45:11.871Z" }, + { url = "https://files.pythonhosted.org/packages/37/48/ac2a9584402fb6c0cd5b5d1a91dcf176b15760130dd386bbafdbfe3640bf/numpy-2.2.6-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d042d24c90c41b54fd506da306759e06e568864df8ec17ccc17e9e884634fd00", size = 12812666, upload-time = "2025-05-17T21:45:31.426Z" }, +] + +[[package]] +name = "numpy" +version = "2.4.6" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.11.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/d0/ad/fed0499ce6a338d2a03ebae59cd15093910c8875328855781952abf6c2fe/numpy-2.4.6.tar.gz", hash = "sha256:f3a3570c4a2a16746ac2c31a7c7c7b0c186b95ce902e33db6f28094ed7387dda", size = 20735807, upload-time = "2026-05-18T23:37:14.07Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/49/ec46835a70be8fa6446c495126ac84fdb28cb2558e1620ffb87a10c8b64c/numpy-2.4.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0280e0356c0829a18d9de1cb7eee50ec22ca639878d7240307ca0943d73cd2c4", size = 16969194, upload-time = "2026-05-18T23:33:13.503Z" }, + { url = "https://files.pythonhosted.org/packages/0e/0d/f5957185c0ee2f3e12f78715aa9e3b353fd83633316c8532b38faa37e3f6/numpy-2.4.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:110f8b71aacb688ec69062bb7f6938a0f8acb01b7c1c4beb453c65b6d234584d", size = 14964111, upload-time = "2026-05-18T23:33:17.795Z" }, + { url = "https://files.pythonhosted.org/packages/ad/40/40a40ee0ddf7ceb782c49af278894b686e586d65d8c1889c8b5da01a3d7d/numpy-2.4.6-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:4cfe66903cc32a9921a6733d96b19bb6abf310397581bbad89c228f5abaf0ee8", size = 5469159, upload-time = "2026-05-18T23:33:20.654Z" }, + { url = "https://files.pythonhosted.org/packages/63/13/f9a8046535cb21deae82f8d03de9617e08882d274fad2539630761888228/numpy-2.4.6-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:8155154c7c691289fe18f510b5d4657c68c67989f293f0535a91360392ff6538", size = 6798936, upload-time = "2026-05-18T23:33:22.987Z" }, + { url = "https://files.pythonhosted.org/packages/33/a8/6fa8c1a345a8c85dbb21932c447bee07c30a2c2a3f31e369c0a84b300147/numpy-2.4.6-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0ab0a9c4ffb1a6d95ef519fe4247dba8eb6b18ad93999f76b7f657039acabd47", size = 15966692, upload-time = "2026-05-18T23:33:26.62Z" }, + { url = "https://files.pythonhosted.org/packages/02/03/74fe2a4cb3817d94d86402f2506554130a2f01414e299b5a843e5a8a957f/numpy-2.4.6-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:89cd468399cfd2504718f0ba50e410dca55a170b61a02ad92bb18c8a65186e93", size = 16918164, upload-time = "2026-05-18T23:33:29.955Z" }, + { url = "https://files.pythonhosted.org/packages/c5/80/3615be3313f7e7696609bc194b9f0101da809df79e859bdb84e0cd043f46/numpy-2.4.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c2d37ab77531417474168eb79d6d80b14f821a966818505d03013d0833edb7a8", size = 17322877, upload-time = "2026-05-18T23:33:34.724Z" }, + { url = "https://files.pythonhosted.org/packages/ca/ac/a691e0fe2675e370d0e08ff905adc49a1c8830e8cae03efe4477e92cd55d/numpy-2.4.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f407cb6b8e9d6d8c626bc73c945db1706035af8fd632295547bf1c9e46d092d6", size = 18651487, upload-time = "2026-05-18T23:33:38.217Z" }, + { url = "https://files.pythonhosted.org/packages/15/a7/9bc1cd626d7bf6869bfedf27b91b6ab5dd607758bf8e959d6fa80c6a59cb/numpy-2.4.6-cp311-cp311-win32.whl", hash = "sha256:ddea102b48f9e339f3948bf22040944184627a30fdf7f858667673b9c5f033c8", size = 6233945, upload-time = "2026-05-18T23:33:41.331Z" }, + { url = "https://files.pythonhosted.org/packages/c5/31/7fc6239c12bce7e931463251cca4426c465e1876ba3cc785402ef4dd8f4e/numpy-2.4.6-cp311-cp311-win_amd64.whl", hash = "sha256:1e254a00cdf42b1e4d5b3d68d33af63268d41340d8885df2ab6470f2e1500147", size = 12608406, upload-time = "2026-05-18T23:33:44.131Z" }, + { url = "https://files.pythonhosted.org/packages/27/83/140f85a466595a16382996a1bf06b2b54bcd597488921b0c9daaeeda72af/numpy-2.4.6-cp311-cp311-win_arm64.whl", hash = "sha256:ed9749eef4cbd126da3dc1d6bcb3a57f5eb7ac6a6484146bdbf743f552dfc577", size = 10479528, upload-time = "2026-05-18T23:33:50.725Z" }, + { url = "https://files.pythonhosted.org/packages/95/2a/3d7b5ac8aac24feaf9ad7ed58f45b0bbc06d37e4338ae84c9f2298b570f9/numpy-2.4.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:001fbb8e08d942dd57599e781f2472269ee7f2755fae407b4f67b2f0b17da3f1", size = 16689119, upload-time = "2026-05-18T23:33:54.065Z" }, + { url = "https://files.pythonhosted.org/packages/ea/12/92c4c131527599e8288d6918e888d88726f84d805d784b771f32408aeaef/numpy-2.4.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ebfb099f8dcf083deef3ac1ca4c1503f387cf76296fcb3816b66f5ecb5f54fdb", size = 14699246, upload-time = "2026-05-18T23:33:57.621Z" }, + { url = "https://files.pythonhosted.org/packages/ad/fe/c0a6b7b2ca128a8fb228575147073b660656734b8ebe4d76c8fd748dcc79/numpy-2.4.6-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:3213d622a0283a39a93d188f3cf72b26862df52fbb4ca3697f51705016523d41", size = 5204410, upload-time = "2026-05-18T23:34:00.302Z" }, + { url = "https://files.pythonhosted.org/packages/f3/d4/9770d14ba719432bb90a421bfd443872ed0f70f7264b64bec12ea363d5fd/numpy-2.4.6-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:357cc07a6d7b0b182ff02249616a03742827ebb1277546b5c7cd7f7620a45698", size = 6551240, upload-time = "2026-05-18T23:34:02.852Z" }, + { url = "https://files.pythonhosted.org/packages/c9/c6/50a46a6205feba2343f1d6d17438107c5dc491ed1c736e6ea68689fd906b/numpy-2.4.6-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f9fb9157b4ce2971008323afe46053787b526ef624fea915b261468a8421a0f", size = 15671012, upload-time = "2026-05-18T23:34:05.485Z" }, + { url = "https://files.pythonhosted.org/packages/99/60/14115e6364fa676c5397c2ad3004e527e9aa487abf5d0706ec81bbd08529/numpy-2.4.6-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:90f9849678c75fe7afa2d348ac842c168b0a4d3d61919687216dfc547976d853", size = 16645538, upload-time = "2026-05-18T23:34:09.265Z" }, + { url = "https://files.pythonhosted.org/packages/ae/c5/693cbe59e57db94d2231fa519ca3978dc9e19da5a8f088588f5c6e947ff2/numpy-2.4.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c1a2af6c6ef86344a6b0db6b97834208bf598db514f2b155042439b62605601a", size = 17020706, upload-time = "2026-05-18T23:34:13.053Z" }, + { url = "https://files.pythonhosted.org/packages/ef/fc/85b7c4eff9b4966ade25c2273cf7e7012e92366c032058653934b37de044/numpy-2.4.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e5805d5a22fd19c8ccff10a9561f9df94436b0545619ea579db2d3c35294bce2", size = 18368541, upload-time = "2026-05-18T23:34:17.024Z" }, + { url = "https://files.pythonhosted.org/packages/f6/81/e1b27545deedce7f4a0b348618c6b62d74e36a4dc9ccd42f3eb2f85eee32/numpy-2.4.6-cp312-cp312-win32.whl", hash = "sha256:e3eeb0aabd6bd5ce64faae67e9935203a6991b4bc2a485a767fbafb2c5125f45", size = 5962825, upload-time = "2026-05-18T23:34:20.3Z" }, + { url = "https://files.pythonhosted.org/packages/ab/ca/feab00bd44aa5fe1ad2c18f08b4d3bb92e26484b0b1d1443897809ed528c/numpy-2.4.6-cp312-cp312-win_amd64.whl", hash = "sha256:d8e8286dd7cea7895157318d1b91cdacac64c479f3cbc8dce548331728484751", size = 12321687, upload-time = "2026-05-18T23:34:23.095Z" }, + { url = "https://files.pythonhosted.org/packages/63/cf/5a6d34850a39d1093558564f77ee8e8e0bee5061151b8f05a55711001ec7/numpy-2.4.6-cp312-cp312-win_arm64.whl", hash = "sha256:4081eb135ac24158bd51cdfbef16f1c64df7063b1143f24731387137c092bec8", size = 10221482, upload-time = "2026-05-18T23:34:25.876Z" }, + { url = "https://files.pythonhosted.org/packages/fb/82/bdab26d7438c6791ca31b7c024ca37c1eab8b726ba236129005cd4a06e45/numpy-2.4.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:511dbaf848decaaaf4b4ca48032619fb3138710c4bf7da7617765edad1ef96b0", size = 16684648, upload-time = "2026-05-18T23:34:29.41Z" }, + { url = "https://files.pythonhosted.org/packages/1b/30/a80189bcc7f5e4258b3fbc3968d909d1756f54d023299ecc39ad6fdb9ef8/numpy-2.4.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bf162abab1c1a736333192707cef898e735a5ca00f38f27eeedf44b39d9e85eb", size = 14693902, upload-time = "2026-05-18T23:34:33.013Z" }, + { url = "https://files.pythonhosted.org/packages/97/12/70b5d0d7c15e1ebb8a6a84a8caa1d19e181d84fb58bb6d70aca29099dec1/numpy-2.4.6-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:043191bfa8eab18c776647b62723ac9dddece59743b13f49b2016094129c2b3f", size = 5198992, upload-time = "2026-05-18T23:34:36.132Z" }, + { url = "https://files.pythonhosted.org/packages/ba/8c/ebd2a8f8a83541f8d38cc5667e8c2b69cecfd30da6e45693e8158857d44b/numpy-2.4.6-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:6180d8b35af935aed8ece3a85e0a43f87393ae0ac87c8d2c8bd2c993f7270ef3", size = 6546944, upload-time = "2026-05-18T23:34:38.484Z" }, + { url = "https://files.pythonhosted.org/packages/bb/c5/7b863a97a91671a0338f4253bd3b5a3d3852f0692dae91711c9f4a10e787/numpy-2.4.6-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:72fbe16c6fac95aedf5937fa873445cec2110be35d8a4e9433d7501fd98dae6b", size = 15669392, upload-time = "2026-05-18T23:34:41.257Z" }, + { url = "https://files.pythonhosted.org/packages/a5/9d/3584b9984ca4c047aea75214ce1a4c4c73d849bd71b604264b7f5653f8a8/numpy-2.4.6-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a7830bab239b79cda9c08c2da014761cafb48da6150e1da17ac06283f43b6089", size = 16633220, upload-time = "2026-05-18T23:34:45.075Z" }, + { url = "https://files.pythonhosted.org/packages/05/ae/7c67fba23bd98caec7c99261f3a16072ade14813486b0282cb29846de832/numpy-2.4.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ef4aea96ce4d3b074422cb4f2f64e216bf9e213004bb58ecfdf50ea02ea8eb9a", size = 17020800, upload-time = "2026-05-18T23:34:49.065Z" }, + { url = "https://files.pythonhosted.org/packages/d9/5d/3b6725cb31d983c5e66916f5d36f6d7e5521129e4c4404d64f918292a5b6/numpy-2.4.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:dfa20cc6ca228e6b155b11da03825975ce66aea520985dbbddf0f2a5a495c605", size = 18357600, upload-time = "2026-05-18T23:34:52.709Z" }, + { url = "https://files.pythonhosted.org/packages/f7/da/2ccc6c2fe8898dee01d90c75c5f5f914a23daf99e3e0f59516a08760c8b5/numpy-2.4.6-cp313-cp313-win32.whl", hash = "sha256:56b39e5e0622a09a25bf5baf62f4bcf0cb8a41ae6e2819cf49bbc5a74c083f91", size = 5961134, upload-time = "2026-05-18T23:34:55.618Z" }, + { url = "https://files.pythonhosted.org/packages/b5/cd/9cc4dc876fb065d5c220aae4d5e14826b2715331bb7618ce1fb07a679d99/numpy-2.4.6-cp313-cp313-win_amd64.whl", hash = "sha256:c4fc99836233ea196540b17ab0983aff60ed07941751930f5f4d05bc3b3b7359", size = 12318598, upload-time = "2026-05-18T23:34:58.928Z" }, + { url = "https://files.pythonhosted.org/packages/39/1e/c0bcba1f8694116485fe28fd1be698c278fcda4141c5b0e53a2aed8b12a8/numpy-2.4.6-cp313-cp313-win_arm64.whl", hash = "sha256:a7c711e21628b52034bb5ab8d1bce291f752fcc5e92accc615778acee1ff4778", size = 10222272, upload-time = "2026-05-18T23:35:02.167Z" }, + { url = "https://files.pythonhosted.org/packages/63/6d/cc5619247c8f4204e507f5883528372e4ac4bb189e579fb859a12e480b1f/numpy-2.4.6-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:112b06a867b235ef466ed3508ddf0238050df9c727cafb5301ac385b899189a1", size = 14821197, upload-time = "2026-05-18T23:35:05.468Z" }, + { url = "https://files.pythonhosted.org/packages/00/58/f1c39161c87d9e9bed660f1ed4bafc0e403d5ec9650b6dd77aead07d489b/numpy-2.4.6-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:eaf7fa2de5c0be8ae6ff8e9bea2ccd725e980541244521d8d4b5f3354a27babe", size = 5326287, upload-time = "2026-05-18T23:35:08.693Z" }, + { url = "https://files.pythonhosted.org/packages/af/57/3917ab0fd97f271a8694513581b8a36c655f111c446852c302f04ccdb6fc/numpy-2.4.6-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:7265a2f3d436e54ef9f2b52b5c937e6be778781bd97a590319d7348f1c1ca997", size = 6646763, upload-time = "2026-05-18T23:35:11.459Z" }, + { url = "https://files.pythonhosted.org/packages/eb/0f/037e64c494b67581ae18193d770adef354c41f3f2c8ebf865602d949bf8f/numpy-2.4.6-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f74a575920ab21fe304421a3fc28793d82e299cae9eccb37084e9fc7f3617c20", size = 15728070, upload-time = "2026-05-18T23:35:14.79Z" }, + { url = "https://files.pythonhosted.org/packages/21/a6/5d2bae9c9542eb4df16dc9c46dc79c186e9bad53805dfa5399a6023c6db0/numpy-2.4.6-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ede83e07a75dd06bc501566c1eca2afc0d61677c1472ac9ad93fdee6e638a48d", size = 16681752, upload-time = "2026-05-18T23:35:18.836Z" }, + { url = "https://files.pythonhosted.org/packages/92/14/23d1dfb410ae362cd59ce53e936b1513d545eb40db3949ced632e19a459e/numpy-2.4.6-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:68bb27509ac1b9a3443094260f6326150663b06abe40b73a2f81160623da5b67", size = 17086024, upload-time = "2026-05-18T23:35:22.52Z" }, + { url = "https://files.pythonhosted.org/packages/4b/6e/23595a2c642cdf3bc567877064bdd7f91c8b0038a4453cf2daf7248eafe9/numpy-2.4.6-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:a0df0043bdb289bde1f62da130d20df23d58b45429f752bc7a8fc5325a225ecd", size = 18403398, upload-time = "2026-05-18T23:35:26.398Z" }, + { url = "https://files.pythonhosted.org/packages/8a/90/0ac3bc947217e66dec77e7cbc6a1979d1af70b6461b82f620d3bccd5e4c8/numpy-2.4.6-cp313-cp313t-win32.whl", hash = "sha256:29a287e0cf63ff528da061de6b9f64a4618da591ca1046aafc54062e40ca7eab", size = 6084971, upload-time = "2026-05-18T23:35:29.387Z" }, + { url = "https://files.pythonhosted.org/packages/77/71/5673e351671a1d2bd6063b91b44f70c0affea7d1516fa7a6572941ba4aa1/numpy-2.4.6-cp313-cp313t-win_amd64.whl", hash = "sha256:25c692919ac5a01f170a3bfcd62d745b24fd095c353d50812637d6fcab442e75", size = 12458532, upload-time = "2026-05-18T23:35:32.175Z" }, + { url = "https://files.pythonhosted.org/packages/3f/88/19d3503c5046e688f049274b27a3ef3d771152fa80d3ba3d01a3dff61abe/numpy-2.4.6-cp313-cp313t-win_arm64.whl", hash = "sha256:1e978ec1e8bd0e0e4de6bb75de9d30cbb74db6b6a2bb727618613703ca0167dd", size = 10291881, upload-time = "2026-05-18T23:35:35.465Z" }, + { url = "https://files.pythonhosted.org/packages/f8/91/3ab2044d05fd16d343c5ac2e69b127f1b2854040dd20b193257c78028bd3/numpy-2.4.6-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:06ca2f61ec4385a07a6977c55ba998a4466c123642b4a32694d3128fce18c079", size = 16683458, upload-time = "2026-05-18T23:35:38.353Z" }, + { url = "https://files.pythonhosted.org/packages/8e/62/764ce66fa4147ae6d73071a3abf804ffe606f174618697c571acdf26a7c9/numpy-2.4.6-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:38efbc8de75c7a0fc1ac190162d892787f3f47b57cc291231aafee36b80982b7", size = 14704559, upload-time = "2026-05-18T23:35:42.14Z" }, + { url = "https://files.pythonhosted.org/packages/60/61/23f27c172f022e04025b7dc2367f4d63c1a398120607ec896228649a6f48/numpy-2.4.6-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:d581b735e177fdcdce6fed8e7e8880a3fb6ee4e3653a3ac6af01c6f4c03effc5", size = 5209716, upload-time = "2026-05-18T23:35:45.377Z" }, + { url = "https://files.pythonhosted.org/packages/03/71/21cf70dc6ea3e3acb95fc53a265b2fc248b981f0194ceb5b475271b8809d/numpy-2.4.6-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:0a041d3d761dc3c35cc56ce0351506a02bcbc25f7b169f652435141a17db9096", size = 6543947, upload-time = "2026-05-18T23:35:47.926Z" }, + { url = "https://files.pythonhosted.org/packages/d5/91/64288395ee1799bd2e0b04a305dce9666da90c961e1f3fe982a05ee1c036/numpy-2.4.6-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:40fdc1ae7125e518ea98e53e69a4ebc27e1fd50510c47b7ea130cf21e5e1d42b", size = 15685197, upload-time = "2026-05-18T23:35:50.863Z" }, + { url = "https://files.pythonhosted.org/packages/f3/eb/ebffaa97dc55502df69584a8f0dcf07f69a3e0b3e2323670a2722db9aa39/numpy-2.4.6-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a2c306dea656c12c68f51f4cea133cbe78ca7435eb28c735eac1d3ebe73be6e8", size = 16638245, upload-time = "2026-05-18T23:35:54.752Z" }, + { url = "https://files.pythonhosted.org/packages/b8/0b/54f9da33128d7e350fab89c7455902eeae70349ee52bddb448dc4a576f45/numpy-2.4.6-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:33111801a01c12a8a1e3721f0a9232f8cfc8ae2c6b7098167e6f623c6073f402", size = 17036587, upload-time = "2026-05-18T23:35:58.355Z" }, + { url = "https://files.pythonhosted.org/packages/b6/f0/fdebc1052db1cc37c64beb22072d67cd6d1c71adca1299f53dec2b5e20d3/numpy-2.4.6-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:ae506e6902902557576a26ff33eda8695e7ecb3cb36c3b573a0765dee114ebdb", size = 18363226, upload-time = "2026-05-18T23:36:02.845Z" }, + { url = "https://files.pythonhosted.org/packages/aa/b4/298628d98c72b57e57f7165ae6a481a1deaf6f3c28262a6e4c739c275930/numpy-2.4.6-cp314-cp314-win32.whl", hash = "sha256:aaf159caa35993cb1f56fb9b8e4610d35758e7ca005412eb1daa856a78c9c4b1", size = 6010196, upload-time = "2026-05-18T23:36:05.92Z" }, + { url = "https://files.pythonhosted.org/packages/df/ac/46de6dda46478f7942f839e094970be2d4a861e005c4b3bf07c92e291a09/numpy-2.4.6-cp314-cp314-win_amd64.whl", hash = "sha256:b507f5c4c1d508876d1819b6bf9a49d365b96320b5d4993426b33a23ca4b8261", size = 12450334, upload-time = "2026-05-18T23:36:09.107Z" }, + { url = "https://files.pythonhosted.org/packages/78/92/b8b798ac784102c0da830d2257d59358e3d3d90d1e2b3f2575dad976c5cf/numpy-2.4.6-cp314-cp314-win_arm64.whl", hash = "sha256:6f41ae150c4e32db4f3310cdaf64b1593a03dbabe29eec77fc9b50fe64061df6", size = 10495678, upload-time = "2026-05-18T23:36:12.766Z" }, + { url = "https://files.pythonhosted.org/packages/30/34/ec28d1aa8115971537c01469ab2011ee96827930f0a124de1000cc2a7ed7/numpy-2.4.6-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ece3d2cfe132e7d51f44a832b303895e6f2d499c5e74dfbdb06ee246147a304a", size = 14823672, upload-time = "2026-05-18T23:36:16.473Z" }, + { url = "https://files.pythonhosted.org/packages/16/bd/f6d1fede4e54e8042a7ff97bb495510f3c220f94bcd9e8b228e87c92cc0d/numpy-2.4.6-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:e3e5193ef5a3dc73bceee50f7fdc2c90dbb76c42df8d8fae3d1067a583df579e", size = 5328731, upload-time = "2026-05-18T23:36:19.767Z" }, + { url = "https://files.pythonhosted.org/packages/f4/f0/e105b9e2fd728a9910103884decd6951d9dd73896b914a98d9a231de02ee/numpy-2.4.6-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:17f9ade344e7d9b464a084d69bcf18fc691cb1db67c62ed80820bf4926d78f0e", size = 6649805, upload-time = "2026-05-18T23:36:22.266Z" }, + { url = "https://files.pythonhosted.org/packages/82/dd/1206a7ca6ab15e3f02069707ca96222e202af681bb73756da7527f3cb837/numpy-2.4.6-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9cd5ffd25db4e7ba6a375693b3fc0fc1791ec636c17db3720da19bde7180ec43", size = 15730496, upload-time = "2026-05-18T23:36:25.713Z" }, + { url = "https://files.pythonhosted.org/packages/51/e7/38d3ea825dcab85a591734decb2f6c67caa7c8367d374df1a1c3842f9b07/numpy-2.4.6-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7d92c3819208a60205a12a245c91ad70cb0a85336659b19b834205573ac8456e", size = 16679616, upload-time = "2026-05-18T23:36:29.652Z" }, + { url = "https://files.pythonhosted.org/packages/93/b7/caabfdf53edf663e0b4eb74d7d405d83baef09eb5e83bcd32d601d72b93e/numpy-2.4.6-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e85b752a1e912b70eaad4fafbd4d1238007ab221de2009b9a2f5ae7461239895", size = 17085145, upload-time = "2026-05-18T23:36:33.449Z" }, + { url = "https://files.pythonhosted.org/packages/f9/45/68d7c33a6bcf3e5aa3bdbd57a367e6f615286dfd6482f97e8ffeb734306e/numpy-2.4.6-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:29cb7f67d10b479ff07c17d33e39f78c07f71c40ef30d63c153d340e96cd3fb4", size = 18403813, upload-time = "2026-05-18T23:36:37.369Z" }, + { url = "https://files.pythonhosted.org/packages/9c/50/0753655aa844c99cd9e018aacf76f130f1bd81d881bb74bc0aef5d73a8ba/numpy-2.4.6-cp314-cp314t-win32.whl", hash = "sha256:260a5d70215b61ab4fadf5c7baacd64821842975eea312125ed3c39a6391b063", size = 6156982, upload-time = "2026-05-18T23:36:40.817Z" }, + { url = "https://files.pythonhosted.org/packages/b2/d4/7c67becf668f973cb490cec3e98dfd799d866f9c989a54d355672cfa0db6/numpy-2.4.6-cp314-cp314t-win_amd64.whl", hash = "sha256:81a1cca95ed5bb92aa8b10dd2cdc9a0d3853a50fad926c28b5d7e8ea54389627", size = 12638908, upload-time = "2026-05-18T23:36:43.996Z" }, + { url = "https://files.pythonhosted.org/packages/43/bb/e1c71a4295b1b1d1393d50dbb4f2a36283c6859d9d3892e84f00ec5a91d5/numpy-2.4.6-cp314-cp314t-win_arm64.whl", hash = "sha256:0c9136e14ed34a9e343a31c533d78a9813a69a3148332bce5e9821cb2f996e66", size = 10565867, upload-time = "2026-05-18T23:36:47.114Z" }, + { url = "https://files.pythonhosted.org/packages/de/12/b422cc84439adc0d00de605bf4a308890ae5c26f2c71fbd73e5d08fbb0dd/numpy-2.4.6-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:55cced7c52e981362f708ad635198e97a752dfba412cc03c23bbf3bd8d5cd662", size = 16847511, upload-time = "2026-05-18T23:36:50.673Z" }, + { url = "https://files.pythonhosted.org/packages/44/53/f481bef68011740f8849418d82db07230e825013f31f4eef5ba5b805316a/numpy-2.4.6-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:d6da64deb6b8ed903e7560180a92f2d804ee1ba5eeb849ac2748b8c1aba1f6d7", size = 14889064, upload-time = "2026-05-18T23:36:53.879Z" }, + { url = "https://files.pythonhosted.org/packages/7f/57/42ed575c10ced8af951d426bc4e1f8aff16fd851db33f067036215a7f860/numpy-2.4.6-pp311-pypy311_pp73-macosx_14_0_arm64.whl", hash = "sha256:68a5124b13fa6cc2086764a20005d30bc0548146f7f5322f02fce212ca14317f", size = 5394157, upload-time = "2026-05-18T23:36:57.194Z" }, + { url = "https://files.pythonhosted.org/packages/6a/ef/f66cc724fcc36c1e364c67f51ae9146090b8b584f27d58b97fdae3edd737/numpy-2.4.6-pp311-pypy311_pp73-macosx_14_0_x86_64.whl", hash = "sha256:948424b06129ce883307e8cff868c31396d8dc7630a59c61d70d98dbe70f222c", size = 6708728, upload-time = "2026-05-18T23:36:59.575Z" }, + { url = "https://files.pythonhosted.org/packages/1a/9c/c531f2293b91265d8b48e9b329f54fdd7ffae73cb4134ea10cca4237e9cc/numpy-2.4.6-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5dbbdb29840ca3d91ee0fece42fc29278886d908280bfec0a5846c6f901a3eb0", size = 15798374, upload-time = "2026-05-18T23:37:02.674Z" }, + { url = "https://files.pythonhosted.org/packages/1a/b0/413077f6b1153ed3cba361401c6783bbad6114804a000cc22eb71c13e190/numpy-2.4.6-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8ad03c0965fb3c692200e74d458ca28c1dbb4ce96f9a479a8aa041ad5fabca02", size = 16747286, upload-time = "2026-05-18T23:37:06.327Z" }, + { url = "https://files.pythonhosted.org/packages/15/ce/e5ec180bc41812edcd8daeb8639d205622c0e8c02259d8ab25a0201b3c2a/numpy-2.4.6-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:2803abfebfc990042cd494d8ce2d5f82e9d847af6d35ec486923aa19dbad5e73", size = 12504263, upload-time = "2026-05-18T23:37:09.715Z" }, +] + +[[package]] +name = "numpy" +version = "2.5.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.12'", +] +sdist = { url = "https://files.pythonhosted.org/packages/22/fd/89965aa4ac08c74998539fcbf24fa3540f3e15237fbeb6bcf9c908f4aade/numpy-2.5.1.tar.gz", hash = "sha256:a48a113e6afea91f5608793bafa7ef2ad481fefbda87ec5069f483de61cb9fa3", size = 20755553, upload-time = "2026-07-04T17:08:00.933Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/62/7b/14687aa674250e5e546f616f486b0d56d3631cd5b2415739141ce40bdcea/numpy-2.5.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2c889b56fe48b1018f764b0eec8df59ab654e9148aa91faa12596043500de277", size = 16801574, upload-time = "2026-07-04T17:06:12.423Z" }, + { url = "https://files.pythonhosted.org/packages/e1/19/cc5bb2a3f2913d27d6dbb2c78d25921fabaedc6741d4a5a615a11f3c5bf3/numpy-2.5.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ab451b59c5643c570974c43aef780703ef1d3b4965d2be07afd530615a9358d1", size = 11772250, upload-time = "2026-07-04T17:06:15.726Z" }, + { url = "https://files.pythonhosted.org/packages/42/77/fdf34a71dd30f54979b18603bee915e0aaf825b07afe79acd60b04b691e2/numpy-2.5.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:78798bd5b9ad744056af8efa90e3b9ddaa53272a0848a483084a1cc0a13b2dc0", size = 5331516, upload-time = "2026-07-04T17:06:17.913Z" }, + { url = "https://files.pythonhosted.org/packages/ce/e2/eb7efa015b4cce41e2517bf182a7fce0d7d5b9d9ed76a29bfa0f4fe4505c/numpy-2.5.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:2ae0ca40bcb22d6ba59c1dfd5446f49940b0f2d821fde133f10dda11f816b84e", size = 6664863, upload-time = "2026-07-04T17:06:20.02Z" }, + { url = "https://files.pythonhosted.org/packages/a9/4b/a2b32dd94ee9ffbeecb28152240042a3949db33b1c834d44090b80e1b3b8/numpy-2.5.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:61ac47e772e6b8ea489e1d2f441a34c5c3ac17327e7ce294cbdf535795ad4e75", size = 15167977, upload-time = "2026-07-04T17:06:21.621Z" }, + { url = "https://files.pythonhosted.org/packages/b8/a9/6e73d68500f80773f65f0654ea932019d6694329a0eb0ed0533de38df376/numpy-2.5.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:59fda5e192b570217ec2580c96f00e9a7e12ef6866a900eb089b62c1a32545ca", size = 16672469, upload-time = "2026-07-04T17:06:24.064Z" }, + { url = "https://files.pythonhosted.org/packages/24/7d/ad3e59015135f5261c95fd4cafeff159c955febd83a99a1d9250c4233815/numpy-2.5.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f7119ebff1a9829e9f431a4f9d28e703023bb6b9fe7c8f724467dbfc27c94ab3", size = 16527531, upload-time = "2026-07-04T17:06:26.69Z" }, + { url = "https://files.pythonhosted.org/packages/83/d0/a39b2fbcde9cb17a1dac678f254b33a6336298af9df338824c685425d5e8/numpy-2.5.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e824c2acf8862052246be5a44c15da1777940c60d010dd2aab897824d9c430f9", size = 18431940, upload-time = "2026-07-04T17:06:29.521Z" }, + { url = "https://files.pythonhosted.org/packages/04/12/cff070947791c1ed425ff76413189adbdc2fbe215eba7ce7fa454a03c7f8/numpy-2.5.1-cp312-cp312-win32.whl", hash = "sha256:08d60c810432eb83360958dea0999ac4cfb94531ea8efcbf0b7f277c2068aeb2", size = 6066764, upload-time = "2026-07-04T17:06:32.571Z" }, + { url = "https://files.pythonhosted.org/packages/65/66/53f31807a48a750f9d748da273bc3fcedd12b27ff1f3e373bfec55ef2dc0/numpy-2.5.1-cp312-cp312-win_amd64.whl", hash = "sha256:f7d60026c0bdb1380e83bfa7a0419c4577ee4b9a08880afcb6dadeb74c649fa2", size = 12430966, upload-time = "2026-07-04T17:06:34.926Z" }, + { url = "https://files.pythonhosted.org/packages/2b/2a/d1a88066b1c14186f5d3c0d18c94f17b064511982bab0578d49ee9d43c29/numpy-2.5.1-cp312-cp312-win_arm64.whl", hash = "sha256:17a25e09640602e10bc8de0e6fa2b3fd68eedd84ba6d7842dc8f32f9ab87bd0b", size = 10350488, upload-time = "2026-07-04T17:06:37.785Z" }, + { url = "https://files.pythonhosted.org/packages/eb/07/ec2a3f0c91761581d4b7104a740791800025983f9a4dc4e73f91a99aeac4/numpy-2.5.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0bfebd8695f9863592fe744be833a258120b14a9f39da255e8aa8fade2c0ddd1", size = 16796419, upload-time = "2026-07-04T17:06:40.37Z" }, + { url = "https://files.pythonhosted.org/packages/ab/ab/ddb499fc4f8780354395face5b65c7fd107bcd6e1d667a5f07d046956f6f/numpy-2.5.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:30b44a6b53a7ae63c54c089a8726e5563ed302716c5b7ccc85afade40b0e7ff6", size = 11765832, upload-time = "2026-07-04T17:06:42.768Z" }, + { url = "https://files.pythonhosted.org/packages/88/b3/3c28c558a09fc72100c646dac6d2fce8e834c471b0edca01a29996706117/numpy-2.5.1-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:6165343f81b56ef8f514f396989e529b61d9dc709b99421b07e9f3e698e2287d", size = 5325143, upload-time = "2026-07-04T17:06:45.466Z" }, + { url = "https://files.pythonhosted.org/packages/5e/0e/ce19b985bb15c596f4f05954e76cccc77c845083b3b8f938a6c68e523128/numpy-2.5.1-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:4939237038ada79308dda3204ac6462df056b5672b2e25db1149cf873668b3e1", size = 6659749, upload-time = "2026-07-04T17:06:47.288Z" }, + { url = "https://files.pythonhosted.org/packages/2e/20/1ee6614d64332a1bba6411f38e68cb79eec1b2459e20a623777c5c5492a2/numpy-2.5.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1c6759f538fb912fc46de0a6b1758ccf7b57bc7c7ebebc23974fdac3de8db0cd", size = 15164716, upload-time = "2026-07-04T17:06:49.494Z" }, + { url = "https://files.pythonhosted.org/packages/ed/a7/2bcd3fdbb87804755c35b729bf8709d62025c5f4cfd7d5b2415997097515/numpy-2.5.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9726558e8db4a5bf7929a70ae50f63abda4daf0efe810e3bfbab95976f75fc1a", size = 16661440, upload-time = "2026-07-04T17:06:52.061Z" }, + { url = "https://files.pythonhosted.org/packages/fc/d7/a41e3310c886fe457d36e670bbf24fae411aca8a7b6ad92a32afd924077c/numpy-2.5.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:3935f3b419b244a02732676fa5317a9193cc596a4c0646db07e5b421229ac9f7", size = 16526305, upload-time = "2026-07-04T17:06:54.605Z" }, + { url = "https://files.pythonhosted.org/packages/53/75/4333a9a707c1edd3a4e1a0c58eca52c0f31e55089fa80db02b5565b24df7/numpy-2.5.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:dc932a65ded7ce9013d120845a2514dcccb1a67bfc8deb8d37633762951904a6", size = 18423008, upload-time = "2026-07-04T17:06:57.54Z" }, + { url = "https://files.pythonhosted.org/packages/ee/90/e314a32b1c11a2ffe818ddad3a57b50b4b6e1b6c487192eb50cdef0415d0/numpy-2.5.1-cp313-cp313-win32.whl", hash = "sha256:4b4ff1608417eb7a59da7b967bbb798cacfe071d2caf526a24281cd562072ed9", size = 6063885, upload-time = "2026-07-04T17:07:00.14Z" }, + { url = "https://files.pythonhosted.org/packages/10/70/800b3fca480af32df9e8ea9f3d4a0c8feb4b32d7f195d174eabbda4829ad/numpy-2.5.1-cp313-cp313-win_amd64.whl", hash = "sha256:6c3fe51bc6a16453d452997053454f309e8e0ed7b42d6b361ce4ac8c32913d74", size = 12425674, upload-time = "2026-07-04T17:07:02.387Z" }, + { url = "https://files.pythonhosted.org/packages/8b/0b/196350c122f50f6ca56846f2d71efd5e0d24b7b2e07355e019b2e2c7a11e/numpy-2.5.1-cp313-cp313-win_arm64.whl", hash = "sha256:f7feb014281029e628ba2d5a007407443b06e418b6fe451d1e2adcbc8eba0107", size = 10350256, upload-time = "2026-07-04T17:07:04.878Z" }, + { url = "https://files.pythonhosted.org/packages/db/f4/731b6085a83faf6ca843394cbd5e217280c214399f7e8b21b9f552af0ae2/numpy-2.5.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:7c786fe9a5bbe360022e584c5a34cf6b54265c71bd7ec8ac3d8fec38968071f8", size = 16795063, upload-time = "2026-07-04T17:07:07.374Z" }, + { url = "https://files.pythonhosted.org/packages/bf/64/0e215f2048dd11a55bb989ed41b3585ef57452404e638d703a211a3e4157/numpy-2.5.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:32985c896d897419ef8da6917872d80b78ad0ea26d85b23245c7366ffde76d75", size = 11776652, upload-time = "2026-07-04T17:07:09.907Z" }, + { url = "https://files.pythonhosted.org/packages/b5/59/2b844c7a6e9deff69b404a66221e1542937734f65d5e6e39411876053862/numpy-2.5.1-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:efd736408cc97c79b9e6917338dfc8f06013b2274f992e96b1d9a81a71e2a2c2", size = 5335944, upload-time = "2026-07-04T17:07:12.227Z" }, + { url = "https://files.pythonhosted.org/packages/86/51/9bf7cb2cabcebc9e017e4ec7e6322b378317a542c08b4cb68479c1efc716/numpy-2.5.1-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:ab84dc6b074fa881cae55bea94cc4f68e285181ba7f32497bf7dee6b1496165b", size = 6656266, upload-time = "2026-07-04T17:07:14.368Z" }, + { url = "https://files.pythonhosted.org/packages/83/3e/fb7615b211b82a32f44d5180a6d421b61f84d4fadd578b48ba4ac34e189f/numpy-2.5.1-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:caf3e317d33d60c37986b452613f4ab51246d0691350c03d0cb4a898627f4a95", size = 15179720, upload-time = "2026-07-04T17:07:16.272Z" }, + { url = "https://files.pythonhosted.org/packages/41/5f/0f992cb24560673496c5d68de61913b57166ce530ffda07c1f280e0cc464/numpy-2.5.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:54ad769f17bc2d833b620851989f62054fb9ab93c969d9e1dc3c8e3d56beea21", size = 16664835, upload-time = "2026-07-04T17:07:19.021Z" }, + { url = "https://files.pythonhosted.org/packages/a2/2f/97d6475ee91afe2587797d09446f9d3e475ad4cb681662d824809327b75a/numpy-2.5.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c12afb53450fa976d4c681c50a7423729a4c51c0465ed9f32b8a9cabbc472373", size = 16539135, upload-time = "2026-07-04T17:07:22.015Z" }, + { url = "https://files.pythonhosted.org/packages/c4/5b/4db81e4ba0be7e2776b1de68c82aa862c7f8ec27e1b4927d4ae075e20678/numpy-2.5.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:e8c11c405efc5ff6816d5983c96cdfa215bab3428961243af3ff59b228490438", size = 18426684, upload-time = "2026-07-04T17:07:24.941Z" }, + { url = "https://files.pythonhosted.org/packages/1f/64/c0ba2d90724d450279a7df8f32057241070250a26a7e2b5337d77347f481/numpy-2.5.1-cp314-cp314-win32.whl", hash = "sha256:f2479a47f8d5932d1718168a681ad6e536a9df484c83cfcf9de365e164537ace", size = 6116103, upload-time = "2026-07-04T17:07:27.622Z" }, + { url = "https://files.pythonhosted.org/packages/c1/1a/837f9ed7405adcd7a40538792eb169eddd8fa5630c16a1ef49dae71a30f4/numpy-2.5.1-cp314-cp314-win_amd64.whl", hash = "sha256:24d0eb82c0541d3415a33425db64ae439dffccd7b4dbcb30e7c35120205c506a", size = 12562177, upload-time = "2026-07-04T17:07:29.887Z" }, + { url = "https://files.pythonhosted.org/packages/22/ed/49707938b6dd0a78a9178dd93227dc89e4c11af47f5c798d70366e8d0483/numpy-2.5.1-cp314-cp314-win_arm64.whl", hash = "sha256:5a4c988b38d261deeeaad9954e3deb091ad905c94e8bb6708654ef1d97f286b0", size = 10627739, upload-time = "2026-07-04T17:07:32.568Z" }, + { url = "https://files.pythonhosted.org/packages/a6/c7/bb4b882cfe7f299cbc8b66e42e7dd78cf9d14e40f9469fc5e3db7e15b3bd/numpy-2.5.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:a33276be12fa045805f477f22482088b66bb758ffbe89a9d21457de863a32e22", size = 11894709, upload-time = "2026-07-04T17:07:34.941Z" }, + { url = "https://files.pythonhosted.org/packages/40/3f/5af7f4a7f6224aef48017aa82bb6174c7a659d724be0c75017b7e64a55b4/numpy-2.5.1-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:f089d7b00756190aacf1f5d34bdf38c3c430ac82b4f868f8cede73380460fce7", size = 5453810, upload-time = "2026-07-04T17:07:37.495Z" }, + { url = "https://files.pythonhosted.org/packages/20/c9/3474309bc94d634d3f9c3eddf03250ecb8c22cd948ef16fef69a77cc5d7b/numpy-2.5.1-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:09e9bfd8d2cf479c7d174804fb3811c53a8e9f20a37444008606b57d6b7a826d", size = 6761189, upload-time = "2026-07-04T17:07:39.563Z" }, + { url = "https://files.pythonhosted.org/packages/90/8a/558ae39fdd55d7e7f7fef9a84a6e964ac6b23edbd2a07e52bb084500507d/numpy-2.5.1-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e68d8dd1e7eba712948f2053a29ec86917bc70ba1358df869d9f06649ef9cf09", size = 15225039, upload-time = "2026-07-04T17:07:41.682Z" }, + { url = "https://files.pythonhosted.org/packages/63/27/ca7392b2d030277bdf0273e7d23255b3ee57d57a7c170a6f4fb3981e1e5d/numpy-2.5.1-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:99d5095fa265a0c4152e7bb12759e14381ef5496152f1ce58f44bdf55c44beb4", size = 16701306, upload-time = "2026-07-04T17:07:44.611Z" }, + { url = "https://files.pythonhosted.org/packages/02/42/03d53ae7996c44d4374a8262e9dc41671fd56cbb98f7d47ef85cf5da4c6b/numpy-2.5.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:ab87a91b3cc3382b8956095bd8f95e00cf679bb81554339be1a2ba404a1473c1", size = 16589955, upload-time = "2026-07-04T17:07:47.694Z" }, + { url = "https://files.pythonhosted.org/packages/7b/15/6c1784ae469640e65db111e9a34b3d0f14d91e8a38b9ce34810ced370dbb/numpy-2.5.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:224ca51130ef7da85bea2191625181cb4f337f9cb64b471f10c1a12aa8b60077", size = 18464252, upload-time = "2026-07-04T17:07:50.684Z" }, + { url = "https://files.pythonhosted.org/packages/94/a8/f98e50356cf167df656c526c2dfeec2d7dde182f2a3da4b458a5938e2776/numpy-2.5.1-cp314-cp314t-win32.whl", hash = "sha256:6eab239876581b2b3c5a242281b6007bbdbcd1c7085d7709bb57c5929b11e6bf", size = 6263298, upload-time = "2026-07-04T17:07:53.445Z" }, + { url = "https://files.pythonhosted.org/packages/72/ac/96ae880cdecad0b3275d9359fcec72667b49a4863c9f12942e43679dda02/numpy-2.5.1-cp314-cp314t-win_amd64.whl", hash = "sha256:83ce9c80d5b521b0d77ddcbe5447c218d247929b6cc056ca5351342accfff0af", size = 12748623, upload-time = "2026-07-04T17:07:55.384Z" }, + { url = "https://files.pythonhosted.org/packages/a1/5a/4d2b1601df3602dba7a14f3348ba9bfe94a18adb428e693df6154c293831/numpy-2.5.1-cp314-cp314t-win_arm64.whl", hash = "sha256:5a6db61f9aaa57e369905c67d852045d3c4f7126405b29d09b19dec118e9c9cb", size = 10697674, upload-time = "2026-07-04T17:07:58.506Z" }, +] + +[[package]] +name = "open-data-contract-standard" +version = "3.1.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pydantic" }, + { name = "pyyaml" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/4e/8a/81076b5398c08444f50f749a363f43f0f063b05f7de232da7437129ef458/open_data_contract_standard-3.1.2.tar.gz", hash = "sha256:9da18e1e961388bca6110e5a394c85bdf69de3e9966b2acf3f81f0092694d714", size = 18095, upload-time = "2025-12-17T12:43:56.88Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bf/9c/ed60cc0d1fcbfe9605abf7449f0301d215d15db8a000f3b2402c04407789/open_data_contract_standard-3.1.2-py3-none-any.whl", hash = "sha256:da801b93af6f18704100387a830388c7d78f8811ce834d84505241f22b882213", size = 17253, upload-time = "2025-12-17T12:43:55.533Z" }, +] + +[[package]] +name = "opentelemetry-api" +version = "1.39.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "importlib-metadata" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/97/b9/3161be15bb8e3ad01be8be5a968a9237c3027c5be504362ff800fca3e442/opentelemetry_api-1.39.1.tar.gz", hash = "sha256:fbde8c80e1b937a2c61f20347e91c0c18a1940cecf012d62e65a7caf08967c9c", size = 65767, upload-time = "2025-12-11T13:32:39.182Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cf/df/d3f1ddf4bb4cb50ed9b1139cc7b1c54c34a1e7ce8fd1b9a37c0d1551a6bd/opentelemetry_api-1.39.1-py3-none-any.whl", hash = "sha256:2edd8463432a7f8443edce90972169b195e7d6a05500cd29e6d13898187c9950", size = 66356, upload-time = "2025-12-11T13:32:17.304Z" }, +] + +[[package]] +name = "opentelemetry-semantic-conventions" +version = "0.60b1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "opentelemetry-api" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/91/df/553f93ed38bf22f4b999d9be9c185adb558982214f33eae539d3b5cd0858/opentelemetry_semantic_conventions-0.60b1.tar.gz", hash = "sha256:87c228b5a0669b748c76d76df6c364c369c28f1c465e50f661e39737e84bc953", size = 137935, upload-time = "2025-12-11T13:32:50.487Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7a/5e/5958555e09635d09b75de3c4f8b9cae7335ca545d77392ffe7331534c402/opentelemetry_semantic_conventions-0.60b1-py3-none-any.whl", hash = "sha256:9fa8c8b0c110da289809292b0591220d3a7b53c1526a23021e977d68597893fb", size = 219982, upload-time = "2025-12-11T13:32:36.955Z" }, +] + +[[package]] +name = "orderly-set" +version = "5.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/4a/88/39c83c35d5e97cc203e9e77a4f93bf87ec89cf6a22ac4818fdcc65d66584/orderly_set-5.5.0.tar.gz", hash = "sha256:e87185c8e4d8afa64e7f8160ee2c542a475b738bc891dc3f58102e654125e6ce", size = 27414, upload-time = "2025-07-10T20:10:55.885Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/12/27/fb8d7338b4d551900fa3e580acbe7a0cf655d940e164cb5c00ec31961094/orderly_set-5.5.0-py3-none-any.whl", hash = "sha256:46f0b801948e98f427b412fcabb831677194c05c3b699b80de260374baa0b1e7", size = 13068, upload-time = "2025-07-10T20:10:54.377Z" }, +] + +[[package]] +name = "overrides" +version = "7.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/36/86/b585f53236dec60aba864e050778b25045f857e17f6e5ea0ae95fe80edd2/overrides-7.7.0.tar.gz", hash = "sha256:55158fa3d93b98cc75299b1e67078ad9003ca27945c76162c1c0766d6f91820a", size = 22812, upload-time = "2024-01-27T21:01:33.423Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2c/ab/fc8290c6a4c722e5514d80f62b2dc4c4df1a68a41d1364e625c35990fcf3/overrides-7.7.0-py3-none-any.whl", hash = "sha256:c7ed9d062f78b8e4c1a7b70bd8796b35ead4d9f510227ef9c5dc7626c60d7e49", size = 17832, upload-time = "2024-01-27T21:01:31.393Z" }, +] + +[[package]] +name = "packaging" +version = "26.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/f1/e7a6dd94a8d4a5626c03e4e99c87f241ba9e350cd9e6d75123f992427270/packaging-26.2.tar.gz", hash = "sha256:ff452ff5a3e828ce110190feff1178bb1f2ea2281fa2075aadb987c2fb221661", size = 228134, upload-time = "2026-04-24T20:15:23.917Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl", hash = "sha256:5fc45236b9446107ff2415ce77c807cee2862cb6fac22b8a73826d0693b0980e", size = 100195, upload-time = "2026-04-24T20:15:22.081Z" }, +] + +[[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/b7/bf/70d8a60488f9955cbbcd538beae44d56bb2f1d19e673b72788f2d343ff55/psycopg_binary-3.3.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b7bfff1ca23732b488cbca3076fc11bc98d520ee122514fdb17a8e20d3338f5a", size = 4609750, upload-time = "2026-05-01T23:24:20.06Z" }, + { url = "https://files.pythonhosted.org/packages/db/b0/29e98ba210c9dbc75a6dc91e3f99b9e06ea901a62ca95804e02a1ae13e6b/psycopg_binary-3.3.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:32a6fbf8481e3a370d0d72b860d35948a693cb01281da217f7b2f307636e591a", size = 4676700, upload-time = "2026-05-01T23:25:21.727Z" }, + { url = "https://files.pythonhosted.org/packages/8e/ab/3df087b3c12bf74e47c08204172b2fabb5a144679110d5c7ad12d9201323/psycopg_binary-3.3.4-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:bdef84570ebbce1d42b4e7ea952d21c414c5f118ad02fee00c5625f35e134429", size = 5496319, upload-time = "2026-05-01T23:25:28.271Z" }, + { url = "https://files.pythonhosted.org/packages/87/9a/f088207b4cd6772f9e0d8a91807e79fa2458d4eb9eb1ae406c68415f2bec/psycopg_binary-3.3.4-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fa1cbc10768a796c96d3243656016bf4e337c81c71097270bb7b0ad6210d9765", size = 5171906, upload-time = "2026-05-01T23:25:34.004Z" }, + { url = "https://files.pythonhosted.org/packages/48/45/4523a857f253871d75c22e1c2e79fd47e599e736bcba1bad58d83e24be02/psycopg_binary-3.3.4-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cf7f73a4a792bc5db58a4b385d8a1467e8d468f7548702fb0ed1e9b7501b1c13", size = 6762621, upload-time = "2026-05-01T23:25:41.392Z" }, + { url = "https://files.pythonhosted.org/packages/7c/d1/925bf776503345bef428e6c45fb017d0139ddbe0e211814b585c4253dca8/psycopg_binary-3.3.4-cp310-cp310-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d7b4d40c153fa352ab3cca530f3a0baedf7621b2ebcbd7f084009522c21788fc", size = 5006319, upload-time = "2026-05-01T23:25:51.419Z" }, + { url = "https://files.pythonhosted.org/packages/6f/aa/99727337206fbba357ca084bf4ea8b29dc986f61842a2685859af61416db/psycopg_binary-3.3.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f9b1c2533af01cd7648378599f82b0b8ae32f293296e6eec5753a625bc97ef28", size = 4535388, upload-time = "2026-05-01T23:25:57.957Z" }, + { url = "https://files.pythonhosted.org/packages/0b/a4/567ba2c37d19d8c2f63d836385dfd2495aa5897bbee6cfab104d9ee58624/psycopg_binary-3.3.4-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:ad3bc94054876155549fdaedf4a46d1ec69d39a5bcee377148afe498e84c4b8e", size = 4224544, upload-time = "2026-05-01T23:26:03.832Z" }, + { url = "https://files.pythonhosted.org/packages/b7/23/86457f5a82731685d7701de7bfaa5eb783dd1fecbf875321897d9d9ce33a/psycopg_binary-3.3.4-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:eb4eed2079c01a4850bf467deacfab56d356d4225040170af03dc9958321242d", size = 3956282, upload-time = "2026-05-01T23:26:09.983Z" }, + { url = "https://files.pythonhosted.org/packages/a7/d8/249456df16d47de082abd9b73bce8ccdeb0293eb12e590f9150c7cbdb788/psycopg_binary-3.3.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f80e3f2b5331dbbf0901bcb658056c03eeb2c1ef31d774afb0d61598b242e744", size = 4261736, upload-time = "2026-05-01T23:26:16.798Z" }, + { url = "https://files.pythonhosted.org/packages/15/6b/c4abe228acafd8a385c1fb615d4f1e3c9b8ad7a4e4f0e84118ba3ffeed9c/psycopg_binary-3.3.4-cp310-cp310-win_amd64.whl", hash = "sha256:574ea21a9651958f1535c5a1c649c7409e9168bcbffa29a3f2f961f58b322949", size = 3570620, upload-time = "2026-05-01T23:26:22.655Z" }, + { url = "https://files.pythonhosted.org/packages/b6/82/df3312c0ca083d5b43b352f27d4dd8b1e614bd334473074715d9e0000da4/psycopg_binary-3.3.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:612a627d733f695b1de1f9b4bd511c15f999a5d8b915d444bbd7dd71cf3370da", size = 4609813, upload-time = "2026-05-01T23:26:30.612Z" }, + { url = "https://files.pythonhosted.org/packages/1f/b5/d74d542458d3e8ac0571d8a88f57ca369999b9a82f4fa528052d0d7d3e4c/psycopg_binary-3.3.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:13a7f380824c35896dcac7fe0f61440f7ca49d6dc73f3c13a9a4471e6a3b302e", size = 4676799, upload-time = "2026-05-01T23:26:38.475Z" }, + { url = "https://files.pythonhosted.org/packages/09/67/06bab9c60671999f4c6ceff1b334f3ac1f9fc5789eb467c714623ea21de9/psycopg_binary-3.3.4-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:276904e3452d6a23d474ef9a21eee19f20eed3d53ddd2576af033827e0ba0992", size = 5497050, upload-time = "2026-05-01T23:26:47.061Z" }, + { url = "https://files.pythonhosted.org/packages/72/9b/023433e2b20f970de1e22d29132a95281277646da0b2e2879dd4ee94b8c1/psycopg_binary-3.3.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ab8cca8ef8fb1ccf5b048ae5bd78ba55b9e4b5d472e3ce5ca39ff4d2a9c249e4", size = 5172428, upload-time = "2026-05-01T23:26:56.708Z" }, + { url = "https://files.pythonhosted.org/packages/08/cd/ae16da8fde228a38b2fe9269bbc13cf89e0186173f2265600f02d6a71e64/psycopg_binary-3.3.4-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7465bfe6087d2d5b42d4c53b9b11ca9f218e477317a4a162a10e3c19e984ba8e", size = 6762746, upload-time = "2026-05-01T23:27:07.023Z" }, + { url = "https://files.pythonhosted.org/packages/4f/81/0ba09fa5f5f88779093a2541a8e02489825721f258ab88058b11d68b3eb5/psycopg_binary-3.3.4-cp311-cp311-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:22cdbf5f91ef7bb91fe0c5757e1962d3127a8010256eefd9c61fcaf441802097", size = 5006033, upload-time = "2026-05-01T23:27:12.221Z" }, + { url = "https://files.pythonhosted.org/packages/73/6a/629136040cc3497adb442a305710b5913f2a754d4630fc3d3717c4c0df65/psycopg_binary-3.3.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e2631da29253a98bd496e6c4813b24e09a4fe3fb2a9e88513305d6f8747cce95", size = 4534175, upload-time = "2026-05-01T23:27:18.248Z" }, + { url = "https://files.pythonhosted.org/packages/7c/32/1027f843c6dc2d5d51960ee62cc0c2cf755a4c39455aff1371173edbef7d/psycopg_binary-3.3.4-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:7f7668f30b9dd5163197e5cbf4e0efd54e00f0a859cc566ce56cfc31f4054839", size = 4224203, upload-time = "2026-05-01T23:27:24.3Z" }, + { url = "https://files.pythonhosted.org/packages/0b/e1/380a724d9093c74adb14d4fce920ea8327838abb61f760b1448586b14a8e/psycopg_binary-3.3.4-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:cffc3408d77a27973f33e5d909b624cce683db5fc25964b02fe0aae7886c1007", size = 3954509, upload-time = "2026-05-01T23:27:30.815Z" }, + { url = "https://files.pythonhosted.org/packages/db/cd/895893ae575a09c97ccfd5def070d88993d955ef34df45a881fd5ff506d6/psycopg_binary-3.3.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0579252a1202cd73e4da137a1426e2dae993ae44e757605344282af3a082848c", size = 4259551, upload-time = "2026-05-01T23:27:38.828Z" }, + { url = "https://files.pythonhosted.org/packages/dd/c6/2330a20794e37a3ec609ef2fd8522919ec7a4395a1abf979a8e2d1775cd5/psycopg_binary-3.3.4-cp311-cp311-win_amd64.whl", hash = "sha256:41f2ec0fea529832982bcb6c9415de3c86264ebe562b77a467c0fbcd7efbba8d", size = 3572054, upload-time = "2026-05-01T23:27:45.455Z" }, + { 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 = "pyarrow" +version = "25.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/27/f3/95428098d1fa7d04432fb750eed06b41304c2f6a5d3319985e64db2d9d41/pyarrow-25.0.0.tar.gz", hash = "sha256:d2d697008b5ec06d75952ef260c2e9a8a0f6ccfce24266c04c9c8ade927cb3b4", size = 1199181, upload-time = "2026-07-10T08:29:50.116Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4d/2a/eaa70e6d6ed430c2e90c0599e2831a41a50251879e44788ccdbc73115af1/pyarrow-25.0.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:ce0ca222802087b9a8cb031a6468442cb6b67c290a45a601cac64753d34954d3", size = 35945551, upload-time = "2026-07-10T08:25:23.153Z" }, + { url = "https://files.pythonhosted.org/packages/df/e0/917086af6b246143012cdc8a7c886b018b53204f3d69fc5f9be5857a8b80/pyarrow-25.0.0-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:7d6da02ffc7a3a9bda3b7ded4cc2a27ff73969ab37153f3afd46bbbc1ba4f0f7", size = 37636698, upload-time = "2026-07-10T08:25:28.031Z" }, + { url = "https://files.pythonhosted.org/packages/68/6a/c87829f92503f84993721791c942f3d9aa81044de51a8cfb1da5810e5345/pyarrow-25.0.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:dbf9fa5d4bde73b1cc16377dcaaa010f971e6fa7f5083f5d44f34b50bc1d74af", size = 46858364, upload-time = "2026-07-10T08:25:34.527Z" }, + { url = "https://files.pythonhosted.org/packages/cc/ba/2030d454c2747e26cce23e4a0338067ee0830a155b7894da04caa96783a5/pyarrow-25.0.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:b72d943ff4e10fec8d48aedb23322d8f6ea8bc2d698b81db37e73730f69e4862", size = 50056398, upload-time = "2026-07-10T08:25:40.785Z" }, + { url = "https://files.pythonhosted.org/packages/78/ce/ba7a5ce7bf0cfc372ec48203a34ece42f73aa2f3231706f61c55e105ecd0/pyarrow-25.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:5fb2d837960f1df7f679ff9f1a55065e306347d379e0768cebf14781254d6194", size = 49958146, upload-time = "2026-07-10T08:25:46.98Z" }, + { url = "https://files.pythonhosted.org/packages/75/eb/c34a29fb7a70dca2f903c7d85a928928ef55af20cd56e99de6b4c0d897bc/pyarrow-25.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:add690feafa0953c443cdba9e9e87f5eaa198f1ea2e43a3b146ea83f202262d0", size = 53096264, upload-time = "2026-07-10T08:25:53.925Z" }, + { url = "https://files.pythonhosted.org/packages/36/f9/35b1f83a0727d84951588e4034aca2feb76dfb45b0725918c0037b0a48f7/pyarrow-25.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:d293e9959b29a24c82d936d04ab2b7fd8b8d334030de2e56a99aba94f008ad7a", size = 27840572, upload-time = "2026-07-10T08:25:58.966Z" }, + { url = "https://files.pythonhosted.org/packages/a7/98/ae2b5acf9876dbeffa6f320776242c52caab062df55c8ac5501ed2679e74/pyarrow-25.0.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:2e3b6544e26e393fe2cd530f523e36c1c8d3c345bbbb60cca3fd866be8322517", size = 35939080, upload-time = "2026-07-10T08:26:04.53Z" }, + { url = "https://files.pythonhosted.org/packages/80/09/3de2a968edbd496c86cb8b932cdbee2d4b08c4a28e9884a15e5c705a646b/pyarrow-25.0.0-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:b724d127783b4c19f088fcdfc844cbc318809246a30307bcabd5ed02045e890e", size = 37633420, upload-time = "2026-07-10T08:26:10.354Z" }, + { url = "https://files.pythonhosted.org/packages/19/86/8399243a4ce080426ec37db18d5e29148b7ec960a8a8c7f9059a7bf6ef0a/pyarrow-25.0.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:244f98a595f70fa4fd35faa7508c4ae67e14a173397a4b3b49d2b3c360fb0062", size = 46861050, upload-time = "2026-07-10T08:26:16.397Z" }, + { url = "https://files.pythonhosted.org/packages/7b/79/72d704b02bc5fc6d06954d76a0208c1e79cad3ab370f6d6a91ffe5078870/pyarrow-25.0.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:0222f0071d13313962a88d21bf28b80d355ac39d81bfa6ff3fe00eeaf748e4be", size = 50056458, upload-time = "2026-07-10T08:26:23.271Z" }, + { url = "https://files.pythonhosted.org/packages/06/5d/3c31a60b6403d63cad2e0f829096f5fc5763a129ead4207a5d4690b96448/pyarrow-25.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b58726f118c079f9d4ed7e904975d4f15fd69d0741ba511a4e2dcaa4ef16354f", size = 49957793, upload-time = "2026-07-10T08:26:30.232Z" }, + { url = "https://files.pythonhosted.org/packages/34/f7/8f8a019061f9863a831915329264372a87ed25eaf9109ce56eb0e84012c5/pyarrow-25.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:38a2c887cb3883e241b70201688db34133b6dfadd04f03c8f9213df53770c18e", size = 53100544, upload-time = "2026-07-10T08:26:36.414Z" }, + { url = "https://files.pythonhosted.org/packages/f1/e2/738071e95c5ddad7b3dfc12f569ffa992db89d7d7b4a95258fd184191249/pyarrow-25.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:161649d60a7a46c613a19fd795763ea8a88c36ba997dd99d9bc66e6794ee36e8", size = 27848311, upload-time = "2026-07-10T08:26:41.429Z" }, + { url = "https://files.pythonhosted.org/packages/73/44/fdd3a4377807b7dcabe2d4b5aa99dbbc98e2e5df3f1ca4e7f0aec492d987/pyarrow-25.0.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:149730a3d1f0fb59d663a0b8aa210adfd9c17c27cd94a0d143e60daea8320d4e", size = 35850884, upload-time = "2026-07-10T08:26:47.357Z" }, + { url = "https://files.pythonhosted.org/packages/bf/71/9f053177a7709b8c90abb00a2375b916286f9f0d6cfb21a5cadd4ef811e8/pyarrow-25.0.0-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:0721332c30fdd453fdd1fc203b2ac1f4c9db5aea28fa38d41f2574c4b068b9ec", size = 37616197, upload-time = "2026-07-10T08:26:53.564Z" }, + { url = "https://files.pythonhosted.org/packages/95/1a/22bfb6597dcdc861fa83c39c06e1457cb56f698940eff42fbb25de30e8e5/pyarrow-25.0.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:fa1482b3da10cac2d4db6e26b81da543e237616af2ef6d466018b31ca586496f", size = 46841966, upload-time = "2026-07-10T08:27:07.685Z" }, + { url = "https://files.pythonhosted.org/packages/55/0e/cd705c042bc4fe7022478db577fcab4abdcfabb9bc37ab7a75556b3fcb2b/pyarrow-25.0.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:5d1dbf24e151042f2fa3c129563f65d66674128868496fb008c4272b16bdf778", size = 50088993, upload-time = "2026-07-10T08:27:14.268Z" }, + { url = "https://files.pythonhosted.org/packages/98/ee/d822e1ee31fe31ec5d057210e0605c950b975dcd8d9a332976cc859a9df8/pyarrow-25.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:20887a762dd61dcc530f93a140840ab1f6aa7836b33270e42d627ab3cf11e537", size = 49941005, upload-time = "2026-07-10T08:27:21.274Z" }, + { url = "https://files.pythonhosted.org/packages/33/1b/207a90cc64619a095eb75a263ae069735f2810056d43c667befd573ec083/pyarrow-25.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:58d1ab556b0cea1c93fdb799b24ad58adb2f2a2788dbce782a94f64ae1a5cc9b", size = 53112355, upload-time = "2026-07-10T08:27:27.911Z" }, + { url = "https://files.pythonhosted.org/packages/7e/fe/81d1e5f8beed15c01e98649d5c6e2167b67fd395884a2488f18bf1cf0dba/pyarrow-25.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:3f356afe61186395c861d5cd63dc21ff7d5fa335012a4668d979257df7fea0f5", size = 27945954, upload-time = "2026-07-10T08:27:32.903Z" }, + { url = "https://files.pythonhosted.org/packages/6c/c8/098ce17d778fd9d29e40bb8c5f19a40cc90c3f0b46c9057b0d7993f42f54/pyarrow-25.0.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:8831a3ba52fa7cdb78d368d968b1dcd06171e6dff5461e16d90de91d371e47bc", size = 35844549, upload-time = "2026-07-10T08:27:37.956Z" }, + { url = "https://files.pythonhosted.org/packages/bc/66/24c28877219abf6263d909b1592c97ff82c59f13a59acbed11fc87c0654f/pyarrow-25.0.0-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:5f4bacb60f91dd2fca6c52f1b9a0012cd090e0294f1f781dc1881a247a352f8e", size = 37610397, upload-time = "2026-07-10T08:27:43.803Z" }, + { url = "https://files.pythonhosted.org/packages/53/55/6d1d5f5aff317ec5de9421594679ed51ed828fe7e2ce209327f819d801e4/pyarrow-25.0.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:59516c822d5fd8e544aaa0dfe72f36fed5d4c24ea8390aab1bcd31d7e959c6be", size = 46841701, upload-time = "2026-07-10T08:27:49.741Z" }, + { url = "https://files.pythonhosted.org/packages/b5/5d/f790fb6965ab54c9da0dda7856abc75fd0d7648d865f8d603c111d203a64/pyarrow-25.0.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:6f9dbd83e91c239a1f5ee7ce13f108b5f6c0efbe40a4375260d8f08b43ad05e9", size = 50090118, upload-time = "2026-07-10T08:27:56.051Z" }, + { url = "https://files.pythonhosted.org/packages/0c/8c/faf025357ebf31bc96777f234277aa31e2aeca6dd4ecaa391f29085473c2/pyarrow-25.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:18dcc8cc50b5e72eae6fcbfc6c8776c21a007176b27a3cdec5c2f5bcf126708d", size = 49945559, upload-time = "2026-07-10T08:28:01.927Z" }, + { url = "https://files.pythonhosted.org/packages/07/a1/bd051871708ea99a5e0fc711926c26c6f2c6d0130c7aaac8093e34998af6/pyarrow-25.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4ec1895a87aa834c3b99b7a1e758747eb8bb57f922b32c0e0fa04afb8d6998b1", size = 53114238, upload-time = "2026-07-10T08:28:08.594Z" }, + { url = "https://files.pythonhosted.org/packages/7c/31/737f0c3cffcd6af647849477d1dd68045deac2e3963c3f9f211bedc48540/pyarrow-25.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:77c8d1ae46a44b4006e8db1cc977bbcc6ce4873c92f74137d68e45503b97fb18", size = 27861162, upload-time = "2026-07-10T08:28:12.975Z" }, + { url = "https://files.pythonhosted.org/packages/55/c7/581ccbcdb3d897eb2893328d68db3d52eca373bf2a7e964d0a6276b8e85b/pyarrow-25.0.0-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:72132b9a8a0a1840197794d4dea26080069b6b0981c116bc078762dc9691b21b", size = 35878945, upload-time = "2026-07-10T08:28:18.222Z" }, + { url = "https://files.pythonhosted.org/packages/64/d1/ccb01db7329ea0411ef4fbd9b62a04d3268b36777d4e758d5e39b91ddeab/pyarrow-25.0.0-cp314-cp314-macosx_12_0_x86_64.whl", hash = "sha256:e009ef945e498dca2f050ea10d2e9764cb44017254826fc4574fdb8d2530173b", size = 37630854, upload-time = "2026-07-10T08:28:23.452Z" }, + { url = "https://files.pythonhosted.org/packages/af/9f/2d81ba89d1e4198d0cb25fe7529de936830fdaec0db926bb52a1ef7080d4/pyarrow-25.0.0-cp314-cp314-manylinux_2_28_aarch64.whl", hash = "sha256:f57a39dbcb416345401c2e77a4373669b45fd111a1768e6cf267a7a0607ff0ec", size = 46905617, upload-time = "2026-07-10T08:28:29.376Z" }, + { url = "https://files.pythonhosted.org/packages/6a/29/0ed312ec800fb536f93783215126cee4b8977dcfeccba6f0f44df0cc87d7/pyarrow-25.0.0-cp314-cp314-manylinux_2_28_x86_64.whl", hash = "sha256:447df764beb07c544f0178a5f6b70ef44b9ecf382b3cdfad4c2d7867353c3887", size = 50119765, upload-time = "2026-07-10T08:28:35.826Z" }, + { url = "https://files.pythonhosted.org/packages/ca/88/cab5063ba0c4d46a9f6b4b7eb1c9029dc0302d65cd5ab3510c949a386568/pyarrow-25.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ac5dfeee59f9ceb4d45ba76e83b026c38c24334135bb329d8274baa49cec3c62", size = 50027563, upload-time = "2026-07-10T08:28:43.848Z" }, + { url = "https://files.pythonhosted.org/packages/7b/fb/4d24f1b7fe2e042dc4ef315ef75e4e702d8e46fe10c37e63caff00502b03/pyarrow-25.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:f0f100dacf2c0f400601664a79d1a907ced4740514bb2b00917341038e2ce76f", size = 53162437, upload-time = "2026-07-10T08:28:52.819Z" }, + { url = "https://files.pythonhosted.org/packages/fa/65/da20806de93ca6ee91e72cb6a9b08b3ac890b46efc8d94a7326c651c4c81/pyarrow-25.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:2e093efbecb5317372f819228fa4b4e6157eee48d3f0a7b0303705ebf81a7104", size = 28613262, upload-time = "2026-07-10T08:29:47.544Z" }, + { url = "https://files.pythonhosted.org/packages/86/9f/c632afb1d3ef4a7814cee236718235f3a47eac46e97eb87df40f550b6b48/pyarrow-25.0.0-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:26be35b80780d2d21f4bae3d568b1666337c3a89722cc1794c956a77017cb24e", size = 36120702, upload-time = "2026-07-10T08:28:59.577Z" }, + { url = "https://files.pythonhosted.org/packages/36/0a/093d53a0e72ad06e45d6443e00651bbc2d21af4211295086cbf4d873d3b9/pyarrow-25.0.0-cp314-cp314t-macosx_12_0_x86_64.whl", hash = "sha256:6f4812bfbf11ca7d8faf59eb8fff8bf4dd25ce3a38b62baa010cc17a0926d1b2", size = 37750674, upload-time = "2026-07-10T08:29:06.916Z" }, + { url = "https://files.pythonhosted.org/packages/8a/18/b37fc31a69cff4bdfb8842683def5612f551b93fff6f44375e4a4a6a5535/pyarrow-25.0.0-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:b8af8ceedf0c9c160fd2b63440f2d205b9404db85866c1217bfea601de7cfb50", size = 46912304, upload-time = "2026-07-10T08:29:14.656Z" }, + { url = "https://files.pythonhosted.org/packages/32/35/5cae19ba72493e5598022468b56f6a5571f399f485bf412f157356476caa/pyarrow-25.0.0-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:c70a5fd9a82bd1a702fd482bdc62d38dcb672fb2b449b1d7c0d7d1f4be7b7bfe", size = 50073652, upload-time = "2026-07-10T08:29:22.467Z" }, + { url = "https://files.pythonhosted.org/packages/2e/a5/ddd508424bdfd5e6945765e9e2ffc687e2f6115972badc8ecf423076c407/pyarrow-25.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:0490a7f8b38ffe11cc26526b50c65d111cb54ddac3717cec781806793f1244dc", size = 50058654, upload-time = "2026-07-10T08:29:29.689Z" }, + { url = "https://files.pythonhosted.org/packages/5f/a4/324d0db203ff5eebe8694ec2d6ec5a23f9aaa5d02e5b8c692914c518c33c/pyarrow-25.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:e83916bbcf380866b4e14255850b33323ff678dc9758411d0409cdd2523880b0", size = 53140153, upload-time = "2026-07-10T08:29:36.041Z" }, + { url = "https://files.pythonhosted.org/packages/bd/8d/d236e9c82fe315f9128885c8be3ec719f41965a1eb6b6f4b42470904cd41/pyarrow-25.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:13240f0d3dc5932ccd0bfa90cd76d835680b9d94a7661c635df4b703d40ce849", size = 28743657, upload-time = "2026-07-10T08:29:42.742Z" }, +] + +[[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/e7/08/f1ba952f1c8ae5581c70fa9c6da89f247b83e3dd8c09c035d5d7931fc23d/pydantic_core-2.46.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:a396dcc17e5a0b164dbe026896245a4fa9ff402edca1dff0be3d53a517f74de4", size = 2113146, upload-time = "2026-05-06T13:37:36.537Z" }, + { url = "https://files.pythonhosted.org/packages/56/c6/65f646c7ff09bd257f660434adb45c4dfcbbcebcc030562fecf6f5bf887d/pydantic_core-2.46.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:da4b951fe36dc7c3a1ccb4e3cd1747c3542b8c9ceede8fc86cae054e764485f5", size = 1949769, upload-time = "2026-05-06T13:37:46.365Z" }, + { url = "https://files.pythonhosted.org/packages/64/ba/bfb1d928fd5b49e1258935ff104ae356e9fd89384a55bf9f847e9193ad40/pydantic_core-2.46.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb63e0198ca18aad131c089b9204c23079c3afa95487e561f4c522d519e55aba", size = 1974958, upload-time = "2026-05-06T13:37:28.611Z" }, + { url = "https://files.pythonhosted.org/packages/4e/74/76223bfb117b64af743c9b6670d1364516f5c0604f96b48f3272f6af6cc6/pydantic_core-2.46.4-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f47286a97f0bc9b8859519809077b91b2cefe4ae47fcbf5e466a009c1c5d742b", size = 2042118, upload-time = "2026-05-06T13:36:55.216Z" }, + { url = "https://files.pythonhosted.org/packages/cb/7b/848732968bc8f48f3187542f08358b9d842db564147b256669426ebb1652/pydantic_core-2.46.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:905a0ed8ea6f2d61c1738835f99b699348d7857379083e5fc497fa0c967a407c", size = 2222876, upload-time = "2026-05-06T13:38:25.455Z" }, + { url = "https://files.pythonhosted.org/packages/b5/2f/e90b63ee2e14bd8d3db8f705a6d75d64e6ee1b7c2c8833747ce706e1e0ce/pydantic_core-2.46.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ea793e075b70290d89d8142074262885d3f7da19634845135751bd6344f73b50", size = 2286703, upload-time = "2026-05-06T13:37:53.304Z" }, + { url = "https://files.pythonhosted.org/packages/ba/1e/acc4d70f88a0a277e4a1fa77ebb985ceabaf900430f875bf9338e11c9420/pydantic_core-2.46.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:395aebd9183f9d112f569aeb5b2214d1a10a33bec8456447f7fbdfa51d38d4cd", size = 2092042, upload-time = "2026-05-06T13:38:46.981Z" }, + { url = "https://files.pythonhosted.org/packages/a9/da/0a422b57bf8504102bf3c4ccea9c41bab5a5cee6a54650acf8faf67f5a24/pydantic_core-2.46.4-cp310-cp310-manylinux_2_31_riscv64.whl", hash = "sha256:b078afbc25f3a1436c7a1d2cd3e322497ee99615ba97c563566fdf46aff1ee01", size = 2117231, upload-time = "2026-05-06T13:39:23.146Z" }, + { url = "https://files.pythonhosted.org/packages/bd/2a/2ac13c3af305843e23c5078c53d135656b3f05a2fd78cb7bbbb12e97b473/pydantic_core-2.46.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f747929cf940cddb5b3668a390056ddd5ba2e5010615ea2dcf4f9c4f3ab8791d", size = 2168388, upload-time = "2026-05-06T13:40:08.06Z" }, + { url = "https://files.pythonhosted.org/packages/72/04/2beacf7e1607e93eefe4aed1b4709f079b905fb77530179d4f7c71745f22/pydantic_core-2.46.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:daa27d92c36f24388fe3ad306b174781c747627f134452e4f128ea00ce1fe8c4", size = 2184769, upload-time = "2026-05-06T13:38:13.901Z" }, + { url = "https://files.pythonhosted.org/packages/9e/29/d2b9fd9f539133548eaf622c06a4ce176cb46ac59f32d0359c4abc0de047/pydantic_core-2.46.4-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:19e51f073cd3df251856a8a4189fbdf1de4012c3ebacfb1884f94f1eb406079f", size = 2319312, upload-time = "2026-05-06T13:39:08.24Z" }, + { url = "https://files.pythonhosted.org/packages/7c/af/0f7a5b85fec6075bea96e3ef9187de38fccced0de92c1e7feda8d5cc7bb9/pydantic_core-2.46.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c1747f85cee84c26985853c6f3d9bd3e75da5212912443fa111c113b9c246f39", size = 2361817, upload-time = "2026-05-06T13:38:43.2Z" }, + { url = "https://files.pythonhosted.org/packages/25/a4/73363fec545fd3ec025490bdda2743c56d0dd5b6266b1a53bbe9e4265375/pydantic_core-2.46.4-cp310-cp310-win32.whl", hash = "sha256:2f84c03c8607173d16b5a854ec68a2f9079ae03237a54fb506d13af47e1d018d", size = 1987085, upload-time = "2026-05-06T13:39:25.497Z" }, + { url = "https://files.pythonhosted.org/packages/01/aa/62f082da2c91fac1c234bc9ee0066257ce83f0604abd72e4c9d5991f2d84/pydantic_core-2.46.4-cp310-cp310-win_amd64.whl", hash = "sha256:8358a950c8909158e3df31538a7e4edc2d7265a7c54b47f0864d9e5bae9dcebf", size = 2074311, upload-time = "2026-05-06T13:39:59.922Z" }, + { url = "https://files.pythonhosted.org/packages/5c/fa/6d7708d2cfc1a832acb6aeb0cd16e801902df8a0f583bb3b4b527fde022e/pydantic_core-2.46.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:0e96592440881c74a213e5ad528e2b24d3d4f940de2766bed9010ab1d9e51594", size = 2111872, upload-time = "2026-05-06T13:40:27.596Z" }, + { url = "https://files.pythonhosted.org/packages/ae/6f/aa064a3e74b5745afbdf250594f38e7ead05e2d651bcb35994b9417a0d4d/pydantic_core-2.46.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e0d65b8c354be7fb5f720c3caa8bc940bc2d20ce749c8e06135f07f8ed95dd7c", size = 1948255, upload-time = "2026-05-06T13:39:12.574Z" }, + { url = "https://files.pythonhosted.org/packages/43/3a/41114a9f7569b84b4d84e7a018c57c56347dac30c0d4a872946ec4e36c46/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bfb192b3f4b9e8a89b6277b6ce787564f62cfd272055f6e685726b111dc7826", size = 1972827, upload-time = "2026-05-06T13:38:19.841Z" }, + { url = "https://files.pythonhosted.org/packages/ef/25/1ab42e8048fe551934d9884e8d64daa7e990ad386f310a15981aeb6a5b08/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9037063db01f09b09e237c282b6792bd4da634b5402c4e7f0c61effed7701a04", size = 2041051, upload-time = "2026-05-06T13:38:10.447Z" }, + { url = "https://files.pythonhosted.org/packages/94/c2/1a934597ddf08da410385b3b7aae91956a5a76c635effef456074fad7e88/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fc010ab034c8c7452522748bf937df58020d256ccae0874463d1f4d01758af8e", size = 2221314, upload-time = "2026-05-06T13:40:13.089Z" }, + { url = "https://files.pythonhosted.org/packages/02/6d/9e8ad178c9c4df27ad3c8f25d1fe2a7ab0d2ba0559fad4aee5d3d1f16771/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8c5dac79fa1614d1e06ca695109c6105923bd9c7d1d6c918d4e637b7e6b32fd3", size = 2285146, upload-time = "2026-05-06T13:38:59.224Z" }, + { url = "https://files.pythonhosted.org/packages/80/50/540cd3aeefc041beb111125c4bff779831a2111fc6b15a9138cda277d32c/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f9fa868638bf362d3d138ea55829cefb3d5f4b0d7f142234382a15e2485dbec4", size = 2089685, upload-time = "2026-05-06T13:38:17.762Z" }, + { url = "https://files.pythonhosted.org/packages/6b/a4/b440ad35f05f6a38f89fa0f149accb3f0e02be94ca5e15f3c449a61b4bc9/pydantic_core-2.46.4-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:17299feefe090f2caa5b8e37222bb5f663e4935a8bfa6931d4102e5df1a9f398", size = 2115420, upload-time = "2026-05-06T13:37:58.195Z" }, + { url = "https://files.pythonhosted.org/packages/99/61/de4f55db8dfd57bfdfa9a12ec90fe1b57c4f41062f7ca86f08586b3e0ac0/pydantic_core-2.46.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4c63ebc82684aa89d9a3bcbd13d515b3be44250dc68dd3bd81526c1cb31286c3", size = 2165122, upload-time = "2026-05-06T13:37:01.167Z" }, + { url = "https://files.pythonhosted.org/packages/f7/52/7c529d7bdb2d1068bd52f51fe32572c8301f9a4febf1948f10639f1436f5/pydantic_core-2.46.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:aaa2a54443eff1950ba5ddc6b6ccda0d9c84a364276a62f969bdf2a390650848", size = 2182573, upload-time = "2026-05-06T13:38:45.04Z" }, + { url = "https://files.pythonhosted.org/packages/37/b3/7c40325848ba78247f2812dcf9c7274e38cd801820ca6dd9fe63bcfb0eb4/pydantic_core-2.46.4-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:18e5ceec2ab67e6d5f1a9085e5a24c9c4e2ac4545730bfe668680bca05e555f3", size = 2317139, upload-time = "2026-05-06T13:37:15.539Z" }, + { url = "https://files.pythonhosted.org/packages/d9/37/f913f81a657c865b75da6c0dbed79876073c2a43b5bd9edbe8da785e4d49/pydantic_core-2.46.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a0f62d0a58f4e7da165457e995725421e0064f2255d8eccebc49f41bbc23b109", size = 2360433, upload-time = "2026-05-06T13:37:30.099Z" }, + { url = "https://files.pythonhosted.org/packages/c4/67/6acaa1be2567f9256b056d8477158cac7240813956ce86e49deae8e173b4/pydantic_core-2.46.4-cp311-cp311-win32.whl", hash = "sha256:041bde0a48fd37cf71cab1c9d56d3e8625a3793fef1f7dd232b3ff37e978ecda", size = 1985513, upload-time = "2026-05-06T13:38:15.669Z" }, + { url = "https://files.pythonhosted.org/packages/aa/e6/c505f83dfeda9a2e5c995cfd872949e4d05e12f7feb3dca72f633daefa94/pydantic_core-2.46.4-cp311-cp311-win_amd64.whl", hash = "sha256:6f2eeda33a839975441c86a4119e1383c50b47faf0cbb5176985565c6bb02c33", size = 2071114, upload-time = "2026-05-06T13:40:35.416Z" }, + { url = "https://files.pythonhosted.org/packages/0f/da/7a263a96d965d9d0df5e8de8a475f33495451117035b09acb110288c381f/pydantic_core-2.46.4-cp311-cp311-win_arm64.whl", hash = "sha256:14f4c5d6db102bd796a627bbb3a17b4cf4574b9ae861d8b7c9a9661c6dd3362d", size = 2044298, upload-time = "2026-05-06T13:38:29.754Z" }, + { 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/ee/a4/73995fd4ebbb46ba0ee51e6fa049b8f02c40daebb762208feda8a6b7894d/pydantic_core-2.46.4-graalpy311-graalpy242_311_native-macosx_10_12_x86_64.whl", hash = "sha256:14d4edf427bdcf950a8a02d7cb44a08614388dd6e1bdcbf4f67504fa7887da9c", size = 2111589, upload-time = "2026-05-06T13:37:10.817Z" }, + { url = "https://files.pythonhosted.org/packages/fb/7f/f37d3a5e8bfcc2e403f5c57a730f2d815693fb42119e8ea48b3789335af1/pydantic_core-2.46.4-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl", hash = "sha256:0ce40cd7b21210e99342afafbd4d0f76d784eb5b1d60f3bdc566be4983c6c73b", size = 1944552, upload-time = "2026-05-06T13:36:56.717Z" }, + { url = "https://files.pythonhosted.org/packages/15/3c/d7eb777b3ff43e8433a4efb39a17aa8fd98a4ee8561a24a67ef5db07b2d6/pydantic_core-2.46.4-graalpy311-graalpy242_311_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:90884113d8b48f760e9587002789ddd741e76ab9f89518cd1e43b1f1a52ec44b", size = 1982984, upload-time = "2026-05-06T13:39:06.207Z" }, + { url = "https://files.pythonhosted.org/packages/63/87/70b9f40170a81afd55ca26c9b2acb25c20d64bcfbf888fafecb3ba077d4c/pydantic_core-2.46.4-graalpy311-graalpy242_311_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66ce7632c22d837c95301830e111ad0128a32b8207533b60896a96c4915192ea", size = 2138417, upload-time = "2026-05-06T13:39:45.476Z" }, + { 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" }, + { url = "https://files.pythonhosted.org/packages/11/cb/428de0385b6c8d44b716feba566abfacfbd23ee3c4439faa789a1456242f/pydantic_core-2.46.4-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:0c563b08bca408dc7f65f700633d8442fffb2421fc47b8101377e9fd65051ff0", size = 2112782, upload-time = "2026-05-06T13:37:04.016Z" }, + { url = "https://files.pythonhosted.org/packages/0b/b5/6a17bdadd0fc1f170adfd05a20d37c832f52b117b4d9131da1f41bb097ce/pydantic_core-2.46.4-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:db06ffe51636ffe9ca531fe9023dd64bdd794be8754cb5df57c5498ae5b518a7", size = 1952146, upload-time = "2026-05-06T13:39:43.092Z" }, + { url = "https://files.pythonhosted.org/packages/2a/dc/03734d80e362cd43ef65428e9de77c730ce7f2f11c60d2b1e1b39f0fbf99/pydantic_core-2.46.4-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:133878133d271ade3d41d1bfb2a45ec38dbdbda40bc065921c6b04e4630127e2", size = 2134492, upload-time = "2026-05-06T13:36:58.124Z" }, + { url = "https://files.pythonhosted.org/packages/de/df/5e5ffc085ed07cc22d298134d3d911c63e91f6a0eb91fe646750a3209910/pydantic_core-2.46.4-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9bc519fbf2b7578398853d815009ae5e4d4603d12f4e3f91da8c06852d3da3e9", size = 2156604, upload-time = "2026-05-06T13:37:49.88Z" }, + { url = "https://files.pythonhosted.org/packages/81/44/6e112a4253e56f5705467cbab7ab5e91ee7398ba3d56d358635958893d3e/pydantic_core-2.46.4-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:c7a7bd4e39e8e4c12c39cd480356842b6a8a06e41b23a55a5e3e191718838ddf", size = 2183828, upload-time = "2026-05-06T13:37:43.053Z" }, + { url = "https://files.pythonhosted.org/packages/ac/ad/5565071e937d8e752842ac241463944c9eb14c87e2d269f2658a5bd05e98/pydantic_core-2.46.4-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:d396ec2b979760aaf3218e76c24e65bd0aca24983298653b3a9d7a45f9e47b30", size = 2310000, upload-time = "2026-05-06T13:37:56.694Z" }, + { url = "https://files.pythonhosted.org/packages/4f/c3/66883a5cec183e7fba4d024b4cbbe61851a63750ef606b0afecc46d1f2bf/pydantic_core-2.46.4-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:86e1a4418c6cd97d60c95c71164158eaf7324fae7b0923264016baa993eba6fc", size = 2361286, upload-time = "2026-05-06T13:40:05.667Z" }, + { url = "https://files.pythonhosted.org/packages/4b/2d/69abac8f838090bbecd5df894befb2c2619e7996a98ddb949db9f3b93225/pydantic_core-2.46.4-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:d51026d73fcfd93610abc7b27789c26b313920fcfb20e27462d74a7f8b06e983", size = 2193071, upload-time = "2026-05-06T13:38:08.682Z" }, +] + +[[package]] +name = "pygments" +version = "2.20.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c3/b2/bc9c9196916376152d655522fdcebac55e66de6603a76a02bca1b6414f6c/pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f", size = 4955991, upload-time = "2026-03-29T13:29:33.898Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176", size = 1231151, upload-time = "2026-03-29T13:29:30.038Z" }, +] + +[[package]] +name = "pymysql" +version = "1.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c9/bc/1c6a92f385940f727daeecf3bacaf186e03875dff57197801046c583bcf0/pymysql-1.2.0.tar.gz", hash = "sha256:6c7b17ca686988104d7426c27895b455cdeea3e9d3ceb1270f0c3704fead8c33", size = 49021, upload-time = "2026-05-19T08:26:22.302Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c4/bd/2534e130295c8cfd4f0a2e31623baab7502278f1e97bcfe61db75656a77f/pymysql-1.2.0-py3-none-any.whl", hash = "sha256:62169ce6d5510f08e140c5e7990ee884a9764024e4a9a27b2cc11f1099322ae0", size = 45716, upload-time = "2026-05-19T08:26:20.974Z" }, +] + +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432, upload-time = "2024-03-01T18:36:20.211Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload-time = "2024-03-01T18:36:18.57Z" }, +] + +[[package]] +name = "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 = "pytz" +version = "2026.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ff/46/dd499ec9038423421951e4fad73051febaa13d2df82b4064f87af8b8c0c3/pytz-2026.2.tar.gz", hash = "sha256:0e60b47b29f21574376f218fe21abc009894a2321ea16c6754f3cad6eb7cdd6a", size = 320861, upload-time = "2026-05-04T01:35:29.667Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/dd/96da98f892250475bdf2328112d7468abdd4acc7b902b6af23f4ed958ea0/pytz-2026.2-py2.py3-none-any.whl", hash = "sha256:04156e608bee23d3792fd45c94ae47fae1036688e75032eea2e3bf0323d1f126", size = 510141, upload-time = "2026-05-04T01:35:27.408Z" }, +] + +[[package]] +name = "pyyaml" +version = "6.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", size = 130960, upload-time = "2025-09-25T21:33:16.546Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/a0/39350dd17dd6d6c6507025c0e53aef67a9293a6d37d3511f23ea510d5800/pyyaml-6.0.3-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:214ed4befebe12df36bcc8bc2b64b396ca31be9304b8f59e25c11cf94a4c033b", size = 184227, upload-time = "2025-09-25T21:31:46.04Z" }, + { url = "https://files.pythonhosted.org/packages/05/14/52d505b5c59ce73244f59c7a50ecf47093ce4765f116cdb98286a71eeca2/pyyaml-6.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:02ea2dfa234451bbb8772601d7b8e426c2bfa197136796224e50e35a78777956", size = 174019, upload-time = "2025-09-25T21:31:47.706Z" }, + { url = "https://files.pythonhosted.org/packages/43/f7/0e6a5ae5599c838c696adb4e6330a59f463265bfa1e116cfd1fbb0abaaae/pyyaml-6.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b30236e45cf30d2b8e7b3e85881719e98507abed1011bf463a8fa23e9c3e98a8", size = 740646, upload-time = "2025-09-25T21:31:49.21Z" }, + { url = "https://files.pythonhosted.org/packages/2f/3a/61b9db1d28f00f8fd0ae760459a5c4bf1b941baf714e207b6eb0657d2578/pyyaml-6.0.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:66291b10affd76d76f54fad28e22e51719ef9ba22b29e1d7d03d6777a9174198", size = 840793, upload-time = "2025-09-25T21:31:50.735Z" }, + { url = "https://files.pythonhosted.org/packages/7a/1e/7acc4f0e74c4b3d9531e24739e0ab832a5edf40e64fbae1a9c01941cabd7/pyyaml-6.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9c7708761fccb9397fe64bbc0395abcae8c4bf7b0eac081e12b809bf47700d0b", size = 770293, upload-time = "2025-09-25T21:31:51.828Z" }, + { url = "https://files.pythonhosted.org/packages/8b/ef/abd085f06853af0cd59fa5f913d61a8eab65d7639ff2a658d18a25d6a89d/pyyaml-6.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:418cf3f2111bc80e0933b2cd8cd04f286338bb88bdc7bc8e6dd775ebde60b5e0", size = 732872, upload-time = "2025-09-25T21:31:53.282Z" }, + { url = "https://files.pythonhosted.org/packages/1f/15/2bc9c8faf6450a8b3c9fc5448ed869c599c0a74ba2669772b1f3a0040180/pyyaml-6.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5e0b74767e5f8c593e8c9b5912019159ed0533c70051e9cce3e8b6aa699fcd69", size = 758828, upload-time = "2025-09-25T21:31:54.807Z" }, + { url = "https://files.pythonhosted.org/packages/a3/00/531e92e88c00f4333ce359e50c19b8d1de9fe8d581b1534e35ccfbc5f393/pyyaml-6.0.3-cp310-cp310-win32.whl", hash = "sha256:28c8d926f98f432f88adc23edf2e6d4921ac26fb084b028c733d01868d19007e", size = 142415, upload-time = "2025-09-25T21:31:55.885Z" }, + { url = "https://files.pythonhosted.org/packages/2a/fa/926c003379b19fca39dd4634818b00dec6c62d87faf628d1394e137354d4/pyyaml-6.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:bdb2c67c6c1390b63c6ff89f210c8fd09d9a1217a465701eac7316313c915e4c", size = 158561, upload-time = "2025-09-25T21:31:57.406Z" }, + { url = "https://files.pythonhosted.org/packages/6d/16/a95b6757765b7b031c9374925bb718d55e0a9ba8a1b6a12d25962ea44347/pyyaml-6.0.3-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:44edc647873928551a01e7a563d7452ccdebee747728c1080d881d68af7b997e", size = 185826, upload-time = "2025-09-25T21:31:58.655Z" }, + { url = "https://files.pythonhosted.org/packages/16/19/13de8e4377ed53079ee996e1ab0a9c33ec2faf808a4647b7b4c0d46dd239/pyyaml-6.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:652cb6edd41e718550aad172851962662ff2681490a8a711af6a4d288dd96824", size = 175577, upload-time = "2025-09-25T21:32:00.088Z" }, + { url = "https://files.pythonhosted.org/packages/0c/62/d2eb46264d4b157dae1275b573017abec435397aa59cbcdab6fc978a8af4/pyyaml-6.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:10892704fc220243f5305762e276552a0395f7beb4dbf9b14ec8fd43b57f126c", size = 775556, upload-time = "2025-09-25T21:32:01.31Z" }, + { url = "https://files.pythonhosted.org/packages/10/cb/16c3f2cf3266edd25aaa00d6c4350381c8b012ed6f5276675b9eba8d9ff4/pyyaml-6.0.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:850774a7879607d3a6f50d36d04f00ee69e7fc816450e5f7e58d7f17f1ae5c00", size = 882114, upload-time = "2025-09-25T21:32:03.376Z" }, + { url = "https://files.pythonhosted.org/packages/71/60/917329f640924b18ff085ab889a11c763e0b573da888e8404ff486657602/pyyaml-6.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b8bb0864c5a28024fac8a632c443c87c5aa6f215c0b126c449ae1a150412f31d", size = 806638, upload-time = "2025-09-25T21:32:04.553Z" }, + { url = "https://files.pythonhosted.org/packages/dd/6f/529b0f316a9fd167281a6c3826b5583e6192dba792dd55e3203d3f8e655a/pyyaml-6.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d37d57ad971609cf3c53ba6a7e365e40660e3be0e5175fa9f2365a379d6095a", size = 767463, upload-time = "2025-09-25T21:32:06.152Z" }, + { url = "https://files.pythonhosted.org/packages/f2/6a/b627b4e0c1dd03718543519ffb2f1deea4a1e6d42fbab8021936a4d22589/pyyaml-6.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:37503bfbfc9d2c40b344d06b2199cf0e96e97957ab1c1b546fd4f87e53e5d3e4", size = 794986, upload-time = "2025-09-25T21:32:07.367Z" }, + { url = "https://files.pythonhosted.org/packages/45/91/47a6e1c42d9ee337c4839208f30d9f09caa9f720ec7582917b264defc875/pyyaml-6.0.3-cp311-cp311-win32.whl", hash = "sha256:8098f252adfa6c80ab48096053f512f2321f0b998f98150cea9bd23d83e1467b", size = 142543, upload-time = "2025-09-25T21:32:08.95Z" }, + { url = "https://files.pythonhosted.org/packages/da/e3/ea007450a105ae919a72393cb06f122f288ef60bba2dc64b26e2646fa315/pyyaml-6.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:9f3bfb4965eb874431221a3ff3fdcddc7e74e3b07799e0e84ca4a0f867d449bf", size = 158763, upload-time = "2025-09-25T21:32:09.96Z" }, + { url = "https://files.pythonhosted.org/packages/d1/33/422b98d2195232ca1826284a76852ad5a86fe23e31b009c9886b2d0fb8b2/pyyaml-6.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196", size = 182063, upload-time = "2025-09-25T21:32:11.445Z" }, + { url = "https://files.pythonhosted.org/packages/89/a0/6cf41a19a1f2f3feab0e9c0b74134aa2ce6849093d5517a0c550fe37a648/pyyaml-6.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0", size = 173973, upload-time = "2025-09-25T21:32:12.492Z" }, + { url = "https://files.pythonhosted.org/packages/ed/23/7a778b6bd0b9a8039df8b1b1d80e2e2ad78aa04171592c8a5c43a56a6af4/pyyaml-6.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28", size = 775116, upload-time = "2025-09-25T21:32:13.652Z" }, + { url = "https://files.pythonhosted.org/packages/65/30/d7353c338e12baef4ecc1b09e877c1970bd3382789c159b4f89d6a70dc09/pyyaml-6.0.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c", size = 844011, upload-time = "2025-09-25T21:32:15.21Z" }, + { url = "https://files.pythonhosted.org/packages/8b/9d/b3589d3877982d4f2329302ef98a8026e7f4443c765c46cfecc8858c6b4b/pyyaml-6.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc", size = 807870, upload-time = "2025-09-25T21:32:16.431Z" }, + { url = "https://files.pythonhosted.org/packages/05/c0/b3be26a015601b822b97d9149ff8cb5ead58c66f981e04fedf4e762f4bd4/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e", size = 761089, upload-time = "2025-09-25T21:32:17.56Z" }, + { url = "https://files.pythonhosted.org/packages/be/8e/98435a21d1d4b46590d5459a22d88128103f8da4c2d4cb8f14f2a96504e1/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea", size = 790181, upload-time = "2025-09-25T21:32:18.834Z" }, + { url = "https://files.pythonhosted.org/packages/74/93/7baea19427dcfbe1e5a372d81473250b379f04b1bd3c4c5ff825e2327202/pyyaml-6.0.3-cp312-cp312-win32.whl", hash = "sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5", size = 137658, upload-time = "2025-09-25T21:32:20.209Z" }, + { url = "https://files.pythonhosted.org/packages/86/bf/899e81e4cce32febab4fb42bb97dcdf66bc135272882d1987881a4b519e9/pyyaml-6.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b", size = 154003, upload-time = "2025-09-25T21:32:21.167Z" }, + { url = "https://files.pythonhosted.org/packages/1a/08/67bd04656199bbb51dbed1439b7f27601dfb576fb864099c7ef0c3e55531/pyyaml-6.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd", size = 140344, upload-time = "2025-09-25T21:32:22.617Z" }, + { url = "https://files.pythonhosted.org/packages/d1/11/0fd08f8192109f7169db964b5707a2f1e8b745d4e239b784a5a1dd80d1db/pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8", size = 181669, upload-time = "2025-09-25T21:32:23.673Z" }, + { url = "https://files.pythonhosted.org/packages/b1/16/95309993f1d3748cd644e02e38b75d50cbc0d9561d21f390a76242ce073f/pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1", size = 173252, upload-time = "2025-09-25T21:32:25.149Z" }, + { url = "https://files.pythonhosted.org/packages/50/31/b20f376d3f810b9b2371e72ef5adb33879b25edb7a6d072cb7ca0c486398/pyyaml-6.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c", size = 767081, upload-time = "2025-09-25T21:32:26.575Z" }, + { url = "https://files.pythonhosted.org/packages/49/1e/a55ca81e949270d5d4432fbbd19dfea5321eda7c41a849d443dc92fd1ff7/pyyaml-6.0.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5", size = 841159, upload-time = "2025-09-25T21:32:27.727Z" }, + { url = "https://files.pythonhosted.org/packages/74/27/e5b8f34d02d9995b80abcef563ea1f8b56d20134d8f4e5e81733b1feceb2/pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6", size = 801626, upload-time = "2025-09-25T21:32:28.878Z" }, + { url = "https://files.pythonhosted.org/packages/f9/11/ba845c23988798f40e52ba45f34849aa8a1f2d4af4b798588010792ebad6/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6", size = 753613, upload-time = "2025-09-25T21:32:30.178Z" }, + { url = "https://files.pythonhosted.org/packages/3d/e0/7966e1a7bfc0a45bf0a7fb6b98ea03fc9b8d84fa7f2229e9659680b69ee3/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be", size = 794115, upload-time = "2025-09-25T21:32:31.353Z" }, + { url = "https://files.pythonhosted.org/packages/de/94/980b50a6531b3019e45ddeada0626d45fa85cbe22300844a7983285bed3b/pyyaml-6.0.3-cp313-cp313-win32.whl", hash = "sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26", size = 137427, upload-time = "2025-09-25T21:32:32.58Z" }, + { url = "https://files.pythonhosted.org/packages/97/c9/39d5b874e8b28845e4ec2202b5da735d0199dbe5b8fb85f91398814a9a46/pyyaml-6.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c", size = 154090, upload-time = "2025-09-25T21:32:33.659Z" }, + { url = "https://files.pythonhosted.org/packages/73/e8/2bdf3ca2090f68bb3d75b44da7bbc71843b19c9f2b9cb9b0f4ab7a5a4329/pyyaml-6.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb", size = 140246, upload-time = "2025-09-25T21:32:34.663Z" }, + { url = "https://files.pythonhosted.org/packages/9d/8c/f4bd7f6465179953d3ac9bc44ac1a8a3e6122cf8ada906b4f96c60172d43/pyyaml-6.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac", size = 181814, upload-time = "2025-09-25T21:32:35.712Z" }, + { url = "https://files.pythonhosted.org/packages/bd/9c/4d95bb87eb2063d20db7b60faa3840c1b18025517ae857371c4dd55a6b3a/pyyaml-6.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310", size = 173809, upload-time = "2025-09-25T21:32:36.789Z" }, + { url = "https://files.pythonhosted.org/packages/92/b5/47e807c2623074914e29dabd16cbbdd4bf5e9b2db9f8090fa64411fc5382/pyyaml-6.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7", size = 766454, upload-time = "2025-09-25T21:32:37.966Z" }, + { url = "https://files.pythonhosted.org/packages/02/9e/e5e9b168be58564121efb3de6859c452fccde0ab093d8438905899a3a483/pyyaml-6.0.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788", size = 836355, upload-time = "2025-09-25T21:32:39.178Z" }, + { url = "https://files.pythonhosted.org/packages/88/f9/16491d7ed2a919954993e48aa941b200f38040928474c9e85ea9e64222c3/pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5", size = 794175, upload-time = "2025-09-25T21:32:40.865Z" }, + { url = "https://files.pythonhosted.org/packages/dd/3f/5989debef34dc6397317802b527dbbafb2b4760878a53d4166579111411e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764", size = 755228, upload-time = "2025-09-25T21:32:42.084Z" }, + { url = "https://files.pythonhosted.org/packages/d7/ce/af88a49043cd2e265be63d083fc75b27b6ed062f5f9fd6cdc223ad62f03e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35", size = 789194, upload-time = "2025-09-25T21:32:43.362Z" }, + { url = "https://files.pythonhosted.org/packages/23/20/bb6982b26a40bb43951265ba29d4c246ef0ff59c9fdcdf0ed04e0687de4d/pyyaml-6.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac", size = 156429, upload-time = "2025-09-25T21:32:57.844Z" }, + { url = "https://files.pythonhosted.org/packages/f4/f4/a4541072bb9422c8a883ab55255f918fa378ecf083f5b85e87fc2b4eda1b/pyyaml-6.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3", size = 143912, upload-time = "2025-09-25T21:32:59.247Z" }, + { url = "https://files.pythonhosted.org/packages/7c/f9/07dd09ae774e4616edf6cda684ee78f97777bdd15847253637a6f052a62f/pyyaml-6.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3", size = 189108, upload-time = "2025-09-25T21:32:44.377Z" }, + { url = "https://files.pythonhosted.org/packages/4e/78/8d08c9fb7ce09ad8c38ad533c1191cf27f7ae1effe5bb9400a46d9437fcf/pyyaml-6.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba", size = 183641, upload-time = "2025-09-25T21:32:45.407Z" }, + { url = "https://files.pythonhosted.org/packages/7b/5b/3babb19104a46945cf816d047db2788bcaf8c94527a805610b0289a01c6b/pyyaml-6.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c", size = 831901, upload-time = "2025-09-25T21:32:48.83Z" }, + { url = "https://files.pythonhosted.org/packages/8b/cc/dff0684d8dc44da4d22a13f35f073d558c268780ce3c6ba1b87055bb0b87/pyyaml-6.0.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702", size = 861132, upload-time = "2025-09-25T21:32:50.149Z" }, + { url = "https://files.pythonhosted.org/packages/b1/5e/f77dc6b9036943e285ba76b49e118d9ea929885becb0a29ba8a7c75e29fe/pyyaml-6.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c", size = 839261, upload-time = "2025-09-25T21:32:51.808Z" }, + { url = "https://files.pythonhosted.org/packages/ce/88/a9db1376aa2a228197c58b37302f284b5617f56a5d959fd1763fb1675ce6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065", size = 805272, upload-time = "2025-09-25T21:32:52.941Z" }, + { url = "https://files.pythonhosted.org/packages/da/92/1446574745d74df0c92e6aa4a7b0b3130706a4142b2d1a5869f2eaa423c6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65", size = 829923, upload-time = "2025-09-25T21:32:54.537Z" }, + { url = "https://files.pythonhosted.org/packages/f0/7a/1c7270340330e575b92f397352af856a8c06f230aa3e76f86b39d01b416a/pyyaml-6.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9", size = 174062, upload-time = "2025-09-25T21:32:55.767Z" }, + { url = "https://files.pythonhosted.org/packages/f1/12/de94a39c2ef588c7e6455cfbe7343d3b2dc9d6b6b2f40c4c6565744c873d/pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b", size = 149341, upload-time = "2025-09-25T21:32:56.828Z" }, +] + +[[package]] +name = "referencing" +version = "0.37.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "attrs" }, + { name = "rpds-py", version = "0.30.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "rpds-py", version = "2026.6.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/22/f5/df4e9027acead3ecc63e50fe1e36aca1523e1719559c499951bb4b53188f/referencing-0.37.0.tar.gz", hash = "sha256:44aefc3142c5b842538163acb373e24cce6632bd54bdb01b21ad5863489f50d8", size = 78036, upload-time = "2025-10-13T15:30:48.871Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl", hash = "sha256:381329a9f99628c9069361716891d34ad94af76e461dcb0335825aecc7692231", size = 26766, upload-time = "2025-10-13T15:30:47.625Z" }, +] + +[[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 = "rich" +version = "15.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown-it-py" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c0/8f/0722ca900cc807c13a6a0c696dacf35430f72e0ec571c4275d2371fca3e9/rich-15.0.0.tar.gz", hash = "sha256:edd07a4824c6b40189fb7ac9bc4c52536e9780fbbfbddf6f1e2502c31b068c36", size = 230680, upload-time = "2026-04-12T08:24:00.75Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/82/3b/64d4899d73f91ba49a8c18a8ff3f0ea8f1c1d75481760df8c68ef5235bf5/rich-15.0.0-py3-none-any.whl", hash = "sha256:33bd4ef74232fb73fe9279a257718407f169c09b78a87ad3d296f548e27de0bb", size = 310654, upload-time = "2026-04-12T08:24:02.83Z" }, +] + +[[package]] +name = "rpds-py" +version = "0.30.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.11'", +] +sdist = { url = "https://files.pythonhosted.org/packages/20/af/3f2f423103f1113b36230496629986e0ef7e199d2aa8392452b484b38ced/rpds_py-0.30.0.tar.gz", hash = "sha256:dd8ff7cf90014af0c0f787eea34794ebf6415242ee1d6fa91eaba725cc441e84", size = 69469, upload-time = "2025-11-30T20:24:38.837Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/06/0c/0c411a0ec64ccb6d104dcabe0e713e05e153a9a2c3c2bd2b32ce412166fe/rpds_py-0.30.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:679ae98e00c0e8d68a7fda324e16b90fd5260945b45d3b824c892cec9eea3288", size = 370490, upload-time = "2025-11-30T20:21:33.256Z" }, + { url = "https://files.pythonhosted.org/packages/19/6a/4ba3d0fb7297ebae71171822554abe48d7cab29c28b8f9f2c04b79988c05/rpds_py-0.30.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4cc2206b76b4f576934f0ed374b10d7ca5f457858b157ca52064bdfc26b9fc00", size = 359751, upload-time = "2025-11-30T20:21:34.591Z" }, + { url = "https://files.pythonhosted.org/packages/cd/7c/e4933565ef7f7a0818985d87c15d9d273f1a649afa6a52ea35ad011195ea/rpds_py-0.30.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:389a2d49eded1896c3d48b0136ead37c48e221b391c052fba3f4055c367f60a6", size = 389696, upload-time = "2025-11-30T20:21:36.122Z" }, + { url = "https://files.pythonhosted.org/packages/5e/01/6271a2511ad0815f00f7ed4390cf2567bec1d4b1da39e2c27a41e6e3b4de/rpds_py-0.30.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:32c8528634e1bf7121f3de08fa85b138f4e0dc47657866630611b03967f041d7", size = 403136, upload-time = "2025-11-30T20:21:37.728Z" }, + { url = "https://files.pythonhosted.org/packages/55/64/c857eb7cd7541e9b4eee9d49c196e833128a55b89a9850a9c9ac33ccf897/rpds_py-0.30.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f207f69853edd6f6700b86efb84999651baf3789e78a466431df1331608e5324", size = 524699, upload-time = "2025-11-30T20:21:38.92Z" }, + { url = "https://files.pythonhosted.org/packages/9c/ed/94816543404078af9ab26159c44f9e98e20fe47e2126d5d32c9d9948d10a/rpds_py-0.30.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:67b02ec25ba7a9e8fa74c63b6ca44cf5707f2fbfadae3ee8e7494297d56aa9df", size = 412022, upload-time = "2025-11-30T20:21:40.407Z" }, + { url = "https://files.pythonhosted.org/packages/61/b5/707f6cf0066a6412aacc11d17920ea2e19e5b2f04081c64526eb35b5c6e7/rpds_py-0.30.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c0e95f6819a19965ff420f65578bacb0b00f251fefe2c8b23347c37174271f3", size = 390522, upload-time = "2025-11-30T20:21:42.17Z" }, + { url = "https://files.pythonhosted.org/packages/13/4e/57a85fda37a229ff4226f8cbcf09f2a455d1ed20e802ce5b2b4a7f5ed053/rpds_py-0.30.0-cp310-cp310-manylinux_2_31_riscv64.whl", hash = "sha256:a452763cc5198f2f98898eb98f7569649fe5da666c2dc6b5ddb10fde5a574221", size = 404579, upload-time = "2025-11-30T20:21:43.769Z" }, + { url = "https://files.pythonhosted.org/packages/f9/da/c9339293513ec680a721e0e16bf2bac3db6e5d7e922488de471308349bba/rpds_py-0.30.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e0b65193a413ccc930671c55153a03ee57cecb49e6227204b04fae512eb657a7", size = 421305, upload-time = "2025-11-30T20:21:44.994Z" }, + { url = "https://files.pythonhosted.org/packages/f9/be/522cb84751114f4ad9d822ff5a1aa3c98006341895d5f084779b99596e5c/rpds_py-0.30.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:858738e9c32147f78b3ac24dc0edb6610000e56dc0f700fd5f651d0a0f0eb9ff", size = 572503, upload-time = "2025-11-30T20:21:46.91Z" }, + { url = "https://files.pythonhosted.org/packages/a2/9b/de879f7e7ceddc973ea6e4629e9b380213a6938a249e94b0cdbcc325bb66/rpds_py-0.30.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:da279aa314f00acbb803da1e76fa18666778e8a8f83484fba94526da5de2cba7", size = 598322, upload-time = "2025-11-30T20:21:48.709Z" }, + { url = "https://files.pythonhosted.org/packages/48/ac/f01fc22efec3f37d8a914fc1b2fb9bcafd56a299edbe96406f3053edea5a/rpds_py-0.30.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7c64d38fb49b6cdeda16ab49e35fe0da2e1e9b34bc38bd78386530f218b37139", size = 560792, upload-time = "2025-11-30T20:21:50.024Z" }, + { url = "https://files.pythonhosted.org/packages/e2/da/4e2b19d0f131f35b6146425f846563d0ce036763e38913d917187307a671/rpds_py-0.30.0-cp310-cp310-win32.whl", hash = "sha256:6de2a32a1665b93233cde140ff8b3467bdb9e2af2b91079f0333a0974d12d464", size = 221901, upload-time = "2025-11-30T20:21:51.32Z" }, + { url = "https://files.pythonhosted.org/packages/96/cb/156d7a5cf4f78a7cc571465d8aec7a3c447c94f6749c5123f08438bcf7bc/rpds_py-0.30.0-cp310-cp310-win_amd64.whl", hash = "sha256:1726859cd0de969f88dc8673bdd954185b9104e05806be64bcd87badbe313169", size = 235823, upload-time = "2025-11-30T20:21:52.505Z" }, + { url = "https://files.pythonhosted.org/packages/4d/6e/f964e88b3d2abee2a82c1ac8366da848fce1c6d834dc2132c3fda3970290/rpds_py-0.30.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:a2bffea6a4ca9f01b3f8e548302470306689684e61602aa3d141e34da06cf425", size = 370157, upload-time = "2025-11-30T20:21:53.789Z" }, + { url = "https://files.pythonhosted.org/packages/94/ba/24e5ebb7c1c82e74c4e4f33b2112a5573ddc703915b13a073737b59b86e0/rpds_py-0.30.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dc4f992dfe1e2bc3ebc7444f6c7051b4bc13cd8e33e43511e8ffd13bf407010d", size = 359676, upload-time = "2025-11-30T20:21:55.475Z" }, + { url = "https://files.pythonhosted.org/packages/84/86/04dbba1b087227747d64d80c3b74df946b986c57af0a9f0c98726d4d7a3b/rpds_py-0.30.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:422c3cb9856d80b09d30d2eb255d0754b23e090034e1deb4083f8004bd0761e4", size = 389938, upload-time = "2025-11-30T20:21:57.079Z" }, + { url = "https://files.pythonhosted.org/packages/42/bb/1463f0b1722b7f45431bdd468301991d1328b16cffe0b1c2918eba2c4eee/rpds_py-0.30.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:07ae8a593e1c3c6b82ca3292efbe73c30b61332fd612e05abee07c79359f292f", size = 402932, upload-time = "2025-11-30T20:21:58.47Z" }, + { url = "https://files.pythonhosted.org/packages/99/ee/2520700a5c1f2d76631f948b0736cdf9b0acb25abd0ca8e889b5c62ac2e3/rpds_py-0.30.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:12f90dd7557b6bd57f40abe7747e81e0c0b119bef015ea7726e69fe550e394a4", size = 525830, upload-time = "2025-11-30T20:21:59.699Z" }, + { url = "https://files.pythonhosted.org/packages/e0/ad/bd0331f740f5705cc555a5e17fdf334671262160270962e69a2bdef3bf76/rpds_py-0.30.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:99b47d6ad9a6da00bec6aabe5a6279ecd3c06a329d4aa4771034a21e335c3a97", size = 412033, upload-time = "2025-11-30T20:22:00.991Z" }, + { url = "https://files.pythonhosted.org/packages/f8/1e/372195d326549bb51f0ba0f2ecb9874579906b97e08880e7a65c3bef1a99/rpds_py-0.30.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33f559f3104504506a44bb666b93a33f5d33133765b0c216a5bf2f1e1503af89", size = 390828, upload-time = "2025-11-30T20:22:02.723Z" }, + { url = "https://files.pythonhosted.org/packages/ab/2b/d88bb33294e3e0c76bc8f351a3721212713629ffca1700fa94979cb3eae8/rpds_py-0.30.0-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:946fe926af6e44f3697abbc305ea168c2c31d3e3ef1058cf68f379bf0335a78d", size = 404683, upload-time = "2025-11-30T20:22:04.367Z" }, + { url = "https://files.pythonhosted.org/packages/50/32/c759a8d42bcb5289c1fac697cd92f6fe01a018dd937e62ae77e0e7f15702/rpds_py-0.30.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:495aeca4b93d465efde585977365187149e75383ad2684f81519f504f5c13038", size = 421583, upload-time = "2025-11-30T20:22:05.814Z" }, + { url = "https://files.pythonhosted.org/packages/2b/81/e729761dbd55ddf5d84ec4ff1f47857f4374b0f19bdabfcf929164da3e24/rpds_py-0.30.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d9a0ca5da0386dee0655b4ccdf46119df60e0f10da268d04fe7cc87886872ba7", size = 572496, upload-time = "2025-11-30T20:22:07.713Z" }, + { url = "https://files.pythonhosted.org/packages/14/f6/69066a924c3557c9c30baa6ec3a0aa07526305684c6f86c696b08860726c/rpds_py-0.30.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8d6d1cc13664ec13c1b84241204ff3b12f9bb82464b8ad6e7a5d3486975c2eed", size = 598669, upload-time = "2025-11-30T20:22:09.312Z" }, + { url = "https://files.pythonhosted.org/packages/5f/48/905896b1eb8a05630d20333d1d8ffd162394127b74ce0b0784ae04498d32/rpds_py-0.30.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3896fa1be39912cf0757753826bc8bdc8ca331a28a7c4ae46b7a21280b06bb85", size = 561011, upload-time = "2025-11-30T20:22:11.309Z" }, + { url = "https://files.pythonhosted.org/packages/22/16/cd3027c7e279d22e5eb431dd3c0fbc677bed58797fe7581e148f3f68818b/rpds_py-0.30.0-cp311-cp311-win32.whl", hash = "sha256:55f66022632205940f1827effeff17c4fa7ae1953d2b74a8581baaefb7d16f8c", size = 221406, upload-time = "2025-11-30T20:22:13.101Z" }, + { url = "https://files.pythonhosted.org/packages/fa/5b/e7b7aa136f28462b344e652ee010d4de26ee9fd16f1bfd5811f5153ccf89/rpds_py-0.30.0-cp311-cp311-win_amd64.whl", hash = "sha256:a51033ff701fca756439d641c0ad09a41d9242fa69121c7d8769604a0a629825", size = 236024, upload-time = "2025-11-30T20:22:14.853Z" }, + { url = "https://files.pythonhosted.org/packages/14/a6/364bba985e4c13658edb156640608f2c9e1d3ea3c81b27aa9d889fff0e31/rpds_py-0.30.0-cp311-cp311-win_arm64.whl", hash = "sha256:47b0ef6231c58f506ef0b74d44e330405caa8428e770fec25329ed2cb971a229", size = 229069, upload-time = "2025-11-30T20:22:16.577Z" }, + { url = "https://files.pythonhosted.org/packages/03/e7/98a2f4ac921d82f33e03f3835f5bf3a4a40aa1bfdc57975e74a97b2b4bdd/rpds_py-0.30.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a161f20d9a43006833cd7068375a94d035714d73a172b681d8881820600abfad", size = 375086, upload-time = "2025-11-30T20:22:17.93Z" }, + { url = "https://files.pythonhosted.org/packages/4d/a1/bca7fd3d452b272e13335db8d6b0b3ecde0f90ad6f16f3328c6fb150c889/rpds_py-0.30.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6abc8880d9d036ecaafe709079969f56e876fcf107f7a8e9920ba6d5a3878d05", size = 359053, upload-time = "2025-11-30T20:22:19.297Z" }, + { url = "https://files.pythonhosted.org/packages/65/1c/ae157e83a6357eceff62ba7e52113e3ec4834a84cfe07fa4b0757a7d105f/rpds_py-0.30.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca28829ae5f5d569bb62a79512c842a03a12576375d5ece7d2cadf8abe96ec28", size = 390763, upload-time = "2025-11-30T20:22:21.661Z" }, + { url = "https://files.pythonhosted.org/packages/d4/36/eb2eb8515e2ad24c0bd43c3ee9cd74c33f7ca6430755ccdb240fd3144c44/rpds_py-0.30.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a1010ed9524c73b94d15919ca4d41d8780980e1765babf85f9a2f90d247153dd", size = 408951, upload-time = "2025-11-30T20:22:23.408Z" }, + { url = "https://files.pythonhosted.org/packages/d6/65/ad8dc1784a331fabbd740ef6f71ce2198c7ed0890dab595adb9ea2d775a1/rpds_py-0.30.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f8d1736cfb49381ba528cd5baa46f82fdc65c06e843dab24dd70b63d09121b3f", size = 514622, upload-time = "2025-11-30T20:22:25.16Z" }, + { url = "https://files.pythonhosted.org/packages/63/8e/0cfa7ae158e15e143fe03993b5bcd743a59f541f5952e1546b1ac1b5fd45/rpds_py-0.30.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d948b135c4693daff7bc2dcfc4ec57237a29bd37e60c2fabf5aff2bbacf3e2f1", size = 414492, upload-time = "2025-11-30T20:22:26.505Z" }, + { url = "https://files.pythonhosted.org/packages/60/1b/6f8f29f3f995c7ffdde46a626ddccd7c63aefc0efae881dc13b6e5d5bb16/rpds_py-0.30.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47f236970bccb2233267d89173d3ad2703cd36a0e2a6e92d0560d333871a3d23", size = 394080, upload-time = "2025-11-30T20:22:27.934Z" }, + { url = "https://files.pythonhosted.org/packages/6d/d5/a266341051a7a3ca2f4b750a3aa4abc986378431fc2da508c5034d081b70/rpds_py-0.30.0-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:2e6ecb5a5bcacf59c3f912155044479af1d0b6681280048b338b28e364aca1f6", size = 408680, upload-time = "2025-11-30T20:22:29.341Z" }, + { url = "https://files.pythonhosted.org/packages/10/3b/71b725851df9ab7a7a4e33cf36d241933da66040d195a84781f49c50490c/rpds_py-0.30.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a8fa71a2e078c527c3e9dc9fc5a98c9db40bcc8a92b4e8858e36d329f8684b51", size = 423589, upload-time = "2025-11-30T20:22:31.469Z" }, + { url = "https://files.pythonhosted.org/packages/00/2b/e59e58c544dc9bd8bd8384ecdb8ea91f6727f0e37a7131baeff8d6f51661/rpds_py-0.30.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:73c67f2db7bc334e518d097c6d1e6fed021bbc9b7d678d6cc433478365d1d5f5", size = 573289, upload-time = "2025-11-30T20:22:32.997Z" }, + { url = "https://files.pythonhosted.org/packages/da/3e/a18e6f5b460893172a7d6a680e86d3b6bc87a54c1f0b03446a3c8c7b588f/rpds_py-0.30.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:5ba103fb455be00f3b1c2076c9d4264bfcb037c976167a6047ed82f23153f02e", size = 599737, upload-time = "2025-11-30T20:22:34.419Z" }, + { url = "https://files.pythonhosted.org/packages/5c/e2/714694e4b87b85a18e2c243614974413c60aa107fd815b8cbc42b873d1d7/rpds_py-0.30.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7cee9c752c0364588353e627da8a7e808a66873672bcb5f52890c33fd965b394", size = 563120, upload-time = "2025-11-30T20:22:35.903Z" }, + { url = "https://files.pythonhosted.org/packages/6f/ab/d5d5e3bcedb0a77f4f613706b750e50a5a3ba1c15ccd3665ecc636c968fd/rpds_py-0.30.0-cp312-cp312-win32.whl", hash = "sha256:1ab5b83dbcf55acc8b08fc62b796ef672c457b17dbd7820a11d6c52c06839bdf", size = 223782, upload-time = "2025-11-30T20:22:37.271Z" }, + { url = "https://files.pythonhosted.org/packages/39/3b/f786af9957306fdc38a74cef405b7b93180f481fb48453a114bb6465744a/rpds_py-0.30.0-cp312-cp312-win_amd64.whl", hash = "sha256:a090322ca841abd453d43456ac34db46e8b05fd9b3b4ac0c78bcde8b089f959b", size = 240463, upload-time = "2025-11-30T20:22:39.021Z" }, + { url = "https://files.pythonhosted.org/packages/f3/d2/b91dc748126c1559042cfe41990deb92c4ee3e2b415f6b5234969ffaf0cc/rpds_py-0.30.0-cp312-cp312-win_arm64.whl", hash = "sha256:669b1805bd639dd2989b281be2cfd951c6121b65e729d9b843e9639ef1fd555e", size = 230868, upload-time = "2025-11-30T20:22:40.493Z" }, + { url = "https://files.pythonhosted.org/packages/ed/dc/d61221eb88ff410de3c49143407f6f3147acf2538c86f2ab7ce65ae7d5f9/rpds_py-0.30.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:f83424d738204d9770830d35290ff3273fbb02b41f919870479fab14b9d303b2", size = 374887, upload-time = "2025-11-30T20:22:41.812Z" }, + { url = "https://files.pythonhosted.org/packages/fd/32/55fb50ae104061dbc564ef15cc43c013dc4a9f4527a1f4d99baddf56fe5f/rpds_py-0.30.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e7536cd91353c5273434b4e003cbda89034d67e7710eab8761fd918ec6c69cf8", size = 358904, upload-time = "2025-11-30T20:22:43.479Z" }, + { url = "https://files.pythonhosted.org/packages/58/70/faed8186300e3b9bdd138d0273109784eea2396c68458ed580f885dfe7ad/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2771c6c15973347f50fece41fc447c054b7ac2ae0502388ce3b6738cd366e3d4", size = 389945, upload-time = "2025-11-30T20:22:44.819Z" }, + { url = "https://files.pythonhosted.org/packages/bd/a8/073cac3ed2c6387df38f71296d002ab43496a96b92c823e76f46b8af0543/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0a59119fc6e3f460315fe9d08149f8102aa322299deaa5cab5b40092345c2136", size = 407783, upload-time = "2025-11-30T20:22:46.103Z" }, + { url = "https://files.pythonhosted.org/packages/77/57/5999eb8c58671f1c11eba084115e77a8899d6e694d2a18f69f0ba471ec8b/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:76fec018282b4ead0364022e3c54b60bf368b9d926877957a8624b58419169b7", size = 515021, upload-time = "2025-11-30T20:22:47.458Z" }, + { url = "https://files.pythonhosted.org/packages/e0/af/5ab4833eadc36c0a8ed2bc5c0de0493c04f6c06de223170bd0798ff98ced/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:692bef75a5525db97318e8cd061542b5a79812d711ea03dbc1f6f8dbb0c5f0d2", size = 414589, upload-time = "2025-11-30T20:22:48.872Z" }, + { url = "https://files.pythonhosted.org/packages/b7/de/f7192e12b21b9e9a68a6d0f249b4af3fdcdff8418be0767a627564afa1f1/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9027da1ce107104c50c81383cae773ef5c24d296dd11c99e2629dbd7967a20c6", size = 394025, upload-time = "2025-11-30T20:22:50.196Z" }, + { url = "https://files.pythonhosted.org/packages/91/c4/fc70cd0249496493500e7cc2de87504f5aa6509de1e88623431fec76d4b6/rpds_py-0.30.0-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:9cf69cdda1f5968a30a359aba2f7f9aa648a9ce4b580d6826437f2b291cfc86e", size = 408895, upload-time = "2025-11-30T20:22:51.87Z" }, + { url = "https://files.pythonhosted.org/packages/58/95/d9275b05ab96556fefff73a385813eb66032e4c99f411d0795372d9abcea/rpds_py-0.30.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a4796a717bf12b9da9d3ad002519a86063dcac8988b030e405704ef7d74d2d9d", size = 422799, upload-time = "2025-11-30T20:22:53.341Z" }, + { url = "https://files.pythonhosted.org/packages/06/c1/3088fc04b6624eb12a57eb814f0d4997a44b0d208d6cace713033ff1a6ba/rpds_py-0.30.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5d4c2aa7c50ad4728a094ebd5eb46c452e9cb7edbfdb18f9e1221f597a73e1e7", size = 572731, upload-time = "2025-11-30T20:22:54.778Z" }, + { url = "https://files.pythonhosted.org/packages/d8/42/c612a833183b39774e8ac8fecae81263a68b9583ee343db33ab571a7ce55/rpds_py-0.30.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ba81a9203d07805435eb06f536d95a266c21e5b2dfbf6517748ca40c98d19e31", size = 599027, upload-time = "2025-11-30T20:22:56.212Z" }, + { url = "https://files.pythonhosted.org/packages/5f/60/525a50f45b01d70005403ae0e25f43c0384369ad24ffe46e8d9068b50086/rpds_py-0.30.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:945dccface01af02675628334f7cf49c2af4c1c904748efc5cf7bbdf0b579f95", size = 563020, upload-time = "2025-11-30T20:22:58.2Z" }, + { url = "https://files.pythonhosted.org/packages/0b/5d/47c4655e9bcd5ca907148535c10e7d489044243cc9941c16ed7cd53be91d/rpds_py-0.30.0-cp313-cp313-win32.whl", hash = "sha256:b40fb160a2db369a194cb27943582b38f79fc4887291417685f3ad693c5a1d5d", size = 223139, upload-time = "2025-11-30T20:23:00.209Z" }, + { url = "https://files.pythonhosted.org/packages/f2/e1/485132437d20aa4d3e1d8b3fb5a5e65aa8139f1e097080c2a8443201742c/rpds_py-0.30.0-cp313-cp313-win_amd64.whl", hash = "sha256:806f36b1b605e2d6a72716f321f20036b9489d29c51c91f4dd29a3e3afb73b15", size = 240224, upload-time = "2025-11-30T20:23:02.008Z" }, + { url = "https://files.pythonhosted.org/packages/24/95/ffd128ed1146a153d928617b0ef673960130be0009c77d8fbf0abe306713/rpds_py-0.30.0-cp313-cp313-win_arm64.whl", hash = "sha256:d96c2086587c7c30d44f31f42eae4eac89b60dabbac18c7669be3700f13c3ce1", size = 230645, upload-time = "2025-11-30T20:23:03.43Z" }, + { url = "https://files.pythonhosted.org/packages/ff/1b/b10de890a0def2a319a2626334a7f0ae388215eb60914dbac8a3bae54435/rpds_py-0.30.0-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:eb0b93f2e5c2189ee831ee43f156ed34e2a89a78a66b98cadad955972548be5a", size = 364443, upload-time = "2025-11-30T20:23:04.878Z" }, + { url = "https://files.pythonhosted.org/packages/0d/bf/27e39f5971dc4f305a4fb9c672ca06f290f7c4e261c568f3dea16a410d47/rpds_py-0.30.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:922e10f31f303c7c920da8981051ff6d8c1a56207dbdf330d9047f6d30b70e5e", size = 353375, upload-time = "2025-11-30T20:23:06.342Z" }, + { url = "https://files.pythonhosted.org/packages/40/58/442ada3bba6e8e6615fc00483135c14a7538d2ffac30e2d933ccf6852232/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cdc62c8286ba9bf7f47befdcea13ea0e26bf294bda99758fd90535cbaf408000", size = 383850, upload-time = "2025-11-30T20:23:07.825Z" }, + { url = "https://files.pythonhosted.org/packages/14/14/f59b0127409a33c6ef6f5c1ebd5ad8e32d7861c9c7adfa9a624fc3889f6c/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:47f9a91efc418b54fb8190a6b4aa7813a23fb79c51f4bb84e418f5476c38b8db", size = 392812, upload-time = "2025-11-30T20:23:09.228Z" }, + { url = "https://files.pythonhosted.org/packages/b3/66/e0be3e162ac299b3a22527e8913767d869e6cc75c46bd844aa43fb81ab62/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1f3587eb9b17f3789ad50824084fa6f81921bbf9a795826570bda82cb3ed91f2", size = 517841, upload-time = "2025-11-30T20:23:11.186Z" }, + { url = "https://files.pythonhosted.org/packages/3d/55/fa3b9cf31d0c963ecf1ba777f7cf4b2a2c976795ac430d24a1f43d25a6ba/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:39c02563fc592411c2c61d26b6c5fe1e51eaa44a75aa2c8735ca88b0d9599daa", size = 408149, upload-time = "2025-11-30T20:23:12.864Z" }, + { url = "https://files.pythonhosted.org/packages/60/ca/780cf3b1a32b18c0f05c441958d3758f02544f1d613abf9488cd78876378/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:51a1234d8febafdfd33a42d97da7a43f5dcb120c1060e352a3fbc0c6d36e2083", size = 383843, upload-time = "2025-11-30T20:23:14.638Z" }, + { url = "https://files.pythonhosted.org/packages/82/86/d5f2e04f2aa6247c613da0c1dd87fcd08fa17107e858193566048a1e2f0a/rpds_py-0.30.0-cp313-cp313t-manylinux_2_31_riscv64.whl", hash = "sha256:eb2c4071ab598733724c08221091e8d80e89064cd472819285a9ab0f24bcedb9", size = 396507, upload-time = "2025-11-30T20:23:16.105Z" }, + { url = "https://files.pythonhosted.org/packages/4b/9a/453255d2f769fe44e07ea9785c8347edaf867f7026872e76c1ad9f7bed92/rpds_py-0.30.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6bdfdb946967d816e6adf9a3d8201bfad269c67efe6cefd7093ef959683c8de0", size = 414949, upload-time = "2025-11-30T20:23:17.539Z" }, + { url = "https://files.pythonhosted.org/packages/a3/31/622a86cdc0c45d6df0e9ccb6becdba5074735e7033c20e401a6d9d0e2ca0/rpds_py-0.30.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:c77afbd5f5250bf27bf516c7c4a016813eb2d3e116139aed0096940c5982da94", size = 565790, upload-time = "2025-11-30T20:23:19.029Z" }, + { url = "https://files.pythonhosted.org/packages/1c/5d/15bbf0fb4a3f58a3b1c67855ec1efcc4ceaef4e86644665fff03e1b66d8d/rpds_py-0.30.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:61046904275472a76c8c90c9ccee9013d70a6d0f73eecefd38c1ae7c39045a08", size = 590217, upload-time = "2025-11-30T20:23:20.885Z" }, + { url = "https://files.pythonhosted.org/packages/6d/61/21b8c41f68e60c8cc3b2e25644f0e3681926020f11d06ab0b78e3c6bbff1/rpds_py-0.30.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4c5f36a861bc4b7da6516dbdf302c55313afa09b81931e8280361a4f6c9a2d27", size = 555806, upload-time = "2025-11-30T20:23:22.488Z" }, + { url = "https://files.pythonhosted.org/packages/f9/39/7e067bb06c31de48de3eb200f9fc7c58982a4d3db44b07e73963e10d3be9/rpds_py-0.30.0-cp313-cp313t-win32.whl", hash = "sha256:3d4a69de7a3e50ffc214ae16d79d8fbb0922972da0356dcf4d0fdca2878559c6", size = 211341, upload-time = "2025-11-30T20:23:24.449Z" }, + { url = "https://files.pythonhosted.org/packages/0a/4d/222ef0b46443cf4cf46764d9c630f3fe4abaa7245be9417e56e9f52b8f65/rpds_py-0.30.0-cp313-cp313t-win_amd64.whl", hash = "sha256:f14fc5df50a716f7ece6a80b6c78bb35ea2ca47c499e422aa4463455dd96d56d", size = 225768, upload-time = "2025-11-30T20:23:25.908Z" }, + { url = "https://files.pythonhosted.org/packages/86/81/dad16382ebbd3d0e0328776d8fd7ca94220e4fa0798d1dc5e7da48cb3201/rpds_py-0.30.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:68f19c879420aa08f61203801423f6cd5ac5f0ac4ac82a2368a9fcd6a9a075e0", size = 362099, upload-time = "2025-11-30T20:23:27.316Z" }, + { url = "https://files.pythonhosted.org/packages/2b/60/19f7884db5d5603edf3c6bce35408f45ad3e97e10007df0e17dd57af18f8/rpds_py-0.30.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:ec7c4490c672c1a0389d319b3a9cfcd098dcdc4783991553c332a15acf7249be", size = 353192, upload-time = "2025-11-30T20:23:29.151Z" }, + { url = "https://files.pythonhosted.org/packages/bf/c4/76eb0e1e72d1a9c4703c69607cec123c29028bff28ce41588792417098ac/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f251c812357a3fed308d684a5079ddfb9d933860fc6de89f2b7ab00da481e65f", size = 384080, upload-time = "2025-11-30T20:23:30.785Z" }, + { url = "https://files.pythonhosted.org/packages/72/87/87ea665e92f3298d1b26d78814721dc39ed8d2c74b86e83348d6b48a6f31/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ac98b175585ecf4c0348fd7b29c3864bda53b805c773cbf7bfdaffc8070c976f", size = 394841, upload-time = "2025-11-30T20:23:32.209Z" }, + { url = "https://files.pythonhosted.org/packages/77/ad/7783a89ca0587c15dcbf139b4a8364a872a25f861bdb88ed99f9b0dec985/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3e62880792319dbeb7eb866547f2e35973289e7d5696c6e295476448f5b63c87", size = 516670, upload-time = "2025-11-30T20:23:33.742Z" }, + { url = "https://files.pythonhosted.org/packages/5b/3c/2882bdac942bd2172f3da574eab16f309ae10a3925644e969536553cb4ee/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4e7fc54e0900ab35d041b0601431b0a0eb495f0851a0639b6ef90f7741b39a18", size = 408005, upload-time = "2025-11-30T20:23:35.253Z" }, + { url = "https://files.pythonhosted.org/packages/ce/81/9a91c0111ce1758c92516a3e44776920b579d9a7c09b2b06b642d4de3f0f/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47e77dc9822d3ad616c3d5759ea5631a75e5809d5a28707744ef79d7a1bcfcad", size = 382112, upload-time = "2025-11-30T20:23:36.842Z" }, + { url = "https://files.pythonhosted.org/packages/cf/8e/1da49d4a107027e5fbc64daeab96a0706361a2918da10cb41769244b805d/rpds_py-0.30.0-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:b4dc1a6ff022ff85ecafef7979a2c6eb423430e05f1165d6688234e62ba99a07", size = 399049, upload-time = "2025-11-30T20:23:38.343Z" }, + { url = "https://files.pythonhosted.org/packages/df/5a/7ee239b1aa48a127570ec03becbb29c9d5a9eb092febbd1699d567cae859/rpds_py-0.30.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4559c972db3a360808309e06a74628b95eaccbf961c335c8fe0d590cf587456f", size = 415661, upload-time = "2025-11-30T20:23:40.263Z" }, + { url = "https://files.pythonhosted.org/packages/70/ea/caa143cf6b772f823bc7929a45da1fa83569ee49b11d18d0ada7f5ee6fd6/rpds_py-0.30.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:0ed177ed9bded28f8deb6ab40c183cd1192aa0de40c12f38be4d59cd33cb5c65", size = 565606, upload-time = "2025-11-30T20:23:42.186Z" }, + { url = "https://files.pythonhosted.org/packages/64/91/ac20ba2d69303f961ad8cf55bf7dbdb4763f627291ba3d0d7d67333cced9/rpds_py-0.30.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:ad1fa8db769b76ea911cb4e10f049d80bf518c104f15b3edb2371cc65375c46f", size = 591126, upload-time = "2025-11-30T20:23:44.086Z" }, + { url = "https://files.pythonhosted.org/packages/21/20/7ff5f3c8b00c8a95f75985128c26ba44503fb35b8e0259d812766ea966c7/rpds_py-0.30.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:46e83c697b1f1c72b50e5ee5adb4353eef7406fb3f2043d64c33f20ad1c2fc53", size = 553371, upload-time = "2025-11-30T20:23:46.004Z" }, + { url = "https://files.pythonhosted.org/packages/72/c7/81dadd7b27c8ee391c132a6b192111ca58d866577ce2d9b0ca157552cce0/rpds_py-0.30.0-cp314-cp314-win32.whl", hash = "sha256:ee454b2a007d57363c2dfd5b6ca4a5d7e2c518938f8ed3b706e37e5d470801ed", size = 215298, upload-time = "2025-11-30T20:23:47.696Z" }, + { url = "https://files.pythonhosted.org/packages/3e/d2/1aaac33287e8cfb07aab2e6b8ac1deca62f6f65411344f1433c55e6f3eb8/rpds_py-0.30.0-cp314-cp314-win_amd64.whl", hash = "sha256:95f0802447ac2d10bcc69f6dc28fe95fdf17940367b21d34e34c737870758950", size = 228604, upload-time = "2025-11-30T20:23:49.501Z" }, + { url = "https://files.pythonhosted.org/packages/e8/95/ab005315818cc519ad074cb7784dae60d939163108bd2b394e60dc7b5461/rpds_py-0.30.0-cp314-cp314-win_arm64.whl", hash = "sha256:613aa4771c99f03346e54c3f038e4cc574ac09a3ddfb0e8878487335e96dead6", size = 222391, upload-time = "2025-11-30T20:23:50.96Z" }, + { url = "https://files.pythonhosted.org/packages/9e/68/154fe0194d83b973cdedcdcc88947a2752411165930182ae41d983dcefa6/rpds_py-0.30.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:7e6ecfcb62edfd632e56983964e6884851786443739dbfe3582947e87274f7cb", size = 364868, upload-time = "2025-11-30T20:23:52.494Z" }, + { url = "https://files.pythonhosted.org/packages/83/69/8bbc8b07ec854d92a8b75668c24d2abcb1719ebf890f5604c61c9369a16f/rpds_py-0.30.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:a1d0bc22a7cdc173fedebb73ef81e07faef93692b8c1ad3733b67e31e1b6e1b8", size = 353747, upload-time = "2025-11-30T20:23:54.036Z" }, + { url = "https://files.pythonhosted.org/packages/ab/00/ba2e50183dbd9abcce9497fa5149c62b4ff3e22d338a30d690f9af970561/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d08f00679177226c4cb8c5265012eea897c8ca3b93f429e546600c971bcbae7", size = 383795, upload-time = "2025-11-30T20:23:55.556Z" }, + { url = "https://files.pythonhosted.org/packages/05/6f/86f0272b84926bcb0e4c972262f54223e8ecc556b3224d281e6598fc9268/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5965af57d5848192c13534f90f9dd16464f3c37aaf166cc1da1cae1fd5a34898", size = 393330, upload-time = "2025-11-30T20:23:57.033Z" }, + { url = "https://files.pythonhosted.org/packages/cb/e9/0e02bb2e6dc63d212641da45df2b0bf29699d01715913e0d0f017ee29438/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9a4e86e34e9ab6b667c27f3211ca48f73dba7cd3d90f8d5b11be56e5dbc3fb4e", size = 518194, upload-time = "2025-11-30T20:23:58.637Z" }, + { url = "https://files.pythonhosted.org/packages/ee/ca/be7bca14cf21513bdf9c0606aba17d1f389ea2b6987035eb4f62bd923f25/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e5d3e6b26f2c785d65cc25ef1e5267ccbe1b069c5c21b8cc724efee290554419", size = 408340, upload-time = "2025-11-30T20:24:00.2Z" }, + { url = "https://files.pythonhosted.org/packages/c2/c7/736e00ebf39ed81d75544c0da6ef7b0998f8201b369acf842f9a90dc8fce/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:626a7433c34566535b6e56a1b39a7b17ba961e97ce3b80ec62e6f1312c025551", size = 383765, upload-time = "2025-11-30T20:24:01.759Z" }, + { url = "https://files.pythonhosted.org/packages/4a/3f/da50dfde9956aaf365c4adc9533b100008ed31aea635f2b8d7b627e25b49/rpds_py-0.30.0-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:acd7eb3f4471577b9b5a41baf02a978e8bdeb08b4b355273994f8b87032000a8", size = 396834, upload-time = "2025-11-30T20:24:03.687Z" }, + { url = "https://files.pythonhosted.org/packages/4e/00/34bcc2565b6020eab2623349efbdec810676ad571995911f1abdae62a3a0/rpds_py-0.30.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fe5fa731a1fa8a0a56b0977413f8cacac1768dad38d16b3a296712709476fbd5", size = 415470, upload-time = "2025-11-30T20:24:05.232Z" }, + { url = "https://files.pythonhosted.org/packages/8c/28/882e72b5b3e6f718d5453bd4d0d9cf8df36fddeb4ddbbab17869d5868616/rpds_py-0.30.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:74a3243a411126362712ee1524dfc90c650a503502f135d54d1b352bd01f2404", size = 565630, upload-time = "2025-11-30T20:24:06.878Z" }, + { url = "https://files.pythonhosted.org/packages/3b/97/04a65539c17692de5b85c6e293520fd01317fd878ea1995f0367d4532fb1/rpds_py-0.30.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:3e8eeb0544f2eb0d2581774be4c3410356eba189529a6b3e36bbbf9696175856", size = 591148, upload-time = "2025-11-30T20:24:08.445Z" }, + { url = "https://files.pythonhosted.org/packages/85/70/92482ccffb96f5441aab93e26c4d66489eb599efdcf96fad90c14bbfb976/rpds_py-0.30.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:dbd936cde57abfee19ab3213cf9c26be06d60750e60a8e4dd85d1ab12c8b1f40", size = 556030, upload-time = "2025-11-30T20:24:10.956Z" }, + { url = "https://files.pythonhosted.org/packages/20/53/7c7e784abfa500a2b6b583b147ee4bb5a2b3747a9166bab52fec4b5b5e7d/rpds_py-0.30.0-cp314-cp314t-win32.whl", hash = "sha256:dc824125c72246d924f7f796b4f63c1e9dc810c7d9e2355864b3c3a73d59ade0", size = 211570, upload-time = "2025-11-30T20:24:12.735Z" }, + { url = "https://files.pythonhosted.org/packages/d0/02/fa464cdfbe6b26e0600b62c528b72d8608f5cc49f96b8d6e38c95d60c676/rpds_py-0.30.0-cp314-cp314t-win_amd64.whl", hash = "sha256:27f4b0e92de5bfbc6f86e43959e6edd1425c33b5e69aab0984a72047f2bcf1e3", size = 226532, upload-time = "2025-11-30T20:24:14.634Z" }, + { url = "https://files.pythonhosted.org/packages/69/71/3f34339ee70521864411f8b6992e7ab13ac30d8e4e3309e07c7361767d91/rpds_py-0.30.0-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:c2262bdba0ad4fc6fb5545660673925c2d2a5d9e2e0fb603aad545427be0fc58", size = 372292, upload-time = "2025-11-30T20:24:16.537Z" }, + { url = "https://files.pythonhosted.org/packages/57/09/f183df9b8f2d66720d2ef71075c59f7e1b336bec7ee4c48f0a2b06857653/rpds_py-0.30.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:ee6af14263f25eedc3bb918a3c04245106a42dfd4f5c2285ea6f997b1fc3f89a", size = 362128, upload-time = "2025-11-30T20:24:18.086Z" }, + { url = "https://files.pythonhosted.org/packages/7a/68/5c2594e937253457342e078f0cc1ded3dd7b2ad59afdbf2d354869110a02/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3adbb8179ce342d235c31ab8ec511e66c73faa27a47e076ccc92421add53e2bb", size = 391542, upload-time = "2025-11-30T20:24:20.092Z" }, + { url = "https://files.pythonhosted.org/packages/49/5c/31ef1afd70b4b4fbdb2800249f34c57c64beb687495b10aec0365f53dfc4/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:250fa00e9543ac9b97ac258bd37367ff5256666122c2d0f2bc97577c60a1818c", size = 404004, upload-time = "2025-11-30T20:24:22.231Z" }, + { url = "https://files.pythonhosted.org/packages/e3/63/0cfbea38d05756f3440ce6534d51a491d26176ac045e2707adc99bb6e60a/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9854cf4f488b3d57b9aaeb105f06d78e5529d3145b1e4a41750167e8c213c6d3", size = 527063, upload-time = "2025-11-30T20:24:24.302Z" }, + { url = "https://files.pythonhosted.org/packages/42/e6/01e1f72a2456678b0f618fc9a1a13f882061690893c192fcad9f2926553a/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:993914b8e560023bc0a8bf742c5f303551992dcb85e247b1e5c7f4a7d145bda5", size = 413099, upload-time = "2025-11-30T20:24:25.916Z" }, + { url = "https://files.pythonhosted.org/packages/b8/25/8df56677f209003dcbb180765520c544525e3ef21ea72279c98b9aa7c7fb/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58edca431fb9b29950807e301826586e5bbf24163677732429770a697ffe6738", size = 392177, upload-time = "2025-11-30T20:24:27.834Z" }, + { url = "https://files.pythonhosted.org/packages/4a/b4/0a771378c5f16f8115f796d1f437950158679bcd2a7c68cf251cfb00ed5b/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_31_riscv64.whl", hash = "sha256:dea5b552272a944763b34394d04577cf0f9bd013207bc32323b5a89a53cf9c2f", size = 406015, upload-time = "2025-11-30T20:24:29.457Z" }, + { url = "https://files.pythonhosted.org/packages/36/d8/456dbba0af75049dc6f63ff295a2f92766b9d521fa00de67a2bd6427d57a/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ba3af48635eb83d03f6c9735dfb21785303e73d22ad03d489e88adae6eab8877", size = 423736, upload-time = "2025-11-30T20:24:31.22Z" }, + { url = "https://files.pythonhosted.org/packages/13/64/b4d76f227d5c45a7e0b796c674fd81b0a6c4fbd48dc29271857d8219571c/rpds_py-0.30.0-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:dff13836529b921e22f15cb099751209a60009731a68519630a24d61f0b1b30a", size = 573981, upload-time = "2025-11-30T20:24:32.934Z" }, + { url = "https://files.pythonhosted.org/packages/20/91/092bacadeda3edf92bf743cc96a7be133e13a39cdbfd7b5082e7ab638406/rpds_py-0.30.0-pp311-pypy311_pp73-musllinux_1_2_i686.whl", hash = "sha256:1b151685b23929ab7beec71080a8889d4d6d9fa9a983d213f07121205d48e2c4", size = 599782, upload-time = "2025-11-30T20:24:35.169Z" }, + { url = "https://files.pythonhosted.org/packages/d1/b7/b95708304cd49b7b6f82fdd039f1748b66ec2b21d6a45180910802f1abf1/rpds_py-0.30.0-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:ac37f9f516c51e5753f27dfdef11a88330f04de2d564be3991384b2f3535d02e", size = 562191, upload-time = "2025-11-30T20:24:36.853Z" }, +] + +[[package]] +name = "rpds-py" +version = "2026.6.3" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.12'", + "python_full_version == '3.11.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/aa/2a/9618a122aeb2a169a28b03889a2995fe297588964333d4a7d67bdf46e147/rpds_py-2026.6.3.tar.gz", hash = "sha256:1cebd1337c242e4ec2293e541f712b2da849b29f48f0c293684b71c0632625d4", size = 64051, upload-time = "2026-06-30T07:17:53.009Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/94/1f/a2dca5ffdbf1d475ffc4e80e4d5d720ff3a00f691795910116960ee12511/rpds_py-2026.6.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:7b689145a1485c335569bd056464f3243a29af7ed3871c7be31ad624ba239bc7", size = 342174, upload-time = "2026-06-30T07:14:54.821Z" }, + { url = "https://files.pythonhosted.org/packages/4d/dc/323d08583c0832911768663d1944f0107fcd4088704858d84b5e06d105a0/rpds_py-2026.6.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:db08f45aecde626498fb3df07bcf6d2ec040af42e859a4f5040d79c200342911", size = 345513, upload-time = "2026-06-30T07:14:56.515Z" }, + { url = "https://files.pythonhosted.org/packages/0b/2a/e31989834d18d2f26ec1d2774c5b1eb3331df4ea8ada525175294c94b48a/rpds_py-2026.6.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:acc992ab27b15f852c76755eb2ab7dce86585ddadba6fa5946e58556088845b4", size = 373783, upload-time = "2026-06-30T07:14:57.736Z" }, + { url = "https://files.pythonhosted.org/packages/87/fe/e80107ee3639585c9941c17d6a42cd65325022f656c023191fce78c324c8/rpds_py-2026.6.3-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7f88d653e7b3b779d71ae7454e20dcc9b6bae903f33c269db9f2be41bda3f261", size = 378316, upload-time = "2026-06-30T07:14:59.077Z" }, + { url = "https://files.pythonhosted.org/packages/22/6f/81e3adf81acfb6fa694de2a6e4e7d8863121e3e0799e0a7725e6cf5679c4/rpds_py-2026.6.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e52655eaf81e32593abedaa4bfe33170c8cfedf3365ed9be6e11e07f148f0278", size = 499423, upload-time = "2026-06-30T07:15:00.488Z" }, + { url = "https://files.pythonhosted.org/packages/2d/9a/41263969df0ce3d9af2a96d5005a288200af1989aed3354bfceb5fc0b21f/rpds_py-2026.6.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dfcc8b909769d19db55c7cc9541eb64b9b774b1057ffffb4f1048070475bb9f9", size = 386077, upload-time = "2026-06-30T07:15:01.911Z" }, + { url = "https://files.pythonhosted.org/packages/5e/19/7e98f468bd50346faff5b10e5297374b443bfdddacc8e9fbc65984539597/rpds_py-2026.6.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c1255b302953c86a486b81d330d5ee1d5bd937691ce271b6be0ef0e299eaab7", size = 371315, upload-time = "2026-06-30T07:15:03.317Z" }, + { url = "https://files.pythonhosted.org/packages/99/3c/2b973b4d371906a134b03decfea7f5d9835a2c6d263454392e15b64b5b18/rpds_py-2026.6.3-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:8d2294a31386bfa251d8c8a39472beee17db67d4f1a6eabea665d35c9a4461c3", size = 383502, upload-time = "2026-06-30T07:15:04.627Z" }, + { url = "https://files.pythonhosted.org/packages/98/2a/12e2799500af0a307bca76b63361c51f9fe479223561489c29eea1f2ee41/rpds_py-2026.6.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f8f23ead891a3b762f35ab3b04623da7056545b48aa60d59957e6789914545da", size = 402673, upload-time = "2026-06-30T07:15:05.856Z" }, + { url = "https://files.pythonhosted.org/packages/2d/e3/21e5872d165fe08be4f229e3d5ee9d90019c0bf0e5538de60dbd54009450/rpds_py-2026.6.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:421aba32367055614287a4292b6a17f1939c9452299f7a0209c117e990b646d4", size = 549964, upload-time = "2026-06-30T07:15:07.159Z" }, + { url = "https://files.pythonhosted.org/packages/1a/d0/5ee0fe36844297de8123bee27bc12078c1a7416ad9f1b8a8ca18d6b0c0ac/rpds_py-2026.6.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:1e5822dfc2f0d4ab7e745eaa6d85945069329beeccef965af3f3bb26058fcab6", size = 615446, upload-time = "2026-06-30T07:15:08.531Z" }, + { url = "https://files.pythonhosted.org/packages/b1/80/1ea5873cb683f2fbe5f21b23ea1f6d179ead19f3c5b249b7eb5dca568ef2/rpds_py-2026.6.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:83e35b57523816c8613fd0776b40cd8bb9f596b37ddd2692eb4a6bb5ab2f8c93", size = 576975, upload-time = "2026-06-30T07:15:09.97Z" }, + { url = "https://files.pythonhosted.org/packages/c9/e1/90ef639217a5ddb15b7f4f61b1c33911fd044ad03c311bafdd2bcab85582/rpds_py-2026.6.3-cp311-cp311-win32.whl", hash = "sha256:de3eceba0b683bcbb1ab93da016d0270df1f9ae7be716b40214c5dafac6ea45a", size = 204453, upload-time = "2026-06-30T07:15:11.324Z" }, + { url = "https://files.pythonhosted.org/packages/f2/b7/b7a1695d7af36f521fb11e80d6d3adbd744f73b921859bd3c2a2c0dc706f/rpds_py-2026.6.3-cp311-cp311-win_amd64.whl", hash = "sha256:2c54a076ca4d370980ab57bc0e31df57bbe8d41340436a90ef8b1219a3cbb127", size = 223219, upload-time = "2026-06-30T07:15:12.476Z" }, + { url = "https://files.pythonhosted.org/packages/d7/a2/145afacf796e4506062825941176ad9445c2dcf2b3b6a1f13d3030a15e19/rpds_py-2026.6.3-cp311-cp311-win_arm64.whl", hash = "sha256:168c733a7112e071bb7a66460e667edfcff06c017a3c523f7a8a8e08d0140804", size = 219137, upload-time = "2026-06-30T07:15:13.631Z" }, + { url = "https://files.pythonhosted.org/packages/5c/be/2e8974163072e7bab7df1a5acd54c4498e75e35d6d18b864d3a9d5dadc92/rpds_py-2026.6.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a0811d33247c3d6128a3001d763f2aa056bb3425204335400ac54f89eec3a0d0", size = 343691, upload-time = "2026-06-30T07:15:14.96Z" }, + { url = "https://files.pythonhosted.org/packages/a4/73/319dfa745dd668efe89309141ded489126461fcecd2b8f3a3cda185129b6/rpds_py-2026.6.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:538949e262e46caa31ac01bdb3c1e8f642622922cacbabbae6a8445d9dc33eaf", size = 338542, upload-time = "2026-06-30T07:15:16.267Z" }, + { url = "https://files.pythonhosted.org/packages/21/63/4239893be1c4d09b709b1a8f6be4188f0870084ff547f46606b8a75f1b03/rpds_py-2026.6.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55927d532399c2c646100ff7feb48eaa940ad70f42cd68e1328f3ded9f81ca24", size = 368180, upload-time = "2026-06-30T07:15:17.62Z" }, + { url = "https://files.pythonhosted.org/packages/1c/ca/9c5de382225234ceb37b1844ebdb140db12b2a278bb9efe2fcd19f6c82ce/rpds_py-2026.6.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f56f1695bc5c0871cbc33dc0130fcf503aab0c57dcc5a6700a4f49eba4f2652e", size = 375067, upload-time = "2026-06-30T07:15:18.952Z" }, + { url = "https://files.pythonhosted.org/packages/87/dc/863f69d1bf04ade34b7fe0d59b9fdf6f0135fe2d7cbca74f1d665589559d/rpds_py-2026.6.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:270b293dae9058fc9fcedab50f13cebf46fb8ed1d1d54e0521a9da5d6b211975", size = 490509, upload-time = "2026-06-30T07:15:20.434Z" }, + { url = "https://files.pythonhosted.org/packages/ce/ef/eac16a12048b45ec7c7fa94f2be3438a5f26bf9cc8580b18a1cfd609b7f6/rpds_py-2026.6.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:127565fead0a10943b282957bd5447804ff3160ad79f2ad2635e6d249e380680", size = 382754, upload-time = "2026-06-30T07:15:21.831Z" }, + { url = "https://files.pythonhosted.org/packages/04/8f/d2f3f532616be4d06c316ef119683e832bd3d41e112bf3a88f4151c95b17/rpds_py-2026.6.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ecabd69db66de867690f9797f2f8fa27ba501bbc24540cbdbdc649cd15888ba6", size = 366189, upload-time = "2026-06-30T07:15:23.371Z" }, + { url = "https://files.pythonhosted.org/packages/e3/29/41a7b0e98a4b44cd676ab7598419623373eb43b20be68c084935c1a8cf88/rpds_py-2026.6.3-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:58eadac9cd119677b60e1cf8ac4052f35949d71b8a9e5556efccbe82533cf22a", size = 377750, upload-time = "2026-06-30T07:15:24.659Z" }, + { url = "https://files.pythonhosted.org/packages/2e/05/ecda0bec46f9a1565090bcdc941d023f6a25aff85fda28f89f8d19878152/rpds_py-2026.6.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7491ee23305ac3eb59e492b6945881f5cd77a6f731061a3f25b77fd40f9e99a4", size = 395576, upload-time = "2026-06-30T07:15:25.987Z" }, + { url = "https://files.pythonhosted.org/packages/68/a8/6ed52f03ee6cb854ce78785cc9a9a672eb880e83fd7224d471f667d151f1/rpds_py-2026.6.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2c99f7e8ccb3dd6e3e4bfeac657a7b208c9bac8075f4b078c02d7404c34107fa", size = 543807, upload-time = "2026-06-30T07:15:27.356Z" }, + { url = "https://files.pythonhosted.org/packages/8f/d6/156c0d3eea27ba09b92562ba2364ba124c0a061b199e17eac637cd25a5e2/rpds_py-2026.6.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:62698275682bf121181861295c9181e789030a2d516071f5b8f3c23c170cd0fc", size = 611187, upload-time = "2026-06-30T07:15:28.931Z" }, + { url = "https://files.pythonhosted.org/packages/f1/31/774212ed989c62f7f310220089f9b0a3fb8f40f5443d1727abd5d9f52bc9/rpds_py-2026.6.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a214c993455f99a89aaeadc9b21241900037adc9d97203e374d75513c5911822", size = 573030, upload-time = "2026-06-30T07:15:30.553Z" }, + { url = "https://files.pythonhosted.org/packages/c9/50/22f73127a41f1ce4f87fe39aadfb9a126345801c274aa93ae88456249327/rpds_py-2026.6.3-cp312-cp312-win32.whl", hash = "sha256:501f9f04a588d6a09179368c57071301445191767c64e4b52a6aa9871f1ef5ed", size = 202185, upload-time = "2026-06-30T07:15:32.027Z" }, + { url = "https://files.pythonhosted.org/packages/04/3a/f0ee4d4dde9d3b69dedf1b5f74e7a40017046d55052d173e418c6a94f960/rpds_py-2026.6.3-cp312-cp312-win_amd64.whl", hash = "sha256:2c958bf94822e9290a40aaf2a822d4bc5c88099093e3948ad6c571eca9272e5f", size = 220394, upload-time = "2026-06-30T07:15:33.359Z" }, + { url = "https://files.pythonhosted.org/packages/f3/83/3382fe37f809b59f02aac04dbc4e765b480b46ee0227ed516e3bdc4d3dfc/rpds_py-2026.6.3-cp312-cp312-win_arm64.whl", hash = "sha256:22bffe6042b9bcb0822bcd1955ec00e245daf17b4344e4ed8e9551b976b63e96", size = 215753, upload-time = "2026-06-30T07:15:34.778Z" }, + { url = "https://files.pythonhosted.org/packages/a4/9e/b818ee580026ec578138e961027a68820c40afeb1ec8f6819b54fb99e196/rpds_py-2026.6.3-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:3cfe765c1da0072636ca06628261e0ea05688e160d5c8a03e0217c3854037223", size = 343012, upload-time = "2026-06-30T07:15:36.005Z" }, + { url = "https://files.pythonhosted.org/packages/f3/6b/686d9dc4359a8f163cfbbf89ee0b4e586431de22fe8248edb63a8cf50d49/rpds_py-2026.6.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f4d78253f6996be4901669ad25319f842f740eccf4d58e3c7f3dd39e6dde1d8f", size = 338203, upload-time = "2026-06-30T07:15:37.462Z" }, + { url = "https://files.pythonhosted.org/packages/9e/9b/069aa329940f8207615e091f5eedbbd40e1e15eac68a0790fd05ccdf796c/rpds_py-2026.6.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54f45a148e28767bf343d33a684693c70e451c6f4c0e9904709a723fafbdfc1f", size = 367984, upload-time = "2026-06-30T07:15:39.008Z" }, + { url = "https://files.pythonhosted.org/packages/14/db/34c203e4becff3703e4d3bc121842c00b8689197f398161203a880052f4e/rpds_py-2026.6.3-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:842e7b070435622248c7a2c44ae53fa1440e073cc3023bc919fed570884097a7", size = 374815, upload-time = "2026-06-30T07:15:40.253Z" }, + { url = "https://files.pythonhosted.org/packages/ee/7d/8071067d2cc453d916ad836e828c943f575e8a44612537759002a1e07381/rpds_py-2026.6.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8020133a74bd81b4572dd8e4be028a6b1ebcd70e6726edc3918008c08bee6ee6", size = 490545, upload-time = "2026-06-30T07:15:41.729Z" }, + { url = "https://files.pythonhosted.org/packages/a3/42/da06c5aa8f0484ff07f270787434204d9f4535e2f8c3b51ed402267e63c3/rpds_py-2026.6.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cdc7e35386f3847df728fbcb5e887e2d79c19e2fa1eba9e51b6621d23e3243af", size = 382828, upload-time = "2026-06-30T07:15:43.327Z" }, + { url = "https://files.pythonhosted.org/packages/57/d7/fe978efc2ae50abe48eb7464668ea99f53c010c60aeebb7b35ad27f23661/rpds_py-2026.6.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:acac386b453c2516111b50985d60ce46e7fadb5ea71ae7b25f4c946935bf27cf", size = 365678, upload-time = "2026-06-30T07:15:44.992Z" }, + { url = "https://files.pythonhosted.org/packages/69/9d/1d8922e1990b2a6eb532b6ff53d3e73d2b3bbffc84116c75826bee73dfc6/rpds_py-2026.6.3-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:425560c6fa0415f27261727bb20bd097568485e5eb0c121f1949417d1c516885", size = 377811, upload-time = "2026-06-30T07:15:46.523Z" }, + { url = "https://files.pythonhosted.org/packages/b1/3d/198dceafb4fb034a6a47347e1b0735d34e0bd4a50be4e898d408ee66cb14/rpds_py-2026.6.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a550fb4950a06dde3beb4721f5ad4b25bf4513784665b0a8522c792e2bd822a4", size = 395382, upload-time = "2026-06-30T07:15:47.955Z" }, + { url = "https://files.pythonhosted.org/packages/1f/f1/13968e49655d40b6b19d8b9140296bbc6f1d86b3f0f6c346cf9f1adddf4b/rpds_py-2026.6.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4f4bca01b63096f606e095734dd56e74e175f94cfbf24ff3d63281cec61f7bb7", size = 543832, upload-time = "2026-06-30T07:15:49.33Z" }, + { url = "https://files.pythonhosted.org/packages/ac/ab/289bcb1b90bd3e40a2900c561fa0e2087345ecbb094f0b870f2345142b7c/rpds_py-2026.6.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ccffae9a092a00deb7efd545fe5e2c33c33b88e7c054337e9a74c179347d0b7d", size = 611011, upload-time = "2026-06-30T07:15:50.847Z" }, + { url = "https://files.pythonhosted.org/packages/1e/16/5043105e679436ccfbc8e5e0dd2d663ed18a8b8113515fd06a5e5d77c83e/rpds_py-2026.6.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:1cf01971c4f2c5553b772a542e4aaf191789cd331bc2cd4ff0e6e65ba49e1e97", size = 572431, upload-time = "2026-06-30T07:15:52.394Z" }, + { url = "https://files.pythonhosted.org/packages/85/ed/adab103321c0a6565d5ae1c2998349bc3ee175b82ccc5ae8fc04cc413075/rpds_py-2026.6.3-cp313-cp313-win32.whl", hash = "sha256:8c3d1e9c15b9d51ca0391e13da1a25a0a4df3c58a37c9dc368e0736cf7f69df0", size = 201710, upload-time = "2026-06-30T07:15:53.894Z" }, + { url = "https://files.pythonhosted.org/packages/7b/ed/a03b09668e74e5dabbf2e211f6468e1820c0552f7b0500082da31841bf7b/rpds_py-2026.6.3-cp313-cp313-win_amd64.whl", hash = "sha256:9250a9a0a6fd4648b3f868da8d91a4c52b5811a62df58e753d50ae4454a36f80", size = 219454, upload-time = "2026-06-30T07:15:55.25Z" }, + { url = "https://files.pythonhosted.org/packages/27/17/b8642c12930b71bc2b25831f6708ccf0f75abcd11883932ec9ce54ba3a78/rpds_py-2026.6.3-cp313-cp313-win_arm64.whl", hash = "sha256:900a67df3fd1660b035a4761c4ce73c382ea6b35f90f9863c36c6fd8bf8b09bb", size = 215063, upload-time = "2026-06-30T07:15:56.573Z" }, + { url = "https://files.pythonhosted.org/packages/b6/36/7fbe9dcdaf857fb3f63c2a2284b62492d95f5e8334e947e5fb6e7f68c9be/rpds_py-2026.6.3-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:931908d9fc855d8f74783377822be318edb6dcb19e47169dc038f9a1bf60b06e", size = 344510, upload-time = "2026-06-30T07:15:57.921Z" }, + { url = "https://files.pythonhosted.org/packages/ba/54/f785cc3d3f60839ca57a5af4927a9f347b07b2799c373fc20f7949f87c7e/rpds_py-2026.6.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:d7469697dce35be237db177d42e2a2ee26e6dcc5fc052078a6fefabd288c6edd", size = 339495, upload-time = "2026-06-30T07:15:59.238Z" }, + { url = "https://files.pythonhosted.org/packages/63/ef/d4cdaf309e6b095b43597103cf8c0b951d6cca2acce68c474f75ec12e0c7/rpds_py-2026.6.3-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bcfbcf66006befb9fd2aeaa9e01feaf881b4dc330a02ba07d2322b1c11be7b5d", size = 369454, upload-time = "2026-06-30T07:16:01.021Z" }, + { url = "https://files.pythonhosted.org/packages/96/4a/9559a68b7ee15db09d7981212e8c2e219d2a1d6d4faa0391d813c3496a36/rpds_py-2026.6.3-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:847927daf4cffbd4e90e42bc890069897101edd015f956cb8721b3473372edda", size = 374583, upload-time = "2026-06-30T07:16:02.287Z" }, + { url = "https://files.pythonhosted.org/packages/ef/75/8964aa7d2c6e8ac43eba8eb6e6b0fdda1f46d39f2fc3e6aa9f2cb17f485d/rpds_py-2026.6.3-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aca6c1ef08a82bfe327cc156da694660f599923e2e6665b6d81c9c2d0ac9ffc8", size = 492919, upload-time = "2026-06-30T07:16:03.723Z" }, + { url = "https://files.pythonhosted.org/packages/8f/97/6908094ac804115e65aedfd90f1b5fee4eebebd3f6c4cfc5419939267565/rpds_py-2026.6.3-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ae50181a047c871561212bb97f7932a2d45fb53e947bd9b57ebad85b529cbc53", size = 383725, upload-time = "2026-06-30T07:16:05.305Z" }, + { url = "https://files.pythonhosted.org/packages/d1/9c/0d1fdc2e7aba23e290d603bc494e97bd205bae262ce33c6b32a69768ed5e/rpds_py-2026.6.3-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc319e5a1de4b6913aac94bf6a2f9e847371e0a140a43dd4991db1a09bc2d504", size = 367255, upload-time = "2026-06-30T07:16:07.086Z" }, + { url = "https://files.pythonhosted.org/packages/c4/fe/f0209ca4a9ed074bc8acb44dfd0e81c3122e94c9689f5645b7973a866719/rpds_py-2026.6.3-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:e4316bf32babbed84e691e352faf967ce2f0f024174a8643c37c94a1080374fc", size = 379060, upload-time = "2026-06-30T07:16:08.525Z" }, + { url = "https://files.pythonhosted.org/packages/c6/8d/f1cc54c616b9d8897de8738aac148d20afca93f68187475fe194d09a71b9/rpds_py-2026.6.3-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8c6e5a2f750cc71c3e3b11d71661f21d6f9bc6cebc6564b1466417a1ec03ec77", size = 395960, upload-time = "2026-06-30T07:16:09.989Z" }, + { url = "https://files.pythonhosted.org/packages/fb/04/aafff00f73aeca2945f734f1d483c64ab8f472d0864ab02377fd8e89c3b2/rpds_py-2026.6.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:4470ce197d4090875cf6affbf1f853338387428df97c4fb7b7106317b8214698", size = 545356, upload-time = "2026-06-30T07:16:11.816Z" }, + { url = "https://files.pythonhosted.org/packages/fd/cc/e229663b9e4ddac5a4acbe9085dd80a71af2a5d356b8b39d6bff233f24b0/rpds_py-2026.6.3-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:ea964164cc9afa72d4d9b23cc28dafae93693c0a53e0b42acbff15b22c3f9ddd", size = 612319, upload-time = "2026-06-30T07:16:13.586Z" }, + { url = "https://files.pythonhosted.org/packages/e3/7a/8a0e6d3e6cd066af108b71b43122c3fe158dd9eb86acac626593a2582eb1/rpds_py-2026.6.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:639c8929aa0afe81be836b04de888460d6bed38b9c54cfc18da8f6bfabf5af5d", size = 573508, upload-time = "2026-06-30T07:16:15.23Z" }, + { url = "https://files.pythonhosted.org/packages/87/03/2a69ab618a789cf6cf85c86bb844c62d090e700ab1a2aa676b3741b6c516/rpds_py-2026.6.3-cp314-cp314-win32.whl", hash = "sha256:882076c00c0a608b131187055ddc5ae29f2e7eaf870d6168980420d58528a5c8", size = 202504, upload-time = "2026-06-30T07:16:16.893Z" }, + { url = "https://files.pythonhosted.org/packages/85/62/a3892ba945f4e24c78f352e5de3c7620d8479f73f211406a97263d13c7d2/rpds_py-2026.6.3-cp314-cp314-win_amd64.whl", hash = "sha256:0be972be84cfcaf46c8c6edf690ca0f154ac17babf1f6a955a51579b34ad2dc5", size = 220380, upload-time = "2026-06-30T07:16:18.108Z" }, + { url = "https://files.pythonhosted.org/packages/3d/e7/c2bd44dc831931815ad11ebb5f430b5a0a4d3caa9de837107876c30c3432/rpds_py-2026.6.3-cp314-cp314-win_arm64.whl", hash = "sha256:2a9c6f195058cb45335e8cc3802745c603d716eb96bc9625950c1aac71c0c703", size = 215976, upload-time = "2026-06-30T07:16:19.654Z" }, + { url = "https://files.pythonhosted.org/packages/79/9c/fff7b74bce9a091ec9a012a03f9ff5f69364eaf9451060dfc4486da2ffdd/rpds_py-2026.6.3-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:f90938e92afda60266da758ee7d363447f7f0138c9559f9e1811629580582d90", size = 346840, upload-time = "2026-06-30T07:16:21.268Z" }, + { url = "https://files.pythonhosted.org/packages/e9/44/77bcb1168b33704908295533d27f10eb811e9e3e193e8993dc99572211d3/rpds_py-2026.6.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ec829541c45bca16e61c7ae50c20501f213605beb75d1aba91a6ee37fbbb56a4", size = 340282, upload-time = "2026-06-30T07:16:22.875Z" }, + { url = "https://files.pythonhosted.org/packages/87/3c/7a9081c7c9e645b39efe19e4ffbeccd80add246327cd9b888aecffd72317/rpds_py-2026.6.3-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afd70d95892096cdb26f15a00c45907b17817577aa8d1c76b2dcc2788391f9e9", size = 370403, upload-time = "2026-06-30T07:16:24.415Z" }, + { url = "https://files.pythonhosted.org/packages/f7/69/af47021eb7dad6ff3396cb001c08f0f3c4d06c20253f75be6421a59fe6b7/rpds_py-2026.6.3-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:29dfa0533a5d4c94d4dfa1b694fcb56c9c63aad8330ffdd816fd225d0a7a162f", size = 376055, upload-time = "2026-06-30T07:16:26.111Z" }, + { url = "https://files.pythonhosted.org/packages/81/fc/a3bcf517084396a6dd258c592567a3c011ba4557f2fde23dceaf26e74f2e/rpds_py-2026.6.3-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:af05d726809bff6b141be124d4c7ce998f9c9c7f30edb1f46c07aa103d540b41", size = 494419, upload-time = "2026-06-30T07:16:27.596Z" }, + { url = "https://files.pythonhosted.org/packages/c9/eb/13d529d1788135425c7bf207f8463458ca5d92e43f3f701365b83e9dffc1/rpds_py-2026.6.3-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9826217f048f620d9a712672818bf231442c1b35d96b227a07eabd11b4bb6945", size = 384848, upload-time = "2026-06-30T07:16:29.183Z" }, + { url = "https://files.pythonhosted.org/packages/8e/f4/b7ac49f30013aba8f7b9566b1dd07e81de95e708c1374b7bacc5b9bc5c9c/rpds_py-2026.6.3-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:536bceea4fa4acf7e1c61da2b5786304367c816c8895be71b8f537c480b0ea1f", size = 371369, upload-time = "2026-06-30T07:16:30.912Z" }, + { url = "https://files.pythonhosted.org/packages/31/86/6260bafa622f788b07ddec0e52d810305c8b9b0b8c27f58a2ab04bf62b4f/rpds_py-2026.6.3-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:bc0011654b91cc4fb2ae701bec0a0ba1e552c0714247fa7af6c59e0ccfa3a4e1", size = 379673, upload-time = "2026-06-30T07:16:32.486Z" }, + { url = "https://files.pythonhosted.org/packages/19/c3/03f1ee79a047b48daeca157c89a18509cde22b6b951d642b9b0af1be660a/rpds_py-2026.6.3-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:539d75de9e0d536c84ff18dfeb805398e58227001ce09231a26a08b9aed1ee0e", size = 397500, upload-time = "2026-06-30T07:16:34.471Z" }, + { url = "https://files.pythonhosted.org/packages/f0/95/8ed0cd8c377dca12aea498f119fe639fc474d1461545c39d2b5872eb1c0f/rpds_py-2026.6.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:166cf54d9f44fc6ceb53c7860258dde44a81406646de79f8ed3234fca3b6e538", size = 545978, upload-time = "2026-06-30T07:16:36.45Z" }, + { url = "https://files.pythonhosted.org/packages/d3/f2/0eb57f0eaa83f8fc152a7e03de968ab77e1f00732bebc892b190c6eebde7/rpds_py-2026.6.3-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:d34c20167764fbcf927194d532dd7e0c56772f0a5f943fa5ef9e9afbba8fb9db", size = 613350, upload-time = "2026-06-30T07:16:38.213Z" }, + { url = "https://files.pythonhosted.org/packages/5b/de/e0674bdbc3ef7634989b3f854c3f34bc1f587d36e5bfdc5c378d57034619/rpds_py-2026.6.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ea7bb13b7c9a29791f87a0387ba7d3ad3a6d783d827e4d3f27b40a0ff44495e2", size = 576486, upload-time = "2026-06-30T07:16:39.797Z" }, + { url = "https://files.pythonhosted.org/packages/f2/f6/21101359743cd136ada781e8210a85769578422ba460672eea0e29739200/rpds_py-2026.6.3-cp314-cp314t-win32.whl", hash = "sha256:6de4744d05bd1aa1be4ed7ea1189e3979196808008113bbbf899a460966b925e", size = 201068, upload-time = "2026-06-30T07:16:41.316Z" }, + { url = "https://files.pythonhosted.org/packages/a6/b2/9574d4d44f7760c2aa32d92a0a4f41698e33f5b204a0bf5c9758f52c79d5/rpds_py-2026.6.3-cp314-cp314t-win_amd64.whl", hash = "sha256:c7b9a2f8f4d8e90af72571d3d495deebdd7e3c75451f5b41719aee166e940fc2", size = 220600, upload-time = "2026-06-30T07:16:43.091Z" }, + { url = "https://files.pythonhosted.org/packages/08/ae/f23a2697e6ee6340a578b0f136be6483657bef0c6f9497b752bb5c0964bb/rpds_py-2026.6.3-cp315-cp315-macosx_10_12_x86_64.whl", hash = "sha256:e059c5dde6452b44424bd1834557556c226b57781dee1227af23518459722b13", size = 344726, upload-time = "2026-06-30T07:16:44.5Z" }, + { url = "https://files.pythonhosted.org/packages/c3/63/e7b3a1a5358dd32c930a1062d8e15b67fd6e8922e81df9e91706d66ee5c8/rpds_py-2026.6.3-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:2f7c26fbc5acd2522b95d4177fe4710ffd8e9b20529e703ffbf8db4d93903f05", size = 339587, upload-time = "2026-06-30T07:16:46.255Z" }, + { url = "https://files.pythonhosted.org/packages/ec/64/10a85681916ca55fffb91b0a211f84e34297c109243484dd6394660a8a7c/rpds_py-2026.6.3-cp315-cp315-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a3086b538543802f84c843911242db20447de00d8752dd0efc936dbcf02218ba", size = 369585, upload-time = "2026-06-30T07:16:48.101Z" }, + { url = "https://files.pythonhosted.org/packages/76/c2/baf95c7c38823e12ba34407c5f5767a89e5cf2233895e56f608167ae9493/rpds_py-2026.6.3-cp315-cp315-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8f2e5c5ee828d42cb11760761c0af6507927bec42d0ad5458f97c9203b054617", size = 375479, upload-time = "2026-06-30T07:16:49.93Z" }, + { url = "https://files.pythonhosted.org/packages/6a/94/0aad06c72d65101e11d33528d438cda99a39ce0da99466e156158f2541d3/rpds_py-2026.6.3-cp315-cp315-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ed0c1e5d10cdc7135537988c74a0188da68e2f3c30813ba3744ab1e42e0480f9", size = 492418, upload-time = "2026-06-30T07:16:51.641Z" }, + { url = "https://files.pythonhosted.org/packages/b5/17/de3f5a479a1f056535d7489819639d8cd591ea6281d700390b43b1abd745/rpds_py-2026.6.3-cp315-cp315-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8c2642a7603ec0b16ed77da4555db3b4b472341904873788327c0b0d7b95f1bb", size = 384123, upload-time = "2026-06-30T07:16:53.622Z" }, + { url = "https://files.pythonhosted.org/packages/46/7d/bf09bd1b145bb2671c03e1e6d1ab8651858d90d8c7dfeadd85a37a934fd8/rpds_py-2026.6.3-cp315-cp315-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e4320744c1ffdd95a603def63344bfab2d33edeab301c5007e7de9f9f5b3885", size = 367351, upload-time = "2026-06-30T07:16:55.241Z" }, + { url = "https://files.pythonhosted.org/packages/a3/ea/1bb734f314b8be319149ddee80b18bd41372bdcfbdf88d28131c0cd37719/rpds_py-2026.6.3-cp315-cp315-manylinux_2_31_riscv64.whl", hash = "sha256:a9f4645593036b81bbdb36b9c8e0ea0d1c3fee968c4d59db0344c14087ef143a", size = 378827, upload-time = "2026-06-30T07:16:56.841Z" }, + { url = "https://files.pythonhosted.org/packages/4b/93/d9611e5b25e26df9a3649813ed66193ace9347a7c7fc4ab7cf70e94851c0/rpds_py-2026.6.3-cp315-cp315-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e55d236be29255554da47abe5c577637db7c24a02b8b46f0ca9524c855801868", size = 395966, upload-time = "2026-06-30T07:16:58.557Z" }, + { url = "https://files.pythonhosted.org/packages/c3/cb/99d77e16e5534ae1d90629bbe419ba6ee170833a6a85e3aa1cc41726fbbc/rpds_py-2026.6.3-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:24e9c5386e16669b674a69c156c8eeefcb578f3b3397b713b08e6d60f3c7b187", size = 545680, upload-time = "2026-06-30T07:17:00.164Z" }, + { url = "https://files.pythonhosted.org/packages/59/15/11a29755f790cef7a2f755e8e14f4f0c33f39489e1893a632a2eee59672b/rpds_py-2026.6.3-cp315-cp315-musllinux_1_2_i686.whl", hash = "sha256:c60924535c75f1566b6eb75b5c31a48a43fef04fa2d0d201acbad8a9969c6107", size = 611853, upload-time = "2026-06-30T07:17:01.962Z" }, + { url = "https://files.pythonhosted.org/packages/68/86/0c27547e21644da938fb530f7e1a8148dd24d02db07e7a5f2567a17ce710/rpds_py-2026.6.3-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:38a2fea2787428f811719ceb9114cb78964a3138838320c29ac39526c79c16ba", size = 573715, upload-time = "2026-06-30T07:17:03.693Z" }, + { url = "https://files.pythonhosted.org/packages/29/71/4d8fcf700931815594bce892255bbd973b94efaf0fc1932b0590df18d886/rpds_py-2026.6.3-cp315-cp315-win32.whl", hash = "sha256:d483fe17f01ad64b7bf7cc38fcefff1ca9fb83f8c2b2542b68f97ffe0611b369", size = 202864, upload-time = "2026-06-30T07:17:05.746Z" }, + { url = "https://files.pythonhosted.org/packages/eb/62/b577562de0edbb55b2be85ce5fd09c33e386b9b13eee09833af4240fd5c4/rpds_py-2026.6.3-cp315-cp315-win_amd64.whl", hash = "sha256:67e3a721ffc5d8d2210d3671872298c4a84e4b8035cfe42ffd7cde35d772b146", size = 220430, upload-time = "2026-06-30T07:17:07.471Z" }, + { url = "https://files.pythonhosted.org/packages/c8/95/d6d0b2509825141eef60669a5739eec88dbc6a48053d6c92993a5704defe/rpds_py-2026.6.3-cp315-cp315-win_arm64.whl", hash = "sha256:6e84adbcf4bf841aed8116a8264b9f50b4cb3e7bd89b516122e616ac56ca269e", size = 215877, upload-time = "2026-06-30T07:17:09.008Z" }, + { url = "https://files.pythonhosted.org/packages/b7/bf/f3ea278f0afd615c1d0f19cb69043a41526e2bb600c2b536eb192218eb27/rpds_py-2026.6.3-cp315-cp315t-macosx_10_12_x86_64.whl", hash = "sha256:ae6dd8f10bd17aad820876d24caec9efdafd80a318d16c0a48edb5e136902c6b", size = 346933, upload-time = "2026-06-30T07:17:10.762Z" }, + { url = "https://files.pythonhosted.org/packages/9d/29/9907bdf1c5346763cf10b7f6852aad86652168c259def904cbe0082c5864/rpds_py-2026.6.3-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:bdbd97738551fca3917c1bd7188bec1920bb520104f28e7e1007f9ceb17b7690", size = 340274, upload-time = "2026-06-30T07:17:12.266Z" }, + { url = "https://files.pythonhosted.org/packages/6f/2c/8e03767b5778ef25cebf74a7a91a2c3806f8eced4c92cb7406bbe060756d/rpds_py-2026.6.3-cp315-cp315t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b95977e7211527ab0ba576e286d023389fbeeb32a6b7b771665d333c60e5342", size = 370763, upload-time = "2026-06-30T07:17:14.107Z" }, + { url = "https://files.pythonhosted.org/packages/2e/e1/df2a7e1ba2efd796af26194250b8d42c821b46592311595162af9ef0528d/rpds_py-2026.6.3-cp315-cp315t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d15fde0e6fb0d88a60d221204873743e5d9f0b7d29165e62cd86d0413ad74ba6", size = 376467, upload-time = "2026-06-30T07:17:15.76Z" }, + { url = "https://files.pythonhosted.org/packages/6b/de/8a0814d1946af29cb068fb259aa8622f856df1d0bab58429448726b537f5/rpds_py-2026.6.3-cp315-cp315t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a136d453475ac0fcbda502ef1e6504bd28d6d904700915d278deeab0d00fe140", size = 496689, upload-time = "2026-06-30T07:17:17.308Z" }, + { url = "https://files.pythonhosted.org/packages/df/f3/f19e0c852ba13694f5a79f3b719331051573cb5693feacf8a88ffffc3a71/rpds_py-2026.6.3-cp315-cp315t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f826877d462181e5eb1c26a0026b8d0cab05d99844ecb6d8bf3627a2ca0c0442", size = 385340, upload-time = "2026-06-30T07:17:18.928Z" }, + { url = "https://files.pythonhosted.org/packages/e2/ae/7ec3a9d2d4351f99e37bcb06b6b6f954512646bfdbf9742e1de727865daf/rpds_py-2026.6.3-cp315-cp315t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:79486287de1730dbaff3dbd124d0ca4d2ef7f9d29bf2544f1f93c09b5bcbbd12", size = 372179, upload-time = "2026-06-30T07:17:20.539Z" }, + { url = "https://files.pythonhosted.org/packages/d3/ac/9cee911dff2aaa9a5a8354f6610bf2e6a616de9197c5fff4f54f82585f1e/rpds_py-2026.6.3-cp315-cp315t-manylinux_2_31_riscv64.whl", hash = "sha256:808345f53cb952433ca2816f1604ff3515608a81784954f38d4452acfe8e61d5", size = 379993, upload-time = "2026-06-30T07:17:22.212Z" }, + { url = "https://files.pythonhosted.org/packages/83/6b/7c2a07ba88d1e9a936612f7a5d067467ed03d971d5a06f7d309dff044a7e/rpds_py-2026.6.3-cp315-cp315t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1967debc37f64f2c4dc90a7f563aec558b471966e12adcac4e1c4240496b6ebf", size = 398909, upload-time = "2026-06-30T07:17:23.66Z" }, + { url = "https://files.pythonhosted.org/packages/97/0b/776ffcb66783637b0031f6d58d6fb55913c8b5abf00aeecd46bf933fb477/rpds_py-2026.6.3-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:f0840b5b17057f7fd918b76183a4b5a0635f43e14eb2ce60dce1d4ee4707ea00", size = 546584, upload-time = "2026-06-30T07:17:25.264Z" }, + { url = "https://files.pythonhosted.org/packages/55/33/ba3bc04d7092bd553c9b2b195624992d2cc4f3de1f380b7b93cbee67bd79/rpds_py-2026.6.3-cp315-cp315t-musllinux_1_2_i686.whl", hash = "sha256:faa679d19a6696fd54259ad321251ad77a13e70e03dd834daa762a44fb6196ef", size = 614357, upload-time = "2026-06-30T07:17:26.888Z" }, + { url = "https://files.pythonhosted.org/packages/8b/71/14edf065f04630b1a8472f7653cad03f6c478bcf95ea0e6aed55451e33ea/rpds_py-2026.6.3-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:23a439f31ccbeff1574e24889128821d1f7917470e830cf6544dced1c662262a", size = 576533, upload-time = "2026-06-30T07:17:28.546Z" }, + { url = "https://files.pythonhosted.org/packages/ba/76/65002b08596c389105720a8c0d22298b8dc25a4baf89b2ce431343c8b1de/rpds_py-2026.6.3-cp315-cp315t-win32.whl", hash = "sha256:913ca42ccad3f8cc6e292b587ae8ae49c8c823e5dce51a736252fc7c7cdfa577", size = 201204, upload-time = "2026-06-30T07:17:30.193Z" }, + { url = "https://files.pythonhosted.org/packages/8c/97/d855d6b3c322d1f27e26f5241c42016b56cf01377ea8ed348285f54652f0/rpds_py-2026.6.3-cp315-cp315t-win_amd64.whl", hash = "sha256:ae3d4fe8c0b9213624fdce7279d70e3b148b682ca20719ebd193a23ebfa47324", size = 220719, upload-time = "2026-06-30T07:17:31.788Z" }, + { url = "https://files.pythonhosted.org/packages/b4/9c/f0d19ac587fd0e4ab6b72cda355e9c5a6166b01ef7e064e437aef8eb9fef/rpds_py-2026.6.3-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:4cf2d36a2357e4d07bb5a4f98801265327b48256867816cfd2ceb001e9754a8f", size = 349791, upload-time = "2026-06-30T07:17:33.315Z" }, + { url = "https://files.pythonhosted.org/packages/38/c7/1d49d204c9fd2ee6c537601dc4c1ba921e03363ca576bfab94a00254ac9a/rpds_py-2026.6.3-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:30c6dc199b24a5e3e81d50da0f00858c5bbdb2617a750395687f4339c5818171", size = 352842, upload-time = "2026-06-30T07:17:34.897Z" }, + { url = "https://files.pythonhosted.org/packages/ac/e5/c0b5dc93cd0d4c06ce1f438907649514e2ea077bcd911e3154a51e96c38e/rpds_py-2026.6.3-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9891e594296ab9dada6551c8e7b387b2721f27a67eecd528412e8906247a7b90", size = 382094, upload-time = "2026-06-30T07:17:36.514Z" }, + { url = "https://files.pythonhosted.org/packages/0d/54/ec0e907b4ca8d541112db352409bd15f871c9b243e0c92c9b5a46ae96f01/rpds_py-2026.6.3-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b5c2dc92304aa48a4a60443b548bb12f12e119d4b72f314015e67b9e1be97fca", size = 388662, upload-time = "2026-06-30T07:17:38.235Z" }, + { url = "https://files.pythonhosted.org/packages/d3/f4/921c22a4fd0f1c1ac13a3996ffbf0aa67951e2c8ad0d1d9574938a2932e8/rpds_py-2026.6.3-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:127e08c0642d880cf32ca47ec2a4a77b901f7e2dd1ad9762adb13955d72ffcc9", size = 504896, upload-time = "2026-06-30T07:17:39.689Z" }, + { url = "https://files.pythonhosted.org/packages/0b/1b/a114b972cefa1ab1cdb3c7bb177cd3844a12826c507c722d3a73516dbbaf/rpds_py-2026.6.3-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8bb68f03f395eb793220b45c097bd4d8c32944393da0fad8b999efac0868fc8c", size = 391545, upload-time = "2026-06-30T07:17:41.336Z" }, + { url = "https://files.pythonhosted.org/packages/4e/98/af9b3db77d47fcbe6c8c1f36e2c2147ec70292819e99c325f871584a1c11/rpds_py-2026.6.3-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a3450b693fde92133e9f51060568a4c31fcca76d5e53bbd611e689ca446517e9", size = 380059, upload-time = "2026-06-30T07:17:42.857Z" }, + { url = "https://files.pythonhosted.org/packages/c9/ba/0efd8668b97c1d26a61566386c636a7a7a09829e474fdf807caa15a2c844/rpds_py-2026.6.3-pp311-pypy311_pp73-manylinux_2_31_riscv64.whl", hash = "sha256:5e8d07bddee435a2ff6f1920e18feff28d0bc4533e42f4bf6927fbd073312c41", size = 393235, upload-time = "2026-06-30T07:17:44.637Z" }, + { url = "https://files.pythonhosted.org/packages/62/90/8c139ee9690f73b0829f32647de6f40d826f8f443af6fa72644f96351aac/rpds_py-2026.6.3-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3a83ae6c67b7676b9878378547ca8e93ed77a580037bcbcd1d32f739e1e6089c", size = 413008, upload-time = "2026-06-30T07:17:46.225Z" }, + { url = "https://files.pythonhosted.org/packages/9c/97/0043896fdd7828ce09a1d9a8b06433714d0960fc4ff3fc4aa72b666b764e/rpds_py-2026.6.3-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:2bfd04c19ddbd6640de0b51894d764bd2758854d5b75bd102d2ef10cb9c293a9", size = 558118, upload-time = "2026-06-30T07:17:47.759Z" }, + { url = "https://files.pythonhosted.org/packages/f6/40/02355f0e134f783a8f9814c4680a1bd311d37671577a5964ea838573ff37/rpds_py-2026.6.3-pp311-pypy311_pp73-musllinux_1_2_i686.whl", hash = "sha256:ca6546b66be9dc4738b1b043d5ebd5488c66c578c5ff0fd0e8065313fe3afb76", size = 623138, upload-time = "2026-06-30T07:17:49.355Z" }, + { url = "https://files.pythonhosted.org/packages/10/85/48f0abdcef5cce4e034c7a5b0ceeceba0b01bf0d942824f4bb720afe2dec/rpds_py-2026.6.3-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:8e65860d238379ed982fd9ba690579b5e95af2f4840f99c772816dbe573cb826", size = 586486, upload-time = "2026-06-30T07:17:51.141Z" }, +] + +[[package]] +name = "ruamel-yaml" +version = "0.18.17" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ruamel-yaml-clib", marker = "python_full_version < '3.15' and platform_python_implementation == 'CPython'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/3a/2b/7a1f1ebcd6b3f14febdc003e658778d81e76b40df2267904ee6b13f0c5c6/ruamel_yaml-0.18.17.tar.gz", hash = "sha256:9091cd6e2d93a3a4b157ddb8fabf348c3de7f1fb1381346d985b6b247dcd8d3c", size = 149602, upload-time = "2025-12-17T20:02:55.757Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/af/fe/b6045c782f1fd1ae317d2a6ca1884857ce5c20f59befe6ab25a8603c43a7/ruamel_yaml-0.18.17-py3-none-any.whl", hash = "sha256:9c8ba9eb3e793efdf924b60d521820869d5bf0cb9c6f1b82d82de8295e290b9d", size = 121594, upload-time = "2025-12-17T20:02:07.657Z" }, +] + +[[package]] +name = "ruamel-yaml-clib" +version = "0.2.15" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ea/97/60fda20e2fb54b83a61ae14648b0817c8f5d84a3821e40bfbdae1437026a/ruamel_yaml_clib-0.2.15.tar.gz", hash = "sha256:46e4cc8c43ef6a94885f72512094e482114a8a706d3c555a34ed4b0d20200600", size = 225794, upload-time = "2025-11-16T16:12:59.761Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f7/5a/4ab767cd42dcd65b83c323e1620d7c01ee60a52f4032fb7b61501f45f5c2/ruamel_yaml_clib-0.2.15-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:88eea8baf72f0ccf232c22124d122a7f26e8a24110a0273d9bcddcb0f7e1fa03", size = 147454, upload-time = "2025-11-16T16:13:02.54Z" }, + { url = "https://files.pythonhosted.org/packages/40/44/184173ac1e74fd35d308108bcbf83904d6ef8439c70763189225a166b238/ruamel_yaml_clib-0.2.15-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9b6f7d74d094d1f3a4e157278da97752f16ee230080ae331fcc219056ca54f77", size = 132467, upload-time = "2025-11-16T16:13:03.539Z" }, + { url = "https://files.pythonhosted.org/packages/49/1b/2d2077a25fe682ae335007ca831aff42e3cbc93c14066675cf87a6c7fc3e/ruamel_yaml_clib-0.2.15-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:4be366220090d7c3424ac2b71c90d1044ea34fca8c0b88f250064fd06087e614", size = 693454, upload-time = "2025-11-16T20:22:41.083Z" }, + { url = "https://files.pythonhosted.org/packages/90/16/e708059c4c429ad2e33be65507fc1730641e5f239fb2964efc1ba6edea94/ruamel_yaml_clib-0.2.15-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1f66f600833af58bea694d5892453f2270695b92200280ee8c625ec5a477eed3", size = 700345, upload-time = "2025-11-16T16:13:04.771Z" }, + { url = "https://files.pythonhosted.org/packages/d9/79/0e8ef51df1f0950300541222e3332f20707a9c210b98f981422937d1278c/ruamel_yaml_clib-0.2.15-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:da3d6adadcf55a93c214d23941aef4abfd45652110aed6580e814152f385b862", size = 731306, upload-time = "2025-11-16T16:13:06.312Z" }, + { url = "https://files.pythonhosted.org/packages/a6/f4/2cdb54b142987ddfbd01fc45ac6bd882695fbcedb9d8bbf796adc3fc3746/ruamel_yaml_clib-0.2.15-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e9fde97ecb7bb9c41261c2ce0da10323e9227555c674989f8d9eb7572fc2098d", size = 692415, upload-time = "2025-11-16T16:13:07.465Z" }, + { url = "https://files.pythonhosted.org/packages/a0/07/40b5fc701cce8240a3e2d26488985d3bbdc446e9fe397c135528d412fea6/ruamel_yaml_clib-0.2.15-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:05c70f7f86be6f7bee53794d80050a28ae7e13e4a0087c1839dcdefd68eb36b6", size = 705007, upload-time = "2025-11-16T20:22:42.856Z" }, + { url = "https://files.pythonhosted.org/packages/82/19/309258a1df6192fb4a77ffa8eae3e8150e8d0ffa56c1b6fa92e450ba2740/ruamel_yaml_clib-0.2.15-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:6f1d38cbe622039d111b69e9ca945e7e3efebb30ba998867908773183357f3ed", size = 723974, upload-time = "2025-11-16T16:13:08.72Z" }, + { url = "https://files.pythonhosted.org/packages/67/3a/d6ee8263b521bfceb5cd2faeb904a15936480f2bb01c7ff74a14ec058ca4/ruamel_yaml_clib-0.2.15-cp310-cp310-win32.whl", hash = "sha256:fe239bdfdae2302e93bd6e8264bd9b71290218fff7084a9db250b55caaccf43f", size = 102836, upload-time = "2025-11-16T16:13:10.27Z" }, + { url = "https://files.pythonhosted.org/packages/ed/03/92aeb5c69018387abc49a8bb4f83b54a0471d9ef48e403b24bac68f01381/ruamel_yaml_clib-0.2.15-cp310-cp310-win_amd64.whl", hash = "sha256:468858e5cbde0198337e6a2a78eda8c3fb148bdf4c6498eaf4bc9ba3f8e780bd", size = 121917, upload-time = "2025-11-16T16:13:12.145Z" }, + { url = "https://files.pythonhosted.org/packages/2c/80/8ce7b9af532aa94dd83360f01ce4716264db73de6bc8efd22c32341f6658/ruamel_yaml_clib-0.2.15-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c583229f336682b7212a43d2fa32c30e643d3076178fb9f7a6a14dde85a2d8bd", size = 147998, upload-time = "2025-11-16T16:13:13.241Z" }, + { url = "https://files.pythonhosted.org/packages/53/09/de9d3f6b6701ced5f276d082ad0f980edf08ca67114523d1b9264cd5e2e0/ruamel_yaml_clib-0.2.15-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:56ea19c157ed8c74b6be51b5fa1c3aff6e289a041575f0556f66e5fb848bb137", size = 132743, upload-time = "2025-11-16T16:13:14.265Z" }, + { url = "https://files.pythonhosted.org/packages/0e/f7/73a9b517571e214fe5c246698ff3ed232f1ef863c8ae1667486625ec688a/ruamel_yaml_clib-0.2.15-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:5fea0932358e18293407feb921d4f4457db837b67ec1837f87074667449f9401", size = 731459, upload-time = "2025-11-16T20:22:44.338Z" }, + { url = "https://files.pythonhosted.org/packages/9b/a2/0dc0013169800f1c331a6f55b1282c1f4492a6d32660a0cf7b89e6684919/ruamel_yaml_clib-0.2.15-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ef71831bd61fbdb7aa0399d5c4da06bea37107ab5c79ff884cc07f2450910262", size = 749289, upload-time = "2025-11-16T16:13:15.633Z" }, + { url = "https://files.pythonhosted.org/packages/aa/ed/3fb20a1a96b8dc645d88c4072df481fe06e0289e4d528ebbdcc044ebc8b3/ruamel_yaml_clib-0.2.15-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:617d35dc765715fa86f8c3ccdae1e4229055832c452d4ec20856136acc75053f", size = 777630, upload-time = "2025-11-16T16:13:16.898Z" }, + { url = "https://files.pythonhosted.org/packages/60/50/6842f4628bc98b7aa4733ab2378346e1441e150935ad3b9f3c3c429d9408/ruamel_yaml_clib-0.2.15-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1b45498cc81a4724a2d42273d6cfc243c0547ad7c6b87b4f774cb7bcc131c98d", size = 744368, upload-time = "2025-11-16T16:13:18.117Z" }, + { url = "https://files.pythonhosted.org/packages/d3/b0/128ae8e19a7d794c2e36130a72b3bb650ce1dd13fb7def6cf10656437dcf/ruamel_yaml_clib-0.2.15-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:def5663361f6771b18646620fca12968aae730132e104688766cf8a3b1d65922", size = 745233, upload-time = "2025-11-16T20:22:45.833Z" }, + { url = "https://files.pythonhosted.org/packages/75/05/91130633602d6ba7ce3e07f8fc865b40d2a09efd4751c740df89eed5caf9/ruamel_yaml_clib-0.2.15-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:014181cdec565c8745b7cbc4de3bf2cc8ced05183d986e6d1200168e5bb59490", size = 770963, upload-time = "2025-11-16T16:13:19.344Z" }, + { url = "https://files.pythonhosted.org/packages/fd/4b/fd4542e7f33d7d1bc64cc9ac9ba574ce8cf145569d21f5f20133336cdc8c/ruamel_yaml_clib-0.2.15-cp311-cp311-win32.whl", hash = "sha256:d290eda8f6ada19e1771b54e5706b8f9807e6bb08e873900d5ba114ced13e02c", size = 102640, upload-time = "2025-11-16T16:13:20.498Z" }, + { url = "https://files.pythonhosted.org/packages/bb/eb/00ff6032c19c7537371e3119287999570867a0eafb0154fccc80e74bf57a/ruamel_yaml_clib-0.2.15-cp311-cp311-win_amd64.whl", hash = "sha256:bdc06ad71173b915167702f55d0f3f027fc61abd975bd308a0968c02db4a4c3e", size = 121996, upload-time = "2025-11-16T16:13:21.855Z" }, + { url = "https://files.pythonhosted.org/packages/72/4b/5fde11a0722d676e469d3d6f78c6a17591b9c7e0072ca359801c4bd17eee/ruamel_yaml_clib-0.2.15-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:cb15a2e2a90c8475df45c0949793af1ff413acfb0a716b8b94e488ea95ce7cff", size = 149088, upload-time = "2025-11-16T16:13:22.836Z" }, + { url = "https://files.pythonhosted.org/packages/85/82/4d08ac65ecf0ef3b046421985e66301a242804eb9a62c93ca3437dc94ee0/ruamel_yaml_clib-0.2.15-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:64da03cbe93c1e91af133f5bec37fd24d0d4ba2418eaf970d7166b0a26a148a2", size = 134553, upload-time = "2025-11-16T16:13:24.151Z" }, + { url = "https://files.pythonhosted.org/packages/b9/cb/22366d68b280e281a932403b76da7a988108287adff2bfa5ce881200107a/ruamel_yaml_clib-0.2.15-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:f6d3655e95a80325b84c4e14c080b2470fe4f33b6846f288379ce36154993fb1", size = 737468, upload-time = "2025-11-16T20:22:47.335Z" }, + { url = "https://files.pythonhosted.org/packages/71/73/81230babf8c9e33770d43ed9056f603f6f5f9665aea4177a2c30ae48e3f3/ruamel_yaml_clib-0.2.15-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:71845d377c7a47afc6592aacfea738cc8a7e876d586dfba814501d8c53c1ba60", size = 753349, upload-time = "2025-11-16T16:13:26.269Z" }, + { url = "https://files.pythonhosted.org/packages/61/62/150c841f24cda9e30f588ef396ed83f64cfdc13b92d2f925bb96df337ba9/ruamel_yaml_clib-0.2.15-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:11e5499db1ccbc7f4b41f0565e4f799d863ea720e01d3e99fa0b7b5fcd7802c9", size = 788211, upload-time = "2025-11-16T16:13:27.441Z" }, + { url = "https://files.pythonhosted.org/packages/30/93/e79bd9cbecc3267499d9ead919bd61f7ddf55d793fb5ef2b1d7d92444f35/ruamel_yaml_clib-0.2.15-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4b293a37dc97e2b1e8a1aec62792d1e52027087c8eea4fc7b5abd2bdafdd6642", size = 743203, upload-time = "2025-11-16T16:13:28.671Z" }, + { url = "https://files.pythonhosted.org/packages/8d/06/1eb640065c3a27ce92d76157f8efddb184bd484ed2639b712396a20d6dce/ruamel_yaml_clib-0.2.15-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:512571ad41bba04eac7268fe33f7f4742210ca26a81fe0c75357fa682636c690", size = 747292, upload-time = "2025-11-16T20:22:48.584Z" }, + { url = "https://files.pythonhosted.org/packages/a5/21/ee353e882350beab65fcc47a91b6bdc512cace4358ee327af2962892ff16/ruamel_yaml_clib-0.2.15-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e5e9f630c73a490b758bf14d859a39f375e6999aea5ddd2e2e9da89b9953486a", size = 771624, upload-time = "2025-11-16T16:13:29.853Z" }, + { url = "https://files.pythonhosted.org/packages/57/34/cc1b94057aa867c963ecf9ea92ac59198ec2ee3a8d22a126af0b4d4be712/ruamel_yaml_clib-0.2.15-cp312-cp312-win32.whl", hash = "sha256:f4421ab780c37210a07d138e56dd4b51f8642187cdfb433eb687fe8c11de0144", size = 100342, upload-time = "2025-11-16T16:13:31.067Z" }, + { url = "https://files.pythonhosted.org/packages/b3/e5/8925a4208f131b218f9a7e459c0d6fcac8324ae35da269cb437894576366/ruamel_yaml_clib-0.2.15-cp312-cp312-win_amd64.whl", hash = "sha256:2b216904750889133d9222b7b873c199d48ecbb12912aca78970f84a5aa1a4bc", size = 119013, upload-time = "2025-11-16T16:13:32.164Z" }, + { url = "https://files.pythonhosted.org/packages/17/5e/2f970ce4c573dc30c2f95825f2691c96d55560268ddc67603dc6ea2dd08e/ruamel_yaml_clib-0.2.15-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4dcec721fddbb62e60c2801ba08c87010bd6b700054a09998c4d09c08147b8fb", size = 147450, upload-time = "2025-11-16T16:13:33.542Z" }, + { url = "https://files.pythonhosted.org/packages/d6/03/a1baa5b94f71383913f21b96172fb3a2eb5576a4637729adbf7cd9f797f8/ruamel_yaml_clib-0.2.15-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:65f48245279f9bb301d1276f9679b82e4c080a1ae25e679f682ac62446fac471", size = 133139, upload-time = "2025-11-16T16:13:34.587Z" }, + { url = "https://files.pythonhosted.org/packages/dc/19/40d676802390f85784235a05788fd28940923382e3f8b943d25febbb98b7/ruamel_yaml_clib-0.2.15-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:46895c17ead5e22bea5e576f1db7e41cb273e8d062c04a6a49013d9f60996c25", size = 731474, upload-time = "2025-11-16T20:22:49.934Z" }, + { url = "https://files.pythonhosted.org/packages/ce/bb/6ef5abfa43b48dd55c30d53e997f8f978722f02add61efba31380d73e42e/ruamel_yaml_clib-0.2.15-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3eb199178b08956e5be6288ee0b05b2fb0b5c1f309725ad25d9c6ea7e27f962a", size = 748047, upload-time = "2025-11-16T16:13:35.633Z" }, + { url = "https://files.pythonhosted.org/packages/ff/5d/e4f84c9c448613e12bd62e90b23aa127ea4c46b697f3d760acc32cb94f25/ruamel_yaml_clib-0.2.15-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4d1032919280ebc04a80e4fb1e93f7a738129857eaec9448310e638c8bccefcf", size = 782129, upload-time = "2025-11-16T16:13:36.781Z" }, + { url = "https://files.pythonhosted.org/packages/de/4b/e98086e88f76c00c88a6bcf15eae27a1454f661a9eb72b111e6bbb69024d/ruamel_yaml_clib-0.2.15-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ab0df0648d86a7ecbd9c632e8f8d6b21bb21b5fc9d9e095c796cacf32a728d2d", size = 736848, upload-time = "2025-11-16T16:13:37.952Z" }, + { url = "https://files.pythonhosted.org/packages/0c/5c/5964fcd1fd9acc53b7a3a5d9a05ea4f95ead9495d980003a557deb9769c7/ruamel_yaml_clib-0.2.15-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:331fb180858dd8534f0e61aa243b944f25e73a4dae9962bd44c46d1761126bbf", size = 741630, upload-time = "2025-11-16T20:22:51.718Z" }, + { url = "https://files.pythonhosted.org/packages/07/1e/99660f5a30fceb58494598e7d15df883a07292346ef5696f0c0ae5dee8c6/ruamel_yaml_clib-0.2.15-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fd4c928ddf6bce586285daa6d90680b9c291cfd045fc40aad34e445d57b1bf51", size = 766619, upload-time = "2025-11-16T16:13:39.178Z" }, + { url = "https://files.pythonhosted.org/packages/36/2f/fa0344a9327b58b54970e56a27b32416ffbcfe4dcc0700605516708579b2/ruamel_yaml_clib-0.2.15-cp313-cp313-win32.whl", hash = "sha256:bf0846d629e160223805db9fe8cc7aec16aaa11a07310c50c8c7164efa440aec", size = 100171, upload-time = "2025-11-16T16:13:40.456Z" }, + { url = "https://files.pythonhosted.org/packages/06/c4/c124fbcef0684fcf3c9b72374c2a8c35c94464d8694c50f37eef27f5a145/ruamel_yaml_clib-0.2.15-cp313-cp313-win_amd64.whl", hash = "sha256:45702dfbea1420ba3450bb3dd9a80b33f0badd57539c6aac09f42584303e0db6", size = 118845, upload-time = "2025-11-16T16:13:41.481Z" }, + { url = "https://files.pythonhosted.org/packages/3e/bd/ab8459c8bb759c14a146990bf07f632c1cbec0910d4853feeee4be2ab8bb/ruamel_yaml_clib-0.2.15-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:753faf20b3a5906faf1fc50e4ddb8c074cb9b251e00b14c18b28492f933ac8ef", size = 147248, upload-time = "2025-11-16T16:13:42.872Z" }, + { url = "https://files.pythonhosted.org/packages/69/f2/c4cec0a30f1955510fde498aac451d2e52b24afdbcb00204d3a951b772c3/ruamel_yaml_clib-0.2.15-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:480894aee0b29752560a9de46c0e5f84a82602f2bc5c6cde8db9a345319acfdf", size = 133764, upload-time = "2025-11-16T16:13:43.932Z" }, + { url = "https://files.pythonhosted.org/packages/82/c7/2480d062281385a2ea4f7cc9476712446e0c548cd74090bff92b4b49e898/ruamel_yaml_clib-0.2.15-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:4d3b58ab2454b4747442ac76fab66739c72b1e2bb9bd173d7694b9f9dbc9c000", size = 730537, upload-time = "2025-11-16T20:22:52.918Z" }, + { url = "https://files.pythonhosted.org/packages/75/08/e365ee305367559f57ba6179d836ecc3d31c7d3fdff2a40ebf6c32823a1f/ruamel_yaml_clib-0.2.15-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bfd309b316228acecfa30670c3887dcedf9b7a44ea39e2101e75d2654522acd4", size = 746944, upload-time = "2025-11-16T16:13:45.338Z" }, + { url = "https://files.pythonhosted.org/packages/a1/5c/8b56b08db91e569d0a4fbfa3e492ed2026081bdd7e892f63ba1c88a2f548/ruamel_yaml_clib-0.2.15-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2812ff359ec1f30129b62372e5f22a52936fac13d5d21e70373dbca5d64bb97c", size = 778249, upload-time = "2025-11-16T16:13:46.871Z" }, + { url = "https://files.pythonhosted.org/packages/6a/1d/70dbda370bd0e1a92942754c873bd28f513da6198127d1736fa98bb2a16f/ruamel_yaml_clib-0.2.15-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7e74ea87307303ba91073b63e67f2c667e93f05a8c63079ee5b7a5c8d0d7b043", size = 737140, upload-time = "2025-11-16T16:13:48.349Z" }, + { url = "https://files.pythonhosted.org/packages/5b/87/822d95874216922e1120afb9d3fafa795a18fdd0c444f5c4c382f6dac761/ruamel_yaml_clib-0.2.15-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:713cd68af9dfbe0bb588e144a61aad8dcc00ef92a82d2e87183ca662d242f524", size = 741070, upload-time = "2025-11-16T20:22:54.151Z" }, + { url = "https://files.pythonhosted.org/packages/b9/17/4e01a602693b572149f92c983c1f25bd608df02c3f5cf50fd1f94e124a59/ruamel_yaml_clib-0.2.15-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:542d77b72786a35563f97069b9379ce762944e67055bea293480f7734b2c7e5e", size = 765882, upload-time = "2025-11-16T16:13:49.526Z" }, + { url = "https://files.pythonhosted.org/packages/9f/17/7999399081d39ebb79e807314de6b611e1d1374458924eb2a489c01fc5ad/ruamel_yaml_clib-0.2.15-cp314-cp314-win32.whl", hash = "sha256:424ead8cef3939d690c4b5c85ef5b52155a231ff8b252961b6516ed7cf05f6aa", size = 102567, upload-time = "2025-11-16T16:13:50.78Z" }, + { url = "https://files.pythonhosted.org/packages/d2/67/be582a7370fdc9e6846c5be4888a530dcadd055eef5b932e0e85c33c7d73/ruamel_yaml_clib-0.2.15-cp314-cp314-win_amd64.whl", hash = "sha256:ac9b8d5fa4bb7fd2917ab5027f60d4234345fd366fe39aa711d5dca090aa1467", size = 122847, upload-time = "2025-11-16T16:13:51.807Z" }, +] + +[[package]] +name = "s3transfer" +version = "0.19.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "botocore" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/65/da/4bef7ce7bb989b222aa4785a413896dbec53306dfc59c6ce7d16a7ffbd6a/s3transfer-0.19.1.tar.gz", hash = "sha256:d3d6371dc3f1e5c5427b2b457bcf13bcf87bec334c95aed18642eae61f6926f3", size = 165354, upload-time = "2026-07-10T19:32:04.849Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/24/23/e84c64ad0e8bc59cd1b2ef98def848deff0ef3456c542afe74d51e9e8c85/s3transfer-0.19.1-py3-none-any.whl", hash = "sha256:d5fd7005ee39307455ad5f310b5ea67f4b1960d7fed5b3671ee50c249de675de", size = 90072, upload-time = "2026-07-10T19:32:03.673Z" }, +] + +[[package]] +name = "shellingham" +version = "1.5.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310, upload-time = "2023-10-24T04:13:40.426Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755, upload-time = "2023-10-24T04:13:38.866Z" }, +] + +[[package]] +name = "six" +version = "1.17.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload-time = "2024-12-04T17:35:28.174Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" }, +] + +[[package]] +name = "sqlglot" +version = "30.12.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/43/ed/a6c45aec29353b6392ea34548c40af3ac6ffd6bc5572cf23b2ce250876fc/sqlglot-30.12.0.tar.gz", hash = "sha256:6b8369704662d4f654bc934cea4dd31c916c2a571b389210cb9e951a275e5fd9", size = 5905110, upload-time = "2026-06-26T14:09:40.408Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/db/9e/82a390ecc85f066ff80affa01d195f744e3de60ad4d695b8de31c9a66da3/sqlglot-30.12.0-py3-none-any.whl", hash = "sha256:86cccc610073c645c03e72b55b60ae0518aa3253a7fc3bd56551370d003c6554", size = 707583, upload-time = "2026-06-26T14:09:38.525Z" }, +] + +[[package]] +name = "tqdm" +version = "4.68.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ae/5f/57ff8b434839e70dab45601284ea413e947a63799891b7553e5960a793a8/tqdm-4.68.4.tar.gz", hash = "sha256:19829c9673638f2a0b8617da4cdcb927e831cd88bcfcb6e78d42a4d1af131520", size = 792418, upload-time = "2026-07-07T09:58:18.369Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/22/2a/5e5e750890ada51017d18d0d4c30da696e5b5bd3180947729927628fc3cb/tqdm-4.68.4-py3-none-any.whl", hash = "sha256:5168118b2368f48c561afda8020fd79195b1bdb0bdf8086b88442c267a315dc2", size = 676612, upload-time = "2026-07-07T09:58:16.256Z" }, +] + +[[package]] +name = "tree-sitter" +version = "0.26.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f7/03/5600b84aff2e6c4fe80cfebb4063fe2f50299521befe5f6092ab8c082f4a/tree_sitter-0.26.0.tar.gz", hash = "sha256:b40c219edccc4564530c96f8f1556f6202b37cda964d1cbd7bd2b7e68b40a245", size = 191423, upload-time = "2026-06-30T12:14:27.933Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a4/2f/201c33ea65875d8e4ec73e4d1949718ec49780d84c0adf19793ef75d99a2/tree_sitter-0.26.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ff527388df14cb5009f9274faf78cc69a7393ae6acf3b04784b8acca249519c5", size = 148676, upload-time = "2026-06-30T12:13:42.718Z" }, + { url = "https://files.pythonhosted.org/packages/9e/db/05b9d45dd2b9827bf91b6819e749227ca6d686d58658292c0f149294b18e/tree_sitter-0.26.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7bcbadfa614326debef581957d5c780a9d7f66065c13deea61aa21d1dd36263f", size = 140757, upload-time = "2026-06-30T12:13:44.007Z" }, + { url = "https://files.pythonhosted.org/packages/b9/08/1e1da65c1585b8d70130b26d65b41a71737ab623c1fab1008479c2b95b50/tree_sitter-0.26.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2f941cea06128c1f74f8937a8e2a90c7db49cf4be6647cd9e07d92a306d91517", size = 631526, upload-time = "2026-06-30T12:13:45.008Z" }, + { url = "https://files.pythonhosted.org/packages/b0/b7/06353044a80ee58a71e884b4a9b2913705849d81025d87308abdfef8f883/tree_sitter-0.26.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e9e46b664887d8c1014f1fb33e09454bbdd9ec1fe29b7fd02dde7b46bc1bb81a", size = 658688, upload-time = "2026-06-30T12:13:46.491Z" }, + { url = "https://files.pythonhosted.org/packages/df/56/c4b22ccbc4f89ae507c0b76e29f363ad4f16eb38c43f7392b3eb9afec64e/tree_sitter-0.26.0-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:763627db05db34f12333081bd7422cc1c675893d373cc870b3e9249e200700e4", size = 644399, upload-time = "2026-06-30T12:13:47.719Z" }, + { url = "https://files.pythonhosted.org/packages/b5/b7/6b3f0192d5b9b49a199cb0dcd5e45dd1327a82c52c80a49edd790e3a2d9b/tree_sitter-0.26.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:17a1c5cfd3a05d5c7c86bf4282b6ef8092c91dc0a98390499669c3fedb7d1814", size = 655316, upload-time = "2026-06-30T12:13:49.03Z" }, + { url = "https://files.pythonhosted.org/packages/a5/6b/f7475c8f8d699671c2a80c3ed16f5cddd161280c6ed5b845117179c66075/tree_sitter-0.26.0-cp310-cp310-win_amd64.whl", hash = "sha256:f289be0225ba2ace8e87d6c9639b2bc9ff2b5271afb7c5d39282a4a00e248682", size = 129494, upload-time = "2026-06-30T12:13:50.242Z" }, + { url = "https://files.pythonhosted.org/packages/f6/20/0df8dd708638cba7ef875fff4ce80122af7f604f1f0b566de2164108bc01/tree_sitter-0.26.0-cp310-cp310-win_arm64.whl", hash = "sha256:526a165a2cb1d1f79e247d400f0e0acd8d49a817d6f312d543513af200b1f886", size = 116486, upload-time = "2026-06-30T12:13:51.21Z" }, + { url = "https://files.pythonhosted.org/packages/41/18/78aae7e4b5a36daaebb0276e4b07d084d45298758000787838e89329e11f/tree_sitter-0.26.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1d6fe0e8fb4df77b5ee816228e2c4475a63d8cc1d4d3a7ffd7097b2b87fc3e95", size = 148679, upload-time = "2026-06-30T12:13:52.27Z" }, + { url = "https://files.pythonhosted.org/packages/24/e4/b371b9553b0e47d130fc2073e56cab94fecc868be04666bf5bbd1fcd1cc9/tree_sitter-0.26.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:514a9bf8993e5210e7970736aaf6020d1759b670e195ef17b1c48f586aa30736", size = 140759, upload-time = "2026-06-30T12:13:53.221Z" }, + { url = "https://files.pythonhosted.org/packages/22/7d/266fb0f2c41e6fb00b0f40e7a3338cdf99651e6a6511ca72bc78fc697636/tree_sitter-0.26.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:10f0d4eb94aa7242dcb7f554bcd24dd7ba1c114f00d58759ba08c7a46c8ec51a", size = 637206, upload-time = "2026-06-30T12:13:54.334Z" }, + { url = "https://files.pythonhosted.org/packages/40/9f/47cf22febb47132d5b3a507a27bb99ef89fe5c8ec420a13c6daa9b64f782/tree_sitter-0.26.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:335294ce0504fcefde5245dff596778ffaf820205b98ae0b549c72e48855f1d8", size = 664758, upload-time = "2026-06-30T12:13:55.42Z" }, + { url = "https://files.pythonhosted.org/packages/4c/4d/8d144ca3beb46a62a5102b6deac76bb0da55235c2c7840faf3b12f2e9d97/tree_sitter-0.26.0-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f9997ba61368c48ed54e715676afadf703947a1542464e39d047764fb3624b01", size = 647438, upload-time = "2026-06-30T12:13:56.523Z" }, + { url = "https://files.pythonhosted.org/packages/4d/ed/ed1d6e78520c4fb64ed52fec3f2947bf8c1fbad7bc24e282c56193c9ba42/tree_sitter-0.26.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c56581ad256c4195a21bfe449fed5d44a02fe83a4a7d6e70e6ec302c881191c7", size = 661944, upload-time = "2026-06-30T12:13:57.82Z" }, + { url = "https://files.pythonhosted.org/packages/10/83/45f5bd43db1b8248d2fd08ef6cbe43e2725c539e09a2cfb8bc2818646788/tree_sitter-0.26.0-cp311-cp311-win_amd64.whl", hash = "sha256:0f8793fd18ad7eec276ed4b51c097b4bf2002b357259b66b0d75db1f3f41c754", size = 129496, upload-time = "2026-06-30T12:13:59.216Z" }, + { url = "https://files.pythonhosted.org/packages/f1/8d/be68e6c04563eb54145424cc83fe0aa8b0ba6c90d8989cf8a032671b5f16/tree_sitter-0.26.0-cp311-cp311-win_arm64.whl", hash = "sha256:dea4b4e27d49e9ec5b785d4f994da000e6726882fcc6ad05ec98478500c71aef", size = 116484, upload-time = "2026-06-30T12:14:00.147Z" }, + { url = "https://files.pythonhosted.org/packages/87/ca/565702c44815393e3a973552ad546db4e5ca081ca8698640b4e93d809f51/tree_sitter-0.26.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6cb2bd20efb2544c19ac54486ab7cb8ec7b36f913bbe1ce95df84acb96743d9c", size = 148934, upload-time = "2026-06-30T12:14:01.188Z" }, + { url = "https://files.pythonhosted.org/packages/54/6f/8bb61957f16ec1b1d92410a006cdc84a952b6352a7313b2ad299f2d21484/tree_sitter-0.26.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:918d89529786873f0982a0f59c2a303cd065fbfd1b903d71a8e4e1584f67b42e", size = 140820, upload-time = "2026-06-30T12:14:02.087Z" }, + { url = "https://files.pythonhosted.org/packages/78/0a/8a6f08559182643a814a4ab559948ae817b2851890fd9b995a4fff6541ce/tree_sitter-0.26.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:30a88be89ff1f2755297f81e8080d88b795dd98720c3f9fa2acf93873182cc95", size = 638844, upload-time = "2026-06-30T12:14:03.428Z" }, + { url = "https://files.pythonhosted.org/packages/8a/2f/6e6781b31677231366cb3cf27bc8269157f6d4b03c9032865a4f5f2bbe7e/tree_sitter-0.26.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5a6b333b0282d8bb0af741f9b018bd2523d4eecb2686bf6717066a625fecfaa4", size = 667487, upload-time = "2026-06-30T12:14:04.669Z" }, + { url = "https://files.pythonhosted.org/packages/02/0b/0483078c8567445557a7015b0e5b187f6d7d4fda73464df9c4bdea7f7f3c/tree_sitter-0.26.0-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3f3c44339dd34fe8eb2b8d5aa7610660499a795f70376b130bbee7a437337280", size = 647975, upload-time = "2026-06-30T12:14:05.797Z" }, + { url = "https://files.pythonhosted.org/packages/27/68/da83ca72c984e96ab4eb3bee0db1a6ffb5de1c8c455f92bd9f420cde7f0e/tree_sitter-0.26.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:94550e13b6ae576969da40246f4c4abb206380b5375ad43f26dd9151d55438e3", size = 665018, upload-time = "2026-06-30T12:14:07.278Z" }, + { url = "https://files.pythonhosted.org/packages/d1/36/4d67927fd47b89af4a00f65f55a7370e28778cd50e972c2430487e3ecc27/tree_sitter-0.26.0-cp312-cp312-win_amd64.whl", hash = "sha256:ca89e361a276dbc934b28a43dd881199e25d34ff5493ee0ce45f3c52a6124a37", size = 129619, upload-time = "2026-06-30T12:14:08.373Z" }, + { url = "https://files.pythonhosted.org/packages/ed/72/cdefad523eb78710679c6da6a79e3d90f5afd32b1c6aa5a17bac7eef99f6/tree_sitter-0.26.0-cp312-cp312-win_arm64.whl", hash = "sha256:bc6cb01d5ee75c85424aa1f1c72a82d8f07fd52539a0f3c4a6ed3e8721079b84", size = 116545, upload-time = "2026-06-30T12:14:09.273Z" }, + { url = "https://files.pythonhosted.org/packages/cb/b0/465257cf8f972ad9f9812ec1cbaa8ec210ebebb601ade9a15881aa2436b4/tree_sitter-0.26.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ed0889dbed843ce45ede9f5169c0b2dea2222f12685844a03fadb81f12705867", size = 148893, upload-time = "2026-06-30T12:14:10.541Z" }, + { url = "https://files.pythonhosted.org/packages/a1/ec/19d093e854b45e807fecfdd26105c266f43aeecc39c4dc97992a7074ad5a/tree_sitter-0.26.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6189c6c340c7384357711e3d92645e96bfb79f7a502f86de1ebdb23eb43f7dab", size = 140829, upload-time = "2026-06-30T12:14:11.626Z" }, + { url = "https://files.pythonhosted.org/packages/9b/ee/87e74671ed63a837e7a1f17ab94aa3913871e033b27523d8e7b83d6f7ad0/tree_sitter-0.26.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8ff2e0750b7daa722302838356d7b65e303829b7eb73c915df127ddba115e1d1", size = 639334, upload-time = "2026-06-30T12:14:12.836Z" }, + { url = "https://files.pythonhosted.org/packages/66/e7/f7e04cd9dff6b6ac0adf23922796fbc76accd4cf4bcda50542748d485679/tree_sitter-0.26.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7075ef857ef86f327dbb72d1e2574dda78db5754b3a1fca6506acd7fe5d561a7", size = 668102, upload-time = "2026-06-30T12:14:14.035Z" }, + { url = "https://files.pythonhosted.org/packages/d3/90/0bfb16b7894fea728c774a89d5af421a9368a2f913bbd4e8dcab7caaecfb/tree_sitter-0.26.0-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:26c996c1edfee86e977bb3f5462e74fcec0d0b0db1e85a3c475875763caa03be", size = 648560, upload-time = "2026-06-30T12:14:15.302Z" }, + { url = "https://files.pythonhosted.org/packages/cd/e6/0fe05ba396e9623b0ae40ccf34171336b8701ec8d7bd0ee9f5224d638665/tree_sitter-0.26.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:00289bfe7978f3e0dc0ce69813a20fa9f44ea4c100b3ec62043e5eb74ccfc3a2", size = 665121, upload-time = "2026-06-30T12:14:16.403Z" }, + { url = "https://files.pythonhosted.org/packages/eb/d2/a944b1ca35bed6068dc84a9967aaf3049d8cc0b7a36179eea8787270a6ab/tree_sitter-0.26.0-cp313-cp313-win_amd64.whl", hash = "sha256:93e220cab7e6a823efeb2046c49171427de92ef71c7c681c01820d14d8d3721f", size = 129615, upload-time = "2026-06-30T12:14:17.463Z" }, + { url = "https://files.pythonhosted.org/packages/09/ef/c7ca48293580d2249f36940c4eed5b4ddeb9ce75baf9a4ef30621987e0c7/tree_sitter-0.26.0-cp313-cp313-win_arm64.whl", hash = "sha256:b31a8195d2f224224c530ac814632d98c1dcc123d227442c07c736e86b70d564", size = 116525, upload-time = "2026-06-30T12:14:18.53Z" }, + { url = "https://files.pythonhosted.org/packages/c5/7a/4d84e6f6ae2c3e757490dd84de251712c31e293dfe31f28da1ec019cefa2/tree_sitter-0.26.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:5a3c93a352b7e6f70f73e121bbfa2d0117ba7478bd51114ed35c91b0b78814fa", size = 148901, upload-time = "2026-06-30T12:14:19.452Z" }, + { url = "https://files.pythonhosted.org/packages/b0/d9/efe62ec65dc9d096e834d27b8c058127e2146e42ff3380b822a233f016a6/tree_sitter-0.26.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:5fc2f41bf246ff2f70a9cc3690be35ec7580a4923151873d898c8bcb1a4503d3", size = 140805, upload-time = "2026-06-30T12:14:20.478Z" }, + { url = "https://files.pythonhosted.org/packages/c4/2c/c82326b7b97e3c485c18679883b16f89e5e913c639d3b219d3da70c9e67e/tree_sitter-0.26.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b8ea92a255c91671a7ec4625aba3ab7bb5220c423630ffbf83c45d7312abe084", size = 640586, upload-time = "2026-06-30T12:14:21.527Z" }, + { url = "https://files.pythonhosted.org/packages/e2/7a/f56e7d8282859452611024c7cbc623bfba5b24b8cb9b8f8bc88c5219fe9a/tree_sitter-0.26.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f665510f0fcf4636fb9696f1f7853bed7a3bd764b7bb0cb8494e619c14ed5a0c", size = 668300, upload-time = "2026-06-30T12:14:22.728Z" }, + { url = "https://files.pythonhosted.org/packages/91/51/240ee81b9d5e9ca0a6cb1528e8605ffa70ab58c89ce126631be96d3e4bae/tree_sitter-0.26.0-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:253df7ab82cc0a9d311cd65f06e9f99fb3eac55996ae9fc94da22f123a861b90", size = 649627, upload-time = "2026-06-30T12:14:23.819Z" }, + { url = "https://files.pythonhosted.org/packages/6a/54/760035cefedf9eb44f0f84c4ac22f1322e73155853e272576ee876336312/tree_sitter-0.26.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:ff80d4833d330a73184a3ac5132abe93c575d2dea31975c6f15c0d21fef238aa", size = 664885, upload-time = "2026-06-30T12:14:25.064Z" }, + { url = "https://files.pythonhosted.org/packages/c9/1b/0b36fe2a984ecedc4ce6aefd5d56447a6626a8e9b595c4e48658510ce8f8/tree_sitter-0.26.0-cp314-cp314-win_amd64.whl", hash = "sha256:a4033fecc8f606c7f2e8b8014d0057b74668a7f0152763606f7bc25c5f9ec64c", size = 132688, upload-time = "2026-06-30T12:14:26.106Z" }, + { url = "https://files.pythonhosted.org/packages/4d/74/ebc041a13fbf40144afdb0d4b447e48e0b4012ca866c63de8b48f801f0c1/tree_sitter-0.26.0-cp314-cp314-win_arm64.whl", hash = "sha256:823251c4b6725a7c03ed497a339135ede7ae4bdde75bb8be7ef5e305aeb4ff52", size = 120287, upload-time = "2026-06-30T12:14:26.991Z" }, +] + +[[package]] +name = "tree-sitter-language-pack" +version = "1.12.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "tree-sitter" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/87/d0/06624b30acf3100ed663d604ac893882beafde603971e76f1160808ae02c/tree_sitter_language_pack-1.12.5.tar.gz", hash = "sha256:e6ca8fd7f1cc24496f2fff73156d0ce20284ce56e18a84f4c0c10388a1e4c951", size = 81955, upload-time = "2026-07-07T12:58:02.012Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/be/b9/015240f1e091f0d7608582e2930b62580839f4b3e94b5813bc1894017cf3/tree_sitter_language_pack-1.12.5-cp310-abi3-macosx_10_12_x86_64.whl", hash = "sha256:c3613f26f1660d757626b50e2f7fd50ce269193ec9e8e0ad699ae47bf03fd664", size = 2140086, upload-time = "2026-07-07T12:57:53.574Z" }, + { url = "https://files.pythonhosted.org/packages/08/fd/8ca53b11ea1058c920944b52b41c4c4d96ccf67c62b15174f6d3d2a0126f/tree_sitter_language_pack-1.12.5-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:30010156a06179e7c179ae51ba6f2da148bd0bc364f750bcc5ef81ab1c4e0c53", size = 2031270, upload-time = "2026-07-07T12:57:55.165Z" }, + { url = "https://files.pythonhosted.org/packages/03/e1/af79d0d302f1f47f190fd1f09146a6e5f88a32a7c0d0759820d7ca9aafc3/tree_sitter_language_pack-1.12.5-cp310-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:1609b9cc2518e4657f6ef80a8ac533a8f5a04d4a74135d744fb171eca434e6eb", size = 2189197, upload-time = "2026-07-07T12:57:56.37Z" }, + { url = "https://files.pythonhosted.org/packages/25/da/6e3db4ad85802747ead34f46f402508d796cd11be65b79d6ba6d76281a3f/tree_sitter_language_pack-1.12.5-cp310-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:de5ec0c1b184176443fc6093f07fe5a1c403ee51ec8593bde372bd5960819941", size = 2299397, upload-time = "2026-07-07T12:57:58.087Z" }, + { url = "https://files.pythonhosted.org/packages/19/fb/ac271b8013ff4f386ddce86cab080b8c6352d3efa45e8b2285d246eed318/tree_sitter_language_pack-1.12.5-cp310-abi3-win_amd64.whl", hash = "sha256:eb58ecee144247d8cde52a567bbe5c6f950ed1d2c416295e00f0e31389f1751e", size = 2073479, upload-time = "2026-07-07T12:57:59.491Z" }, + { url = "https://files.pythonhosted.org/packages/79/80/fbe56f84daec7fec163023f6e8865969e8873ec42b85241c750953320e1f/tree_sitter_language_pack-1.12.5-cp310-abi3-win_arm64.whl", hash = "sha256:41399bdd45eb4ced5840ddf1d44aa02fe69763c867bd7286aa20d182bfe397af", size = 1984602, upload-time = "2026-07-07T12:58:00.918Z" }, +] + +[[package]] +name = "truststore" +version = "0.10.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/53/a3/1585216310e344e8102c22482f6060c7a6ea0322b63e026372e6dcefcfd6/truststore-0.10.4.tar.gz", hash = "sha256:9d91bd436463ad5e4ee4aba766628dd6cd7010cf3e2461756b3303710eebc301", size = 26169, upload-time = "2025-08-12T18:49:02.73Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/19/97/56608b2249fe206a67cd573bc93cd9896e1efb9e98bce9c163bcdc704b88/truststore-0.10.4-py3-none-any.whl", hash = "sha256:adaeaecf1cbb5f4de3b1959b42d41f6fab57b2b1666adb59e89cb0b53361d981", size = 18660, upload-time = "2025-08-12T18:49:01.46Z" }, +] + +[[package]] +name = "typer" +version = "0.26.8" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "annotated-doc" }, + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "rich" }, + { name = "shellingham" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7c/f7/68adc395201b20b872d68e975386832e8005ffeacedd43a1d837a32815be/typer-0.26.8.tar.gz", hash = "sha256:c244a6bd558886fe3f8780efb6bdd28bb9aff005a94eedebaa5cb32926fe2f7e", size = 202097, upload-time = "2026-06-26T09:22:45.705Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/80/87/b9fd69c92c6102a066e1b86a35243f53e70bd4c709f2a26d9f4fee4f4dc0/typer-0.26.8-py3-none-any.whl", hash = "sha256:3512ca79ac5c11113414b36e80281b872884477722440691c89d1112e321a49c", size = 122564, upload-time = "2026-06-26T09:22:44.72Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f6/cc/6253133b5bb138fc3306cebfbda2c520f545d36b5be2c7255cc528bb45d6/typing_extensions-4.16.0.tar.gz", hash = "sha256:dc983d19a509c94dba722ee6abd33940f7c05a89e243c47e907eb4db6f1a43e5", size = 113555, upload-time = "2026-07-02T08:40:05.92Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/49/d3/b8441a820a491ddfc024b0b0cf0393375b75ea13866d9c66727e54c2fc80/typing_extensions-4.16.0-py3-none-any.whl", hash = "sha256:481caa481374e813c1b176ada14e97f1f67a4539ce9cfeb3f350d78d6370c2e8", size = 45571, upload-time = "2026-07-02T08:40:04.659Z" }, +] + +[[package]] +name = "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.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/92/ff/5a28bdfd8c3ebec42564ac7d0e54ca3db65044a9314a97f9564fa7a1e926/tzdata-2026.3.tar.gz", hash = "sha256:4a1518b8993086a7982523e071643f3c0e5f213e75b21318e78bcabfff9d1415", size = 198674, upload-time = "2026-07-10T08:50:37.887Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e5/6d/b53b99a9f2766d095985947a5782f1702cabb129a34f7a802d7197af832f/tzdata-2026.3-py2.py3-none-any.whl", hash = "sha256:dc096730c87af6cab1b171c9d532be840741ff5d459015e7f6947bd7d7e54931", size = 348168, upload-time = "2026-07-10T08:50:36.46Z" }, +] + +[[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 = "zipp" +version = "4.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b9/d8/eab98a517c14134c0b2eb4e2387bc5f457334293ec5d2dd3857ec2966802/zipp-4.1.0.tar.gz", hash = "sha256:4cb57381f544315db7688e976e922a2b18cdb513d21cc194eb42232ba2a3e602", size = 26214, upload-time = "2026-05-18T20:08:57.967Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3a/13/547360d81e6d88d58492968ffda9f9542854f11310ee556fef14260cc886/zipp-4.1.0-py3-none-any.whl", hash = "sha256:25ad4e16390cd314347dd8f1de67a2ac538ae658ed4ab9db16029c07c188e97f", size = 10238, upload-time = "2026-05-18T20:08:57.045Z" }, +]