From 92153c57f0201f6400f17b0cc9a032052b0543f3 Mon Sep 17 00:00:00 2001 From: Sean-Michael Date: Wed, 27 May 2026 12:54:47 -0700 Subject: [PATCH 1/2] Build Bellingham Tidal Observatory: FastAPI + Vite/React/TS MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replace the starter stub with a full tides dashboard scaffolded to mirror the navigator project's structure (clean FastAPI backend on uv, Vite/React/TS frontend, multi-stage Dockerfile, docker-compose dev stack, CI). Backend (backend/): async noaa_coops wrapper with TTL cache, half-cosine interpolation between real NOAA hi/lo predictions, astral sun/moon, and a /api/bootstrap endpoint serving 6 Bellingham Bay / San Juan stations. Tests cover the tide math, API shape, health, and static SPA serving. Frontend (frontend/): the Grafana/Ganglia-style "Tides Tracker" dashboard from the design handoff — glacier sidebar, KPI strip, station grid (density/sort/ group), focus drilldown with an interactive SVG chart, compare overlay, tweaks panel, and keyboard shortcuts. --- .dockerignore | 10 + .github/workflows/ci.yml | 100 + .gitignore | 15 + Dockerfile | 28 + README.md | 75 +- backend/.env.example | 10 + .python-version => backend/.python-version | 0 backend/Dockerfile.dev | 12 + backend/app/__init__.py | 0 backend/app/api.py | 115 + backend/app/astro.py | 63 + backend/app/config.py | 24 + backend/app/main.py | 46 + backend/app/noaa.py | 68 + backend/app/stations.py | 92 + backend/app/tides.py | 105 + backend/pyproject.toml | 23 + backend/tests/__init__.py | 0 backend/tests/conftest.py | 29 + backend/tests/test_api.py | 49 + backend/tests/test_health.py | 13 + backend/tests/test_static.py | 32 + backend/tests/test_tides.py | 56 + backend/uv.lock | 955 +++++ docker-compose.yml | 32 + frontend/.gitignore | 15 + frontend/Dockerfile.dev | 17 + frontend/eslint.config.js | 22 + frontend/index.html | 19 + frontend/package-lock.json | 3905 ++++++++++++++++++++ frontend/package.json | 39 + frontend/public/favicon.svg | 6 + frontend/public/shuksan-close.jpg | Bin 0 -> 230624 bytes frontend/src/App.tsx | 41 + frontend/src/Dashboard.tsx | 194 + frontend/src/api.ts | 20 + frontend/src/components/Charts.tsx | 302 ++ frontend/src/components/ComparePanel.tsx | 46 + frontend/src/components/FocusPanel.tsx | 211 ++ frontend/src/components/KpiStrip.tsx | 49 + frontend/src/components/Sidebar.tsx | 90 + frontend/src/components/StationTile.tsx | 98 + frontend/src/components/Toolbar.tsx | 129 + frontend/src/components/Tweaks.tsx | 110 + frontend/src/main.tsx | 13 + frontend/src/styles/glacier.css | 184 + frontend/src/styles/tides.css | 857 +++++ frontend/src/styles/tokens.css | 39 + frontend/src/styles/tweaks.css | 146 + frontend/src/test/setup.ts | 8 + frontend/src/tides.test.ts | 51 + frontend/src/tides.ts | 146 + frontend/src/types.ts | 39 + frontend/tsconfig.app.json | 25 + frontend/tsconfig.json | 7 + frontend/tsconfig.node.json | 24 + frontend/vite.config.ts | 24 + main.py | 14 - pyproject.toml | 9 - uv.lock | 113 - 60 files changed, 8827 insertions(+), 137 deletions(-) create mode 100644 .dockerignore create mode 100644 .github/workflows/ci.yml create mode 100644 Dockerfile create mode 100644 backend/.env.example rename .python-version => backend/.python-version (100%) create mode 100644 backend/Dockerfile.dev create mode 100644 backend/app/__init__.py create mode 100644 backend/app/api.py create mode 100644 backend/app/astro.py create mode 100644 backend/app/config.py create mode 100644 backend/app/main.py create mode 100644 backend/app/noaa.py create mode 100644 backend/app/stations.py create mode 100644 backend/app/tides.py create mode 100644 backend/pyproject.toml create mode 100644 backend/tests/__init__.py create mode 100644 backend/tests/conftest.py create mode 100644 backend/tests/test_api.py create mode 100644 backend/tests/test_health.py create mode 100644 backend/tests/test_static.py create mode 100644 backend/tests/test_tides.py create mode 100644 backend/uv.lock create mode 100644 docker-compose.yml create mode 100644 frontend/.gitignore create mode 100644 frontend/Dockerfile.dev create mode 100644 frontend/eslint.config.js create mode 100644 frontend/index.html create mode 100644 frontend/package-lock.json create mode 100644 frontend/package.json create mode 100644 frontend/public/favicon.svg create mode 100644 frontend/public/shuksan-close.jpg create mode 100644 frontend/src/App.tsx create mode 100644 frontend/src/Dashboard.tsx create mode 100644 frontend/src/api.ts create mode 100644 frontend/src/components/Charts.tsx create mode 100644 frontend/src/components/ComparePanel.tsx create mode 100644 frontend/src/components/FocusPanel.tsx create mode 100644 frontend/src/components/KpiStrip.tsx create mode 100644 frontend/src/components/Sidebar.tsx create mode 100644 frontend/src/components/StationTile.tsx create mode 100644 frontend/src/components/Toolbar.tsx create mode 100644 frontend/src/components/Tweaks.tsx create mode 100644 frontend/src/main.tsx create mode 100644 frontend/src/styles/glacier.css create mode 100644 frontend/src/styles/tides.css create mode 100644 frontend/src/styles/tokens.css create mode 100644 frontend/src/styles/tweaks.css create mode 100644 frontend/src/test/setup.ts create mode 100644 frontend/src/tides.test.ts create mode 100644 frontend/src/tides.ts create mode 100644 frontend/src/types.ts create mode 100644 frontend/tsconfig.app.json create mode 100644 frontend/tsconfig.json create mode 100644 frontend/tsconfig.node.json create mode 100644 frontend/vite.config.ts delete mode 100644 main.py delete mode 100644 pyproject.toml delete mode 100644 uv.lock diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..8f90a03 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,10 @@ +**/node_modules +**/dist +**/.venv +**/__pycache__ +**/*.pyc +.git +.github +.design_tmp +**/.env +frontend/.vite diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..75245ef --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,100 @@ +name: CI + +on: + push: + branches: [main] + pull_request: + +jobs: + backend: + name: Backend (lint + test) + runs-on: ubuntu-latest + defaults: + run: + working-directory: backend + steps: + - uses: actions/checkout@v4 + + - name: Install uv + uses: astral-sh/setup-uv@v5 + with: + enable-cache: true + + - name: Sync dependencies + run: uv sync --frozen + + - name: Lint (ruff) + run: | + uv run ruff check . + uv run ruff format --check . + + - name: Test (pytest) + run: uv run pytest + + frontend: + name: Frontend (lint + test + build) + runs-on: ubuntu-latest + defaults: + run: + working-directory: frontend + steps: + - uses: actions/checkout@v4 + + - uses: actions/setup-node@v4 + with: + node-version: 22 + cache: npm + cache-dependency-path: frontend/package-lock.json + + - name: Install dependencies + run: npm ci + + - name: Lint (eslint) + run: npm run lint + + - name: Test (vitest) + run: npm test + + - name: Build + run: npm run build + + container-scan: + name: Scan ${{ matrix.name }} image (grype) + runs-on: ubuntu-latest + needs: [backend, frontend] + strategy: + fail-fast: false + matrix: + include: + - name: prod + context: . + dockerfile: Dockerfile + - name: backend-dev + context: ./backend + dockerfile: backend/Dockerfile.dev + - name: frontend-dev + context: ./frontend + dockerfile: frontend/Dockerfile.dev + steps: + - uses: actions/checkout@v4 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Build image + uses: docker/build-push-action@v6 + with: + context: ${{ matrix.context }} + file: ${{ matrix.dockerfile }} + tags: bto-${{ matrix.name }}:ci + load: true + cache-from: type=gha + cache-to: type=gha,mode=max + + - name: Scan image with Grype + uses: anchore/scan-action@v6 + with: + image: bto-${{ matrix.name }}:ci + fail-build: true + severity-cutoff: high + only-fixed: true diff --git a/.gitignore b/.gitignore index 83972fa..1365444 100644 --- a/.gitignore +++ b/.gitignore @@ -216,3 +216,18 @@ __marimo__/ # Streamlit .streamlit/secrets.toml + +# Node / frontend +node_modules/ +frontend/dist/ +frontend/.vite/ +*.local + +# Design handoff bundle (local only) +.design_tmp/ + +# Env / secrets +.env + +# Local Claude config (machine-specific) +.claude/ diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..3966142 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,28 @@ +# syntax=docker/dockerfile:1 + +# --- Stage 1: build the frontend --- +FROM node:22-slim AS frontend +WORKDIR /frontend +COPY frontend/package.json frontend/package-lock.json ./ +RUN npm ci +COPY frontend/ ./ +RUN npm run build + +# --- Stage 2: backend runtime --- +FROM python:3.13-slim AS backend +COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/ + +WORKDIR /app + +# Install dependencies first for better layer caching. +COPY backend/pyproject.toml backend/uv.lock ./ +RUN uv sync --frozen --no-dev --no-install-project + +COPY backend/ ./ + +# Built frontend served as static files by FastAPI. +COPY --from=frontend /frontend/dist ./static +ENV BTO_STATIC_DIR=/app/static + +EXPOSE 8000 +CMD ["uv", "run", "--no-dev", "uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"] diff --git a/README.md b/README.md index 5f21f9f..ae10fbd 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,79 @@ # Bellingham Tidal Observatory (BTO) -This is application gathers data from the [NOAA CO-OPS API](https://api.tidesandcurrents.noaa.gov/api/prod/) for visualizing the waters of the Bellingham Bay across different stations. +A Grafana/Ganglia-style dashboard for the tides of the inner Salish Sea. It pulls +real hi/lo predictions from the [NOAA CO-OPS API](https://api.tidesandcurrents.noaa.gov/api/prod/) +for the Bellingham Bay / San Juan stations, interpolates a smooth tide curve, and +renders a dense, customizable observatory view (station grid, focus drilldown, +compare overlay, time ranges, density, grouping). + +- **Frontend** — React + TypeScript + Vite (`frontend/`) +- **Backend** — FastAPI on a `uv` environment, wrapping `noaa_coops` (`backend/`) + +## Development + +### With Docker Compose (recommended) + +Runs both services with hot-reload: + +```bash +docker compose up --build +``` + +- UI: http://localhost:5173 +- API: http://localhost:8000 + +### Without Docker + +Backend: + +```bash +cd backend +uv run uvicorn app.main:app --reload +``` + +Frontend (separate terminal): + +```bash +cd frontend +npm install +npm run dev +``` + +The Vite dev server proxies `/api` to the backend on port 8000. + +## Production build + +The root [Dockerfile](Dockerfile) builds the frontend and serves it as static +files from FastAPI in a single container: + +```bash +docker build -t bto . +docker run -p 8000:8000 bto +``` + +The app is then available at http://localhost:8000. + +## Configuration + +Backend settings come from `backend/.env` (all prefixed `BTO_`). Copy the example: + +```bash +cp backend/.env.example backend/.env +``` + +| Variable | Description | +| ------------------ | ------------------------------------------------------ | +| `BTO_STATIC_DIR` | Path to the built frontend; serves the UI when set. | +| `BTO_CORS_ORIGINS` | Allowed CORS origins (JSON list). | +| `BTO_CACHE_TTL` | Seconds to cache NOAA prediction responses in-memory. | + +## Data notes + +The tide curve is built by half-cosine interpolation between **real NOAA hi/lo +predictions** (reliable across both harmonic and subordinate stations). Sun/moon +facts are computed with `astral`. NOAA's prediction feed has no solunar or +per-station weather data, so the focus panel's secondary slots show real +sun/moon and station metadata rather than the prototype's invented values. ## Stations List diff --git a/backend/.env.example b/backend/.env.example new file mode 100644 index 0000000..4930369 --- /dev/null +++ b/backend/.env.example @@ -0,0 +1,10 @@ +# Copy to .env and fill in. All vars are prefixed BTO_. + +# Path to the built frontend (dist/). Leave unset in dev — Vite serves the UI. +# BTO_STATIC_DIR=/app/static + +# Allowed CORS origins in dev (JSON list). +# BTO_CORS_ORIGINS=["http://localhost:5173"] + +# Seconds to cache NOAA prediction responses in-memory. +# BTO_CACHE_TTL=900 diff --git a/.python-version b/backend/.python-version similarity index 100% rename from .python-version rename to backend/.python-version diff --git a/backend/Dockerfile.dev b/backend/Dockerfile.dev new file mode 100644 index 0000000..0b71e73 --- /dev/null +++ b/backend/Dockerfile.dev @@ -0,0 +1,12 @@ +# syntax=docker/dockerfile:1 +# Development image: deps baked in, source mounted at runtime for --reload. +FROM python:3.13-slim +COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/ + +WORKDIR /app + +COPY pyproject.toml uv.lock ./ +RUN uv sync --frozen --no-install-project + +EXPOSE 8000 +CMD ["uv", "run", "uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000", "--reload"] diff --git a/backend/app/__init__.py b/backend/app/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/backend/app/api.py b/backend/app/api.py new file mode 100644 index 0000000..8318050 --- /dev/null +++ b/backend/app/api.py @@ -0,0 +1,115 @@ +"""Bellingham Tidal Observatory REST API. + +A single ``/api/bootstrap`` call returns everything the dashboard needs: station +metadata plus real NOAA hi/lo predictions (extrema) spanning a wide window, plus +sun/moon facts. The frontend interpolates the smooth tide curve from those +extrema client-side, so range/density/hover changes need no further round trips. +""" + +from __future__ import annotations + +import asyncio +from datetime import datetime, timedelta +from typing import Any +from zoneinfo import ZoneInfo + +from fastapi import APIRouter, HTTPException + +from app import astro, noaa, stations + +router = APIRouter(prefix="/api") + +_TZ = ZoneInfo("America/Los_Angeles") + +# How far around "now" to fetch hi/lo predictions — wide enough to cover the +# dashboard's longest range (30D) panned either direction. +_PAST_DAYS = 20 +_FUTURE_DAYS = 20 + + +def _epoch_ms(dt: datetime) -> int: + # NOAA lst_ldt times are Pacific wall-clock but tz-naive; localize them. + if dt.tzinfo is None: + dt = dt.replace(tzinfo=_TZ) + return int(dt.timestamp() * 1000) + + +def _serialize_extrema(extrema: list[noaa.Extremum]) -> list[dict[str, Any]]: + return [ + {"t": _epoch_ms(e.t), "height": round(e.height, 3), "kind": e.kind} + for e in extrema + ] + + +async def _station_payload(s: stations.Station, begin: str, end: str) -> dict[str, Any]: + extrema = await noaa.fetch_extrema(s.id, begin, end) + return { + "id": s.id, + "code": s.code, + "name": s.name, + "area": s.area, + "lat": s.lat, + "lon": s.lon, + "predictions": s.predictions, + "group": s.group, + "extrema": _serialize_extrema(extrema), + } + + +async def _bootstrap() -> dict[str, Any]: + now = datetime.now(_TZ) + begin = (now - timedelta(days=_PAST_DAYS)).strftime("%Y%m%d") + end = (now + timedelta(days=_FUTURE_DAYS)).strftime("%Y%m%d") + + payloads = await asyncio.gather( + *(_station_payload(s, begin, end) for s in stations.STATIONS) + ) + + sm = astro.sun_moon(now.date()) + return { + "now": _epoch_ms(now), + "tz": "America/Los_Angeles", + "datum": "MLLW", + "units": "english", + "date": { + "iso": now.strftime("%Y-%m-%d"), + "pretty": now.strftime("%a · %b %-d, %Y"), + }, + "sun_moon": { + "sunrise": sm.sunrise, + "sunset": sm.sunset, + "noon": sm.noon, + "moon_phase": sm.moon_phase, + "moon_illum": sm.moon_illum, + "moon_glyph": sm.moon_glyph, + }, + "stations": list(payloads), + } + + +@router.get("/bootstrap") +async def bootstrap() -> dict[str, Any]: + """Everything the frontend loads on startup, in one round trip.""" + try: + return await _bootstrap() + except Exception as exc: # noqa: BLE001 — surface upstream NOAA failures cleanly + raise HTTPException( + status_code=502, detail=f"NOAA upstream error: {exc}" + ) from exc + + +@router.get("/stations") +def list_stations() -> list[dict[str, Any]]: + return [ + { + "id": s.id, + "code": s.code, + "name": s.name, + "area": s.area, + "lat": s.lat, + "lon": s.lon, + "predictions": s.predictions, + "group": s.group, + } + for s in stations.STATIONS + ] diff --git a/backend/app/astro.py b/backend/app/astro.py new file mode 100644 index 0000000..61bce24 --- /dev/null +++ b/backend/app/astro.py @@ -0,0 +1,63 @@ +"""Sun and moon facts for Bellingham, computed with ``astral``. + +NOAA's tide feed has no sun/moon data, but the dashboard's overlays and KPI +strip need it. These are real astronomical computations for the bay's location. +""" + +from __future__ import annotations + +import math +from dataclasses import dataclass +from datetime import date +from zoneinfo import ZoneInfo + +from astral import LocationInfo, moon +from astral.sun import sun + +_TZ = ZoneInfo("America/Los_Angeles") +_BELLINGHAM = LocationInfo( + "Bellingham", "USA", "America/Los_Angeles", 48.7519, -122.4787 +) + +_PHASE_NAMES = [ + (1.84, "New Moon", "🌑"), + (5.53, "Waxing Crescent", "🌒"), + (9.22, "First Quarter", "🌓"), + (12.91, "Waxing Gibbous", "🌔"), + (16.61, "Full Moon", "🌕"), + (20.30, "Waning Gibbous", "🌖"), + (23.99, "Last Quarter", "🌗"), + (27.68, "Waning Crescent", "🌘"), +] + + +@dataclass(frozen=True) +class SunMoon: + sunrise: str + sunset: str + noon: str + moon_phase: str + moon_illum: float + moon_glyph: str + + +def _hhmm(dt) -> str: + return dt.astimezone(_TZ).strftime("%H:%M") + + +def sun_moon(day: date) -> SunMoon: + s = sun(_BELLINGHAM.observer, date=day, tzinfo=_TZ) + phase = moon.phase(day) # 0..27.99 + name, glyph = next( + ((n, g) for limit, n, g in _PHASE_NAMES if phase < limit), + ("New Moon", "🌑"), + ) + illum = (1 - math.cos(2 * math.pi * phase / 29.53)) / 2 + return SunMoon( + sunrise=_hhmm(s["sunrise"]), + sunset=_hhmm(s["sunset"]), + noon=_hhmm(s["noon"]), + moon_phase=name, + moon_illum=round(illum, 2), + moon_glyph=glyph, + ) diff --git a/backend/app/config.py b/backend/app/config.py new file mode 100644 index 0000000..fbc2fd9 --- /dev/null +++ b/backend/app/config.py @@ -0,0 +1,24 @@ +from functools import lru_cache +from pathlib import Path + +from pydantic_settings import BaseSettings, SettingsConfigDict + + +class Settings(BaseSettings): + model_config = SettingsConfigDict(env_prefix="BTO_", env_file=".env") + + # Directory holding the built frontend (dist/). Served as static files in + # production. When unset or missing, the API runs without a UI (dev mode + # uses the Vite dev server instead). + static_dir: Path | None = None + + # CORS origins allowed in development (Vite dev server). + cors_origins: list[str] = ["http://localhost:5173"] + + # Seconds to cache NOAA prediction responses in-memory. + cache_ttl: int = 900 + + +@lru_cache +def get_settings() -> Settings: + return Settings() diff --git a/backend/app/main.py b/backend/app/main.py new file mode 100644 index 0000000..2414b78 --- /dev/null +++ b/backend/app/main.py @@ -0,0 +1,46 @@ +from fastapi import FastAPI +from fastapi.middleware.cors import CORSMiddleware +from fastapi.responses import FileResponse +from fastapi.staticfiles import StaticFiles + +from app.api import router as api_router +from app.config import Settings, get_settings + + +def create_app(settings: Settings | None = None) -> FastAPI: + settings = settings or get_settings() + + app = FastAPI(title="Bellingham Tidal Observatory", version="0.1.0") + + app.add_middleware( + CORSMiddleware, + allow_origins=settings.cors_origins, + allow_credentials=True, + allow_methods=["*"], + allow_headers=["*"], + ) + + @app.get("/api/health") + def health() -> dict[str, str]: + return {"status": "ok"} + + app.include_router(api_router) + + # Serve the built frontend when a static dir is configured and present. + # In development this is left unset and Vite serves the UI on :5173. + if settings.static_dir and settings.static_dir.is_dir(): + assets = settings.static_dir / "assets" + if assets.is_dir(): + app.mount("/assets", StaticFiles(directory=assets), name="assets") + + index_file = settings.static_dir / "index.html" + + @app.get("/{full_path:path}") + def spa(full_path: str) -> FileResponse: + # Single-page app fallback: any non-API route returns index.html. + return FileResponse(index_file) + + return app + + +app = create_app() diff --git a/backend/app/noaa.py b/backend/app/noaa.py new file mode 100644 index 0000000..a8c3cc0 --- /dev/null +++ b/backend/app/noaa.py @@ -0,0 +1,68 @@ +"""Thin async layer over the (synchronous) ``noaa_coops`` package. + +``noaa_coops`` does blocking HTTP + pandas work, so every call is dispatched to +a worker thread via :func:`asyncio.to_thread`. Results are memoized in-process +with a TTL so the dashboard's polling doesn't hammer the NOAA API. +""" + +from __future__ import annotations + +import asyncio +import time +from dataclasses import dataclass +from datetime import datetime + +from noaa_coops import Station as CoopsStation + +from app.config import get_settings + + +@dataclass(frozen=True) +class Extremum: + """A predicted high or low water event (real NOAA hi/lo prediction).""" + + t: datetime # naive local time (station-local, lst_ldt) + height: float # feet above MLLW + kind: str # "H" | "L" + + +_CACHE: dict[tuple[str, str, str], tuple[float, list[Extremum]]] = {} + + +def _fetch_blocking(station_id: str, begin: str, end: str) -> list[Extremum]: + station = CoopsStation(id=station_id) + df = station.get_data( + begin_date=begin, + end_date=end, + product="predictions", + datum="MLLW", + units="english", + time_zone="lst_ldt", + interval="hilo", + ) + out: list[Extremum] = [] + for ts, row in df.iterrows(): + out.append( + Extremum( + t=ts.to_pydatetime(), height=float(row["v"]), kind=str(row["type"]) + ) + ) + return out + + +async def fetch_extrema(station_id: str, begin: str, end: str) -> list[Extremum]: + """Return real NOAA hi/lo predictions for ``[begin, end]`` (YYYYMMDD).""" + key = (station_id, begin, end) + ttl = get_settings().cache_ttl + now = time.monotonic() + cached = _CACHE.get(key) + if cached is not None and now - cached[0] < ttl: + return cached[1] + + extrema = await asyncio.to_thread(_fetch_blocking, station_id, begin, end) + _CACHE[key] = (now, extrema) + return extrema + + +def clear_cache() -> None: + _CACHE.clear() diff --git a/backend/app/stations.py b/backend/app/stations.py new file mode 100644 index 0000000..ae29dba --- /dev/null +++ b/backend/app/stations.py @@ -0,0 +1,92 @@ +"""The fixed set of NOAA CO-OPS stations around Bellingham Bay. + +IDs, coordinates, and prediction type come from NOAA's station catalog (see the +project README). ``group`` mirrors the design's region grouping (central / +south / islands / north); ``code`` is the short mono label shown in the UI. +""" + +from __future__ import annotations + +from dataclasses import dataclass + + +@dataclass(frozen=True) +class Station: + id: str + code: str + name: str + area: str + lat: float + lon: float + predictions: str # "Harmonic" | "Subordinate" + group: str # "central" | "south" | "islands" | "north" + + +STATIONS: list[Station] = [ + Station( + "9449211", + "BHM·INT", + "Bellingham", + "central waterfront", + 48.7450, + -122.4950, + "Subordinate", + "central", + ), + Station( + "9449161", + "VLG·LMI", + "Village Point", + "lummi island", + 48.7167, + -122.7080, + "Harmonic", + "islands", + ), + Station( + "9449292", + "SDY·LMI", + "Sandy Point", + "lummi bay", + 48.7900, + -122.7080, + "Subordinate", + "north", + ), + Station( + "9449771", + "ROS·ORC", + "Rosario", + "east sound, orcas island", + 48.6467, + -122.8700, + "Harmonic", + "islands", + ), + Station( + "9449911", + "UPR·LOP", + "Upright Head", + "lopez island", + 48.5717, + -122.8850, + "Harmonic", + "islands", + ), + Station( + "9449798", + "ORC·ORC", + "Orcas", + "orcas island", + 48.6000, + -122.9500, + "Subordinate", + "islands", + ), +] + +STATIONS_BY_ID: dict[str, Station] = {s.id: s for s in STATIONS} + + +def get_station(station_id: str) -> Station | None: + return STATIONS_BY_ID.get(station_id) diff --git a/backend/app/tides.py b/backend/app/tides.py new file mode 100644 index 0000000..14e5ae1 --- /dev/null +++ b/backend/app/tides.py @@ -0,0 +1,105 @@ +"""Tide curve math built on real NOAA hi/lo predictions. + +NOAA gives us discrete high/low events. Between two consecutive extrema the +water follows very nearly a half-cosine (the standard smooth tidal curve, and +what the README's "Bezier between high and low" is approximating). We +interpolate that curve to get height and rate at any instant, then derive the +per-station snapshot the dashboard shows. +""" + +from __future__ import annotations + +import math +from bisect import bisect_right +from dataclasses import dataclass +from datetime import datetime + +from app.noaa import Extremum + + +@dataclass(frozen=True) +class Sample: + t: datetime + v: float + + +@dataclass(frozen=True) +class Snapshot: + height: float + rate: float # ft/hr, signed + trend: str # "rising" | "falling" | "slack" + day_min: float + day_max: float + next_high: Extremum | None + next_low: Extremum | None + + +def _ts(dt: datetime) -> float: + return dt.timestamp() + + +def height_at(extrema: list[Extremum], when: datetime) -> float: + """Half-cosine interpolation of height (ft) at ``when``.""" + if not extrema: + return math.nan + times = [_ts(e.t) for e in extrema] + x = _ts(when) + i = bisect_right(times, x) + if i == 0: + return extrema[0].height + if i >= len(extrema): + return extrema[-1].height + a, b = extrema[i - 1], extrema[i] + ta, tb = times[i - 1], times[i] + frac = (x - ta) / (tb - ta) if tb != ta else 0.0 + return (a.height + b.height) / 2 + (a.height - b.height) / 2 * math.cos( + math.pi * frac + ) + + +def rate_at(extrema: list[Extremum], when: datetime) -> float: + """Signed rate of change in ft/hr via centered finite difference.""" + dt = 300.0 # 5 minutes, in seconds + before = height_at(extrema, datetime.fromtimestamp(_ts(when) - dt)) + after = height_at(extrema, datetime.fromtimestamp(_ts(when) + dt)) + return (after - before) / (2 * dt) * 3600.0 + + +def sample( + extrema: list[Extremum], start: datetime, end: datetime, n: int = 120 +) -> list[Sample]: + if n < 1 or not extrema: + return [] + s, e = _ts(start), _ts(end) + out: list[Sample] = [] + for i in range(n + 1): + x = s + (e - s) * (i / n) + dt = datetime.fromtimestamp(x) + out.append(Sample(t=dt, v=height_at(extrema, dt))) + return out + + +def snapshot(extrema: list[Extremum], now: datetime) -> Snapshot: + h = height_at(extrema, now) + r = rate_at(extrema, now) + trend = "slack" if abs(r) < 0.15 else "rising" if r > 0 else "falling" + + # Day range: min/max over the calendar day containing ``now``. + day = now.date() + day_pts = [e.height for e in extrema if e.t.date() == day] + day_min = min(day_pts) if day_pts else h + day_max = max(day_pts) if day_pts else h + + upcoming = [e for e in extrema if e.t >= now] + next_high = next((e for e in upcoming if e.kind == "H"), None) + next_low = next((e for e in upcoming if e.kind == "L"), None) + + return Snapshot( + height=h, + rate=r, + trend=trend, + day_min=day_min, + day_max=day_max, + next_high=next_high, + next_low=next_low, + ) diff --git a/backend/pyproject.toml b/backend/pyproject.toml new file mode 100644 index 0000000..fc54107 --- /dev/null +++ b/backend/pyproject.toml @@ -0,0 +1,23 @@ +[project] +name = "bto" +version = "0.1.0" +description = "Bellingham Tidal Observatory — real-time NOAA tide dashboard." +requires-python = ">=3.13" +dependencies = [ + "astral>=3.2", + "fastapi>=0.136.3", + "noaa-coops>=0.4.0", + "pydantic-settings>=2.14.1", + "uvicorn[standard]>=0.48.0", +] + +[dependency-groups] +dev = [ + "httpx>=0.28.1", + "pytest>=9.0.3", + "ruff>=0.15.14", +] + +[tool.pytest.ini_options] +testpaths = ["tests"] +addopts = "-q" diff --git a/backend/tests/__init__.py b/backend/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/backend/tests/conftest.py b/backend/tests/conftest.py new file mode 100644 index 0000000..9473dd7 --- /dev/null +++ b/backend/tests/conftest.py @@ -0,0 +1,29 @@ +from pathlib import Path + +import pytest +from fastapi.testclient import TestClient + +from app.config import Settings +from app.main import create_app + + +@pytest.fixture +def client() -> TestClient: + """Client for an app with no static dir (API-only / dev mode).""" + return TestClient(create_app(Settings(static_dir=None))) + + +@pytest.fixture +def static_dir(tmp_path: Path) -> Path: + """A minimal built-frontend directory: index.html + one asset.""" + (tmp_path / "index.html").write_text("BTO") + assets = tmp_path / "assets" + assets.mkdir() + (assets / "app.js").write_text("console.log('bto')") + return tmp_path + + +@pytest.fixture +def static_client(static_dir: Path) -> TestClient: + """Client for an app configured to serve the built frontend.""" + return TestClient(create_app(Settings(static_dir=static_dir))) diff --git a/backend/tests/test_api.py b/backend/tests/test_api.py new file mode 100644 index 0000000..360ba5a --- /dev/null +++ b/backend/tests/test_api.py @@ -0,0 +1,49 @@ +from datetime import datetime, timedelta + +import pytest +from fastapi.testclient import TestClient + +from app import noaa, stations + + +@pytest.fixture +def fake_noaa(monkeypatch: pytest.MonkeyPatch) -> None: + """Replace the NOAA fetch with deterministic extrema (no network).""" + + async def _fake(station_id: str, begin: str, end: str) -> list[noaa.Extremum]: + base = datetime(2026, 5, 26, 1, 0) + return [ + noaa.Extremum( + t=base + timedelta(hours=6 * i), + height=8.0 if i % 2 == 0 else 2.0, + kind="H" if i % 2 == 0 else "L", + ) + for i in range(8) + ] + + monkeypatch.setattr(noaa, "fetch_extrema", _fake) + + +def test_list_stations_returns_all_six(client: TestClient) -> None: + res = client.get("/api/stations") + assert res.status_code == 200 + body = res.json() + assert len(body) == len(stations.STATIONS) == 6 + assert {s["id"] for s in body} == {s.id for s in stations.STATIONS} + + +def test_bootstrap_shape(client: TestClient, fake_noaa: None) -> None: + res = client.get("/api/bootstrap") + assert res.status_code == 200 + body = res.json() + assert body["datum"] == "MLLW" + assert body["tz"] == "America/Los_Angeles" + assert "sunrise" in body["sun_moon"] + assert "moon_glyph" in body["sun_moon"] + assert len(body["stations"]) == 6 + stn = body["stations"][0] + assert {"id", "code", "name", "group", "extrema"} <= stn.keys() + assert stn["extrema"] + ex = stn["extrema"][0] + assert {"t", "height", "kind"} <= ex.keys() + assert isinstance(ex["t"], int) # epoch ms diff --git a/backend/tests/test_health.py b/backend/tests/test_health.py new file mode 100644 index 0000000..10e5c2f --- /dev/null +++ b/backend/tests/test_health.py @@ -0,0 +1,13 @@ +from fastapi.testclient import TestClient + + +def test_health_returns_ok(client: TestClient) -> None: + res = client.get("/api/health") + assert res.status_code == 200 + assert res.json() == {"status": "ok"} + + +def test_cors_headers_present_for_allowed_origin(client: TestClient) -> None: + res = client.get("/api/health", headers={"Origin": "http://localhost:5173"}) + assert res.status_code == 200 + assert res.headers["access-control-allow-origin"] == "http://localhost:5173" diff --git a/backend/tests/test_static.py b/backend/tests/test_static.py new file mode 100644 index 0000000..dd138a2 --- /dev/null +++ b/backend/tests/test_static.py @@ -0,0 +1,32 @@ +from fastapi.testclient import TestClient + + +def test_api_health_still_works_with_static(static_client: TestClient) -> None: + res = static_client.get("/api/health") + assert res.status_code == 200 + assert res.json() == {"status": "ok"} + + +def test_root_serves_index_html(static_client: TestClient) -> None: + res = static_client.get("/") + assert res.status_code == 200 + assert "BTO" in res.text + + +def test_unknown_route_falls_back_to_index(static_client: TestClient) -> None: + # SPA client-side routing: any non-API path returns index.html. + res = static_client.get("/tides") + assert res.status_code == 200 + assert "BTO" in res.text + + +def test_assets_are_served(static_client: TestClient) -> None: + res = static_client.get("/assets/app.js") + assert res.status_code == 200 + assert "bto" in res.text + + +def test_no_static_dir_has_no_spa_fallback(client: TestClient) -> None: + # Without a static dir there is no catch-all; unknown routes 404. + res = client.get("/tides") + assert res.status_code == 404 diff --git a/backend/tests/test_tides.py b/backend/tests/test_tides.py new file mode 100644 index 0000000..72b49c1 --- /dev/null +++ b/backend/tests/test_tides.py @@ -0,0 +1,56 @@ +from datetime import datetime, timedelta + +from app import tides +from app.noaa import Extremum + + +def _curve() -> list[Extremum]: + base = datetime(2026, 5, 26, 0, 0) + return [ + Extremum(t=base + timedelta(hours=1), height=8.0, kind="H"), + Extremum(t=base + timedelta(hours=7), height=2.0, kind="L"), + Extremum(t=base + timedelta(hours=13), height=7.0, kind="H"), + Extremum(t=base + timedelta(hours=19), height=3.0, kind="L"), + ] + + +def test_height_at_extrema_matches_exactly() -> None: + c = _curve() + assert abs(tides.height_at(c, c[0].t) - 8.0) < 1e-6 + assert abs(tides.height_at(c, c[1].t) - 2.0) < 1e-6 + + +def test_height_at_midpoint_is_mean() -> None: + c = _curve() + mid = c[0].t + (c[1].t - c[0].t) / 2 + assert abs(tides.height_at(c, mid) - 5.0) < 1e-6 # (8+2)/2 + + +def test_rate_sign_tracks_direction() -> None: + c = _curve() + # Falling segment between first high and first low. + mid = c[0].t + (c[1].t - c[0].t) / 2 + assert tides.rate_at(c, mid) < 0 + # Rising segment between first low and second high. + mid2 = c[1].t + (c[2].t - c[1].t) / 2 + assert tides.rate_at(c, mid2) > 0 + + +def test_snapshot_reports_next_events_and_day_range() -> None: + c = _curve() + now = c[0].t + timedelta(hours=2) # just after first high, falling + snap = tides.snapshot(c, now) + assert snap.trend == "falling" + assert snap.next_low is c[1] + assert snap.next_high is c[2] + assert abs(snap.day_max - 8.0) < 1e-6 + assert abs(snap.day_min - 2.0) < 1e-6 + + +def test_sample_spans_window_inclusive() -> None: + c = _curve() + start, end = c[0].t, c[3].t + pts = tides.sample(c, start, end, n=10) + assert len(pts) == 11 + assert pts[0].t == start + assert pts[-1].t == end diff --git a/backend/uv.lock b/backend/uv.lock new file mode 100644 index 0000000..9fa3d74 --- /dev/null +++ b/backend/uv.lock @@ -0,0 +1,955 @@ +version = 1 +revision = 3 +requires-python = ">=3.13" + +[[package]] +name = "annotated-doc" +version = "0.0.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/57/ba/046ceea27344560984e26a590f90bc7f4a75b06701f653222458922b558c/annotated_doc-0.0.4.tar.gz", hash = "sha256:fbcda96e87e9c92ad167c2e53839e57503ecfda18804ea28102353485033faa4", size = 7288, upload-time = "2025-11-10T22:07:42.062Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/d3/26bf1008eb3d2daa8ef4cacc7f3bfdc11818d111f7e2d0201bc6e3b49d45/annotated_doc-0.0.4-py3-none-any.whl", hash = "sha256:571ac1dc6991c450b25a9c2d84a3705e2ae7a53467b5d111c24fa8baabbed320", size = 5303, upload-time = "2025-11-10T22:07:40.673Z" }, +] + +[[package]] +name = "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.13.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "idna" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/19/14/2c5dd9f512b66549ae92767a9c7b330ae88e1932ca57876909410251fe13/anyio-4.13.0.tar.gz", hash = "sha256:334b70e641fd2221c1505b3890c69882fe4a2df910cba14d97019b90b24439dc", size = 231622, upload-time = "2026-03-24T12:59:09.671Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/da/42/e921fccf5015463e32a3cf6ee7f980a6ed0f395ceeaa45060b61d86486c2/anyio-4.13.0-py3-none-any.whl", hash = "sha256:08b310f9e24a9594186fd75b4f73f4a4152069e3853f1ed8bfbf58369f4ad708", size = 114353, upload-time = "2026-03-24T12:59:08.246Z" }, +] + +[[package]] +name = "astral" +version = "3.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "tzdata", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/04/d1/1adbf06a38dc339e41a1666f6c7135924594c20fd46e060fb263248c564d/astral-3.2.tar.gz", hash = "sha256:9b7c3b412e9e69d172cfb24be0e6addcc9f1bd01a28db8bebe66d75ccc533d88", size = 48075, upload-time = "2022-11-05T18:12:02.913Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2d/80/d6edd9c3259913cfe39aff2bea4da65de5ad0235a578405e37aabace5f2c/astral-3.2-py3-none-any.whl", hash = "sha256:cb7b49a3f0d4c64ae666be131276d2a3226134c598db10e672028cf8ff855f83", size = 38325, upload-time = "2022-11-05T18:12:01.164Z" }, +] + +[[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 = "bto" +version = "0.1.0" +source = { virtual = "." } +dependencies = [ + { name = "astral" }, + { name = "fastapi" }, + { name = "noaa-coops" }, + { name = "pydantic-settings" }, + { name = "uvicorn", extra = ["standard"] }, +] + +[package.dev-dependencies] +dev = [ + { name = "httpx" }, + { name = "pytest" }, + { name = "ruff" }, +] + +[package.metadata] +requires-dist = [ + { name = "astral", specifier = ">=3.2" }, + { name = "fastapi", specifier = ">=0.136.3" }, + { name = "noaa-coops", specifier = ">=0.4.0" }, + { name = "pydantic-settings", specifier = ">=2.14.1" }, + { name = "uvicorn", extras = ["standard"], specifier = ">=0.48.0" }, +] + +[package.metadata.requires-dev] +dev = [ + { name = "httpx", specifier = ">=0.28.1" }, + { name = "pytest", specifier = ">=9.0.3" }, + { name = "ruff", specifier = ">=0.15.14" }, +] + +[[package]] +name = "certifi" +version = "2026.5.20" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f3/ce/ee2ecad540810a79593028e88299baeae54d346cc7a0d94b6199988b89b1/certifi-2026.5.20.tar.gz", hash = "sha256:69dea482ab64caa7b9f6aba1c6bf48bb6a5448d1c0f1b17ab42ad8c763a5344d", size = 135422, upload-time = "2026-05-20T11:46:50.073Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/59/8c/57e832b7af6d7c5abe66eb3fbe3a3a32f4d11ea23a1aa7131371035be991/certifi-2026.5.20-py3-none-any.whl", hash = "sha256:3c52e209ba0a4ad7aebe60436a4ab349c39e1e602e8c134221e546902ad25897", size = 134134, upload-time = "2026-05-20T11:46:48.578Z" }, +] + +[[package]] +name = "charset-normalizer" +version = "3.4.7" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/a1/67fe25fac3c7642725500a3f6cfe5821ad557c3abb11c9d20d12c7008d3e/charset_normalizer-3.4.7.tar.gz", hash = "sha256:ae89db9e5f98a11a4bf50407d4363e7b09b31e55bc117b4f7d80aab97ba009e5", size = 144271, upload-time = "2026-04-02T09:28:39.342Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c1/3b/66777e39d3ae1ddc77ee606be4ec6d8cbd4c801f65e5a1b6f2b11b8346dd/charset_normalizer-3.4.7-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:f496c9c3cc02230093d8330875c4c3cdfc3b73612a5fd921c65d39cbcef08063", size = 309627, upload-time = "2026-04-02T09:26:45.198Z" }, + { url = "https://files.pythonhosted.org/packages/2e/4e/b7f84e617b4854ade48a1b7915c8ccfadeba444d2a18c291f696e37f0d3b/charset_normalizer-3.4.7-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0ea948db76d31190bf08bd371623927ee1339d5f2a0b4b1b4a4439a65298703c", size = 207008, upload-time = "2026-04-02T09:26:46.824Z" }, + { url = "https://files.pythonhosted.org/packages/c4/bb/ec73c0257c9e11b268f018f068f5d00aa0ef8c8b09f7753ebd5f2880e248/charset_normalizer-3.4.7-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a277ab8928b9f299723bc1a2dabb1265911b1a76341f90a510368ca44ad9ab66", size = 228303, upload-time = "2026-04-02T09:26:48.397Z" }, + { url = "https://files.pythonhosted.org/packages/85/fb/32d1f5033484494619f701e719429c69b766bfc4dbc61aa9e9c8c166528b/charset_normalizer-3.4.7-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3bec022aec2c514d9cf199522a802bd007cd588ab17ab2525f20f9c34d067c18", size = 224282, upload-time = "2026-04-02T09:26:49.684Z" }, + { url = "https://files.pythonhosted.org/packages/fa/07/330e3a0dda4c404d6da83b327270906e9654a24f6c546dc886a0eb0ffb23/charset_normalizer-3.4.7-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e044c39e41b92c845bc815e5ae4230804e8e7bc29e399b0437d64222d92809dd", size = 215595, upload-time = "2026-04-02T09:26:50.915Z" }, + { url = "https://files.pythonhosted.org/packages/e3/7c/fc890655786e423f02556e0216d4b8c6bcb6bdfa890160dc66bf52dee468/charset_normalizer-3.4.7-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:f495a1652cf3fbab2eb0639776dad966c2fb874d79d87ca07f9d5f059b8bd215", size = 201986, upload-time = "2026-04-02T09:26:52.197Z" }, + { url = "https://files.pythonhosted.org/packages/d8/97/bfb18b3db2aed3b90cf54dc292ad79fdd5ad65c4eae454099475cbeadd0d/charset_normalizer-3.4.7-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e712b419df8ba5e42b226c510472b37bd57b38e897d3eca5e8cfd410a29fa859", size = 211711, upload-time = "2026-04-02T09:26:53.49Z" }, + { url = "https://files.pythonhosted.org/packages/6f/a5/a581c13798546a7fd557c82614a5c65a13df2157e9ad6373166d2a3e645d/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7804338df6fcc08105c7745f1502ba68d900f45fd770d5bdd5288ddccb8a42d8", size = 210036, upload-time = "2026-04-02T09:26:54.975Z" }, + { url = "https://files.pythonhosted.org/packages/8c/bf/b3ab5bcb478e4193d517644b0fb2bf5497fbceeaa7a1bc0f4d5b50953861/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:481551899c856c704d58119b5025793fa6730adda3571971af568f66d2424bb5", size = 202998, upload-time = "2026-04-02T09:26:56.303Z" }, + { url = "https://files.pythonhosted.org/packages/e7/4e/23efd79b65d314fa320ec6017b4b5834d5c12a58ba4610aa353af2e2f577/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f59099f9b66f0d7145115e6f80dd8b1d847176df89b234a5a6b3f00437aa0832", size = 230056, upload-time = "2026-04-02T09:26:57.554Z" }, + { url = "https://files.pythonhosted.org/packages/b9/9f/1e1941bc3f0e01df116e68dc37a55c4d249df5e6fa77f008841aef68264f/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:f59ad4c0e8f6bba240a9bb85504faa1ab438237199d4cce5f622761507b8f6a6", size = 211537, upload-time = "2026-04-02T09:26:58.843Z" }, + { url = "https://files.pythonhosted.org/packages/80/0f/088cbb3020d44428964a6c97fe1edfb1b9550396bf6d278330281e8b709c/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:3dedcc22d73ec993f42055eff4fcfed9318d1eeb9a6606c55892a26964964e48", size = 226176, upload-time = "2026-04-02T09:27:00.437Z" }, + { url = "https://files.pythonhosted.org/packages/6a/9f/130394f9bbe06f4f63e22641d32fc9b202b7e251c9aef4db044324dac493/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:64f02c6841d7d83f832cd97ccf8eb8a906d06eb95d5276069175c696b024b60a", size = 217723, upload-time = "2026-04-02T09:27:02.021Z" }, + { url = "https://files.pythonhosted.org/packages/73/55/c469897448a06e49f8fa03f6caae97074fde823f432a98f979cc42b90e69/charset_normalizer-3.4.7-cp313-cp313-win32.whl", hash = "sha256:4042d5c8f957e15221d423ba781e85d553722fc4113f523f2feb7b188cc34c5e", size = 148085, upload-time = "2026-04-02T09:27:03.192Z" }, + { url = "https://files.pythonhosted.org/packages/5d/78/1b74c5bbb3f99b77a1715c91b3e0b5bdb6fe302d95ace4f5b1bec37b0167/charset_normalizer-3.4.7-cp313-cp313-win_amd64.whl", hash = "sha256:3946fa46a0cf3e4c8cb1cc52f56bb536310d34f25f01ca9b6c16afa767dab110", size = 158819, upload-time = "2026-04-02T09:27:04.454Z" }, + { url = "https://files.pythonhosted.org/packages/68/86/46bd42279d323deb8687c4a5a811fd548cb7d1de10cf6535d099877a9a9f/charset_normalizer-3.4.7-cp313-cp313-win_arm64.whl", hash = "sha256:80d04837f55fc81da168b98de4f4b797ef007fc8a79ab71c6ec9bc4dd662b15b", size = 147915, upload-time = "2026-04-02T09:27:05.971Z" }, + { url = "https://files.pythonhosted.org/packages/97/c8/c67cb8c70e19ef1960b97b22ed2a1567711de46c4ddf19799923adc836c2/charset_normalizer-3.4.7-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:c36c333c39be2dbca264d7803333c896ab8fa7d4d6f0ab7edb7dfd7aea6e98c0", size = 309234, upload-time = "2026-04-02T09:27:07.194Z" }, + { url = "https://files.pythonhosted.org/packages/99/85/c091fdee33f20de70d6c8b522743b6f831a2f1cd3ff86de4c6a827c48a76/charset_normalizer-3.4.7-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1c2aed2e5e41f24ea8ef1590b8e848a79b56f3a5564a65ceec43c9d692dc7d8a", size = 208042, upload-time = "2026-04-02T09:27:08.749Z" }, + { url = "https://files.pythonhosted.org/packages/87/1c/ab2ce611b984d2fd5d86a5a8a19c1ae26acac6bad967da4967562c75114d/charset_normalizer-3.4.7-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:54523e136b8948060c0fa0bc7b1b50c32c186f2fceee897a495406bb6e311d2b", size = 228706, upload-time = "2026-04-02T09:27:09.951Z" }, + { url = "https://files.pythonhosted.org/packages/a8/29/2b1d2cb00bf085f59d29eb773ce58ec2d325430f8c216804a0a5cd83cbca/charset_normalizer-3.4.7-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:715479b9a2802ecac752a3b0efa2b0b60285cf962ee38414211abdfccc233b41", size = 224727, upload-time = "2026-04-02T09:27:11.175Z" }, + { url = "https://files.pythonhosted.org/packages/47/5c/032c2d5a07fe4d4855fea851209cca2b6f03ebeb6d4e3afdb3358386a684/charset_normalizer-3.4.7-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bd6c2a1c7573c64738d716488d2cdd3c00e340e4835707d8fdb8dc1a66ef164e", size = 215882, upload-time = "2026-04-02T09:27:12.446Z" }, + { url = "https://files.pythonhosted.org/packages/2c/c2/356065d5a8b78ed04499cae5f339f091946a6a74f91e03476c33f0ab7100/charset_normalizer-3.4.7-cp314-cp314-manylinux_2_31_armv7l.whl", hash = "sha256:c45e9440fb78f8ddabcf714b68f936737a121355bf59f3907f4e17721b9d1aae", size = 200860, upload-time = "2026-04-02T09:27:13.721Z" }, + { url = "https://files.pythonhosted.org/packages/0c/cd/a32a84217ced5039f53b29f460962abb2d4420def55afabe45b1c3c7483d/charset_normalizer-3.4.7-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3534e7dcbdcf757da6b85a0bbf5b6868786d5982dd959b065e65481644817a18", size = 211564, upload-time = "2026-04-02T09:27:15.272Z" }, + { url = "https://files.pythonhosted.org/packages/44/86/58e6f13ce26cc3b8f4a36b94a0f22ae2f00a72534520f4ae6857c4b81f89/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:e8ac484bf18ce6975760921bb6148041faa8fef0547200386ea0b52b5d27bf7b", size = 211276, upload-time = "2026-04-02T09:27:16.834Z" }, + { url = "https://files.pythonhosted.org/packages/8f/fe/d17c32dc72e17e155e06883efa84514ca375f8a528ba2546bee73fc4df81/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:a5fe03b42827c13cdccd08e6c0247b6a6d4b5e3cdc53fd1749f5896adcdc2356", size = 201238, upload-time = "2026-04-02T09:27:18.229Z" }, + { url = "https://files.pythonhosted.org/packages/6a/29/f33daa50b06525a237451cdb6c69da366c381a3dadcd833fa5676bc468b3/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:2d6eb928e13016cea4f1f21d1e10c1cebd5a421bc57ddf5b1142ae3f86824fab", size = 230189, upload-time = "2026-04-02T09:27:19.445Z" }, + { url = "https://files.pythonhosted.org/packages/b6/6e/52c84015394a6a0bdcd435210a7e944c5f94ea1055f5cc5d56c5fe368e7b/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:e74327fb75de8986940def6e8dee4f127cc9752bee7355bb323cc5b2659b6d46", size = 211352, upload-time = "2026-04-02T09:27:20.79Z" }, + { url = "https://files.pythonhosted.org/packages/8c/d7/4353be581b373033fb9198bf1da3cf8f09c1082561e8e922aa7b39bf9fe8/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:d6038d37043bced98a66e68d3aa2b6a35505dc01328cd65217cefe82f25def44", size = 227024, upload-time = "2026-04-02T09:27:22.063Z" }, + { url = "https://files.pythonhosted.org/packages/30/45/99d18aa925bd1740098ccd3060e238e21115fffbfdcb8f3ece837d0ace6c/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:7579e913a5339fb8fa133f6bbcfd8e6749696206cf05acdbdca71a1b436d8e72", size = 217869, upload-time = "2026-04-02T09:27:23.486Z" }, + { url = "https://files.pythonhosted.org/packages/5c/05/5ee478aa53f4bb7996482153d4bfe1b89e0f087f0ab6b294fcf92d595873/charset_normalizer-3.4.7-cp314-cp314-win32.whl", hash = "sha256:5b77459df20e08151cd6f8b9ef8ef1f961ef73d85c21a555c7eed5b79410ec10", size = 148541, upload-time = "2026-04-02T09:27:25.146Z" }, + { url = "https://files.pythonhosted.org/packages/48/77/72dcb0921b2ce86420b2d79d454c7022bf5be40202a2a07906b9f2a35c97/charset_normalizer-3.4.7-cp314-cp314-win_amd64.whl", hash = "sha256:92a0a01ead5e668468e952e4238cccd7c537364eb7d851ab144ab6627dbbe12f", size = 159634, upload-time = "2026-04-02T09:27:26.642Z" }, + { url = "https://files.pythonhosted.org/packages/c6/a3/c2369911cd72f02386e4e340770f6e158c7980267da16af8f668217abaa0/charset_normalizer-3.4.7-cp314-cp314-win_arm64.whl", hash = "sha256:67f6279d125ca0046a7fd386d01b311c6363844deac3e5b069b514ba3e63c246", size = 148384, upload-time = "2026-04-02T09:27:28.271Z" }, + { url = "https://files.pythonhosted.org/packages/94/09/7e8a7f73d24dba1f0035fbbf014d2c36828fc1bf9c88f84093e57d315935/charset_normalizer-3.4.7-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:effc3f449787117233702311a1b7d8f59cba9ced946ba727bdc329ec69028e24", size = 330133, upload-time = "2026-04-02T09:27:29.474Z" }, + { url = "https://files.pythonhosted.org/packages/8d/da/96975ddb11f8e977f706f45cddd8540fd8242f71ecdb5d18a80723dcf62c/charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fbccdc05410c9ee21bbf16a35f4c1d16123dcdeb8a1d38f33654fa21d0234f79", size = 216257, upload-time = "2026-04-02T09:27:30.793Z" }, + { url = "https://files.pythonhosted.org/packages/e5/e8/1d63bf8ef2d388e95c64b2098f45f84758f6d102a087552da1485912637b/charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:733784b6d6def852c814bce5f318d25da2ee65dd4839a0718641c696e09a2960", size = 234851, upload-time = "2026-04-02T09:27:32.44Z" }, + { url = "https://files.pythonhosted.org/packages/9b/40/e5ff04233e70da2681fa43969ad6f66ca5611d7e669be0246c4c7aaf6dc8/charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a89c23ef8d2c6b27fd200a42aa4ac72786e7c60d40efdc76e6011260b6e949c4", size = 233393, upload-time = "2026-04-02T09:27:34.03Z" }, + { url = "https://files.pythonhosted.org/packages/be/c1/06c6c49d5a5450f76899992f1ee40b41d076aee9279b49cf9974d2f313d5/charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6c114670c45346afedc0d947faf3c7f701051d2518b943679c8ff88befe14f8e", size = 223251, upload-time = "2026-04-02T09:27:35.369Z" }, + { url = "https://files.pythonhosted.org/packages/2b/9f/f2ff16fb050946169e3e1f82134d107e5d4ae72647ec8a1b1446c148480f/charset_normalizer-3.4.7-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:a180c5e59792af262bf263b21a3c49353f25945d8d9f70628e73de370d55e1e1", size = 206609, upload-time = "2026-04-02T09:27:36.661Z" }, + { url = "https://files.pythonhosted.org/packages/69/d5/a527c0cd8d64d2eab7459784fb4169a0ac76e5a6fc5237337982fd61347e/charset_normalizer-3.4.7-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3c9a494bc5ec77d43cea229c4f6db1e4d8fe7e1bbffa8b6f0f0032430ff8ab44", size = 220014, upload-time = "2026-04-02T09:27:38.019Z" }, + { url = "https://files.pythonhosted.org/packages/7e/80/8a7b8104a3e203074dc9aa2c613d4b726c0e136bad1cc734594b02867972/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8d828b6667a32a728a1ad1d93957cdf37489c57b97ae6c4de2860fa749b8fc1e", size = 218979, upload-time = "2026-04-02T09:27:39.37Z" }, + { url = "https://files.pythonhosted.org/packages/02/9a/b759b503d507f375b2b5c153e4d2ee0a75aa215b7f2489cf314f4541f2c0/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:cf1493cd8607bec4d8a7b9b004e699fcf8f9103a9284cc94962cb73d20f9d4a3", size = 209238, upload-time = "2026-04-02T09:27:40.722Z" }, + { url = "https://files.pythonhosted.org/packages/c2/4e/0f3f5d47b86bdb79256e7290b26ac847a2832d9a4033f7eb2cd4bcf4bb5b/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:0c96c3b819b5c3e9e165495db84d41914d6894d55181d2d108cc1a69bfc9cce0", size = 236110, upload-time = "2026-04-02T09:27:42.33Z" }, + { url = "https://files.pythonhosted.org/packages/96/23/bce28734eb3ed2c91dcf93abeb8a5cf393a7b2749725030bb630e554fdd8/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:752a45dc4a6934060b3b0dab47e04edc3326575f82be64bc4fc293914566503e", size = 219824, upload-time = "2026-04-02T09:27:43.924Z" }, + { url = "https://files.pythonhosted.org/packages/2c/6f/6e897c6984cc4d41af319b077f2f600fc8214eb2fe2d6bcb79141b882400/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:8778f0c7a52e56f75d12dae53ae320fae900a8b9b4164b981b9c5ce059cd1fcb", size = 233103, upload-time = "2026-04-02T09:27:45.348Z" }, + { url = "https://files.pythonhosted.org/packages/76/22/ef7bd0fe480a0ae9b656189ec00744b60933f68b4f42a7bb06589f6f576a/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ce3412fbe1e31eb81ea42f4169ed94861c56e643189e1e75f0041f3fe7020abe", size = 225194, upload-time = "2026-04-02T09:27:46.706Z" }, + { url = "https://files.pythonhosted.org/packages/c5/a7/0e0ab3e0b5bc1219bd80a6a0d4d72ca74d9250cb2382b7c699c147e06017/charset_normalizer-3.4.7-cp314-cp314t-win32.whl", hash = "sha256:c03a41a8784091e67a39648f70c5f97b5b6a37f216896d44d2cdcb82615339a0", size = 159827, upload-time = "2026-04-02T09:27:48.053Z" }, + { url = "https://files.pythonhosted.org/packages/7a/1d/29d32e0fb40864b1f878c7f5a0b343ae676c6e2b271a2d55cc3a152391da/charset_normalizer-3.4.7-cp314-cp314t-win_amd64.whl", hash = "sha256:03853ed82eeebbce3c2abfdbc98c96dc205f32a79627688ac9a27370ea61a49c", size = 174168, upload-time = "2026-04-02T09:27:49.795Z" }, + { url = "https://files.pythonhosted.org/packages/de/32/d92444ad05c7a6e41fb2036749777c163baf7a0301a040cb672d6b2b1ae9/charset_normalizer-3.4.7-cp314-cp314t-win_arm64.whl", hash = "sha256:c35abb8bfff0185efac5878da64c45dafd2b37fb0383add1be155a763c1f083d", size = 153018, upload-time = "2026-04-02T09:27:51.116Z" }, + { url = "https://files.pythonhosted.org/packages/db/8f/61959034484a4a7c527811f4721e75d02d653a35afb0b6054474d8185d4c/charset_normalizer-3.4.7-py3-none-any.whl", hash = "sha256:3dce51d0f5e7951f8bb4900c257dad282f49190fdbebecd4ba99bcc41fef404d", size = 61958, upload-time = "2026-04-02T09:28:37.794Z" }, +] + +[[package]] +name = "click" +version = "8.4.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9b/98/518d8e5081007684232226f475082b30087d0f585e8457db087298259f49/click-8.4.1.tar.gz", hash = "sha256:918b5633eddf6b41c32d4f454bf0de810065c74e3f7dbf8ee5452f8be88d3e96", size = 353007, upload-time = "2026-05-22T04:08:37.769Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c7/0d/67e5b4109ea4a837e80daa87c2c696711955e40449a97e8926672534def2/click-8.4.1-py3-none-any.whl", hash = "sha256:482be17c6991b8c19c5429a1e995d9b0efdbb63172824c41f99965dc0ade8ec2", size = 116639, upload-time = "2026-05-22T04:08:35.26Z" }, +] + +[[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 = "fastapi" +version = "0.136.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "annotated-doc" }, + { name = "pydantic" }, + { name = "starlette" }, + { name = "typing-extensions" }, + { name = "typing-inspection" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/81/2d/ff8d91d7b564d464629a0fd50a4489c97fcb836ac230bf3a7269232a9b1f/fastapi-0.136.3.tar.gz", hash = "sha256:e487fae93ad408e6f47641ee4dfe389864fd7bec92e547ea8498fc13f43e83ab", size = 396410, upload-time = "2026-05-23T18:53:15.192Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e0/82/45359b62a067409bd929ae8a56b8ed13e5a8c8a61194b3c236920999ab83/fastapi-0.136.3-py3-none-any.whl", hash = "sha256:3d2a69bdf04b7e9f3afa292c3bc7a98816bbfafa10bc9b45f3f3700d2f761620", size = 117481, upload-time = "2026-05-23T18:53:16.924Z" }, +] + +[[package]] +name = "h11" +version = "0.16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/01/ee/02a2c011bdab74c6fb3c75474d40b3052059d95df7e73351460c8588d963/h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1", size = 101250, upload-time = "2025-04-24T03:35:25.427Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", size = 37515, upload-time = "2025-04-24T03:35:24.344Z" }, +] + +[[package]] +name = "httpcore" +version = "1.0.9" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "h11" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/06/94/82699a10bca87a5556c9c59b5963f2d039dbd239f25bc2a63907a05a14cb/httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8", size = 85484, upload-time = "2025-04-24T22:06:22.219Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55", size = 78784, upload-time = "2025-04-24T22:06:20.566Z" }, +] + +[[package]] +name = "httptools" +version = "0.8.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/43/e5/d471fcb0e14523fe1c3f4ba58ca52480e7bd70ad7109a3846bc75892f7fb/httptools-0.8.0.tar.gz", hash = "sha256:6b2a32f18d97e16e90827d7a819ffa8dbd8cc245fc4e1fa9d1095b54ef4bd999", size = 271342, upload-time = "2026-05-25T22:17:48.841Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5e/e5/8cfcabc5546e8022f168be28bcdaa128a240a0befdd03b59d558b4f18bd6/httptools-0.8.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:614ceea8ea606848bece2338ac03b3ce5324bcb4be8dc7d377ed708012fa4db8", size = 205148, upload-time = "2026-05-25T22:17:16.333Z" }, + { url = "https://files.pythonhosted.org/packages/2a/0e/0fb14848c19a686c8062ff9067c1a48793e3224b47bc5b201535b6036fce/httptools-0.8.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2d689918c15a013c65ef52d9fd495d766893ab831a2c8d89f2ac5940a5df847c", size = 111368, upload-time = "2026-05-25T22:17:17.586Z" }, + { url = "https://files.pythonhosted.org/packages/2e/1b/46f1cecf06b9bbde8e4b8c88034ac7908989e5ff7a3a388ef38392949c1f/httptools-0.8.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:eb3028cca2fc0a6d720e52ef61d8ebb62fcbfeb1de56874546d858d3f25a26b7", size = 486447, upload-time = "2026-05-25T22:17:18.564Z" }, + { url = "https://files.pythonhosted.org/packages/77/00/258bfc0837221f81d9725c45f9b948a6a6b2994a147a4fb66e85100c668f/httptools-0.8.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:88bdd940f2b5d487b4d032c6afa5489a7dc4694410d43de3c38c4fb3af0dc45d", size = 482448, upload-time = "2026-05-25T22:17:19.912Z" }, + { url = "https://files.pythonhosted.org/packages/04/ab/d1cef3b5523f4d272a70f42a776c3169a2dddfe3a54de4b2ce4a36341528/httptools-0.8.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6a43c9dd399758ccc0531acb0a3c4a6c299ee893ee9400e9c893b7bdcfae0681", size = 464460, upload-time = "2026-05-25T22:17:20.882Z" }, + { url = "https://files.pythonhosted.org/packages/ce/48/5d1d072442277bb2b3434e0e60690b8e8c23840ef7de8b6ea54040a536d3/httptools-0.8.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:0770728beb05094c809b98e814edff5fef69d26ad7d21185f2f6d5884a0ba683", size = 471312, upload-time = "2026-05-25T22:17:22.085Z" }, + { url = "https://files.pythonhosted.org/packages/0d/66/b96623b27e51a68199ef4efdda0613cced9233fe3062ac74e50749c5ad37/httptools-0.8.0-cp313-cp313-win_amd64.whl", hash = "sha256:7685df791fad561384bfb139e77fde27a1ffd93134e016f95a0db424ffbf77b1", size = 90117, upload-time = "2026-05-25T22:17:23.074Z" }, + { url = "https://files.pythonhosted.org/packages/1a/12/fa3fbf5f9517b273edea2dc982aa82a8c634091e67c590792b729017bc6f/httptools-0.8.0-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:de242a49b5d18e0a8776e654e9f6bf6d89f3875a5c35b425a0e7ce940feb3fd6", size = 206183, upload-time = "2026-05-25T22:17:24.004Z" }, + { url = "https://files.pythonhosted.org/packages/30/fc/5e7c4cb443370f2090a3aba0453a07384d29ff66b7435bb90e77e1037599/httptools-0.8.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:159e9ab5f701ccd42e555a12f1ad8ff69702910fc1c996cf2bb66e5fcb7a231b", size = 112079, upload-time = "2026-05-25T22:17:25.216Z" }, + { url = "https://files.pythonhosted.org/packages/ba/53/771bd891eb0f236f32145d6a1775777ec85745f3cc983a1f23d1a3b8ddfe/httptools-0.8.0-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:c4a9f1707e4823d54dfec6c33fa3697d302aed536ed352a7ebb5a061ddb869d0", size = 481596, upload-time = "2026-05-25T22:17:26.186Z" }, + { url = "https://files.pythonhosted.org/packages/62/42/94e15bc68ce3d423243c45d7f1b0c7561f13844f97dc52ae23182fb65628/httptools-0.8.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d76ad7b951387e3632c8716a9bb03ac5b45c5f16119aa409db0459520887944e", size = 480865, upload-time = "2026-05-25T22:17:27.542Z" }, + { url = "https://files.pythonhosted.org/packages/1c/7c/fe2980fc03723272e30f135b62360b075f513dfe7cc73aef36c7f04012bd/httptools-0.8.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:a3b7387147361c3fd47a0bde763c5c91b5b4cd4dc9989b8ece84ff436c99843b", size = 463189, upload-time = "2026-05-25T22:17:28.546Z" }, + { url = "https://files.pythonhosted.org/packages/15/1b/47fc5fff68acd1bfa20b4734059c9a06cadb88119dcd5258b5b0d21d91c8/httptools-0.8.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:f256d6ce930c52ca1cb2a960b7da03548c454e7d28b06059ad41bfe789036ce0", size = 466610, upload-time = "2026-05-25T22:17:29.816Z" }, + { url = "https://files.pythonhosted.org/packages/60/bd/07b13c93ffd9bec9546e0d43f8e19378dd696dbd278511406bc07371ef1f/httptools-0.8.0-cp314-cp314-win_amd64.whl", hash = "sha256:19d1ee275bb59ba2643ba9a3a1e51cc0c788caf2b8df506368e03f56fdd08527", size = 92705, upload-time = "2026-05-25T22:17:31.133Z" }, + { url = "https://files.pythonhosted.org/packages/fd/c4/121648f68ce066d7bd762d6b6d97e620847642d38d54f3d90ff11d947629/httptools-0.8.0-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:de1ed58a974e75d56560acc7e7fed01a454994429456f65209789992e41f2568", size = 215023, upload-time = "2026-05-25T22:17:32.401Z" }, + { url = "https://files.pythonhosted.org/packages/b9/b0/312a062ae741ae3e8baa8c8bf20be81b2e67337b259ab4349bebc7b6142e/httptools-0.8.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:e93c227b595c6926c1acee96891dd9da4be338cfbe82e5cd3bb9d8dd7dc4ac0b", size = 117405, upload-time = "2026-05-25T22:17:33.742Z" }, + { url = "https://files.pythonhosted.org/packages/fc/37/fccd705f795386bb05bf413012fecff2a33e5aa8c2f069096de3e9fd8702/httptools-0.8.0-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:2a021c3a8e65cc125390d72f59b968afca3bdcaff25bd67965e0a055a14946ca", size = 558497, upload-time = "2026-05-25T22:17:34.732Z" }, + { url = "https://files.pythonhosted.org/packages/bd/39/f172e8003576de35f5ba77ff417cf0e34429d35dc014deef15afa337a72c/httptools-0.8.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:48774d39cbb70e2b1f71f88852a3087ae1d3a1eb80482bb48c13067ab080c14f", size = 571585, upload-time = "2026-05-25T22:17:35.813Z" }, + { url = "https://files.pythonhosted.org/packages/3e/b9/f5564760af99f3dbbf3f9104dc00e5da27e96cf433c6bdcf77617f70bf3f/httptools-0.8.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:88eead8ec8680a9f146c655bc88445a325bd7921cfd8194c7337e9467282427d", size = 543297, upload-time = "2026-05-25T22:17:37.08Z" }, + { url = "https://files.pythonhosted.org/packages/99/67/8d9f2c313618e161b82f3873188e7196126da1d6e29688df40eb3997c77a/httptools-0.8.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:2c032fa028f46871ec7e1fc59fc15e8023eab3e6bbe6ece786a1611719a5d081", size = 539535, upload-time = "2026-05-25T22:17:38.032Z" }, + { url = "https://files.pythonhosted.org/packages/48/63/b906c01e53f50d432c0defe43ce52764a111dc1bdd028bafbeb54dcfd008/httptools-0.8.0-cp314-cp314t-win_amd64.whl", hash = "sha256:384c17174464c8e873398b7af24f0b1f44d992c820328413951a625323155d77", size = 108209, upload-time = "2026-05-25T22:17:39.473Z" }, +] + +[[package]] +name = "httpx" +version = "0.28.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "certifi" }, + { name = "httpcore" }, + { name = "idna" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406, upload-time = "2024-12-06T15:37:23.222Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517, upload-time = "2024-12-06T15:37:21.509Z" }, +] + +[[package]] +name = "idna" +version = "3.16" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1a/88/bcf9709822fe69d02c2a6a77956c98ce6ea8ca8767a9aadcedc7eb6a2390/idna-3.16.tar.gz", hash = "sha256:d7a6da03db833450fca25d2358ac9ff06cd624577a4aea3a596d5c0f77b8e03d", size = 203770, upload-time = "2026-05-22T00:16:18.781Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/94/16/70255075a9859a0e3adb789b68ceb0e210dec03934245fd98d248226572f/idna-3.16-py3-none-any.whl", hash = "sha256:cc246e3a3f89580c3a951b5ad298ca4638078b2cdd4f115654332b5c26daded5", size = 74165, upload-time = "2026-05-22T00:16:16.698Z" }, +] + +[[package]] +name = "iniconfig" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" }, +] + +[[package]] +name = "isodate" +version = "0.7.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/54/4d/e940025e2ce31a8ce1202635910747e5a87cc3a6a6bb2d00973375014749/isodate-0.7.2.tar.gz", hash = "sha256:4cd1aa0f43ca76f4a6c6c0292a85f40b35ec2e43e315b59f06e6d32171a953e6", size = 29705, upload-time = "2024-10-08T23:04:11.5Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/15/aa/0aca39a37d3c7eb941ba736ede56d689e7be91cab5d9ca846bde3999eba6/isodate-0.7.2-py3-none-any.whl", hash = "sha256:28009937d8031054830160fce6d409ed342816b543597cece116d966c6d99e15", size = 22320, upload-time = "2024-10-08T23:04:09.501Z" }, +] + +[[package]] +name = "lxml" +version = "6.1.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/05/3b/aab6728cae887456f409b4d75e8a01856e4f04bd510de38052a47768b680/lxml-6.1.1.tar.gz", hash = "sha256:ba96ae44888e0185281e937633a743ea90d5a196c6000f82565ebb0580012d40", size = 4197430, upload-time = "2026-05-18T19:19:06.424Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a5/eb/7e6f37c5584ccbb2ff267f56fd0339016938c1c8684cfefab9b33ffc2f36/lxml-6.1.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:68a9198d0fc122d14bb76837de9aa80cf84caed990b5b237f532ed87d3706736", size = 8559780, upload-time = "2026-05-18T19:17:57.661Z" }, + { url = "https://files.pythonhosted.org/packages/a1/36/587c2521cf23a2cd6c9c22108aa7528f683a1f195ed7ccd23a4b1786ad36/lxml-6.1.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7d47866cb32fb503450b6edc9df355d10dc49836af2e89901bd6ac6b0896d9d9", size = 4618006, upload-time = "2026-05-18T19:18:04.452Z" }, + { url = "https://files.pythonhosted.org/packages/6e/ca/ab7bfe2bf4c972af5e7878262845ead3a24a929a9b04bc11c7c1ece6c82a/lxml-6.1.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:eb7c9811bfaa8b1ed5ed319f5d370dfbcaa59d52ea64be2a5a85e18195930354", size = 4924139, upload-time = "2026-05-18T19:19:04.873Z" }, + { url = "https://files.pythonhosted.org/packages/6b/55/a0c72851dfee5ecc689f949723a73dea457758912542cb955b108eaf0d8f/lxml-6.1.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:762ff394d5bd56da0cf034a23dcce4e13923f15321a2adfa2ac00201dc6d3fca", size = 5082329, upload-time = "2026-05-18T19:19:09.728Z" }, + { url = "https://files.pythonhosted.org/packages/f0/b6/0608f7d61a3b96cc67e5648a3d906e31a5082093e10e7be65b3886289938/lxml-6.1.1-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a088f287f7d8275a33c07f2cac6c50b9319309a0200a39e7e75d80c707723099", size = 4993564, upload-time = "2026-05-18T19:19:13.608Z" }, + { url = "https://files.pythonhosted.org/packages/4c/66/ae227524b066d29d55bf0b453d93d2d793c40218657d643dcbbca13b8faf/lxml-6.1.1-cp313-cp313-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e902da4b04e6b52e5893900d4b8ab46068f75f3561f01bf1080957f9fd932ed6", size = 5613467, upload-time = "2026-05-18T19:19:16.228Z" }, + { url = "https://files.pythonhosted.org/packages/a6/76/dbe4a00b50385e40194231dcfe5a12c059de7cf90e89c83407d2b085b719/lxml-6.1.1-cp313-cp313-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1d4962d4c66bf830a7e59ed6cfc17d148149898a3aefa8ec6e59763e6e3ed085", size = 5228304, upload-time = "2026-05-18T19:19:19.354Z" }, + { url = "https://files.pythonhosted.org/packages/1c/01/00b1b8442ed2041793336868ba0b9ea4b13d7da7c085c6404c207a63bf79/lxml-6.1.1-cp313-cp313-manylinux_2_28_i686.whl", hash = "sha256:581d4c8ae690a6609e64862dd6b7c2489635c2d13907fc2b20f2bc200ff1d21e", size = 5341607, upload-time = "2026-05-18T19:19:22.297Z" }, + { url = "https://files.pythonhosted.org/packages/63/36/1ad29931e9a4638bb707869f01d423a6c815f82152138d1a40dfcfde2b95/lxml-6.1.1-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:876e1ff5930ed8bf295ec5ef9a8155e9b6b1876bbf1deed8b3a8069311875a8f", size = 4700168, upload-time = "2026-05-18T19:19:25.133Z" }, + { url = "https://files.pythonhosted.org/packages/3c/d1/a9536cecf9be18a0dc72d32bead283a2332d1ffebd2dd3ac70ce444686e5/lxml-6.1.1-cp313-cp313-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:9eb9b5a968f6e0f6d640092a567e14529ff8cea2e29d00da6f78a79fa49f013c", size = 5232487, upload-time = "2026-05-18T19:19:28.603Z" }, + { url = "https://files.pythonhosted.org/packages/0e/77/b4fb1e03bf5d130e879214d3100092e386418807fb74dd0adc4b0a48f351/lxml-6.1.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:aa49e06d94aba782c6a02eecb7e507969e7e7a41b267f1b359bb35585f295d5b", size = 5044231, upload-time = "2026-05-18T19:18:42.246Z" }, + { url = "https://files.pythonhosted.org/packages/26/4c/d00daeeb0a5530c4028a9232aa1b93db3ef4ed2158c116ea73c79a9765b3/lxml-6.1.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:70cdfd80589d59e43e18005dd7244e8895e93db8ab6a620b7e23df5445a4e3d2", size = 4769450, upload-time = "2026-05-18T19:18:48.013Z" }, + { url = "https://files.pythonhosted.org/packages/ed/6a/715a3a8d156ce42f29cf014706f5410c2ff3b02267774110fc23266409fe/lxml-6.1.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:aad9aa39483ed8ec44d6d2e59e5b98a0d80676ef0d92f44bfc374836111f62f5", size = 5635874, upload-time = "2026-05-18T19:18:51.914Z" }, + { url = "https://files.pythonhosted.org/packages/45/37/0544bc21dde2a88f3a17b504e6fc79c0e01d25a33c2f6079724e9e72b9c7/lxml-6.1.1-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:d49514be2f28d895c38cf9d2b72d7b9a07d00314519f456c0b50b53cfcf4c785", size = 5223987, upload-time = "2026-05-18T19:18:59.715Z" }, + { url = "https://files.pythonhosted.org/packages/4d/f8/f6a5e8185bcb28c2befae3d31f8e3df3b811cb0f47746517a81279fcafe1/lxml-6.1.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:47402e62c52ff5988c1e8c6c63177f5708bccf48e366dea4e3dcf1e645e04947", size = 5250276, upload-time = "2026-05-18T19:19:03.834Z" }, + { url = "https://files.pythonhosted.org/packages/c7/f2/1a2b9f1b7a49d45495369be7ef9ad05b262930f2eab3e3145706fca8083f/lxml-6.1.1-cp313-cp313-win32.whl", hash = "sha256:3483644525531e1d5762b0c44a8e18b6efba321b6dcf8a8952de10b037618bca", size = 3596903, upload-time = "2026-05-18T19:17:29.863Z" }, + { url = "https://files.pythonhosted.org/packages/e6/99/f4ffb024f238eec2131aaa09f3278fb6129cf892741bf68e1fc1afb8c100/lxml-6.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:a10bd2fd62e8ce916ececb342f348f190724a098c1faa056fdfb2a22ad5e8660", size = 3995869, upload-time = "2026-05-18T19:18:02.596Z" }, + { url = "https://files.pythonhosted.org/packages/d1/53/70eb8c5c6037f27448f1e3c54ebede9545a801ae63f0a7254afca4fe8e45/lxml-6.1.1-cp313-cp313-win_arm64.whl", hash = "sha256:424aa57aca0897eb922aef34395bd1289b3b6f04e6bae20ea123c0c7e333cffc", size = 3658490, upload-time = "2026-05-19T19:22:53.846Z" }, + { url = "https://files.pythonhosted.org/packages/13/e2/2e325795566de01d0d7c3bb57d3c370616b2d07b01214e84eec5d3b10963/lxml-6.1.1-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:19b7ab10b210b0b3ad7985d9ac4eb66ab09a90b20fe6e2f7ba55d01a234345d0", size = 8577146, upload-time = "2026-05-18T19:18:17.765Z" }, + { url = "https://files.pythonhosted.org/packages/93/cf/5630b5e4be7d2e6bee8efe83865c925221103cf0221303b104ce134b01e2/lxml-6.1.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:c08e5c694306507275f2290073350c4f32e383db15213b2c69e7ff39c1193840", size = 4623866, upload-time = "2026-05-18T19:18:30.669Z" }, + { url = "https://files.pythonhosted.org/packages/d2/51/3904907c063451cf8d4a5c9fe0cad95fa1f4ec57f4e3884fa0731bd7a305/lxml-6.1.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:74a9717fd0d82effef5c2854f0d917231d5324b5a3eb7275c43ac9fa32f97a14", size = 4950022, upload-time = "2026-05-18T19:19:31.958Z" }, + { url = "https://files.pythonhosted.org/packages/94/cd/9c7611a51c37a2830928405817cc5d56a97f64fab83cc3f628748b135749/lxml-6.1.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:efe0374196335f93b53269acd811b944f2e6bdc88e8894f214bd636455484909", size = 5086695, upload-time = "2026-05-18T19:19:34.764Z" }, + { url = "https://files.pythonhosted.org/packages/da/d6/24e3b5906abb0b674ff2ae195bc3ce59708df2bcd17cf17703b2d7dd643a/lxml-6.1.1-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ac931cdc9442c1763b8a8f6cd62c0c938737eafc5be75eff88df55fc73bc0d00", size = 5031642, upload-time = "2026-05-18T19:19:37.771Z" }, + { url = "https://files.pythonhosted.org/packages/2d/db/6ec54f99019838bff54785c51da07f189eb4676861c5f2730962b0d8d665/lxml-6.1.1-cp314-cp314-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:aee395f5d0927f947758b4ec119fd5fc8ec71f07a1c5c52077b30b04c0fa6955", size = 5647338, upload-time = "2026-05-18T19:19:40.553Z" }, + { url = "https://files.pythonhosted.org/packages/42/3d/ef4dcfffd22d27a61805d8ed9f7fb888495bc6aa88648fa07c1eaa5586b6/lxml-6.1.1-cp314-cp314-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9395002973c827b3ed67db77e6ec09f092919a587022174554096a269378fb13", size = 5239528, upload-time = "2026-05-18T19:19:43.657Z" }, + { url = "https://files.pythonhosted.org/packages/62/bb/37fb3f0dff146bdcfa78eec47879273820b2a0bf350ec236ce14bd0b1c26/lxml-6.1.1-cp314-cp314-manylinux_2_28_i686.whl", hash = "sha256:73bc2086f141224ebddb7fc5c6a36ca58b31b94b561e1dfe8e073e3270fad1e7", size = 5350730, upload-time = "2026-05-18T19:19:46.307Z" }, + { url = "https://files.pythonhosted.org/packages/90/42/43253f168388df4fae1f38c01df36ddb9bee39e2048167b54cdcbae85ea3/lxml-6.1.1-cp314-cp314-manylinux_2_31_armv7l.whl", hash = "sha256:3779def59032b81e44a5f70096ef6bf2082f8d901937dca354474ba09782e245", size = 4697530, upload-time = "2026-05-18T19:19:49.889Z" }, + { url = "https://files.pythonhosted.org/packages/eb/a8/c5a8504f81bbdfc8e7094c2c850cdb4ed6777fc4d5ddd9e5ab819f3b0d54/lxml-6.1.1-cp314-cp314-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:86c89b9d55ebf820ad7c90bc533410f0d098054f293351f10603c0c46ff598f5", size = 5250670, upload-time = "2026-05-18T19:19:53.199Z" }, + { url = "https://files.pythonhosted.org/packages/77/b7/c7e76ab18744d75e21f320ebf9ff9d1ceae2b54dd431ea5a64caf26c9672/lxml-6.1.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:19607c6bbff2a44cf3fe8250abccd20942d3462473e0a721d01d379ed017e462", size = 5084485, upload-time = "2026-05-18T19:19:08.422Z" }, + { url = "https://files.pythonhosted.org/packages/31/31/b35c53f8ef7b7c31cacd23d3638652fff7bcd1deb6eedb709ab43b685908/lxml-6.1.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:c6ed5141a5c7507cf3ee76bd363b0d6f801e3321adc35b5d825a23115faa5465", size = 4737635, upload-time = "2026-05-18T19:19:12.321Z" }, + { url = "https://files.pythonhosted.org/packages/d9/06/31f23c813a7fe8e0cb1b175e915b08c9bf4e86d225b210feadbdbe519667/lxml-6.1.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:62aeb7e85b5d60320b9d77eef2e773994e2c0ce10121b277e0a19804e1654a5a", size = 5670681, upload-time = "2026-05-18T19:19:15.001Z" }, + { url = "https://files.pythonhosted.org/packages/1a/bc/ce619bccc89b1fd9ad8a8e1330ee3f3beff9f2ff95b712d7bbcdd6e22fc3/lxml-6.1.1-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:b1b963fd8f5caa68e99dfae060d54de1fe9cba899b8718b44a00cdca53c3e590", size = 5238229, upload-time = "2026-05-18T19:19:18.131Z" }, + { url = "https://files.pythonhosted.org/packages/2f/5d/b329acbbedc0b619ebc2be6cf7ee9ed07e80892c88d4dfd612c33805789a/lxml-6.1.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:63876be28efefa04a1df615b46770e82042cce445cfdce55160522f57b231ccb", size = 5264191, upload-time = "2026-05-18T19:19:21.118Z" }, + { url = "https://files.pythonhosted.org/packages/d6/85/be36fb1425b30db3c3f9df75fe86343ebffb79e6320bd7f588e25bfeac39/lxml-6.1.1-cp314-cp314-win32.whl", hash = "sha256:7f7a92e8583f06b1fd49d01158143b8461cfcd135dcb10ec807270a3051bd603", size = 3657202, upload-time = "2026-05-18T19:17:39.509Z" }, + { url = "https://files.pythonhosted.org/packages/b8/ce/3cf9a827342269f54d405a6202397de63f07c69cbd6ce7d183a3f0cba1e9/lxml-6.1.1-cp314-cp314-win_amd64.whl", hash = "sha256:b2d444f2e66624d68e9c6b211e28a76e22fff5fcabcfff4deac18b529b7d4137", size = 4064497, upload-time = "2026-05-18T19:18:14.662Z" }, + { url = "https://files.pythonhosted.org/packages/d9/3e/1a957bde8f0760039e627f94699f82caa782c9d838d86c3d28245ee67212/lxml-6.1.1-cp314-cp314-win_arm64.whl", hash = "sha256:3fd9728a2735fda14f4e8235830c86b539e9661e849665bf926d3f867943b4bf", size = 3741991, upload-time = "2026-05-19T19:22:59.111Z" }, + { url = "https://files.pythonhosted.org/packages/78/b2/00ed55b3a2efa4658fb795c38d1090ec9b3e8a6c3683d4441fa517f09c3b/lxml-6.1.1-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:787b2496d0dbe8cd180984e8d29e3a6f76e7ea34db781cb3bd55e4ba1ef8b4ee", size = 8827545, upload-time = "2026-05-18T19:18:41.193Z" }, + { url = "https://files.pythonhosted.org/packages/c0/73/74573db19baa618d5f266f2407898b087ff6927115b00b71e5fc1b700847/lxml-6.1.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:2c8daa471358dc2d6fcf02165e80ec68f77871a286df95bc5cc3816153b0fd2c", size = 4735736, upload-time = "2026-05-18T19:18:46.761Z" }, + { url = "https://files.pythonhosted.org/packages/16/02/6f7061f4f95f51e545d48e87647c54791d204a4e881be4156e7a26ba5338/lxml-6.1.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:acd7d70b64c0aae0c7922cca83d288a16f5f6da523637697872253415269baef", size = 4970291, upload-time = "2026-05-18T19:19:56.215Z" }, + { url = "https://files.pythonhosted.org/packages/b0/02/55fc057d8283427dea7d6edb102e7a840239c77a64a983d92f62a304c0e9/lxml-6.1.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4f0dd2f01f9f8a89f565d000e03abcf0a13d692a346c8d22f628d49af098777a", size = 5102822, upload-time = "2026-05-18T19:19:59.223Z" }, + { url = "https://files.pythonhosted.org/packages/e4/48/8e1cf78d89d66850121d9255a2a24414c98f775da93b90cf976956c24b14/lxml-6.1.1-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0b7e8a14c8634bf6f7a568634cb395305a6d964aeb5b7ee32248094bed3a7e2c", size = 5027923, upload-time = "2026-05-18T19:20:01.549Z" }, + { url = "https://files.pythonhosted.org/packages/ed/00/0632a0647612c8af24d26997b3b961397daa9d5b2581444805933629a4cb/lxml-6.1.1-cp314-cp314t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:86281fbdd6a8162756f8d603f37e3435bfa38043adb79c6dc6a2dfee065e7525", size = 5595843, upload-time = "2026-05-18T19:20:03.93Z" }, + { url = "https://files.pythonhosted.org/packages/bc/86/ab008a7dc360711b66858d61c80a5979a70a09f2aa2b05d9698df80b803d/lxml-6.1.1-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c5d7152ec39ca7c402d8fb9bad86140a15b9503bd0c54484e3f1bbe3dd37ceca", size = 5224515, upload-time = "2026-05-18T19:20:06.381Z" }, + { url = "https://files.pythonhosted.org/packages/75/c6/2702ff375e728e34f56d9a45339a9cf7e4427e917f542225242d63a05afa/lxml-6.1.1-cp314-cp314t-manylinux_2_28_i686.whl", hash = "sha256:88d8cb75b9d82858497a5393e3c63cfbf03035225e4b35a49ed7ccb151e4dc0e", size = 5312511, upload-time = "2026-05-18T19:20:09.308Z" }, + { url = "https://files.pythonhosted.org/packages/b7/57/a5807c98f87a86f10ef9ffab35516df7c0f0c4b6d5d33e9f608ab9c04a31/lxml-6.1.1-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:f64ec5397ea6a41fc1b4af0380d79b44a755b5531dcaccd9940fb260dca93038", size = 4639206, upload-time = "2026-05-18T19:20:11.704Z" }, + { url = "https://files.pythonhosted.org/packages/1f/e1/8a0a2c35734812395f4da4eaf33748a7e5705bfb2a58b128da764339d5ec/lxml-6.1.1-cp314-cp314t-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d34bbf07dbc7ca5970671b1512e928991fb5e9d95365636c9b2d8b4f53af405e", size = 5232404, upload-time = "2026-05-18T19:20:14.064Z" }, + { url = "https://files.pythonhosted.org/packages/c2/e2/0e6a4dd5ad84d01d99aa7bae7cfefd4a760a0e0f8176818241de17d9b6c0/lxml-6.1.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:17e0e18d4ad8adbd0399291bc44845b69d9dd68439a3cdebdf35ff902ec05072", size = 5083769, upload-time = "2026-05-18T19:19:23.758Z" }, + { url = "https://files.pythonhosted.org/packages/a0/7e/161f33d463f6ffc1c7679104b65086dea120080d49dde4d238f015aaee2f/lxml-6.1.1-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:3ab541146f1f6968c462d6c2ac495148e8cdba2f8347700b2141b6ec5a75bf52", size = 4758936, upload-time = "2026-05-18T19:19:27.256Z" }, + { url = "https://files.pythonhosted.org/packages/f1/fb/2369825e3f6ca99305bf9f7b7085fda91c8b0922a89e54d900974aa3ef85/lxml-6.1.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:2a0217714657e023ef4293500f65aa20fce6164c8fd6b08fa5bd4a859fb14b9b", size = 5620296, upload-time = "2026-05-18T19:19:29.993Z" }, + { url = "https://files.pythonhosted.org/packages/30/90/d61e383146f74c5ab683947ea14dc7b82778838ab9b95ea73a23b60d0191/lxml-6.1.1-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:05a82eb6e1530a64f26225b55cbd178113bd0b5af1c2b625f25e5296742c26d2", size = 5228598, upload-time = "2026-05-18T19:19:33.523Z" }, + { url = "https://files.pythonhosted.org/packages/76/2d/2dafd8149e94b05bb070690efd5bb2680720681e03ff03fc57d2b70a1105/lxml-6.1.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:9e36f163528fc50cbef305f02a5fd66d404edf7049cdaff211dbc2cba5a7013e", size = 5247845, upload-time = "2026-05-18T19:19:36.649Z" }, + { url = "https://files.pythonhosted.org/packages/ce/68/b30e913340c380ddac9580c6e6230991fc37240ec4f64704833e4f3e2769/lxml-6.1.1-cp314-cp314t-win32.whl", hash = "sha256:649dda677cf3bd6ac9ae14007ba0c824ded8ce5808b53fc7431d9140399118c1", size = 3897345, upload-time = "2026-05-18T19:17:33.562Z" }, + { url = "https://files.pythonhosted.org/packages/3c/4e/9eb2af5335545f9fbcd7af57bcf87c6025d31eaa31b14ec184a6c8675328/lxml-6.1.1-cp314-cp314t-win_amd64.whl", hash = "sha256:793033d6c5cdf33a573f910d9bea14ef8f5771820411d118da8e1182edb53d5e", size = 4393350, upload-time = "2026-05-18T19:18:10.076Z" }, + { url = "https://files.pythonhosted.org/packages/7f/2c/0f1e93c636720e8a3eb59af2bfda99d98b55891e1c53bc30c2e0e865f01b/lxml-6.1.1-cp314-cp314t-win_arm64.whl", hash = "sha256:58bb955caba94e467d2a96da17660d2d704e0675894cba21ab8a775b8621fd1c", size = 3817223, upload-time = "2026-05-19T19:22:56.823Z" }, +] + +[[package]] +name = "noaa-coops" +version = "0.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pandas" }, + { name = "requests" }, + { name = "zeep" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/1b/d1/a0617ae0bd29a3096e8de4134806d755ec83b5e737e85fec8f027acc2eb6/noaa_coops-0.4.0.tar.gz", hash = "sha256:9b7853cd4b2961332e930723dee05b45a8539976cbd5a2550fd3577e3c20841f", size = 14730, upload-time = "2024-08-03T14:39:49.093Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/67/1c/21121519247ff05b987dc5293d33302aa8fcdf68ab41626162f03becbd81/noaa_coops-0.4.0-py3-none-any.whl", hash = "sha256:d05f00de2f889f3e01a1b4454f57f44268dea35b322ba9cbdc532effe21e8522", size = 13539, upload-time = "2024-08-03T14:39:48.066Z" }, +] + +[[package]] +name = "numpy" +version = "2.4.6" +source = { registry = "https://pypi.org/simple" } +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/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" }, +] + +[[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 = "pandas" +version = "2.3.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, + { name = "python-dateutil" }, + { name = "pytz" }, + { name = "tzdata" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/33/01/d40b85317f86cf08d853a4f495195c73815fdf205eef3993821720274518/pandas-2.3.3.tar.gz", hash = "sha256:e05e1af93b977f7eafa636d043f9f94c7ee3ac81af99c13508215942e64c993b", size = 4495223, upload-time = "2025-09-29T23:34:51.853Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cd/4b/18b035ee18f97c1040d94debd8f2e737000ad70ccc8f5513f4eefad75f4b/pandas-2.3.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:56851a737e3470de7fa88e6131f41281ed440d29a9268dcbf0002da5ac366713", size = 11544671, upload-time = "2025-09-29T23:21:05.024Z" }, + { url = "https://files.pythonhosted.org/packages/31/94/72fac03573102779920099bcac1c3b05975c2cb5f01eac609faf34bed1ca/pandas-2.3.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bdcd9d1167f4885211e401b3036c0c8d9e274eee67ea8d0758a256d60704cfe8", size = 10680807, upload-time = "2025-09-29T23:21:15.979Z" }, + { url = "https://files.pythonhosted.org/packages/16/87/9472cf4a487d848476865321de18cc8c920b8cab98453ab79dbbc98db63a/pandas-2.3.3-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e32e7cc9af0f1cc15548288a51a3b681cc2a219faa838e995f7dc53dbab1062d", size = 11709872, upload-time = "2025-09-29T23:21:27.165Z" }, + { url = "https://files.pythonhosted.org/packages/15/07/284f757f63f8a8d69ed4472bfd85122bd086e637bf4ed09de572d575a693/pandas-2.3.3-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:318d77e0e42a628c04dc56bcef4b40de67918f7041c2b061af1da41dcff670ac", size = 12306371, upload-time = "2025-09-29T23:21:40.532Z" }, + { url = "https://files.pythonhosted.org/packages/33/81/a3afc88fca4aa925804a27d2676d22dcd2031c2ebe08aabd0ae55b9ff282/pandas-2.3.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4e0a175408804d566144e170d0476b15d78458795bb18f1304fb94160cabf40c", size = 12765333, upload-time = "2025-09-29T23:21:55.77Z" }, + { url = "https://files.pythonhosted.org/packages/8d/0f/b4d4ae743a83742f1153464cf1a8ecfafc3ac59722a0b5c8602310cb7158/pandas-2.3.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:93c2d9ab0fc11822b5eece72ec9587e172f63cff87c00b062f6e37448ced4493", size = 13418120, upload-time = "2025-09-29T23:22:10.109Z" }, + { url = "https://files.pythonhosted.org/packages/4f/c7/e54682c96a895d0c808453269e0b5928a07a127a15704fedb643e9b0a4c8/pandas-2.3.3-cp313-cp313-win_amd64.whl", hash = "sha256:f8bfc0e12dc78f777f323f55c58649591b2cd0c43534e8355c51d3fede5f4dee", size = 10993991, upload-time = "2025-09-29T23:25:04.889Z" }, + { url = "https://files.pythonhosted.org/packages/f9/ca/3f8d4f49740799189e1395812f3bf23b5e8fc7c190827d55a610da72ce55/pandas-2.3.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:75ea25f9529fdec2d2e93a42c523962261e567d250b0013b16210e1d40d7c2e5", size = 12048227, upload-time = "2025-09-29T23:22:24.343Z" }, + { url = "https://files.pythonhosted.org/packages/0e/5a/f43efec3e8c0cc92c4663ccad372dbdff72b60bdb56b2749f04aa1d07d7e/pandas-2.3.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:74ecdf1d301e812db96a465a525952f4dde225fdb6d8e5a521d47e1f42041e21", size = 11411056, upload-time = "2025-09-29T23:22:37.762Z" }, + { url = "https://files.pythonhosted.org/packages/46/b1/85331edfc591208c9d1a63a06baa67b21d332e63b7a591a5ba42a10bb507/pandas-2.3.3-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6435cb949cb34ec11cc9860246ccb2fdc9ecd742c12d3304989017d53f039a78", size = 11645189, upload-time = "2025-09-29T23:22:51.688Z" }, + { url = "https://files.pythonhosted.org/packages/44/23/78d645adc35d94d1ac4f2a3c4112ab6f5b8999f4898b8cdf01252f8df4a9/pandas-2.3.3-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:900f47d8f20860de523a1ac881c4c36d65efcb2eb850e6948140fa781736e110", size = 12121912, upload-time = "2025-09-29T23:23:05.042Z" }, + { url = "https://files.pythonhosted.org/packages/53/da/d10013df5e6aaef6b425aa0c32e1fc1f3e431e4bcabd420517dceadce354/pandas-2.3.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a45c765238e2ed7d7c608fc5bc4a6f88b642f2f01e70c0c23d2224dd21829d86", size = 12712160, upload-time = "2025-09-29T23:23:28.57Z" }, + { url = "https://files.pythonhosted.org/packages/bd/17/e756653095a083d8a37cbd816cb87148debcfcd920129b25f99dd8d04271/pandas-2.3.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:c4fc4c21971a1a9f4bdb4c73978c7f7256caa3e62b323f70d6cb80db583350bc", size = 13199233, upload-time = "2025-09-29T23:24:24.876Z" }, + { url = "https://files.pythonhosted.org/packages/04/fd/74903979833db8390b73b3a8a7d30d146d710bd32703724dd9083950386f/pandas-2.3.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:ee15f284898e7b246df8087fc82b87b01686f98ee67d85a17b7ab44143a3a9a0", size = 11540635, upload-time = "2025-09-29T23:25:52.486Z" }, + { url = "https://files.pythonhosted.org/packages/21/00/266d6b357ad5e6d3ad55093a7e8efc7dd245f5a842b584db9f30b0f0a287/pandas-2.3.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1611aedd912e1ff81ff41c745822980c49ce4a7907537be8692c8dbc31924593", size = 10759079, upload-time = "2025-09-29T23:26:33.204Z" }, + { url = "https://files.pythonhosted.org/packages/ca/05/d01ef80a7a3a12b2f8bbf16daba1e17c98a2f039cbc8e2f77a2c5a63d382/pandas-2.3.3-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6d2cefc361461662ac48810cb14365a365ce864afe85ef1f447ff5a1e99ea81c", size = 11814049, upload-time = "2025-09-29T23:27:15.384Z" }, + { url = "https://files.pythonhosted.org/packages/15/b2/0e62f78c0c5ba7e3d2c5945a82456f4fac76c480940f805e0b97fcbc2f65/pandas-2.3.3-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ee67acbbf05014ea6c763beb097e03cd629961c8a632075eeb34247120abcb4b", size = 12332638, upload-time = "2025-09-29T23:27:51.625Z" }, + { url = "https://files.pythonhosted.org/packages/c5/33/dd70400631b62b9b29c3c93d2feee1d0964dc2bae2e5ad7a6c73a7f25325/pandas-2.3.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c46467899aaa4da076d5abc11084634e2d197e9460643dd455ac3db5856b24d6", size = 12886834, upload-time = "2025-09-29T23:28:21.289Z" }, + { url = "https://files.pythonhosted.org/packages/d3/18/b5d48f55821228d0d2692b34fd5034bb185e854bdb592e9c640f6290e012/pandas-2.3.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:6253c72c6a1d990a410bc7de641d34053364ef8bcd3126f7e7450125887dffe3", size = 13409925, upload-time = "2025-09-29T23:28:58.261Z" }, + { url = "https://files.pythonhosted.org/packages/a6/3d/124ac75fcd0ecc09b8fdccb0246ef65e35b012030defb0e0eba2cbbbe948/pandas-2.3.3-cp314-cp314-win_amd64.whl", hash = "sha256:1b07204a219b3b7350abaae088f451860223a52cfb8a6c53358e7948735158e5", size = 11109071, upload-time = "2025-09-29T23:32:27.484Z" }, + { url = "https://files.pythonhosted.org/packages/89/9c/0e21c895c38a157e0faa1fb64587a9226d6dd46452cac4532d80c3c4a244/pandas-2.3.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:2462b1a365b6109d275250baaae7b760fd25c726aaca0054649286bcfbb3e8ec", size = 12048504, upload-time = "2025-09-29T23:29:31.47Z" }, + { url = "https://files.pythonhosted.org/packages/d7/82/b69a1c95df796858777b68fbe6a81d37443a33319761d7c652ce77797475/pandas-2.3.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:0242fe9a49aa8b4d78a4fa03acb397a58833ef6199e9aa40a95f027bb3a1b6e7", size = 11410702, upload-time = "2025-09-29T23:29:54.591Z" }, + { url = "https://files.pythonhosted.org/packages/f9/88/702bde3ba0a94b8c73a0181e05144b10f13f29ebfc2150c3a79062a8195d/pandas-2.3.3-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a21d830e78df0a515db2b3d2f5570610f5e6bd2e27749770e8bb7b524b89b450", size = 11634535, upload-time = "2025-09-29T23:30:21.003Z" }, + { url = "https://files.pythonhosted.org/packages/a4/1e/1bac1a839d12e6a82ec6cb40cda2edde64a2013a66963293696bbf31fbbb/pandas-2.3.3-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2e3ebdb170b5ef78f19bfb71b0dc5dc58775032361fa188e814959b74d726dd5", size = 12121582, upload-time = "2025-09-29T23:30:43.391Z" }, + { url = "https://files.pythonhosted.org/packages/44/91/483de934193e12a3b1d6ae7c8645d083ff88dec75f46e827562f1e4b4da6/pandas-2.3.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:d051c0e065b94b7a3cea50eb1ec32e912cd96dba41647eb24104b6c6c14c5788", size = 12699963, upload-time = "2025-09-29T23:31:10.009Z" }, + { url = "https://files.pythonhosted.org/packages/70/44/5191d2e4026f86a2a109053e194d3ba7a31a2d10a9c2348368c63ed4e85a/pandas-2.3.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:3869faf4bd07b3b66a9f462417d0ca3a9df29a9f6abd5d0d0dbab15dac7abe87", size = 13202175, upload-time = "2025-09-29T23:31:59.173Z" }, +] + +[[package]] +name = "platformdirs" +version = "4.9.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9f/4a/0883b8e3802965322523f0b200ecf33d31f10991d0401162f4b23c698b42/platformdirs-4.9.6.tar.gz", hash = "sha256:3bfa75b0ad0db84096ae777218481852c0ebc6c727b3168c1b9e0118e458cf0a", size = 29400, upload-time = "2026-04-09T00:04:10.812Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl", hash = "sha256:e61adb1d5e5cb3441b4b7710bea7e4c12250ca49439228cc1021c00dcfac0917", size = 21348, upload-time = "2026-04-09T00:04:09.463Z" }, +] + +[[package]] +name = "pluggy" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, +] + +[[package]] +name = "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/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" }, +] + +[[package]] +name = "pydantic-settings" +version = "2.14.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pydantic" }, + { name = "python-dotenv" }, + { name = "typing-inspection" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/07/60/1d1e59c9c90d54591469ada7d268251f71c24bdb765f1a8a832cee8c6653/pydantic_settings-2.14.1.tar.gz", hash = "sha256:e874d3bec7e787b0c9958277956ed9b4dd5de6a80e162188fdaff7c5e26fd5fa", size = 235551, upload-time = "2026-05-08T13:40:06.542Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ae/8d/f1af3832f5e6eb13ba94ee809e72b8ecb5eef226d27ee0bef7d963d943c7/pydantic_settings-2.14.1-py3-none-any.whl", hash = "sha256:6e3c7edfd8277687cdc598f56e5cff0e9bfff0910a3749deaa8d4401c3a2b9de", size = 60964, upload-time = "2026-05-08T13:40:04.958Z" }, +] + +[[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 = "pytest" +version = "9.0.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "iniconfig" }, + { name = "packaging" }, + { name = "pluggy" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7d/0d/549bd94f1a0a402dc8cf64563a117c0f3765662e2e668477624baeec44d5/pytest-9.0.3.tar.gz", hash = "sha256:b86ada508af81d19edeb213c681b1d48246c1a91d304c6c81a427674c17eb91c", size = 1572165, upload-time = "2026-04-07T17:16:18.027Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl", hash = "sha256:2c5efc453d45394fdd706ade797c0a81091eccd1d6e4bccfcd476e2b8e0ab5d9", size = 375249, upload-time = "2026-04-07T17:16:16.13Z" }, +] + +[[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 = "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/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 = "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 = "requests-file" +version = "3.0.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/3c/f8/5dc70102e4d337063452c82e1f0d95e39abfe67aa222ed8a5ddeb9df8de8/requests_file-3.0.1.tar.gz", hash = "sha256:f14243d7796c588f3521bd423c5dea2ee4cc730e54a3cac9574d78aca1272576", size = 6967, upload-time = "2025-10-20T18:56:42.279Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e1/d5/de8f089119205a09da657ed4784c584ede8381a0ce6821212a6d4ca47054/requests_file-3.0.1-py2.py3-none-any.whl", hash = "sha256:d0f5eb94353986d998f80ac63c7f146a307728be051d4d1cd390dbdb59c10fa2", size = 4514, upload-time = "2025-10-20T18:56:41.184Z" }, +] + +[[package]] +name = "requests-toolbelt" +version = "1.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f3/61/d7545dafb7ac2230c70d38d31cbfe4cc64f7144dc41f6e4e4b78ecd9f5bb/requests-toolbelt-1.0.0.tar.gz", hash = "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6", size = 206888, upload-time = "2023-05-01T04:11:33.229Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3f/51/d4db610ef29373b879047326cbf6fa98b6c1969d6f6dc423279de2b1be2c/requests_toolbelt-1.0.0-py2.py3-none-any.whl", hash = "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06", size = 54481, upload-time = "2023-05-01T04:11:28.427Z" }, +] + +[[package]] +name = "ruff" +version = "0.15.14" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/dc/8a/8bce2894573e9dae6ff4d77fe34ad727d79b9e6238ad288c5638990d90f6/ruff-0.15.14.tar.gz", hash = "sha256:48e866b165be4a9bdbf310f7d3c9a07edef2fe8cd63ffeb4e00bb590506ebf9f", size = 4700910, upload-time = "2026-05-21T14:34:55.177Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b9/c8/74a92c6ff9fcfb4f1f947126d3ebee8389276e161ecc85de5bda7cda51bd/ruff-0.15.14-py3-none-linux_armv6l.whl", hash = "sha256:8dd2db9416e487c8d4b01fa7056bb02c4d05969d4f8d17a08c229c2f4ff3c108", size = 10739177, upload-time = "2026-05-21T14:34:37.332Z" }, + { url = "https://files.pythonhosted.org/packages/45/91/254a35c20acc38a7223c9d2d594af12e794432464f2cdeb52af1dc4a892d/ruff-0.15.14-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:be4ff55af755bd71a00ab3dc6bd7ffc467bd76e0df6881e286c2e3d23e8fb43b", size = 11144969, upload-time = "2026-05-21T14:34:43.978Z" }, + { url = "https://files.pythonhosted.org/packages/56/9e/d13e40f83b8d0a94430e6778ce1d94a43b38cf2efe63278bdd2b4c65abbf/ruff-0.15.14-py3-none-macosx_11_0_arm64.whl", hash = "sha256:48d5909d7d06276ce7dde6d32bfa4b0d4cb2651145cd8ee4b440722cbc77832f", size = 10478207, upload-time = "2026-05-21T14:34:48.378Z" }, + { url = "https://files.pythonhosted.org/packages/8d/f1/b15a7839fa4f332f8acec78e20564f26bb2d866e3d21710b877fd0263000/ruff-0.15.14-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca8cbfa94c4f90984a67561978602746d4cd27103568f745fa90eee3f0d4107d", size = 10818459, upload-time = "2026-05-21T14:34:22.318Z" }, + { url = "https://files.pythonhosted.org/packages/45/33/53d651177f84f94b400a0e27f8824eeada3dddc9d5ee8aeb048f4352a520/ruff-0.15.14-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9a6bbc0333f1ab053423bcbf6226477d266ca7cec7738c4c8e3f55647803f3c4", size = 10541800, upload-time = "2026-05-21T14:34:20.209Z" }, + { url = "https://files.pythonhosted.org/packages/b8/a6/868f87e0bf9786ed24b5d0d0ad8676b8a94fd1912f42cddf9cfc7857818a/ruff-0.15.14-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8a24a4f7605d7003a6674d4387651effd939dead3fddd0f36561eb77a9a2e542", size = 11342149, upload-time = "2026-05-21T14:34:46.365Z" }, + { url = "https://files.pythonhosted.org/packages/a7/8b/38cd5c19faffdcc05a408d2b78edccc69492ab9720eadb49ea15ef80d768/ruff-0.15.14-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:049b5326e53ed80978f2fc041a280603f69dd6b0c95464342a2bb4572d9d9e2f", size = 12212563, upload-time = "2026-05-21T14:34:28.579Z" }, + { url = "https://files.pythonhosted.org/packages/3e/4d/a3c5b874a556d5731e3e657aaf04311bb76f0a5c3ec220ed43051be6b64b/ruff-0.15.14-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d4ed42e6696c8dfa5f06728e6441993901f548eb92d73bc472cb5a38d1395fbf", size = 11493299, upload-time = "2026-05-21T14:34:41.836Z" }, + { url = "https://files.pythonhosted.org/packages/1e/c0/56472c251d09858a53e51efbd485b09e1995d8731668b76d52e5dd6ee0f1/ruff-0.15.14-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:715c543cf450c4888251f91c52f1942a800541d9bddd7ac060aa4e6b77ae7cba", size = 11455931, upload-time = "2026-05-21T14:34:57.276Z" }, + { url = "https://files.pythonhosted.org/packages/2c/4a/e2e7b4d8dbf233d4eace59c75bc3435fa6d8bd3bae82d351d4e4300c0fd1/ruff-0.15.14-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:72ebab6013ec887d439d8b7593737a0a4ffb06d45d209d4e4bf2e92813082d3f", size = 11400794, upload-time = "2026-05-21T14:34:39.773Z" }, + { url = "https://files.pythonhosted.org/packages/97/c7/83c0539fe34c3e09136204d1e75d6052492364e0b3cb05e9465423f567d7/ruff-0.15.14-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:49072d36abdbe97a8dd7f480afe9c675699c0c495d4c84076e2c1203c4550581", size = 10804759, upload-time = "2026-05-21T14:34:31.045Z" }, + { url = "https://files.pythonhosted.org/packages/86/a6/18f2bfc095a2ab4a78745644e428205532ce6653a5d0fa8501572891534d/ruff-0.15.14-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:958522aee105068640c2c2ceae08f413ae44d922f52a1374ac13d6a96032fc93", size = 10539517, upload-time = "2026-05-21T14:34:53.064Z" }, + { url = "https://files.pythonhosted.org/packages/54/3a/5a8b3b69c654d4e4bf1d246ac5b49cbcdac6eaab6905925f8915f31e3b80/ruff-0.15.14-py3-none-musllinux_1_2_i686.whl", hash = "sha256:f3707da619a143a2e8830e2abab8224478d69ace2d28cb6c20543ae97c36bf61", size = 11065169, upload-time = "2026-05-21T14:34:24.484Z" }, + { url = "https://files.pythonhosted.org/packages/ed/c5/8864e4e7925b836ea354b31d57641ec03830564e281a8b6f061f8c3e0ec1/ruff-0.15.14-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:bb01d645694e3ec0102105d07ef2d53703970407d59c04e59d3ba0b7a1d53553", size = 11560214, upload-time = "2026-05-21T14:34:50.975Z" }, + { url = "https://files.pythonhosted.org/packages/36/38/012bf76752e1f89ed50b77b99532d90f3a3e287bc7918e1fc0948ac866ac/ruff-0.15.14-py3-none-win32.whl", hash = "sha256:6d0c1ad2a0ab718d39b6d8fd2217981ce4d625cd96a720095f798fb47d8b13e6", size = 10805548, upload-time = "2026-05-21T14:34:33.453Z" }, + { url = "https://files.pythonhosted.org/packages/d1/b7/4ea2c170f10ad760fff2a5250beb18897719dc8b52b53a24cddbb9dd3f19/ruff-0.15.14-py3-none-win_amd64.whl", hash = "sha256:802342981e056db3851a7836e5b070f8f15f67d4a685ae2a6160939d364b2902", size = 11939523, upload-time = "2026-05-21T14:34:18.077Z" }, + { url = "https://files.pythonhosted.org/packages/62/d5/bc97ff895ec35cf3925d4bd60f3b39d822f377a446906ec9bcc87405e59b/ruff-0.15.14-py3-none-win_arm64.whl", hash = "sha256:ff47b90a9ef6a40c9e2f3b479c1fb78531adf055b94c1eba0a7ba04b31951826", size = 11208607, upload-time = "2026-05-21T14:34:26.525Z" }, +] + +[[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 = "starlette" +version = "1.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/95/66/4d20cdf39a8d6a51e663b7038e3b828ff211d3891a43a713fe7e4643f3a8/starlette-1.1.0.tar.gz", hash = "sha256:e83c7fe0ddecd8719c5b840080325aec0260acec86e9832899e377b91d65e90f", size = 2660060, upload-time = "2026-05-23T16:55:41.376Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/93/79/920b8e0a8b20f793e8d64855095cb8febabf6175b8550b6f7a547d813891/starlette-1.1.0-py3-none-any.whl", hash = "sha256:7f0dfd38e428aad5cb6f9f667f0ca1d2d8ca3f3385dccac8305f79ec98458382", size = 72899, upload-time = "2026-05-23T16:55:39.201Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.15.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", size = 109391, upload-time = "2025-08-25T13:49:26.313Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614, upload-time = "2025-08-25T13:49:24.86Z" }, +] + +[[package]] +name = "typing-inspection" +version = "0.4.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/55/e3/70399cb7dd41c10ac53367ae42139cf4b1ca5f36bb3dc6c9d33acdb43655/typing_inspection-0.4.2.tar.gz", hash = "sha256:ba561c48a67c5958007083d386c3295464928b01faa735ab8547c5692e87f464", size = 75949, upload-time = "2025-10-01T02:14:41.687Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl", hash = "sha256:4ed1cacbdc298c220f1bd249ed5287caa16f34d44ef4e9c3d0cbad5b521545e7", size = 14611, upload-time = "2025-10-01T02:14:40.154Z" }, +] + +[[package]] +name = "tzdata" +version = "2026.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ba/19/1b9b0e29f30c6d35cb345486df41110984ea67ae69dddbc0e8a100999493/tzdata-2026.2.tar.gz", hash = "sha256:9173fde7d80d9018e02a662e168e5a2d04f87c41ea174b139fbef642eda62d10", size = 198254, upload-time = "2026-04-24T15:22:08.651Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ce/e4/dccd7f47c4b64213ac01ef921a1337ee6e30e8c6466046018326977efd95/tzdata-2026.2-py2.py3-none-any.whl", hash = "sha256:bbe9af844f658da81a5f95019480da3a89415801f6cc966806612cc7169bffe7", size = 349321, upload-time = "2026-04-24T15:22:05.876Z" }, +] + +[[package]] +name = "urllib3" +version = "2.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/53/0c/06f8b233b8fd13b9e5ee11424ef85419ba0d8ba0b3138bf360be2ff56953/urllib3-2.7.0.tar.gz", hash = "sha256:231e0ec3b63ceb14667c67be60f2f2c40a518cb38b03af60abc813da26505f4c", size = 433602, upload-time = "2026-05-07T16:13:18.596Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl", hash = "sha256:9fb4c81ebbb1ce9531cce37674bbc6f1360472bc18ca9a553ede278ef7276897", size = 131087, upload-time = "2026-05-07T16:13:17.151Z" }, +] + +[[package]] +name = "uvicorn" +version = "0.48.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "h11" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e6/bf/f6544ba992ddb9a6077343a576f9844f7f8f06ab819aefd00206e9255f18/uvicorn-0.48.0.tar.gz", hash = "sha256:a5504207195d08c2511bf9125ede5ac4a4b71725d519e758d01dcf0bc2d31c37", size = 91074, upload-time = "2026-05-24T12:08:41.925Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/01/be/72532be3da7acc5fdfbccdb95215cd04f995a0886532a5b423f929cda4cc/uvicorn-0.48.0-py3-none-any.whl", hash = "sha256:48097851328b87ec36117d3d575234519eb58c2b22d79666e9bbc6c49a761dad", size = 71410, upload-time = "2026-05-24T12:08:40.258Z" }, +] + +[package.optional-dependencies] +standard = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "httptools" }, + { name = "python-dotenv" }, + { name = "pyyaml" }, + { name = "uvloop", marker = "platform_python_implementation != 'PyPy' and sys_platform != 'cygwin' and sys_platform != 'win32'" }, + { name = "watchfiles" }, + { name = "websockets" }, +] + +[[package]] +name = "uvloop" +version = "0.22.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/06/f0/18d39dbd1971d6d62c4629cc7fa67f74821b0dc1f5a77af43719de7936a7/uvloop-0.22.1.tar.gz", hash = "sha256:6c84bae345b9147082b17371e3dd5d42775bddce91f885499017f4607fdaf39f", size = 2443250, upload-time = "2025-10-16T22:17:19.342Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/89/8c/182a2a593195bfd39842ea68ebc084e20c850806117213f5a299dfc513d9/uvloop-0.22.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:561577354eb94200d75aca23fbde86ee11be36b00e52a4eaf8f50fb0c86b7705", size = 1358611, upload-time = "2025-10-16T22:16:36.833Z" }, + { url = "https://files.pythonhosted.org/packages/d2/14/e301ee96a6dc95224b6f1162cd3312f6d1217be3907b79173b06785f2fe7/uvloop-0.22.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1cdf5192ab3e674ca26da2eada35b288d2fa49fdd0f357a19f0e7c4e7d5077c8", size = 751811, upload-time = "2025-10-16T22:16:38.275Z" }, + { url = "https://files.pythonhosted.org/packages/b7/02/654426ce265ac19e2980bfd9ea6590ca96a56f10c76e63801a2df01c0486/uvloop-0.22.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6e2ea3d6190a2968f4a14a23019d3b16870dd2190cd69c8180f7c632d21de68d", size = 4288562, upload-time = "2025-10-16T22:16:39.375Z" }, + { url = "https://files.pythonhosted.org/packages/15/c0/0be24758891ef825f2065cd5db8741aaddabe3e248ee6acc5e8a80f04005/uvloop-0.22.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0530a5fbad9c9e4ee3f2b33b148c6a64d47bbad8000ea63704fa8260f4cf728e", size = 4366890, upload-time = "2025-10-16T22:16:40.547Z" }, + { url = "https://files.pythonhosted.org/packages/d2/53/8369e5219a5855869bcee5f4d317f6da0e2c669aecf0ef7d371e3d084449/uvloop-0.22.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bc5ef13bbc10b5335792360623cc378d52d7e62c2de64660616478c32cd0598e", size = 4119472, upload-time = "2025-10-16T22:16:41.694Z" }, + { url = "https://files.pythonhosted.org/packages/f8/ba/d69adbe699b768f6b29a5eec7b47dd610bd17a69de51b251126a801369ea/uvloop-0.22.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:1f38ec5e3f18c8a10ded09742f7fb8de0108796eb673f30ce7762ce1b8550cad", size = 4239051, upload-time = "2025-10-16T22:16:43.224Z" }, + { url = "https://files.pythonhosted.org/packages/90/cd/b62bdeaa429758aee8de8b00ac0dd26593a9de93d302bff3d21439e9791d/uvloop-0.22.1-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:3879b88423ec7e97cd4eba2a443aa26ed4e59b45e6b76aabf13fe2f27023a142", size = 1362067, upload-time = "2025-10-16T22:16:44.503Z" }, + { url = "https://files.pythonhosted.org/packages/0d/f8/a132124dfda0777e489ca86732e85e69afcd1ff7686647000050ba670689/uvloop-0.22.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:4baa86acedf1d62115c1dc6ad1e17134476688f08c6efd8a2ab076e815665c74", size = 752423, upload-time = "2025-10-16T22:16:45.968Z" }, + { url = "https://files.pythonhosted.org/packages/a3/94/94af78c156f88da4b3a733773ad5ba0b164393e357cc4bd0ab2e2677a7d6/uvloop-0.22.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:297c27d8003520596236bdb2335e6b3f649480bd09e00d1e3a99144b691d2a35", size = 4272437, upload-time = "2025-10-16T22:16:47.451Z" }, + { url = "https://files.pythonhosted.org/packages/b5/35/60249e9fd07b32c665192cec7af29e06c7cd96fa1d08b84f012a56a0b38e/uvloop-0.22.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c1955d5a1dd43198244d47664a5858082a3239766a839b2102a269aaff7a4e25", size = 4292101, upload-time = "2025-10-16T22:16:49.318Z" }, + { url = "https://files.pythonhosted.org/packages/02/62/67d382dfcb25d0a98ce73c11ed1a6fba5037a1a1d533dcbb7cab033a2636/uvloop-0.22.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b31dc2fccbd42adc73bc4e7cdbae4fc5086cf378979e53ca5d0301838c5682c6", size = 4114158, upload-time = "2025-10-16T22:16:50.517Z" }, + { url = "https://files.pythonhosted.org/packages/f0/7a/f1171b4a882a5d13c8b7576f348acfe6074d72eaf52cccef752f748d4a9f/uvloop-0.22.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:93f617675b2d03af4e72a5333ef89450dfaa5321303ede6e67ba9c9d26878079", size = 4177360, upload-time = "2025-10-16T22:16:52.646Z" }, + { url = "https://files.pythonhosted.org/packages/79/7b/b01414f31546caf0919da80ad57cbfe24c56b151d12af68cee1b04922ca8/uvloop-0.22.1-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:37554f70528f60cad66945b885eb01f1bb514f132d92b6eeed1c90fd54ed6289", size = 1454790, upload-time = "2025-10-16T22:16:54.355Z" }, + { url = "https://files.pythonhosted.org/packages/d4/31/0bb232318dd838cad3fa8fb0c68c8b40e1145b32025581975e18b11fab40/uvloop-0.22.1-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:b76324e2dc033a0b2f435f33eb88ff9913c156ef78e153fb210e03c13da746b3", size = 796783, upload-time = "2025-10-16T22:16:55.906Z" }, + { url = "https://files.pythonhosted.org/packages/42/38/c9b09f3271a7a723a5de69f8e237ab8e7803183131bc57c890db0b6bb872/uvloop-0.22.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:badb4d8e58ee08dad957002027830d5c3b06aea446a6a3744483c2b3b745345c", size = 4647548, upload-time = "2025-10-16T22:16:57.008Z" }, + { url = "https://files.pythonhosted.org/packages/c1/37/945b4ca0ac27e3dc4952642d4c900edd030b3da6c9634875af6e13ae80e5/uvloop-0.22.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b91328c72635f6f9e0282e4a57da7470c7350ab1c9f48546c0f2866205349d21", size = 4467065, upload-time = "2025-10-16T22:16:58.206Z" }, + { url = "https://files.pythonhosted.org/packages/97/cc/48d232f33d60e2e2e0b42f4e73455b146b76ebe216487e862700457fbf3c/uvloop-0.22.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:daf620c2995d193449393d6c62131b3fbd40a63bf7b307a1527856ace637fe88", size = 4328384, upload-time = "2025-10-16T22:16:59.36Z" }, + { url = "https://files.pythonhosted.org/packages/e4/16/c1fd27e9549f3c4baf1dc9c20c456cd2f822dbf8de9f463824b0c0357e06/uvloop-0.22.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6cde23eeda1a25c75b2e07d39970f3374105d5eafbaab2a4482be82f272d5a5e", size = 4296730, upload-time = "2025-10-16T22:17:00.744Z" }, +] + +[[package]] +name = "watchfiles" +version = "1.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/cd/41/5e1a4bb12aac5f1493fa1bdc11154eca3b258ca4eba65d39c473fe19d8e9/watchfiles-1.2.0.tar.gz", hash = "sha256:c995fba777f1ea992f090f9236e9284cf7a5d1a0130dd5a3d82c598cacd76838", size = 108252, upload-time = "2026-05-18T04:32:04.251Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/4d/70a7feced9f87e2ff26dba42667290f41694fc64646c67261fbb8cab5d5c/watchfiles-1.2.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:01ea8d66f0693b9b60a6541c8d10263091ca9a9060d242f3c1f3143f9aad2c98", size = 399730, upload-time = "2026-05-18T04:31:38.162Z" }, + { url = "https://files.pythonhosted.org/packages/31/3a/0da302f2307aee316922806ebd5726c542cbd787c938271cf14a074c7daf/watchfiles-1.2.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7ba0480b9a74af058f43b337e937a451e109295c420916d68ad24e3dc02f5e44", size = 392842, upload-time = "2026-05-18T04:30:27.051Z" }, + { url = "https://files.pythonhosted.org/packages/db/ef/d5bdb705c224dbc256aa0c1ec47bf4e61ec52558f2afb44a71a1fe4d7015/watchfiles-1.2.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f34e26a19f91f710c08e0183429f0d1d15df734e6bc78c31e77b9ea9c433658", size = 452989, upload-time = "2026-05-18T04:31:11.945Z" }, + { url = "https://files.pythonhosted.org/packages/71/29/5495f2c1661949ef7a35e4d71111d129cfe7606414a26887a919d0a55406/watchfiles-1.2.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b4e77f6a55f858504069abd35d336a637555c09bca453dde1ee1e5ada8a6a1fb", size = 458978, upload-time = "2026-05-18T04:30:52.606Z" }, + { url = "https://files.pythonhosted.org/packages/d5/8c/7f9c07c433811c2fffd93e13fdfb7135de9aab5f2ae41be08960fa0047dc/watchfiles-1.2.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0cb4d80e212f116474a545c21c912b445f16bb0cef9e6a73a498164223e14e2f", size = 490248, upload-time = "2026-05-18T04:31:36.003Z" }, + { url = "https://files.pythonhosted.org/packages/3c/11/d93632febc52fbc21be90231bb7c17fd5387f46c9076fd40a5f9c2ae6910/watchfiles-1.2.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b974946a10af379d425e2eef5b62f5c6ebeaccf91d45eaad6f5b27ecd4f91aa0", size = 571847, upload-time = "2026-05-18T04:31:10.862Z" }, + { url = "https://files.pythonhosted.org/packages/55/b4/383173e73aabb07ad1d9c7aa859d95437ac46a6d6a1e11005facda0c9d19/watchfiles-1.2.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:86bc13c25a8d1fcd70b51d0ce7c9b65e90de5666fcbfd3e34957cc73ee19aeb5", size = 465974, upload-time = "2026-05-18T04:30:17.006Z" }, + { url = "https://files.pythonhosted.org/packages/a7/6c/89b1a230a78f57c52dd8893adb1f92f94411721b6ec12596c56d98c74356/watchfiles-1.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ca148d73dea36c9763aaa351e4d7a51780ec1584217c45276f4fe8239c768b71", size = 454782, upload-time = "2026-05-18T04:30:35.656Z" }, + { url = "https://files.pythonhosted.org/packages/24/62/1732118367cfff0a9fce3bf62ff4bfded09ef5df21d9d446b858b3f70a96/watchfiles-1.2.0-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:c525543d91961c6955b2636b308569e84a1d1c5f5f2932041ab9ef46422f43e3", size = 465182, upload-time = "2026-05-18T04:30:20.846Z" }, + { url = "https://files.pythonhosted.org/packages/28/96/716f7e5f51339bf22963f3345f9f27d7f3b30e2eadc597e257c881dd3c53/watchfiles-1.2.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:a204794696ffb8f9b10fba6f7cb5216d42f3b2b71860ccac6b6e42f5f10973b0", size = 629841, upload-time = "2026-05-18T04:31:05.397Z" }, + { url = "https://files.pythonhosted.org/packages/4c/fe/c40783950fd771ccf66ab3ec2722d188a9af1c7f96c6e811f36e40c6e03f/watchfiles-1.2.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:10d86db20695afe7997ac9e1717637d6714a8d0220458c33f3d2061f54cec427", size = 658028, upload-time = "2026-05-18T04:31:48.22Z" }, + { url = "https://files.pythonhosted.org/packages/71/72/4508db1856d1d87fcbb3b63f4839bab1b5682cb0e8d224d122263c09654a/watchfiles-1.2.0-cp313-cp313-win32.whl", hash = "sha256:eb283ee99e21ad6443c8cdb06ac5b34b1308c329cbdf03fa02b445363714c799", size = 275183, upload-time = "2026-05-18T04:30:59.57Z" }, + { url = "https://files.pythonhosted.org/packages/f9/36/14b76ca57652e5cc5fd1c11f32a261292c08a0d19a00351013c2549cbfb2/watchfiles-1.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:a0f27f01bee51861392bb6b7c4fdb290b27d1eb194e9e28788d68102a0e898d9", size = 288059, upload-time = "2026-05-18T04:32:07.937Z" }, + { url = "https://files.pythonhosted.org/packages/1b/8d/0a85e395398d8d20fadfe5c5d32c726eee17a519e78fb356f2cf7531bffe/watchfiles-1.2.0-cp313-cp313-win_arm64.whl", hash = "sha256:3651aa7058595e9cfb75d35dd5ada2bf9f48a5b8a0f3562821d3e210c507e077", size = 280186, upload-time = "2026-05-18T04:31:54.484Z" }, + { url = "https://files.pythonhosted.org/packages/37/68/36db056f1fdcc5f07302f56e631774d6835bcd6fa3ace402304621d5f9e5/watchfiles-1.2.0-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:faea288b6f0ab1902ef08f4ca6de005dccf856c4e0c4f21b8c5fce02d90a1b08", size = 399031, upload-time = "2026-05-18T04:30:44.576Z" }, + { url = "https://files.pythonhosted.org/packages/c1/64/01a9d6f66a82a5c101ce939274106cc72759d62427e153f01edd2b9f87c2/watchfiles-1.2.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:01859b11fd9fbca670f4d5da00fbac282cfea9bd67a2125d8b2833a3b5617ea9", size = 391205, upload-time = "2026-05-18T04:30:25.413Z" }, + { url = "https://files.pythonhosted.org/packages/84/2c/0a44fe058cb4bb7b8ede6b6670698bbb7c0400740e378d00022189b7b31d/watchfiles-1.2.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fff610d7bb2256a317bb1e96f0d7862c7aa8076733ee5df0fd41bbe76a24a4f4", size = 451892, upload-time = "2026-05-18T04:32:14.005Z" }, + { url = "https://files.pythonhosted.org/packages/67/a1/351e0d56cd35e6488b5c8b4fb11a809a5bc923e8fe8fed9faf8920be0c89/watchfiles-1.2.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b141a4891c995a039cd89e9a49e62df1dc8a559a5d1a6e4c7106d16c12777a55", size = 458867, upload-time = "2026-05-18T04:31:22.279Z" }, + { url = "https://files.pythonhosted.org/packages/d5/7d/9d09605187f1b838998624049fcf8bf47b73c1a3b76901fcac1782f62277/watchfiles-1.2.0-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f22943b7770483f6ea0721c6b11d022947a98eb0acae14694de034f4d0d38925", size = 490217, upload-time = "2026-05-18T04:31:43.657Z" }, + { url = "https://files.pythonhosted.org/packages/60/5d/a17a16eccb182f04188cd308ec24b1a71a9b5c4e7098269cf35d9fa56d02/watchfiles-1.2.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1bc6195825b7dcd217968bb1f801a60fd4c16e8eeab5bedc7fe917d7d5995ab4", size = 571458, upload-time = "2026-05-18T04:32:11.875Z" }, + { url = "https://files.pythonhosted.org/packages/d3/3d/4dd457062083ab1938e5dfd45032eb425cee2ac817287ca8ff4356183e5d/watchfiles-1.2.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d4a4b147f5dca2a5d325a06a832fb43f345751adfbc63204aec30e0d9ca965a2", size = 464707, upload-time = "2026-05-18T04:30:43.492Z" }, + { url = "https://files.pythonhosted.org/packages/c6/71/ea8c57b128f5383de74d0c7d2d9c57ad7c9a65a930c451bd25d524b295b7/watchfiles-1.2.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4543579a9bdb0c9560039b4ffddbdb39545707659fbc430ce4c10f3f68d557f9", size = 454663, upload-time = "2026-05-18T04:30:16.061Z" }, + { url = "https://files.pythonhosted.org/packages/53/fd/2e812bf938406d7db351f0703ddd3fc6c061cf30d96153a77bc79a943a44/watchfiles-1.2.0-cp313-cp313t-manylinux_2_31_riscv64.whl", hash = "sha256:20aa0e708b920bde876a4aa82dc7dd6ebea228a63a67cda6632c2fc87b787efa", size = 463537, upload-time = "2026-05-18T04:31:44.9Z" }, + { url = "https://files.pythonhosted.org/packages/86/56/d17a7f1dd1bc3035f1072694a551301272f1739c2d8e319c927cb9e29b38/watchfiles-1.2.0-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:d413349d565dab74297f2a63e84a097936be69bf8f3b3801f27f380e32040f44", size = 629194, upload-time = "2026-05-18T04:31:14.141Z" }, + { url = "https://files.pythonhosted.org/packages/be/06/f1ff66bf5cae50aa4062779a0ecd0bbaf15e466195719074078947d9a17d/watchfiles-1.2.0-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:f28b2725eb8cce327b9b3ab02415c853011dc55c95832fe90de6bc56f5315f72", size = 656194, upload-time = "2026-05-18T04:31:47.14Z" }, + { url = "https://files.pythonhosted.org/packages/e7/54/a9c7ea9a82a4ac65e7004c0a03920b5cdd2f9c3b678757d9cd425aa51d53/watchfiles-1.2.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:b8c8358484d5fa12ef34f05b7f4168eaf1932f408725ff6d023c33ec17bd79d4", size = 400205, upload-time = "2026-05-18T04:32:05.153Z" }, + { url = "https://files.pythonhosted.org/packages/aa/5d/c9ab3534374a4a67450696905d6ef16a04405448b8dc52bd752ae50423d4/watchfiles-1.2.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:9f04b092229ad2c50126dd3c922c8822e51e605993764a33058d4a791ab42281", size = 392508, upload-time = "2026-05-18T04:30:54.849Z" }, + { url = "https://files.pythonhosted.org/packages/26/ca/1ad30103535cf0cecd7b993e8d50edc5351b1820e38f2d22e3df58962feb/watchfiles-1.2.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7a7ce236284f002a156f70add88efe5c70879cccbb658be0822c54b1306fc09d", size = 452448, upload-time = "2026-05-18T04:30:53.727Z" }, + { url = "https://files.pythonhosted.org/packages/37/a1/ceee2cdf2afbd715fa07758d39c9859513eae411b23196f7fd039e5feedd/watchfiles-1.2.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b9909cc2b48468b575eefa944919e1fe8a36c5849d5c7c168f80a8c1db69398e", size = 459605, upload-time = "2026-05-18T04:30:23.312Z" }, + { url = "https://files.pythonhosted.org/packages/e8/f6/421e30fd1cb3907a84ed92ab3f1983e37ba2dca015e9a894a048418417a2/watchfiles-1.2.0-cp314-cp314-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a37faaed405c67e28e6be45a1fa4f206ef5a2860f27c237db9fa30704c38242", size = 490757, upload-time = "2026-05-18T04:30:47.358Z" }, + { url = "https://files.pythonhosted.org/packages/41/b0/55ed1b97ed08be7bba6f9a541cac15f2a858e1d74d2b07b6da70a82aab00/watchfiles-1.2.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9649193aa27bd9ff2e80ff29bfaa93085496c7a3a377592823cc58b77ee88add", size = 568672, upload-time = "2026-05-18T04:30:38.915Z" }, + { url = "https://files.pythonhosted.org/packages/d1/cf/d8ae8a80dd7bafab395ea7681c10237311bbf34d37704a8c744e7cf31fc7/watchfiles-1.2.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4e4ff8e37f99cf1da89e255e07c9c4b37c214038c4283707bdec308cb1b0ea1f", size = 464197, upload-time = "2026-05-18T04:30:09.914Z" }, + { url = "https://files.pythonhosted.org/packages/7c/8a/3076c496ca8dafe0e8cd03fcebdfc47be4b1174b4e5b24ff6e396e6b3af2/watchfiles-1.2.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:054dc20fd2e3132b4c3883b4a00d72fd6e1f56fdaf89fccd12e8057d74cd74d7", size = 453181, upload-time = "2026-05-18T04:30:14.829Z" }, + { url = "https://files.pythonhosted.org/packages/e5/10/9745e17c98e7b8a86454df0a3c7b5686bd650383f1e9f26e4ebcbd6cc0c0/watchfiles-1.2.0-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:e140ed30ebde76796b686e67c182cff10ea2fbab186fafd1560f74bb5a473a6e", size = 465109, upload-time = "2026-05-18T04:30:28.123Z" }, + { url = "https://files.pythonhosted.org/packages/8f/95/8ef4a95481d3e0cb52d62a06fa6e972e81424be2d9698b91a2fecca9904c/watchfiles-1.2.0-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:bb7e52ecf68ba46d22df23467b87cffeb2146908aa523ebfe803019618cfda06", size = 630653, upload-time = "2026-05-18T04:31:49.304Z" }, + { url = "https://files.pythonhosted.org/packages/fd/e4/3b3bf36b0f829b50c6ebcb8d031583863c59f923d6a6af3d485e470d0fac/watchfiles-1.2.0-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:23282a321c8baf9b3a3c4afff673f9fe65eb7fdc2338d765ccad9d3d1916a5ba", size = 657838, upload-time = "2026-05-18T04:31:06.497Z" }, + { url = "https://files.pythonhosted.org/packages/21/b1/6cbbb50c1f3002ab568777d44aa21206dfb8807a840990c4037523b51812/watchfiles-1.2.0-cp314-cp314-win32.whl", hash = "sha256:c0db965c5f79aa49fe672d297cf1febc5ad149b658594944f49a54a2b96270a7", size = 275108, upload-time = "2026-05-18T04:30:06.891Z" }, + { url = "https://files.pythonhosted.org/packages/92/45/190ce6db8dcb4536682cf75d3889ff1a27182a58cb519d343cb6d9ea63d8/watchfiles-1.2.0-cp314-cp314-win_amd64.whl", hash = "sha256:71283b39fd17e5408eb123bd37aeecfd9d54c81fc184421943208aadb879d103", size = 288441, upload-time = "2026-05-18T04:32:12.901Z" }, + { url = "https://files.pythonhosted.org/packages/74/0d/3eae1c2313ab08378431d907c3f8095ecca00f3eda33111cf4f0f2591799/watchfiles-1.2.0-cp314-cp314-win_arm64.whl", hash = "sha256:c5c19526f4e54a00f2666a6c0e9e40d582c09e865055ea7378bf0009aab857b3", size = 280684, upload-time = "2026-05-18T04:31:26.902Z" }, + { url = "https://files.pythonhosted.org/packages/b1/75/fb64e6c25d6b5ca636d03df34ffb1c6e9873303e76d27967e045f8df088f/watchfiles-1.2.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:d73a585accffa5ae39c17264c36ec3166d2fad7000c780f5ef83b2722afb9dd2", size = 398857, upload-time = "2026-05-18T04:32:17.108Z" }, + { url = "https://files.pythonhosted.org/packages/73/4e/9f7adf01754cbf81843722ccfec169d8f26c69778281a302855cecd2ee08/watchfiles-1.2.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ae99b14c5f21e026e0e9d96f40e07d8570ebee6cafd9d8fc318354606daa7a28", size = 392413, upload-time = "2026-05-18T04:31:07.911Z" }, + { url = "https://files.pythonhosted.org/packages/47/c8/bec626bcc2d69f44b9acb24ce7d60ed7b16b73628eea747fcbd169d8edda/watchfiles-1.2.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4429f3b105524a10b72c3a819b091c495d2811d419c1e1e8df773a5a5974f831", size = 452409, upload-time = "2026-05-18T04:31:20.142Z" }, + { url = "https://files.pythonhosted.org/packages/00/b7/b6362068e81e7c556d155a34c35d40ac3ef42d747b06d7f6e5bf58e359c2/watchfiles-1.2.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:43d818978d06062d9b22c4fab2ebe44cf5213d42dc8e62bda8c2760cfa2eeb33", size = 458827, upload-time = "2026-05-18T04:32:06.219Z" }, + { url = "https://files.pythonhosted.org/packages/67/f8/9a813fa42afb1e0b4625e75f0479826644d3ee8dc287e093799bc01f390c/watchfiles-1.2.0-cp314-cp314t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b9f732dc58b2dbe69e464ccf8fff7a03b0dd0be439da4c0720d3558527d3d6b4", size = 490104, upload-time = "2026-05-18T04:31:56.034Z" }, + { url = "https://files.pythonhosted.org/packages/2f/bf/27dfb6094ca4c9aad21298b5525b6c53cb36121ee454331d05161e58d130/watchfiles-1.2.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8f200104103feb097de4cab8fe4f5dd18a2026934c7dea98c55a2f5fd6d5a33b", size = 571360, upload-time = "2026-05-18T04:31:57.133Z" }, + { url = "https://files.pythonhosted.org/packages/fb/39/44a096d67270ea93df91d33877dbe91fbda3aa4f8ec2edf799d93eda8736/watchfiles-1.2.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:63ac26eefbf4af1741247d6fb68b11c49a25b2f7413fbd318a83a12aaa9cf666", size = 464644, upload-time = "2026-05-18T04:30:57.33Z" }, + { url = "https://files.pythonhosted.org/packages/0e/80/c7472203bad6268e3ef1ad260739704847898938ad7ea8b63a5131f46b50/watchfiles-1.2.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c4997d4e4a55f0d02b6cde327322daf3a0400e5df6c6b15948994bf72497925", size = 454771, upload-time = "2026-05-18T04:30:48.736Z" }, + { url = "https://files.pythonhosted.org/packages/51/cf/3b10b268b4b7f0fc26e9debb5eef1998b515887840f444cd3ec80c688755/watchfiles-1.2.0-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:4c887eba18b7945ac73067a8b4a66f21cd46c2539b2bc68588f7be6c7eb6d26b", size = 463494, upload-time = "2026-05-18T04:31:33.826Z" }, + { url = "https://files.pythonhosted.org/packages/3d/3e/a4302545cd589262a0dc7d140e86f7688eba3f9c72776c27f7e23b8864c4/watchfiles-1.2.0-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:3416ff151bb6b5a8d8d11664974fbef4d9305b9b2957839ab5a270468fd8df30", size = 629383, upload-time = "2026-05-18T04:31:15.596Z" }, + { url = "https://files.pythonhosted.org/packages/db/99/d5649df0a9a410d45b7c882304d0b790903ac9b6e8f2cfd12114e0c6b9f2/watchfiles-1.2.0-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:0e831a271c035d89789cffc386b6aa1375f39f1cd25eb7ca0997e4970d152fc5", size = 656093, upload-time = "2026-05-18T04:31:58.707Z" }, + { url = "https://files.pythonhosted.org/packages/92/b9/362702539275019a54dd2e94511b31a9b89c5f9e6a21966de7eb692549fc/watchfiles-1.2.0-cp315-cp315-macosx_10_12_x86_64.whl", hash = "sha256:37a6721cdf3f65dbb13aa9503510ccb4451603ac837e44d265d7992a597e1374", size = 400109, upload-time = "2026-05-18T04:31:16.879Z" }, + { url = "https://files.pythonhosted.org/packages/8f/75/71d5ba62db781e5587bded1d944c675374bc4aa37ff33d5018d98e8b6538/watchfiles-1.2.0-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:2b37d10b5a63bd4d87e18472d80fa525bd670586fae62e5dd580452764879b65", size = 392167, upload-time = "2026-05-18T04:31:28.058Z" }, + { url = "https://files.pythonhosted.org/packages/3c/01/c66dd95d0423fe30d31820e2d1d5bda773764131bbb6ac0cb1cf303ac328/watchfiles-1.2.0-cp315-cp315-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a105bc2283f67e8fbec74253ec2d94925de92ed72c0393f1206bf326b7b7b69", size = 452372, upload-time = "2026-05-18T04:31:00.836Z" }, + { url = "https://files.pythonhosted.org/packages/91/15/2fe99557e72f85627c6a8eed50d889e8d101623e060a22ad75b875cb932d/watchfiles-1.2.0-cp315-cp315-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5327989a465505f05cfe06f04fa9d0c2fd5432bb243e10e6f012b1bdca3c8579", size = 459596, upload-time = "2026-05-18T04:31:34.96Z" }, + { url = "https://files.pythonhosted.org/packages/ed/23/d4acfa0023367428ed48351b3b9b267893037b6cadae55620c61c24bcfd4/watchfiles-1.2.0-cp315-cp315-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ecb47f183a8025b2aa18b546725c3657e542112ae9c0613a2af79b4fa8d04ad7", size = 490869, upload-time = "2026-05-18T04:31:59.923Z" }, + { url = "https://files.pythonhosted.org/packages/a4/5f/3164cbdce06c9fb95c4f7b9e2f9760b5e2797af43a9ecc317ef42a23a278/watchfiles-1.2.0-cp315-cp315-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8520a4ab0e37f770afc34459c4f8f7019e153f9124dc101c15538365875d1ab2", size = 571641, upload-time = "2026-05-18T04:32:00.948Z" }, + { url = "https://files.pythonhosted.org/packages/41/e6/85d3731c55e65cd7690f3f803d24c139588aaf863e4bf2148fe7a7fa1a19/watchfiles-1.2.0-cp315-cp315-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:71cd71740ed2c15211ebb237ced4e39a1cdf6f80566e5fe95428da1626f4fde6", size = 464444, upload-time = "2026-05-18T04:30:34.298Z" }, + { url = "https://files.pythonhosted.org/packages/f4/7d/562641012b8b09872742c3b8adf9629ec479fd78f8d68ae4a0c13da8add6/watchfiles-1.2.0-cp315-cp315-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f88af53d6ddaf72179ef613ddc905e6f4785f712b49b80b3bef9f3525e6194b4", size = 453593, upload-time = "2026-05-18T04:31:23.464Z" }, + { url = "https://files.pythonhosted.org/packages/56/fe/cb8ef3d6f929d14158fdaaad9925985b7310abc9384dcd4d82dd0016fb59/watchfiles-1.2.0-cp315-cp315-manylinux_2_31_riscv64.whl", hash = "sha256:cee9d5efd929efdac5f7e58f72b3376f676b64050a91c5b99a7094c5b2317488", size = 465096, upload-time = "2026-05-18T04:31:30.384Z" }, + { url = "https://files.pythonhosted.org/packages/25/91/80908e835e100527a9267147b08c0eee1fa6ab0ffec15edc04d1d44885f7/watchfiles-1.2.0-cp315-cp315-musllinux_1_1_aarch64.whl", hash = "sha256:b718bf356bbc15e559bd8ef41782b573b8ae0e3f177ab244b440568d7ea02cfb", size = 630638, upload-time = "2026-05-18T04:30:49.89Z" }, + { url = "https://files.pythonhosted.org/packages/46/4b/95ab2f256bb4af3cb2eb23b9317bda984ee6e0f11733a5c004a6c95b06e3/watchfiles-1.2.0-cp315-cp315-musllinux_1_1_x86_64.whl", hash = "sha256:922c0e019fe68b3ae392965a766b02a71ba1168c932cebc3733cd52c5fe5b377", size = 657684, upload-time = "2026-05-18T04:31:32.027Z" }, +] + +[[package]] +name = "websockets" +version = "16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/04/24/4b2031d72e840ce4c1ccb255f693b15c334757fc50023e4db9537080b8c4/websockets-16.0.tar.gz", hash = "sha256:5f6261a5e56e8d5c42a4497b364ea24d94d9563e8fbd44e78ac40879c60179b5", size = 179346, upload-time = "2026-01-10T09:23:47.181Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cc/9c/baa8456050d1c1b08dd0ec7346026668cbc6f145ab4e314d707bb845bf0d/websockets-16.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:878b336ac47938b474c8f982ac2f7266a540adc3fa4ad74ae96fea9823a02cc9", size = 177364, upload-time = "2026-01-10T09:22:59.333Z" }, + { url = "https://files.pythonhosted.org/packages/7e/0c/8811fc53e9bcff68fe7de2bcbe75116a8d959ac699a3200f4847a8925210/websockets-16.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:52a0fec0e6c8d9a784c2c78276a48a2bdf099e4ccc2a4cad53b27718dbfd0230", size = 175039, upload-time = "2026-01-10T09:23:01.171Z" }, + { url = "https://files.pythonhosted.org/packages/aa/82/39a5f910cb99ec0b59e482971238c845af9220d3ab9fa76dd9162cda9d62/websockets-16.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e6578ed5b6981005df1860a56e3617f14a6c307e6a71b4fff8c48fdc50f3ed2c", size = 175323, upload-time = "2026-01-10T09:23:02.341Z" }, + { url = "https://files.pythonhosted.org/packages/bd/28/0a25ee5342eb5d5f297d992a77e56892ecb65e7854c7898fb7d35e9b33bd/websockets-16.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:95724e638f0f9c350bb1c2b0a7ad0e83d9cc0c9259f3ea94e40d7b02a2179ae5", size = 184975, upload-time = "2026-01-10T09:23:03.756Z" }, + { url = "https://files.pythonhosted.org/packages/f9/66/27ea52741752f5107c2e41fda05e8395a682a1e11c4e592a809a90c6a506/websockets-16.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c0204dc62a89dc9d50d682412c10b3542d748260d743500a85c13cd1ee4bde82", size = 186203, upload-time = "2026-01-10T09:23:05.01Z" }, + { url = "https://files.pythonhosted.org/packages/37/e5/8e32857371406a757816a2b471939d51c463509be73fa538216ea52b792a/websockets-16.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:52ac480f44d32970d66763115edea932f1c5b1312de36df06d6b219f6741eed8", size = 185653, upload-time = "2026-01-10T09:23:06.301Z" }, + { url = "https://files.pythonhosted.org/packages/9b/67/f926bac29882894669368dc73f4da900fcdf47955d0a0185d60103df5737/websockets-16.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6e5a82b677f8f6f59e8dfc34ec06ca6b5b48bc4fcda346acd093694cc2c24d8f", size = 184920, upload-time = "2026-01-10T09:23:07.492Z" }, + { url = "https://files.pythonhosted.org/packages/3c/a1/3d6ccdcd125b0a42a311bcd15a7f705d688f73b2a22d8cf1c0875d35d34a/websockets-16.0-cp313-cp313-win32.whl", hash = "sha256:abf050a199613f64c886ea10f38b47770a65154dc37181bfaff70c160f45315a", size = 178255, upload-time = "2026-01-10T09:23:09.245Z" }, + { url = "https://files.pythonhosted.org/packages/6b/ae/90366304d7c2ce80f9b826096a9e9048b4bb760e44d3b873bb272cba696b/websockets-16.0-cp313-cp313-win_amd64.whl", hash = "sha256:3425ac5cf448801335d6fdc7ae1eb22072055417a96cc6b31b3861f455fbc156", size = 178689, upload-time = "2026-01-10T09:23:10.483Z" }, + { url = "https://files.pythonhosted.org/packages/f3/1d/e88022630271f5bd349ed82417136281931e558d628dd52c4d8621b4a0b2/websockets-16.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:8cc451a50f2aee53042ac52d2d053d08bf89bcb31ae799cb4487587661c038a0", size = 177406, upload-time = "2026-01-10T09:23:12.178Z" }, + { url = "https://files.pythonhosted.org/packages/f2/78/e63be1bf0724eeb4616efb1ae1c9044f7c3953b7957799abb5915bffd38e/websockets-16.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:daa3b6ff70a9241cf6c7fc9e949d41232d9d7d26fd3522b1ad2b4d62487e9904", size = 175085, upload-time = "2026-01-10T09:23:13.511Z" }, + { url = "https://files.pythonhosted.org/packages/bb/f4/d3c9220d818ee955ae390cf319a7c7a467beceb24f05ee7aaaa2414345ba/websockets-16.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:fd3cb4adb94a2a6e2b7c0d8d05cb94e6f1c81a0cf9dc2694fb65c7e8d94c42e4", size = 175328, upload-time = "2026-01-10T09:23:14.727Z" }, + { url = "https://files.pythonhosted.org/packages/63/bc/d3e208028de777087e6fb2b122051a6ff7bbcca0d6df9d9c2bf1dd869ae9/websockets-16.0-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:781caf5e8eee67f663126490c2f96f40906594cb86b408a703630f95550a8c3e", size = 185044, upload-time = "2026-01-10T09:23:15.939Z" }, + { url = "https://files.pythonhosted.org/packages/ad/6e/9a0927ac24bd33a0a9af834d89e0abc7cfd8e13bed17a86407a66773cc0e/websockets-16.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:caab51a72c51973ca21fa8a18bd8165e1a0183f1ac7066a182ff27107b71e1a4", size = 186279, upload-time = "2026-01-10T09:23:17.148Z" }, + { url = "https://files.pythonhosted.org/packages/b9/ca/bf1c68440d7a868180e11be653c85959502efd3a709323230314fda6e0b3/websockets-16.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:19c4dc84098e523fd63711e563077d39e90ec6702aff4b5d9e344a60cb3c0cb1", size = 185711, upload-time = "2026-01-10T09:23:18.372Z" }, + { url = "https://files.pythonhosted.org/packages/c4/f8/fdc34643a989561f217bb477cbc47a3a07212cbda91c0e4389c43c296ebf/websockets-16.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:a5e18a238a2b2249c9a9235466b90e96ae4795672598a58772dd806edc7ac6d3", size = 184982, upload-time = "2026-01-10T09:23:19.652Z" }, + { url = "https://files.pythonhosted.org/packages/dd/d1/574fa27e233764dbac9c52730d63fcf2823b16f0856b3329fc6268d6ae4f/websockets-16.0-cp314-cp314-win32.whl", hash = "sha256:a069d734c4a043182729edd3e9f247c3b2a4035415a9172fd0f1b71658a320a8", size = 177915, upload-time = "2026-01-10T09:23:21.458Z" }, + { url = "https://files.pythonhosted.org/packages/8a/f1/ae6b937bf3126b5134ce1f482365fde31a357c784ac51852978768b5eff4/websockets-16.0-cp314-cp314-win_amd64.whl", hash = "sha256:c0ee0e63f23914732c6d7e0cce24915c48f3f1512ec1d079ed01fc629dab269d", size = 178381, upload-time = "2026-01-10T09:23:22.715Z" }, + { url = "https://files.pythonhosted.org/packages/06/9b/f791d1db48403e1f0a27577a6beb37afae94254a8c6f08be4a23e4930bc0/websockets-16.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:a35539cacc3febb22b8f4d4a99cc79b104226a756aa7400adc722e83b0d03244", size = 177737, upload-time = "2026-01-10T09:23:24.523Z" }, + { url = "https://files.pythonhosted.org/packages/bd/40/53ad02341fa33b3ce489023f635367a4ac98b73570102ad2cdd770dacc9a/websockets-16.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:b784ca5de850f4ce93ec85d3269d24d4c82f22b7212023c974c401d4980ebc5e", size = 175268, upload-time = "2026-01-10T09:23:25.781Z" }, + { url = "https://files.pythonhosted.org/packages/74/9b/6158d4e459b984f949dcbbb0c5d270154c7618e11c01029b9bbd1bb4c4f9/websockets-16.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:569d01a4e7fba956c5ae4fc988f0d4e187900f5497ce46339c996dbf24f17641", size = 175486, upload-time = "2026-01-10T09:23:27.033Z" }, + { url = "https://files.pythonhosted.org/packages/e5/2d/7583b30208b639c8090206f95073646c2c9ffd66f44df967981a64f849ad/websockets-16.0-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:50f23cdd8343b984957e4077839841146f67a3d31ab0d00e6b824e74c5b2f6e8", size = 185331, upload-time = "2026-01-10T09:23:28.259Z" }, + { url = "https://files.pythonhosted.org/packages/45/b0/cce3784eb519b7b5ad680d14b9673a31ab8dcb7aad8b64d81709d2430aa8/websockets-16.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:152284a83a00c59b759697b7f9e9cddf4e3c7861dd0d964b472b70f78f89e80e", size = 186501, upload-time = "2026-01-10T09:23:29.449Z" }, + { url = "https://files.pythonhosted.org/packages/19/60/b8ebe4c7e89fb5f6cdf080623c9d92789a53636950f7abacfc33fe2b3135/websockets-16.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:bc59589ab64b0022385f429b94697348a6a234e8ce22544e3681b2e9331b5944", size = 186062, upload-time = "2026-01-10T09:23:31.368Z" }, + { url = "https://files.pythonhosted.org/packages/88/a8/a080593f89b0138b6cba1b28f8df5673b5506f72879322288b031337c0b8/websockets-16.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:32da954ffa2814258030e5a57bc73a3635463238e797c7375dc8091327434206", size = 185356, upload-time = "2026-01-10T09:23:32.627Z" }, + { url = "https://files.pythonhosted.org/packages/c2/b6/b9afed2afadddaf5ebb2afa801abf4b0868f42f8539bfe4b071b5266c9fe/websockets-16.0-cp314-cp314t-win32.whl", hash = "sha256:5a4b4cc550cb665dd8a47f868c8d04c8230f857363ad3c9caf7a0c3bf8c61ca6", size = 178085, upload-time = "2026-01-10T09:23:33.816Z" }, + { url = "https://files.pythonhosted.org/packages/9f/3e/28135a24e384493fa804216b79a6a6759a38cc4ff59118787b9fb693df93/websockets-16.0-cp314-cp314t-win_amd64.whl", hash = "sha256:b14dc141ed6d2dde437cddb216004bcac6a1df0935d79656387bd41632ba0bbd", size = 178531, upload-time = "2026-01-10T09:23:35.016Z" }, + { url = "https://files.pythonhosted.org/packages/6f/28/258ebab549c2bf3e64d2b0217b973467394a9cea8c42f70418ca2c5d0d2e/websockets-16.0-py3-none-any.whl", hash = "sha256:1637db62fad1dc833276dded54215f2c7fa46912301a24bd94d45d46a011ceec", size = 171598, upload-time = "2026-01-10T09:23:45.395Z" }, +] + +[[package]] +name = "zeep" +version = "4.3.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "attrs" }, + { name = "isodate" }, + { name = "lxml" }, + { name = "platformdirs" }, + { name = "pytz" }, + { name = "requests" }, + { name = "requests-file" }, + { name = "requests-toolbelt" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e8/06/4f1d3ff61e930163565fb73616c6251e412a4d2fc7ed18214e1c2107258d/zeep-4.3.2.tar.gz", hash = "sha256:1a23a667ce9d73a0dbfdf15745bfa2b7ab0b6402135c0cd5067574838398e0e6", size = 166687, upload-time = "2025-09-15T10:26:03.4Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cd/78/f43f3feb70d67cbe260ec5b682ecc3c1850c8f437f1df707495126e51817/zeep-4.3.2-py3-none-any.whl", hash = "sha256:ed08c3179709172bfaaa9b76a6a545f8a57043ec6218e64e9deb81ff1e0ff79b", size = 101853, upload-time = "2025-09-15T10:26:02.12Z" }, +] diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..fe4fa99 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,32 @@ +# Development stack with hot-reload for both services. +# Production uses the root Dockerfile (single container) instead. +services: + backend: + build: + context: ./backend + dockerfile: Dockerfile.dev + ports: + - "8000:8000" + volumes: + - ./backend:/app + # Keep the image's .venv; don't let the host mount shadow it. + - /app/.venv + env_file: + - path: ./backend/.env + required: false + + frontend: + build: + context: ./frontend + dockerfile: Dockerfile.dev + ports: + - "5173:5173" + volumes: + - ./frontend:/app + # Keep the image's node_modules; don't let the host mount shadow it. + - /app/node_modules + environment: + # Vite (in this container) proxies /api to the backend service. + VITE_API_PROXY: http://backend:8000 + depends_on: + - backend diff --git a/frontend/.gitignore b/frontend/.gitignore new file mode 100644 index 0000000..8fc2459 --- /dev/null +++ b/frontend/.gitignore @@ -0,0 +1,15 @@ +# Logs +*.log +npm-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.sw? diff --git a/frontend/Dockerfile.dev b/frontend/Dockerfile.dev new file mode 100644 index 0000000..846c763 --- /dev/null +++ b/frontend/Dockerfile.dev @@ -0,0 +1,17 @@ +# syntax=docker/dockerfile:1 +# Development image: deps baked in, source mounted at runtime for HMR. +FROM node:22-slim +WORKDIR /app + +# Patch base-image OS packages and the bundled npm (clears fixable CVEs the +# scan flags in node:22-slim, including npm's vendored picomatch). +RUN apt-get update \ + && apt-get upgrade -y \ + && rm -rf /var/lib/apt/lists/* \ + && npm install -g npm@latest + +COPY package.json package-lock.json ./ +RUN npm ci + +EXPOSE 5173 +CMD ["npm", "run", "dev", "--", "--host"] diff --git a/frontend/eslint.config.js b/frontend/eslint.config.js new file mode 100644 index 0000000..ef614d2 --- /dev/null +++ b/frontend/eslint.config.js @@ -0,0 +1,22 @@ +import js from '@eslint/js' +import globals from 'globals' +import reactHooks from 'eslint-plugin-react-hooks' +import reactRefresh from 'eslint-plugin-react-refresh' +import tseslint from 'typescript-eslint' +import { defineConfig, globalIgnores } from 'eslint/config' + +export default defineConfig([ + globalIgnores(['dist']), + { + files: ['**/*.{ts,tsx}'], + extends: [ + js.configs.recommended, + tseslint.configs.recommended, + reactHooks.configs.flat.recommended, + reactRefresh.configs.vite, + ], + languageOptions: { + globals: globals.browser, + }, + }, +]) diff --git a/frontend/index.html b/frontend/index.html new file mode 100644 index 0000000..74ad4fb --- /dev/null +++ b/frontend/index.html @@ -0,0 +1,19 @@ + + + + + + + Tides · Bellingham Tidal Observatory + + + + + +
+ + + diff --git a/frontend/package-lock.json b/frontend/package-lock.json new file mode 100644 index 0000000..17c7205 --- /dev/null +++ b/frontend/package-lock.json @@ -0,0 +1,3905 @@ +{ + "name": "frontend", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "frontend", + "version": "0.0.0", + "dependencies": { + "react": "^19.2.6", + "react-dom": "^19.2.6" + }, + "devDependencies": { + "@eslint/js": "^10.0.1", + "@testing-library/jest-dom": "^6.9.1", + "@testing-library/react": "^16.3.2", + "@types/node": "^24.12.3", + "@types/react": "^19.2.14", + "@types/react-dom": "^19.2.3", + "@vitejs/plugin-react": "^6.0.1", + "eslint": "^10.3.0", + "eslint-plugin-react-hooks": "^7.1.1", + "eslint-plugin-react-refresh": "^0.5.2", + "globals": "^17.6.0", + "jsdom": "^29.1.1", + "typescript": "~6.0.2", + "typescript-eslint": "^8.59.2", + "vite": "^8.0.12", + "vitest": "^4.1.7" + } + }, + "node_modules/@adobe/css-tools": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.5.0.tgz", + "integrity": "sha512-6OzddxPio9UiWTCemp4N8cYLV2ZN1ncRnV1cVGtve7dhPOtRkleRyx32GQCYSwDYgaHU3USMm84tNsvKzRCa1Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@asamuzakjp/css-color": { + "version": "5.1.11", + "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-5.1.11.tgz", + "integrity": "sha512-KVw6qIiCTUQhByfTd78h2yD1/00waTmm9uy/R7Ck/ctUyAPj+AEDLkQIdJW0T8+qGgj3j5bpNKK7Q3G+LedJWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@asamuzakjp/generational-cache": "^1.0.1", + "@csstools/css-calc": "^3.2.0", + "@csstools/css-color-parser": "^4.1.0", + "@csstools/css-parser-algorithms": "^4.0.0", + "@csstools/css-tokenizer": "^4.0.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } + }, + "node_modules/@asamuzakjp/dom-selector": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@asamuzakjp/dom-selector/-/dom-selector-7.1.1.tgz", + "integrity": "sha512-67RZDnYRc8H/8MLDgQCDE//zoqVFwajkepHZgmXrbwybzXOEwOWGPYGmALYl9J2DOLfFPPs6kKCqmbzV895hTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@asamuzakjp/generational-cache": "^1.0.1", + "@asamuzakjp/nwsapi": "^2.3.9", + "bidi-js": "^1.0.3", + "css-tree": "^3.2.1", + "is-potential-custom-element-name": "^1.0.1" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } + }, + "node_modules/@asamuzakjp/generational-cache": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@asamuzakjp/generational-cache/-/generational-cache-1.0.1.tgz", + "integrity": "sha512-wajfB8KqzMCN2KGNFdLkReeHncd0AslUSrvHVvvYWuU8ghncRJoA50kT3zP9MVL0+9g4/67H+cdvBskj9THPzg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } + }, + "node_modules/@asamuzakjp/nwsapi": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/@asamuzakjp/nwsapi/-/nwsapi-2.3.9.tgz", + "integrity": "sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@babel/code-frame": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.29.7", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", + "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", + "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helpers": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", + "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", + "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", + "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", + "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", + "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", + "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", + "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.7" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.7.tgz", + "integrity": "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", + "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", + "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bramus/specificity": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@bramus/specificity/-/specificity-2.4.2.tgz", + "integrity": "sha512-ctxtJ/eA+t+6q2++vj5j7FYX3nRu311q1wfYH3xjlLOsczhlhxAg2FWNUXhpGvAw3BWo1xBcvOV6/YLc2r5FJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "css-tree": "^3.0.0" + }, + "bin": { + "specificity": "bin/cli.js" + } + }, + "node_modules/@csstools/color-helpers": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-6.0.2.tgz", + "integrity": "sha512-LMGQLS9EuADloEFkcTBR3BwV/CGHV7zyDxVRtVDTwdI2Ca4it0CCVTT9wCkxSgokjE5Ho41hEPgb8OEUwoXr6Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=20.19.0" + } + }, + "node_modules/@csstools/css-calc": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-3.2.1.tgz", + "integrity": "sha512-DtdHlgXh5ZkA43cwBcAm+huzgJiwx3ZTWVjBs94kwz2xKqSimDA3lBgCjphYgwgVUMWatSM0pDd8TILB1yrVVg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^4.0.0", + "@csstools/css-tokenizer": "^4.0.0" + } + }, + "node_modules/@csstools/css-color-parser": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-4.1.1.tgz", + "integrity": "sha512-eZ5XOtyhK+mggRafYUWzA0tvaYOFgdY8AkgQiCJF9qNAePnUo/zmsqqYubBBb3sQ8uNUaSKTY9s9klfRaAXL0g==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/color-helpers": "^6.0.2", + "@csstools/css-calc": "^3.2.1" + }, + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^4.0.0", + "@csstools/css-tokenizer": "^4.0.0" + } + }, + "node_modules/@csstools/css-parser-algorithms": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-4.0.0.tgz", + "integrity": "sha512-+B87qS7fIG3L5h3qwJ/IFbjoVoOe/bpOdh9hAjXbvx0o8ImEmUsGXN0inFOnk2ChCFgqkkGFQ+TpM5rbhkKe4w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^4.0.0" + } + }, + "node_modules/@csstools/css-syntax-patches-for-csstree": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.1.4.tgz", + "integrity": "sha512-wgsqt92b7C7tQhIdPNxj0n9zuUbQlvAuI1exyzeNrOKOi62SD7ren8zqszmpVREjAOqg8cD2FqYhQfAuKjk4sw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "peerDependencies": { + "css-tree": "^3.2.1" + }, + "peerDependenciesMeta": { + "css-tree": { + "optional": true + } + } + }, + "node_modules/@csstools/css-tokenizer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-4.0.0.tgz", + "integrity": "sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=20.19.0" + } + }, + "node_modules/@emnapi/core": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz", + "integrity": "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.1", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz", + "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz", + "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.23.5", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.5.tgz", + "integrity": "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^3.0.5", + "debug": "^4.3.1", + "minimatch": "^10.2.4" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.6.0.tgz", + "integrity": "sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^1.2.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/core": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.2.1.tgz", + "integrity": "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/js": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-10.0.1.tgz", + "integrity": "sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "eslint": "^10.0.0" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/@eslint/object-schema": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.5.tgz", + "integrity": "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.7.1.tgz", + "integrity": "sha512-rZAP3aVgB9ds9KOeUSL+zZ21hPmo8dh6fnIFwRQj5EAZl9gzR7wxYbYXYysAM8CTqGmUGyp2S4kUdV17MnGuWQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^1.2.1", + "levn": "^0.4.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@exodus/bytes": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/@exodus/bytes/-/bytes-1.15.1.tgz", + "integrity": "sha512-S6mL0yNB/Abt9Ei4tq8gDhcczc4S3+vQ4ra7vxnAf+YHC02srtqxKKZghx2Dq6p0e66THKwR6r8N6P95wEty7Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + }, + "peerDependencies": { + "@noble/hashes": "^1.8.0 || ^2.0.0" + }, + "peerDependenciesMeta": { + "@noble/hashes": { + "optional": true + } + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", + "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/types": "^0.15.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz", + "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.2", + "@humanfs/types": "^0.15.0", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/types": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz", + "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.4.tgz", + "integrity": "sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@tybys/wasm-util": "^0.10.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "peerDependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1" + } + }, + "node_modules/@oxc-project/types": { + "version": "0.132.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.132.0.tgz", + "integrity": "sha512-FESMOxil5Se014ui/Eq8fT5uHJo6nIRwH0PfJrZJXs6Gek3ZVFOrpUv3YIZT20m+extU98Hg1Ym72U58rlsxUQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.2.tgz", + "integrity": "sha512-ZS4D1JPGn/MYQN/SYDWftIE/nVsM8j/AFOYEzAoOE2O3NktQOZru+/vYXGbR/qtdLdIfGCP0lcoJiYVzsEz+iQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.2.tgz", + "integrity": "sha512-vdFA9+C/rekyGce7WqHs/xoT0ioZEWaOFyZLIV1mEeNFaFDUQrPIo8Vs2GvJ6eetb3rzDUtUBgzto3ExpXJB3w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.2.tgz", + "integrity": "sha512-BewSOwTHazv77DTYiAZXSqqKZ4KP/KonFisDMVU7PImxoWfB2aepnPhd2E4SWz3zDzYgDNbs6jBmTdgNnF02GA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.2.tgz", + "integrity": "sha512-m41o7M0YWtUdqk61Tb+jnKb2rN++iRdIASlExkUoKfIAH30DOHCB8fVLzSUpbWHHU8esmEioY62PxzexE8MBuA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.2.tgz", + "integrity": "sha512-jcojB9H7W/jS29pMKWAK1N+fU99vXodHDTatS3b3y/XSOCiHo0kkA74pL3jJmkoQtYpOCxDvaKs1fo2Ij/1X5w==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.2.tgz", + "integrity": "sha512-1jn6qDU5iiOgFgygDzKUuKP0maTi0/f1+sBLgvij/76C77Nm3ts6ufz9Bjg5q5dduxiUIxtq86JIoBvo1xQ4Ig==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.2.tgz", + "integrity": "sha512-QVLO/czFMdoMFSqlX3bcswcJNm/23r+qoa/jgtmFc/qEp6/jXmIkDjF/XIo8dPfGaiwy1xfQn8o77L79GeXFgw==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.2.tgz", + "integrity": "sha512-hgO5Abm0w5UL6FEa2iFnZqo2KlK7TQ5QhV5x09hujBf7t5KzHQ1VmfPuTpqRy/rNlSxua3eWH374xxiVrP+lcA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.2.tgz", + "integrity": "sha512-fy8rXxuYEu602abC8MUNaPjYLIFzReOaEIEMKMUa0rFEUxNpVXhs15KSSQ4qlqSaM7B6rcj9rDZgADh/IGDzLQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.2.tgz", + "integrity": "sha512-0+bOkiQ779+r1WpoHOWHqncvyySci0vKph+myNDYb+im6meJAzHQXay6oEgnkHuUGouM1LKTZwqKpBow6Kj7CQ==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.2.tgz", + "integrity": "sha512-mjSkrzZK5Qsl0a9d1JgILOiuZOSDTVdKENcSXBoqbzSrspLR/4/IRVDo5wd2GgZjNss/viBFJdeq+j7qH2nypw==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.2.tgz", + "integrity": "sha512-1v5vHasdfQAZoEHakBV72LIFAC9JjnymsiKxp+GEr/ma3+NJCPSaYK+qavInOovJkgwFrs7GccX2d6IgDA3Z5w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-wasm32-wasi": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.2.tgz", + "integrity": "sha512-mb1VobWn6NheziTk5/WEaR6AKVbrwT5sOi6C7zk3gy/pD1qtJfU1j4PgTo2NJnOtbL9Dl3Aeei8w9jJ7qC2jZQ==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "1.10.0", + "@emnapi/runtime": "1.10.0", + "@napi-rs/wasm-runtime": "^1.1.4" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.2.tgz", + "integrity": "sha512-SqKonF56vA/L2yHwHYcEp2P34URpOZ7d1fS635cTkpDnUtEGdUbhI6NzsPdqeSWvAAeGDrxjWjNmibDIdFf9/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.2.tgz", + "integrity": "sha512-v7qRI7gXLRINcOGXt+7YmAZ6iFuyZVMIoXAxhd8oP+DR9dLfL9GfNIx7PLMxmhZdvq8waUJBQiWN9EKNy+TRBQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", + "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@standard-schema/spec": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@testing-library/dom": { + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.1.tgz", + "integrity": "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.3.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "picocolors": "1.1.1", + "pretty-format": "^27.0.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@testing-library/jest-dom": { + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.9.1.tgz", + "integrity": "sha512-zIcONa+hVtVSSep9UT3jZ5rizo2BsxgyDYU7WFD5eICBE7no3881HGeb/QkGfsJs6JTkY1aQhT7rIPC7e+0nnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@adobe/css-tools": "^4.4.0", + "aria-query": "^5.0.0", + "css.escape": "^1.5.1", + "dom-accessibility-api": "^0.6.3", + "picocolors": "^1.1.1", + "redent": "^3.0.0" + }, + "engines": { + "node": ">=14", + "npm": ">=6", + "yarn": ">=1" + } + }, + "node_modules/@testing-library/jest-dom/node_modules/dom-accessibility-api": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz", + "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@testing-library/react": { + "version": "16.3.2", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-16.3.2.tgz", + "integrity": "sha512-XU5/SytQM+ykqMnAnvB2umaJNIOsLF3PVv//1Ew4CTcpz0/BRyy/af40qqrt7SjKpDdT1saBMc42CUok5gaw+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@testing-library/dom": "^10.0.0", + "@types/react": "^18.0.0 || ^19.0.0", + "@types/react-dom": "^18.0.0 || ^19.0.0", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.2.tgz", + "integrity": "sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/aria-query": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", + "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@types/chai": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", + "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/deep-eql": "*", + "assertion-error": "^2.0.1" + } + }, + "node_modules/@types/deep-eql": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", + "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/esrecurse": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@types/esrecurse/-/esrecurse-4.3.1.tgz", + "integrity": "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "24.12.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.12.4.tgz", + "integrity": "sha512-GUUEShf+PBCGW2KaXwcIt3Yk+e3pkKwWKb9GSyM9WQVE+ep2jzmHdGsHzu4wgcZy5fN9FBdVzjpBQsYlpfpgLA==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@types/react": { + "version": "19.2.15", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.15.tgz", + "integrity": "sha512-eRwcGNHve+E8qtEQSSRl6urh+rFop4v8gm6O8rGv25CodbvFdLjA1vVQ1KkiFE0w0UPOnb8tDiFKL5lp0rtY5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.2.3", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", + "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.2.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.60.0.tgz", + "integrity": "sha512-QYb/sa74/s7OKMbACMjrYnGspj9Hs5YI5aaffSL65UfeBUzVzBJfVo3oWSpbzPurvm7yaCCo2Lk7lVj610HqKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.60.0", + "@typescript-eslint/type-utils": "8.60.0", + "@typescript-eslint/utils": "8.60.0", + "@typescript-eslint/visitor-keys": "8.60.0", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.60.0", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.60.0.tgz", + "integrity": "sha512-fcqpj/MyK4sxDPcbe7STNPbpQL4RLZOPWuaTmwZYuc+hJKzRf58yRxfhqGpc6PIq9ZyfSBpfHgmUHmHs0KwHwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.60.0", + "@typescript-eslint/types": "8.60.0", + "@typescript-eslint/typescript-estree": "8.60.0", + "@typescript-eslint/visitor-keys": "8.60.0", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.60.0.tgz", + "integrity": "sha512-aZu74NNKJeUWqCjDddzdiKaS82dgYgV/vmf+Ui3ZdZejmgfXR/q+pRumgobnQ2cCJTgGTWp4ypiwsuofFubavg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.60.0", + "@typescript-eslint/types": "^8.60.0", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.60.0.tgz", + "integrity": "sha512-pFzqhllJMs+jghLQWzV00ds39xLzuyqPSev5pd8f4Ir0rtKR3ZLUB4/4dhjOFighWb9larvtfJvqL+4yKDI3Xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.60.0", + "@typescript-eslint/visitor-keys": "8.60.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.60.0.tgz", + "integrity": "sha512-BZPR3RGYlAXnly6ymAxfkVn5rCbZzQNou0rxv3GfWZ8cTQp+hhVd73khbGLAd8k1TlAPLISH337M+tAgAnaJDQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.60.0.tgz", + "integrity": "sha512-SX46wEUtitCpq7AN38HkUU/+zvUpdKf7ephtWAFgckH8O7PQIyL5gvrhQgBLuEYgLfuKWOVvWVskMbuFHAz5xg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.60.0", + "@typescript-eslint/typescript-estree": "8.60.0", + "@typescript-eslint/utils": "8.60.0", + "debug": "^4.4.3", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.60.0.tgz", + "integrity": "sha512-AsE7x2XaAK+CVbeih0Fvbn+r1qHxtpLDJ3XUuFcIinT318T90yHMJC+Zgv+jUuDjQQd06HKwxnDu6sz1IcTilA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.60.0.tgz", + "integrity": "sha512-3AcZNBGMClm6CXDyo8kYvVGT/sx29sS0oBsIb9oZI2gunA4Vm2M3YHzRLPvsUBBsl+yB5FPtltq7gGH0iTlp9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.60.0", + "@typescript-eslint/tsconfig-utils": "8.60.0", + "@typescript-eslint/types": "8.60.0", + "@typescript-eslint/visitor-keys": "8.60.0", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.1.tgz", + "integrity": "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.60.0.tgz", + "integrity": "sha512-HtXuPfrHTyBDkameWpl+vJb1Uevu2tznAyahM1Oc4AENidCLTPiZDWIo4GfcxNdC/RcfGcadzzkqbRG87dUrQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.60.0", + "@typescript-eslint/types": "8.60.0", + "@typescript-eslint/typescript-estree": "8.60.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.60.0.tgz", + "integrity": "sha512-9WI52t8ZGLVGrPMBet25yAftqY/n95+zmoUUtJBBQTKDSKUu7OsPTroT2op7U9JatkoRccL0YkWDNMFfC4Sjxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.60.0", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.0.2.tgz", + "integrity": "sha512-DlSMqo4WhThw4vB8Mpn0Woe9J+Jfq1geJ61AKW0QEgLzGMNwtIMdxbDUzLxcun8W7NbJO0e2Jg/Nxm3cCSVzzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rolldown/pluginutils": "^1.0.0" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0", + "babel-plugin-react-compiler": "^1.0.0", + "vite": "^8.0.0" + }, + "peerDependenciesMeta": { + "@rolldown/plugin-babel": { + "optional": true + }, + "babel-plugin-react-compiler": { + "optional": true + } + } + }, + "node_modules/@vitest/expect": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.7.tgz", + "integrity": "sha512-1R+tw0ortHEbZDGMymm+pN7/AFQ/RkFFdtd7EN+VBpynKmLbP8A3rpEXdshBJ7+8hQ9zBJh/i1s0yKNtxAnU7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.1.0", + "@types/chai": "^5.2.2", + "@vitest/spy": "4.1.7", + "@vitest/utils": "4.1.7", + "chai": "^6.2.2", + "tinyrainbow": "^3.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/mocker": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.7.tgz", + "integrity": "sha512-vY7nuamKgfvpA1Koa3oYIw/k7D6kZnpGyNMZW8loow2bsBYla1TFdqTaXncWdRn4pgwNs+90RhnXhJScDwQeJA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "4.1.7", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.21" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/@vitest/pretty-format": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.7.tgz", + "integrity": "sha512-umgCarTOYQWIaDMvGDRZij+6b9oVeLIyJzfN+AS88e0ZOU3QTgNNSTtjQOpcvWr3np1N0j4WgZj+sb3oYBDscw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^3.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.7.tgz", + "integrity": "sha512-BapjmAQ2aI78WdMEfeUWivnfVzB+VPGwWRQcJE0OUq7qEeEcBsCSf+0T5iREBNE5nBb4wA5Ya0W6IA+sghdEFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "4.1.7", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.7.tgz", + "integrity": "sha512-ZacLzja+TmJeZ1h14xW2FB/WpeimUD3haBXQPyJqxvo8jQTmfeA8zv58mtjN2C7EHXZDYVcVYdYmAxjkWVvKCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.1.7", + "@vitest/utils": "4.1.7", + "magic-string": "^0.30.21", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.7.tgz", + "integrity": "sha512-kbkI5LMWakyuTIvs6fUJ5qdIVb1XVKsYJAT4OJ938cHMROYMSfmoQdZy0aaAnjbbc8F61vkoTqz/Az+/HiIu5Q==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.7.tgz", + "integrity": "sha512-T532WBu791cBxJlCl6SO+J14l81DQx6uQHm1bQbmCDY7nqlEIgkza/UFnSBNaUtSf41unldDFjdOBYEQC4b5Hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.1.7", + "convert-source-map": "^2.0.0", + "tinyrainbow": "^3.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/acorn": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/aria-query": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "dequal": "^2.0.3" + } + }, + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.32", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.32.tgz", + "integrity": "sha512-wbPvpyjJPC0zdfdKXxqEL3Ea+bOMD/87X4lftiJkkaBiuG6ALQy1SLmEd7BSmVCuwCQsBrCamgBoLyfFDD1EPg==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/bidi-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/bidi-js/-/bidi-js-1.0.3.tgz", + "integrity": "sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==", + "dev": true, + "license": "MIT", + "dependencies": { + "require-from-string": "^2.0.2" + } + }, + "node_modules/brace-expansion": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/browserslist": { + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", + "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.10.12", + "caniuse-lite": "^1.0.30001782", + "electron-to-chromium": "^1.5.328", + "node-releases": "^2.0.36", + "update-browserslist-db": "^1.2.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001793", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001793.tgz", + "integrity": "sha512-iwSsYWaCOoh26cV8NwNRViHlrfUvYsHDfRVcbtmw0Kg6PJIZZXwMkj1442FYLBGkeUf1juAsU3DTfxW579mrPA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chai": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", + "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-tree": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.2.1.tgz", + "integrity": "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mdn-data": "2.27.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/css.escape": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", + "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==", + "dev": true, + "license": "MIT" + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/data-urls": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-7.0.0.tgz", + "integrity": "sha512-23XHcCF+coGYevirZceTVD7NdJOqVn+49IHyxgszm+JIiHLoB2TkmPtsYkNWT1pvRSGkc35L6NHs0yHkN2SumA==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-mimetype": "^5.0.0", + "whatwg-url": "^16.0.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decimal.js": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", + "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", + "dev": true, + "license": "MIT" + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/dom-accessibility-api": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", + "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/electron-to-chromium": { + "version": "1.5.362", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.362.tgz", + "integrity": "sha512-PUY2DrLvkjkUuWqq+KPL2iWshrJsZOcIojzRQ7eXFacc9dWga7MGMJAa15VbiejSZB1PAXaRLAiKgruHP8LB1w==", + "dev": true, + "license": "ISC" + }, + "node_modules/entities": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-8.0.0.tgz", + "integrity": "sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/es-module-lexer": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.1.0.tgz", + "integrity": "sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.4.0.tgz", + "integrity": "sha512-loXy6bWOoP3EP6JA7jo6p5jMpBJmHmsNZM5SFRHLdh1MGOPurMnNBj4ZlAbaqUAaQWbCr7jHV4P7gzAyryZWkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.2", + "@eslint/config-array": "^0.23.5", + "@eslint/config-helpers": "^0.6.0", + "@eslint/core": "^1.2.1", + "@eslint/plugin-kit": "^0.7.1", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.14.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^9.1.2", + "eslint-visitor-keys": "^5.0.1", + "espree": "^11.2.0", + "esquery": "^1.7.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "minimatch": "^10.2.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.1.1.tgz", + "integrity": "sha512-f2I7Gw6JbvCexzIInuSbZpfdQ44D7iqdWX01FKLvrPgqxoE7oMj8clOfto8U6vYiz4yd5oKu39rRSVOe1zRu0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.24.4", + "@babel/parser": "^7.24.4", + "hermes-parser": "^0.25.1", + "zod": "^3.25.0 || ^4.0.0", + "zod-validation-error": "^3.5.0 || ^4.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 || ^10.0.0" + } + }, + "node_modules/eslint-plugin-react-refresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.5.2.tgz", + "integrity": "sha512-hmgTH57GfzoTFjVN0yBwTggnsVUF2tcqi7RJZHqi9lIezSs4eFyAMktA68YD4r5kNw1mxyY4dmkyoFDb3FIqrA==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "eslint": "^9 || ^10" + } + }, + "node_modules/eslint-scope": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.2.tgz", + "integrity": "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@types/esrecurse": "^4.3.1", + "@types/estree": "^1.0.8", + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-11.2.0.tgz", + "integrity": "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.16.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^5.0.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expect-type": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz", + "integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", + "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "17.6.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-17.6.0.tgz", + "integrity": "sha512-sepffkT8stwnIYbsMBpoCHJuJM5l98FUF2AnE07hfvE0m/qp3R586hw4jF4uadbhvg1ooIdzuu7CsfD2jzCaNA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/hermes-estree": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz", + "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==", + "dev": true, + "license": "MIT" + }, + "node_modules/hermes-parser": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz", + "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hermes-estree": "0.25.1" + } + }, + "node_modules/html-encoding-sniffer": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-6.0.0.tgz", + "integrity": "sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@exodus/bytes": "^1.6.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/jsdom": { + "version": "29.1.1", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-29.1.1.tgz", + "integrity": "sha512-ECi4Fi2f7BdJtUKTflYRTiaMxIB0O6zfR1fX0GXpUrf6flp8QIYn1UT20YQqdSOfk2dfkCwS8LAFoJDEppNK5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@asamuzakjp/css-color": "^5.1.11", + "@asamuzakjp/dom-selector": "^7.1.1", + "@bramus/specificity": "^2.4.2", + "@csstools/css-syntax-patches-for-csstree": "^1.1.3", + "@exodus/bytes": "^1.15.0", + "css-tree": "^3.2.1", + "data-urls": "^7.0.0", + "decimal.js": "^10.6.0", + "html-encoding-sniffer": "^6.0.0", + "is-potential-custom-element-name": "^1.0.1", + "lru-cache": "^11.3.5", + "parse5": "^8.0.1", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^6.0.1", + "undici": "^7.25.0", + "w3c-xmlserializer": "^5.0.0", + "webidl-conversions": "^8.0.1", + "whatwg-mimetype": "^5.0.0", + "whatwg-url": "^16.0.1", + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24.0.0" + }, + "peerDependencies": { + "canvas": "^3.0.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsdom/node_modules/lru-cache": { + "version": "11.5.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.0.tgz", + "integrity": "sha512-5YgH9UJd7wVb9hIouI2adWpgqrrICkt070Dnj8EUY1+B4B2P9eRLPAkAAo6NICA7CEhOIeBHl46u9zSNpNu7zA==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/lz-string": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", + "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", + "dev": true, + "license": "MIT", + "peer": true, + "bin": { + "lz-string": "bin/bin.js" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/mdn-data": { + "version": "2.27.1", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.27.1.tgz", + "integrity": "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", + "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.46", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.46.tgz", + "integrity": "sha512-GYVXHE2KnrzAfsAjl4uP++evGFCrAU1jta4ubEjIG7YWt/64Gqv66a30yKwWczVjA6j3bM4nBwH7Pk1JmDHaxQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/obug": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.1.tgz", + "integrity": "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==", + "dev": true, + "funding": [ + "https://github.com/sponsors/sxzz", + "https://opencollective.com/debug" + ], + "license": "MIT" + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse5": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-8.0.1.tgz", + "integrity": "sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw==", + "dev": true, + "license": "MIT", + "dependencies": { + "entities": "^8.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.15", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz", + "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.12", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/react": { + "version": "19.2.6", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.6.tgz", + "integrity": "sha512-sfWGGfavi0xr8Pg0sVsyHMAOziVYKgPLNrS7ig+ivMNb3wbCBw3KxtflsGBAwD3gYQlE/AEZsTLgToRrSCjb0Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.2.6", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.6.tgz", + "integrity": "sha512-0prMI+hvBbPjsWnxDLxlCGyM8PN6UuWjEUCYmZhO67xIV9Xasa/r/vDnq+Xyq4Lo27g8QSbO5YzARu0D1Sps3g==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.6" + } + }, + "node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/rolldown": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.2.tgz", + "integrity": "sha512-oZx5zVDtVB44AW3eaifgDml1gWRDZGvjcfdxonE4swNPG98PrrXjaO/KrnUjzlMnztCCRVlUueA1kCXhARGk6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@oxc-project/types": "=0.132.0", + "@rolldown/pluginutils": "^1.0.0" + }, + "bin": { + "rolldown": "bin/cli.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm64": "1.0.2", + "@rolldown/binding-darwin-arm64": "1.0.2", + "@rolldown/binding-darwin-x64": "1.0.2", + "@rolldown/binding-freebsd-x64": "1.0.2", + "@rolldown/binding-linux-arm-gnueabihf": "1.0.2", + "@rolldown/binding-linux-arm64-gnu": "1.0.2", + "@rolldown/binding-linux-arm64-musl": "1.0.2", + "@rolldown/binding-linux-ppc64-gnu": "1.0.2", + "@rolldown/binding-linux-s390x-gnu": "1.0.2", + "@rolldown/binding-linux-x64-gnu": "1.0.2", + "@rolldown/binding-linux-x64-musl": "1.0.2", + "@rolldown/binding-openharmony-arm64": "1.0.2", + "@rolldown/binding-wasm32-wasi": "1.0.2", + "@rolldown/binding-win32-arm64-msvc": "1.0.2", + "@rolldown/binding-win32-x64-msvc": "1.0.2" + } + }, + "node_modules/saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "dev": true, + "license": "ISC", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" + } + }, + "node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true, + "license": "ISC" + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true, + "license": "MIT" + }, + "node_modules/std-env": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-4.1.0.tgz", + "integrity": "sha512-Rq7ybcX2RuC55r9oaPVEW7/xu3tj8u4GeBYHBWCychFtzMIr86A7e3PPEBPT37sHStKX3+TiX/Fr/ACmJLVlLQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyexec": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.2.2.tgz", + "integrity": "sha512-M/Q0B2cp4K7kynaT/vnED1j8TlLY+Pp7C6Wl2bl/7u/F0mUVwdyOpwomQb8JpYLitHUssAJRmLZdMCGsrx7i+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.16", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", + "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyrainbow": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.0.tgz", + "integrity": "sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tldts": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.4.0.tgz", + "integrity": "sha512-yHBe+zVfzNZ3QfTPW/Z6KK1G2t340gFjMHqI/4KKSt/abzYydzuCnpqdaF5gCCABby+9Yfbj59oR5F2Fd5CBzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "tldts-core": "^7.4.0" + }, + "bin": { + "tldts": "bin/cli.js" + } + }, + "node_modules/tldts-core": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.4.0.tgz", + "integrity": "sha512-/mb9kRld+x1sIMXxWNOAp5m6C+D4GrAORWlJkOJ5dElvxdN1eutz/o7qHLp9gFvDF4Y3/L2xeScoxz6AbEo8rQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/tough-cookie": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-6.0.1.tgz", + "integrity": "sha512-LktZQb3IeoUWB9lqR5EWTHgW/VTITCXg4D21M+lvybRVdylLrRMnqaIONLVb5mav8vM19m44HIcGq4qASeu2Qw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tldts": "^7.0.5" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/tr46": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-6.0.0.tgz", + "integrity": "sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/ts-api-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD", + "optional": true + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/typescript": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz", + "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.60.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.60.0.tgz", + "integrity": "sha512-9f65qWLZdAW9m1JaxBDUHcqRUfL8bkxxXL7XxEfI+F09q56PkBvIfCjLF3yInsDM/BBmwkqmCQdCZe/RYlIWEw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.60.0", + "@typescript-eslint/parser": "8.60.0", + "@typescript-eslint/typescript-estree": "8.60.0", + "@typescript-eslint/utils": "8.60.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/undici": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.26.0.tgz", + "integrity": "sha512-3O9Tf67pGhgOv9jM35AbhkXAKi13f3oy3aE4CSgr+TckGeY+/iu97ZXN+J7DpHPzLbVApFd1IFhcnBjREYXYcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20.18.1" + } + }, + "node_modules/undici-types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "dev": true, + "license": "MIT" + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/vite": { + "version": "8.0.14", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.14.tgz", + "integrity": "sha512-s4BJJ+5y1pYL6Otw51FHhVJQhPnuRinKig64g/1+EUNaJsd3gCKdD31IPFvswUgW9/60QT9oFHbZHbQK5imcxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "lightningcss": "^1.32.0", + "picomatch": "^4.0.4", + "postcss": "^8.5.15", + "rolldown": "1.0.2", + "tinyglobby": "^0.2.16" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "@vitejs/devtools": "^0.1.18", + "esbuild": "^0.27.0 || ^0.28.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "@vitejs/devtools": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vitest": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.7.tgz", + "integrity": "sha512-flYyaFd2CgoCoU+0UKt3pxksgC+S02iTDN0n3LtqaMeXsI9SBcdNujc2k0DeFLzUn/0k538yNjOSdwgCqcrwJA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "4.1.7", + "@vitest/mocker": "4.1.7", + "@vitest/pretty-format": "4.1.7", + "@vitest/runner": "4.1.7", + "@vitest/snapshot": "4.1.7", + "@vitest/spy": "4.1.7", + "@vitest/utils": "4.1.7", + "es-module-lexer": "^2.0.0", + "expect-type": "^1.3.0", + "magic-string": "^0.30.21", + "obug": "^2.1.1", + "pathe": "^2.0.3", + "picomatch": "^4.0.3", + "std-env": "^4.0.0-rc.1", + "tinybench": "^2.9.0", + "tinyexec": "^1.0.2", + "tinyglobby": "^0.2.15", + "tinyrainbow": "^3.1.0", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@opentelemetry/api": "^1.9.0", + "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", + "@vitest/browser-playwright": "4.1.7", + "@vitest/browser-preview": "4.1.7", + "@vitest/browser-webdriverio": "4.1.7", + "@vitest/coverage-istanbul": "4.1.7", + "@vitest/coverage-v8": "4.1.7", + "@vitest/ui": "4.1.7", + "happy-dom": "*", + "jsdom": "*", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@opentelemetry/api": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser-playwright": { + "optional": true + }, + "@vitest/browser-preview": { + "optional": true + }, + "@vitest/browser-webdriverio": { + "optional": true + }, + "@vitest/coverage-istanbul": { + "optional": true + }, + "@vitest/coverage-v8": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + }, + "vite": { + "optional": false + } + } + }, + "node_modules/w3c-xmlserializer": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", + "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/webidl-conversions": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-8.0.1.tgz", + "integrity": "sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=20" + } + }, + "node_modules/whatwg-mimetype": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-5.0.0.tgz", + "integrity": "sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/whatwg-url": { + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-16.0.1.tgz", + "integrity": "sha512-1to4zXBxmXHV3IiSSEInrreIlu02vUOvrhxJJH5vcxYTBDAx51cqZiKdyTxlecdKNSjj8EcxGBxNf6Vg+945gw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@exodus/bytes": "^1.11.0", + "tr46": "^6.0.0", + "webidl-conversions": "^8.0.1" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/xml-name-validator": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", + "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true, + "license": "MIT" + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz", + "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-validation-error": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz", + "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "zod": "^3.25.0 || ^4.0.0" + } + } + } +} diff --git a/frontend/package.json b/frontend/package.json new file mode 100644 index 0000000..d907d9c --- /dev/null +++ b/frontend/package.json @@ -0,0 +1,39 @@ +{ + "name": "frontend", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc -b && vite build", + "lint": "eslint .", + "preview": "vite preview", + "test": "vitest run", + "test:watch": "vitest" + }, + "dependencies": { + "react": "^19.2.6", + "react-dom": "^19.2.6" + }, + "overrides": { + "picomatch": "^4.0.4" + }, + "devDependencies": { + "@eslint/js": "^10.0.1", + "@testing-library/jest-dom": "^6.9.1", + "@testing-library/react": "^16.3.2", + "@types/node": "^24.12.3", + "@types/react": "^19.2.14", + "@types/react-dom": "^19.2.3", + "@vitejs/plugin-react": "^6.0.1", + "eslint": "^10.3.0", + "eslint-plugin-react-hooks": "^7.1.1", + "eslint-plugin-react-refresh": "^0.5.2", + "globals": "^17.6.0", + "jsdom": "^29.1.1", + "typescript": "~6.0.2", + "typescript-eslint": "^8.59.2", + "vite": "^8.0.12", + "vitest": "^4.1.7" + } +} diff --git a/frontend/public/favicon.svg b/frontend/public/favicon.svg new file mode 100644 index 0000000..007faba --- /dev/null +++ b/frontend/public/favicon.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/frontend/public/shuksan-close.jpg b/frontend/public/shuksan-close.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ec1c99a3206eb025d3555098dddf5b4b6f822354 GIT binary patch literal 230624 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%0D;#z z9`us}%q1p)T04P>3n;-(Kwyz{u zJA)mVD`5#(}*5+4@PA-8ZnK|Rs4hNw0#VZU1pD?nXcZOS(J0&rdLVYowzf5(a zb0pT6BI+2LHjm{1zUvar{Hm^6O5(fB)6vOUU{}zFdX2sSK`1L7e0A&0DpD%kqo}%&rs=z&9tq zPMOE^t9KS@cMPI1jpnBIR3&*G#(3vB#!p^qt+KGUUo@Vo7!|{0bK5?Kx~_AC?2jHL zD2}H%1%XqZm>=hg(U!cz zB5zEqXKDMn{4rQM?}qMlUnU8j5be(B$v)ZV{{XF3%!OuWIarZUE;-w{9xzXDT8bu# z90M*6?0m#y@#3b6+scHiMBQ>9KYRRpRau}!A&LOG`GL*|{+Q?VrU(Dl;xA)q?w4zs z5->7J;Agf^<4*=Oj4Th5c_W?<2nY2w3bD9|s=mYN*EHpi_h}?&ZU`-&pk#BO#2>=D z4sr*UYt33#+N{g9aCqnd$GPL{S1$Ca8r|+1cv$TYo>w81=RZczZ?Dj{!YO2Dc%m|^ zoVN0$6ZAOgk^6 zBQvqi?BJ4p57Vb#TDxj3TJ{LV+~VH~R$nP_haEP8cMR0}e6t-sctwbIlM%-vDIY%J zhAhJXcKk;i=DF2vZDLARa9!R_CBavGlC8B4G7n?Yw{**)Y-5rpSfqpQoROUN{-2Fo zO(t7tJlSSZatf#>JZr97 zdG;33K|D{3kKL75^&Dgq)32|+bMk4XX`_V^gBAgnDF-7t&N2s2)YYvn?ajndg+IFJ z3Y-=_+Z{e$Gmw3I*7Q)i-@&Owk(Jt6lyJlXS0juAz&PWtYSuEb7Biz%gUz%t0PtKC zQWWDGTWRZ)l1HXLTF_Pk3wfrDCzZv)ak~kJ1OEUX1bb)Nms+#?Ow!-k%Ye!m?fA=u z0B1e1fyeUAPXtM+=~BfkjEG5Adt*4Jgs zmivxz$QV2j7w+Wy1M68jJ?Xo)nhTi18A(tXNc7k8sXrngf=GdSi-GM0U z)Brf++tB;hIdUvXQyozHb>cz4-CN8ZhB~%swZpUKY+sU`F0%AcR-n)tCYXChRQZsfpZvv2v!Wa%JJA09ln*G z_BP*Yj%Xv22Tz_z9ON({ZYodVn!9I1@I^eKAyz|aUIcq^PI`c|drVAVn%Pw1M9uV=!$2?$j*Qc#h)->5H zuWi!g7Iu#@%#3!hEuJygllqFg3te663v9B#*@KiEu3Qjo)2O@YpYEX-Rzdq z`IXKLYX1Phj5*+B;NWMsr$7Z)HGu!o<89vl6C%3~5PT#n=D{oHAj1 zfy;e;D&C`N*7uTIM{yjh04mrZ;Qs&*ewZgG(zUet2C*E<6;c>uS7lYs;@QRrVZqO@ z^XPKwVslbV>3Wh*Kv!I&V*|Ly@~rfk8uIE>^T_S7IOwa#^sa(tD$Ms78odS!18)`r=zTx z$vcqYlz$1S9Ahn#OBG*kas4w?BBoq8X!1h8%gFevt1D>2WlL##z6F>(C&Z#(&qGyDC+lc+Q^qOLZrLL1~+3EByQk!uS~V@HkW50 zHuKy>gp$#Mr27oxp!|Nd7lV8&d1WhVSEKCc(G?L%jDScxxIZZ4r@84>yg}kv8sY6M zb39!OuSXsI@%;Y)8t82t=`*7mwx6Qfn{7D+n+GqFQG0yN-1~cV702psFK1hZzB5lF ze9zbqKo1A->FHP(dcDQg@3cxIj3H!=P!HF?x7MT@h`5a+w1wsb0VIS4MJE~S*Pg?U zde&_+(?+hAW3{@G$0yYCeYmWst|gZK3z<&amR*a~oCDAE^zT|T z-kDlB%SsUr?Zf54!OsL>f&m0%di`rrXn+6HmM=E+xoM%e7HT9&q>l`kKYTWN@_OK7 zw>;!rn|YUk3$wF2NV)slM=To{J9_;I$6UWebe$$6hdb1lKut zdmOe+E_TT}>@k!W1dIX*J-9!B;q*4|WlI}$x6%QZ_ejaVa`qh$UTO%V0oG!oS1K~G<-zE2$F^!aiDG+5Y!tRciwiQa z=L3P9W3cDzRVb%`44Yub6-yc z?3W%>1&omBa&Q!!b?d<5u3XzmC6}2QSCK|?>Q3x>`}F)X_+`ntt=Xj!E58L?askdt zo^kXvmZQ1<)W6{=t+fqu4L{@QE6zpV@cz_XzwLIJ-A}^D)p#+i$=lb)C)7La9^iMMC2-;}GZ6u`- z;D81PLyncp+TT3v>@ccG&Q5m^um1pAizlf%qWHN>h_N(aAvpV`f%g9Z3Tz2$3~9C5 z6M~E7FxW}sC$E0IRJInE_cO#Iu`d@2>Y(fy?UB%MJu5}LF{=Hmb-tXI(c|XxXI8^^ zAgRx9e}75_PyYZ2Sk_=m$xA^vz>QykRGxP(GwwO6`tO1+?DX}xw3%*vmfZ2}!72s` z86Jq~eCG*72qzw zk&f`3@z<_1=x}{1FCyU}j&>l$8g1Q@TL;_p{A;$VjVp>J^ug-*~q~o&Nzl;a;>yrs-mBtzJ1MgRvsMI^%Yx|j9SBk zAc99B-_Q_2+7BbK{HwFE(DeHvC5qZG{hW=*@F%BE)vp>biOX_&e~lNo(jc+5TWds% z%T$am0;+`oV;l7S2&ikf#U; z$@b@pS9cpngrK>E1bb$XI(dL>JPzdgjMjbHd63BBKr)+(p8nPA8Wx+Y>HAjp)Ok+q z%!;TELO?z?v5q%;?u2!gygV6&-i{7r!cI4|JLKo23X>7p*G-T4x_jA zq`tLy{{YcrU*A5&*uI$DPHWY*e}|THqswJ+BoiK}=W^rQjE~l^Kh00u7blB+tuh}3*e&t6 zmTB%3Z^Q=y6fwyd`kz|0ap6r1cwuD>N6Rtd1=vra0dQx&gqJRI_^F2B?zgS^1A~FIw2l{e&`qx=) zZK%DRT5P1-g85k+=HHC;B=gtT(~9Hl?hDJC85yIZ5)%V(?&x9kflyR>D9Up zKD{xDw`|R8F_I~YNzUk`Jiqs`*RBpToce=N10;dsRGKq``?&!w2d)R+{{RkYuB4Qg z1<-C_>T|#xAEt5s9V@X)<2oWgwY1pdj#P$h{H{s`QohJSpNWNS$&e_5Xl=I zuHA^qRz3O22i#{Bb!_0eaT5hdnS!#nVbjxr^z^H@`VIZCXGLKPDOY7XhB3kG$K~Ji zYF9I{=X!LvK4ry?&9kTP8De+9*(Q1elaK~@8U1UZhBvlUgdNz7v#Q|lBdG`Yvz~tn zr>s~^HO)PsN7z?$GXDSzGko2!I(0s^u*>#qC|*WXksB`TbDh})4!sE#P2W*i=5N~O z*2`1!zWt!n5 z*&;J4$gFjdMfc9}D;VP#cK{McUZdZq>r=&dY4%wL_{a{( zB<-@36&QfUm<;m@na+qdG^m<&Ac6SEqB@ZQ$ZqOe7F0U z$pkMLIV2o@L#1QBp7!#m+EhnB&Ldr=a7Q@lfN|^3defN3$0w>HK{P63GC5)$WnNhG z-=}PTUiF7+zHRB0sSPGvfHF8a{#dTVQL&ch=!RuxjdmARInN!va2NCAn#hL7>@xkR zE={vDvZgT6KpHIo_c-W{ePu!T8qIw(6)>@m=MaO9H9ht=NLS6 z$7}@4@tkmsq;WGQ={s#lp zdsjIeal(Q~!xRj_Hc4dXujiVD#E7XJk}D$ucNp?B)Qo%c`BtPTrrDH*249zUJCn)d z*W0^(ud6$r)RFc9V0lZ=V?oMn+CQ9=zmp)|(Ok(~C`$ZRqpuvaF4;001DV80nCH zW8b&6a}#M$&*7)P!$8X+WemJvXXPHm@%8InY;TuIw<<~qZU)SO*LSZ2>&-dz)}Lj) zvc(;;%e~OA%b!eh$0xUX+V(I!>rQ!G?Nj)YVC$TT`D3vslQxqFGYqq%6#La8IXEj(Nw{lEU5KzXo`~-l9{y2Fj7s^Ij`h zS^1H`mrTggs;N@HDIgHt@zZ7xwrXoTHHl1Die1x%&s<{}`fxpHxP-L7w}ILz0)QJE zhd3l-pG;MDvy$Y=8>_0wo1q0#cLpXJR-LM2?bmut-@igSJ*{XSt z9ez@GAnE`Ervriyf6kTBRzLsLY!*hzLoCr{e|Shv4hN?ob{v28>!Q0~;Vv#lQ zx4!^QXtQ8rJqXQn8kdD*TZOpOVKFY;G&%2{qd#6pwRTEy-8t`82v=X215cPNaoTT& z?`(m1^&pZJ{srUl=bzH7&86QPuQ|0j)rjClg#*{FbH;ks``N2DL1B}@0-TzDIS;$s z(agunjHS|*uKw4xTIk2+8C$C^bI+|`g4N>O0!FHO?NBrMRmkn0Ec2ZDQpg{SDKzdD zKmXPB$cT)E?bw>Ek_VO9y>Kc?(o_s_`Bq?@dEYVG0nJ^=v92Und@0JW0Q#D+2ky$& zUA%;{hTsEN%<7{IN4+$}(K_*udUgRk^fe4}hv;eUp&aJ97Lw*j)U?osRoGDVDszBy*Xhq{yQN+tNYOky;yDF( zV?KwW!3P}U{{XGYI)83Ej_n;Do<)+Zaou^b^CA@-4E8*M)B*bTtJiv+y`{IGx%Z!$ zl@yX#`e&i%=uc*>8@FvX>@uB**w|dF7fg2@2;hGzudTP2qVoh&#VdS{nB4;c2+8y# zaKS&ylq*Y5Fy`o0z1165zLr#0iwXlO0K1nTH$0s6!RL;6t!oW4P5T{?xcgk?wdUGpszkxfy!Om%*f3yZLdwxEZ>3TM#nuVH%arT55bv=Hx(FBrcwo;k* zNAga%l0V@mvGzYo;`OZ(=FqGz7Fa-UE@tXa7zeg-ociDq?dU+@;L=SDS1`0wAb8kd zsU2y7hm&;QZsY^T-jrd78W zaY~L%aLDCjkTE#OCj=AKz0cuyP_xxpraFzL4@(wEuoO&Xyrlk5X9kf2s|Eo z1NnVx()BM7+TJ61YOpy3Ge(2v2dH7*xNEyfViIZB3p9~N*;VxS!SDS&Y223+p0l%x z((Xv0h>s|+VC-BlAaS2?LG6Q3O<><@lk7HEa%D#U04+w?!59Y%oD3=CfnAP?;kygp zK7X`Ik^sI~SI*wxkb3%c^{qI3Icpb~CcL^nV(pM41y>yKM>*^3RGy^R^1DS(v^iLm zymDcsB!)jPDs$5ZKcBTrGdoYc4>$N@zo(p$2_kwow7=>lpN@wL<^vD<; z0OPfDH!;g=sItiu#Nd!ng1mFv`ubHjsH}hg(yA>|`bdOnh|`wbzybdN*W$EpqPL6e z_Ufnij?PX`0~j2APx-}3XMm`tFfgDHPao$aH5RE1Z#;8`DiDPusUYVct!i^zlHSTC zvWep*umIk<;d>u^3{-bW%Oiy^By00Fatmi5f1hDit&Hy)Mo7zo9Past`5e|!oyoYh zo)f+)7a{sGk--Ph;Pj%`9oUTwpccZZT#PSFj{K9?@T{cT+SEW`Dkk!z60CE9pU8UE z;cRWA19?{}4nfH$y;9Mn7k8HzSW>}=0C!%4KHO8-t<7C(G?++ywNOWFFS+N8_u%HK zSR11XG|WhBXCSFiH~{+}>)XDS!nNBlh#w_#Bn&VZU~mtwUbQ`)v{!avJhQe{%Cmq* zIXLE}J1s`h|I>Pii|$nN!X4~F1Cj{u{{Ysj%e7}$4Yz1KmLwj-zvKD)(=Fxln8O@n za`5cFpdQ`&dsS<@^Sc~UTsQ~c*Mrmf z)VJOYuxnSi(DuV4w&0u3mi=-)yZcrbhhvvfm_((73yc`kcRcmaLHZeHiFKzaP@ z+b=9F@9m6tFsz8#{5w|>H^cd??qrioktc!A5W9JAAN!}F9epXO2Pw@*5*t#^-cv7C zWjJQ-xb__TQ#7mS?(FQAW|?G6#l{t@-&x_f^C>YJQ1D#pMLToOHcb^SkH zH#8py$DvuIF~#OeIWtHGbBr8gr}^a2+OSyv)ao|*48*bj01y7PZpNWi zLXE09#W-7lesfP{3I^5~`qdee#rJvVBbt8a0Dz}B?kOV3jIsS`zqts%n& zBxb4$8TRdIBRufj{{Sk#jP%U~Thf;*9obqNK@n2YI}z`}{3^i!(X`Uz)YGtBX^j|Q zsGvrQxC#LD#Xo5EqXLTs&;Qo;N?I^GQr5;|Qc{ymCV&G?$TYosieD`HiU5q9Qwtu# zrNVC77!&E9X`~=~a)jV*m_;l6lX3eP*?VuC$YE zsk&U9q@YlI>&^~+OAQ&OwNo5$ zOAboQZE+(m%x434xzDFKtXpgO=a0#i@bDa@n|TCd2S0{?{dIpv*56Lh-%yz#NM?m27!r~}=cpd1^~dF1K9jB7SnEv~Wg8PKwTKKdIAuI^9Y%N` zpP5=;rLDERlf-TcNOFZhzyN<3?UFbk_pPlfSAnND4Kpfl18l9rj=r39Bd2=jg>7B* z71Pn4`KRh|YBu6n&IsX`JgKXIW> zq3@hmL}hh!CXJ35V2p!Mi*${4#Gx1asxT_LUJPZUa6Lfcr;hF^I1V%KR4srWc92C( zDU3sP85F904tnUgJ)*y&)ZI`x?_+6O2?(9tg%hl$&6W|I+NP{3CZAz*uIDqbDlw zkbZ|1m#b)ZcGfb9;s61;WX@M3oDw=$rUWElsllaW8*#J|=zG;&nYg3KVUNs-aU%%? zWaRYZ4iDlf#xp3(5L!M@9Y=HZ7$22)x|f7)ZkSJJC)p(Lu>n#)-TeK%vsrE6{Xxzm zp4h42vD~Ee?SqWdxjd%@t-~d?quj;h@%ZLB(#UACzJH82*GCH6P~9XDwzocF)Rz^#Tuv_1wnuX zSV)_z5tG<@RI$VmU<^~jl4*eCTzma#+dOPug&qa&>-&tXgt z|J3%fiU~VLPkLiQl5)c}Aq4fNn%2fdOoL|Kx%L#)g@EV)s~bt_fl)}Z1NZ*`Dl8Wl zU;~p)$o1(_G;%ko9_E~ps&HIqxXyn{VkT0!$Qk-m$I`1yA`E=)zQFaUx5j{CMj7B_ zP!~V{)%LKpNhbgb0CP#SQmYQ< zHO6XQJkzZ1{HTGrA-0#!)z6~w^L`bNapKKV>v!3w8xK1W1u8MmJe<;OX#dvsUDX8l za6ykcXyeaK%msPHmx=WsCuiFxQ-PB4?<14Wao_rSQ*~byK_;IqmEDEC-NWwv?D7Ny z(~vkk@zeZuxd&0Ic;80TCRmxdVUd4HfZ!HXEivaJnNZ zZnaB8adgbVuvC~#U}vZq`@=o|0G)HX_0F$v;vXX7?qq?BeVnrtR|5zA-(Rn_Cx$#% zZ)v7OX?Y^Bjc~0Rh1$NGKm!1G?_C@CyF+A1?k^xH%rGTGjQ%2qho#OPwR!BW* zcYb|qLV4qhX%WjHJ>y;2`qJe^b07cL^8G*!R{A)j5uy8p?+UyQxjYQxKbG^*MmD$%4hSQi*x+>)#mk{z_=Ck- zg~pYnPi<{9vK5Jw8$NKQKFHK(F7B>uk`z}0 zbC$>PW2f^Z{cAdrlSo!!Ym3<~?{8coxp#9THqn!ka6eDVnWkyqYK(h;6r6o~ z`%~rAZQ@pekjb$}%G`FwdmNnpRV9Y2ZwtuM+N`i+g#?4slhkuca-E!_ft9rxWLVZo zH>;EL5-=EnfJYylO&+0jKAYu&B-*&yCJudZ-ykzjz?nIM_B303(<=cpaA&*@h* zYuRlliq7#Nc%@*c=f>4wK^;5f=QWpeJ={@4EzC>g3~Z7yw|^M}JQ2`-wIp*za|#P~ zDJq|oGlP+wnSWx1d735Ju-R|+ym5CO>cL*1*6@b;|De6o8XG= z%6!v2dooWrBc=~t{{VFU71?-ZZOUyXWfHFuw0#=`r>`EK^=Z4t5!L?U4Eym> z$$JzniDQ*dsa%iDRdteB)GUfi)NynTs?kVE# z*_%7ipVq5MrrNmw09UvD)*`bn?sQ!=mbtpx%l`l@#H6wOGgqk^9Rkk_eb-WbjV|F_ zknxs}Z5od*WR#p3ihSU9CpDpM;%f_{!YLJ)U~E)?bGU)|W`nFt7064gn^+S7VVHT0+3cXV7{_`v5x8XuDn=uA-JGx=D*a6) zvw3m=5!fCw2SfdT3dTD0ZsjfJSqN+r5Xp~hE;0D})s?!r5$~0JwIhQggd_TXzl9bH zpa0VKwV5;buz%VZr!y$!nMQq0bGOmlUB|XjL8Lk^G9K;M{eB|T)0yzC@ad9a{ z4u!o7{{V$BxuGJ(CKNFI9~9NIfN;47*{YOxw*+kv;ko6P0D5#Z_nL7CHxeR}c*A4# zqR1|P|I_wguv;r-vQPU>Q=~Aj2&z9Cq62K?5%XuS^)&6WGUZ&cA4=B7S7rUH*a}^~ zl}UWX1BcJ1MOs-HDBusPP$Esf^n?n8wEcknDGZXXHv`Y5086#A(~43tRi5HV$jAU5 z=9t%Ok(1Z`tWXF4)b^*4kKr_m+5Q@WN0GWRsQl?rNUBcKPhxqkj7vd?88`x%&mQ0y z;k3uSof{ah_latBg=}s~Mk&rNO zK_pc<=8;1P?bz)gADDna_x}Jrr~*dZ%0yCvLFwP$fl)~`gpdFmc_jS5=k=&i+{jMh z6bPd@2X=oBG5XV*O|U!5C~ZNpkN?&5rSpmn^F)fc#uGzJb)vCDnq$EG+PJ*r6LYpex|R_E_+!0YO3dl+1qo<^I@541NWPu*{) zy;xb~c>J|bkR7=^a68f^nP)y@WFO%i3gvapep|bFH2V?ubuF?2MRKOKf;=}P$`k_41QYzvGrL8 zJm)?7`<_iw(X|=gYun-spn{h1oZ$1paSR@8F_=ICB%O1V#xsM@d=t-1*CTUfC6%!IJPHw8&1Bu3yLrxi^N!i(y6G*Q z!6nu>VmQRIWMhnA`f=0zoO|f)ZJ5X8`LaGT0*$%q23TX%o`)Zx1{yudC9S}cC1Q7M zbwxd~k-_@($E9d5+9A5P6T=M878pqzjAN)c_ve(oc|6qL_Xlp7FbpvwgESaJw#Q?zfa4SXN>ub^O__vPQO>qz4R9deh_QPyM!R;3!9j(2B-W}1l)?*ea<|j-Hx0xY# zwwumAtSDfS1>a7D)5k?g93?P{7j3J%KP?-R)6o!S$F?t>H!SGT1>q(twO4;MTjdJV3%7Xc7LW32c z)u(jr1iRC>;!ahPb92vHUAzPA;MlWR@1?!A@JN)PA3J+)z4xj~=g&I1&$l_F;Kbu?7q=CfSz9j2bmsK(&!$}fVR z6&j(Fch1NEG|3t}Q@f&`SQuLM$^Ga@c$l>oZ-LhdS_jI0IL#0xTD{tV__Q~su&^_H ztMO{rM{HLY+SlXZMBj;9(Ghu3m3~N0L!KfBA*IF<|5r87BF=?)1A7?-vlFSku1~_p z8U>lx;YVptx1E9lZnz}qp?fcU?D^f6TP0SQzZJ`C_0g~+bva_^TR`A}ic6QQRA15`p?DPBeJd9>M<$GOX0 z&%J(&&nVmw4V)gQdzxLQrM%75#(R#D5mF#~BXqR(+)pL9YW$vY*GHpZ;1Ky)+zm^h zHlihWh?_Mr^q*bkr~YR|T^S+HLLpB#uT9)9C;G=?HKOddn7K#^G!(qAP_YoIRCx3&9!M#g!<84I*7Bj?>61n zn&qU2qBHBy)|0Hw^6D#G9*Z#QPYy#&|YU1wJ(~b2l0f$pr-pV`PemCC~ zdQ0j$7g2FjjePP0G$?=hqjxyQ`k{^RhF0TP3&&spZ1wBT)5`}6G>vZaC3$P^3<>J! z(JaGn>d}udx8 zQ7fb{?tO=^wY`f*Tdg00t_$4@p3d9|UT56fu?&9Ye+B>ORvyFM$jS?5Cn66Y9gL1K zP6sPPckGCwCdnVyzOoVAw@*L<3U?w6H}YTpGLbUkTW({#>Nv>8t~P!@tylQg&9ic@ zsF^*-6KxHdw<(SfPUd)x{+tXl-)qmVVOh_0(OTjo<_8h0gz|r#w5#%1bJTWJ?NZRXuxn-&F7}3w>2EHAGKq-rHCF^A5|Zm>+#nD zeFW-vr8=}FZM9uk$~oGSt70Apw*;n~1PKC}jq55)v%(zGm#NMY@LQweD(WBQn8J4) zq`i&Rjd&-54?9kb2^RFZ$&W5P2AAqtvwgcyTe=gDdCE|u)x3|$gbASq_gy}@9PO*e zfBw2NEb)*-=rr^V%k9?@UKdIsZhUXUdumVqJM%@k?9V&i zCj;-@1}YI8m`HEfv&HqBvNvw?r zsR_)pPN-_qPh7{5G*k~3>-xVL9Ad?lEtZ;Usk6?hn}_j3Fo=ODW7SqY_)^j0{up!e z@{#F@C(or^Qiz}X<)vS+eQSzVZE^ctJ)N0hmg{!|OaG|hx?x^Pc;P4!I83VlefmUS zA2IXncp8lu^Ay%Us*t~`N4(VPqF*2KyNz2d^q%wropa{??}%0i0PZff3QJek+Fpj! zNvim}^9{egtVR%wI2-3t_Uu}Mr{@h7%fpA;?KNY!5FeLD)6XfN&tQBTcrRhK}yy$&H#??IJ^F^&hnE>r~$)SwV7K6`#Xj&qS^bKzcW{{6%=Yb z*-4l^&DN%M3pibnFvbH)I#m=%hZoJn-Tb9heXDdr=&OeXsp3q)QkwO8d$N5Q-n{Sb z%U7eyza4eq0=LVq8e#;WaV5v5oNQohSid6j&qj||CiaS8a?yj_-wKavIsLS6eHF?u z)bPBV`DOpa2L9$fnH10X&y%O6GR^{l=o~+^fQjCr!}fV8AmLJ-&Fgcd1J`6Wsiy0~ z@LVO@ZU~%C`N!w_=9pBm0g_wtI59jH>Y0EAi+E3QrB* zOZ39P?(U3Vt`tHEog(D5F8eQ?X?NJ?+Hg^&`@v!A%LkQmEFXLHVB36S-xR!8MtHO2Qt#n;Va#|4>aEt0R8hWt?Jk>J6# zf(3(nSM~>uJmj_Cq>}_2!zbgm%b8T&9)|6>e-E!W79f|5%oJJ|>S_DwXc5c*41dCiPgkTB)jX2DVt%AGFm~pVrG<)T|vAlde^b7p+`9n!DIS zX|%!<^^-`{qceeFLZQC`rHpivza1f`mW};CRqtDaDkXYvy4Pcta>Kp9Y~{;7_@JK{ z{JvL|ahABA`@;%a5pMbob7FI@b<{1X2?lY0fXGBRuL~Wg_KhnFSzO$7GwQlqF7=5Q z6!ZS%^>V3X#TNUh(N3Z}U5N9^j(by;%eEOhiteYaMJHU6!`9nRUcI*^DQh4T^t{{U zO=q`$Syr45sql3r3xmTwj_@CziHGgG&zxu76Af;S2{faXO!Zyw)rAYZG0M~1Gc@u! zk|I+R0s>ONXP8WafMCP(#^0hL!U{5yQaSEKjna_ul;+7kKIw>qzPju!Yq9dr>Zg{d zrvocB4hjt0yuuY~??ziDb#BMx_g4Mf<&E3lA|W9>VAIPTGl`m-;+2dH&FY)3 z^K~C&O5Pq$S!sO>yI~>+7@&N~x}jo!H7DgfuyWcpsekE)IC?J|Zq>bantQ>PA)W$I z;a{u@zGf|Phu(U9L93H}DWc?n`Niw5%|KZnuNT})QR*_ENM@-a9Hlp(-UCu5hKb+5 zd+nbQ&~1(x`+UA;(z7G(>42vn8zgS}co|9!311r1TRypVkzB{-MM2V_Xn)aLFI83# zmcvdC&a}={u8nl<_DD50&$kX%c}<^f(|JSvdcZ8JGTylQo3i5|R`>i>Xk~ME3>>WT zanoW@!i}f|{}sr7x%7L3X``&)ElNLwLBhJ=?|WAxUL78}dv;Omu-mo=ZKn%l!d4k0 z^)R#dI8@zV*pWz`*{VrO4zo9hxJ7F-x9N*X4tF;mKI&u44SLa3pFc5j`&`IQ0RNMo zRXWd!^Mb@U#)jD+FVY=C62mWCb532~>W6$CcH5M| zGHoKu`<~bVN#uM?O#f* zWue|Q-${YRviPFX;=ynj%b>v8gmC|tk?9|EIesqEGNnG}IbTWNzoGcijzqs*2>KKm z=2;emmESTwpdbRb6jFf{$Sa$SUhkPJKUllukKaS;&D3ps1Ug-n2M*%~Jj{aas;qx0 zo2?PBvi`WM>wn4Ck+vcny`x^$Xu`B6r}EABg-c0@_vpF&JtO-&nMX_5g`fqxk%#qC zQ9U!CudOD29XK5R$H;z+lji;fMC8CEuiW_b+_4$8Wzv+SyMnkmCLSH|_RhSovFF#vu`M(1gxDw> zou2Q$oN}n&q4kdq4l*BjKorq-?K%9FtUQ5{1r-{1)>_4%-Bnuin@SR_=QF^eoonvh zxvm-dxsEH%V3mL5x0Cz`=LAIBb%GZ*Y`Bpcvr_cogIzwP$EE10_xJ~%+~=C5O|qP4 z(~^HW(*uXCQoFes>w+^M+i9v&tn)&nwY3jf}Y9<@Sh!@2TJMC9E}}H$NJXw1M2xtWv6y#Eosi?T0Qz z&#vjmZFhW5#3N*Fe!i#QIQlknxYm7SF*g9K_3fSs;}g%N0}19}$9XjW)85Ua zZljF(`cApPR>Qc)*#@C4BSfUY6ClAW4$E4?2+>+6rcSATd8*p(=GHlLvvU5+OC1Bl zlc|KcRs4Y_>o3cD~}ZgRx?J1J`ac(awKHi4PMr_hHU+bbm}O+)+T-<>|6 zMc8&n=&eKOl`sCTXZa}!8;r{MB)2zznmKjH%)sedM$^&TkI8*OG0}k+A_a-R+raLe zO_pqu>@-v##y7<-N>C;{GR?g=JqLz|le@CP@Pt8jVqqZ)Z1BXHK!#>yHj7aa2cuf8C0=h={ z90wJwt|N^m30>s#Pl3d-4KvBV=dSL*&wSr;o*zV4F6!TtEA-^ix3ftPR0=GdU0T&n zx!C@8U|cCE+?g~}%jC({l^YZ`uJ{0&x;PcSmouyG7g{zET)s33d69Z19xHOLmG~L- z>1R*d!Ygn7tM?19Z6gZb z7Ais(VYd{gS+!YQW`p;p^qHAz?Y&dvtNW3Ox~s`Ww}t9P7|T3sqm5Qk** zo>h|rwWajgq`0u7j$dvHGc$9>hyAAt=w1H-B{{{fXVJXF&z0eV?q{AbSAH&Eme0DA z{bpWb?q?@HCG#+lWm(lTxtrq-e=2Fkd&YJI+>un4+I0!GM~nts^X-Mig_eW1&mrug zem9nsW6@1dVd8u{1*TGYozF!d&u$!{3oano5GFY#vU;}#^Xd7RFTVP`Rx;-&+LUN8 ztAC1AY5E4DRoXu?+1E$k)4iTLR4#Sq)x+csdxG2JYaYrB8U>FXi18{a>*}}npVFl8 zexAB>A_l>1=U@Wm-#e0jMt83>Hgqt`u~xdFi+ z>U(B3(oNKdee>~=bJ(|i6M+(c^LgWa#LCdCpj<_|z1D4w5P6@EV_u=GqQ*R}ZV6zR z_QF1qix~7ZIIQx!C&O0E=IM{hIXfJ0@S&w!IV$x_%?lZE ziillhNT0(gal}6COnAshn?)B3@y%-Lgb=LxiT>GStuIsTr-9vi-ibyxL#<^W#&Cu| z?%NihsbuV7ZnMg8w$+&rBzFpEjtTelzA+#36~bdnKM6uPW=Q+Vg}?5p(#UVJHds~0 zi9e2>GyePX-zBc1A)KqoJ;XQC8A4a4^x- zvDQ^mHuW>JzUu0E&GUkBKr1j37FCh7(N8K%*Qd9Ru*72Oa;*NO##)90x!*j{zf_AoOu9IfrGhpG{1T1nK5JAx(+Vwb?QR{j-{tMXre^js`B zBPluLYHxLcdX+E+qoYjww?hbbFJS+r+iF@-`pkKwGrGOWb?p?RRsdY_+q_TCpTe0=mA37p>kPWRS771-{L`LPk%@s4fx zRdT2#pl;#WeDgyYeB+e>1w>kh`V?MIW)3TBSxLeoBuld-K`B_-6XVoqhiDdEj1YoJ z7u}Gc+Yw+g>}3zNdGwYUWGqGX3B(09sk}@Ycd_Gv&>biysVvN*%V7{(oMh`zQh%AN zsaGh)k{XR0r?DI0gV1&-(wJxn8M^(hDsFqf1YX=^jkmVW?Dw(T^=?a4jQj|tPSb!| zt1U;#V3ZP`&Y=mkmuY{^9m?h(>=adk6^&==v^h+QMAGJk_bTM#lW@Cl+#SdPdSx%1 z_!X-TNOLJMR$A#&B8od*y1{Gm1MAwjf%Lv8Rk`yRq#63Lp)f@?6E}t~{v_uymY|1E zA5Sq9$=RP!%yg1K?dwJDX z;YKCrXDcIPv#a>!oq+EHM)T6d8CwRq2QWiTsDe%Ib-Nun2mBMEW0p;ElVG`Z-i0Pg zR_UCiOB#GmK_}vcq6mIij)P&4mup))NTS6eDL4k>E#v()c0X0_xptcOl#Ar0H9iTs zgq-ZQT*KYCQv>i=2G{uwX$xqy9t;__Cf{e{&DKwpiwt#@+cKYEOJgCV$wymu5vzAy zOR3K6Cbv4^vW?PBSy6jwoJFy;@@n}iQE9K_JI_E8DhH~r-4kD9U$k5(g_1;hUR2)m z_p^pNWomDVv95~+N!26f`Z9!d1N*o&38znSV&|_JQ6qJ5@)#B*lzL*SxI<8{cGix@ zr5ZRX96&Sa7ubOCmH3CL1Qboy)*4G>d+_0mTWKtyc-$BnYT4+a*%gwGjEb_!P^wB} z0Lm8-ArmC5t`W%q%G)64$^}VRy}y1goBgVVEFSg5zTKJs8YLQE>Ujl??X@a$wB@`U8D|uL6BF zfz>SXzfnk7*5kKWL?_SR7RlqWNt?%={*H@fIesbWkWx)@NC8@-5Kt`RR0nMf{DR3& zj=^hK&vT^rs-}p7B+Q~Q#zXS9NHekJ9Bu%uOe)512CnmropHUZMfnGXj zNZXMlm*9g#x^q|Y!hX6}`QnQBo52T|(C)b|x5_~^a(vnRV($%KInU{T4mA!#RVlV4 ztoSV+L>C;GP0cE?abPyFC;rUGpIHJ+8)m^*D5~RT5N>k`7k5$akp4`I3vk1`BRq{F zW44_ACP*pM0Yx1V_MsUO&I{sd0`Yg84S98s(nPi~%8$H!DGIAw#$-OV z9JZ=LN*0lYbvb+1?2D>Q40MAI*=2YYT^`g`q&NV}_2=R2m{kqHzJz*55-8;j4Du49 zyB<5P>Uw0|_>C)aPtBO@5Rb?i=V$?5^Bxv9XU$UAT<1&aDn|GoXt-0J?NFSCFB8O# zlAYJn&h1cl`2%<#wG?n$lnw|zqbL+m-_BXxO}Mu%b&_kJkgRm+drlpPr{zB*Yo6a9 zPd^L^%c`+Zd^en=8&N3Kd^sTcX--c-|-TtFMUFJ zuUw^rs53>|`6xA-m?-Y#!^`{ilhhLRS~-Ge%jadTER@TVMVlPsr}uWn*YMlzEh&#! z!#V=`NA^z9X!<)4kCn5lZ}JS^eDTZ9S9iFev4X?OUw>g;I3x$?nd+2Y2i>$6)WR6u zibmRU;if}qGmueUuatvM?|6LJdz9gr_o$>aq71qv;1cfv$`P^QB(5_!52P~bt=bu{ zdElv#R4ML|bQjwLxhYT$zcejKK~yo>mzEgle2Q#I6hrqQ3ukwIFp^1Yvik|vemeCX zv==BDqq8U@X=;lv+s_JHAR_WKq@^CBG7D45b34_$ERtkk9oSEuk(MKioXQ=KR6$A8 z(j+Avs^C6oyk&|k7SsvLkoPeBBcUW4PHAu>N`}`f0m{Nr#!K0+GDVcgT0+LN(Pg?u zX;4j)F+CFQ33c`1Hewys_K1xGxq2k48=&V_wFbYAMqTjG1#}1DKV|V(1Q?Dr6c&*V zGyu8{)u`$-aVg?K> zmLO!p-_F+`%_wf6$@8P&%xC7RN3As@Zn;`D@A*grOuRi4pmEF9;cK9FQKf@B^_t7e zYcCHp8smIV(~1KRZEsomD9bs&cSE_A4Rk*wBtI%44AoCnh$vh|{F-`w5qY;hJm6Q< zRSU7$htL?3oZHB0+3q2s7RMa^wBEB{&uiS{*9=Gzz1gk@sTOK}5=?e8_$d05cajJk z7GLli{6IohR#cFORLo)&RKKfR|4X;?wC7*CC=JOGq)*{6awEUjV0+)T_U3`~7$S(a zeV}A+*@a9s|D!vrfC+f^VrmMJG~xE@yKc`_;HaPzn^+tX-4`OPp zcyyjxrY3$L?KR!A`;7qcx!aDc=VzjoRGvd2Jiw|3o)BILlXu`TN&nUkr0#q29?oCoZw$7N^mBi?Y7 zE2GwvD&CF~dz+iSLn$&P-U-rjpBtzf0foc}x)gBzG~7AgcG=Xc^kn6tEYi}I3-32y z>I7eQdN3DLZF#YN)8dU=HVh8!{C*EjqUCwZbpCVtfBERzUKS5AMBD!o(;<0 zU-7<~p$}qYw?1&Ev!23z#qyFKj~;R$3RSn3ZiL>lq1A{7Mo(~SYD<-u8~XEmS)*zq zB?X5$U9U-Gn-LV;ZMbdH#b`B1E#VYH>3(&j^CH)&0TwP62tbZxQQ{MdF02ab8ARQ~ z1SC$np2D$%T{=L%g2uPWDPSHMRZQLu71THW2R8IMo7uW;Op|=A&bkJ9B^mCmQ-MI8 z6#C`a1Ze@|huj*(4O3qNP%ld~yhs`)sylRG8T;=2~QN(cyi_%F&KaU@nt7}yERxRjc0*R z`|{o9-|F+OfIngR-<1I>p%T!nRNy&U%iP%2j8oF`7=!?*15lX2wX(K-;x8StLRpo2 z4~`ZRJOV%uqgX3iHyuU!(1Wh0>kG#P$BI2IRF*47(@T(Yaygud@aa|UDsr9PtZ`aZ zqz8)P<#8aj92JCFbTCGr#mIE>gj`V}_6dM^Iox^{ydp+N2;oGgRPv}JPQ-bzfskXR z`Gb}oPp!r6u0pb-zYCn5Uf};W|zhn&McU74WNLR>ZSd*{&AbF&yuXb`Bu?gc4oK<6?iB$)@ zM%LZ?8Z0v%&#^_Lu@w7yo1(cH@VuRnNvSnm6s6FaQTtp9)S(aki8bDml0oJqD`IpD z^U4x>X0)gd-4nJ^TRz;lw!U!Mo!y9S^lL3~Sj@MCqwHMN`@I}`va2{sMgM}!Ls2J> z&y8P|^0dA#LmgPM_mTV_0&l|CU zz_LC-oFxDm27Uq{%CaW_D8VE9$3FqIz_IZkKgI(Tu_kvV{kY?Dz#|FlNISOv!J!C@|F(^5{2IbXeRzdV7hwc3*}1?nfvjZEUS;rh(+EfF9@b z_e~lvu=uL(e;q@VGvLmx_3?YE`Bu=Gs^TC_to;~z_u|6mke>zP#x;6%+Z} zmlZBk)|*~F!}HGdqL|E+*zG@X)<^eO^&p3D!`4;URgIcd6gH*%^XzUre0cNGHryvG zt>B%vWtYX`>hT;&0@?tFl?KYT4|{OK(JWS`+@Z8ZSsWx*ne0KmUJha-DBS2y)4`1s zq=6Yjmp4iBm>Xq+*oy}WsRMl2?55gbFa8IGW63j46&GsmCf1}%zkm>;WMbFr$!5E> zz6P#ZoLtsIpC+32+>P$y9iV;#gwsal3Y}0XUwBi}i zI88J(O)fNxazoEoD~mLELYh!~pBB4&l3M(H%|}t*;oU$ZZPd2%ftjo(GBV1L!_A`55{|_*!7G~8D}KUs#Fs&QdtCk(`*Ku5tNmhhc8=WQXM1IViRBtIAbF!#1&_} zW=T)6&@rS|Mmt0r(=%d_z625+91GOxCPa&A520jEZ3))4VT0v(9r_=6D_WcK8l7`7 z$%$oCQKTQs`{{Z94~8`QZS>4Own5PF%D+vH>An9%YOO!}Ib zruu1ux7~Nb5I@V633-jGVdmBz!1bqdi1m$kqnDs338gJTN*U?v_LajA0cHc(9SIZvn@wBS81&4QUt({!whkNmls*j`M8=5j9)ai6vl?(-fo)$%H96;t- z3}xe)aGNX%qhlt3)0hzhPvP;PL@s1sO^pKvsJd_WCNufD_ZtXIPUr1C0Z!hTn94jp zD<|PNjIqt0Y&mZxLX^o4Z06k+yB8&2Y|E`$lu97sm#9-137AS|H8w|Q!d2}G9ZLsT z9^_QhbzkNF2FD{VSN8&|*ulW^92#xu902zJLV!*vV8*b2IEZ7Z?JNF55fL|68wX9Y zDqeHziF)(6QO^0QANFSKwYWWFT)-O$$>h~g<$qj|{nZunV_Oo}yycCZ%eqLRLb}Yl zXuET{u(t^`{j6aK8uan7TkWgbcR>8N9J`^qIs0#i?FKs7yPy!+e)i=oLFie z{$5xYB6ri1Pj21f<eC3x z^$H>ZJD?F#H|}6>kMBVJ*Uf#JDU>S}iI1dh*F~DUWSR9miV5aRLeW}R$z5Zpy_&IT zyBl{6qn^j3Vpyd5QqG}IEJHLie(Lj+@Zl88>J2_i6%4*%_R(%X!F=#kLLWDeY*F6> zET3wO8_RDvF4YP$+sEV!HlxqsrZbjKTu4KModJzp-<%Kypnzv`#?riY)*)y-7-Np9 zdrV^rk9C~q;P9%g``2jHzXbYE&^H0CI&+hhZ07FA$2xI0vxyzWx=k96VU9( zKxxrloZu!2W6g<>sNnl@*SYAZBoq}E+O9)Ex^?H3u-j6QPI#MfB1Wsl$c(4NRQ1Fo9UT1C+uSxIhL>)I5s% zQiVcghfBK*g>dt*^fPlSwy~-?_oHYsH8BkM5``ES<>OatETgq|6+6x!8EERH71ZIdktDs;yCaX|V%$(J+UY{!K) zqEy-h^}Sj|f_7DdaHk@hy9e*YK${`d`6_dAbc?oPA0HdHMPQ2yR0+0j1e~df86Z~hwNylWO?0@+G{~80a|1uf-woy$I1hvK&JC>J zve(R;JG;(w`THwRo2Quou~MM5Z8=e|#T{6f9G>e$C9BqWzoYJ~xzBR|V)otR=!|FD zp}o%c7$h>a5hamJ={?=<;a2+_gXprTIldSGq!j+uYnz(S2N9_wQ%*NP$OEML$as7*jv8y+yyiTK9!AdMH8Ce01MLhh^7nR4 zS9+hrvWhA!f~lXrId;XLwzw1|8N^Z?5S+m43od+=29-jr>c0Bu#sUBJr0;4yZlU^& zPY#$rl65n&gkJ1Rnq_Z?)Dl;83qmh0yNb8+t^o*AyvCVi0BTmCJCA0<3FAhq2z9!_ zX?(HNJojm7BW_)f6H%_$zy(mIsIGW4kxO3~%zsV;PsHg|XFY1=m2!WPwebPY?5j1?z1&q_0k5R#Puqt+UaQz2^( z-B<>2piz{VQ5vTd)YTiOSrzCCkgy6;P$JC29Y^M*Y_u_S8O%)25}?xEjS0C% z2MkXWPWu_RcmpJe1jkD`TmZ|W+~pQkJxNA+$S5DQF9XDA>hBVtDHY@|Y>STpaWhS# z>$;xn$xqXPT_Ltr5v!E`a)4|@WAJuhy=N{MLUJFNbeML^{71A5X3>M#j4Zk)e%D|! z>hx{eGI3G7>%7W?_~n%@1wt{*dm-w*$1S4#Q)lPp{`*woOQNwhJ}Zb04{ajo4H)rk zOh#22_R)sw3<%a{UH)%$mKxbkHN}#=SEB5G5rs5d{u zTA`Ut9>u(<>duW{SbynkhFKi?pjp&MUn`C2yN<=HBH`B+D6TfP zE*?7E-d*Xu{7qt4Sj+i>iS8^?C`64jfW_J=*&d;pNRK{=Ym+iiCX|IYez;6!!8o2T zp{?^M#UWtJZLUuKLnkt%tC6C$RdKGaaV#}hT9APA(0lA{$Hh!3`vhM~!c~wR+zmMC zk@XUJS}Hj~3`?0}9z?F#YZxUMV5Ktv(LCnObpVPGc>1HHfG4AjKcHVH<&V+c{A29R zkFC4I9|ZrOCjWm09smdbGw>uM>MJj@=>bxhf?{&R;VoxVh-0!?-TyGdA2<0=2%`}m z$lr2lBP8kB_0HzQQ&~8chn^*R0J%Ie|8%7K-fLBJU5Q@tfTku5AU^rwV50u|ImTf6 zHyb&7l-Y4wr_uK(He7;w8glN`uBQd3)n6q!?E^aImWP;825=dqT9;&9mX;WP{_BGkp zz^yv1hp~s~>Hu|)RDU|*vVL&iY}%){dFPg4P1xMs>m~>0B|Mitc}77{H+RvLKaG=| zLCApA);BI>%$v%!XyFGYsEK{HAvx4qO&GVdZ~$6|Zp}2?59b+J8101A%4X8V0k*Ib zMg?vN55XpjqSH5sLs5k(QWVq2P+VJ%d#aTezZpxhIm;DW9viZV0Jm5WoE|E2>CT;4 zFu${=cJ(AEhr!qZkXUX_BL-c~ziwJz6<~P}7?nvr&?bNnc8CTXv#R4;1x7##NU`x0 zGcpG6K29{G&WmXdi*YGQ5X^{1Sp@S$@-6BNpJGCyxGC=ih^QjyQYs#@L!0;Wdq?JF zaNSy-U{?+6+R5GGZ6asCJn1-K#B1j7Uo0G)l3P>Eu|erk@vP65=_-@cD9_l&x#_XX zqn%?|EWL7g%}!Ih*T5^B_(7yB(aF7=&v!yp#KHLL-AQ&@^@MmW*m?F!`fwC&urgCj zQYZRUX>nTE1k@(3W3HN%a;xp$Jg!LGYvuFg|2oCEZ;xFEYm zLQQLt0arKu3AYn@Vs3N_QK(4B%*z7KAhS#|5%-N+VCp^*ng1r;UW5Z1pa3b7wG`O| zL_?mBKoPc^^4M~9V8>&%4FpaS!dp(rLm0r_t2jnsuTwf5Onk~BVwBdq*ic)2UoCm! zKOSYNG8Q;v7^U3&n34xfZ7InC{0ChB5kJClc(ChOC;?y%bO^-$=ZRCn2teBcodIKe z481|X;s(T)qYx`H|1m=za;2-*q(W^Y^?Att%}saklwkW2+5b{+jQC-f&(A9}iV`33 z{GZPTk=c`%P*In-wt{+YZO1-$;ygx1))(n2B3%gw`-* z<$|qkkNQvke!A)UH{Duirj}m_z(`IA>XPJN;BZWX{SmU`A8eB$t+@#IpczqyAz)I0 z>3$T)hE2<)^hf=B-JNqWj$}-Q&36_xi4!dl`9fUC&)dl_dMW^9f!z%NuE-3L0r&`A z=D=+H(I$Uv@ZXvEL$Gad)=4aDc#-9~#(l`U>*k6X-o7uQSRX{4n*wdtlWpqX@F3YZ zrr!docHqWZZ8tti>mfaSz&7LuJj;O#!cLyH4(~v8V&RhuNx23Y1zi(89qSc>tFuIw zeF0RM4^mAxB-f{CT(86s?(M)5%+0R5hBF4EL|OooM?f(&A%UCKBtfV$MdKmD(SDi& zw7BJYj|5KXZh$P!khO9)qad%t$Swr4+%bxInO@l~ZbW|*dUZ+BqkJ`1LEDl?Pgpa( z_!>Aq4N5N!E(9Vv2MPpdgK7pFXdkd#5u`$gDzOAka3KP^!41XA^4O$7Hvr@M$IbdL z;(I(fRW<+{={}CpbM7ORW>C!ZJc!R?LY>Dj?1&O6VLJovoKauO^u}32ZVndWc~3Ct zeY3}HYAuahbv={t+E1ElLt!)`l-T_$gf!!E&Ag?N;~7#iU*q&6b8MP!YQIc@(70vn zaAwvFJbJFH15#`Fp>$U|vMBoTmZtlVmo+yB^2jhMvL)iR&OAtji{HfpOZn=yNzZ+T z4yAh8+_f1Qt(OSSb-n7w*4&RKZ_$&3`3M$t4Kz_$YE>qJqI*b|Iv=FzZWsxpqlx1v zh2$(#1{6X{dRUAT9Fii4%^ihfS*VNO$!-kOt0N&_!*xKONx8Hy{96S+a*f){lpF!G z2r7&)VU_%K?Yv)Jxpa%1&g7JBTj+A*cQVN#!%_RLlceMf!4fo<6 zY^CH&hCAB#=TO(pMm?^h4rpg?W7PMrf+=w5KQ32he@!ialgd~drcOg;QE77Dicg}K zU?c)Twa&y_(>-QAp+@98JWSXm zR1k8A8AkZ1QV5YYe{B1143p(#dnWY2{>Sc<>IWoOrB8t@w)vM`AE_o5Z%jFc*8RM> zJtQi%u)7xgh#iKuX0!ZiJpvVtcPUb(Wl*lkQZU+$Ab{u-cMycB?zl_7 zy$B^e8PRo~u+#IDxz1PrL|?K2no4(H3v;EFv)BbsoiGM|5TLe6z}7<22}AT2PJ|F0 z#NtdVw9p*2(u7}wVI(!-SUq2`j^eD)=5`CV)xaDAcEdk)g+Zf%9MCGMS ziciy%HybMB>PVguqFI(mvWP9ZMNJ``P&+D@*$PHeYeu0D@Gitce3L@CDw)=d z_t43M(*zQk2(^RT@v63*r4tUe$vob{d#qE}Pqc=x>$y?wS_PYKN|Z)q$i%y6O( zvvt+S+<+5rk%FJ!o(f_MzA6|+A1!)K)M@0si{oQY3?E`ra-F41FVFG_?{?r zf-^yjJ7~hD+tA}syuSFf!~0tc7>AOE8 z=!`ax#y@WCrrtn;tk^mWBCR?XkDenbNyEYCs>|5eX{vE<%taP;$0rXcyi$&9Gqn3GH>!!OTL%|7s)OfRDG z&AvFF=#Oh4C$ajp)J1E)+&oL|-;Dbx%yVUl4!1JIH#=)sx=|7u%R3*jtvV#ZQOIap zz~m3)d~JS28&!uT?;Ym;{*bg~zR-7=*Y)Y@UfzMx_njC@08mVInCt%XzIyiyskO## zQrQ&o*f<=AKPCU)WfGEN>}d|c$~wXE*pQ6l*1u~hi_t)o1?~ewjn|BlciT=Bxs4XG zJTXcb1$YN*e`~ZJz6Dt>0C_=iL_t912mH=<u}oMNwsI-!u$LhIEiMEUZ9xC>Uv|%ssADRLNf}QHkJW%L&?u@0-H;^ zHEWF}Cm0;S1U*{}s4sRLz-44waf|k)H98wZv#w?(`5M`B87m$u^IABRjo})YE{l~+ za;O48h5_KJS+Zs*AjM7rq1(~(XuKO5Z`M6V0ip#=EmG(fDLDlS1_Ssguia@}UM{QL zK#$hE!s}>428HD8gVu`AT4dTldbSojYvZx$xIvifxomK@t=wfLQN=3asF&VJwVc#E zRGwy64zsDE;+jq?8__r$6@b#qJ51KN0;3@E_;7|IP9B=T4n{z;0KO!EiNxs7E5|vB zxjMPiV$f6y$qa8pp*6u5TNf~rU730a)8+TBUfr}cZxN#uFiVtejzt%t^b=iwlfp6? zBaK^oo7V;p5yg-Pb@A*>2GABXu31EJOKeP1QcG47?xmSNa1E@ZU1>ypPAHZ`@G(LO zDdXvuz`i|z2Rg>-tW~c6A0N4_5BLZO_KwE^kge~pt@%F}_;1Jz&=lzalK;EA&p^oN zvoY4+*jBN1KQ)Sd#H2)q>&;Tm1&jLh2i8L3F=H!jca+!RtpUHb`c!lOrL$R=5oe@* zRyR>zn|6FS`^l;5Uhk;yS#H5L?7@s=kb<8ilk;2uTCHT(UvudQYYc>T#3o{%&Ak&Lug4NE=4nhQtEPyQML3tB( zAE%{X5uf|qINJbGqQ9;y&R|%pEaDPx@`ewD_p0%|1x<3>;Qy7g=+;JLbdK-G6!{fms?uaR2E#dKf;O%;$ZI(abFs<$a2) zjZc}}u_rrp|tr^S;tLp(>t zE%YZqUFsioO0`Ja+kDhnJ8JhFOP^QT7^&WS6lz$aqg&haSRf=f$fF<)E#rGgRCwF@ zdx2kWD21J}Z9#f_1M+gyCW7X?yEqr||B&_GQBAJF8gGCQTBxB#1ValQLPAH8-VD80 zLm;7w6ai7xgdU{VgeFR_(uH#(AJ5AD$=2zIev$ki<>a3_NqS6?l?ObTl;f*jhtg;wTsPwhNwg-~0y*kX zsOr{oY130}Ap6U1{p%$Ps;Pp&C%MyB8Rm`knrCXM?sv&=%>C&mA^9TTAxs#;iGd_E z1$6fJd`MMLoUKu~oIlxY{!x51-xTxmGd#hMrdH{i-@s6UpXR$R zbtR1Uq`Qn*yJ89)WKNN|jMP8B! zMSrYg`}IV}+zpIHJU$(YBvDZEo)Xl)(lN5rhD%^Bo@3S1;5xb}K3HAodTZQ-wiV(z zQcUr3!6&P0wQcVrTw8Bq;h&aA9%uD_IahZ6%1!*KmpnpeXfk~{8|Q3%e!ZD&j+gNC zr?vU7j5GxPUUdzjIuCJrjL~auIA{8V8k5^2*ucN=0%%q4a zVno%yYBs%Sg-@f28fsE@{HwS{dd%}1$b%Ka+v@Eo;9PnXhAqdtB3eDcbmKN8ME@y8 zqOKd4P)~|zZ^v2Y+Eu8_qsJJrfySLh5>@1!81+>HZz(vg*k3jIF8wX|^KyTx<3FW7 z-+!W;RG;m?b;^I`%KtpnOZADY2t0hfQyWqXc{4M( zmd#$5SMc%Z;zjR!R+c9d%G{|kOtIyacmA^Rb^{q7{%p~8rXr}Xc!%FB^wd;sBZH9* z%kdHLj9aHuC9{2)6P029!ii0I%$@)%71mWFuGn-#n1{-i+|>aX>{tw#OF)^)h#BL& zyiM>8ztw=he62M?;h$&)@XEef2uBw5ctQo^xmNgUwWfRUOdk~F?_5vl$;nB#)aae^ zWoH7Xrgmb*8lxEc%d%5TUfE?D;~T?X%nG#Kis14wDqY28=Rq&0kl|rmK8$QRZ9-SX z*CwzK)mwIL3{LhUaD>iiuMcxjzIK7hwI5fDoO}n0MnW$hLR^&67kTgJ=u?Q0?B4dpf0A5+mW4Y;XwldXyISM zME>T%A&$t^u)PO|z^?fE(xuQ7I#wTMx~ca@!(TKi`^wE14Twm-`fnm;EVOZobAPc1 z&~^SStH|Z8v;DDqXUGuzs>IJSvT^7Lj}AY=S4W-G`mzAR-%3rYiYLfHqfLr{?i}SI zm;+z%z##hnJQTrl4cu~##G*u?0MWaGEO0;xl+7Oupkmx&+@DG0+4ZN&@}^Jswk(kDQm^?Yd(^O*b}39f@Z zw?meai!+8}D1Nj-SRN8hG3}7;md5+gz>l**LzG$sSGcC6VDs*@)9!NPnebq-=*=SC z7r)nA_YM5!`iSaylyc@Qmiz5Ha#znlbelX2_I(1INhi}k$ zNV&%J-WAuIwLgcL_?nNnPW#e&K7##imG$hCN{ULy^f*}TLiOPy-C$9gs^)pOr-|PO zXEl+-_T4frDCsVto=DRHx@$Bhu{fjw`(geX(v%t9oKEYrZ~r$J`9G|W&hk-n_1jcX z$UpfB2jB1NKjm*L%rVckD8pRNgAvz_8~@|f+qvd?l8N?gSBq_72CEj8C=zpqMV<{uGWJ5X;89M3wr?e6jJdQ_KbZR0K|WB*I#8t8G*5eaC(Je7r%l_Dp=>JY44*20 zmKF8Lz%a?TckbsK{hj9;`ncV)XI{lao7C~`MV0#SUHWdv$Qur?8$R5<)<)U*wG^xa zKR9w!TMtvJpK=_yehWg`Zd~6#;rOkO#Hf5pYhiAX@Itq(E$EqIT4el- zK03b|Sv5~xFt{k;`0Ac}9@!?;-Q_UB)OdEoN>V!+MntBYM$%_nf{}n47ay`!)UQ#n zGDCQ3+0??c>^^d0$+qeI?^e9+CQT_}g&|?J5fSl`%%FdEB%mM4tHE$Z z(h(#lZD;W|QkD=S7#$U7%729JBwlzveyWzkg62H}-VkuztJ8k};EZ`W`L}9r{)_GKcp;hXZC@ts66R zt`SS*7b&Ku$?iOzp8R?~qH(`hL#oV@%cXUc=qEL4zpeoen3?xu)t6)TosnoAOVhIr zv2qBJ>yyg8A(Qmqy+VI5E|NDFk`G{GO~MEIF?teitCt!is32v_I*^<89f)DosN5J? z3#q0~aJ^f0|DxLYfL3I4PaS1@&GVP$J0=>*r}PuO|1cs&H0JE%sQYGTS9bBn%xRVz zmqw|nYc1f7dG#%uE6LP{VHK;O=3KOR!R6k^JCSNr{06ronPBT9SC4s>K$-SPAXlyM z`c#^z^<{qSmEe7pGb_BGF5IF!U+{fktK*^bw4=(7lzcRsyt5w>JOr(e#|gvr{ZKsY z;8r~FQUA-pct1EE*V!-I@x7BGzRUlSOjen_gCJ!PRyx5EQVJoF?s_0VkV+4w9~_jc93SFuu& zkDMQplH*bZZXt`GQ=fY+&Yi_BRMoe>uxeB8=$q`Z?8wnbOz3S^HlX@GsX($y_^q;? zfhgfuM6~i}S7M2Z=JA+eHALzCLKO7Eb+$>%&%T`*rWtO54v0`-sBb)g7Yr+)BAUl2HLa6L4Z6m~&Ghz!x2~u$%P*gaQ9?V4=S=weB|mG-LYbKA zu`f@JLPzU1_eId$Vm<7c!|HFD$k)HDALL6Cku8y*m2G4(OKB^&j3`^L%c#AVn{-}| zbmH_?Yg{tfg0ev8`=88&afP1~2@BlLjOWx65FfPz)!V7qc%!N`jWDH^KUI z?m2dNpPxR5I{wR*?U~_q8@Im!*`9*Am3y(c&*-zR-SFy(-GRTArqQZ5ndN zkIt*U44>mso4SjA`+m3H+5Z#;xC$zNWerB|BF{e4-}#X|1Um$zE`-+j=Kit<@@apf zIG0c6!Cuve2p=iUNX!JnfAAy=q=d~*tfQ`9<&C;r?hE_IlazE7iXh=Z;!s4@Gow9Q z3@Q&<@wNE*5Q-s{_$ZD#CsSvasvbI-fC|?h#`s;OOo6*}D0)5~Al2b0=ds($M{M!H zgsQ#5mP{B??!JWh9^y0p@z-HC;)@+tiWaYG%w9l|Pc}xQMZ)uC9>r`Ntf2 zJ~1CvBKdr;iMDVOUq_i$+PA*6YFfzWFMz}`aCn(-( zTua%f_2(C|ABs>AyPEKXsyP?*C?Bf39Wh#ewxZ`QEOA z?6*=-ck&(=?d$T*2V?iONXv<;qxtLxa4D9s`jriBhkCSdBZAsV*M^>XuIp=3YJHI~ zJDtKFyc;bI5B?m3{|1Dn7k63ylPibqF>JhY330Dk*C56<8oR1j(`CRD6rE7f@ zVawYZX#XYlJ_NQu8M|~l0Il{i%v!qUtbQr*7wxsrE<@-2Si}kz)I%%u$}nf0XR-Ym z*<0q{8I$=i=}Pd3Tg4J_cLvYAl&t|LY7@+Mxw2WoFHnq^jMJVhl{imxh;9XZh!fd$)Fn1sbgWc$aNF)=Jw{!xEf?|rzrVw5$zEE>_3DA2j{T`^2Dib&0 z7RD(1vz40?rZEdRJ8+w*hrK+u!?jv-(7b_&a$mkd6G6sJg|Fv*Q}n!rth^V3jJdrZ zEAOc=b?!3TKE$Io9nRY_eE88J&^y@&n~M4? z=1kiWr0daWH50wE!#F#fP?$Uj8awzohL{b<7lx)j!c0na_H5KwFo@M%*&$!Z6=my{ zzX5HTcHR{N5Qq;$UVp(mKE_0P@$gonIee;m_QxSC62;vH3ln79p)r3#liRFDGO6B! zLdYb`0zFK#)X3=BsZ^$!I8!V=8&j!@rWpp&A}1mXWU%gEsL(3_dfM^-I{(L zSla@tv=@Upo21a-vs@`Yo^p6{tFUmkdDh29#yGkZDtQH;@XUegix zUv+UNJ70{BbZj&gFABu&SdbQOnYCW!;rtk#byQq#?e?W5REiqgE0}eJ@K3?~4RBEZ z1eqajIHP3bGL*a)j$Tc+t_wu0fG#I z(2>Ol>!(US*CO)!@Cd#6kJ&hv%g+5-LDvSFx)QL0J<>5u*_+6*5mNnnn+hKpWRaHg z*5}%9nVVbMb?j5@NAt~@;L&quJ#(Tz$Z93E^shL%;lk1UYi#T1fxTv;UK@!gg<_qCFCs@-DmfVwZTF``Xeq#R`9vbM4J_kg}aT ziR3FyuzfZ8t@f|R8}nZz3QuK5FbA6pFPBq>_aZZ_BI{KyJMnQjHG#rp&gZTimnq{o z&6n2}xzN-4=(Ze1U)_@a0{2FF-yCf>(=ho`(G%RoFMAL4ZIL%zN{5fT&@-szh(y*^j znrEfOZSr%z)O|;p35?9RrTn$mhMXD+E5q`R6?lwMr-F&X!Q?<-=p7T zVS>Y9F*@7!9>eEzw5=a|l6WsVIHi}3i%DlqS5^*p*@a>Hs2Z%qX4m6_NW^Q4_$^!0 z_wjW+tWk=2BopuB7YOqqh{kD3HcZ{B+Ke34sx_Y)V&pgiG;eu&iVBnCZM^E_VG$A< z-diZp5&6`lVJ!V5cVI(X;74=;A#mx)TNoNuYAURSyhorRISp#wJ7S&8JV^veE#^3b zFTg>G)2s@&x_zvZVV-*+6f8v4GME2KSIRQRv+1d9?nXc^kkHLrW-%|2(6mWQ{A8a| zxw0C-*PO#bYDKdIcf9Y7(soUW5Ips;U6u6;DOd8c1#gU@%!`8cHe$Ul9&JIg%Tu8D z+EDB$(nL5tvHbrj!hOz__Uf5!a{aG%;|H5jD|l}&)D z&vo0Ir|?V`I10sxEV#hu)J!+w9f z$S2pB`WY6Exc@HV0L%1h<+PbV;)b(ucctaCIP%@WgWJz$NQe@oLcl`6xH9%gW*Mgr zlOVO?BkSFAOhD*?uLW=Qjgau`V~chj2y}ZC<7BGfFxDm3i^@sV;Hns6gSLu`$e?5# zL^s^p#hu-Kiv3E_g^4~R%Y$tY>yv#s5I#GIyrGc+F-Z0Em3Gk1N1ur`Sr^$A4^TdY z4*&+LAwV&=OZw^a@$Jh7OQ8~1U ztuedRCi#$2n&ysBOp9lje$nozq4c)$r;S5a>v(P{F7FVDB}|>ydKp= zOQ#$5h{MWPBc+mRQ)F)9AMaXY`)IPAYY}(59}T#kKnaRdQIdie5%r~IlLf+47=z`9 zY{TiCjC9k!_bls^aE*!+g6%OXRWnMr_!wbDP9}*+EOfT?2-YA3bE;e&zn~CJur1i{FYX6?VCOB#)oz*kI`W zTHFMFV*KUwMUQKZC#RpEyAFXO)RPLO<(1+3 z^*0uyzG98{Ym&ige&wj7?e02;O#h0NYt3;423^X)>jD@o11jYdWaspg-WNO8%>A8| zVB-JFSTT1Oom4_{xK&5~EnxJ^IFc{5XtB0Q=BN9u6Nu8sFL&xT?PNSJ?Ao|)p09C? zW4m+wpiRfixFz>*K;HeYX;Dbk8I(E{EZ3bE{XiCq|mM8M)R>B&Ar7 zx|D(}P_*wok`H-m4bL^7Gx~7AxAa5|$TY9B2hWPPD4blP%5y%cbXu4*<;d*QO)q|U znz}VODcHqT-NE0JGxLBH<2obmM5^D3h?~0e;bYeRK=~^(GS@r2hd~~(@Ajo23my$` zXsZxh8TeA_FUl#%uL#%&`c{@v?5 zBt=IT=yEOTPbu>6^cbf<2#isQ&+mI@HyiS_ou6I@uYK5-tWCQllw$5%SO#j66~%hu zWCpSXFeT+WM~dRDLFb0P%ywR;nx)&s;ji7XLOX&d?4GFbUY&tH+dO2BX@$Hv@Tdmg za(EWG+_iHnoHx@3_NJ6F85bXUO2$F#U1VQfqRrRoHu7~jcD$2uC4;$khW#d$O{=7F zG+P4+ly|L)@6lvI$|`ix|TI{lz|LaeRw@ z&?xCwGFhOLHH;o&1uaJk!U;IE6ZJwT+x$9Z`d)PZ%>_PG9@d-&sAjJH(NRq*v zAA0(+Ib6-Keap6QDnc?YIK=a^t&bfD4Y~M8kt^eyh{ABBw#&5Xnmo+`;mkK~K#3jWmYmr)WUxFK44YKpJ%I;b z@H^H+625eE<))Oma(2ba(5WJtP4_8vD?&Qdl>JP-<(n(MUI?VLI>VeK4Hk4`Ak|<5 zgMcVIHM~yH3{n7-`dfM&3RK7Yn(hddT|Kzft+V#)lsct6duF+i8+8Nt zWvXj%@b~hNI4!sZE_^}WCk|^@;)9^?>-=X#$^Wwb{|f)?+d554r&%+;;v)~Da$b*2 zwY}>Y%&Tj^6>uZx?4A3Dpy9h0m|GZ3-MvPb_+&3VqBJB9UP7l?_P@RrVDJk=P>f_{ z*k_dv0^{33_db43Lgy`QnWzya1!#QQI_Y)O3347xb=VZX{L-O{-3@`X15izY1zjl6 z|J`veomgeZE~sLco=^{(6~H)EKfdd1B3jCN{)+XbN6&MXxewX&a6?|voxU`Nr#G=@ zMrHPV-@GFad6_&q(`(Xsrf)=u_ZxdrX>1W^lvSk|#)_DkZg6tGFY4`iq)*LGN0ZPa z6w{@$M82{KQtgc$OHI7e63Qq7Bin%>9tq0u%~bH-i3C%R$x3~0%lC$T?Cn=bO!`_S z4yg|wy$b;Cit7+QsVq;Ywd3&@LUDH(9U)JouixqISQ5Hv0Adm%Cl!4OFpBlzTaS<7 z5q#UN5|Gh2y>7I>oRgr`FTVX1xY*rT6*_(zTe8!juGYLi zrdpw7YsbuiE6W7Fg8fLuaXI_dpv4D|$tryUgkHn|@*xEc0S~>e1NhESr{?z@M!BR- z(^d@f=tZ#KdjErM<%LWo`7OX9gRO+vJ*Nu#V#-E4t`9b(+2HGNRh}->TTPZIuM^cR z3rSQtfAn;8t`jzXago$^NWSi&Y8FzeKOln~kc_-xs;Saq3Y5iByUwLhOe>`W90xV1 zNmN$fm7zWs+mLvW#qr98int9|2IcO7e8E8mL{OyCb6;2!-K2Oyh~b#m2iOqR+cpHy zrW=mG(Avx6xz=~NX6A2A7wUnZ#qhu6xg&DRUe*k-&Q{o=QzBVEK$gp^H-NzKsAnJ4 zof)|#j^y?==Qv?smM^>DY}v}#Z+LhA9=`hSYDMws+_zlt8!q18TMXTiRfhPhZ-wg4 ziA>dcWNoKfpI$|~M0gsUvn+(}h&OIH{uVZe=HrbLR%quMo}d}ozrzgu{QEOOb=-U2e&)9m(m>XypPrB)u{2?-tV`mHylX7J(M zvRmc`XJTpFLi&F1c7T%lF##qTqt=Cq=FKxaF8NEr^~D3wu9zY7bs{*Pr&pm~_F^`F z0n{kAcZHoh6{rORdMtM&GXHzJD4=dAzJKqadFIc)y)|5wn@96Gu1r;pB3{$F~5-Wd4jJ2&(%=Kl&tmAOuYq9%G| zc%a9@wEdH7i$_;aMzJ-lSA4r7n7Hn1vraCB{WbDvEwiOsw&s08({q>pEqTD{=YoX- z5;2cuO8I>j@l8=T><3GINo#vIccS_}{<6vQ%0I2KnIHF~mY3JS=w|voow1col;R3W zzcd*EzE)&5X3z)KeZm_6}(ddDc4o-N&Ixiw)*NXz!>#I)VG%LEQGK6$%~>JFoJoe znB*+OHfp^20eH*G{>kEuGxl%55>;}&1%<5Qv_cMF3-U=>DDJws@?(9~Rnz(o%316i zK)NEo*P|W7|9Xa4FpjOjs?E;ruAh`nnbZvT?@Of2ZwO@>y}IjM=5)fUMc$QV+V_oUxU4`QmHkdWo_6X$V(eFirq`X* z=<^%SI>&`OI{l-7j8Se2#%+`{!?gZ6K|!7vx`xQ&k)H^*$&*MHZDaB+9l2J|d%*$N z&lRbJPkcAPHIMo0YDzD}QRK`)&+7}hm}c!hYnmlifeu(4;$E?v7y z5pKTuo^U+g6z4a#ys=0aUI~pOW9K~$q`8CN8z7z1>Yr3{T+rA*v+`ZK$pBX-<^l*0 zc)pCb`K`r#ZOd0TIckF9z08U*-6($BNCcTmxgSLMpu?BRn|(ySiu6_CvQef1z9N*{=v^z4eyKRfYtEg*J^L zNeNs8nyB~e)FlyJMB(d4{n~%2%5yJR`&gx>ob00p=LzGpi94Y;q0_8Y1( zgqnujph@2-L4j><3P&s{@W$@G zx;@5kJWbCB`kT;ieyts!e^@&DZ7vAJWV&nIpZz zB852f>SjvAu=nlI<4{xjgr3)B!aBP!%oz604oo!Gx)+MNJN%@d3524r7tvAI7Fbnu z{lXvlyk|3#GI?~tZ9E>Yb^io)`T_Cg1WL%r#=g&be)4IZ2X;j@)%)RSaa9zQ)?55g z`Q{SbE_7l8`?GDdxTZu&nB5mJHqF_bdcFQy=b&65${Z?#s{KgQe@CL7>HWqv^+46k zbn8G@@uD;lB&s+{<;-MS#a(E;l~|M8p;TDcI@r&Bnx#yDBe5aj*5 z&R;wX%nkX07s>0&58x4Uz|y!?brfafeFff^fS6bZ5~nAa4fYFbC9a>n@x!cWY|3d& zs&8h@-a^^rkJ$EqJ)`v6>A!KC^dWhF9BLJaWpySX+Yda^d!;TzeQ`Rc434u1jj(ZjQakEOiWKEwG7uKo?^+8w>lMH_TGGFmsuf#L7 zQi{~T+Rmipm3bq>b|DPf=~lP#B@qb|O*2l!Tv(fPfNOaaGJ5aFQ+zWDzLYqN&Tl#N5=A*Tj>0!4x+c^f%*jYNYI?;kPv)Od5WX8x zE`9~HJ`*{6+jC`;_rY<%?Ys_+FjAOTz-C;%312mx23g@WC<`HEE|s(JQv9yEnR5_3{r|%*#ZnKzl780O0==Rh@9ig zrYjy$t<0CU+ik38E@!T|4$eQ+ir+$Wg3g62br4CG`ogH7L4kt#JZW@C`c}x@VLy|W za7wax;=3eDKZ1F815+azRRI?|enV9#BdRq|4_zDy>JcJDi9Z^u^Cr{GL&dUf@)+j< zRr(4?m&`6ZSss!J(2zmaP2J3Ek#VbyYgp7U&f&hQBgYofvD*0D6L{c&R$w7nd4Y0i z$i4Cmub>p27L;4oakWEp2IjG@a9UY6;m0mKe5g&WNIXrBV-|xGz)z%lZZ-*J8n}*Y zMDgj5N39}709MC8j+$bgcZykH;v%KKpFUDN-gm>&v#EQ3%6556fiiN5=uW=nKMaDClb`pzH2y`EaVphekskiiO5#`@!L>dNiQvvXgDxJt0Mu5F!G9i}D#J4N!K10$&#)-Ucl;iZel zDA!VT^3Cj6Lu;qY+A#vH?UL*L0ctfpr-&-4Lal{_l{i`l#z69y)w~{}>H3S%liM9} z=`XZ-(n2Phz@tNw4zjF-`S3Z2dafAfDM*F7D3IjSI#^dW>IO?MW=ixL_UUAg^&jtOC;DkG=tHz zNEpw90_r$|FFt-gQJtX9Sh0Z+;b0-a-u$jGJy$GX;WYj1LJm1J zp^4M^P4Wj1g1XWbDXl<$Y5N$~iYx>%>?}HaVISZ;lS7&6^l8&s0&GO~DIC%mrhW5E zS(}6FW*8#-YzI4)f>4xF86%X#9f-Wo5~B|#1Pz5g(Y@{dD_R2VO^ib`hLa46htub5 zHUgnFgEjuSzZOwD090yoWqm4wFu7Tu+b-qPYsbIhXEk?g0>o_2(N_R%M~f=PqnLxD z-FR|RJ>%hyDLn~&j~J_1&4dw(;iXnE`J3Tg9c;WZV6?oZ4?|X5ofNeAgf`MRaDQc7 zEq;Z>c~;?Do&=k`JXLsv^SfAY{H9=YI}6!Pt1IOZ7#|~Y{L`{sp9M1Y{l-*bj6`tJ z*!9w#RfJ1jgy52en2g5I{NTL#biWO4TK^>*V$1v#U;a^IQ|3~l>d20Zl3f38>0pW| z0_glI0`F)TRr>5ccG$0jO@BLLAlTdZ2^}m)S*;;c`DG~@zJ{0d3_W0k>XZ+ZYN^Qu z*F!l~);9K9CR-!gQZTjhQXvnH!d2a9r3y4}1h%jDKS@{eX94kU+r#7^BAP0j;#*;F z_UrV?p@P*wv@go(V;hsRhB}ab`^D6g?ajz`y?vZIVv7%`TIY=fpf9&q@^;4jxCdfgcCm|v9*Funm@;>#Fnf#=8pV>7P6{8%45Gi@N0q{AiR z*Xn44dIrM99g5)RBBHH>j9&>{6$|E`!?8gPCp?w|b9@!-OX>CzQB1p{L*Y~EvO!M~ zQxz>MTZZTshvFiLyg)(vUjw%Rq3w+!^-|An#~sRk>>|vh0t{%}H)4xTrVfRLtNcyX z%~=g-u8bh##TYz;AAO%hh|uTnn^((k%>)Se`G+TUzmhMFuLKl2_|;dV!*Gvo;aT-yrrR-?3j7ev*5Up?nik-gAC zeL&Bx;cSdiH=K+A3hg>6ebRRbU4kb1Y9zleLu{)%vl^~ zdD~vlAzu$CpS~Bo2)^Pcyj2zCAnP=(^O7W%4jv}#*K4@STs(fS0E(1von3(3y@-0S zGFq|V{>e7b94`9#gvxWQW>C1Myz+oqOSLAX<=(Lj%G_(}%#kqXK98U{ecZdYCsYyW zQ$Y0OR!z25fXg!AwbDg2e5u%S3mZL&OfX@^QYVIg-8OvP+CtPd;S_!J-FSQJiH}4P zfUSiJCNW-yILp`pRDv}~Ip}n0csl1-M1fc>%8NZ@gKPkf%IA-!pV9aS%^vqi2=;gjVBF%hRo+y_Isumw3d=ex2 z3?zN9?W)_}z~?$eNEa%VDQ(tnU*UQ@{9@7d}i(=ayq- zY-HlRU1UqalrWcg7skttd2Sn*=u&BGKe;jaYvz3Mz4%WFI!A6!>Q`p{Q(C@0jx5bY zy?n98(;0s16#!Ci#(kpU$7#LE{o1}ly-z9oSAng8;T!%C(Di0cW<+g1}8~l<>-B_{Zm=sy} z9TN|Q}oe($GrQK_DVPs-Or-qk0iaP=Y@X&visJY!?$}T3)vDY_GO%v^e$o z<;4CFQFP4lsPQLQ+TtD zl?_*mfHo{T@0ELYuP6RugZ6M_z5in7MZI^C+B&7W1R00BH_E1frUM7X_0Tf{NoVE| ziq_JNr?Do&s(Nu3FseBq4+r^8YJ&2233-cMPM>AALpf%zj6rz1z)hdg!405f+d#?J z{!<9~g#e#AVL&5Z)I$O^B;NxY1uy0|Q-r_nvw68f5vmnc7G8UuOfQ!C@% z!ClkPtCu2xcU&3K!Xi87!#;shOpH%^O-6G}lwGkZk-;D+Ce(o^C<%twbYO(_Zpuwh zUN^BeO9ch1rxu*Zgze~yVRwF|8wg$=O<;jsg++fS#&hB4Y%k%_#Ew2A4j-OII!9;* z#0(ON_1PhfsS3RM$gPRf44SxDS9?oBo*K~zYuy`y&Pk@#1vu9PF9Bk2H)kBN7V?F| zq%Xgu;vO8BW%1q$Zp(0Ska%xOlXY<~s5SO_b^(C&(N=$Oel%1m*axS-6Vi>pj^5ex zqo@C6;PIw)S~@w%Fd0gSu&gomYLXc(lXhQ_@XY5}HNVTJ)87$xPv=4(M z-{Y1PxCvJSS;M#94a>58YQA^+oCY9Lnpy5O#OOQiTp6v)fdrWBJBN2~y|ss*kzXh= zodR>zn`=>39E9I92kZN6L_e>VPKEkcW~t>VWZl#a9Vw;e-H)l#*<_US2TdQ;M3-9! z7px9O+;y+HDB%yeHl->xD{VU<&X&UDe%xK zT`=vQK!9U)TK8I%wv1i0a6nLm2t?f&uT%+~$>|-aUXsQOcx5@T@?{UP&_>z~o=?l& zuMEBX3tSOZktA#fpz9(#=(NU=ZHm?&ifMGJs*X27Rz{sWXH~&&$U3hssE23!x0Nv` z53|&>AelC5K-T9R{$`KviYu~sFG^giaz8}fEpdpgAWCIJ|8dukU;@^kwzYg4KS1&@ zZI{+>t8*{eVvgVv=Pw8$J4|G2Lf1SCE<;s~d$p*PA&X?nhXb+w@1=W*xiW?oPy(uL z_)Bq%tr>awG?&cj#{_Il-IvHP(d5cy8*}%NF-U7_T`!|r?Cr-4%n40@g`bmnpf81w zf-;1RhB)z7rB_?HzF>@e>{2LKwX&xkqr}SwkG<%$NuPYLlgit6CofQ{f62pT<4kIQ z&z|NbvDHw=h;xt9$3GIeV~#C&3?AwiwC$2Ys~+JWxYPwgLB6JZ<%7Jz9GkQ^XO@oC zBg9U4s^6~ELJSA6t8$~jv*X%~JTXpUU?usc2f8E_MAMG>c#{* zRYgcT)o`+8oMbalMGyL+HecM7;^l|tQo}3$eDS0{RVJ-GP>>@yiYD6GC=N7Ll_d$R{<2A% z@uqTG<4RD=hsU?+lgZ03<_rjE({?B4bUZTbR7>Os4PP{OAY08jQ<-2E}k3C)@2)+2YQ=jD!hPrI3}BXU7P5@oJHsH+K_0 zV05jR>P}tY7k0qtN!)w9A=Wv~;a}_wL~HdYKzYEQ>Kop1kj453L89T(KrV|zMR$YS z$r8pL;7Eq8CQh!IuTYk7_GN$7v=jZ)P*vwK?Dz#%-Spm7pb_pNX4hZ?EJ_pn6svKrs9S7zH=y(HxtLQ!g{$Q(>cww z-sa(2xINiE_KKB1x;AXO-Z`R~@mJt(qJ**znHeV!mYC{}~y_Pfm~{7lA`ApcuqPsdRJBu@`jW(vT% zY_>cJFdU4_ClOPH-0>pcx3KN}gT8G9h2T$ZLV$$SkIgBh9P5biQvy=;B|GMnE_1Dt zDyB-ht77VU|3keW*2K>r(SYfvyYy-p?%cH&iBU?)x^l>&rt?{2foV2lqckE#od?5R zM}^rWw%#G*`h^L7qBxyzyfscyb7atQss5yI6RhX2aW__C$_Z0yo2T%sI!Nd`j~oOs zr87gy?%kKC<)m^PK}(!yMD*g8UG8IRpT>|ZlwzMJC2as?@anyn`2*hBF>HdJN8;$Ms-s|Ms3{K=+UH->}iAWOVqj{(!yGY#zcL#venezLs^ z{#bpJ#H}$ou;Xht<*}Uc<=Uw;H`>_P39|wA!08^_FOv-kvlf2BK?lH zKRr^m22R8a3xgf0+^Ew<=lq(oO>qZdE{u#7Tl&{1KH(buyz)rvIP;7Qb5#<6g~};6 zVc5X~bAb(>c#T$v3cPK zPUeXIRh3cQd@oTLas&YQZ-*XacHT%jS-rOT<-5l(WB2EljaygB zuRhy%DY2xdV>)r?trZQz&(snMy2Hgx*b%_zH!uAR&Jy~8O%tr{=OxOrMLrLGINIk{ zKrta?yP>r6J<(rjob)aZEK6QMLygq9*7*|_t@PQN*yJ5+bjLfDgi3`5rqoY7lRF7A52e>=!m)n=2k^OPo2jRRQ6<+l=2i!8cSCOv#U%N z`$ec3_%3D6Q-m9q>u`RIdDd5a*^n}r5EnHtmeKH4Ld7=u({5{0%sI^@w~G<)AdNOE z8P@rv4zVr6yxgpHOlvoJeoC^G3CIZG&KM^AFn|3M#5 zvx8}u>NNpq@dYTK&!LOM6fQIlptm$YNbij;^B7(EbllweWnKokT;L_g2I&+mEu zy>}ejeH{0;>%6Y>e7{~4XoaK@>O44AzG1%l)e_pk@{@=VqrXN$HdUJiA~OOw;ec-{ zhGTm!lbXWXx{}&b!0@~bN50(>z|9$o8sww2sVZiUn?*YbTT`zYw<%(^5*3i~9S^q+ z-_2ieY~e3fcF5|<5zkbYkj$4sokt>~8pQ_ze$(As^i~Q)Mz$LqkK%nBxL4Qz)iJ#e ze58*1leMLi^|-nm?r}<$R0L90LOdo3)A|!%!N~~_I|`qq>yPC4!@`$r#xrRp{hSuA zBOzTAwaagw9?^+4j=1aRtZ zU+_6{>*2K3e-yL%alSXNGJe8$Q>8WQf5j*Dp*3D!kuPPYo#m8?;;yBXm^@MpSIF_ zrBr`Sf7ML3ke@GNo5A9e{6QaI7 zgyTIfNaWit`chnT&UWODzscWr!dUDRY~gwzT68Y;Pq?Q}a9Ta&NwFqGbq{>>^~^Sc z{o&P}y$=hj@K3GOpJ(UN31{@5WvihsE7Dg6&B`4$1O>%nO@F;hg$5GS81&=6zVDVJ zX8y?IJGKLm4kLe3rNgib_wVp&7 zJ6Bzy8Mq8hd<-5NG^mHth9sRn*0%*xzbwasywHyhV5(jw<4huTf- z0Y9GI)D7XOdZa-nQ(a`wBvRoE19v5?ZzMwZjUe@?8rDvPF#mdBhqM^wIgjA@T($c) z67%gw<KXLyjMxiJ6%)sTt({g==2(c_I#p=T61?MXa z@?#X#(B#Vue2K9|6c6@AL z2HNgel`omf&9E}iL0yu`epEW7So}R~&o4T45^#!I)|ACnJtE{k3PDD0$~gohKU*f5 z^}jhyU!36)nVdRHNP>c~+<|4YD*1lfH26hYL0^}@zjg%kQ?vx8q8PFzJDzj|GCqJQ z_E9xzhebI?CYXRk!gY1o{jBVnNOU=i{f4!%iNcJl{;EjtV?8R>GD`%@?Pltv%;xJ7 zNQR~`0@qO#LxTSHPqmcLz6}#ey{881I{6SP5W6h(5MPDyV6)ntwUlA6AiQOIu;9ry|1_|gNtAyyXusSZ_ zR#8dv=1qCL7zpkOA|9iRbyD4%1=l4Nj;F6A>aNr=n}0M#A+(<7XBa!OAY(k2KNxa$ z28EZ{f(W|+p6tlw`uaOJTi+BPO0`-QLP2fISZ-IUBoS4X~oflTYSmMF8ZG*zrab4dnoj|&fE;wM?vfRU16fVd1h0{da1``NSGwMoAi zMp+qz9ANa7#?nxFSnvjnflLmLOjwj6hfKL22AJ_R`>lpUI`_ovVhBv?;}JxOW)$_u zxK9f9_3c|ZaXrXQ@~HcIPEb7d1NIXe~NOma_IHC%KH@`@Oa z8Isx&=gK-zuxI!{XfGW9MLQpEP$%6%B?YjBozP8%t%FncG%dXth?11-y-vQgyP5_c z`?h~)Ei=@x4x=s$?8(u(H5g} zF1FFNau!(IHpe#q{wkaYpl+DyElUkhsNtvL`MwFOFXclj{zpM%+B;uCe_KbaWP-5K zxVcoOihkX-5xy+@v1(XK+IUI`&W)amYkL8`0XD1D8T>^)B;mHyG!bt@Oq8soP=qcn z&9Lc;?rl_=Yv)A7x&e{b1o$MU{K){Vp> zyDzvK$)+hyZJon!G}qd81c|Q5PeL^6$?kO&G8(GgBeY~&nPijTPRD)xfhv>Zv``6} z9`QRu_R}{l4fb`kE85RO4AFM?RP5PIGJnxq(GlA5N$_o@Os=E|UMZTO!aLAy)PeqC zCDwp6yzZ3M|1;9tyspgZ?rseX5F#{y45|QrWJ1Lz#RyWPDNx2=N9eJLWQlE|U>ud) z6XvW`-E4#5i=T7TwQp^Eyv6QPFk~*Q$*%-vD*xaZyOq${ffm^_ZShmlgx0RcgfWWT zemJP8K>0NlwUN_m!a=P=@1WYy>2-ZKkQA{f7B(^SMN!zBEvaWGFE}5?#f5ysUizex z)lXK(gPju5rs5O`L!cc0`1@JJi=1Dtz5BusSLSfclEe6Qom_by?Pl?9tr85)v+ znwN%IwRt{P0$y0bKo~w{TG$izO~}-S-}UUcKx4s=FYGs~p3AkROcbf_!gXsJl=QJG z1@52nBDb+X9*(@vgE6k=1mQl(KtuZoIrjhau9A709PIx;VY~^~2LHbhZs-5PxRS05 z{B-(r7`Z48?Ic#|VfM*nr~u+Awv&smnD0qa3O^sas12m8Y}H~pOQeXgafhwJ__`#N zg}vclebAHTV4T}9CplaPJ$q`A%67Cs2-sI@uzgS`c~)-oSMT$I>!>NE^6Hv=J*)V2 zn@B@sCS2ivp2$9>OiLuf6pEB;O%%2uG7il&yc_qC56Y$9JCowvp{mnJ#C|hv~^YOOVy0v&q3N=4|1c zpjIpRKJkSrP)}*L<_B`ep2qmJH)*U+_A!9qmhGqgbYs*Hlp%OC!yYBtPL)@@1Q!Z- z56Cy|qWo2te^WxZP{&$&8La*Pq zjeI@S2EpgfVdj#_-6Sx@E&}yly9iSQ?X1a0Y)5Jr(fmM5j>L3GY_BTT09Eet_dZh4 zXUS}KIek;^+4fw+$rWpM5&*JOF1O0iALr08eKh0!Cd|h)2c+*waYK!rB+DrA*)%I@ zN1J~yln!Q-B>O4~G4RO;H`UGfT&<7j{$q{cr!W;goA}o^$aM&l`t8lDiJ$^c(PLR= z^#w{b)1o%hNClW{5?R-WxXbW}9`CR%95~7nJW&;ha}@O`e&x1h5L`k9AtY^RVeM&2 z4ATn}t<(5dGJQlm{cp_vpr@(U&`VfL>%ZQ&kr3sjMlZ!$Hahc_%%{N=luW)_8P|gZ zA>i)@wIOb1J=vyj!t-J9Ohr_gO1c%mo(}OAgidPJdP)?F10e!OIvWKt3-bMqKD#iZ z-lft4+)O3jTicJQV4wH9?6AK$6n~#ts9msBOZ*neL^+}kjw{K=btcq3ljiL<6_Ee{ z+ipthx_$Rxl}~mw_$~F1iLeT77$!V@+@oM#YU88mYvc850WJCTj}k_8FUIEt;`@2& z2ZfrDaz#sig8bWIzN^_xx6XIoTziaDt%q9?JCi+lBYW^}RQVX$1zh<){KJw!bXf@f z>Q2NXMr>)-jZrECS%S;4XD$mi&09%C6#@yooq${I$4q2n_&Bt7>?w+U_>}QnO*%f6 zhD)^DyKzI(t)v`j;C|GrCJmRULY0>x>D2f+{~LWNyNQfeuhrA!&%FiDu_s{5Wbn~k_eotwOYHbRH zfcD@NQx2q|b);uFg4}XGvc<@IIbZMbic->t6p9$w%G7W$-D=@^n2Ud_e$5PP8KH5# zC4B7Z>0~6cuV#i3Q1f}ZduElbYaq9Rq1~5a@`$3PH`hs!1*sk`sRf<=F4lH6;f3n{ z;O^%)_xKpf5ds(>sq9(XO*+%rFDx*%pAqo!(;@dNqE5Iv{4eXvHWHLw%>0ytEO) zI~(82>S^>{L?IC!UhfJ>>Vfg6Sh+`xwCqVKGI~^mlK@y&F$hRj_d2++K4IM1=ysi? zsAAnl!SGld{0U`QB-PsUQ^we&J~Ht^iNE|uW{lkMwfnP8=C*#fEk@d!A+k{Ag)AjW zWVEQP*O!Ko^~dC?7^3|=Z2-7KI$UT(>fiP43H#N`%;tp#DoTd+e%*2{S2P8SJ;dbb zJ=OqS67c4!i--LW)<3D8{^Lo_wP_beCiGQo@`EMHh&L+-fS>bj~jU#`aJlzma zGTnP3rkz9pjo;h3;n~KiH9Lns2pzCgH@N3s983G>mdsg}gpL*goq2l>9+mGMV?Qy` z7%KbOfj~Ee3Uuo2#kSTd!%FQbM76Bfa6h=A?9;zN>hn+^#IzVZi8eFnz#pllbtWP|<a2sU`NaPfW#gji&0N~>C~v;I$#|D#Y?J}RC>>}%0vB~f?V^?LhI z9e5TPo`^qDVZW}7rQ*;!gt9%fq1Hb>kYtB+e5wnE7dfkE(r2_>rE2X8gH`N?U(*@9 zL1{8W7o?a#1A~%-^obu-*gtecOTzpX64h};EZ%KI@h7)n+0()f!vmih(puzjgIa!}I5Ov9vhVuP!{2J_dV*^c6r#UoM+HW4DDQw0_9G-nH)%Vdrf5zPSCZFI>vY znQot*HT>%cg_#blt_Ys#s4j9cn~_TNA~4 z=cb`{1lifGGViqR>jkEk=wxU;+~a3X^a+=4TJ~M)fGMCoKxY@GD>~sc-HX5;PGFuw-oNMClXL`F7wK7hL#$ZF;Y z%L+_~A{tNyn6YTYlg|zw6UH4)YL%(@8CbsR^k)G*9vN*g_FtPZg$P?|BPYS~LBnGb9WxA_*^IuCZRh?1+0G#B&2?Xi~LUoBFHmcG&th6?-== z@pUtuFM?_mHqPprYjiDpQ6@!#U{lz6mtD4O&JXI&$6Jb~il|o6{oABN?5D-wp4Ka^ zmx^(Ex;0cF+(tWn+o)XpLCWmPcG9Edf62ko>OlObMVOWvA23V zEvNrntgRW5XL!P#av%4m%evs2^}t=!(l?IR?R#q`!PDL9f#~f67pA3`ZI?DHx5ZmH z%2#&@uekAIPCy;Fj5&n0Wa-1#X@wj1QFUS^C2lwmpG6A4VzYa!67Z_&)cLFic1^!! z;Hi&;O%f@@3>{ZJnzz(ZFf}KF|IUzje`ffqLdw0i(#Y$}KX2PGFJYy};Oo-y96Y0x zJ{jP{En(ITzz*=m_NMzgXtG1d5~P8r4hWzo^D5||iHI_Sa5nDj+6LoaGdPIgO-0Sd zwP(K}#$J~&}3 zajHR)cK9c}@c@LR%Hj(EZg@sQ54{}xPoCYT4Na76n$Ss=VUNk@pXU$@gBA#QS9yqco7KPd!zoP( zW7RBw{yZ&0rxsz9Da0e%Cgkw{>3sedCuk&$!0E^+R)#jwk^;a!`AYT@G&}#1FjKA& zBiIx-o2np*kNYQNPw@tB_fUC7@MQBZ@cIexJlJPUQFHPsUHtvH%ydz%2y zvc&0(%|9|i*rn07j`_DC6(h4Me^#~(jea79ZBre)x zF^?8;m@@~2$uLcSI=?^IqI#?}Bk6@x9i;A!n>uH}#`uKVDbISUzjvT7G|bXilS0AK zA}?k?wbE!;x;wx-#k7eu>&2!;2hw>P2Z3TPdl-%ahOYpZ$l50xLE+lfWv}kr?n%j? zPCgJ(H@K59rEq54!!0h%;Z*5yYyTIeV!_%(x#3FZI1xjL4b)uC~GE_^#`)u$k_clF%m8drFNxL=c6* zOW)bE@=jVnq>5(Rhr-A6n2$;xZRpnXcU2+ow)msAvRS0zocSbz8kWK0q}d0#CVP+u zmstn+Fd0K!75x?ht-aMsFD~=xb88Kj>N;PIuZaN}3`<$jSi9k`Xpn%*c!A^l?KD=# zY}3a(TE?yt+X|%;yqS9$f#L5^RyNPHcrim6A90u110BGW&o>{XlG@iQmd){ z|0w)E60Z!PW4gK4KZt=|?VX1^R)Z>zB9&%H)`(0;Q62eoDY|qZWz-IrE@dA@PI5GY zlJJyRRK!SeW!OpCMF3LPxqkG@y-RUqS9~nId*DgMhD}EJ@^%>9v|o#Qy(Ch+$7p03 z{h*n1o0;y>ppQ+fjqFFVjwUwMV~kLumWP+f!QK}M zZW@FRT;V1}Jz4DVopkyn1I9-Sf;g0}wRsYjfhQ^uC!e%$we00xW`CP7@g@?k6jkH| z^uO%3@<85!+m|2q%RY^aQqcXZ+l;5_0PPZ|B0xQ_k9seN1nWCQ4=wW{j@Q#!8Si;g zie;yFRRtldtJZ5UYEc~0DaE}RjKlijnIr!cuWjxOZJqvL3AoaeolU@Ydka{RMkDf~ zoGQlyY%o5(8_dv7Bb{@>dwP=0pQ@j}G7A2kdTuWjOO1~&1r<&=pb8tYDG4C$zfgD& zyVR`%-?qsQ<34SK7ZHXpx0#&Zdf3R^mO>-I=0?f>M;ok&P4Biw#%AvJQz5W{@Uo)l zE^L)819)A>+SiBC6|)M(HxOPOePn?#^BE#xg>q z>1Z;%_e9w#I-4*^P%z1)QQZY$;?QgiF+NF^Tp$i_d_x^#5Ex9yS6So2a9ai0qx|6c z2Pl$FilEwFg{_G|Cef|_dF1tOL1M1lU>k4~CT2l|JZ!c7tXJn_b_`A~hP7FGU%T?1 z!73Qqk3#8R26=PWb>>6Z9>kY0iD?ueqq$~mAdynIq#g|dz**nlDx6@hrzC=685Xss z*1mp&@N(#sb)qGz392@Ab{OV)0@1Q-J)&?sh#8Z5rLDCl9hLP(%86!3RrbqFhbkz? zHMYlXSH_WUxbj6%muFtae-xdUi6irQtr`6TAXp;YI-13W%4(*7`-mcKM{tuptNRMT zDCt@ohPNq55v30x-G=o}}Zc>Z+& z+Xbc!>qYIv-8A0)6R7D_ZBRQOh5dY=qj3MSFZ-hJ?P!+UyskKs5ci^?IPyHl!j)N% zN4U?|hYc&{H?!EatNI)+UzzZ`YAJ-;akA0kVhN~&?J{HvDCx#?b$nwKUdp?kvR>V2 z-b1^x*1TZQt^VoyE1Bq{Nr2e=?to$m{!%1j*?~x@oUjClk)8;u>3pBZkIT$AjVD@J zzv328mYb^4Ygf<`>jPAL7rDb_zhKzmOA1HHdf@$jbqzMlhTny^Gsu4Te0t_eKyk3F zEBy0o(s5wb&cqxxJ7()w!J@@EpBZJMK%5N`DF8ZI=xZI?o(Ek#@m%JNE=BVSvQa9F zbMbsCm3>3O8>tbng_N(^`ooGH*DGVTf+Ci|mQR&OjFTj!`6Hub%AX_n*^1Z(7IBpm zEMcu3?0sq>Hbt0{#13#;qye;%I(}|B`72W9mbW;9Kf~6PAQqQyjFI&Lw$}npr4TgB zi4G!q)7JT)4S#S-u7$eUvo6Q983@}seS>^yV;-K~*{4>vnES2k)6N#5EhDZ%yuK{dG-#PR=xuq|1Sk$=s%ytog6J4p+Zx zIE_}VGob&l|CA=Sq(&j&%Ux{Qd<*b7*J#C0g+Q{ZZ{1JQ(9b5jMddn2&+(8#9=CN_$vr)fIXD?I=I8S4D zoH7lq9p0uDe*S5f7jXSaWGSf}uD{zSEHCK;piIp+VBDZm$=XkOarb(pwBQzJv#_!? zzNRhaxdmoO@>OOMtK8y?{&QL#V`hW;P$QMx@Y(5u&5$G}LHHDI2nxtoX)ff4O4$E^zCT~^A20vecMuOfD<}7>$Evej z?v>dH8sKM>?MOE|A8OO$sV*s}n>N&6C7L2~`@8Q0R#i*iT*DfD-o9B_c<~X~F4m=qt zbRpTQHrdRTuGJB3B|Hyo>ex|HZ|M;I*9eM=!lVb(AeO@CdR|YZ@$)w5BA#EMB&Z`s zfOAxY)%R8c;bg{pWHkIKVNwU#=3Xxq;%fwZ7Wn5THi7t=QLo!#Ukr>QS* zCj3p(AKFTqzSTd)iHI5*()he!eC{WXq6F$2>~s{Of@@odz9HkpmB>qcfOT)(pa>at zo|#*#8KLloRob(z!}39G|1WwoOh^X%8(hY_F;mj})z>0~gLlo2*7!sG{Lv&Ar4o>K z=QcNx*^_ingQnczx-}Kj&j+Bl!dnWgrGwj71Q{qG4vXMK1IofExqIc;N>e0~#2G%Z zJ(`n{2x84@5;hj@n--IQEAIGN_dg2Y7R!|BBU4JuR3ODhMJUbuq@=gP2_}!^mDnK_ z)H%@ptk9E%7x%_S_@vAGuPFw>-f%9{-pRNl*v-`P*Hq%{Fyp%qy(IMR4r|0=#0mV# z+2{kjUyX79G1t7aS%?x!%n<*zr^)9S>CwE_;Ee#CmYlq;xWq2+#`$JPWz)ZR7cjn4 z54IFv&aqa10I(fp>y%`o@2A)+Vw1!U0bM`YxY3u}UM&jSTWoJBiUk;ZHS0TCPQrY{ zUn`!nm&_qKBkgzdQRC-1<4)E?L=}o0aBj1h3BAiC;|p+*^+~JPvmLc2zDf_r15bvw z@(P>1a1G=4QTa1)*cPtv6Zw%h#>DClP;mMMu7ZfQDH-~8SPPP`(VGz>hmajn2A?*w z!y>u}@pkv2U|R4*CZl*qp`*w2Jl5-CeZtutzeH@KFnXqJn8?~p&ZmM;ksV)JazQ-E zN=pIb&z~bj9r|lewglk3vs5-yD=*`EDOIcfqpZ~)GHqvoC$nR$6 zxY!6!^$V=wS;7OuzK0R{{z|V8e|9WjyDeJR4V6_2+&Hqe6EmW)<6+J+f4zp{x>}BD z+ZE-kwW}@GRiuA$U6xk21VO3vrJEts&ldND@g zaH?2F?JCZn;qi1F#{K&S%>$KwkMV&>Z9lb~i2L$S_dv2*>bFRGD!uE^{O9RWIJ7irivHPMwhgwLk#xl2;}FQP=_KB_sTdh;M(%NR%Qa zZK{_3!7Cp)wDTo#Xf_c{Iw9btkiAZtSiK5*%#n@(snc~M4CdO-bc+g4)FH(OYE17I zjtF`&z`UQiTbhBj!gORNO$Wpb^n&si{Acw;`x4nH9UG-fdZ~cEoub-Bl*N0|#F$*2 z-tkI|^PF3TgQ3c|%;mFV?e>o<3hWnf5~3557co8TGc>1x*k&p)S>)wKd#lKE z;2DXzCv!Z7M6q4Ffaq#qeUma&aFqQi!bFaa(d;N_>l_|9DMtwM0B2iUICjZX_8-W% z+xnAKQh^_TXHC9~L@|EO-VHxnFM>P!On-5e7yetXB)1Lm0-p)zRg(0byi7It)7-Sh z^l~O-9Ko#Mz^R3z14^4VVXkYEra<>Cn0TG144ZjfR4S2P_*ow;`>kV%m44RyIhi`@ z?9CqxpEtvNaar}gnFY)S2WUym74vHpJz7YFz!chuGDA`*P?T&Hq1CDj{A~_mi7$hf zQu%v=vkmjSvLi5dDwXe8$Ra4<9nOhsST*fZVx5RCm8_?EGugOGmgJa}Fkp)i#wkGv zQxhOpn^;VdFdG~ydUO*p+H*iNj|sAj^`yOO@6Vl}%>ESDA{N-1eGI>=*uE~7a#}sI z#QkDwfKB`H^0B$s@m;E!(fwinn~^&KVI>@H!0j59F!0Zx6MP9BDng}@hJyLb}4TW^NR1qh)=dLiJlksUMWy{EH`h!M) zq{41|s!%v-CDdJ&Ze2cw`XEYR0qd2#Ts-1t3M+G5pp>7(898yyCqpOB4f%iPhiwzc zrB}gHG;iy9PdJDvNj|ZlpW6h<*i)tDSFI89i4arr07>PPWeNCjAWtvig6XTl|J10SS?G_S-+4k4g_iVg zHoDSsHjn1L<=~12o`3QJ%ar2BpCk>>T5C2cNSumkNe=yDdJnUY$apiJP(<)-&MJWP z!vM<$jIX>uPn0{X?TJ=pFu%8cMc@Ym|Nd(M2D>-=uDbd$1%ZE1*5WdeaOV%P_K17JBC}rm^zk3tne-cIeefSE21Z z`8(U1(iFdCRjmdXPFz)JQ-OWd!SH@>AiR&rLqgJ?c*|{=>Q7btV34_?LlN34L44Bb z4ZC1e6m@=S!`tMcm&Da)6!1m2hW{ zMArJZ{}aWLJ5gj$76TS(oy~}?t`8t!4a_Mj|2ZhzzP*JxUtFcH_8`jrM*$aRd*yC7 zq)3?_WM8tFGcw*#N_wB!ZT9Wf0ReCnRqB{LG63qRT2Oe2$C)9FfKD`J0QPb8PH~-Sc-5Q5G(upYk zBpfIEut_YsRJl@5D?36VLTFw)n9<<)&hE)l#Kuy<9`CfCNy$RIi=RJNhb#AuAJlwE z(L!hkhhYoh6_Z&ip&69#FM6-)rrC%1#7(~xZ5tG3=Lgni%Z;8}X|AUsKi!hiO>cdy z3VSV$T}pn?BVx5}JHY`i&%o?&l1Gv-MzzA~R=?Pf#)ts!u)Rjx)Bo1*I`3O=XEcw# z%92xosj`slotti<;ZwitGPR318Mi+{WbP@zj%Z8EFc|6 z1>x+`(VQuLw4h%zWHP^VG=1n*SJwb=TZ-rpWNi%#eMtiw>41Dc`*yNy%2#dhsGfOpn!S@ABb)3gcCw?cP%+PHpf4s0mel!KBMA3l0 zBm-2=SGMMytrfE6?)5d4nR=ohY1~%;yn3lY8pDyjAZeG?9rEcrp(wI-r6x7S<^AY?ZM8APfA`hKYt3z@VS zRnSAy`pyv!fY4r76Vfd#>$jF4Og;ermR)D*R{0ZUp(Ku#ONIRol4+Y;<(#-zptfh9 z+%v*lwj0N@<$Ls!I34s9&m|0IWXyUa23R`o7gxV!GHvcBOsp|lV# zE6kg*0VjR6H@yyL&iTZ?5RIoDg@xS9E>B(kM))K)t)~BhY0mHd)-sP-IxAcy6@YpV8ucN5U@C7>#8V?GsG}_O92z8j!R!MnH zH?}%xv7;Y3rgPK>ka3z#8*K31GrLLtn^~;$-%P2y6#>*HyeVw9JcM1#;HQGWf70v2 zmbg?GQGU)NTBLMb0xIlee*xs~8*XQJfj>?6l;rE`Pr~dots6vj%uhCL+$Y$jccCBx zxF0+(@}n*bq+MvMrp0$VB!~k3O;}nELq(K{;GS{rdp@Gz|8^_6O7IX5wQA!II_2B1 zc7DmKRvC5V88(6+Be{2#87M=h^*TE`1xln?SYON3QI*ZM5~I#(+*&mKjrY0hILgH( zJS%D(Ur;LwzGjMbpqTyVb(K#05*wjFZ2mB>q<9JD$eVfA5nIJ}FPhBY;4L#S`PU%+ zAqQ`D3uFG*!A3GT6=r6Q86LhqQg{0bm#32l@P07}(^GZjGw?5Pl)xHD3C}gyQ01c} z!_&dJ_HR>cYqb3O$Rzs0sI;6B@Hm^h1*oQQX7bQ3e;Vnyc0&c+p_XHp;As3($oRSE zmxn2@#rvWFnm5?R6Mw3ek_q|q`B1mnM6E|k;u~noK%-M%PW$gZY*h)Fi65SHkKz}E zmV77meyPsKKZj9QE*v+7dou~P%+A5yu0=V$eb`ED8hE}x=?47#AZ5I}|6jeN%uP(3 z;}90MnyaAq34nC2XQY6XM7~Mq!g86n9;N{zM*d~m5uAXGU;p?y40^f3_sAKInHrK` zkIu-A9tDh|wPy2JyEozCqxD3~GyZ#0fyw_)*?OXBrT@~C&Inm#8_vh{!7l&1fA>BxPvGD)&6eIEoy zWR&`uQoiA-`??d`V`Dt_GIRU$=B|BlJ| z+OE|%l=)NpC-&5zB4W8tzCZWZavW-f5DYRdt3pC<3EselBBd%Xs#gygF~YGgoNR17 z4VrfqX7&>0`&dW3`DH4TA#~$NE2?Q`Xpw=%NbiVhQe7Q_K(YPaH8$(*Cu@mEM~pD2 z$IkK{CEbz1&~L(7jz@ZGE2{>K?7f!Isj7^8rUIfLswm?Sb~xOT7^z1yC)8l~VkQE5 zQ{0ETJ4zfiw2`{&7C1DXZRPm$kU3@TvWV#pN7Wot?zF&|^`0B1?Lu{BUnK=1yvh+nN9&J^Ue%NkaB zg$gl|`)fQ_vVJ`(fZi2cG_&wKQPSaFo^>LO%rhTr(rr+ES2E>-;V!;&Uo9oiop>vq z;fV@KsIAkMj4tbiNSim>m*~jWswg6QW(daL9J@SPk#;{yi85!9ke+K+ie&InYurSu zgjM3XhgFbky#W2haOJV9w#*)1@Eiiou_Md;vEycBZPHS>>0{N(zb5WYDN$P%VNgIj zGd+On`SpF?pa}^Iz09Lc7~RVn_Cssm_8zBzw+Y4!kKiL^c7(^jS*iD*;YOVdQh1+> z!GZeV#HiT|FP66|SljItE8&c?T~e?kGl9ZYhwX%jemHyWm#TXODaR&<6h6D4+k!VX z{>2%$Xg=ymCh1*wMD5wXsYY#iRdF!kneLCf{w@;!GIK8Fq2kTD7rA+Q&3xcp#@~1e z;%?+ca~TB7B>u7pQqJ|^*yWtcx&d6_fMNgc%cqE1OeeVhE(PI~v~UDTuG;~BQq{H@ z0!O7OdZ?Fj$h&;69`j!{05kY}E5%k7uLSpP2bC)4hbNC?rlT)3i#)E+&gHn?`)ASY znm%NM<_Z<-_}6@&r(n{=2Er`Fjf%Xjn41hbMVVF-cuJ;1n08?1bkk&yr~-b=o1B z=;lx@mtqLqj`@OWz8R5FY03co8{zWa6!-0c8*at6v5v$$~Y^GM0FzpSA0g&tV`)2 zxncV1hGgY+Th3NO1sYGxuHgn{``1=i)O^nJl(EEr_;F7u;!GPq+RUT)6Yn+3nSFms zvI%pHC^=IrEW}=`3`M5MSK`O^zca3OzFV^;csm=llLLMyEMC_n@vLDlF*?&vmc(vp z4Cm6rLS_PXPZ4nLcxJ!n8O5mJ`DiNqo55SyG@NQOuw%r&?MjF0*`i`FyOcsRwMGb$ z08JC~$!tWv7d0!WnsWFu3yht5JrLEy?IV92K4#KOx%8>rUI5X| zU2UK~-V;zNm5o+3&^s-;tZRLE`}NLcZ*QosfD})wsGjrq23nx~Y&ZaSsysdjZStE4 z#a*D|QnPACDw4W}uIU2*l>5^a`-afzd9h&P9T+2klG5}X&U5dOKA~JiOqXy$H3UC+ zxhpl0v5yeA^(x?~okc0oXhz~{2)^~CQJ z(5=7tKZJUfM;Fm$p)+}aD@Y#z)Yi;&fZ}m#SgVk^`Yq-ZP&DBwrX-o0;p1?W*SJ%f zpwG1q-@QIU?U)gIm=(cD)W4P)%%SwY`v*Js-CoKAWe56^4sc0n??5}blFuK9k9pD5iscz=GliqwT?i<3bZi+s-xp0~{Xdx_xvVfImlgj5Dv}QXt+Pjp z0L`u+O^H(-<+H5nHJy$YknDq~Q=WUdmybC2l>%~F;wpUI;`uXNVN^)$nbrWq3|0Fz z{s8lJ#U{(UZMbJwvrcR4DwM+%7akn9Ph7E0=9A&}dx4%!PT|`WV%aHv>`(BLB`nx$ z(XbXv-^gXfY{PAh_#`{L0&2EFAmbVkIyY(RxS2@h^g})+$Aslv@a&)Dd(_KJt=78E zUW)$Z6Ah4RT7aTgIhA3Ly1To9Y;%ede4)ecD{+1{Fucx%#)B?e|0~x{r}x z6@b?Vi`{dH+{9}V7m1Y4_EDC%XoTVTpt*=>V53AC)CsC zHr|nnNLwj74kizXSf#13K5?WvN1$qHM@HVA`BMC@RGXHjNibh;=snyb@1dU^v&H!H zt*UJ5lpIqLRm#dF6L&aX4~O_Kef*E&C#`U|*!otbz|yGgvrr-H2YLo04zH)IIT>Fn zE$wg3_9j&tC%OY-f)Ap;hQ7C|D0zBJBPpvu4qyi;iajj}1_Qv_w^af@_NGoN@YFvB zfmakB<|*e#b=xdg>T8J*4!_J;_qlv|M`rE+_0#nn0C(4|M+we;OA=oQK{0zbXVdYu z(TyawrD(Up`yjZGzx&$5IjEy9o#IXhSX|Vx#1H)9&o5=go!nMNeXK#9F0^e+;#tmMS3wCd1GNA@1N8n5zv0|H;GWk#kJjW z_DjH4A_ep*>3S`djpPUnKnWC}6!y*Utn*}L&Lt1bzxw#Y$q{9)x>Ypt`Qgbw4TqZq zdTzCUH3Y?0#v6L3c2nJTCjfR|8wk^qQb%05Ws1c1m(w|CP#*rfU`x;op~n^&V;;G} zt1?k?;s#CE?5HzsD@#v{ctg+{{boJt7u$IIMLc`|Hu;cM#)qbu?T!NEhFTFR=nWa_ zpr6j5KCXbh%?xZ@A)<}8h)!n)vcN&ah*{YndqM_ZR&)^Bsg26e%e5{?s$j`oOC^Uh|XjQ|qUv>JuG#|4}S}!X6C@FBJKB zy*Z;p0B^T^BS{e+r0nokJJ^v>-{|k=Ap*HO@{e~p2FCX_^kP&i+r>%0@$ve1d{*Ol zM@pXlPUo%zQ(MS_i^ePXr>$~db!+H2wjAjM#@e1kZT>b8<8UH=x&o63FNL_0kiCgb zLKoR$G%np|89enL1=dm1|9S;UY&$WUr+eq?0d3vC0D#`7I%UFv&{40sE&tE_7!~z> z+l#8D>vBZ?K5+8jsX1lws#w+r*7}vwsaqbVX=K`4J=JcO&EZD#!LAs&sl&I;Q^fdO zjHb(W{PZ^HD??i+njG?r!vK`IG6MP8lBfcfQ<}8E1?KG~V1jqn!s7}9=6cPKscmU@ zg~xhYev}nBQXdBql@~&8G0<1rDYI7ncrv&L<{fcxYR^NwPGG;-(L!Q{P9P|e#i=3!BN__t0GszB#30NGYI=O zyvjf~`$Nn@t-$IQF8ODsTFxmtenQ1e;W6_&-<5@*)AD{yKIUDO#y?KrYKdKaytMi> zgwni_r;BzGraKI4(wm9KIB3Y>{AVrTVL$V;)I-St@$T#RxRM*>3GSR){z;ozfdR1` z;|RBB@^Y4kZN)ym@3BoQvnQ}7=T3i{ve{clh9_#S=^(rjPS{E33HP5=_bxvurR4?; zCytu9UGnCB7yZD16a3e;$gY88_3_u{%zM`y4a4B?1TI$Kn)bS%1H-b_K>t{Dr}q_n zSfkaR#g~%CtL+PMsHK*cEq_!4e!-(V@5ZA+^zX`{?s>=G_~Y*XhobZFX7h3TaE!)^ zU3>0xb6f=v(>rnuZcQdNl;~yt6NEWvvL3nNk_j z>`HfTpJ}~%58M+e3GMyq$h&pQ0Oo8NRzKwYZ*1dGWx6&2r92xsK+%To77hT-<<=w7 zOTKN2n|)k6d_-4;OWcl+69U(1dcWmc;(FrbK}+{~w8k~J6sxZp&Ykv2oc{y3dkPTe zQ^nB-ekDpvid%jIV`AqdIk1>_%zsg8t;X5xowd`r+jMrMo2d{pz!)b=w3pR+Bpt-= za1{7ZUP&rft9$h!9VK_r2&LC58!dYJwWvrM<+$r+zvw8Aq)HHeiDFXInV01y&K0yk zW6UnJgCnor=H%-o@?DF_pm5To1pkf!*^NPdW(Vr9W$Y~O$sCsYLKx*Re@uf&Rc2#C z{F!G0b8=YyP8GoP7GK}Gwpoo-n!il@m3p7>3Ws!N(yB6AiS*0t7AIy?9)aa&dB+V1 zpwfIR&;|(fL0asHK=#+t_|4$x&JyUK*0cXVIFhZO7tTPG|{isnct0R;TkPm`hf)Y#~QIiKgBs~C;rnIhfTdp ze{PI0Tg>tmX%Z|yV+$JJN)R9I+&D0%M63y_Yo(4^EqqT|+dKFx%|h=#mC7Qc}LW;Tquf>U32q^@rK<2%$QFDqLO(-An*GG9zhR!&0XRT zvNb1cIeVmsqfAr@p1R#1blku*Q0>8ICo8`hCikvhN4oTazrH_kS}Jt2aaFIHe8Col z+w0sJzLWw8F#Jy4?z7uUpMhQG5#uwxP*K`lxFga>bZP>i%9{TwOHTS&^=rDBp`z~= zb5VV#t33q2ZYPKD`eMA{w7;g6cXH$*$jzVr87(uAi!iTMoumB2P1U;?TngEk)4aOa zOL#ZX5jwYTVf58oX&rzSzOD9B(intdDw@G(RhL_xCDqR9tu zj5eLiE9+iL5@T-F=mt?o%eyrGYv0nG*rn5u;w;neiuHvh(Z;D#|9!|<$O2^ympzG+ z)sJpz&U5*g`AhiItR1l;1^?t-3q=&0yrFC=#W>}tc+7hS!+6GF+)Le9Im2t8N!g0{ z1o9ly(9K1CJ#c^elojG<3YK@9GkU0*BMP1hjdVqWM6yV)#9`hAEf$eoD!iHM;kdX` zSJ;+VrpYG%zWHh@jY~7pE0-6E1~2Tmy(`G2>DcC?j^X$pnq1eUwa4rLGp9b3NH zz@A;dE!L7CaEC86bhUgF$=LTOT&9YD;QnOEL-d3>m#Xw>8GFnn2t7GB}+Vu?f|ja>AxDzOVuJuZ}}~X8=5;$DSi5{zLmy7 zs(p)xkH~k^Aj{qx+O6_j5P=I$(n#&EtM4i@=@{LJ{BVq1qS_VNID&x_e>!!zeSYaEfWegC-prhcS3l3!_=JlF7s?6?{L=|X>TcRa(BKVcbQ){Hi+=h zHwu{4DEIm&=dD=)R|pNmOgP9W-)QI)HqDAJ2|6S%iMCQoZ}k|b6d^gGPQIt%lSRpI zihF|pbJ{`=Dk9hFTi$^fk40yu{n-tqffzVN4+{(u!I~~ef#L% zN6*QPoXXz$$B8n`z&lQwAh$2hYUxXsJ}z@n&5)WbggL0)Rk zluO}~%3V95)~T6JXNqNJq^{7u*x@FdP8(BVG5H&kwqXDlaNajlwULt_Bgu6hv zx46K=pZ3pK_H=_E4~ZO0x-LHly_6ahlnx@CF!(an{do*K@LR9)hDkdvGNx~CH}Y8W zHBPpr!tn+6MR^uy>|1BfWNQCb!bQbR0rIG;R5V_(a^X>H*SFN`c%dNoi_Z_NBag1& zH8t$GX;13@dXd*2D=7cQ%R5vYPnKx-DwS^H+02Zt`RZnu`wx~^jZZtB1~$nG9LEjE zHEH^{3|-<^G*f+2i}yBW`R0<`YRbERQC{)o)AG3aJ?L`%`t?e@QjoMX z^g-d7%Jr)Gt&ocFeK<%HIG)+nk{w`p@+g4=cw+?_F@*6Vp}i!12ZSX_HVkCUv&idR#dy;z-_t^DGEPKsA0)8!ihPV5e)^L~_N9$YbhS|NLC|)&7V&J@<4`woFKV4vcrcW2~Jt8q{ z9Vp8&i}5)GXC&WfU>u>U_(pCl6}S56QZgn!`nJD`;Rz^YvxFyR8he`V5Pd@8$GEYPY)akurk%IBa=ZxZC7#X zXK(yLvUN5D$j`7q1n+ry#<$M#O=mj#7vdfTGs zmG7rdL9{uRrh=oEUOrvkVc@Oe8{y-NTu((1b^|@Ydp&O!;WfhArN<=8)R$be820!JX`K|rYgrPWi0M&2{XbURqy zhn_fe-Ye!AF*F8?m1UQ`U zi8oFgLO1hyWWkbmPy)yJ6ShQOF3xH{6)dw6)FIZsYtNotnX2Vw^T12~qH-{<7~ePT zaocb%cfk?bo>`2a712tI@tnMg)z527`kdik3!DzqE>t@OU$3viH7Kb_-QOkFN5RtZ zh#TFTOO*1w=xWI>Tfbu@@2`Ay1?iVi8YA(LCeIw}d$fFXiX&>IKgOwP=mKE8stI*4 z?O*do9sD9f8;B^`ieH>+7`@0$ds0z=GEU(A1ey=Pbn60s3=vM?K}|Knl0Tti65EEf z-3xoj1r2X1j#ufcM|Iwez(?z07eA>!O+VAVZ`P`Ie!}D{I=iKGUijDVU89{Ub;YD~ zq>|ryBLtNpVs{N2A9fr?Z9vDH@l>l419%j+cU*RJ7T;B$g>(T zv6_~MOSTzgtGp|-ss~g_(!2F!E9Nk3_T94s zbS3|caFEbr1*GUd=*Hy3e5MQ$C$m*qi=W(Zms6UF@f9x*Gq;DomIr3zG*hE@qOPZ(X=tkdkg9v&TR)pW2bcRDV7bQQ zQRd3A>7Z#~Q`r8_!ApJTk)kF1hcKeh@SzueWY@3no zm&=)}tQ+(hRl+xvH}U8hSIvUvy>{yE!PW!Efux(h&8^*h#EM42hgPyVTCsYlED6ij zx=FC4hRH*94PUL4_^QByFDZAGm>Y;1GX?S~HK~InrdM#qXcrrn24ak@1TzXXN7MG{ zmE_zWG+Wc;nH3^-SKgjzTQJ4Vje7j@e}HtV)UA)?!a#joyoY{K7HRmopIA^ANnTOa z5ikx{hV_7ECsNOE*cT1m=;}=Miu&TVT|HJoUJ0{WAsmYNTFD<=3K%<-DxkkldHzyNA$zIL=$o?vs zTp(UKP7RuUk)ixfxM?=CKsg6tg?Jr%j?c?{B%bQoLJmGjjNoSV7eaHqpb~kNUlu?w z657C2cM%f815Mqpa z1kTN!aNB=lZjUX%zq5#?z7s6^$kD|`u?^4gI_cSInW+C(%tg{V^FHZ;pko{_d8v$= z&{FX?@U5l&GpRDe;Eo+ogEa!m#EL9rhJY=GsdbW+D1NpgIC)t{mrW4k7wrs>&{;0IwRMb zDKn)Mp}6|w`1+Ychn^4Z?r9t2gx!JaZDj@wr?V%6#4(s&u^O7adcHa5!a2E{abCtN zt_U;WSQ|RFPnt!jPx|GJiQ4-SZF7l2<3$y1Z&R3(wZ?nsY&V(1X=41rQL>(L zAF+9}!M#TI&jy(3wX4Dt`M8{Y+6LfCb1y2hT)tk2vHt_9ANe@T2h(*d$P&SaPj<7r9^^)3K_r zk!DgUKN86Py-{=g-03+0TaV9_hFiQ(Hy{h;@<>e6g{3)Io%u8^2>)m2pVWC^_)M-T zdQNw8MFKa-*QnSxRDydgtzd=RyFkiONjngOnJ3wY3~B%rwjHRx@4~ z6o9Y`)_mq~7rJ(9mhv@x#jRCFXGc%=d7X0rb%5m&PJzNE&asf-ziK-Xl9saCY)1qJ zgZJYWZ7FxTZ_a2}xJZ05$DDTqAEuuUv2%Fa1m;BZ@+ZKa;^v3meZzo$cGDu|nz$oq zUIZcrQ-+@>P6o#uX0q6imeIJ(r2DeR6Sewv2ybaxvY!8hHg>Tg^VO-TN|?SLFzAf^ zBw$i%tR<^-47z7Z*yw*IJVCs${9PDV8Z4OQR>A2(1OWo8Io)yEn8L^yR#&;%{9OJ| zR*+4WcDw162++J>nDhGyVNYQ}S_;Nh_*mkTuhDeNtAQ?W8F$4V#U%$au9W=G5U5VP*b2>x@xgXMSS9n}0;B3CIS(-Y20XQwtnK5_z0 z)OS;mL#YB9*l-$-(3(p`ld00JGP7-@X!s1KLl&2T^GU0;rX0shTvF7pD#GUwtwYd5 zcIV=bDA4o3E|feV_wT5iRzIrr?K2usd2Xm!&iiQW9S0sUW099Oy9ydwI6iT7Wq@Ih z^J=>I0LeI)*~l@PD${`3j-?~Rz92T@q53BGb^iI>mmtkBXSBhSi~>Rf8#gukmu<*_ zK4lO8`M*eG_Z**?t@!dEPgIi&X+6G~akc#1xzL$tUb;w;z`c8w6@+HZy!PMoTNjTE zjdbg4o$-{*OpN2;V_W-Vi8mgt`qi9}@s69pv}!b0seP;JxF~_{nkk$iVI6{@`dw-) zuARnbRF?8HKZd@QVD)KZ^%zSuo$M1Bt>QQRDW0B7b*^hZxwT9TNRA(1oDF62P2FwWY1#M6)^W^fz5Hjj56#f-6y|Axw5XpOz;9H;hb4jB^qE+i5pFDefh|D}LxdDKm= zW1Rg;9%H(mH=DD)@s1GG{bRwdzYspSo$R=!OW0Kx9vw034Eo5Hy`FjU&GUekHy}}v z6P{k}SVS`;875&>zjX_%ae#8(y;P6wO66frABFeL{CGngqR6Fga*;1mFiE;SNWb1K zII>s^+uefKtjMj{M$_wh5-X4S*V7hBRwCub5sz0x`o&)V=oy%jvA{xi?~L5cr~k!) z9;Gx3+|Z9-$Qz+$T$_4`^8YsSe-CuFl_oDvA_qyKtwWTB6B~&~p4qe9daQEWZKRuN z8u?gQEQX7@dSIzdxFv@_|A9nt0@ZaM;f*S>oHx7C?ym1C&p_@o(txBEY|vWO>aR+v zl!H%X2=&c>=VQT!JJ4zDUFQ;G!2bY#D#~)7L^x%UMY(ekP5=J0-H7yo%1P@DGlXMT z88?k^uPvQzZm{K7xS3|Yt^DTlA6~R86juH_r&%vyuOLrs~^hxEr97!H&{*1GN(vI@8ytqtbr=+9f9p2+shP2!7!Xc*c{8};+0QvXv-I!komU1J z56Y3?7n!hv=tD8%4f@g8OxWsu=K<5^- z+1@O5;i3X%9=D~!SE-2E@14t`vtcy9jSqY2?1#Kca0)^XY+kL0vvT$xE9MmG{N=7$ zR_E(14!f;YdEOSobbbchFF2k2>=^F>Nt`S$J5y!TdL)kYT)x3ZY-J@{mMygFfsdWI z8^%$-5(UAd&OtFiXJS#-gO>crfrf`R8N%mXF(IS@c0cmGYfRkmdDh8>MX8>CI!kRg z_m+n*NwpQe%9mkeM6ADNjpKb3ecpz*-5bt^{p$7lP~0vCDbi>=@;k;q(U3)fGEd(@!yY&f=WbH|QStzIw`9fkVbY+3R6 zB=q{m{GQuNC1+;!!17DdK>n*g__d_#hw#3Mox27lIu#D1!!&}OC4usPpSJ!u`os!V zx~VmUnW^;DbsuA|S}^%Drzla3dV13pcNiogS~;ir%frTvNRarPn|4)YjSNfLzB^MT zER;(RUOc!|eb;E0HTGdmhG{(W-=~5<7GhZ6l+8fyGd^1j2U%oU zl!w!=wk^YqeY4Gb9ow3PAY;_i)8n62p1DlfaWBjF@}<{J&;kM`QvL@3acOYk9ta(x z&B$Lf2s!8u7sECQ!P#n{rR}{NKQ;1Bz8t@lDy)%))Kpr(H)wC9?(*7pz?8@oWtB_d z^!aEPKrgRKHvG@!YccS_j&~_W`SPXH9BF4Nl0D~dImPXi;~v2nN+MOLD&BBBB37Zn z=EZ^AoD%xDiq^4wdTcS>(@)WF3+08Ta)7H(EQYNE*n+~+4rFGzNDK09PyI=+Qt4ZU zdQ=vv&uOgT*?t4l^DQ^ibyDRXYu|>ZY5q=T4Q_jPz?OHJ>Q5$YUCn(aWJS$@MDIKI z&g3W#z@r{Hz8{PE~85*~JZ7F%A2aKI)0NgFQEUCgDn zEKKrd8PiDlKvn2AXVx$cX-pWbWEzLOP6v|%8ceaFf3RG3WzC(iR@DkXM$R)ubsqSu zb8L4({U$rJ0T-oQE`?GF630SJv&9Cm2jZ6%Wn zrOnpq-d|q?>#$Y&A0Tr3z~ZpYx$>B96MJY{p5(~Tc3J%*mc!$87*GnW;(9Yx%NF0 zEoeyMYuo7`#4bUb`!5T>Q0PzorJuHG18g2hHJsMnWfdy15)&jcuCdGcm*g5Ux5W(1 z+=}ys`Wr1r8h>b1wbvkin96ci@>gA~!c`a^m}%xJj=agVci5vfIr0sCf3M`c?kC!U zqY)t6Rl+~?tefdRVOgKk%!Mqs=(JG)yOiz?WtJC5IcZep%I3I7^N?mJdFSFguQLhp zyyfh@?r$?)1ceyhZm)XBcNO=sI{PMxPHja!>F9?@N54I3o}%pGG^VnDqOnLZyNg^? z;|@Owq^0Y{f}h11hLx6N|$VOzVzuc(2v{s*oCd# z$wRD1`w{RLm7WDG>_Dyw82h37Rsj3pOix`oJ4cF>*O8HY?4n^5Bkg9tleD}Xq(+wb ze)(Fbqk`Vn%1awb&|+lpx?Yf4-y86FLxYWk;{-O>0G2-ho5*nVP7s>r3Xpl9Je?-v z^KvYL7*-v2wUcQb2#>l7F%{^jm2a^h|C0G>*_ zGQq%LaEw-{0Q!tk{$FoT^73Qn>WrDy_=$W8Q%kcTQ0{2N5O=`sV zaqBP*+kz-@6m&z(QbTY3GlG2XO;|zpA_8Ku0N5^@pldU~V^ONg0N~Sv$Ge`TEQ+~B z_NfG}U*iOTBZ7tUcbp>KLg|;^5~%ZLBO0QqOdTAPkSiW?Z5ai@7nQG_8m@Nkl?f(H z#Jbt2Uf*%Zeww*vl^2)e^HdgS_LNhoKE#iPT6Tq%-|HIb9VkD#Tg7*u#AM*h8Q&fC z3+@6D1m;I+`fN~(Q5OsI=>wsG@!7tYrT*HL9f3S2)uQ=Qf91=*-f)P~5^lX#8q3c3 zdF6n6c|gkfNqv}7uIb7Zo6Tnznhdg{G%c>z9~KKQIsVgRfj5f!9!Thvz~4SrHb2-I zMZYf}(`#g(=5(8@Q&OPk&wihfhYHwOLb>r6Msa`=s-B^|l2xHk21$IH6{a}{4*82f zkA5)JaHj}p+n1=$MbIu@Pb){6*jSIYoDI}L{g~$3#6bGXs%&AjI0QR=GRm`Apo~W9 zmRgssN(PfykLzdUjb&7;P*$2q3YhA8d3sljd7l@E8NFzF^dyMIV;? zpQ%qFY`}i40x66J zli@2w-ZB>kt=XXrKM}xvgnyHEBcrD%o6n(iwwO81Q8?cF@_W!DS2;8&I&VI7HQ)g1 zlhJGS5yc5rzH~a=lAk`enbyaRzTR^`_A$%JO;zdqFlNBwK`z^QUUHBq*VA+am-bU8`MW^I`Vg3udJJL`d!t3HbGne ztq)Sk${}O_WQnmH-b@Zm$f#leXZwmrfU6RP9A7lOy?KCJ*wgxFuH35{|C0jtt^xTC zb$Z8Do;;v@1HvjFeU<1}(y|!D#mdk_V@Cef3ihrPtE;|tO=`%+gLcNH9mJ%&9(RnX z;?|08X=tTNYz2RAEPhc%c-q$gul5>(7fIbr&Cvfg)#Pg5x?B=rHf{*Lm`OE{vrn%O z%-!c56e5baIAR_3{-YzU4zLe&-m-4}94$xhDeZ^=x^anXKw9Z55s6}{SM5Azx)|TJlcq~T2L|mN2k-E)}ardLRW`fBh8I2;PxZU~u3~ zdt5OZ_2wtJ+jo{dW{kb1)cSz!qLdY3?OHjmDVW|EO1B*Vl>jvwMA(Aq@DXt(BOwW%dMi~MU*gS3iB zaE>^jwZN+(c8a+Icof9Co0Cmit*H7wUqiAu0aLJ-BpBQl_2| ze^xFVdf}pZqVg~MXI#}mD}BA)tYqe?^?o^?O@~k54NhLcM!G}p1}E+yCtB2lqVz6H zWQ!0j$V&X6p--K8dZNj=bFTSNN88&rCZ|5j+w8Dl&?rAllL7@^j1||VGFxPDt?%YF zWXc6ugm$5&sKiDyg@y#vXbxzKZr#DN=PxQob#y&&d=x#hEOg++@c2Wl0!p{?9^6Hy z*`l+s<`_uFmlH70qNgSz| z%)5NwH;P{fS&Lswhg*c#9Kn-psaS-F4t0#ZY(QC(X}(+tQR#IhE2q71ecsFkH3;45FggmKInm6s zKlmVRuV_h!K!r~f7+3z#v(iH2Z$!_n-8I;C_8PB@Esalzi%Am~V=OFB?bfh5+SbJR zI6wR9L3jVr#`IOn5zrL5X>0e3On1f{qu|F3-!^NNR+HY`e?(m8X*&& zZq7vh?T$umPKwNne*<0%SU&gS^Z!MM07+(UYC=`-$qq0(RCrTAwbTJYUiXo82y_k>;E@#fK^cYE@M0A0dUWqqCF6_TT4&@c$&N zMf1&%YwOx}5QgIAwpSQ1Tpv74fKEJ9r2ECb58n;{AHa*I1?m<%gPSh>fTG%5RP34| zzd#!E74C0Qg*wbPzcGAjf{z%;jg<B)n|#8n-l``k1KGD*;!0eZb9#GMQH+$MI_09`qIR))&D4Q zi5ubF4{fxu*PEVW4O|1st6PPGuqBJJqFy<(N0w}Fo;P|zEVQsUZ65awr#H2CmT0!_ z+M(pWsx94>#edBqFT)j^=PsbF_?n$bp1~_Y3+l_xJtcGSCqV>}Pk+ z)D%hCu}=%ls*f%)T)Qrqo+n_r7F!4GWt)J}sa~eIsaz&yL{2(?Y;*dIlMgJk^?)4dWlSlG&bo5?>d4Z(W+>0&DWB;E@@Bhz+FL{ zBUmtb{!aKk+|TM0nV$8O*oE474k$!k_dCidLiHw}nD-K5$H?U`?VFefur!Y6dbDdT z$*Z{ub+4#h&#vck6)LZ6MMLldE`6R_sdS%Za<|=vG^|QV*nJblZUJOTFE2y7^f5*by;7(NlXTKP~>Ry^>eO4xu_(bDN zS>{9CCd+rvZOU9;_#Y5jK& zI`6&{_yy8@IB#IIw-*a}4Xp2U#E1>_U75*02FE!?1v{u>S6bpTty=l^G<8zL1fR8B z%~NjC|syYY7tKc3%6oh%|2+CO&;aklRUT(CCV3o_(} z+K0H8aebO2wHOn6YGzNsAq*s{VZ=;jRuASOB{oN9;s^~wM_ixc8yR+f6}@^gICmQ) zSG9Gotl<0LE$3v;md9%BU#KLGgV`@r8p+)-&8E|>^UE^PUrJ#DagaR;8|VunA;qE zI)8P3vv;9`tm9HQj;1(z?ing<{|_*u98UjBq@tX;2+K_BqMI(+bo?phKD7(fefs*G zV_t@`%|m2$(^Nfp>g>0mPOU3s`mzb>1CG4?BQFt&|04FHx6;-mf!5IKj6$Fhn$eFG zV+qoGlSdX}An6ctqoj2gY*>PBfbObhqBrt}iwpVsQCu(zomvi6`2ML2tkGd(HA2Z! zBh6qbfYu%>@Ks!Y3}A-osox<`N!EKMXmxnVM+_v4)|*wCHKo5rIqjKaaa7ngd@kE%-YTSb7|6e@1yVYpnwzA zn-Dx=hEf8y>07wnVmEK^r^PT0d@>0*lO1GKA$go_hItHkYsaA7ODHLytsl>a!c7PA z+W7G2bP3vloHYSsBTkRkRyc zFr)gUU2OQ-Y1r5Fw|Ou+ua@ab0l;8_=xD}|fge$qb7Qpw-%S%OroFiPWnKo6Omq+Zda-2CfZ?7i|;ykjxizn*Iz9g_T zHGjGiGB8rxS(>W+6mR{!>!Q-ue)LEDzE{y{mE67acaTg!2f=u^y*NTZmD{ z)aK78ozq-zjL*D$Z+%m^AP(i<6?Hc?6O(f)!fl*ehW2hHhoVoG-O{f3o&gvlws|oW z$vahggG+qXX#QAuK$d|4?PW&$6;VIp&A!EDn&vm^ft=q1;a0zAUmDl#Pl;JEONJn3 zQl4kRPq3cx7to49MpF>TdD6?TmaYje#8+eVz)>yj%_SLBU^7+>Vtw|d(D=(rq&SLY z!wzLIKW(*V>g>|{%4=p8T$x$d?K)j?)Ab_%1E`iLk6<3qQ`dZC%Dv#GCX2gjVg)|6 zn-qQBQQr3BRN8K{|K!(2WfHQmiJft8#lXKg{*ZoyEym5x@b^e#kyj%xExnKGv?HE* z;y66l>f}2J=##%E51F<%)68>Rz0KCvy1fIAn%>N2_%8k^>Lqdho+%(pKTVBmK{6p6 z7^T(f`gEv;g<6rb?&y_84eT_eM z!x?g1MCw(-G3qy~Un_a{Z-rxv;TI~CX)ZoXT3RB56|y`ugM z-c^xrXk3}x{aNrwLJU0?%DcwVsBWrOP0XW~ltFp44R|qs^psY<)*H)M0k};TcN$Tl zoo{2oq_Q~qYhv;-=qT!&K?@Qit5%DM-NvN;aO-){h^R~-0SW%DV1FOv2SYGfXfl>?NZ6DNk`x_yq7 zu>36xM17U;Y1^e53am9`<8i&zR(wk`r|NRvcz|S2cET# zSl1i(iu>i>_4omJNuO3b;{qooI=j6r@O+!1UD6nM&=pnB%erfc$I~$}!O&p+ zL0I-V+z5Q^zA5%*XABNPGP`mj;z;tM-~FytH*-LuK?8otq5?g%b zh4L$JYk54YK+1y0t@r{Mb;3vt^kaPK(Np9#5!M06Y#Ig&Tu;!ZeJ<}e77F?b2hdkt zrGL`-R@3LRpZSx}C8yp~X`{Et{{#F5&|tvlO~jq}-p%ItAkOCY6E>Z)Z|=OL9AT#7 z75J029MuSQU1jOTwKfR_ns`q{NlSCtsL;#Z@bH^)T))Ge=pQHRjL~{wz-Z&~E`N-Q znG@kmDqCFYRv3ZAs3s6q7Nx*9!|AN%;fctzsw)~a5U_^r!KlqQ>(uGX@^;l7MgQ_% z=XHaa-E&k^ItBS`UZyb~L8Pkl-@}XnveShZi z1Kw~-Y!l@bdUb8LuCrNzCncD+9n$@U3~(}Fo(xj_W7>mw7IjgDHj%;4L!Ss_)bQHF#O_4Sz8vAp^#vqHwr@Yf4YG-QTUmfp%xu?%gnUt{x(d;MC z)b*9=_CJse0nUl2!Pwf_o4oK{4DGy-?l=Q`hjpfAK4-QbV%x z-A4XCfk9OKbsowP*=Z<)4{4pA@!@pJmybx{S;NL$p$Iml7=1SNHpgtytCo;%+}%J& z2<=LYR#9~qhGy_Fpre7SsM6BuGJww;9r*K*YJy;m<#{1XNOhH-N%bp{VySLAeebFH zq$KNrYn|FXYkObPYJUkuFNT^ZI||*l8}Dh(Icsam&H$jI@BPCct)#=t4utDA%e9M5 zT%{&nZjH%D8;SaiDALjPgR8NAhIv9a9m0eJ0Nu`rwNf+ueR?LMr zb1wtH6E(OTmYPT4P`hmkQO z7)a}XfU-=Y>YZc;XuXa}RIP}|6=)BAfqWst>6H$kFu^nBUER`}<@#?a1%&_AKka0> zqt5Q_BjXtiPLk%twwvtG{}0gQH5*lBc=d?QBW(&NJ)0jWIRD>IaeN?1wO)gGy(?9q zvFmUz+J()=`~cmK9YRmXd8OT1KH<^|#{3!-OfkNjiu^?#^+<`pu+*43)iii^Jw~}* zNOhM%UKAOFUaKbEs-)~bMxW?|ss|W{YA<&_J`W!Mt4 z14ZDGGb)|H;P9mJstCW!JMgDIv&FiFlj0Oe*pR1 z${|S7Ugh2ujg+@^^LC*ejb@r0FCweOQ3Sqo^5MB?>BP_8{mNJ7b$^QM;T8V_Tzn4F zsCfI|=55$`Vw5fq{LTHkD9vwQ6et^wwxekL8NE4Ry3;Mq;! ztJ1sCw;1zUb7P#0mZLWRI$$vkSAtkI zkZabcLwi6#w7*vj;eEQ&p*>p&fN^@BrquOV@p2}R~yyHae`%>r$^T!m?* zN@t&qJcyw>jh8^=sMmq&?9Y@vaUeSDG7(k18E}cR;@^qFbdDrRMh(25G|xM+tDuLP zzIaDu)@PM_(wU4JIA}&AlwJ%6!SIp=xSM9D*Fg&GgV+O9gZ(bod$v&f7<|{}1UdJz z5X}OvINLx24+2fbO~33YL1+z>+d8KsZYk1Ph|?Kp^+)=J+Od#6w|C_6Tb|;itQ=qG z8pz8|L!EbSqxk5fig+JhhGgg>l{##iY`)!);dT~q*AMYD2VCR}!^)06Ad26CWMciY z0K;`^KuOQozAc&}N1z0s{Ilx^@6sIz`v&X*pA)zXP3u+Vigump8%77 zN6lJWQF*9z&=YCHd~-RfBK;(uAdTeS%+TJ}Kd1&)C=I&(SsO_ozck!9UN8#&7nRF}sNZ{w{^)5;Ts!7V1gW(ThEesY4vRUozkB$`6HITzwU*w0 z$98&V@1iP zN~OqSpO<#O$;5!TIxPMgtN-E!K{&XbS1?)Ibb4bo- zj-(*!1kq~CcU27+k$XT+O~%L7g)hLPLtQfcFULyUT4Dk}uD>sbvTV5k+Qsk1OHWWg ztg8)my$;Wf7{OlzM61ftOB*k4A@WVfx0xMjC()paTc&OAe+w}@vf8P-3T;OfyuMLt zZ)Q3fz+JqjH`vUmxptDi!F}ViMHLB+ME?X{{{C(Tj2%TQtB@19v@Y!Nmb0`%c|DOY~!f zS%jZ5hHZ$KCV8AQZ3_FC|0J0u5*xGNZ`aeq!kzVm1$)wKEFLT8Kq4E1ec?1Nz5ZF# zX$)bAjqoOJsc6|uZlvkUgdIj>Z8K>UdRrQt({AV_ zW6ifY48h6nFA^QZs@gZz)4y23d1;1y46^pyx}F%~!v-MTb*q03#eX{IqZc=iCQSPw z_bRnGUdeDIw&~-)HVBaKd;h;oeU?-I!K5AZ0E9I9+iQy(xZ{IwVdTI-gd&j695nte z?<(|G&iTryz6_0{^DMOA-HJHvB)rElv$mMQW6q3;F**|9u-YEowWs=Wj(5ry*Dc{KM5CND{`tENLW#hklST zEQlS0F7g+n*|82TW_9?@{#jymsCHft>`(K+()TXT z&V_}9v15g>eokT1a}^GUJ2SXFgCI_h6(~ZLyG>^s1dy;w!V3C>xH3<{(@tBrVa|I$ z`vh4=%b$>-$xD~jvh!s`WpHPCMW5FV78A75qDlNW`=Arf=cTUOd~6^uLsP2zmy`6eHfx<-}_xUD97D(_=Nhr}%mMNOmup)QLH?8{|rnT*$?yi)>y_dl>Ooe zqR*alPrilz+$z`7!Z>*yx5;wm4vmDcYbR(aXkjI$!+50$t_W}CI ztxDpw9a8xKt`MphAjd&t*yZI3bR)m};?VH{QZK&tPdbWjtBpnNdQtG(BTz<%H(bPq zO!HYxoFe%3(CY%fQi$LuvycGADZsL#2>-5(>EsdP{SBJ8-uv{Nv!UnbMekpi7Fm_A zSkd^Xd@NGCzRiC0RrlyXM{0D%hQ;9Nl>CG0vc6IspBPG68{5`X_QjXXxO-R00$QPo zSD60UJ$?yiEa^)UCKqHZ}|L&_l~#3O7sb z<4wVt^zXP{a(8K9QsmV|Z0+8s+$hjrjt0M*NyrhnA;IZNV0;!n58%W4=w@8j|Z>hDB#J_YYr`&J9Lgd$_eM$$FHxv zq|HK!b6cV+Ta5G~AG~7}V_OeJ@V2zy%P7^U-|rXqL!xwCa;=?1K?24=S15Z^Og+zi zRDyx(H7gadJgWSoCF?78tX5d2w0h0$Nl8FY!Ffu6yjGCV`NcG@=OHMWt|yxCTKH$H z8vb=qMQ_@B6KmP8CvGu7*@OSJ+^QN$PNtYamKcgEWltN?- zbv~lL^piKC$c1Mt>|FbPpj)y$R|}gn*)IjBQq=ZD6M2jsCHR6Z#~wmPEL0UyDs5_L#r*(|f~YeqU_-6$IB+=)Vx^`d#U; z?l9F^X|Xh69}chlahaENFRFEu;I<(}&KxD5J}dRYFixDh*!0el;$LlB{+Xc3KCPI1 zYY==WGaMC%!b(}zCTNB_TGKtZ9#{>;2*)VWOk`+hABX|EHUe#7CUG6Bq z0Eowg)mtRJi>{h#S3rNxmpn{lgm{YuMa-d8gXq{qdG1Nyqov}OvBo8@-1T!iq_vU? zXtDUpSCoboKwg1csb6jg_b~sh*I3_Tu&dWpuatjn%#V(6dyv^3-uL^KjUDVktmPsB z8%zDtqTSXKN!YC+%?{mR>o(K5g&sdmQ#^Rr_${&2Zx7+~c)V>(a#WbPU?|F8A&O&t z;c-i(L*rf}tn6!$C-j?M_pT(CU52Z*y;wYqW5S-st5O%lMId*vj6b*^Vg|^|!Ae^G zz%Grj>b=1wGV(-E0bfp(Mx4W*S*QLWnl1e}aI z+WmfwnXV0FhcMEaYYOLK_|cn|Sd94SuRVfj>euAq*j$^`eRV1gbxU8Fm|y1f4GTWQEFw7sm=`gJ&S@MC6bO+Dqys zdSVNrhgo>7wv6|fsnwc-l`D0Z9x1wfjrcKDEF8#3M zDC?i`>G&C(y0{@L%~j+NWhTQh0bA3N(((c{m53p^pxr~oFJ*T%sX^IVQH{53s$MSp z+=QiW4K{<_{H1Vl6|i`88L_=IA3Z}#0? zQf-l?fSFFx*6b>d6KP6> zE_GCEOz3PzPGX{7SNl&fDAR_)(Xk|T?*=!XGvonESi)f~Z9PjMnYkqSR*39$=JR1; z(W`*Z=H29)DJ*yPRBxkC_R#;R+AB2B&u3s=<1cxy5c{6D-Yq@uWL=0!YF3wy8_aOy zR)1Jq-YOYiqy)bb9RgHObF5JC#Nf#da+V|Ae7nEK@>k-nmidr_sFILaxHt*Mv# z&6-Y%g;}mcS}O9ujqiO6hA)zLJEAg5mmHWE?__jD8qbS^3y5(#L=NpgIL=p2_JTX*^dM8amLqeAV4D%smPxNrRg`7-6{!d z^}S_LU}gUNgrT)aNA0!C#4d~Dm7M9G`trkFC94k3*?&}Fu8i&~3sEc$l3z#d z{dGmh9_0K2zwuti_ify)NZwCHD(ZRr8YTOdPsX$b2=uzE!5x7PN188Vr6Lwx$IMgI zDdXWfy#>)4iJn&SSZS00iYs;9$2v=8I8n7zyYwM9d=Pgv#kef za^|DlYC0LJT?)XSGP_);`em6EPAhNiSZbcarETBk>TR|zOEf64fmwRbU*JfN$a`Mp z%ljy4`F@o%?KG}@l1g|X3OaY3KYEu6E)7+rjR7heH#}w=N;zO zxJh!cAQIIr+08oVuOWLXpb&3gbKjT~7|yu!VcjTHIqiuwbr6%*IMpjFW@pGi(}C7V zU3(+i@o9uVl;S4sP2?;vL^0ksP~NwAMm@?ZTO^&n2~;zxx8*dvg`GzX-6m!&u3i1# zca~0iw>H8{i0SEq%ZQBD5C8zb5KG-c zd8HkI@J_6B(PE6+l{uE^ryd`&VPSLUP=spYGvxvpo35RBj!P)a%z8UXwdwD@hITgz zuMgIM(Umx2%+ku*YNKPE6cR-^LZ&*fqLpIMErJ)NwzU)6oQ!zey!<6AbPRKLq9n3pA=k3gBUmt(fu=uT3 z>(}cmR^d*g!caLUsR+jztllye%4hn3RfPMM_N@G;Da{;+CdrGEq{oyqzx9m~F1p8` zgNulkI(_gE35bEI6|UW}n{bl$(neqoqoP;VLAnIz{38S+?p&u%uwYVYPxX0zEu0r_ z6XCzM7@(5~tLgutl=#kISgNX}xk_ z0OzUj2H4X!SN=w?#)39%Kd%^7jab(4$NGaQF$x5Y_Qdh(&sdg=)fX*BpXv3%oMu}i zE;N-E)TcCjp;zP$<1X<+w3TDuz`q?j-!{Y~Yy;+@fgEKP;!BzVJ@FGr{kf{AyulkT9YC%g zs@slWNY$ic-&1Zqu^{VTSN)GBN}2E&XWkKbI$D&es*xk*e^eYd3jRqG0nE6o3SjD= zp;uF97nVw`pCEX^#&zR?Wq(O5+Z6ObgH*49QMn=wUp{noSS4A_+W64dZ2n1(0+^I9 zschX*uupd-eYKzQ*4Xhr9tgLbz_>42;L@)&dFYb5mHKKwT{xw_6)wT83T!$s-+%{8 z>7Tth9e!B-Y4IVfBPdnN@`hN#=RalEHL5z`)5yQG7cy8)xsF8qV?rxtzKlo$x5krUvMkjlR>YeT}cnO$m$c<#X$Incs1*N9^(}x7f3KdCS zmyq|`^9Qg3XdZW|bKg~JJW+F$boAG0H01yBVjt>Kee~POv!X4|(nv-a3FqzcxWX$J z*saf`+^Zk=hS~IlR?O!-K2jQJpVlm=>mB>AAVBq1`aq_tY6A9oP2tHY7uze5qJApu zuQB2%@kIPx1&Z+fy4wgfPEqBB)fc+C)*TVde{!}T97Likr~muKa+|-*nslI7?i#&w zZ2|Uz3?R?K(8f=QGOV*&PDQj*N&v!R1u7O1@oFb1vFLLFUw#9hs=uD>2!dOpFiW^j z5XFQMFg9X;5oqB6ti@Xa#I3C>%$ppFHe4HHU!(Y~uK5$`gQati{u^?d7z$R{sP%+05vU4x!)Sn;5I+X~@$9u@P zVhmqxn}W4I-Ff99#*j1Wb1L-ZSfib?lLzCjxT^HU(8k`ai(CHj^Nj0TJApJWpV9s- zFq_=C$E(;bE4gqT?@^`-+!?YZr*2y<7{xuvRP-}3$otD6uKus_`?8*9MP}Ud2khKW zAIT2hFEY5(C)R(hYSMcR7!5By&R)g8x&G@#)Ej0;CF&R?%eV@vcPm0DMzJQywj<*! zTeWepv|qSbpFC@FBiEsus2BK7D7vex2_;HHVVN)U4Wb7{iP@X1mXF@MY;Y1jmsT?} z`^2_EDPJ4x+XyiHhELfMyfF?5m=4tY<9ol*t_5LV%%mo|gq`#Uw6N&&YR7R$*-vLN z5q_lb+wX}ptRzkW&OD(T-5*Y9Kb8d(G|C0sN4T~#h%VcEYkAk?T7$f|9o+to@wgRd zg(WjK@4NZVNye8rM5u_n+5IjdK>%ALUu7fn@kFGPMRfjo=~Gxx4|f65 zFl?1}!yv$57ZPTE4{m$?S{LicVdVYlucQ+`r|keu^h$S3$xMo|gS0DK3&CcTZT)+P z*@ksRhSOldb9`$>kXIV8i9p>y80x?eVVfE$Endg6=IL5R!GLgpMh=HB)yUTu3eQp{ zR1ykqt%=zO+4|qv#Q5HB>pO0a+zEm5NJqYPNb}sr>}<0rw4Jw#_LVYcnIzg%A0Q z&`4ELrv#R09C&@(ZdS|EQ2!pdClUDdAeQCi*L&Eu;Y0U49T{7L$3gFZ0Uq&xf*u4h zwYZ<6;hQ-skdDx@)nm-i?VjD<9X>wWK6hf(`xW?O)&EhEM>Vg7FxVd2Rldwh?rsUY zCr@y`W8?p;?GZ;$uR!9&N1#|Jozn(0?Lv8TQ<%`}Nmj5HNwau^*Zt=^uR&Jbq(e>+ zt1gsUg|4a=S~li8VrA?H563Hr`19QG5eJvGp9pV$r1)r}RUVW#{ioxvv12Rbp;E6j z3K@0>ZXa}IKh9gpGs(l7?tHvuEqGC*xcqt@Jf8u>+4l9 z$LS^O)34uqGjz8W$fc=egCb|UaH}3m(kl)77dD&;U)p4 zQ-)Iff^h?!&ho+SU%p=w4PV46b&0p{1_+CiFKb3U@1k~;el@Y>)xdr!mnoie8bxnh zYmgtw5(*DV7f6j@%g428kBvdS?uc~lLetz%$=4V)@}t!MvUqg=_I5Us6Tb_m2MPsU zh`TPf4xI3(W4Ts=&H%7)r>X?+jU=oCpRp(tm(Nc1CuxrgmJJL2=03A>c<{Fe*nauW{o2a@{n2^hy^#<`W1Dv?Nn7S=Vs}w$t&`$}CA|VojV{@jQ!a~V9EFWYJ5Q3=e|EQX19)6*o9a-@@PwAZBbCMJ^m({`otSq-ABKny`FR|CU+&ffx zcvB-WBb667R~|JD9E?%vkpKf3PPH|(lY2s#De-3lx2)=~Ul^BE^#fU!&ZKq$9I4M6 z)r*Ul9#673IlmqKley*ATFb%fs-Z(&X_nksv7nSjPkxYp-z=*@DYRJVwFAGkDbYpj>h-K+E5qscp~YK@QK;HSKXBWEZ%_~i|=oHa|BRu zmVv&A;7CoUSE@O3!Gyuki9s|h6w+xPeq!yRj4Wl8)0wuL;x}3dB>s;4}m*I zgbT97I}{+sP}z?bAj#n+6oC`=?&-f;q0RN_20~pWc6O!F#8_@Jbj&4lx=^5fpl`}M z(7hxnOXJ5lm2rT<2iHB&+cN9d!>=@-GEUx(MO_y_cwu7JP(TKgarn>t!!12lI^zi$xrcb zHX@V8kKN60TYkttYB${MnB!YL&Ee|!UiamoVotQ9R#4w8NakrRyX%(-QCAwj#t0SI z73gnR|lIQMj43Arxga+SZi1m5)qA45P-P%GLVde@p z(02IyMT1xlUqMS0^*f+gS|xEK?+sh)2g!b~DN(Z*l_Q>>y@P4dlhG`gPf}kJ(Lv+T+$M>r z`LsR6j&6TJAe$vi%j2UBYvVteZO`_Z+@;r2O}v=Myd|JE3|%h5QkswHKIf+oZ%~BY z=~AYxIS0}C0pB17Ir<3JL(Yv`-_H8Auj=-`(~w~R)50CHjmVaj)<18hJC4)bH9wx$ zF$h~yzsF&1D+C^jIho)%-xI&Q3p^5df%66w7D{E)H$|LOJ&SB}Ro{&sj8oS*r|cg8 zS;KiLnrMFZcTPqqC?S!zIg%_`@K-ynNYoRX)UqRan9mh7I+;^3a)uB33Qv@4R^(+E z-S!KBV5bE)s1FBa;5hv$vrjfRvghO2w#=a`U=4(Dlzq zKA5mjPe((yZ0w(py>%taDRj669s%B=0R2%9MO8c*w4=U$c{VHzEu(YWk(%yDZSkEn zy2l(zwGC+n**{b#@%7-l9*S!{^pTxO+lsb-H@Pcv^x^%Rhwk5kkXfZV9|P1mUHg%3 z;$vr`hjF_T#o~jH=IStD?#iU@$5Mv7J-JVzoi6t_r}jDqXN&Rn{hkC^4eV3Q$oLwf zjzEo~fxh!n!H%pc`Dt=f2P^A{Be^%h%{;%;sd>6r>UM+@@aZhD4Rhzk?*>NL+sS^xV;dH{;jWI&jQPR!KH$vD zz(Vea)-qgdQ!I8fs2#aIL9VE2QNsK5{Q7zC3X?B_E(Q(uJyNYEl;FamDN%-&8$0gQ z*9152HihDhBBG@csB6?1#^yj9=pxTF>9x0tY_8Ld6jpmDTim_(lq(-`>uuh;^6!-~ zYe3SDiv}1n5YFo997v}MRQJJ(qA1fPf#C;YTwU+`Hhj%Rsz{l5dS{4-|qkQDp^zzDkqsLfv~p~iTbu@Opgnn zj9o+Dl={AnMn@HIqsc*))YI86$vZ(3l*Uq%YW$y(GG;#NjtY?n|oQP^b8qvki?}+WG zJ?UpLy{PIUAJ}bzUz3kwFI#1PaXw0+?(a}koW7-KHh0HKMQQ z_0Vckvh_>#P%?hzE+~ z9e~*J2LE;Fb z<(k1?n7`o*0@)GYsnbC8feYTtZGu_!8&@2_-|VOKlWymwu?B}mX2(-p{XC@<70@JN zX?!Sv10GV>OMCYyznd|~@#o;S$Y4oo`!j3Oa9bVApFsKc%kwsJ@uBxByn!^y-jF52+zrN`hF7`~=5*b90{BW!P7ngi``N)&z zMQU5#L_BHHeP}Mrr>~GE{@?z;hRUB%G4=Dy?Kt&TmBp&M7PbS);qgC3mF9`<}#2Cmv)Lo{Al_7E1)q#lo)B5gGltU|dg9 zjJq(c$#L%(@2%)f6{>E^NEqv0dr@-)4pgk$5Ino!SQ@w|nx)UY>PQ0{^*m0jhq4h- zGz-&zN@8)rHVkC*$3efwu+-E3lZc5*b6?QNw(@{9{E*DO7kLp(8tr-M4~EV38whu( z5_-{OncijAtE6C>tyZrkpmQ^YHdW33o z@roWSF+y5XFk~b@)jvAdY{BbVD`w+g%)=X>YoZ|W|+p{U` zWyisJMX^xWp>m2;puj1~)72P|%akXFy{fAkEILY=%zU?tGzN{yGl;l(B?b zB}KhF%TIBH$X(J;Uviba3k{Ckg69JLcL9&R>U? z<(_&m%rDJP;gD=o80vY-!0w;uAbY{^TDM0=%lQ#B$soMgSYGWwd z?L;Wo+2f)(@vcOg98))cBw=CQs;VESv=;wY&*Mw3p1^wREq&Tl>0O9n+zf7^0Vd7z ziFL=}P73Vh91C?yd-}_HCaGEgtB20k8!)f&dQJe*pNRPV#6!M)7MmhiF}57d^q-H- zA}R~ylh1ATr);*RR(>F9{3yk|H{(!$HVl3T$ki>SDlJdt##m%7WHIFTl!o_i(1@g2 z%X(Xg&~8$$>BO>@C3{q(zThz-9HMjfm*YIsB|Sg5-!xrM$kYXk=1+8}LV-x= z%C{G=n`KHF$%m_C|5pXCDakJ}N=}yx(UDodlT5@fP@R|?JET4geRM?u z;*mrT^c(KOO9TqGDs}+9hVQP3I0`GsekiM>Gt%F}@a7_152ZXcyLBJKxu?z36`*@Ga!8SDOr%Tca8!uyH+b&=?6YfhW| z1;Ln)qYg)Et5&6dAihJv)58AEw!vF7slT;iru=f6_qkh7Z}j97(!agAt4p&~6bUqN zc+=z@E4}id9a;tf!OTGCX4N(Hru1}ml>P_c1k$z6=w^<*%^J9*5_OA zzBj+CMdNKof~eC}Zc~F}@Ou5>0e84+CPZ(bc`y2`#4lrm1*n7;UbCliU*_Y%kkJi! z*;s+{os)NYbpXOEHS)ERy^ILBU|Ii+k34$eROV%2rDb?{$p>Xq-2Tl}>eU!pp65?E zhvhM0DxQr)KaThd1>gU@UG3u?`}EBLK-8#Txct=^@QiKO*V0&?=Q8ryRs7g>eO8c+65d~pe+4V%XOYi(qs9= zep;4t>z7Tqn~s zZ?w*YOu(1bkNpHD-3(O%pCvwq8Rus@x>lD#VW%4 zo>RgpQ9>?s5{MH0>H8>XVv1rrkfJ2eu3k)6J{uswd0jgMo?izd z$UBZKBY0mr;EyF9M=R9b=Ty+P=_S*DeceMaJH_S-SEqU3e5}9AFz?&>vPI1sy&!YTQ`0u`E6Q_k-G)Vc3H^*rqN%tQtt=>!Y$1YSKr? z9H8OJsnasp8uuQbR0UT$zZz-(n%>o?rW{=kn|lWOL-Osn1mH?T{?Ta4H)&Y2kD4hT zWl}{>Ys7c6J5c`ojDyiL#3TrrgD$V%KVONapG(9rycU%cN;9WhdD@g^w*^X|hK1Vv zE=Sxz8;i(@v)2Gs(I0F6rUN2tL{~swtQOggqWT{vl>4ozP&!OC{o~|2>=B5n-S425>VjV0JW=gDhVK)vH zkn=T6I{LZ;9nUX~zujv;@MbOV0vfAkxUp-CwpA||o=FG30&My4eyW@18qTmSO;*?N z()doUn0Q|A+$~`u{~AqRqj3cPIs&nz(4-`fa?NJTN8;0`H8DP$^!X&fyBRwWaZ3E( zqI?5PZttLxD=qqo3NtwcSC9_cGFS9wh!#`FDM4MOsbLDxx6I*toNqOPNpvggV^WPA zI)1J63NaGfvgM;WyS9Ar0rrnpo;7uogJ3;aA}_o?l=X9 zm6Gbt5pEqlj=(||ZehRE6jVKl;g)QiK2S8*mrt*>Q|iST$_VCT4A5EW@RM@aLp3ix zR}G!p)AKI+o}xTk-s;aOAaL?v^q7a=L-E^&Phfgp|#oeNMlwz&qqhf!6BGsZ8?aijR#D@;BdiQC; z@ZvotMZR*@mn8m<9Va(NJ^c*$V4Bb^nSfG`X0&atv8Coe`r%ib6P0mp_?@r& z^a5k+a9xJf6cZZOuOs?AV$a`nWDhah24%^f5Bwm`-vV9`VtFB(X0IH=}!;J&h5A>X4abnBlI=0jHyO^R`>Q~k|I zJ?s#q1B?S}J2w2mjyMK>XuCRfEdyScEql^)4}GmTQ|81V|63&1uaJruWq%hGiLS0+ z^M22ehE?rqny&a^wGDI7AK6Hl_KQ7<=Y zpf37&UT#NvV~wSE_-ZLF1ngBSuk~5t4R4f{ z<%2)b4orpU?+mn-k2G^Aeue{DW09p&oyiQ9#_PkUa7wdqR|jKyI&-IAGJ4(k>sMQ# z`CU(O3osRc1xMNie?i3>_OUQ(9Q{jxWeEhT`RqJ;H~N_jGv;&R*R{l8lr zG3rwe+>HmR11TOH0pxOm#rbH4gW36kB}3&cpAT=j7CZR4Te6x~AzO9;Zujc~C3{q) ztZW{TuRO9KQR;o`j?vAs>@(@lPrM9J@b|DJL`(Z5La)W;ePRccza2&&O62n-fr!RgUZO&X$g3M_)m;@(F=1Zf(3Rf2lefDh`TEcqnL>s>54IockDy>M4H^P=)x-`+}1{I47VC8 z7A7(WIN@v>Ykt{sFmu8!=!LhPkQLv3mGhkE^$4H#m}H1ozzilZ&9&`|qd2u)Owkwv zc`a`m8Mo%^rwQO|_+^0FP`)!~Ra#NOXSX}Rwj(siSc>>Nea9BHadj`rOP)P*_r7ir z(evT9h@AfOieRgIpQg`Y4c+g;Pr(imrKaL4ocF2F-Q6%M@g#7Jiupw>%h+I`Cn1^h z`c{Nps9{|8-YEuTZre_t+<5uDlt)KYWV9-UFq+4Z6P2XpBQMD@zIf6fDFa%>#*fWk1A~>jZF4GTe0&BeRiuZO&^iw)5}4^d%TTt zKd5;&(j+tc?`MsVv07nm|SH*B)N>9i<-~;ZW#ViToZ+ z0Dz8u5E?mz_=s;aqD|2~8eI;u zoYG!s&=8d@-Z9Uil{ggh=|A?h+uUj5gcqjD2w{g&+z3GetSriBL@Dg6BsQ^S=s0H846Hz zcW~N~ba(C?fS4W1V|66WGeZ&hgD%YN`0syf;!Qu_&mD4d)8|qgUIj)ocYb`qmmejY zSj1vlIyx#)p0c#<->zku$@Ryht&DH7t?YkPfx|n|HTWGzP#Q1r0 zbs~W(`lTU!G9BJ*^q0ZO?2x+M6zslIX(4SoTENL5uUB!XEBvKW^(%^#xj=I-$d2am z-b(JZ18K+HR??|oiIKsFQxKvti(@6-5eT3je1R?>ar}(-8u56>I!X`YH5q8XLY7#t?D#FSvh!` zs*A^jZ$8hC>7Uw8c#wIZWmXS=X_%1XAj6Ydmnzeww_HS+sn7`*9t{j@ycObC&3XMK>ozcXl_cOJ7n3hYRz)xsaukF^S5^oR3m5Ey`TwhEvKrD zLhkTLUm-Q6Rdglr1*%_!;^^+~Z*bORjoH!c$R}4$nxDSlG!6x{RZ}luo^5qE+{#Lw zAua{bTg6LSG)Zt}?9WX4*gxx{{&gMi)Zjm;9q?+yyH#a+lSnIM`E@?VqJ1#%n{by z#3vuDn@y~prrOdSShXR6{U<-n-py)XfB0W1<`%$?F2GZ z&6K)MXPvavDc|PGqfx?6vOt%D*j6%wOCIS;-zu@h%%+C;s|P-3)cCbh7JU9YB_jmk z^gk*=(jc!oEHDSiP)eoM){-pc7!7$%jype`b$>28p;hyepesHCDIsfZ{d2%`Sqz2Eosw{y<(-1l`+ zyT0qDeyRH&V$~6<1FH|ar9g( zM*ismqln_~_=r(aQ)%D1RT8s^-LDXUe~mzjQ}A@`zf$wq3(VbV+&|6@rsahyhGYxy zltffPy_=WC1DT?hBBK@i(hi0+HUUd1@-Dtjb`ih0|86BrG?QsiO4Oi(`ewDBV5GQ0 zu;V!9vCQxwRW;B(g+)ni5J%NnK!{@dr`6?AZjoCWYiLxuqmN;PN^AW=2SyAZAhwI>*k_g5;8M2fws}Bh6 zq@V#xj$($AL9fMiypibcN4=jHU=&IJ0chFZE(>uxDT1NAH3{Norlkm8h()&P!~Hl~ z+2$Q$zFV4Gg>H_zV2i!f@dII1J%M#Xv(X6|%b46BFW-5a_($8FAREcUrn7!{I|Vo; zVjn(Ik?D(w)(>zQID}zZXA5*dcUCN5@H!@ZrGrZa-<(NKB(oFe=qc1K?L;!w%TGtX z5*Ki*z`a9~V{ROJ$5Vfr{ASfK3$;)Z^ ze*euGa_m&nf%#Ng;O7_T+aF^Of5gdlEXQJ3)&fp#f-Cq9>ietUb@)tj>zuIv;q&BX(Fu3W#-h#A@e~%ctuy;i{w6lf`8wfqn^*?CV<#F+ zX+0HsAi)+rp|o=x?_`&)!&CHzmc5SC%3|5<9ob2zzA38T6{NcPPb-1W8l&jef654a zEc9jj8aTjF8>FisJe`oy!qM(A`tD;uXj4Q=Z8LAyrkzrgnN5jx{(giiRYxkF=ry_T zXn*)p@{qhJ<7H6@vwp4ezRM2loqaog$1&_m0o0;aaz0x(%On@}P<`X8W@D~Qua~~Z z!gNIOZ#jGd^trFvA> zyPURW+fQurR318Ba-_EFzre;hqR%u0snQ=i0F|Zq3O}W`NRZs(HPSMtn%b6U0LHC9 zO5>Rx!n-$FOuQZtCGNjBh|0}p_4(OjX@;mPy;EyN=&7)@*-YZ1s^VF3J}kPOwaU!_@cc#Hi!t$p{ng5(jN?H`g;eJ@;0 zh}COR@KW=3r)BTop3F)5l}k`NdxalHw>a{I2mc@7X5(-u6^Jv+@AkXC*Z%?511aCL ziu{uOVNld{J#+2gNtb>=oKC$B|THWo?087i}ZR|-IvlD+{KNl?>rY|iY zMa*{9t?bS|QR&x^fJcQzQr-8y?Oi$7m%BPnvD{ysQYY79dE%TvRbi3kFwhx!>+^9o zT3{z4n5r{zL1W=yJ;RcdAr9-P+qw+_uPzxcBfpK($iK+y>^dBq7i2fvkBra!cDgL# z3G;Au4DtKBsJ-{=G7#qSi}kk2?mkaV`Y1g8f=IFXHT+V_AXY09+n*10}wkcS)akPH<0r z2Sgdtz6{e*PsvKXX0vK2x5;U0S|8mxRGx)o4mL@-v+?gPIm1O6UUA2!?20ITyuh+O zeEg)FZZSpDX7Ee%59ZGtoXB30#9$UoQa_<4*^zqslH-?c3yFUG6=U~Zslea=wkz_k z;n`1K$Ds#CUqkK`ip2{4f?P7{o-6?`O@vFni)V*mdom&(-W7LkV?>!VP*v()v)_c! zIsF;iSeZgJAowv$Xe1I=B-yef&XgNG3v7SSNTy(vA2ByFA#?PL_5aN@4>QV+X4o!; zf^swZL=i&IIlno;CCH_ucC&u(#8Ae8MBQ>Rr)Y8DVlehlCQ@YyDpal_4t>o96R|Sr zhI%K8f<1^{2Hof+-cp*8frMC$B<|sXFfQBQIf(UGquOq3TacX zNr!b!1{9!|BA~vvtwh*#zN_Udk9OfXpNl+_Bh#P0s3aDT^rYM>iHK3VUm4djx=1PH{f64BjPzn%F{iEYK)j3O)77<06`T5Y~AB5rg&Q4VSy_e4)CO3uG z{PR`+NZ9l{rtkQMOXOw*segtEG&-JJ&E<~WMriamQmNXh3Tbi zznum+gj(!6Io5aIpyZeXW|<}Hl(hW97to^lw*-A|4^nT*wEX6 zj_>b%qg~5-RCh@5=RH(@dofhY`*4|S5vUa^7PcDXHD#q=e`2`lfjHwkobFNLE!Lrk zI=&cDtXUUJ*XFyRuS#`>t~v8){M(K*&Cs4bv&R
>`4jW9=0zSp|^%MMQTU;TA^Pk`=_ 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

;NnXwwJObH7Vcn7d%&L13baB|1v+=2BGCfYu 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 Bua?5D5rt_MXx~lAsm<~ci>^W3^8wY`rlKJI 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 z(null) + const [error, setError] = useState(null) + + useEffect(() => { + const ctrl = new AbortController() + fetchBootstrap(ctrl.signal) + .then(setData) + .catch((e) => { + if (e.name !== 'AbortError') setError(String(e.message ?? e)) + }) + return () => ctrl.abort() + }, []) + + if (error) { + return ( +

+
◆
+
Bellingham Tidal Observatory
+
Failed to load NOAA data — {error}
+
+ ) + } + + if (!data) { + return ( +
+
◆
+
Bellingham Tidal Observatory
+
fetching noaa predictions…
+
+ ) + } + + return +} diff --git a/frontend/src/Dashboard.tsx b/frontend/src/Dashboard.tsx new file mode 100644 index 0000000..bd2cfd3 --- /dev/null +++ b/frontend/src/Dashboard.tsx @@ -0,0 +1,194 @@ +import { useEffect, useMemo, useState } from 'react' +import type { Bootstrap, StationData } from './types' +import { ACCENTS, type Tweaks, useTweaks } from './lib/tweaks' +import { fmtClock, pacificWallMs, RANGE_KEYS, stationSnapshot } from './tides' +import type { SunMarks } from './components/Charts' +import { Sidebar, type SavedView } from './components/Sidebar' +import { Toolbar } from './components/Toolbar' +import { KpiStrip } from './components/KpiStrip' +import { StationTile } from './components/StationTile' +import { FocusPanel } from './components/FocusPanel' +import { ComparePanel } from './components/ComparePanel' +import { TweaksPanel } from './components/Tweaks' + +const DENSITIES = ['dense', 'compact', 'comfortable', 'spacious'] as const +const REGION_ORDER = ['central', 'south', 'islands', 'north'] as const + +function regionSub(k: string) { + if (k === 'central') return 'bellingham bay · main waterfront' + if (k === 'south') return 'south of fairhaven' + if (k === 'islands') return 'lummi · lopez · orcas' + if (k === 'north') return 'lummi bay through blaine' + return '' +} +function trendSub(k: string) { + if (k === 'rising') return 'flood tide · water building' + if (k === 'falling') return 'ebb tide · water dropping' + if (k === 'slack') return 'near-zero current' + return '' +} + +const SAVED_VIEWS: SavedView[] = [ + { id: 'all-day', name: 'All stations · 24h', meta: 'default' }, + { id: 'bhm-week', name: 'Bellingham · 7d', meta: 'focus' }, + { id: 'islands', name: 'San Juans compare', meta: 'compare' }, + { id: 'north-tides', name: 'North county', meta: 'region' }, +] + +function GroupHeader({ label, count, sub }: { label: string; count: number; sub?: string }) { + return ( +
+ + {label} + {count} + {sub && {sub}} + +
+ ) +} + +export function Dashboard({ data }: { data: Bootstrap }) { + const [t, setTweak] = useTweaks() + const [focusId, setFocusId] = useState(data.stations[0]?.id ?? '') + // "now" is anchored at the server timestamp and advanced one second per tick + // while auto-refresh is on (pure: no Date/performance reads during render). + const [now, setNow] = useState(data.now) + + useEffect(() => { + if (!t.autoRefresh) return + const id = setInterval(() => setNow((n) => n + 1000), 1000) + return () => clearInterval(id) + }, [t.autoRefresh]) + + const minuteBucket = Math.floor(now / 60000) + + // Keyboard shortcuts + useEffect(() => { + function onKey(e: KeyboardEvent) { + const el = e.target as HTMLElement | null + if (el && (el.tagName === 'INPUT' || el.tagName === 'TEXTAREA')) return + if (e.key >= '1' && e.key <= '6') setTweak('range', RANGE_KEYS[+e.key - 1]) + else if (e.key === '[') { + const i = DENSITIES.indexOf(t.density) + setTweak('density', DENSITIES[Math.max(0, i - 1)]) + } else if (e.key === ']') { + const i = DENSITIES.indexOf(t.density) + setTweak('density', DENSITIES[Math.min(DENSITIES.length - 1, i + 1)]) + } else if (e.key === 'c' || e.key === 'C') setTweak('showCompare', !t.showCompare) + else if (e.key === 'f' || e.key === 'F') setTweak('showFocus', !t.showFocus) + else if (e.key === 'r' || e.key === 'R') setNow((n) => n + 1000) + } + window.addEventListener('keydown', onKey) + return () => window.removeEventListener('keydown', onKey) + }, [t.density, t.showCompare, t.showFocus, setTweak]) + + const focusStn = data.stations.find((s) => s.id === focusId) ?? data.stations[0] + + const sorted = useMemo(() => { + const snaps = data.stations.map((s) => [s, stationSnapshot(s, now)] as const) + snaps.sort((a, b) => { + if (t.sortBy === 'name') return a[0].name.localeCompare(b[0].name) + if (t.sortBy === 'height') return b[1].height - a[1].height + if (t.sortBy === 'range') return b[1].dayMax - b[1].dayMin - (a[1].dayMax - a[1].dayMin) + if (t.sortBy === 'trend') { + const order = { rising: 0, slack: 1, falling: 2 } + return order[a[1].trend] - order[b[1].trend] + } + return 0 + }) + return snaps.map(([s]) => s) + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [data.stations, t.sortBy, minuteBucket]) + + const groups = useMemo(() => { + if (t.groupBy === 'region') { + const map: Record = {} + for (const s of sorted) (map[s.group] ||= []).push(s) + return REGION_ORDER.map((k) => ({ label: k.toUpperCase(), items: map[k] || [], sub: regionSub(k) })).filter((g) => g.items.length > 0) + } + if (t.groupBy === 'trend') { + const map: Record = { rising: [], falling: [], slack: [] } + for (const s of sorted) map[stationSnapshot(s, now).trend].push(s) + return (['rising', 'slack', 'falling'] as const) + .map((k) => ({ label: k.toUpperCase(), items: map[k] || [], sub: trendSub(k) })) + .filter((g) => g.items.length > 0) + } + return [{ label: null as string | null, items: sorted, sub: undefined }] + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [sorted, t.groupBy, minuteBucket]) + + function loadView(id: string) { + if (id === 'all-day') { + setTweak({ range: '24H', showCompare: false, showFocus: true, groupBy: 'none' }) + setFocusId(data.stations[0].id) + } else if (id === 'bhm-week') { + setTweak({ range: '7D', showCompare: false, showFocus: true }) + setFocusId('9449211') + } else if (id === 'islands') { + setTweak({ range: '24H', showCompare: true, groupBy: 'region' }) + } else if (id === 'north-tides') { + setTweak({ range: '24H', showCompare: false, groupBy: 'region' }) + } + } + + const cols = t.density === 'dense' ? 5 : t.density === 'compact' ? 4 : t.density === 'comfortable' ? 3 : 2 + + const sun: SunMarks = useMemo( + () => ({ + rise: pacificWallMs(data.date.iso, data.sun_moon.sunrise), + set: pacificWallMs(data.date.iso, data.sun_moon.sunset), + riseLabel: data.sun_moon.sunrise, + setLabel: data.sun_moon.sunset, + }), + [data.date.iso, data.sun_moon], + ) + + const rootStyle = { '--tt-stroke': ACCENTS[t.accent] } as React.CSSProperties + + return ( +
+ {t.photoBg &&
} +
+
+ + + +
+ + + + + {t.showCompare && } + +
+ {groups.map((g, gi) => ( +
+ {g.label && } +
+ {g.items.map((s) => ( + + ))} +
+
+ ))} +
+ + {t.showFocus && focusStn && ( + + )} + +
+ tidal observatory · seanmichael.dev/tides + · + built on FastAPI · React · noaa coops feed + · + real hi/lo predictions, half-cosine interpolated (Salish Sea mixed semi-diurnal) + · + v0.3 · {data.date.iso} +
+
+ + +
+ ) +} diff --git a/frontend/src/api.ts b/frontend/src/api.ts new file mode 100644 index 0000000..30b45e8 --- /dev/null +++ b/frontend/src/api.ts @@ -0,0 +1,20 @@ +import type { Bootstrap } from './types' + +async function json(res: Response): Promise { + if (!res.ok) { + let detail = `${res.status} ${res.statusText}` + try { + const body = await res.json() + if (body?.detail) detail = String(body.detail) + } catch { + /* keep status text */ + } + throw new Error(detail) + } + return (await res.json()) as T +} + +/** Load station metadata + real NOAA hi/lo predictions + sun/moon in one call. */ +export async function fetchBootstrap(signal?: AbortSignal): Promise { + return json(await fetch('/api/bootstrap', { signal })) +} diff --git a/frontend/src/components/Charts.tsx b/frontend/src/components/Charts.tsx new file mode 100644 index 0000000..f5c6a60 --- /dev/null +++ b/frontend/src/components/Charts.tsx @@ -0,0 +1,302 @@ +// SVG chart primitives in the glacier vocabulary — ported from tides-charts.jsx, +// driven by real NOAA extrema (epoch ms). +import { useId } from 'react' +import type { Extremum } from '../types' +import { eventsIn, fmtTime, heightAt, sample } from '../tides' + +const STROKE = 'var(--tt-stroke)' +const CURRENT_DOT = 'oklch(0.95 0.02 220)' +const GRID_LINE = 'rgba(170, 210, 245, 0.10)' +const AXIS_LABEL = 'rgba(220, 232, 245, 0.55)' + +const DAY = 24 * 60 * 60 * 1000 + +function niceTicks(lo: number, hi: number, count = 4): number[] { + const span = hi - lo + const step0 = span / count + const mag = Math.pow(10, Math.floor(Math.log10(step0))) + const norm = step0 / mag + let step: number + if (norm < 1.5) step = 1 * mag + else if (norm < 3) step = 2 * mag + else if (norm < 7) step = 5 * mag + else step = 10 * mag + const ticks: number[] = [] + const start = Math.ceil(lo / step) * step + for (let v = start; v <= hi; v += step) ticks.push(v) + return ticks +} + +export function Spark({ + extrema, + from, + to, + now, + w = 220, + h = 44, + style = 'area', +}: { + extrema: Extremum[] + from: number + to: number + now: number + w?: number + h?: number + style?: 'line' | 'area' +}) { + const gradId = useId() + const pts = sample(extrema, from, to, Math.max(32, Math.floor(w / 4))) + let lo = Infinity + let hi = -Infinity + for (const p of pts) { + if (p.v < lo) lo = p.v + if (p.v > hi) hi = p.v + } + lo -= 0.4 + hi += 0.4 + const span = hi - lo || 1 + const xy = pts.map((p, i) => { + const x = (i / (pts.length - 1)) * w + const y = h - ((p.v - lo) / span) * h + return [x, y] as const + }) + const linePts = xy.map(([x, y]) => `${x.toFixed(1)},${y.toFixed(1)}`).join(' ') + const fillPts = `0,${h} ${linePts} ${w},${h}` + const tFrac = (now - from) / (to - from) + const nowX = Math.max(0, Math.min(1, tFrac)) * w + const nowY = h - ((heightAt(extrema, now) - lo) / span) * h + return ( + + + + + + + + {style === 'area' && } + + + + + ) +} + +export interface SunMarks { + rise: number | null + set: number | null + riseLabel: string + setLabel: string +} + +export function BigChart({ + series, + from, + to, + now, + w = 880, + h = 280, + showGrid = true, + showSun = true, + sun, + showEvents = true, + showCurrent = true, + style = 'area', + hoverT = null, +}: { + series: { extrema: Extremum[] }[] + from: number + to: number + now: number + w?: number + h?: number + showGrid?: boolean + showSun?: boolean + sun?: SunMarks + showEvents?: boolean + showCurrent?: boolean + style?: 'line' | 'area' + hoverT?: number | null +}) { + const gradId = useId() + if (!series || series.length === 0) return null + const padL = 38 + const padR = 14 + const padT = 12 + const padB = 22 + const innerW = w - padL - padR + const innerH = h - padT - padB + + let lo = Infinity + let hi = -Infinity + const allSamples = series.map((s) => sample(s.extrema, from, to, Math.max(64, Math.floor(innerW / 3)))) + for (const ser of allSamples) + for (const p of ser) { + if (p.v < lo) lo = p.v + if (p.v > hi) hi = p.v + } + lo = Math.floor(lo - 0.5) + hi = Math.ceil(hi + 0.5) + const spanV = hi - lo || 1 + const xOf = (t: number) => padL + ((t - from) / (to - from)) * innerW + const yOf = (v: number) => padT + (1 - (v - lo) / spanV) * innerH + const yTicks = niceTicks(lo, hi, 5) + const meanV = (lo + hi) / 2 + + const colorFor = (i: number) => { + const hue = 220 + ((i % 5) - 2) * 22 + return `oklch(0.78 0.10 ${hue})` + } + + const single = series.length === 1 + const spanT = to - from + + // X ticks + const xTicks: number[] = [] + let step: number + if (spanT <= 2 * 60 * 60 * 1000) step = 30 * 60 * 1000 + else if (spanT <= 8 * 60 * 60 * 1000) step = 60 * 60 * 1000 + else if (spanT <= DAY * 1.2) step = 3 * 60 * 60 * 1000 + else if (spanT <= DAY * 4) step = 12 * 60 * 60 * 1000 + else if (spanT <= DAY * 9) step = DAY + else step = DAY * 7 + const first = Math.ceil(from / step) * step + for (let t = first; t <= to; t += step) xTicks.push(t) + + const sunOverlays: React.ReactNode[] = [] + if (showSun && sun && spanT <= DAY * 1.2) { + if (sun.rise != null && sun.rise >= from && sun.rise <= to) { + sunOverlays.push( + + + ☼ rise {sun.riseLabel} + , + ) + } + if (sun.set != null && sun.set >= from && sun.set <= to) { + sunOverlays.push( + + + ☾ set {sun.setLabel} + , + ) + } + if (sun.rise != null && sun.set != null) { + const dayLo = Math.max(from, sun.rise) + const dayHi = Math.min(to, sun.set) + if (dayHi > dayLo) + sunOverlays.push() + } + } + + return ( + + + + + + + + {showGrid && yTicks.map((v, i) => )} + {showGrid && xTicks.map((t, i) => )} + + + + mean {meanV.toFixed(1)}ft + + + {sunOverlays} + + {allSamples.map((ser, si) => { + const stroke = single ? STROKE : colorFor(si) + const linePts = ser.map((p) => `${xOf(p.t).toFixed(1)},${yOf(p.v).toFixed(1)}`).join(' ') + const fillPts = `${xOf(ser[0].t)},${padT + innerH} ${linePts} ${xOf(ser[ser.length - 1].t)},${padT + innerH}` + return ( + + {style === 'area' && single && } + + + ) + })} + + {showEvents && + single && + eventsIn(series[0].extrema, from, to).map((e, i) => { + const x = xOf(e.t) + const y = yOf(e.height) + const yOff = e.kind === 'H' ? -8 : 14 + return ( + + + + {e.kind === 'H' ? '▲' : '▼'} {e.height.toFixed(1)}ft · {fmtTime(e.t)} + + + ) + })} + + {showCurrent && single && now >= from && now <= to && ( + + + + + )} + + {hoverT != null && hoverT >= from && hoverT <= to && ( + + )} + + {yTicks.map((v, i) => ( + + {v.toFixed(0)}ft + + ))} + {xTicks.map((t, i) => { + const lbl = + spanT <= DAY * 1.2 ? fmtTime(t) : spanT <= DAY * 9 ? `d${Math.round((t - from) / DAY)}` : `w${Math.floor((t - from) / (DAY * 7)) + 1}` + return ( + + {lbl} + + ) + })} + + + + ) +} + +export function RangeBar({ dayMin, dayMax, height }: { dayMin: number; dayMax: number; height: number }) { + const span = dayMax - dayMin || 1 + const pct = Math.max(0, Math.min(1, (height - dayMin) / span)) + return ( +
+ {dayMin.toFixed(1)} +
+
+
+
+ {dayMax.toFixed(1)} +
+ ) +} + +export function TideDial({ rate, trend, size = 110 }: { rate: number; trend: string; size?: number }) { + const cx = size / 2 + const cy = size - 8 + const r = size / 2 - 8 + const norm = Math.max(-1, Math.min(1, rate / 3)) + const angle = -Math.PI / 2 + norm * (Math.PI / 2 - 0.05) + const x = cx + Math.cos(angle) * r + const y = cy + Math.sin(angle) * r + return ( + + + + + + + {trend.toUpperCase()} + + + ) +} diff --git a/frontend/src/components/ComparePanel.tsx b/frontend/src/components/ComparePanel.tsx new file mode 100644 index 0000000..d8f12ed --- /dev/null +++ b/frontend/src/components/ComparePanel.tsx @@ -0,0 +1,46 @@ +import type { StationData } from '../types' +import { RANGES } from '../tides' +import { BigChart, type SunMarks } from './Charts' + +const MIN = 60 * 1000 + +export function ComparePanel({ + stations, + now, + range, + showSun, + showGrid, + sun, +}: { + stations: StationData[] + now: number + range: string + showSun: boolean + showGrid: boolean + sun: SunMarks +}) { + const mins = RANGES[range].mins + const from = now - mins * 0.4 * MIN + const to = now + mins * 0.6 * MIN + return ( +
+
+ COMPARE OVERLAY · all stations + {RANGES[range].label} · normalized to MLLW +
+ +
+ {stations.map((s, i) => { + const hue = 220 + ((i % 5) - 2) * 22 + return ( +
+ + {s.code} + {s.name} +
+ ) + })} +
+
+ ) +} diff --git a/frontend/src/components/FocusPanel.tsx b/frontend/src/components/FocusPanel.tsx new file mode 100644 index 0000000..2a15efb --- /dev/null +++ b/frontend/src/components/FocusPanel.tsx @@ -0,0 +1,211 @@ +import { useMemo, useRef, useState } from 'react' +import type { Bootstrap, StationData, SunMoon } from '../types' +import { fmtTime, heightAt, RANGES, rateAt, stationSnapshot } from '../tides' +import { BigChart, type SunMarks, TideDial } from './Charts' + +const MIN = 60 * 1000 + +function HourTable({ stn, now }: { stn: StationData; now: number }) { + const rows = useMemo(() => { + const out = [] + for (let i = 0; i < 12; i++) { + const t = now + i * 60 * MIN + const h = heightAt(stn.extrema, t) + const r = rateAt(stn.extrema, t) + const glyph = Math.abs(r) < 0.15 ? '—' : r > 0 ? '↗' : '↘' + out.push({ t, h, r, glyph, isNow: i === 0 }) + } + return out + }, [stn, now]) + const hi = Math.max(...rows.map((r) => r.h)) + const lo = Math.min(...rows.map((r) => r.h)) + const span = hi - lo || 1 + return ( +
+
+ TIME + HEIGHT + RATE + · + VISUAL +
+ {rows.map((r, i) => ( +
+ {r.isNow ? 'now' : fmtTime(r.t)} + + {r.h.toFixed(2)} + ft + + + {r.glyph} {Math.abs(r.r).toFixed(2)} + + + + +
+ ))} +
+ ) +} + +function SunMoonPanel({ sm }: { sm: SunMoon }) { + return ( +
+
+ SUN · MOON + {sm.moon_glyph} today +
+
+
+
+
+
+ {Math.round(sm.moon_illum * 100)} + % lit +
+
+
+
+
SUN
+
+ ↑ {sm.sunrise} +
+
+ ☀ {sm.noon} +
+
+ ↓ {sm.sunset} +
+
+
+
MOON
+
+ {sm.moon_glyph} {sm.moon_phase} +
+
+ {Math.round(sm.moon_illum * 100)}% illuminated +
+
+
+
+ ) +} + +function StationInfo({ stn, datum, now }: { stn: StationData; datum: string; now: number }) { + const snap = stationSnapshot(stn, now) + const cells = [ + { k: 'datum', v: datum, s: 'reference' }, + { k: 'type', v: stn.predictions === 'Harmonic' ? 'harm' : 'sub', s: stn.predictions.toLowerCase() }, + { k: 'lat', v: stn.lat.toFixed(3), s: '°N' }, + { k: 'lon', v: stn.lon.toFixed(3), s: '°W' }, + { k: 'next ▲', v: snap.nextHigh ? snap.nextHigh.height.toFixed(1) : '—', s: snap.nextHigh ? fmtTime(snap.nextHigh.t) : '' }, + { k: 'next ▼', v: snap.nextLow ? snap.nextLow.height.toFixed(1) : '—', s: snap.nextLow ? fmtTime(snap.nextLow.t) : '' }, + ] + return ( +
+
+ STATION + {stn.id} +
+
+ {cells.map((c, i) => ( +
+
{c.k}
+
{c.v}
+
{c.s}
+
+ ))} +
+
+ ) +} + +export function FocusPanel({ + stn, + data, + now, + range, + chartStyle, + showSun, + showGrid, + sun, +}: { + stn: StationData + data: Bootstrap + now: number + range: string + chartStyle: 'line' | 'area' + showSun: boolean + showGrid: boolean + sun: SunMarks +}) { + const snap = useMemo(() => stationSnapshot(stn, now), [stn, now]) + const mins = RANGES[range].mins + const from = now - mins * 0.4 * MIN + const to = now + mins * 0.6 * MIN + const trendGlyph = snap.trend === 'rising' ? '↗' : snap.trend === 'falling' ? '↘' : '→' + + const [hoverT, setHoverT] = useState(null) + const chartRef = useRef(null) + const onMove = (e: React.MouseEvent) => { + const r = chartRef.current!.getBoundingClientRect() + const x = e.clientX - r.left + const ratio = (x - 38) / (r.width - 38 - 14) + if (ratio < 0 || ratio > 1) { + setHoverT(null) + return + } + setHoverT(from + ratio * (to - from)) + } + const hoverH = hoverT != null ? heightAt(stn.extrema, hoverT) : null + + return ( +
+
+
+
{stn.code}
+
{stn.name}
+
+ {stn.lat}, {stn.lon} · {stn.area} +
+
+
+ +
+
+ {snap.height.toFixed(2)} + ft +
+
+ {trendGlyph} {snap.trend} · {Math.abs(snap.rate).toFixed(2)}ft/h +
+
+ day range {(snap.dayMax - snap.dayMin).toFixed(1)}ft + · + {stn.predictions.toLowerCase()} +
+
+
+
+ +
setHoverT(null)}> + + {hoverT != null && hoverH != null && ( +
+ {fmtTime(hoverT)} + + {hoverH.toFixed(2)} + ft + +
+ )} +
+ +
+ + + +
+
+ ) +} diff --git a/frontend/src/components/KpiStrip.tsx b/frontend/src/components/KpiStrip.tsx new file mode 100644 index 0000000..229bb72 --- /dev/null +++ b/frontend/src/components/KpiStrip.tsx @@ -0,0 +1,49 @@ +import { useMemo } from 'react' +import type { Bootstrap } from '../types' +import { fmtTime, stationSnapshot } from '../tides' + +export function KpiStrip({ data, now }: { data: Bootstrap; now: number }) { + const cells = useMemo(() => { + const snaps = data.stations.map((s) => stationSnapshot(s, now)) + const meanH = snaps.reduce((a, b) => a + b.height, 0) / snaps.length + const rising = snaps.filter((s) => s.trend === 'rising').length + const falling = snaps.filter((s) => s.trend === 'falling').length + const slack = snaps.filter((s) => s.trend === 'slack').length + const dayMin = Math.min(...snaps.map((s) => s.dayMin)) + const dayMax = Math.max(...snaps.map((s) => s.dayMax)) + const nextH = snaps + .map((s) => s.nextHigh) + .filter((e): e is NonNullable => !!e) + .sort((a, b) => a.t - b.t)[0] + const nextL = snaps + .map((s) => s.nextLow) + .filter((e): e is NonNullable => !!e) + .sort((a, b) => a.t - b.t)[0] + const sm = data.sun_moon + + return [ + { lbl: 'MEAN HEIGHT', v: meanH.toFixed(1), u: 'ft', sub: `across ${snaps.length} stations` }, + { lbl: 'TIDE RANGE', v: (dayMax - dayMin).toFixed(1), u: 'ft', sub: `${dayMin.toFixed(1)} → ${dayMax.toFixed(1)} ft today` }, + { lbl: 'NEXT HIGH', v: nextH ? fmtTime(nextH.t) : '—', u: '', sub: nextH ? `${nextH.height.toFixed(1)}ft` : '' }, + { lbl: 'NEXT LOW', v: nextL ? fmtTime(nextL.t) : '—', u: '', sub: nextL ? `${nextL.height.toFixed(1)}ft` : '' }, + { lbl: 'MOON', v: sm.moon_glyph, u: '', sub: `${sm.moon_phase.toLowerCase()} · ${Math.round(sm.moon_illum * 100)}%`, glyph: true }, + { lbl: 'SUN', v: sm.sunrise, u: '↗', sub: `set ${sm.sunset}` }, + { lbl: 'STATIONS', v: String(snaps.length), u: '', sub: `${rising}↗ ${falling}↘ ${slack}∙` }, + ] + }, [data, now]) + + return ( +
+ {cells.map((c, i) => ( +
+
{c.lbl}
+
+ {c.v} + {c.u && {c.u}} +
+
{c.sub}
+
+ ))} +
+ ) +} diff --git a/frontend/src/components/Sidebar.tsx b/frontend/src/components/Sidebar.tsx new file mode 100644 index 0000000..23f344d --- /dev/null +++ b/frontend/src/components/Sidebar.tsx @@ -0,0 +1,90 @@ +import type { StationData } from '../types' +import { stationSnapshot } from '../tides' + +const NAV = [ + { icon: '~', label: 'Home' }, + { icon: '/', label: 'Blog' }, + { icon: '%', label: 'Digests' }, + { icon: '#', label: 'Projects' }, + { icon: '@', label: 'About' }, +] + +export interface SavedView { + id: string + name: string + meta: string +} + +export function Sidebar({ + stations, + focusId, + now, + savedViews, + onSelect, + onLoadView, +}: { + stations: StationData[] + focusId: string + now: number + savedViews: SavedView[] + onSelect: (id: string) => void + onLoadView: (id: string) => void +}) { + return ( +
+ ) +} diff --git a/frontend/src/components/StationTile.tsx b/frontend/src/components/StationTile.tsx new file mode 100644 index 0000000..4cef28b --- /dev/null +++ b/frontend/src/components/StationTile.tsx @@ -0,0 +1,98 @@ +import { useMemo } from 'react' +import type { Density } from '../lib/tweaks' +import type { StationData } from '../types' +import { fmtTime, RANGES, stationSnapshot } from '../tides' +import { RangeBar, Spark } from './Charts' + +const MIN = 60 * 1000 + +export function StationTile({ + stn, + density, + range, + chartStyle, + isFocus, + now, + onSelect, +}: { + stn: StationData + density: Density + range: string + chartStyle: 'line' | 'area' + isFocus: boolean + now: number + onSelect: (id: string) => void +}) { + const snap = useMemo(() => stationSnapshot(stn, now), [stn, now]) + const mins = RANGES[range].mins + const from = now - mins * 0.6 * MIN + const to = now + mins * 0.4 * MIN + const trendGlyph = snap.trend === 'rising' ? '↗' : snap.trend === 'falling' ? '↘' : '→' + + const showAxis = density !== 'dense' + const showFooter = density !== 'dense' + const showRangeBar = density === 'comfortable' || density === 'spacious' + const showMeta = density === 'spacious' + const sparkH = density === 'dense' ? 34 : density === 'compact' ? 40 : density === 'spacious' ? 64 : 52 + + return ( + + ) +} diff --git a/frontend/src/components/Toolbar.tsx b/frontend/src/components/Toolbar.tsx new file mode 100644 index 0000000..56b0262 --- /dev/null +++ b/frontend/src/components/Toolbar.tsx @@ -0,0 +1,129 @@ +import type { SetTweak, Tweaks } from '../lib/tweaks' +import type { Bootstrap } from '../types' +import { RANGE_KEYS } from '../tides' + +const DENSITIES = ['dense', 'compact', 'comfortable', 'spacious'] as const +const SORTS = [ + { id: 'name', lbl: 'name' }, + { id: 'height', lbl: 'height' }, + { id: 'range', lbl: 'range' }, + { id: 'trend', lbl: 'trend' }, +] as const + +const densityGlyph = (d: string) => (d === 'dense' ? '▦▦' : d === 'compact' ? '▦' : d === 'comfortable' ? '▢▢' : '▢') + +export function Toolbar({ t, setTweak, data, clock }: { t: Tweaks; setTweak: SetTweak; data: Bootstrap; clock: string }) { + return ( +
+
+
+
~/TIDES
+

Bellingham Tidal Observatory

+

+ Real-time tide heights and solunar conditions across {data.stations.length} NOAA stations on the inner Salish Sea — Bellingham Bay, the + Lummi waters, and the San Juan Islands. Click any station to drill down, or pop on the compare overlay to see them all stacked. + + 1–6 time · [ ] density · c compare · f focus · r refresh + +

+
+
+
+ + + {t.autoRefresh ? 'LIVE' : 'PAUSED'} + + {clock} +
+
{data.date.pretty}
+
+ noaa coops + · + tz pst + · + {data.datum} +
+
+
+ +
+
+ RANGE +
+ {RANGE_KEYS.map((r) => ( + + ))} +
+
+ + + +
+ DENSITY +
+ {DENSITIES.map((d) => ( + + ))} +
+
+ + + +
+ SORT +
+ {SORTS.map((s) => ( + + ))} +
+
+ + + +
+ GROUP +
+ {(['none', 'region', 'trend'] as const).map((g) => ( + + ))} +
+
+ + + +
+ VIEW +
+ + +
+
+ + + +
+ ACTIONS +
+ +
+
+
+
+ ) +} diff --git a/frontend/src/components/Tweaks.tsx b/frontend/src/components/Tweaks.tsx new file mode 100644 index 0000000..2b41a93 --- /dev/null +++ b/frontend/src/components/Tweaks.tsx @@ -0,0 +1,110 @@ +import { useState } from 'react' +import { ACCENTS, type Accent, type SetTweak, type Tweaks } from '../lib/tweaks' +import { RANGE_KEYS } from '../tides' + +function Row({ label, children }: { label: string; children: React.ReactNode }) { + return ( +
+ {label} +
{children}
+
+ ) +} + +function Seg({ value, options, onChange }: { value: T; options: readonly T[]; onChange: (v: T) => void }) { + return ( +
+ {options.map((o) => ( + + ))} +
+ ) +} + +function Toggle({ value, onChange }: { value: boolean; onChange: (v: boolean) => void }) { + return ( + + ) +} + +export function TweaksPanel({ t, setTweak }: { t: Tweaks; setTweak: SetTweak }) { + const [open, setOpen] = useState(false) + return ( + <> + + {open && ( +
+
+ TWEAKS + +
+ +
Layout
+ + setTweak('density', v)} /> + + + setTweak('range', v)} /> + + + setTweak('chartStyle', v)} /> + + + setTweak('groupBy', v)} /> + + + setTweak('sortBy', v)} /> + + +
Overlays
+ + setTweak('showGrid', v)} /> + + + setTweak('showSun', v)} /> + + + setTweak('showMoon', v)} /> + + +
Panels
+ + setTweak('showFocus', v)} /> + + + setTweak('showCompare', v)} /> + + +
Theme
+ +
+ {(Object.keys(ACCENTS) as Accent[]).map((a) => ( +
+
+ + setTweak('photoBg', v)} /> + + + setTweak('autoRefresh', v)} /> + +
+ )} + + ) +} diff --git a/frontend/src/main.tsx b/frontend/src/main.tsx new file mode 100644 index 0000000..fcbf291 --- /dev/null +++ b/frontend/src/main.tsx @@ -0,0 +1,13 @@ +import { StrictMode } from 'react' +import { createRoot } from 'react-dom/client' +import './styles/tokens.css' +import './styles/glacier.css' +import './styles/tides.css' +import './styles/tweaks.css' +import App from './App.tsx' + +createRoot(document.getElementById('root')!).render( + + + , +) diff --git a/frontend/src/styles/glacier.css b/frontend/src/styles/glacier.css new file mode 100644 index 0000000..cdeaebd --- /dev/null +++ b/frontend/src/styles/glacier.css @@ -0,0 +1,184 @@ +/* ============================================================ + GLACIER SHELL — shared sidebar / background vocabulary + (subset of the design's styles-5.css used by the dashboard) + ============================================================ */ + +.gs-bg { + position: absolute; + inset: 0; + background: url('/shuksan-close.jpg') center / cover no-repeat; + filter: saturate(1.15) brightness(0.92); +} +.gs-bg-tint { + position: absolute; + inset: 0; +} +.gs-dark .gs-bg { + filter: saturate(1.15) brightness(0.78); +} +.gs-dark .gs-bg-tint { + background: + radial-gradient(ellipse at 30% 0%, rgba(80, 130, 190, 0.4), transparent 60%), + radial-gradient(ellipse at 90% 100%, rgba(30, 60, 110, 0.55), transparent 55%), + linear-gradient(180deg, rgba(25, 50, 90, 0.5) 0%, rgba(15, 35, 70, 0.7) 100%); +} + +/* SIDEBAR */ +.gs-sidebar { + display: flex; + flex-direction: column; + padding: 28px 0 24px; + z-index: 5; +} + +.gs-sidebar-head { + padding: 0 22px 22px; + border-bottom: 1px solid rgba(120, 170, 220, 0.18); + margin-bottom: 20px; +} +.gs-brand { + display: flex; + align-items: center; + gap: 8px; + font-family: var(--mono); + font-size: 13px; + font-weight: 600; + color: var(--ice-50); + margin-bottom: 4px; +} +.gs-brand-mark { + color: var(--ice-300); + font-size: 12px; +} +.gs-brand-sub { + font-family: var(--mono); + font-size: 10px; + color: var(--ice-300); + letter-spacing: 0.05em; + text-transform: uppercase; + opacity: 0.75; + padding-left: 20px; +} + +.gs-sb-section { + font-family: var(--mono); + font-size: 9px; + letter-spacing: 0.18em; + font-weight: 700; + color: var(--ice-300); + opacity: 0.7; + padding: 0 22px 10px; +} + +.gs-sb-link { + display: flex; + align-items: center; + gap: 12px; + padding: 9px 22px 9px 20px; + color: rgba(240, 248, 255, 0.78); + font-size: 13px; + border-left: 2px solid transparent; + transition: all 0.15s; + position: relative; + text-decoration: none; + background: transparent; + border-top: 0; + border-right: 0; + border-bottom: 0; + cursor: pointer; + text-align: left; + width: 100%; +} +.gs-sb-link:hover { + background: rgba(120, 170, 220, 0.12); + color: var(--ice-50); +} +.gs-sb-link.active { + background: linear-gradient(90deg, rgba(120, 170, 220, 0.28), rgba(120, 170, 220, 0.04)); + color: var(--ice-50); + border-left-color: var(--ice-300); + font-weight: 600; +} +.gs-sb-glyph { + font-family: var(--mono); + color: var(--ice-300); + width: 14px; + text-align: center; + font-weight: 600; + font-size: 12px; +} +.gs-sb-name { + font-family: var(--mono); + flex: 1; +} +.gs-sb-caret { + font-family: var(--mono); + color: var(--ice-300); + font-size: 11px; +} +.gs-sb-link-sm { + padding-top: 6px; + padding-bottom: 6px; + padding-left: 36px; + font-size: 11px; + color: rgba(240, 248, 255, 0.6); +} +.gs-sb-link-sm .gs-sb-name { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.gs-sb-foot { + margin-top: auto; + padding: 22px; + border-top: 1px solid rgba(120, 170, 220, 0.18); + display: flex; + flex-direction: column; + gap: 6px; +} +.gs-sb-foot-link { + font-family: var(--mono); + font-size: 11px; + color: rgba(240, 248, 255, 0.65); + transition: color 0.15s; + text-decoration: none; +} +.gs-sb-foot-link:hover { + color: var(--ice-50); +} +.gs-sb-avail { + margin-top: 8px; + display: inline-flex; + align-items: center; + gap: 7px; + font-family: var(--mono); + font-size: 10px; + color: oklch(0.82 0.12 165); + letter-spacing: 0.04em; +} +.gs-sb-pulse { + width: 6px; + height: 6px; + border-radius: 50%; + background: oklch(0.82 0.12 165); + box-shadow: 0 0 6px oklch(0.82 0.12 165); + animation: gs-pulse 2s infinite; +} +@keyframes gs-pulse { + 0%, + 100% { + opacity: 1; + } + 50% { + opacity: 0.4; + } +} + +.gs-hero-label { + font-family: var(--mono); + font-size: 11px; + letter-spacing: 0.18em; + color: var(--ice-300); + margin-bottom: 18px; +} diff --git a/frontend/src/styles/tides.css b/frontend/src/styles/tides.css new file mode 100644 index 0000000..cb63079 --- /dev/null +++ b/frontend/src/styles/tides.css @@ -0,0 +1,857 @@ +/* ============================================================ + TIDES TRACKER — Ganglia-inspired dense dashboard in the + site's glacier/ice vocabulary. Inherits tokens from styles.css. + ============================================================ */ + +:root { + --tt-stroke: oklch(0.78 0.08 220); + --tt-stroke-soft: oklch(0.78 0.08 220 / 0.45); + --tt-fg: oklch(0.95 0.015 225); + --tt-fg-mute: rgba(220, 232, 245, 0.62); + --tt-fg-faint: rgba(220, 232, 245, 0.38); + --tt-panel-bg: rgba(15, 30, 55, 0.62); + --tt-panel-bg-soft: rgba(15, 30, 55, 0.40); + --tt-panel-border: rgba(140, 180, 220, 0.20); + --tt-panel-border-strong: rgba(150, 195, 235, 0.32); + --tt-tile-bg: rgba(8, 18, 36, 0.62); + --tt-rising: oklch(0.78 0.10 165); + --tt-falling: oklch(0.74 0.10 35); + --tt-slack: oklch(0.78 0.04 240); + --tt-warn: oklch(0.78 0.12 80); +} + +/* ROOT — full viewport, override the artboard-sized .gs-root */ +.tt-root { + position: relative; + min-height: 100vh; + width: 100%; + overflow-x: hidden; + font-family: var(--sans); + color: var(--tt-fg); + background: #060b14; +} +.tt-root.tt-has-photo .tt-bg { + position: fixed; inset: 0; + background: url('/shuksan-close.jpg') center/cover no-repeat; + filter: saturate(1.05) brightness(0.40); + z-index: 0; +} +.tt-root .tt-bg-tint { + position: fixed; inset: 0; + background: + radial-gradient(ellipse at 25% 0%, rgba(80, 130, 190, 0.32), transparent 55%), + radial-gradient(ellipse at 75% 95%, rgba(40, 70, 120, 0.40), transparent 60%), + linear-gradient(180deg, rgba(8, 16, 30, 0.55) 0%, rgba(6, 11, 20, 0.85) 100%); + z-index: 1; +} +/* faint horizontal scanlines, classic terminal observatory feel */ +.tt-scanlines { + position: fixed; inset: 0; + background-image: repeating-linear-gradient( + 0deg, + rgba(255, 255, 255, 0.012) 0px, rgba(255, 255, 255, 0.012) 1px, + transparent 1px, transparent 3px + ); + pointer-events: none; + mix-blend-mode: overlay; + z-index: 2; +} + +/* ============================================================ + SIDEBAR — extends .gs-sidebar with the station list + ============================================================ */ +.tt-sidebar { + position: fixed !important; + width: 248px; + display: flex; flex-direction: column; + z-index: 5; + overflow-y: auto; + background: rgba(8, 16, 30, 0.78) !important; + border-right: 1px solid var(--tt-panel-border) !important; + scrollbar-width: thin; + scrollbar-color: rgba(170, 210, 245, 0.20) transparent; +} +.tt-sidebar::-webkit-scrollbar { width: 6px; } +.tt-sidebar::-webkit-scrollbar-thumb { background: rgba(170, 210, 245, 0.20); border-radius: 3px; } + +.tt-sb-list { + display: flex; flex-direction: column; gap: 1px; + padding: 0 12px; +} +.tt-sb-stn { + display: grid; grid-template-columns: 14px 1fr auto; align-items: center; gap: 8px; + padding: 6px 10px; + background: transparent; + border: 1px solid transparent; + border-radius: 4px; + color: var(--tt-fg); + font-family: var(--mono); + font-size: 11px; + cursor: pointer; + text-align: left; + transition: background 0.12s, border-color 0.12s; +} +.tt-sb-stn:hover { + background: rgba(120, 170, 220, 0.10); + border-color: rgba(140, 180, 220, 0.18); +} +.tt-sb-stn.is-focus { + background: linear-gradient(90deg, rgba(120, 170, 220, 0.22), rgba(120, 170, 220, 0.04)); + border-color: rgba(150, 195, 235, 0.40); + color: var(--tt-fg); +} +.tt-sb-dot { display: inline-flex; align-items: center; justify-content: center; } +.tt-sb-code { color: rgba(220, 232, 245, 0.85); letter-spacing: 0.04em; } +.tt-sb-h { + font-variant-numeric: tabular-nums; + color: var(--tt-fg-mute); + font-weight: 500; +} + +/* Saved view buttons —