diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000000000000000000000000000000000000..f710191d454afeb67ebf2ebca857866d2ba867e0 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,18 @@ +# Git +.git + +# Python +__pycache__ +*.py[cod] +.venv +venv + +# Caches +.mypy_cache +.pytest_cache + +# Local runtime artifacts +demo_data + +# Misc +.DS_Store \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..4d9a2697d3281d7ca63d23b120ea1a70b7515a92 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,56 @@ +FROM python:3.11-slim + +RUN apt-get update && apt-get install -y --no-install-recommends \ + build-essential \ + curl \ + git \ + libssl-dev \ + pkg-config \ + && rm -rf /var/lib/apt/lists/* + +RUN useradd -m -u 1000 user +USER user + +ENV HOME=/home/user \ + PATH=/home/user/.local/bin:$PATH \ + HF_HOME=/home/user/.cache/huggingface \ + PYTHONUNBUFFERED=1 \ + PIP_NO_CACHE_DIR=1 + +WORKDIR $HOME/app + +RUN pip install --upgrade pip + +RUN pip install \ + "fastapi==0.128.0" \ + "uvicorn[standard]==0.40.0" \ + "numpy==2.3.5" \ + "umap-learn==0.5.11" \ + "Pillow==12.1.0" \ + "pydantic==2.12.5" \ + "aiofiles==25.1.0" \ + "datasets==4.5.0" \ + "lancedb==0.27.1" \ + "pyarrow==22.0.0" \ + "torch==2.9.1" \ + "torchvision==0.24.1" \ + "timm==1.0.24" + +COPY --chown=user vendor ./vendor +COPY --chown=user demo.py ./demo.py + +ENV PYTHONPATH=/home/user/app/vendor \ + HYPERVIEW_DATASETS_DIR=/home/user/app/demo_data/datasets \ + HYPERVIEW_MEDIA_DIR=/home/user/app/demo_data/media + +RUN python -c "import hyperview; print('hyperview', hyperview.__version__)" + +# Precompute at build time so the Space starts fast. +RUN python -c "from demo import build_dataset; build_dataset()" + +EXPOSE 7860 + +HEALTHCHECK --interval=30s --timeout=10s --start-period=120s --retries=3 \ + CMD curl -f http://localhost:7860/__hyperview__/health || exit 1 + +CMD ["python", "demo.py"] \ No newline at end of file diff --git a/README.md b/README.md index bdffbcb8668c075b4d919beddc27acf1bfa6995d..5d2f6ef1ffb95db4e78bb1d6c78ea5cc5ac58b69 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,50 @@ --- -title: HyperView Jaguar ReID -emoji: 🚀 -colorFrom: pink -colorTo: pink +title: HyperView-Jaguar-ReID +emoji: 🐆 +colorFrom: yellow +colorTo: green sdk: docker +app_port: 7860 pinned: false --- -Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference +# HyperView - Jaguar Re-ID (MegaDescriptor + Sphere) + +This Space runs the Jaguar Re-ID dataset through the MegaDescriptor timm +backbone and renders the result with HyperView's spherical 3D layout. + +Unlike the Imagenette starter, this folder vendors the current HyperView source +under `vendor/hyperview/`. The released `hyperview==0.2.0` wheel does not yet +include the `timm-image` provider or spherical layout support required by this +demo, so the Space builds against the local source snapshot instead of PyPI. + +This demo uses: + +- Hugging Face dataset `hyper3labs/jaguar-re-id` +- Config `default` +- Split `train` +- Image field `image` +- Label field `label` +- Sample count `200` +- Embedding model `hf-hub:BVRA/MegaDescriptor-L-384` +- Layout `spherical` (3D) + +## Build model + +The Dockerfile precomputes the dataset, embeddings, and layout during image +build so the runtime container only needs to launch HyperView. + +Because MegaDescriptor inference runs during Docker build on CPU, this Space +keeps the sample count modest and uses a smaller batch size than the local demo +script to stay within typical Hugging Face build limits. + +## Vendored source + +This folder includes a vendored `vendor/hyperview/` snapshot copied from the +main HyperView repository. Keep that snapshot in sync with the local repo if +you update the jaguar demo or any unreleased HyperView behavior it depends on. + +## Deploy source + +This folder is synchronized to Hugging Face Spaces by GitHub Actions from the +`hyperview-spaces` deployment repository. \ No newline at end of file diff --git a/__pycache__/demo.cpython-312.pyc b/__pycache__/demo.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f95c061e9f2fa95bf528f5ee30aa220d8fbe44dc Binary files /dev/null and b/__pycache__/demo.cpython-312.pyc differ diff --git a/demo.py b/demo.py new file mode 100644 index 0000000000000000000000000000000000000000..ecd58eaea1090862f0de1bbe0abdc371d884d24a --- /dev/null +++ b/demo.py @@ -0,0 +1,65 @@ +#!/usr/bin/env python +"""HyperView Jaguar Re-ID Hugging Face Space.""" + +from __future__ import annotations + +import sys +from pathlib import Path + +SPACE_HOST = "0.0.0.0" +SPACE_PORT = 7860 + +DATASET_NAME = "jaguar_reid_megadescriptor_spherical_space" +HF_DATASET = "hyper3labs/jaguar-re-id" +HF_CONFIG = "default" +HF_SPLIT = "train" +HF_IMAGE_KEY = "image" +HF_LABEL_KEY = "label" +SAMPLE_COUNT = 200 +MODEL_ID = "hf-hub:BVRA/MegaDescriptor-L-384" +BATCH_SIZE = 4 + +ROOT = Path(__file__).resolve().parent +VENDOR_DIR = ROOT / "vendor" +if str(VENDOR_DIR) not in sys.path: + sys.path.insert(0, str(VENDOR_DIR)) + +import hyperview as hv + + +def build_dataset() -> hv.Dataset: + dataset = hv.Dataset(DATASET_NAME) + + if len(dataset) == 0: + print(f"Loading {SAMPLE_COUNT} samples from {HF_DATASET} [{HF_CONFIG}] ({HF_SPLIT})...") + dataset.add_from_huggingface( + HF_DATASET, + config=HF_CONFIG, + split=HF_SPLIT, + image_key=HF_IMAGE_KEY, + label_key=HF_LABEL_KEY, + max_samples=SAMPLE_COUNT, + ) + + print(f"Ensuring MegaDescriptor embeddings ({MODEL_ID})...") + space_key = dataset.compute_embeddings( + model=MODEL_ID, + provider="timm-image", + batch_size=BATCH_SIZE, + show_progress=True, + ) + + print("Ensuring spherical layout...") + dataset.compute_visualization(space_key=space_key, layout="spherical") + + return dataset + + +def main() -> None: + dataset = build_dataset() + print(f"Starting HyperView on {SPACE_HOST}:{SPACE_PORT}") + hv.launch(dataset, host=SPACE_HOST, port=SPACE_PORT, open_browser=False) + + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/vendor/hyperview/__init__.py b/vendor/hyperview/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..d055599584e7c0f2025c447d8592bca4cc5c511e --- /dev/null +++ b/vendor/hyperview/__init__.py @@ -0,0 +1,14 @@ +"""HyperView - Open-source dataset curation with hyperbolic embeddings visualization.""" + +from . import _version as _version +from . import api as _api + +Dataset = _api.Dataset +launch = _api.launch +__version__ = _version.__version__ + +__all__ = [ + "Dataset", + "launch", + "__version__", +] diff --git a/vendor/hyperview/__pycache__/__init__.cpython-312.pyc b/vendor/hyperview/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fc553dd5f5ef896cc0379df1a876d666e88ef1a1 Binary files /dev/null and b/vendor/hyperview/__pycache__/__init__.cpython-312.pyc differ diff --git a/vendor/hyperview/__pycache__/_version.cpython-312.pyc b/vendor/hyperview/__pycache__/_version.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..76f9a3a22cd6d11ee7812bc1e9d367e3e5ebe05a Binary files /dev/null and b/vendor/hyperview/__pycache__/_version.cpython-312.pyc differ diff --git a/vendor/hyperview/__pycache__/api.cpython-312.pyc b/vendor/hyperview/__pycache__/api.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..241e79382b8030f3ac608d6989c33752e1b6bb15 Binary files /dev/null and b/vendor/hyperview/__pycache__/api.cpython-312.pyc differ diff --git a/vendor/hyperview/_version.py b/vendor/hyperview/_version.py new file mode 100644 index 0000000000000000000000000000000000000000..23910fbfccf418f5ef18d8c1bc3ce45b48b7e462 --- /dev/null +++ b/vendor/hyperview/_version.py @@ -0,0 +1,34 @@ +# file generated by setuptools-scm +# don't change, don't track in version control + +__all__ = [ + "__version__", + "__version_tuple__", + "version", + "version_tuple", + "__commit_id__", + "commit_id", +] + +TYPE_CHECKING = False +if TYPE_CHECKING: + from typing import Tuple + from typing import Union + + VERSION_TUPLE = Tuple[Union[int, str], ...] + COMMIT_ID = Union[str, None] +else: + VERSION_TUPLE = object + COMMIT_ID = object + +version: str +__version__: str +__version_tuple__: VERSION_TUPLE +version_tuple: VERSION_TUPLE +commit_id: COMMIT_ID +__commit_id__: COMMIT_ID + +__version__ = version = '0.2.1.dev2+g55532b8e3.d20260307' +__version_tuple__ = version_tuple = (0, 2, 1, 'dev2', 'g55532b8e3.d20260307') + +__commit_id__ = commit_id = None diff --git a/vendor/hyperview/api.py b/vendor/hyperview/api.py new file mode 100644 index 0000000000000000000000000000000000000000..a970b829002b4baaf3c3cba7a93e55a4db765702 --- /dev/null +++ b/vendor/hyperview/api.py @@ -0,0 +1,408 @@ +"""Public API for HyperView.""" + +import json +import os +import socket +import threading +import time +import webbrowser +from dataclasses import dataclass +from urllib.error import URLError +from urllib.request import Request, urlopen +from uuid import uuid4 + +import uvicorn + +from hyperview.core.dataset import Dataset +from hyperview.server.app import create_app, set_dataset + +__all__ = ["Dataset", "launch", "Session"] + + +@dataclass(frozen=True) +class _HealthResponse: + name: str | None + session_id: str | None + dataset: str | None + pid: int | None + + +def _can_connect(host: str, port: int, timeout_s: float) -> bool: + try: + with socket.create_connection((host, port), timeout=timeout_s): + return True + except OSError: + return False + + +def _try_read_health(url: str, timeout_s: float) -> _HealthResponse | None: + try: + return _read_health(url, timeout_s=timeout_s) + except (URLError, TimeoutError, OSError, ValueError, json.JSONDecodeError): + return None + + +def _read_health(url: str, timeout_s: float) -> _HealthResponse: + request = Request(url, headers={"Accept": "application/json"}) + with urlopen(request, timeout=timeout_s) as response: + data = json.loads(response.read().decode("utf-8")) + + return _HealthResponse( + name=data.get("name"), + session_id=data.get("session_id"), + dataset=data.get("dataset"), + pid=data.get("pid") if isinstance(data.get("pid"), int) else None, + ) + + +def _resolve_default_launch_layout(dataset: Dataset) -> str: + spaces = dataset.list_spaces() + + if any(space.geometry not in ("hyperboloid", "hypersphere") for space in spaces): + return "euclidean:2d" + if any(space.geometry == "hypersphere" for space in spaces): + return "spherical:3d" + return "poincare:2d" + + +class Session: + """A session for the HyperView visualizer.""" + + def __init__(self, dataset: Dataset, host: str, port: int): + self.dataset = dataset + self.host = host + self.port = port + # Prefer a browser-connectable host for user-facing URLs. + # When binding to 0.0.0.0, users should connect via 127.0.0.1 locally. + self.url = f"http://{self._connect_host}:{port}" + self._server_thread: threading.Thread | None = None + self._server: uvicorn.Server | None = None + self._startup_error: BaseException | None = None + self.session_id = uuid4().hex + + @property + def _connect_host(self) -> str: + return "127.0.0.1" if self.host == "0.0.0.0" else self.host + + @property + def _health_url(self) -> str: + return f"http://{self._connect_host}:{self.port}/__hyperview__/health" + + def _run_server(self): + try: + set_dataset(self.dataset) + app = create_app(self.dataset, session_id=self.session_id) + config = uvicorn.Config(app, host=self.host, port=self.port, log_level="warning") + self._server = uvicorn.Server(config) + self._server.run() + except BaseException as exc: + self._startup_error = exc + + def start(self, background: bool = True): + """Start the visualizer server.""" + if not background: + self._run_server() + return + + # Fail fast if something is already listening on this port. + if _can_connect(self._connect_host, self.port, timeout_s=0.2): + health = _try_read_health(self._health_url, timeout_s=0.2) + if health is not None and health.name == "hyperview": + raise RuntimeError( + "HyperView failed to start because the port is already serving " + f"HyperView (port={self.port}, session_id={health.session_id}). " + "Choose a different port or stop the existing server." + ) + + raise RuntimeError( + "HyperView failed to start because the port is already in use " + f"by a non-HyperView service (port={self.port}). Choose a different " + "port or stop the process listening on that port." + ) + + self._startup_error = None + self._server_thread = threading.Thread(target=self._run_server, daemon=True) + self._server_thread.start() + + deadline = time.time() + 5.0 + last_health_error: Exception | None = None + + while time.time() < deadline: + if self._startup_error is not None: + raise RuntimeError( + f"HyperView server failed to start (port={self.port}): " + f"{type(self._startup_error).__name__}: {self._startup_error}" + ) + + if self._server_thread is not None and not self._server_thread.is_alive(): + raise RuntimeError( + "HyperView server thread exited during startup. " + f"The port may be in use (port={self.port})." + ) + + try: + health = _read_health(self._health_url, timeout_s=0.2) + except (URLError, TimeoutError, OSError, ValueError, json.JSONDecodeError) as exc: + last_health_error = exc + time.sleep(0.05) + continue + + if health.name == "hyperview" and health.session_id == self.session_id: + return + + if health.name == "hyperview": + raise RuntimeError( + "HyperView failed to start because the port is already serving " + f"a different HyperView session (port={self.port}, " + f"session_id={health.session_id})." + ) + + raise RuntimeError( + "HyperView failed to start because the port is already serving " + f"a non-HyperView app (port={self.port})." + ) + + raise TimeoutError( + "HyperView server did not become ready in time " + f"(port={self.port}). Last error: {last_health_error}" + ) + + def stop(self): + """Stop the visualizer server.""" + if self._server: + self._server.should_exit = True + + def show(self, height: int = 800): + """Display the visualizer in a notebook. + + In Google Colab, notebook kernels cannot be accessed via localhost. + Colab exposes kernel ports through a proxy URL (see + `google.colab.kernel.proxyPort`). This renders a link to the proxied URL + that opens in a new tab. + + In other notebook environments, it renders a clickable link to the local + URL and a best-effort JavaScript auto-open. + """ + if _is_colab(): + try: + from google.colab.output import eval_js # type: ignore[import-not-found] + from IPython.display import HTML, display + + proxy_url = eval_js(f"google.colab.kernel.proxyPort({self.port})") + app_url = str(proxy_url).rstrip("/") + "/" + + display( + HTML( + "

HyperView is running in Colab. " + f"" + "Open HyperView in a new tab.

" + ) + ) + display(HTML(f"

{app_url}

")) + return + except Exception: + # Fall through to the generic notebook behavior. + pass + + # Default: open in a new browser tab (works well for Jupyter). + try: + from IPython.display import HTML, Javascript, display + + display( + HTML( + "

HyperView is running. " + f"Open in a new tab." + "

" + ) + ) + + # Best-effort auto-open. Some browsers may block popups. + display(Javascript(f'window.open("{self.url}", "_blank");')) + except ImportError: + print(f"IPython not installed. Please visit {self.url} in your browser.") + + def open_browser(self): + """Open the visualizer in a browser window.""" + webbrowser.open(self.url) + + +def launch( + dataset: Dataset, + port: int = 6262, + host: str = "127.0.0.1", + open_browser: bool = True, + notebook: bool | None = None, + height: int = 800, + reuse_server: bool = False, +) -> Session: + """Launch the HyperView visualization server. + + Note: + HyperView needs at least one visualization to display. If no layouts + exist yet but embedding spaces do, this function computes one default + layout automatically. + + Args: + dataset: The dataset to visualize. + port: Port to run the server on. + host: Host to bind to. + open_browser: Whether to open a browser window. + notebook: Whether to display in a notebook. If None, auto-detects. + height: Height of the iframe in the notebook. + reuse_server: If True, and the requested port is already serving HyperView, + attach to the existing server instead of starting a new one. For safety, + this will only attach when the existing server reports the same dataset + name (via `/__hyperview__/health`). + + Returns: + A Session object. + + Example: + >>> import hyperview as hv + >>> dataset = hv.Dataset("my_dataset") + >>> dataset.add_images_dir("/path/to/images", label_from_folder=True) + >>> dataset.compute_embeddings(model="openai/clip-vit-base-patch32") + >>> dataset.compute_visualization() + >>> hv.launch(dataset) + """ + if notebook is None: + # Colab is always a notebook environment, even if _is_notebook() fails to detect it + notebook = _is_notebook() or _is_colab() + + if _is_colab() and host == "127.0.0.1": + # Colab port forwarding/proxying is most reliable when the server binds + # to all interfaces. + host = "0.0.0.0" + + # Preflight: avoid doing expensive work if the port is already in use. + # If it's already serving HyperView and reuse_server=True, we can safely attach. + connect_host = "127.0.0.1" if host == "0.0.0.0" else host + health_url = f"http://{connect_host}:{port}/__hyperview__/health" + + if _can_connect(connect_host, port, timeout_s=0.2): + health = _try_read_health(health_url, timeout_s=0.2) + if health is not None and health.name == "hyperview": + if not reuse_server: + raise RuntimeError( + "HyperView failed to start because the port is already serving " + f"HyperView (port={port}, dataset={health.dataset}, " + f"session_id={health.session_id}, pid={health.pid}). " + "Choose a different port, stop the existing server, or pass " + "reuse_server=True to attach." + ) + + if health.dataset is not None and health.dataset != dataset.name: + raise RuntimeError( + "HyperView refused to attach to the existing server because it is " + f"serving a different dataset (port={port}, dataset={health.dataset}). " + f"Requested dataset={dataset.name}. Stop the existing server or " + "choose a different port." + ) + + session = Session(dataset, host, port) + if health.session_id is not None: + session.session_id = health.session_id + + if notebook: + if _is_colab(): + print( + f"\nHyperView is already running (Colab, port={session.port}). " + "Use the link below to open it." + ) + else: + print( + f"\nHyperView is already running at {session.url} (port={session.port}). " + "Opening a new tab..." + ) + session.show(height=height) + else: + print(f"\nHyperView is already running at {session.url} (port={session.port}).") + if open_browser: + session.open_browser() + + return session + + raise RuntimeError( + "HyperView failed to start because the port is already in use " + f"by a non-HyperView service (port={port}). Choose a different " + "port or stop the process listening on that port." + ) + + layouts = dataset.list_layouts() + spaces = dataset.list_spaces() + + if not layouts and not spaces: + raise ValueError( + "HyperView launch requires at least one visualization or embedding space. " + "No visualizations or embedding spaces were found. " + "Call `dataset.compute_embeddings()` and `dataset.compute_visualization()` " + "or `dataset.set_coords()` before `hv.launch()`." + ) + + if not layouts: + default_layout = _resolve_default_launch_layout(dataset) + + print(f"No visualizations found. Computing {default_layout} visualization...") + # Let compute_visualization pick the most appropriate default space. + dataset.compute_visualization( + space_key=None, + layout=default_layout, + ) + + session = Session(dataset, host, port) + + if notebook: + session.start(background=True) + if _is_colab(): + print( + f"\nHyperView is running (Colab, port={session.port}). " + "Use the link below to open it." + ) + else: + print(f"\nHyperView is running at {session.url}. Opening a new tab...") + session.show(height=height) + else: + session.start(background=True) + print(" Press Ctrl+C to stop.\n") + print(f"\nHyperView is running at {session.url}") + + if open_browser: + session.open_browser() + + try: + while True: + # Keep the main thread alive so the daemon server thread can run. + time.sleep(0.25) + if session._server_thread is not None and not session._server_thread.is_alive(): + raise RuntimeError("HyperView server stopped unexpectedly.") + except KeyboardInterrupt: + pass + finally: + session.stop() + if session._server_thread is not None: + session._server_thread.join(timeout=2.0) + + return session + + +def _is_notebook() -> bool: + """Check if running in a notebook environment.""" + try: + from IPython import get_ipython + except ImportError: + return False + + shell = get_ipython() + return shell is not None and shell.__class__.__name__ == "ZMQInteractiveShell" + + +def _is_colab() -> bool: + """Check if running inside a Google Colab notebook runtime.""" + if os.environ.get("COLAB_RELEASE_TAG"): + return True + try: + import google.colab # type: ignore[import-not-found] + + return True + except ImportError: + return False diff --git a/vendor/hyperview/cli.py b/vendor/hyperview/cli.py new file mode 100644 index 0000000000000000000000000000000000000000..d489c40f1672596c4db54ed76789a5ddaa661577 --- /dev/null +++ b/vendor/hyperview/cli.py @@ -0,0 +1,362 @@ +"""Command-line interface for HyperView.""" + +from __future__ import annotations + +import argparse + +from hyperview import Dataset, launch +from hyperview.core.dataset import parse_visualization_layout + + +def _build_parser() -> argparse.ArgumentParser: + parser = argparse.ArgumentParser( + prog="hyperview", + description="HyperView - Dataset visualization with hyperbolic embeddings", + ) + + parser.add_argument( + "--dataset", + type=str, + default=None, + help=( + "Dataset name in persistent storage. Required unless " + "--dataset-json is provided." + ), + ) + parser.add_argument( + "--dataset-json", + type=str, + help="Path to exported dataset JSON file (loads samples into memory)", + ) + parser.add_argument( + "--hf-dataset", + type=str, + help="HuggingFace dataset ID to ingest before launch (e.g. uoft-cs/cifar10)", + ) + parser.add_argument( + "--split", + type=str, + default=None, + help="HuggingFace split to use (required with --hf-dataset)", + ) + parser.add_argument( + "--hf-config", + type=str, + default=None, + help="Optional HuggingFace subset/configuration to use", + ) + parser.add_argument( + "--image-key", + type=str, + default=None, + help="Image column key for HuggingFace ingestion (required with --hf-dataset)", + ) + parser.add_argument( + "--label-key", + type=str, + default=None, + help="Label column key for HuggingFace ingestion (optional)", + ) + parser.add_argument( + "--label-names-key", + type=str, + default=None, + help="Optional dataset info key containing label names", + ) + parser.add_argument( + "--images-dir", + type=str, + help="Local directory of images to ingest before launch", + ) + parser.add_argument( + "--label-from-folder", + action="store_true", + help="When using --images-dir, derive label from parent folder name", + ) + parser.add_argument( + "--samples", + type=int, + default=None, + help="Maximum number of ingested samples (omit to load all)", + ) + parser.add_argument( + "--hf-streaming", + action="store_true", + help=( + "Stream HuggingFace rows instead of materializing the full split first. " + "Useful for loading subsets without eager full-split downloads." + ), + ) + parser.add_argument( + "--shuffle", + action="store_true", + help="Shuffle HuggingFace dataset before sampling", + ) + parser.add_argument( + "--seed", + type=int, + default=42, + help="Random seed used when --shuffle is enabled (default: 42)", + ) + parser.add_argument( + "--hf-shuffle-buffer-size", + type=int, + default=1000, + help=( + "Shuffle buffer size used with --hf-streaming and --shuffle. " + "Streaming shuffle is approximate and trades larger buffers for more read-ahead." + ), + ) + + parser.add_argument( + "--model", + type=str, + default=None, + help=( + "Embedding model to compute before launch (e.g. openai/clip-vit-base-patch32). " + "If omitted, existing embedding spaces are reused." + ), + ) + parser.add_argument( + "--method", + choices=["umap"], + default="umap", + help="Projection method (currently only 'umap')", + ) + parser.add_argument( + "--layout", + action="append", + dest="layouts", + metavar="GEOMETRY[:2d|3d]", + help=( + "Visualization layout to compute. Repeat this flag to request multiple layouts, " + "for example '--layout euclidean --layout spherical'. " + "Omitting the suffix defaults to 2D for euclidean/poincare and 3D for spherical. " + "If omitted, HyperView picks one sensible default layout for the selected embedding space." + ), + ) + parser.add_argument( + "--n-neighbors", + type=int, + default=15, + help="UMAP n_neighbors (default: 15)", + ) + parser.add_argument( + "--min-dist", + type=float, + default=0.1, + help="UMAP min_dist (default: 0.1)", + ) + parser.add_argument( + "--metric", + type=str, + default="cosine", + help="UMAP metric (default: cosine)", + ) + parser.add_argument( + "--force-layout", + action="store_true", + help="Force layout recomputation even if projection already exists", + ) + + parser.add_argument( + "--port", + type=int, + default=6262, + help="Port to run the server on (default: 6262)", + ) + parser.add_argument( + "--host", + type=str, + default="127.0.0.1", + help="Host to bind the server to (default: 127.0.0.1)", + ) + parser.add_argument( + "--no-browser", + action="store_true", + help="Do not open a browser window automatically", + ) + parser.add_argument( + "--reuse-server", + action="store_true", + help=( + "If the port is already serving HyperView, attach instead of failing. " + "For safety, this only attaches when the existing server reports the same dataset name." + ), + ) + + return parser + + +def _validate_args(parser: argparse.ArgumentParser, args: argparse.Namespace) -> None: + if args.layouts: + canonical_layouts: list[str] = [] + seen_layouts: set[str] = set() + for layout_spec in args.layouts: + try: + geometry, layout_dimension = parse_visualization_layout(layout_spec) + except ValueError as exc: + parser.error(str(exc)) + + canonical_layout = f"{geometry}:{layout_dimension}d" + if canonical_layout in seen_layouts: + continue + seen_layouts.add(canonical_layout) + canonical_layouts.append(canonical_layout) + + args.layouts = canonical_layouts + + if args.hf_dataset and args.images_dir: + parser.error("Use either --hf-dataset or --images-dir, not both.") + + if args.dataset_json and (args.hf_dataset or args.images_dir): + parser.error("--dataset-json cannot be combined with --hf-dataset or --images-dir.") + + if args.dataset_json and args.dataset: + parser.error("Use either --dataset or --dataset-json, not both.") + + if not args.dataset and not args.dataset_json: + parser.error( + "Provide --dataset (persistent dataset) or --dataset-json (exported dataset file)." + ) + + if args.hf_dataset: + if not args.split: + parser.error("--split is required when using --hf-dataset.") + if not args.image_key: + parser.error("--image-key is required when using --hf-dataset.") + if args.hf_shuffle_buffer_size < 1: + parser.error("--hf-shuffle-buffer-size must be at least 1.") + + +def _print_ingestion_result(added: int, skipped: int) -> None: + if skipped > 0: + print(f"Loaded {added} samples ({skipped} already present)") + else: + print(f"Loaded {added} samples") + + +def _ingest_huggingface(dataset: Dataset, args: argparse.Namespace, dataset_name: str) -> None: + config_suffix = f" [{args.hf_config}]" if args.hf_config else "" + print(f"Loading HuggingFace dataset {dataset_name}{config_suffix}...") + added, skipped = dataset.add_from_huggingface( + dataset_name, + config=args.hf_config, + split=args.split, + image_key=args.image_key, + label_key=args.label_key, + label_names_key=args.label_names_key, + max_samples=args.samples, + shuffle=args.shuffle, + seed=args.seed, + streaming=args.hf_streaming, + shuffle_buffer_size=args.hf_shuffle_buffer_size, + ) + _print_ingestion_result(added, skipped) + + +def _prepare_dataset(args: argparse.Namespace) -> Dataset: + if args.dataset_json: + print(f"Loading dataset from {args.dataset_json}...") + dataset = Dataset.load(args.dataset_json) + print(f"Loaded {len(dataset)} samples") + return dataset + + dataset = Dataset(args.dataset) + print(f"Using dataset '{dataset.name}' ({len(dataset)} samples)") + + if args.hf_dataset: + _ingest_huggingface(dataset, args, args.hf_dataset) + elif args.images_dir: + print(f"Loading images from {args.images_dir}...") + added, skipped = dataset.add_images_dir( + args.images_dir, + label_from_folder=args.label_from_folder, + ) + _print_ingestion_result(added, skipped) + + return dataset + + +def _resolve_default_layouts( + dataset: Dataset, + space_key: str | None, +) -> list[str]: + spaces = dataset.list_spaces() + selected = next((space for space in spaces if space.space_key == space_key), None) + + if selected is not None: + if selected.geometry == "hyperboloid": + return ["poincare:2d"] + if selected.geometry == "hypersphere": + return ["spherical:3d"] + return ["euclidean:2d"] + + if any(space.geometry not in ("hyperboloid", "hypersphere") for space in spaces): + return ["euclidean:2d"] + if any(space.geometry == "hypersphere" for space in spaces): + return ["spherical:3d"] + return ["poincare:2d"] + +def _compute_layouts(dataset: Dataset, args: argparse.Namespace, space_key: str | None) -> None: + target_layouts = args.layouts or _resolve_default_layouts(dataset, space_key) + + print("Computing visualizations...") + for target_layout in target_layouts: + dataset.compute_visualization( + space_key=space_key, + method=args.method, + layout=target_layout, + n_neighbors=args.n_neighbors, + min_dist=args.min_dist, + metric=args.metric, + force=args.force_layout, + ) + print("Visualizations ready") + + +def _prepare_embeddings_and_layouts(dataset: Dataset, args: argparse.Namespace) -> None: + has_spaces = len(dataset.list_spaces()) > 0 + + if args.model is not None: + print(f"Computing embeddings with {args.model}...") + space_key = dataset.compute_embeddings(model=args.model, show_progress=True) + print("Embeddings computed") + _compute_layouts(dataset, args, space_key) + return + + if args.force_layout: + if not has_spaces: + raise ValueError( + "No embedding spaces found. Provide --model to compute embeddings first." + ) + _compute_layouts(dataset, args, space_key=None) + return + + if not has_spaces: + raise ValueError( + "No embedding spaces found. Provide --model to compute embeddings first." + ) + + +def main(): + """Main CLI entry point.""" + parser = _build_parser() + args = parser.parse_args() + + _validate_args(parser, args) + + dataset = _prepare_dataset(args) + _prepare_embeddings_and_layouts(dataset, args) + + launch( + dataset, + port=args.port, + host=args.host, + open_browser=not args.no_browser, + reuse_server=args.reuse_server, + ) + + +if __name__ == "__main__": + main() diff --git a/vendor/hyperview/core/__init__.py b/vendor/hyperview/core/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..2f09c78cc3b71fb293208678553e3774c9bf0032 --- /dev/null +++ b/vendor/hyperview/core/__init__.py @@ -0,0 +1,6 @@ +"""Core data structures for HyperView.""" + +from hyperview.core.dataset import Dataset +from hyperview.core.sample import Sample + +__all__ = ["Dataset", "Sample"] diff --git a/vendor/hyperview/core/__pycache__/__init__.cpython-312.pyc b/vendor/hyperview/core/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..54150c85597f0efe71873b183b12d583b5e469a0 Binary files /dev/null and b/vendor/hyperview/core/__pycache__/__init__.cpython-312.pyc differ diff --git a/vendor/hyperview/core/__pycache__/dataset.cpython-312.pyc b/vendor/hyperview/core/__pycache__/dataset.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ecbb7f20aeaead605d47027520ce5280005b13dc Binary files /dev/null and b/vendor/hyperview/core/__pycache__/dataset.cpython-312.pyc differ diff --git a/vendor/hyperview/core/__pycache__/sample.cpython-312.pyc b/vendor/hyperview/core/__pycache__/sample.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7129a13333729f8082dda69f984b2e95bb22da22 Binary files /dev/null and b/vendor/hyperview/core/__pycache__/sample.cpython-312.pyc differ diff --git a/vendor/hyperview/core/__pycache__/selection.cpython-312.pyc b/vendor/hyperview/core/__pycache__/selection.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f0f5ab23663d4d6c189626fb210b98f10bc9b35b Binary files /dev/null and b/vendor/hyperview/core/__pycache__/selection.cpython-312.pyc differ diff --git a/vendor/hyperview/core/dataset.py b/vendor/hyperview/core/dataset.py new file mode 100644 index 0000000000000000000000000000000000000000..d6e4fcb1268346a62dd2e4159503fe7cd029aeba --- /dev/null +++ b/vendor/hyperview/core/dataset.py @@ -0,0 +1,870 @@ +"""Dataset class for managing collections of samples.""" + +from __future__ import annotations + +import hashlib +import json +import math +import threading +import time +import uuid +from collections.abc import Callable, Iterator +from pathlib import Path +from typing import Any, cast + +import numpy as np +from datasets import DownloadConfig, load_dataset +from PIL import Image + +from hyperview.core.sample import Sample +from hyperview.storage.backend import StorageBackend +from hyperview.storage.schema import ( + make_layout_key, + normalize_layout_dimension, + parse_layout_dimension, +) + + +DEFAULT_VISUALIZATION_LAYOUT = "euclidean" +VALID_VISUALIZATION_GEOMETRIES = ("euclidean", "poincare", "spherical") + + +def _format_elapsed(seconds: float) -> str: + if seconds < 60: + return f"{seconds:.1f}s" + total_seconds = int(round(seconds)) + minutes, secs = divmod(total_seconds, 60) + if minutes < 60: + return f"{minutes}m {secs:02d}s" + hours, minutes = divmod(minutes, 60) + return f"{hours}h {minutes:02d}m {secs:02d}s" + + +def _format_eta(seconds: float) -> str: + if not math.isfinite(seconds) or seconds < 0: + return "unknown" + return _format_elapsed(seconds) + + +def _fallback_huggingface_fingerprint( + dataset_name: str, + config_name: str, + split: str, + version: str | None, +) -> str: + identity = f"{dataset_name}:{config_name}:{split}:{version or 'unknown'}" + return hashlib.md5(identity.encode()).hexdigest() + + +def parse_visualization_layout(layout: str) -> tuple[str, int]: + """Parse a public visualization layout spec like ``euclidean:3d``. + + Omitting the suffix defaults to 2D for Euclidean and Poincare layouts, + and to 3D for spherical layouts. + """ + layout_spec = layout.strip().lower() + if not layout_spec: + raise ValueError("layout must be a non-empty string") + + if ":" in layout_spec: + geometry, dimension_spec = layout_spec.rsplit(":", 1) + else: + geometry = layout_spec + dimension_spec = "3d" if geometry.strip() == "spherical" else "2d" + + geometry = geometry.strip() + dimension_spec = dimension_spec.strip() + + if geometry not in VALID_VISUALIZATION_GEOMETRIES: + raise ValueError( + "layout geometry must be one of " + f"{VALID_VISUALIZATION_GEOMETRIES}, got '{geometry}'" + ) + + if dimension_spec not in ("2d", "3d"): + raise ValueError( + "layout must use the form ':2d' or ':3d', " + f"got '{layout}'" + ) + + layout_dimension = normalize_layout_dimension(int(dimension_spec[0])) + if geometry == "poincare" and layout_dimension != 2: + raise ValueError("Poincare layouts currently require 2D output.") + + return geometry, layout_dimension + + +class Dataset: + """A collection of samples with support for embeddings and visualization. + + Datasets are automatically persisted to LanceDB by default, providing: + - Automatic persistence (no need to call save()) + - Vector similarity search + - Efficient storage and retrieval + + Embeddings are stored separately from samples, keyed by model_id. + Layouts (2D/3D projections) are stored per layout_key (space + method). + """ + + def __init__( + self, + name: str | None = None, + persist: bool = True, + storage: StorageBackend | None = None, + ): + self.name = name or f"dataset_{uuid.uuid4().hex[:8]}" + + if storage is not None: + self._storage = storage + elif persist: + from hyperview.storage import LanceDBBackend, StorageConfig + + config = StorageConfig.default() + self._storage = LanceDBBackend(self.name, config) + else: + from hyperview.storage import MemoryBackend + + self._storage = MemoryBackend(self.name) + + self.last_requested_sample_ids: list[str] = [] + + def __len__(self) -> int: + return len(self._storage) + + def __iter__(self) -> Iterator[Sample]: + return iter(self._storage) + + def __getitem__(self, sample_id: str) -> Sample: + sample = self._storage.get_sample(sample_id) + if sample is None: + raise KeyError(sample_id) + return sample + + def add_sample(self, sample: Sample) -> None: + """Add a sample to the dataset (idempotent).""" + self._storage.add_sample(sample) + + def _ingest_samples( + self, + samples: list[Sample], + *, + skip_existing: bool = True, + ) -> tuple[int, int]: + """Shared ingestion helper for batch sample insertion.""" + self.last_requested_sample_ids = [sample.id for sample in samples] + + if not samples: + return 0, 0 + + skipped = 0 + if skip_existing: + all_ids = [sample.id for sample in samples] + existing_ids = self._storage.get_existing_ids(all_ids) + if existing_ids: + samples = [sample for sample in samples if sample.id not in existing_ids] + skipped = len(all_ids) - len(samples) + + if not samples: + return 0, skipped + + self._storage.add_samples_batch(samples) + + return len(samples), skipped + + def add_image( + self, + filepath: str, + label: str | None = None, + metadata: dict[str, Any] | None = None, + sample_id: str | None = None, + ) -> Sample: + """Add a single image to the dataset.""" + if sample_id is None: + sample_id = hashlib.md5(filepath.encode()).hexdigest()[:12] + + sample = Sample( + id=sample_id, + filepath=filepath, + label=label, + metadata=metadata or {}, + ) + self.add_sample(sample) + return sample + + def add_images_dir( + self, + directory: str, + extensions: tuple[str, ...] = (".jpg", ".jpeg", ".png", ".webp"), + label_from_folder: bool = False, + recursive: bool = True, + skip_existing: bool = True, + ) -> tuple[int, int]: + """Add all images from a directory.""" + directory_path = Path(directory) + if not directory_path.exists(): + raise ValueError(f"Directory does not exist: {directory_path}") + + samples = [] + pattern = "**/*" if recursive else "*" + + for path in directory_path.glob(pattern): + if path.is_file() and path.suffix.lower() in extensions: + label = path.parent.name if label_from_folder else None + sample_id = hashlib.md5(str(path).encode()).hexdigest()[:12] + sample = Sample( + id=sample_id, + filepath=str(path), + label=label, + metadata={}, + ) + samples.append(sample) + + return self._ingest_samples(samples, skip_existing=skip_existing) + + def add_from_huggingface( + self, + dataset_name: str, + config: str | None = None, + split: str = "train", + image_key: str = "img", + label_key: str | None = "fine_label", + label_names_key: str | None = None, + max_samples: int | None = None, + shuffle: bool = False, + seed: int = 42, + streaming: bool = False, + shuffle_buffer_size: int = 1000, + show_progress: bool = True, + skip_existing: bool = True, + image_format: str = "auto", + ) -> tuple[int, int]: + """Load samples from a Hugging Face dataset.""" + from hyperview.storage import StorageConfig + + source_index_key = "__hyperview_source_index" + + def attach_huggingface_source_index( + example: dict[str, Any], + index: int, + ) -> dict[str, Any]: + augmented = dict(example) + augmented[source_index_key] = index + return augmented + + if shuffle_buffer_size < 1: + raise ValueError("shuffle_buffer_size must be >= 1") + + if streaming: + ds = cast( + Any, + load_dataset( + dataset_name, + name=config, + split=split, + streaming=True, + ), + ) + else: + try: + ds = cast( + Any, + load_dataset( + dataset_name, + name=config, + split=split, + download_config=DownloadConfig(local_files_only=True), + ), + ) + except Exception: + ds = cast(Any, load_dataset(dataset_name, name=config, split=split)) + + source_fingerprint = ds._fingerprint if hasattr(ds, "_fingerprint") else None + + label_names = None + if label_key and label_names_key: + if label_names_key in ds.features: + label_names = ds.features[label_names_key].names + elif label_key: + if hasattr(ds.features[label_key], "names"): + label_names = ds.features[label_key].names + + config_name = getattr(ds.info, "config_name", None) or "default" + version = str(ds.info.version) if ds.info.version else None + fingerprint_source = source_fingerprint or _fallback_huggingface_fingerprint( + dataset_name, + config_name, + split, + version, + ) + fingerprint = fingerprint_source[:8] + + total: int | None + selected_indices: list[int] | None = None + iterator: Iterator[Any] + if streaming: + stream = ds + if hasattr(stream, "select_columns"): + columns = [image_key] + if label_key: + columns.append(label_key) + stream = stream.select_columns(list(dict.fromkeys(columns))) + stream = stream.map(attach_huggingface_source_index, with_indices=True) + if shuffle: + if hasattr(stream, "reshard"): + stream = stream.reshard() + stream = stream.shuffle(seed=seed, buffer_size=shuffle_buffer_size) + if max_samples is not None: + total = max_samples + iterator = iter(stream.take(max_samples)) + else: + total = None + iterator = iter(stream) + else: + dataset_size = len(ds) + total = dataset_size if max_samples is None else min(dataset_size, max_samples) + + if shuffle: + rng = np.random.default_rng(seed) + selected_indices = rng.permutation(dataset_size)[:total].tolist() + ds = ds.select(selected_indices) + elif max_samples is not None: + selected_indices = list(range(total)) + ds = ds.select(selected_indices) + + iterator = (ds[i] for i in range(total)) + + storage_config = StorageConfig.default() + media_dir = storage_config.get_huggingface_media_dir(dataset_name, split) + + samples: list[Sample] = [] + + if show_progress: + if total is None: + print(f"Loading samples from {dataset_name} via streaming...", flush=True) + else: + mode_suffix = " via streaming" if streaming else "" + print( + f"Loading {total} samples from {dataset_name}{mode_suffix}...", + flush=True, + ) + + started_at = time.perf_counter() + last_report_at = started_at + report_every = 50 if total is None else max(25, min(200, total // 20 or 25)) + loaded = 0 + progress_stop = threading.Event() + + def emit_progress(now: float, *, waiting_for_first_sample: bool = False) -> None: + elapsed = max(now - started_at, 1e-9) + if waiting_for_first_sample: + if total is None: + print( + "Still waiting for the first streamed sample " + f"(elapsed {_format_elapsed(elapsed)})", + flush=True, + ) + else: + print( + "Still waiting for the first streamed sample " + f"(0/{total}, elapsed {_format_elapsed(elapsed)})", + flush=True, + ) + return + + rate = loaded / elapsed + if total is None: + print( + f"Loaded {loaded} samples " + f"({rate:.1f}/s, elapsed {_format_elapsed(elapsed)})", + flush=True, + ) + return + + remaining = total - loaded + eta_seconds = remaining / rate if rate > 0 else float("inf") + print( + f"Loaded {loaded}/{total} samples " + f"({loaded / total:.0%}, {rate:.1f}/s, " + f"elapsed {_format_elapsed(elapsed)}, ETA {_format_eta(eta_seconds)})", + flush=True, + ) + + heartbeat: threading.Thread | None = None + if show_progress and streaming: + def heartbeat_reporter() -> None: + while not progress_stop.wait(10.0): + now = time.perf_counter() + if loaded == 0: + emit_progress(now, waiting_for_first_sample=True) + elif now - last_report_at >= 10.0: + emit_progress(now) + + heartbeat = threading.Thread( + target=heartbeat_reporter, + name="hyperview-hf-progress", + daemon=True, + ) + heartbeat.start() + + try: + for i, item in enumerate(iterator): + if streaming: + source_index = int(item.pop(source_index_key, i)) + else: + source_index = selected_indices[i] if selected_indices is not None else i + image = item[image_key] + + if isinstance(image, Image.Image): + pil_image = image + else: + pil_image = Image.fromarray(np.asarray(image)) + + label = None + if label_key and label_key in item: + label_idx = item[label_key] + if label_names and isinstance(label_idx, int): + label = label_names[label_idx] + else: + label = str(label_idx) + + safe_name = dataset_name.replace("/", "_") + sample_id = f"{safe_name}_{config_name}_{fingerprint}_{split}_{source_index}" + + if image_format == "auto": + original_format = getattr(pil_image, "format", None) + if original_format in ("JPEG", "JPG"): + save_format = "JPEG" + ext = ".jpg" + else: + save_format = "PNG" + ext = ".png" + elif image_format == "jpeg": + save_format = "JPEG" + ext = ".jpg" + else: + save_format = "PNG" + ext = ".png" + + metadata = { + "source": dataset_name, + "config": config_name, + "split": split, + "index": source_index, + "fingerprint": source_fingerprint, + "version": version, + } + + image_path = media_dir / f"{sample_id}{ext}" + if not image_path.exists(): + if save_format == "JPEG" or pil_image.mode in ("RGBA", "P", "L"): + pil_image = pil_image.convert("RGB") + pil_image.save(image_path, format=save_format) + + sample = Sample( + id=sample_id, + filepath=str(image_path), + label=label, + metadata=metadata, + ) + + samples.append(sample) + loaded += 1 + + if not show_progress: + continue + + now = time.perf_counter() + should_report = loaded == 1 + if total is not None and loaded == total: + should_report = True + if loaded % report_every == 0: + should_report = True + if now - last_report_at >= 5.0: + should_report = True + if not should_report: + continue + + emit_progress(now) + last_report_at = now + finally: + progress_stop.set() + if heartbeat is not None: + heartbeat.join(timeout=0.1) + + if total is None: + total = loaded + + num_added, skipped = self._ingest_samples(samples, skip_existing=skip_existing) + + if show_progress: + print( + f"Prepared {loaded} samples in {_format_elapsed(time.perf_counter() - started_at)}", + flush=True, + ) + print(f"Images saved to: {media_dir}", flush=True) + if skipped > 0: + print(f"Skipped {skipped} existing samples", flush=True) + + return num_added, skipped + + def compute_embeddings( + self, + model: str, + *, + provider: str | None = None, + checkpoint: str | None = None, + batch_size: int = 32, + sample_ids: list[str] | None = None, + show_progress: bool = True, + **provider_kwargs: Any, + ) -> str: + """Compute embeddings for samples that don't have them yet. + + Embeddings are stored in a dedicated space keyed by the embedding spec. + + Args: + model: Model identifier (required). Use a HuggingFace model_id + (e.g. 'openai/clip-vit-base-patch32') for embed-anything, or a + hyper-models name (e.g. 'hycoclip-vit-s') for hyperbolic embeddings. + provider: Explicit provider identifier. If not specified, auto-detected: + 'hyper-models' if model matches a hyper-models name, else 'embed-anything'. + Available providers: `hyperview.embeddings.list_embedding_providers()`. + checkpoint: Checkpoint path/URL (hf://... or local path) for weight-only models. + batch_size: Batch size for processing. + sample_ids: Optional subset of sample IDs to ensure embeddings for. + If omitted, computes embeddings for all samples missing them. + show_progress: Whether to show progress bar. + **provider_kwargs: Additional kwargs passed to the embedding function. + + Returns: + space_key for the embedding space. + + Raises: + ValueError: If model is not provided. + """ + if not model: + raise ValueError( + "model is required. Examples: 'openai/clip-vit-base-patch32' (CLIP), " + "'hycoclip-vit-s' (hyperbolic). See hyperview.embeddings.list_embedding_providers()." + ) + + from hyperview.embeddings.engine import EmbeddingSpec + from hyperview.embeddings.pipelines import compute_embeddings + + if provider is None: + provider = "embed-anything" + try: + import hyper_models + if model in hyper_models.list_models(): + provider = "hyper-models" + except ImportError: + pass + spec = EmbeddingSpec( + provider=provider, + model_id=model, + checkpoint=checkpoint, + provider_kwargs=provider_kwargs, + ) + + space_key, _num_computed, _num_skipped = compute_embeddings( + storage=self._storage, + spec=spec, + batch_size=batch_size, + sample_ids=sample_ids, + show_progress=show_progress, + ) + return space_key + + def compute_visualization( + self, + space_key: str | None = None, + method: str = "umap", + layout: str = DEFAULT_VISUALIZATION_LAYOUT, + n_neighbors: int = 15, + min_dist: float = 0.1, + metric: str = "cosine", + force: bool = False, + ) -> str: + """Compute projections for visualization. + + Args: + space_key: Embedding space to project. If None, uses the first available. + method: Projection method ('umap' supported). + layout: Layout spec like 'euclidean', 'euclidean:3d', or 'spherical'. + Omitting the suffix defaults to 2D for Euclidean/Poincare and 3D for spherical. + n_neighbors: Number of neighbors for UMAP. + min_dist: Minimum distance for UMAP. + metric: Distance metric for UMAP. + force: Force recomputation even if layout exists. + + Returns: + layout_key for the computed layout. + """ + from hyperview.embeddings.pipelines import compute_layout + + geometry, layout_dimension = parse_visualization_layout(layout) + + return compute_layout( + storage=self._storage, + space_key=space_key, + method=method, + geometry=geometry, + layout_dimension=layout_dimension, + n_neighbors=n_neighbors, + min_dist=min_dist, + metric=metric, + force=force, + show_progress=True, + ) + + def list_spaces(self) -> list[Any]: + """List all embedding spaces in this dataset.""" + return self._storage.list_spaces() + + def list_layouts(self) -> list[Any]: + """List all layouts in this dataset (returns LayoutInfo objects).""" + return self._storage.list_layouts() + + def find_similar( + self, + sample_id: str, + k: int = 10, + space_key: str | None = None, + ) -> list[tuple[Sample, float]]: + """Find k most similar samples to a given sample. + + Args: + sample_id: ID of the query sample. + k: Number of neighbors to return. + space_key: Embedding space to search in. If None, uses first available. + + Returns: + List of (sample, distance) tuples, sorted by distance ascending. + """ + return self._storage.find_similar(sample_id, k, space_key) + + def find_similar_by_vector( + self, + vector: list[float], + k: int = 10, + space_key: str | None = None, + ) -> list[tuple[Sample, float]]: + """Find k most similar samples to a given vector. + + Args: + vector: Query vector. + k: Number of neighbors to return. + space_key: Embedding space to search in. If None, uses first available. + + Returns: + List of (sample, distance) tuples, sorted by distance ascending. + """ + return self._storage.find_similar_by_vector(vector, k, space_key) + + def set_coords( + self, + geometry: str, + ids: list[str], + coords: np.ndarray | list[list[float]], + ) -> str: + """Set precomputed coordinates for visualization. + + Use this when you have precomputed projections and want to skip + embedding computation. Useful for smoke tests or external projections. + + Args: + geometry: "euclidean", "poincare", or "spherical". + ids: List of sample IDs. + coords: (N, D) array of coordinates. + + Returns: + The layout_key for the stored coordinates. + + Example: + >>> dataset.set_coords("euclidean", ["s0", "s1"], [[0.1, 0.2], [0.3, 0.4]]) + >>> dataset.set_coords("spherical", ["s0", "s1"], [[0.1, 0.2, 0.3], [0.3, 0.4, 0.5]]) + >>> hv.launch(dataset) + """ + if geometry not in ("euclidean", "poincare", "spherical"): + raise ValueError( + f"geometry must be 'euclidean', 'poincare', or 'spherical', got '{geometry}'" + ) + + coords_arr = np.asarray(coords, dtype=np.float32) + if coords_arr.ndim != 2 or coords_arr.shape[1] < 2: + raise ValueError(f"coords must be (N, D) with D>=2, got shape {coords_arr.shape}") + + layout_dimension = normalize_layout_dimension(int(coords_arr.shape[1])) + if geometry == "poincare" and layout_dimension != 2: + raise ValueError("poincare precomputed layouts must be 2D") + + # Ensure a synthetic space exists (required by launch()) + space_key = f"precomputed_{layout_dimension}d" + if not any(s.space_key == space_key for s in self._storage.list_spaces()): + precomputed_config = { + "provider": "precomputed", + "geometry": "unknown", # Precomputed coords don't have a source embedding geometry + } + self._storage.ensure_space(space_key, dim=layout_dimension, config=precomputed_config) + + layout_key = make_layout_key( + space_key, + method="precomputed", + geometry=geometry, + layout_dimension=layout_dimension, + ) + + # Ensure layout registry entry exists + self._storage.ensure_layout( + layout_key=layout_key, + space_key=space_key, + method="precomputed", + geometry=geometry, + params=None, + ) + + self._storage.add_layout_coords(layout_key, list(ids), coords_arr) + return layout_key + + @property + def samples(self) -> list[Sample]: + """Get all samples as a list.""" + return self._storage.get_all_samples() + + @property + def labels(self) -> list[str]: + """Get unique labels in the dataset.""" + return self._storage.get_unique_labels() + + def filter(self, predicate: Callable[[Sample], bool]) -> list[Sample]: + """Filter samples based on a predicate function.""" + return self._storage.filter(predicate) + + def get_samples_paginated( + self, + offset: int = 0, + limit: int = 100, + label: str | None = None, + ) -> tuple[list[Sample], int]: + """Get paginated samples. + + This avoids loading all samples into memory and is used by the server + API for efficient pagination. + """ + return self._storage.get_samples_paginated(offset=offset, limit=limit, label=label) + + def get_samples_by_ids(self, sample_ids: list[str]) -> list[Sample]: + """Retrieve multiple samples by ID. + + The returned list is aligned to the input order and skips missing IDs. + """ + return self._storage.get_samples_by_ids(sample_ids) + + def get_visualization_data( + self, + layout_key: str, + ) -> tuple[list[str], list[str | None], np.ndarray]: + """Get visualization data (ids, labels, coords) for a layout.""" + layout_dimension = parse_layout_dimension(layout_key) + + layout_ids, layout_coords = self._storage.get_layout_coords(layout_key) + if not layout_ids: + return [], [], np.empty((0, layout_dimension), dtype=np.float32) + + labels_by_id = self._storage.get_labels_by_ids(layout_ids) + + ids: list[str] = [] + labels: list[str | None] = [] + coords: list[np.ndarray] = [] + + for i, sample_id in enumerate(layout_ids): + if sample_id in labels_by_id: + ids.append(sample_id) + labels.append(labels_by_id[sample_id]) + coords.append(layout_coords[i]) + + if not coords: + return [], [], np.empty((0, layout_dimension), dtype=np.float32) + + return ids, labels, np.asarray(coords, dtype=np.float32) + + + def get_lasso_candidates_aabb( + self, + *, + layout_key: str, + x_min: float, + x_max: float, + y_min: float, + y_max: float, + label_filter: str | None = None, + ) -> tuple[list[str], np.ndarray]: + """Return candidate (id, xy) rows within an AABB for a layout.""" + return self._storage.get_lasso_candidates_aabb( + layout_key=layout_key, + x_min=x_min, + x_max=x_max, + y_min=y_min, + y_max=y_max, + label_filter=label_filter, + ) + + def save(self, filepath: str, include_thumbnails: bool = True) -> None: + """Export dataset to a JSON file. + + Args: + filepath: Path to save the JSON file. + include_thumbnails: Whether to include cached thumbnails. + """ + samples = self._storage.get_all_samples() + if include_thumbnails: + for s in samples: + s.cache_thumbnail() + + data = { + "name": self.name, + "samples": [ + { + "id": s.id, + "filepath": s.filepath, + "label": s.label, + "metadata": s.metadata, + "thumbnail_base64": s.thumbnail_base64 if include_thumbnails else None, + } + for s in samples + ], + } + with open(filepath, "w") as f: + json.dump(data, f) + + @classmethod + def load(cls, filepath: str, persist: bool = False) -> Dataset: + """Load dataset from a JSON file. + + Args: + filepath: Path to the JSON file. + persist: If True, persist the loaded data to LanceDB. + If False (default), keep in memory only. + + Returns: + Dataset instance. + """ + with open(filepath) as f: + data = json.load(f) + + dataset = cls(name=data["name"], persist=persist) + + # Add samples + samples = [] + for s_data in data["samples"]: + sample = Sample( + id=s_data["id"], + filepath=s_data["filepath"], + label=s_data.get("label"), + metadata=s_data.get("metadata", {}), + thumbnail_base64=s_data.get("thumbnail_base64"), + ) + samples.append(sample) + + dataset._storage.add_samples_batch(samples) + return dataset diff --git a/vendor/hyperview/core/sample.py b/vendor/hyperview/core/sample.py new file mode 100644 index 0000000000000000000000000000000000000000..d0e3f38afb2541915f830ad7278e5e225b1a141d --- /dev/null +++ b/vendor/hyperview/core/sample.py @@ -0,0 +1,95 @@ +"""Sample class representing a single data point in a dataset.""" + +import base64 +import io +from pathlib import Path +from typing import Any + +from PIL import Image +from pydantic import BaseModel, Field + + +class Sample(BaseModel): + """A single sample in a HyperView dataset. + + Samples are pure metadata containers. Embeddings and layouts are stored + separately in dedicated tables (per embedding space / per layout). + """ + + id: str = Field(..., description="Unique identifier for the sample") + filepath: str = Field(..., description="Path to the image file") + label: str | None = Field(default=None, description="Label for the sample") + metadata: dict[str, Any] = Field(default_factory=dict, description="Additional metadata") + thumbnail_base64: str | None = Field(default=None, description="Cached thumbnail as base64") + width: int | None = Field(default=None, description="Image width in pixels") + height: int | None = Field(default=None, description="Image height in pixels") + + model_config = {"arbitrary_types_allowed": True} + + @property + def filename(self) -> str: + """Get the filename from the filepath.""" + return Path(self.filepath).name + + def load_image(self) -> Image.Image: + """Load the image from disk.""" + return Image.open(self.filepath) + + def get_thumbnail(self, size: tuple[int, int] = (128, 128)) -> Image.Image: + """Get a thumbnail of the image. Also captures original dimensions.""" + img = self.load_image() + # Capture original dimensions while we have the image loaded + if self.width is None or self.height is None: + self.width, self.height = img.size + img.thumbnail(size, Image.Resampling.LANCZOS) + return img + + def _encode_thumbnail(self, size: tuple[int, int] = (128, 128)) -> str: + """Encode thumbnail as base64 JPEG.""" + thumb = self.get_thumbnail(size) + if thumb.mode in ("RGBA", "P"): + thumb = thumb.convert("RGB") + buffer = io.BytesIO() + thumb.save(buffer, format="JPEG", quality=85) + return base64.b64encode(buffer.getvalue()).decode("utf-8") + + def get_thumbnail_base64(self, size: tuple[int, int] = (128, 128)) -> str: + """Get thumbnail as base64 encoded string.""" + return self.thumbnail_base64 or self._encode_thumbnail(size) + + def cache_thumbnail(self, size: tuple[int, int] = (128, 128)) -> None: + """Cache the thumbnail as base64 for persistence.""" + if self.thumbnail_base64 is None: + self.thumbnail_base64 = self._encode_thumbnail(size) + + def to_api_dict(self, include_thumbnail: bool = True) -> dict[str, Any]: + """Convert to dictionary for API response.""" + # Ensure dimensions are populated (loads image if needed but not cached) + if self.width is None or self.height is None: + self.ensure_dimensions() + + data = { + "id": self.id, + "filepath": self.filepath, + "filename": self.filename, + "label": self.label, + "metadata": self.metadata, + "width": self.width, + "height": self.height, + } + if include_thumbnail: + data["thumbnail"] = self.get_thumbnail_base64() + return data + + def ensure_dimensions(self) -> None: + """Load image dimensions if not already set.""" + if self.width is None or self.height is None: + try: + img = self.load_image() + self.width, self.height = img.size + except Exception: + # If image can't be loaded, leave as None + pass + + + diff --git a/vendor/hyperview/core/selection.py b/vendor/hyperview/core/selection.py new file mode 100644 index 0000000000000000000000000000000000000000..573ddd42cbe9c713911ccd6c3fba56e458e17d1d --- /dev/null +++ b/vendor/hyperview/core/selection.py @@ -0,0 +1,309 @@ +"""Selection / geometry helpers. + +This module contains small, backend-agnostic utilities used by selection +endpoints for both 2D and 3D lasso selection. +""" + +from __future__ import annotations + +import math + +import numpy as np +from pydantic import BaseModel + + +def points_in_polygon(points_xy: np.ndarray, polygon_xy: np.ndarray) -> np.ndarray: + """Vectorized point-in-polygon (even-odd rule / ray casting). + + Args: + points_xy: Array of shape (m, 2) with point coordinates. + polygon_xy: Array of shape (n, 2) with polygon vertices. + + Returns: + Boolean mask of length m, True where point lies inside polygon. + + Notes: + Boundary points may be classified as outside depending on floating point + ties (common for lasso selection tools). + """ + if polygon_xy.shape[0] < 3: + return np.zeros((points_xy.shape[0],), dtype=bool) + + x = points_xy[:, 0] + y = points_xy[:, 1] + poly_x = polygon_xy[:, 0] + poly_y = polygon_xy[:, 1] + + inside = np.zeros((points_xy.shape[0],), dtype=bool) + j = polygon_xy.shape[0] - 1 + + for i in range(polygon_xy.shape[0]): + xi = poly_x[i] + yi = poly_y[i] + xj = poly_x[j] + yj = poly_y[j] + + # Half-open y-interval to avoid double-counting vertices. + intersects = (yi > y) != (yj > y) + + denom = yj - yi + # denom == 0 => intersects is always False; add tiny epsilon to avoid warnings. + x_intersect = (xj - xi) * (y - yi) / (denom + 1e-30) + xi + + inside ^= intersects & (x < x_intersect) + j = i + + return inside + + +class OrbitViewState3D(BaseModel): + """Orbit camera state for server-side 3D lasso projection.""" + + yaw: float + pitch: float + distance: float + target_x: float + target_y: float + target_z: float + ortho_scale: float + + +def _normalize_vec(v: np.ndarray) -> np.ndarray: + norm = float(np.linalg.norm(v)) + if norm < 1e-9: + return np.zeros_like(v, dtype=np.float32) + return (v / norm).astype(np.float32) + + +def _mat4_look_at(eye: np.ndarray, target: np.ndarray, up: np.ndarray) -> np.ndarray: + """Column-major lookAt matrix matching hyper-scatter 3D renderer math.""" + z_axis = _normalize_vec(eye - target) + if float(np.linalg.norm(z_axis)) < 1e-9: + z_axis = np.array([0.0, 0.0, 1.0], dtype=np.float32) + + x_axis = _normalize_vec(np.cross(up, z_axis)) + if float(np.linalg.norm(x_axis)) < 1e-9: + x_axis = np.array([1.0, 0.0, 0.0], dtype=np.float32) + + y_axis = np.cross(z_axis, x_axis).astype(np.float32) + + out = np.zeros(16, dtype=np.float32) + out[0] = x_axis[0] + out[1] = y_axis[0] + out[2] = z_axis[0] + out[3] = 0.0 + + out[4] = x_axis[1] + out[5] = y_axis[1] + out[6] = z_axis[1] + out[7] = 0.0 + + out[8] = x_axis[2] + out[9] = y_axis[2] + out[10] = z_axis[2] + out[11] = 0.0 + + out[12] = -float(np.dot(x_axis, eye)) + out[13] = -float(np.dot(y_axis, eye)) + out[14] = -float(np.dot(z_axis, eye)) + out[15] = 1.0 + return out + + +def _mat4_ortho( + left: float, + right: float, + bottom: float, + top: float, + near: float, + far: float, +) -> np.ndarray: + """Column-major orthographic matrix matching hyper-scatter 3D renderer math.""" + rl = right - left + tb = top - bottom + fn = far - near + + if abs(rl) < 1e-12 or abs(tb) < 1e-12 or abs(fn) < 1e-12: + raise ValueError("Invalid orthographic projection bounds") + + out = np.zeros(16, dtype=np.float32) + out[0] = 2.0 / rl + out[5] = 2.0 / tb + out[10] = -2.0 / fn + out[12] = -(right + left) / rl + out[13] = -(top + bottom) / tb + out[14] = -(far + near) / fn + out[15] = 1.0 + return out + + +def _mat4_multiply(a: np.ndarray, b: np.ndarray) -> np.ndarray: + """Column-major matrix multiply matching hyper-scatter mat4Multiply.""" + out = np.zeros(16, dtype=np.float32) + for col in range(4): + for row in range(4): + out[col * 4 + row] = ( + a[0 * 4 + row] * b[col * 4 + 0] + + a[1 * 4 + row] * b[col * 4 + 1] + + a[2 * 4 + row] * b[col * 4 + 2] + + a[3 * 4 + row] * b[col * 4 + 3] + ) + return out + + +def _build_mvp_for_orbit( + view: OrbitViewState3D, + coords: np.ndarray, + viewport_width: int, + viewport_height: int, +) -> np.ndarray: + cp = math.cos(view.pitch) + sp = math.sin(view.pitch) + cy = math.cos(view.yaw) + sy = math.sin(view.yaw) + + dir_target_to_eye = np.array([cp * sy, sp, cp * cy], dtype=np.float32) + target = np.array([view.target_x, view.target_y, view.target_z], dtype=np.float32) + eye = target + dir_target_to_eye * float(view.distance) + + world_up = np.array([0.0, 1.0, 0.0], dtype=np.float32) + view_matrix = _mat4_look_at(eye, target, world_up) + + aspect = float(viewport_width) / float(max(1, viewport_height)) + half_h = max(0.01, float(view.ortho_scale)) + half_w = half_h * aspect + + center = np.mean(coords, axis=0) + scene_radius = float(np.max(np.linalg.norm(coords - center, axis=1))) + scene_radius = max(scene_radius, 0.25) + + near = 0.01 + far = max(near + 1.0, float(view.distance) + scene_radius * 6.0 + 10.0) + + proj_matrix = _mat4_ortho(-half_w, half_w, -half_h, half_h, near, far) + return _mat4_multiply(proj_matrix, view_matrix) + + +def _project_points_3d_to_screen( + mvp: np.ndarray, + coords: np.ndarray, + width: int, + height: int, +) -> tuple[np.ndarray, np.ndarray, np.ndarray, np.ndarray]: + x = coords[:, 0] + y = coords[:, 1] + z = coords[:, 2] + + clip_x = mvp[0] * x + mvp[4] * y + mvp[8] * z + mvp[12] + clip_y = mvp[1] * x + mvp[5] * y + mvp[9] * z + mvp[13] + clip_z = mvp[2] * x + mvp[6] * y + mvp[10] * z + mvp[14] + clip_w = mvp[3] * x + mvp[7] * y + mvp[11] * z + mvp[15] + + inv_w = np.zeros_like(clip_w) + np.divide(1.0, clip_w, out=inv_w, where=np.abs(clip_w) > 1e-12) + ndc_x = clip_x * inv_w + ndc_y = clip_y * inv_w + ndc_z = clip_z * inv_w + + finite = np.isfinite(ndc_x) & np.isfinite(ndc_y) & np.isfinite(ndc_z) + in_clip = ( + finite + & (ndc_x >= -1.0) + & (ndc_x <= 1.0) + & (ndc_y >= -1.0) + & (ndc_y <= 1.0) + & (ndc_z >= -1.0) + & (ndc_z <= 1.0) + ) + + screen_x = (ndc_x * 0.5 + 0.5) * float(width) + screen_y = (1.0 - (ndc_y * 0.5 + 0.5)) * float(height) + depth = ndc_z * 0.5 + 0.5 + + pixel_x = np.floor(screen_x).astype(np.int64) + pixel_y = np.floor(screen_y).astype(np.int64) + pixel_ok = ( + in_clip + & (pixel_x >= 0) + & (pixel_x < width) + & (pixel_y >= 0) + & (pixel_y < height) + ) + + pixel_index = np.full(coords.shape[0], -1, dtype=np.int64) + pixel_index[pixel_ok] = pixel_y[pixel_ok] * width + pixel_x[pixel_ok] + + return screen_x, screen_y, depth, pixel_index + + +def select_ids_for_3d_lasso( + *, + ids: list[str], + labels: list[str | None], + coords: np.ndarray, + geometry: str, + polygon: np.ndarray, + view: OrbitViewState3D, + viewport_width: int, + viewport_height: int, + label_filter: str | None, +) -> list[str]: + width = max(1, int(viewport_width)) + height = max(1, int(viewport_height)) + + if label_filter is not None: + label_mask = np.fromiter( + (label == label_filter for label in labels), + dtype=bool, + count=len(labels), + ) + if not np.any(label_mask): + return [] + kept_indices = np.flatnonzero(label_mask) + ids = [ids[int(i)] for i in kept_indices] + coords = coords[label_mask] + + if geometry == "spherical": + norms = np.linalg.norm(coords, axis=1, keepdims=True) + coords = coords / np.maximum(norms, 1e-8) + + mvp = _build_mvp_for_orbit(view, coords, width, height) + screen_x, screen_y, depth, pixel_index = _project_points_3d_to_screen( + mvp, coords, width, height + ) + + pixel_count = max(1, width * height) + depth_buffer = np.full(pixel_count, np.inf, dtype=np.float32) + + valid_mask = pixel_index >= 0 + valid_pixels = pixel_index[valid_mask] + valid_depth = depth[valid_mask] + np.minimum.at(depth_buffer, valid_pixels, valid_depth) + + visible_mask = np.zeros(coords.shape[0], dtype=bool) + visible_mask[valid_mask] = depth[valid_mask] <= depth_buffer[valid_pixels] + 1e-4 + + x_min = float(np.min(polygon[:, 0])) + x_max = float(np.max(polygon[:, 0])) + y_min = float(np.min(polygon[:, 1])) + y_max = float(np.max(polygon[:, 1])) + + candidate_mask = ( + visible_mask + & (screen_x >= x_min) + & (screen_x <= x_max) + & (screen_y >= y_min) + & (screen_y <= y_max) + ) + + candidate_indices = np.flatnonzero(candidate_mask) + if candidate_indices.size == 0: + return [] + + candidate_points = np.column_stack( + (screen_x[candidate_indices], screen_y[candidate_indices]) + ).astype(np.float32) + inside = points_in_polygon(candidate_points, polygon) + selected_indices = candidate_indices[np.flatnonzero(inside)] + + return [ids[int(i)] for i in selected_indices] diff --git a/vendor/hyperview/embeddings/__init__.py b/vendor/hyperview/embeddings/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..24ba7aa553e4ef2618ebe1f752e928733aa080a5 --- /dev/null +++ b/vendor/hyperview/embeddings/__init__.py @@ -0,0 +1,31 @@ +"""Embedding computation and projection.""" + +from hyperview.embeddings.compute import EmbeddingComputer +from hyperview.embeddings.engine import ( + EmbeddingSpec, + get_engine, + get_provider_info, + list_embedding_providers, +) + +# Register HyperView providers into LanceDB registry. +import hyperview.embeddings.providers.lancedb_providers as _lancedb_providers # noqa: F401 + + +def __getattr__(name: str): + """Lazy import for heavy dependencies (UMAP/numba).""" + if name == "ProjectionEngine": + from hyperview.embeddings.projection import ProjectionEngine + return ProjectionEngine + raise AttributeError(f"module {__name__!r} has no attribute {name!r}") + + +__all__ = [ + "EmbeddingComputer", + "EmbeddingSpec", + "ProjectionEngine", + # Provider utilities + "get_engine", + "get_provider_info", + "list_embedding_providers", +] diff --git a/vendor/hyperview/embeddings/__pycache__/__init__.cpython-312.pyc b/vendor/hyperview/embeddings/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3d6f5297519f5533d100e2f6797b965740989458 Binary files /dev/null and b/vendor/hyperview/embeddings/__pycache__/__init__.cpython-312.pyc differ diff --git a/vendor/hyperview/embeddings/__pycache__/compute.cpython-312.pyc b/vendor/hyperview/embeddings/__pycache__/compute.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7d4202836f35ba73f9952e21d5c50f4f7472621b Binary files /dev/null and b/vendor/hyperview/embeddings/__pycache__/compute.cpython-312.pyc differ diff --git a/vendor/hyperview/embeddings/__pycache__/engine.cpython-312.pyc b/vendor/hyperview/embeddings/__pycache__/engine.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..02c81eb481b3077976aa518ea081acde4a1c9051 Binary files /dev/null and b/vendor/hyperview/embeddings/__pycache__/engine.cpython-312.pyc differ diff --git a/vendor/hyperview/embeddings/compute.py b/vendor/hyperview/embeddings/compute.py new file mode 100644 index 0000000000000000000000000000000000000000..d2026b528bc3b37b74aafd84c35cee71fb8d8fc4 --- /dev/null +++ b/vendor/hyperview/embeddings/compute.py @@ -0,0 +1,89 @@ +"""Image embedding computation via EmbedAnything.""" + +import os +import tempfile +from pathlib import Path + +import numpy as np +from embed_anything import EmbeddingModel +from PIL import Image + +from hyperview.core.sample import Sample + + +class EmbeddingComputer: + """Compute embeddings for image samples using EmbedAnything.""" + + def __init__(self, model: str): + """Initialize the embedding computer. + + Args: + model: HuggingFace model ID to load via EmbedAnything. + """ + if not model or not model.strip(): + raise ValueError("model must be a non-empty HuggingFace model_id") + + self.model_id = model + self._model: EmbeddingModel | None = None + + def _get_model(self) -> EmbeddingModel: + """Lazily initialize the EmbedAnything model.""" + if self._model is None: + self._model = EmbeddingModel.from_pretrained_hf(model_id=self.model_id) + return self._model + + def _load_rgb_image(self, sample: Sample) -> Image.Image: + """Load an image and normalize it to RGB. + + For file-backed samples, returns an in-memory copy and closes the file + handle immediately to avoid leaking descriptors during batch processing. + """ + with sample.load_image() as img: + img.load() + if img.mode != "RGB": + return img.convert("RGB") + return img.copy() + + def _embed_file(self, file_path: str) -> np.ndarray: + model = self._get_model() + result = model.embed_file(file_path) + + if not result: + raise RuntimeError(f"EmbedAnything returned no embeddings for: {file_path}") + if len(result) != 1: + raise RuntimeError( + f"Expected 1 embedding for an image file, got {len(result)}: {file_path}" + ) + + return np.asarray(result[0].embedding, dtype=np.float32) + + def _embed_pil_image(self, image: Image.Image) -> np.ndarray: + temp_fd, temp_path = tempfile.mkstemp(suffix=".png") + os.close(temp_fd) + try: + image.save(temp_path, format="PNG") + return self._embed_file(temp_path) + finally: + Path(temp_path).unlink(missing_ok=True) + + def compute_single(self, sample: Sample) -> np.ndarray: + """Compute embedding for a single sample.""" + image = self._load_rgb_image(sample) + return self._embed_pil_image(image) + + def compute_batch( + self, + samples: list[Sample], + batch_size: int = 32, + show_progress: bool = True, + ) -> list[np.ndarray]: + """Compute embeddings for a list of samples.""" + if batch_size <= 0: + raise ValueError("batch_size must be > 0") + self._get_model() + + if show_progress: + print(f"Computing embeddings for {len(samples)} samples...") + + return [self.compute_single(sample) for sample in samples] + diff --git a/vendor/hyperview/embeddings/engine.py b/vendor/hyperview/embeddings/engine.py new file mode 100644 index 0000000000000000000000000000000000000000..8a194272237648a03875afa2ef5a1d0a620d7744 --- /dev/null +++ b/vendor/hyperview/embeddings/engine.py @@ -0,0 +1,391 @@ +"""Embedding spec + engine built on LanceDB's embedding registry.""" + +from __future__ import annotations + +import hashlib +import json +import math +import time +from dataclasses import dataclass, field +from typing import Any, Literal + +import numpy as np + +# Register HyperView providers into LanceDB registry. +import hyperview.embeddings.providers.lancedb_providers as _lancedb_providers # noqa: F401 + +__all__ = [ + "EmbeddingSpec", + "EmbeddingEngine", + "get_engine", + "list_embedding_providers", + "get_provider_info", +] + +HYPERBOLIC_PROVIDERS = frozenset({"hyper-models"}) + + +def _format_elapsed(seconds: float) -> str: + if seconds < 60: + return f"{seconds:.1f}s" + total_seconds = int(round(seconds)) + minutes, secs = divmod(total_seconds, 60) + if minutes < 60: + return f"{minutes}m {secs:02d}s" + hours, minutes = divmod(minutes, 60) + return f"{hours}h {minutes:02d}m {secs:02d}s" + + +def _format_eta(seconds: float) -> str: + if not math.isfinite(seconds) or seconds < 0: + return "unknown" + return _format_elapsed(seconds) + + +@dataclass +class EmbeddingSpec: + """Specification for an embedding model. + + All providers live in the LanceDB registry. HyperView's custom providers + (embed-anything, hyper-models) are registered on import. + + Attributes: + provider: Provider identifier (e.g., 'embed-anything', 'hyper-models', 'open-clip') + model_id: Model identifier (HuggingFace model_id, checkpoint name, etc.) + checkpoint: Optional checkpoint path/URL for weight-only models + provider_kwargs: Additional kwargs passed to the embedding function + modality: What input type this embedder handles + """ + + provider: str + model_id: str | None = None + checkpoint: str | None = None + provider_kwargs: dict[str, Any] = field(default_factory=dict) + modality: Literal["image", "text", "multimodal"] = "image" + + @property + def geometry(self) -> Literal["euclidean", "hyperboloid"]: + """Get the output geometry for this spec.""" + + if self.provider == "hyper-models": + model_name = self.model_id or self.provider_kwargs.get("name") + if model_name is None: + return "hyperboloid" + import hyper_models + + geom = str(hyper_models.get_model_info(str(model_name)).geometry) + return "hyperboloid" if geom in ("hyperboloid", "poincare") else "euclidean" + + if self.provider in HYPERBOLIC_PROVIDERS: + return "hyperboloid" + return "euclidean" + + def to_dict(self) -> dict[str, Any]: + """Convert to JSON-serializable dict for persistence.""" + d: dict[str, Any] = { + "provider": self.provider, + "modality": self.modality, + "geometry": self.geometry, + } + if self.model_id: + d["model_id"] = self.model_id + if self.checkpoint: + d["checkpoint"] = self.checkpoint + if self.provider_kwargs: + d["provider_kwargs"] = self.provider_kwargs + return d + + @classmethod + def from_dict(cls, d: dict[str, Any]) -> EmbeddingSpec: + """Create from dict (e.g., loaded from JSON).""" + return cls( + provider=d["provider"], + model_id=d.get("model_id"), + checkpoint=d.get("checkpoint"), + provider_kwargs=d.get("provider_kwargs", {}), + modality=d.get("modality", "image"), + ) + + def content_hash(self) -> str: + """Generate a short hash of the spec for collision-resistant keys.""" + content = json.dumps(self.to_dict(), sort_keys=True) + return hashlib.sha256(content.encode()).hexdigest()[:12] + + def make_space_key(self) -> str: + """Generate a collision-resistant space_key from this spec. + + Format: {provider}__{slugified_model_id}__{content_hash} + """ + from hyperview.storage.schema import slugify_model_id + + model_part = self.model_id or self.checkpoint or "default" + slug = slugify_model_id(model_part) + content_hash = self.content_hash() + return f"{self.provider}__{slug}__{content_hash}" + + +class EmbeddingEngine: + """Embedding engine using LanceDB registry. + + All providers are accessed through the LanceDB embedding registry. + HyperView providers are registered automatically on import. + """ + + def __init__(self) -> None: + self._cache: dict[str, Any] = {} # spec_hash -> embedding function + + def get_function(self, spec: EmbeddingSpec) -> Any: + """Get an embedding function from LanceDB registry. + + Args: + spec: Embedding specification. + + Returns: + LanceDB EmbeddingFunction instance. + + Raises: + ValueError: If provider not found in registry. + """ + cache_key = spec.content_hash() + if cache_key in self._cache: + return self._cache[cache_key] + + from lancedb.embeddings import get_registry + + registry = get_registry() + + # Get provider factory from registry + try: + factory = registry.get(spec.provider) + except KeyError: + available = list_embedding_providers() + raise ValueError( + f"Unknown provider: '{spec.provider}'. " + f"Available: {', '.join(sorted(available))}" + ) from None + + create_kwargs: dict[str, Any] = {} + if spec.model_id: + create_kwargs["name"] = spec.model_id + + if spec.checkpoint: + create_kwargs["checkpoint"] = spec.checkpoint + + create_kwargs.update(spec.provider_kwargs) + + try: + func = factory.create(**create_kwargs) + except ImportError as e: + raise ImportError( + f"Provider '{spec.provider}' requires additional dependencies. " + "Install the provider's extra dependencies and try again." + ) from e + + self._cache[cache_key] = func + return func + + def embed_images( + self, + samples: list[Any], + spec: EmbeddingSpec, + batch_size: int = 32, + show_progress: bool = True, + ) -> np.ndarray: + """Compute embeddings for image samples. + + Args: + samples: List of Sample objects with image filepaths. + spec: Embedding specification. + batch_size: Batch size for processing. + show_progress: Whether to show progress. + + Returns: + Array of shape (N, D) where N is len(samples) and D is embedding dim. + """ + provider_target = spec.model_id or spec.checkpoint or spec.provider + if show_progress: + print( + f"Preparing embedding provider '{spec.provider}' ({provider_target})...", + flush=True, + ) + + func = self.get_function(spec) + + if hasattr(func, "set_progress_enabled"): + func.set_progress_enabled(show_progress) + + if show_progress: + print(f"Computing embeddings for {len(samples)} samples...", flush=True) + + all_embeddings: list[np.ndarray] = [] + total_samples = len(samples) + total_batches = max(1, math.ceil(total_samples / batch_size)) + report_every_batches = 1 if total_batches <= 20 else max(1, total_batches // 20) + started_at = time.perf_counter() + last_report_at = started_at + + for batch_index, i in enumerate(range(0, len(samples), batch_size), start=1): + batch_samples = samples[i:i + batch_size] + + batch_paths = [s.filepath for s in batch_samples] + batch_embeddings = func.compute_source_embeddings(batch_paths) + all_embeddings.extend(batch_embeddings) + + if not show_progress: + continue + + completed = len(all_embeddings) + now = time.perf_counter() + should_report = batch_index == 1 or batch_index == total_batches + if batch_index % report_every_batches == 0: + should_report = True + if now - last_report_at >= 10.0: + should_report = True + if not should_report: + continue + + elapsed = max(now - started_at, 1e-9) + rate = completed / elapsed + remaining = total_samples - completed + eta_seconds = remaining / rate if rate > 0 else float("inf") + print( + f"Embedded {completed}/{total_samples} samples " + f"({completed / total_samples:.0%}, batch {batch_index}/{total_batches}, " + f"{rate:.1f}/s, elapsed {_format_elapsed(elapsed)}, " + f"ETA {_format_eta(eta_seconds)})", + flush=True, + ) + last_report_at = now + + return np.array(all_embeddings, dtype=np.float32) + + def embed_texts( + self, + texts: list[str], + spec: EmbeddingSpec, + ) -> np.ndarray: + """Compute embeddings for text inputs. + + Args: + texts: List of text strings. + spec: Embedding specification. + + Returns: + Array of shape (N, D). + """ + func = self.get_function(spec) + + if hasattr(func, "generate_embeddings"): + out = func.generate_embeddings(texts) + return np.asarray(out, dtype=np.float32) + + embeddings: list[np.ndarray] = [] + for text in texts: + out = func.compute_query_embeddings(text) + if not out: + raise RuntimeError(f"Provider '{spec.provider}' returned no embedding for query") + embeddings.append(np.asarray(out[0], dtype=np.float32)) + return np.vstack(embeddings) + + def get_space_config(self, spec: EmbeddingSpec, dim: int) -> dict[str, Any]: + """Get space configuration for storage. + + Args: + spec: Embedding specification. + dim: Embedding dimension. + + Returns: + Config dict for SpaceInfo.config_json. + """ + func = self.get_function(spec) + + config = spec.to_dict() + config["dim"] = dim + + if hasattr(func, "geometry"): + config["geometry"] = func.geometry + if hasattr(func, "curvature") and func.curvature is not None: + config["curvature"] = func.curvature + + if config.get("geometry") == "hyperboloid": + config["spatial_dim"] = dim - 1 + + return config + + +_ENGINE: EmbeddingEngine | None = None + + +def get_engine() -> EmbeddingEngine: + """Get the global embedding engine singleton.""" + global _ENGINE + if _ENGINE is None: + _ENGINE = EmbeddingEngine() + return _ENGINE + + +def list_embedding_providers(available_only: bool = False) -> list[str]: + """List all registered embedding providers. + + Args: + available_only: If True, only return providers whose dependencies are installed. + + Returns: + List of provider identifiers. + """ + from lancedb.embeddings import get_registry + + registry = get_registry() + + all_providers = list(getattr(registry, "_functions", {}).keys()) + + if not available_only: + return sorted(all_providers) + + available: list[str] = [] + for provider in all_providers: + try: + factory = registry.get(provider) + factory.create() + available.append(provider) + except ImportError: + pass + except (TypeError, ValueError): + available.append(provider) + + return sorted(available) + + +def get_provider_info(provider: str) -> dict[str, Any]: + """Get information about an embedding provider. + + Args: + provider: Provider identifier. + + Returns: + Dict with provider info. + """ + from lancedb.embeddings import get_registry + + registry = get_registry() + + try: + factory = registry.get(provider) + except KeyError: + raise ValueError(f"Unknown provider: {provider}") from None + + info: dict[str, Any] = { + "provider": provider, + "source": "hyperview" if provider in ("embed-anything", "hyper-models") else "lancedb", + "geometry": "hyperboloid" if provider in HYPERBOLIC_PROVIDERS else "euclidean", + } + + try: + factory.create() + info["installed"] = True + except ImportError: + info["installed"] = False + except (TypeError, ValueError): + info["installed"] = True + + return info diff --git a/vendor/hyperview/embeddings/pipelines.py b/vendor/hyperview/embeddings/pipelines.py new file mode 100644 index 0000000000000000000000000000000000000000..d386651ffab47eae35401d5c5f500b59eff2ae3f --- /dev/null +++ b/vendor/hyperview/embeddings/pipelines.py @@ -0,0 +1,265 @@ +"""Compute orchestration pipelines for HyperView. + +These functions coordinate embedding computation and layout/projection +computation, persisting results into the configured storage backend. +""" + +from __future__ import annotations + +import time +from typing import Any + +import numpy as np + +from hyperview.storage.backend import StorageBackend +from hyperview.storage.schema import make_layout_key, normalize_layout_dimension + + +def _format_elapsed(seconds: float) -> str: + if seconds < 60: + return f"{seconds:.1f}s" + total_seconds = int(round(seconds)) + minutes, secs = divmod(total_seconds, 60) + if minutes < 60: + return f"{minutes}m {secs:02d}s" + hours, minutes = divmod(minutes, 60) + return f"{hours}h {minutes:02d}m {secs:02d}s" + + +def compute_embeddings( + storage: StorageBackend, + spec: Any, + batch_size: int = 32, + sample_ids: list[str] | None = None, + show_progress: bool = True, +) -> tuple[str, int, int]: + """Compute embeddings for samples that don't have them yet. + + Args: + storage: Storage backend to read samples from and write embeddings to. + spec: Embedding specification (provider, model_id, etc.) + batch_size: Batch size for processing. + sample_ids: Optional subset of sample IDs to ensure embeddings for. + If omitted, embeddings are ensured for the full dataset. + show_progress: Whether to show progress bar. + + Returns: + Tuple of (space_key, num_computed, num_skipped). + + Raises: + ValueError: If no samples exist, requested sample IDs are missing, + or the provider cannot be resolved. + """ + from hyperview.embeddings.engine import get_engine + + engine = get_engine() + + if sample_ids is None: + target_samples = storage.get_all_samples() + if not target_samples: + raise ValueError("No samples in storage") + else: + if not sample_ids: + raise ValueError("sample_ids must contain at least one sample ID") + + requested_sample_ids = list(dict.fromkeys(sample_ids)) + target_samples = storage.get_samples_by_ids(requested_sample_ids) + found_sample_ids = {sample.id for sample in target_samples} + missing_sample_ids = [sample_id for sample_id in requested_sample_ids if sample_id not in found_sample_ids] + if missing_sample_ids: + raise ValueError( + "Requested sample_ids were not found in storage: " + f"{missing_sample_ids[:5]}" + ) + + # Generate space key before computing (deterministic from spec) + space_key = spec.make_space_key() + target_sample_ids = [sample.id for sample in target_samples] + + if not storage.get_space(space_key): + missing_ids = target_sample_ids + elif sample_ids is None: + missing_ids = storage.get_missing_embedding_ids(space_key) + else: + embedded_ids = storage.get_embedded_ids(space_key) + missing_ids = [sample_id for sample_id in target_sample_ids if sample_id not in embedded_ids] + + num_skipped = len(target_sample_ids) - len(missing_ids) + + if not missing_ids: + if show_progress: + scope = "requested" if sample_ids is not None else "all" + print( + f"All {len(target_sample_ids)} {scope} samples already have embeddings " + f"in space '{space_key}'" + ) + return space_key, 0, num_skipped + + samples_to_embed = storage.get_samples_by_ids(missing_ids) + + if show_progress and num_skipped > 0: + print(f"Skipped {num_skipped} samples with existing embeddings") + + embeddings = engine.embed_images( + samples=samples_to_embed, + spec=spec, + batch_size=batch_size, + show_progress=show_progress, + ) + + dim = embeddings.shape[1] + config = engine.get_space_config(spec, dim) + storage.ensure_space( + model_id=spec.model_id or spec.provider, + dim=dim, + config=config, + space_key=space_key, + ) + + ids = [sample.id for sample in samples_to_embed] + storage.add_embeddings(space_key, ids, embeddings) + + return space_key, len(ids), num_skipped + + +def compute_layout( + storage: StorageBackend, + space_key: str | None = None, + method: str = "umap", + geometry: str = "euclidean", + layout_dimension: int = 2, + n_neighbors: int = 15, + min_dist: float = 0.1, + metric: str = "cosine", + force: bool = False, + show_progress: bool = True, +) -> str: + """Compute layout/projection for visualization. + + Args: + storage: Storage backend with embeddings. + space_key: Embedding space to project. If None, uses the first available. + method: Projection method ('umap' supported). + geometry: Output geometry type ('euclidean', 'poincare', or 'spherical'). + layout_dimension: Visualization dimension (2D or 3D). + n_neighbors: Number of neighbors for UMAP. + min_dist: Minimum distance for UMAP. + metric: Distance metric for UMAP. + force: Force recomputation even if layout exists. + show_progress: Whether to print progress messages. + + Returns: + layout_key for the computed layout. + + Raises: + ValueError: If no embedding spaces, space not found, or insufficient samples. + """ + from hyperview.embeddings.projection import ProjectionEngine + + if method != "umap": + raise ValueError(f"Invalid method: {method}. Only 'umap' is supported.") + layout_dimension = normalize_layout_dimension(layout_dimension) + + if geometry not in ("euclidean", "poincare", "spherical"): + raise ValueError( + f"Invalid geometry: {geometry}. Must be 'euclidean', 'poincare', or 'spherical'." + ) + if geometry == "poincare" and layout_dimension != 2: + raise ValueError("Poincare layouts currently require 2D output.") + + if space_key is None: + spaces = storage.list_spaces() + if not spaces: + raise ValueError("No embedding spaces. Call compute_embeddings() first.") + + # Choose a sensible default space based on the requested output geometry. + # - For Poincaré output, prefer a hyperbolic (hyperboloid) embedding space if present. + # - For non-hyperbolic output, prefer a Euclidean embedding space if present. + if geometry == "poincare": + preferred = next((s for s in spaces if s.geometry == "hyperboloid"), None) + else: + preferred = next((s for s in spaces if s.geometry != "hyperboloid"), None) + + space_key = preferred.space_key if preferred is not None else spaces[0].space_key + + space = storage.get_space(space_key) + if space is None: + raise ValueError(f"Space not found: {space_key}") + + input_geometry = space.geometry + curvature = (space.config or {}).get("curvature") + + ids, vectors = storage.get_embeddings(space_key) + if len(ids) == 0: + raise ValueError(f"No embeddings in space '{space_key}'. Call compute_embeddings() first.") + + if len(ids) < 3: + raise ValueError(f"Need at least 3 samples for visualization, have {len(ids)}") + + layout_params = { + "n_neighbors": n_neighbors, + "min_dist": min_dist, + "metric": metric, + } + + normalize_input = geometry == "spherical" + + layout_key = make_layout_key( + space_key, + method, + geometry, + layout_dimension=layout_dimension, + params=layout_params, + ) + + if not force: + existing_layout = storage.get_layout(layout_key) + if existing_layout is not None: + existing_ids, _ = storage.get_layout_coords(layout_key) + if set(existing_ids) == set(ids): + if show_progress: + print(f"Layout '{layout_key}' already exists with {len(ids)} points") + return layout_key + if show_progress: + print("Layout exists but has different samples, recomputing...") + + if show_progress: + print( + f"Computing {geometry} {method} layout " + f"({layout_dimension}D) for {len(ids)} samples..." + ) + + storage.ensure_layout( + layout_key=layout_key, + space_key=space_key, + method=method, + geometry=geometry, + params=layout_params, + ) + + engine = ProjectionEngine() + started_at = time.perf_counter() + coords = engine.project( + vectors, + input_geometry=input_geometry, + output_geometry=geometry, + n_components=layout_dimension, + normalize_input=normalize_input, + curvature=curvature, + method=method, + n_neighbors=n_neighbors, + min_dist=min_dist, + metric=metric, + verbose=show_progress, + ) + + if show_progress: + print( + f"Computed {geometry} {method} layout in " + f"{_format_elapsed(time.perf_counter() - started_at)}", + flush=True, + ) + + storage.add_layout_coords(layout_key, ids, coords) + + return layout_key diff --git a/vendor/hyperview/embeddings/projection.py b/vendor/hyperview/embeddings/projection.py new file mode 100644 index 0000000000000000000000000000000000000000..eedf3a203f60f17ca276fa69873894325f8f6523 --- /dev/null +++ b/vendor/hyperview/embeddings/projection.py @@ -0,0 +1,292 @@ +"""Projection methods for dimensionality reduction.""" + +import logging +import warnings + +import numpy as np +import umap + +logger = logging.getLogger(__name__) + + +class ProjectionEngine: + """Engine for projecting high-dimensional embeddings to low-dimensional layouts.""" + + def l2_normalize_rows(self, embeddings: np.ndarray) -> np.ndarray: + """L2-normalize embeddings row-wise with numerical safeguards.""" + norms = np.linalg.norm(embeddings, axis=1, keepdims=True) + norms = np.maximum(norms, 1e-12) + return (embeddings / norms).astype(np.float32) + + def to_poincare_ball( + self, + hyperboloid_embeddings: np.ndarray, + curvature: float | None = None, + clamp_radius: float = 0.999999, + ) -> np.ndarray: + """Convert hyperboloid (Lorentz) coordinates to Poincaré ball coordinates. + + Input is expected to be shape (N, D+1) with first coordinate being time-like. + Points are assumed to satisfy: t^2 - ||x||^2 = 1/c (c > 0). + + Returns Poincaré ball coordinates of shape (N, D) in the unit ball. + + Notes: + - Many hyperbolic libraries parameterize curvature as a positive number c + where the manifold has sectional curvature -c. + - We map to the unit ball for downstream distance metrics (UMAP 'poincare'). + """ + if hyperboloid_embeddings.ndim != 2 or hyperboloid_embeddings.shape[1] < 2: + raise ValueError( + "hyperboloid_embeddings must have shape (N, D+1) with D>=1" + ) + + c = float(curvature) if curvature is not None else 1.0 + if c <= 0: + raise ValueError(f"curvature must be > 0, got {c}") + + # Radius R = 1/sqrt(c) for curvature -c + R = 1.0 / np.sqrt(c) + + t = hyperboloid_embeddings[:, :1] + x = hyperboloid_embeddings[:, 1:] + + # Map to ball radius R: u_R = x / (t + R) + denom = t + R + u_R = x / denom + + # Rescale to unit ball: u = u_R / R = sqrt(c) * u_R + u = u_R / R + + # Numerical guard: ensure inside the unit ball + radii = np.linalg.norm(u, axis=1) + mask = radii >= clamp_radius + if np.any(mask): + u[mask] = u[mask] / radii[mask][:, np.newaxis] * clamp_radius + + return u.astype(np.float32) + + def project( + self, + embeddings: np.ndarray, + *, + input_geometry: str = "euclidean", + output_geometry: str = "euclidean", + n_components: int = 2, + normalize_input: bool = False, + curvature: float | None = None, + method: str = "umap", + n_neighbors: int = 15, + min_dist: float = 0.1, + metric: str = "cosine", + random_state: int = 42, + verbose: bool = False, + ) -> np.ndarray: + """Project embeddings with geometry-aware preprocessing. + + This separates two concerns: + 1) Geometry/model transforms for the *input* embeddings (e.g. hyperboloid -> Poincaré) + 2) Dimensionality reduction / layout (currently UMAP) + + Args: + embeddings: Input embeddings (N x D) or hyperboloid (N x D+1). + input_geometry: Geometry/model of the input embeddings (euclidean, hyperboloid). + output_geometry: Geometry of the output coordinates (euclidean, poincare, spherical). + n_components: Number of output dimensions. + normalize_input: Whether to L2-normalize vectors before projection. + curvature: Curvature parameter for hyperbolic embeddings (positive c). + method: Layout method (currently only 'umap'). + n_neighbors: UMAP neighbors. + min_dist: UMAP min_dist. + metric: Input metric (used for euclidean inputs). + random_state: Random seed. + + Returns: + Layout coordinates (N x n_components). + """ + if method != "umap": + raise ValueError(f"Invalid method: {method}. Only 'umap' is supported.") + if n_components < 2: + raise ValueError(f"n_components must be >= 2, got {n_components}") + + prepared = embeddings + prepared_metric: str = metric + + if normalize_input: + prepared = self.l2_normalize_rows(prepared) + + if input_geometry == "hyperboloid": + # Convert to unit Poincaré ball and use UMAP's built-in hyperbolic distance. + prepared = self.to_poincare_ball(embeddings, curvature=curvature) + prepared_metric = "poincare" + + if output_geometry == "poincare": + if n_components != 2: + raise ValueError("Poincare layouts currently require 2D output") + return self.project_to_poincare( + prepared, + n_neighbors=n_neighbors, + min_dist=min_dist, + metric=prepared_metric, + random_state=random_state, + verbose=verbose, + ) + + if output_geometry in ("euclidean", "spherical"): + return self.project_umap( + prepared, + n_neighbors=n_neighbors, + min_dist=min_dist, + metric=prepared_metric, + n_components=n_components, + random_state=random_state, + verbose=verbose, + ) + + raise ValueError( + f"Invalid output_geometry: {output_geometry}. " + "Must be 'euclidean', 'poincare', or 'spherical'." + ) + + def project_umap( + self, + embeddings: np.ndarray, + n_neighbors: int = 15, + min_dist: float = 0.1, + metric: str = "cosine", + n_components: int = 2, + random_state: int = 42, + verbose: bool = False, + ) -> np.ndarray: + """Project embeddings to Euclidean layout coordinates using UMAP.""" + n_neighbors = min(n_neighbors, len(embeddings) - 1) + if n_neighbors < 2: + n_neighbors = 2 + + n_jobs = 1 if random_state is not None else -1 + + reducer = umap.UMAP( + n_neighbors=n_neighbors, + min_dist=min_dist, + n_components=n_components, + metric=metric, + random_state=random_state, + n_jobs=n_jobs, + verbose=verbose, + ) + + coords = reducer.fit_transform(embeddings) + coords = self._normalize_coords(coords) + + return coords + + def project_to_poincare( + self, + embeddings: np.ndarray, + n_neighbors: int = 15, + min_dist: float = 0.1, + metric: str = "cosine", + random_state: int = 42, + verbose: bool = False, + ) -> np.ndarray: + """Project embeddings to the Poincaré disk using UMAP with hyperboloid output.""" + n_neighbors = min(n_neighbors, len(embeddings) - 1) + if n_neighbors < 2: + n_neighbors = 2 + + n_jobs = 1 if random_state is not None else -1 + + # Suppress warning about missing gradient for poincare metric (only affects inverse_transform) + with warnings.catch_warnings(): + warnings.filterwarnings("ignore", message="gradient function is not yet implemented") + reducer = umap.UMAP( + n_neighbors=n_neighbors, + min_dist=min_dist, + n_components=2, + metric=metric, + output_metric="hyperboloid", + random_state=random_state, + n_jobs=n_jobs, + verbose=verbose, + ) + spatial_coords = reducer.fit_transform(embeddings) + + squared_norm = np.sum(spatial_coords**2, axis=1) + t = np.sqrt(1 + squared_norm) + + # Project to Poincaré disk: u = x / (1 + t) + denom = 1 + t + poincare_coords = spatial_coords / denom[:, np.newaxis] + + # Clamp to unit disk for numerical stability + radii = np.linalg.norm(poincare_coords, axis=1) + max_radius = 0.999 + mask = radii > max_radius + if np.any(mask): + logger.warning(f"Clamping {np.sum(mask)} points to unit disk.") + poincare_coords[mask] = ( + poincare_coords[mask] / radii[mask][:, np.newaxis] * max_radius + ) + + poincare_coords = self._center_poincare(poincare_coords) + poincare_coords = self._scale_poincare(poincare_coords, factor=0.65) + + return poincare_coords + + def _scale_poincare(self, coords: np.ndarray, factor: float) -> np.ndarray: + """Scale points towards the origin in hyperbolic space. + + Scales hyperbolic distance from origin by `factor`. If factor < 1, points move closer to center. + """ + radii = np.linalg.norm(coords, axis=1) + mask = radii > 1e-6 + + r = radii[mask] + r = np.minimum(r, 0.9999999) + r_new = np.tanh(factor * np.arctanh(r)) + + scale_ratios = np.ones_like(radii) + scale_ratios[mask] = r_new / r + + return coords * scale_ratios[:, np.newaxis] + + def _center_poincare(self, coords: np.ndarray) -> np.ndarray: + """Center points in the Poincaré disk using a Möbius transformation.""" + if len(coords) == 0: + return coords + + z = coords[:, 0] + 1j * coords[:, 1] + centroid = np.mean(z) + + if np.abs(centroid) > 0.99 or np.abs(centroid) < 1e-6: + return coords + + # Möbius transformation: w = (z - a) / (1 - conj(a) * z) + a = centroid + w = (z - a) / (1 - np.conj(a) * z) + + return np.stack([w.real, w.imag], axis=1) + + def _normalize_coords(self, coords: np.ndarray) -> np.ndarray: + """Normalize coordinates to [-1, 1] range.""" + if len(coords) == 0: + return coords + + coords = coords - coords.mean(axis=0) + max_abs = np.abs(coords).max() + if max_abs > 0: + coords = coords / max_abs * 0.95 + + return coords + + def poincare_distance(self, u: np.ndarray, v: np.ndarray) -> float: + """Compute the Poincaré distance between two points.""" + u_norm_sq = np.sum(u**2) + v_norm_sq = np.sum(v**2) + diff_norm_sq = np.sum((u - v) ** 2) + + u_norm_sq = min(u_norm_sq, 0.99999) + v_norm_sq = min(v_norm_sq, 0.99999) + + delta = 2 * diff_norm_sq / ((1 - u_norm_sq) * (1 - v_norm_sq)) + return np.arccosh(1 + delta) diff --git a/vendor/hyperview/embeddings/providers/__init__.py b/vendor/hyperview/embeddings/providers/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..9bdcc434fc5fbef8749ffa1ce767dcafb616884e --- /dev/null +++ b/vendor/hyperview/embeddings/providers/__init__.py @@ -0,0 +1,7 @@ +"""Embedding providers. + +HyperView integrates with LanceDB's embedding registry. +Custom providers are registered in `lancedb_providers.py`. +""" + +__all__: list[str] = [] diff --git a/vendor/hyperview/embeddings/providers/__pycache__/__init__.cpython-312.pyc b/vendor/hyperview/embeddings/providers/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..02510cd7c56ec5a2932ffa3971e5f466957fbe75 Binary files /dev/null and b/vendor/hyperview/embeddings/providers/__pycache__/__init__.cpython-312.pyc differ diff --git a/vendor/hyperview/embeddings/providers/__pycache__/lancedb_providers.cpython-312.pyc b/vendor/hyperview/embeddings/providers/__pycache__/lancedb_providers.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ec055acddafe6c93a640720a6174231cd9fb956b Binary files /dev/null and b/vendor/hyperview/embeddings/providers/__pycache__/lancedb_providers.cpython-312.pyc differ diff --git a/vendor/hyperview/embeddings/providers/lancedb_providers.py b/vendor/hyperview/embeddings/providers/lancedb_providers.py new file mode 100644 index 0000000000000000000000000000000000000000..20910d0f563dd0c2a7320a5849cdf3b3006961bd --- /dev/null +++ b/vendor/hyperview/embeddings/providers/lancedb_providers.py @@ -0,0 +1,374 @@ +"""LanceDB-registered embedding providers for HyperView. + +This module registers HyperView's embedding providers into the LanceDB embedding +registry using the @register decorator. + +Providers: +- embed-anything: CLIP-based image embeddings (torch-free, default) +- hyper-models: Non-Euclidean model zoo via `hyper-models` (torch-free ONNX; downloads from HF Hub) +- timm-image: Image backbones loaded with timm (e.g. MegaDescriptor) +""" + +from __future__ import annotations + +from typing import Any + +import numpy as np +from lancedb.embeddings import EmbeddingFunction, register +from pydantic import PrivateAttr + +__all__ = [ + "EmbedAnythingEmbeddings", + "HyperModelsEmbeddings", + "TimmImageEmbeddings", +] + + +@register("embed-anything") +class EmbedAnythingEmbeddings(EmbeddingFunction): + """CLIP-based image embeddings via embed-anything. + + This is the default provider for HyperView - lightweight and torch-free. + + Args: + name: HuggingFace model ID for CLIP (default: openai/clip-vit-base-patch32) + batch_size: Batch size for processing + """ + + name: str = "openai/clip-vit-base-patch32" + batch_size: int = 32 + + _computer: Any = PrivateAttr(default=None) + _ndims: int | None = PrivateAttr(default=None) + + def __init__(self, **kwargs: Any) -> None: + super().__init__(**kwargs) + self._computer = None + self._ndims = None + + def _get_computer(self) -> Any: + if self._computer is None: + from hyperview.embeddings.compute import EmbeddingComputer + + self._computer = EmbeddingComputer(model=self.name) + return self._computer + + def ndims(self) -> int: + if self._ndims is None: + if "large" in self.name.lower(): + self._ndims = 768 + elif "clip" in self.name.lower(): + self._ndims = 512 + else: + self._ndims = 512 + return self._ndims + + def compute_source_embeddings( + self, inputs: Any, *args: Any, **kwargs: Any + ) -> list[np.ndarray | None]: + from hyperview.core.sample import Sample + + computer = self._get_computer() + + samples: list[Any] = [] + for inp in self.sanitize_input(inputs): + if isinstance(inp, Sample): + samples.append(inp) + elif isinstance(inp, str): + samples.append(Sample(id=inp, filepath=inp)) + else: + raise TypeError(f"Unsupported input type: {type(inp)}") + + embeddings = computer.compute_batch(samples, batch_size=self.batch_size, show_progress=False) + return list(embeddings) + + def compute_query_embeddings( + self, query: Any, *args: Any, **kwargs: Any + ) -> list[np.ndarray | None]: + return self.compute_source_embeddings([query], *args, **kwargs) + + +@register("hyper-models") +class HyperModelsEmbeddings(EmbeddingFunction): + """Non-Euclidean embeddings via the `hyper-models` package. + + This provider is a thin wrapper around `hyper_models.load(...)`. + Models are downloaded from the Hugging Face Hub on first use. + + Args: + name: Model name in the hyper-models registry (e.g. 'hycoclip-vit-s'). + checkpoint: Optional local path to an ONNX file (skips hub download). + batch_size: Batch size hint. Current HyCoCLIP/MERU ONNX exports may only + support batch_size=1; HyperView encodes one image at a time for + maximum compatibility. + """ + + name: str = "hycoclip-vit-s" + checkpoint: str | None = None + batch_size: int = 1 + + _model: Any = PrivateAttr(default=None) + _model_info: Any = PrivateAttr(default=None) + + def __init__(self, **kwargs: Any) -> None: + super().__init__(**kwargs) + self._model = None + self._model_info = None + + def _ensure_model_info(self) -> None: + if self._model_info is not None: + return + + try: + import hyper_models + except ImportError as e: + raise ImportError( + "Provider 'hyper-models' requires the 'hyper-models' package. " + "Install it with: `uv pip install hyper-models`" + ) from e + + try: + self._model_info = hyper_models.get_model_info(self.name) + except KeyError: + available = ", ".join(sorted(hyper_models.list_models())) + raise ValueError( + f"Unknown hyper-models model: '{self.name}'. Available: {available}" + ) from None + + def _ensure_model(self) -> None: + if self._model is not None: + return + + self._ensure_model_info() + import hyper_models + + self._model = hyper_models.load(self.name, local_path=self.checkpoint) + + def ndims(self) -> int: + self._ensure_model_info() + assert self._model_info is not None + return int(getattr(self._model_info, "dim")) + + @property + def geometry(self) -> str: + self._ensure_model_info() + assert self._model_info is not None + return str(getattr(self._model_info, "geometry")) + + def compute_source_embeddings( + self, inputs: Any, *args: Any, **kwargs: Any + ) -> list[np.ndarray | None]: + from hyperview.core.sample import Sample + + self._ensure_model() + assert self._model is not None + + inputs = self.sanitize_input(inputs) + all_embeddings: list[np.ndarray | None] = [] + + from PIL import Image + + for inp in inputs: + if isinstance(inp, Sample): + with inp.load_image() as img: + img.load() + if img.mode != "RGB": + img = img.convert("RGB") + pil_img = img.copy() + elif isinstance(inp, str): + with Image.open(inp) as img: + img.load() + if img.mode != "RGB": + img = img.convert("RGB") + pil_img = img.copy() + elif isinstance(inp, Image.Image): + pil_img = inp.convert("RGB") if inp.mode != "RGB" else inp + else: + raise TypeError(f"Unsupported input type: {type(inp)}") + + emb = self._model.encode_images([pil_img]) + vec = np.asarray(emb[0], dtype=np.float32) + all_embeddings.append(vec) + + return all_embeddings + + def compute_query_embeddings( + self, query: Any, *args: Any, **kwargs: Any + ) -> list[np.ndarray | None]: + return self.compute_source_embeddings([query], *args, **kwargs) + + +@register("timm-image") +class TimmImageEmbeddings(EmbeddingFunction): + """Image embeddings via timm backbones. + + This provider supports timm models, including Hugging Face-hosted timm + checkpoints like ``hf-hub:BVRA/MegaDescriptor-L-384``. + + Args: + name: timm model name (local timm id or ``hf-hub:``). + batch_size: Batch size for image encoding. + device: Explicit torch device (e.g. ``cpu``, ``cuda``). If omitted, + selects ``cuda`` when available, otherwise ``cpu``. + """ + + name: str = "hf-hub:BVRA/MegaDescriptor-L-384" + batch_size: int = 8 + device: str | None = None + + _model: Any = PrivateAttr(default=None) + _transform: Any = PrivateAttr(default=None) + _torch: Any = PrivateAttr(default=None) + _device: str | None = PrivateAttr(default=None) + _ndims: int | None = PrivateAttr(default=None) + _show_progress: bool = PrivateAttr(default=False) + + def __init__(self, **kwargs: Any) -> None: + super().__init__(**kwargs) + self._model = None + self._transform = None + self._torch = None + self._device = None + self._ndims = None + self._show_progress = False + if self.batch_size <= 0: + raise ValueError("batch_size must be > 0") + + def set_progress_enabled(self, enabled: bool) -> None: + self._show_progress = bool(enabled) + + def _import_ml_stack(self) -> tuple[Any, Any, Any]: + try: + import timm + import torch + from torchvision import transforms as tv_transforms + except ImportError as e: + raise ImportError( + "Provider 'timm-image' requires torch/timm/torchvision. " + "Install with: `uv sync --extra ml`" + ) from e + return torch, timm, tv_transforms + + def _ensure_model(self) -> None: + if self._model is not None: + return + + torch, timm, tv_transforms = self._import_ml_stack() + resolved_device = self.device or ( + "cuda" + if torch.cuda.is_available() + else "mps" + if hasattr(torch.backends, "mps") and torch.backends.mps.is_available() + else "cpu" + ) + + if self._show_progress: + print( + f"Initializing timm model '{self.name}' on {resolved_device}...", + flush=True, + ) + + model = timm.create_model(self.name, num_classes=0, pretrained=True) + model.eval() + model.to(resolved_device) + + cfg = getattr(model, "pretrained_cfg", {}) or {} + input_size = cfg.get("input_size", (3, 384, 384)) + image_size = int(input_size[-1]) if isinstance(input_size, (tuple, list)) and input_size else 384 + mean = cfg.get("mean", (0.5, 0.5, 0.5)) + std = cfg.get("std", (0.5, 0.5, 0.5)) + + self._transform = tv_transforms.Compose( + [ + tv_transforms.Resize((image_size, image_size)), + tv_transforms.ToTensor(), + tv_transforms.Normalize(mean, std), + ] + ) + + ndims = int(getattr(model, "num_features", 0)) + if ndims <= 0: + dummy = torch.zeros((1, 3, image_size, image_size), device=resolved_device) + with torch.inference_mode(): + out = model(dummy) + if isinstance(out, (tuple, list)): + out = out[0] + ndims = int(out.shape[-1]) + + self._model = model + self._torch = torch + self._device = resolved_device + self._ndims = ndims + + if self._show_progress: + print( + f"timm model ready ({self._ndims} dims on {self._device})", + flush=True, + ) + + def ndims(self) -> int: + self._ensure_model() + assert self._ndims is not None + return self._ndims + + @property + def geometry(self) -> str: + return "euclidean" + + def _load_pil_image(self, inp: Any) -> Any: + from PIL import Image + + from hyperview.core.sample import Sample + + if isinstance(inp, Sample): + with inp.load_image() as img: + img.load() + if img.mode != "RGB": + img = img.convert("RGB") + return img.copy() + if isinstance(inp, str): + with Image.open(inp) as img: + img.load() + if img.mode != "RGB": + img = img.convert("RGB") + return img.copy() + if isinstance(inp, Image.Image): + return inp.convert("RGB") if inp.mode != "RGB" else inp + raise TypeError(f"Unsupported input type: {type(inp)}") + + def compute_source_embeddings( + self, inputs: Any, *args: Any, **kwargs: Any + ) -> list[np.ndarray | None]: + self._ensure_model() + assert self._model is not None + assert self._transform is not None + assert self._torch is not None + assert self._device is not None + + pil_images = [self._load_pil_image(inp) for inp in self.sanitize_input(inputs)] + embeddings: list[np.ndarray | None] = [] + + for start in range(0, len(pil_images), self.batch_size): + batch_imgs = pil_images[start:start + self.batch_size] + batch_tensors = [self._transform(img) for img in batch_imgs] + batch = self._torch.stack(batch_tensors).to(self._device) + + with self._torch.inference_mode(): + out = self._model(batch) + + if isinstance(out, (tuple, list)): + out = out[0] + + out_arr = np.asarray(out.detach().cpu().numpy(), dtype=np.float32) + if out_arr.ndim == 1: + out_arr = out_arr[None, :] + + for vec in out_arr: + embeddings.append(np.asarray(vec, dtype=np.float32)) + + return embeddings + + def compute_query_embeddings( + self, query: Any, *args: Any, **kwargs: Any + ) -> list[np.ndarray | None]: + return self.compute_source_embeddings([query], *args, **kwargs) diff --git a/vendor/hyperview/server/__init__.py b/vendor/hyperview/server/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..a2db27419e7f6b9e2bfc32b76bb0aab94b1380e0 --- /dev/null +++ b/vendor/hyperview/server/__init__.py @@ -0,0 +1,5 @@ +"""FastAPI server for HyperView.""" + +from hyperview.server.app import create_app + +__all__ = ["create_app"] diff --git a/vendor/hyperview/server/__pycache__/__init__.cpython-312.pyc b/vendor/hyperview/server/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..14e82e334a619f3aaf603d357d28533fb47929a7 Binary files /dev/null and b/vendor/hyperview/server/__pycache__/__init__.cpython-312.pyc differ diff --git a/vendor/hyperview/server/__pycache__/app.cpython-312.pyc b/vendor/hyperview/server/__pycache__/app.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2cf9bb910881234cc7568015a279d75601145d23 Binary files /dev/null and b/vendor/hyperview/server/__pycache__/app.cpython-312.pyc differ diff --git a/vendor/hyperview/server/app.py b/vendor/hyperview/server/app.py new file mode 100644 index 0000000000000000000000000000000000000000..b9fb112353828308d60687cab003f9004ee97839 --- /dev/null +++ b/vendor/hyperview/server/app.py @@ -0,0 +1,521 @@ +"""FastAPI application for HyperView.""" + +import os +from pathlib import Path +from typing import Any + +import numpy as np +from fastapi import Depends, FastAPI, HTTPException, Query +from fastapi.middleware.cors import CORSMiddleware +from fastapi.responses import JSONResponse +from fastapi.staticfiles import StaticFiles +from pydantic import BaseModel + +from hyperview.core.dataset import Dataset +from hyperview.core.selection import ( + OrbitViewState3D, + points_in_polygon, + select_ids_for_3d_lasso, +) +from hyperview.storage.schema import parse_layout_dimension + +# Global dataset reference (set by launch()) +_current_dataset: Dataset | None = None +_current_session_id: str | None = None + + +class SelectionRequest(BaseModel): + """Request model for selection sync.""" + + sample_ids: list[str] + + +class LassoSelectionRequest(BaseModel): + """Request model for lasso selection queries.""" + + layout_key: str # e.g., "openai_clip-vit-base-patch32__umap" + # Polygon vertices, interleaved: [x0, y0, x1, y1, ...] + # - 2D layouts: data-space polygon (same coordinates as /api/embeddings) + # - 3D layouts: screen-space polygon in CSS pixels + polygon: list[float] + # Required for 3D lasso requests. + view_3d: dict[str, float] | None = None + viewport_width: int | None = None + viewport_height: int | None = None + label_filter: str | None = None + offset: int = 0 + limit: int = 100 + include_thumbnails: bool = True + + +class SampleResponse(BaseModel): + """Response model for a sample.""" + + id: str + filepath: str + filename: str + label: str | None + thumbnail: str | None + metadata: dict + width: int | None = None + height: int | None = None + + +class LayoutInfoResponse(BaseModel): + """Response model for layout info.""" + + layout_key: str + space_key: str + method: str + geometry: str + count: int + params: dict[str, Any] | None + + +class SpaceInfoResponse(BaseModel): + """Response model for embedding space info.""" + + space_key: str + model_id: str + dim: int + count: int + provider: str + geometry: str + config: dict[str, Any] | None + + +class DatasetResponse(BaseModel): + """Response model for dataset info.""" + + name: str + num_samples: int + labels: list[str] + spaces: list[SpaceInfoResponse] + layouts: list[LayoutInfoResponse] + + +class EmbeddingsResponse(BaseModel): + """Response model for embeddings data (for scatter plot).""" + + layout_key: str + geometry: str + ids: list[str] + labels: list[str | None] + coords: list[list[float]] + + +class SimilarSampleResponse(BaseModel): + """Response model for a similar sample with distance.""" + + id: str + filepath: str + filename: str + label: str | None + thumbnail: str | None + distance: float + metadata: dict + + +class SimilaritySearchResponse(BaseModel): + """Response model for similarity search results.""" + + query_id: str + k: int + results: list[SimilarSampleResponse] + + +def create_app(dataset: Dataset | None = None, session_id: str | None = None) -> FastAPI: + """Create the FastAPI application. + + Args: + dataset: Optional dataset to serve. If None, uses global dataset. + + Returns: + FastAPI application instance. + """ + global _current_dataset, _current_session_id + if dataset is not None: + _current_dataset = dataset + if session_id is not None: + _current_session_id = session_id + + app = FastAPI( + title="HyperView", + description="Dataset visualization with hyperbolic embeddings", + version="0.1.0", + ) + + def get_dataset() -> Dataset: + """Dependency that returns the current dataset or raises 404.""" + if _current_dataset is None: + raise HTTPException(status_code=404, detail="No dataset loaded") + return _current_dataset + + # CORS middleware for development + app.add_middleware( + CORSMiddleware, + allow_origins=["*"], + allow_credentials=True, + allow_methods=["*"], + allow_headers=["*"], + ) + + @app.get("/__hyperview__/health") + async def hyperview_health(): + return { + "name": "hyperview", + "version": app.version, + "session_id": _current_session_id, + "dataset": _current_dataset.name if _current_dataset is not None else None, + "pid": os.getpid(), + } + + @app.get("/api/dataset", response_model=DatasetResponse) + async def get_dataset_info(ds: Dataset = Depends(get_dataset)): + """Get dataset metadata.""" + spaces = ds.list_spaces() + space_dicts = [s.to_api_dict() for s in spaces] + + layouts = ds.list_layouts() + layout_dicts = [layout.to_api_dict() for layout in layouts] + + return DatasetResponse( + name=ds.name, + num_samples=len(ds), + labels=ds.labels, + spaces=space_dicts, + layouts=layout_dicts, + ) + + @app.get("/api/samples") + async def get_samples( + ds: Dataset = Depends(get_dataset), + offset: int = Query(0, ge=0), + limit: int = Query(100, ge=1, le=1000), + label: str | None = None, + ): + """Get paginated samples with thumbnails.""" + samples, total = ds.get_samples_paginated( + offset=offset, limit=limit, label=label + ) + + return { + "total": total, + "offset": offset, + "limit": limit, + "samples": [s.to_api_dict(include_thumbnail=True) for s in samples], + } + + @app.get("/api/samples/{sample_id}", response_model=SampleResponse) + async def get_sample(sample_id: str, ds: Dataset = Depends(get_dataset)): + """Get a single sample by ID.""" + try: + sample = ds[sample_id] + return SampleResponse(**sample.to_api_dict()) + except KeyError: + raise HTTPException(status_code=404, detail=f"Sample not found: {sample_id}") + + @app.post("/api/samples/batch") + async def get_samples_batch(request: SelectionRequest, ds: Dataset = Depends(get_dataset)): + """Get multiple samples by their IDs.""" + samples = ds.get_samples_by_ids(request.sample_ids) + return {"samples": [s.to_api_dict(include_thumbnail=True) for s in samples]} + + @app.get("/api/embeddings", response_model=EmbeddingsResponse) + async def get_embeddings(ds: Dataset = Depends(get_dataset), layout_key: str | None = None): + """Get embedding coordinates for visualization.""" + layouts = ds.list_layouts() + if not layouts: + raise HTTPException( + status_code=400, detail="No layouts computed. Call compute_visualization() first." + ) + + # Find the requested layout + layout_info = None + if layout_key is None: + layout_info = next( + (layout for layout in layouts if parse_layout_dimension(layout.layout_key) == 2), + layouts[0], + ) + layout_key = layout_info.layout_key + else: + layout_info = next((layout for layout in layouts if layout.layout_key == layout_key), None) + if layout_info is None: + raise HTTPException(status_code=404, detail=f"Layout not found: {layout_key}") + + ids, labels, coords = ds.get_visualization_data(layout_key) + + if not ids: + raise HTTPException(status_code=400, detail=f"No data in layout '{layout_key}'.") + + return EmbeddingsResponse( + layout_key=layout_key, + geometry=layout_info.geometry, + ids=ids, + labels=labels, + coords=coords.tolist(), + ) + + @app.get("/api/spaces") + async def get_spaces(ds: Dataset = Depends(get_dataset)): + """Get all embedding spaces.""" + spaces = ds.list_spaces() + return {"spaces": [s.to_api_dict() for s in spaces]} + + @app.get("/api/layouts") + async def get_layouts(ds: Dataset = Depends(get_dataset)): + """Get all available layouts.""" + layouts = ds.list_layouts() + return {"layouts": [layout.to_api_dict() for layout in layouts]} + + @app.post("/api/selection") + async def sync_selection(request: SelectionRequest): + """Sync selection state (for future use).""" + return {"status": "ok", "selected": request.sample_ids} + + @app.post("/api/selection/lasso") + async def lasso_selection(request: LassoSelectionRequest, ds: Dataset = Depends(get_dataset)): + """Compute a lasso selection over the current embeddings. + + Returns a total selected count and a paginated page of selected samples. + + Selection modes: + - 2D layouts: polygon in data space (same coordinates as /api/embeddings). + - 3D layouts: polygon in screen space with explicit camera + viewport. + """ + if request.offset < 0: + raise HTTPException(status_code=400, detail="offset must be >= 0") + if request.limit < 1 or request.limit > 2000: + raise HTTPException(status_code=400, detail="limit must be between 1 and 2000") + + if len(request.polygon) < 6 or len(request.polygon) % 2 != 0: + raise HTTPException( + status_code=400, + detail="polygon must be an even-length list with at least 3 vertices", + ) + + layout_info = next( + (layout for layout in ds.list_layouts() if layout.layout_key == request.layout_key), + None, + ) + if layout_info is None: + raise HTTPException(status_code=404, detail=f"Layout not found: {request.layout_key}") + layout_dimension = parse_layout_dimension(layout_info.layout_key) + + poly = np.asarray(request.polygon, dtype=np.float32).reshape((-1, 2)) + if not np.all(np.isfinite(poly)): + raise HTTPException(status_code=400, detail="polygon must contain only finite numbers") + + selected_ids: list[str] + + if layout_dimension == 2: + # Tight AABB prefilter in data space. + x_min = float(np.min(poly[:, 0])) + x_max = float(np.max(poly[:, 0])) + y_min = float(np.min(poly[:, 1])) + y_max = float(np.max(poly[:, 1])) + + candidate_ids, candidate_coords = ds.get_lasso_candidates_aabb( + layout_key=request.layout_key, + x_min=x_min, + x_max=x_max, + y_min=y_min, + y_max=y_max, + label_filter=request.label_filter, + ) + + if candidate_coords.size == 0: + return { + "total": 0, + "offset": request.offset, + "limit": request.limit, + "sample_ids": [], + "samples": [], + } + + inside_mask = points_in_polygon(candidate_coords, poly) + if not np.any(inside_mask): + return { + "total": 0, + "offset": request.offset, + "limit": request.limit, + "sample_ids": [], + "samples": [], + } + + selected_ids = [candidate_ids[i] for i in np.flatnonzero(inside_mask)] + elif layout_dimension == 3: + if request.view_3d is None: + raise HTTPException( + status_code=400, + detail="view_3d is required for 3D lasso selection", + ) + if request.viewport_width is None or request.viewport_height is None: + raise HTTPException( + status_code=400, + detail="viewport_width and viewport_height are required for 3D lasso selection", + ) + if request.viewport_width <= 0 or request.viewport_height <= 0: + raise HTTPException( + status_code=400, + detail="viewport_width and viewport_height must be > 0", + ) + + try: + view_3d = OrbitViewState3D(**request.view_3d) + except Exception as exc: + raise HTTPException(status_code=400, detail=f"Invalid view_3d payload: {exc}") + + view_vals = np.array( + [ + view_3d.yaw, + view_3d.pitch, + view_3d.distance, + view_3d.target_x, + view_3d.target_y, + view_3d.target_z, + view_3d.ortho_scale, + ], + dtype=np.float64, + ) + if not np.all(np.isfinite(view_vals)): + raise HTTPException(status_code=400, detail="view_3d must contain only finite numbers") + if view_3d.distance <= 0 or view_3d.ortho_scale <= 0: + raise HTTPException(status_code=400, detail="view_3d.distance and view_3d.ortho_scale must be > 0") + + ids, labels, coords = ds.get_visualization_data(request.layout_key) + if not ids: + return { + "total": 0, + "offset": request.offset, + "limit": request.limit, + "sample_ids": [], + "samples": [], + } + if coords.ndim != 2 or coords.shape[1] != 3: + raise HTTPException( + status_code=400, + detail=( + f"3D lasso requires a 3D layout coordinate matrix; " + f"got shape {coords.shape} for layout '{request.layout_key}'." + ), + ) + + finite_mask = np.all(np.isfinite(coords), axis=1) + if not np.all(finite_mask): + finite_indices = np.flatnonzero(finite_mask) + if finite_indices.size == 0: + return { + "total": 0, + "offset": request.offset, + "limit": request.limit, + "sample_ids": [], + "samples": [], + } + ids = [ids[int(i)] for i in finite_indices] + labels = [labels[int(i)] for i in finite_indices] + coords = coords[finite_mask] + + selected_ids = select_ids_for_3d_lasso( + ids=ids, + labels=labels, + coords=coords, + geometry=layout_info.geometry, + polygon=poly, + view=view_3d, + viewport_width=request.viewport_width, + viewport_height=request.viewport_height, + label_filter=request.label_filter, + ) + else: + raise HTTPException( + status_code=400, + detail=f"Unsupported layout dimension for lasso: {layout_dimension}D", + ) + + total = len(selected_ids) + + start = int(request.offset) + end = int(request.offset + request.limit) + sample_ids = selected_ids[start:end] + + samples = ds.get_samples_by_ids(sample_ids) + sample_dicts = [s.to_api_dict(include_thumbnail=request.include_thumbnails) for s in samples] + + return { + "total": total, + "offset": request.offset, + "limit": request.limit, + "sample_ids": sample_ids, + "samples": sample_dicts, + } + + @app.get("/api/search/similar/{sample_id}", response_model=SimilaritySearchResponse) + async def search_similar( + sample_id: str, + ds: Dataset = Depends(get_dataset), + k: int = Query(10, ge=1, le=100), + space_key: str | None = None, + ): + """Return k nearest neighbors for a given sample.""" + try: + similar = ds.find_similar( + sample_id, k=k, space_key=space_key + ) + except ValueError as e: + raise HTTPException(status_code=400, detail=str(e)) + except KeyError: + raise HTTPException(status_code=404, detail=f"Sample not found: {sample_id}") + + results = [] + for sample, distance in similar: + try: + thumbnail = sample.get_thumbnail_base64() + except Exception: + thumbnail = None + + results.append( + SimilarSampleResponse( + id=sample.id, + filepath=sample.filepath, + filename=sample.filename, + label=sample.label, + thumbnail=thumbnail, + distance=distance, + metadata=sample.metadata, + ) + ) + + return SimilaritySearchResponse( + query_id=sample_id, + k=k, + results=results, + ) + + @app.get("/api/thumbnail/{sample_id}") + async def get_thumbnail(sample_id: str, ds: Dataset = Depends(get_dataset)): + """Get thumbnail image for a sample.""" + try: + sample = ds[sample_id] + thumbnail_b64 = sample.get_thumbnail_base64() + return JSONResponse({"thumbnail": thumbnail_b64}) + except KeyError: + raise HTTPException(status_code=404, detail=f"Sample not found: {sample_id}") + + # Serve static frontend files + static_dir = Path(__file__).parent / "static" + if static_dir.exists(): + app.mount("/", StaticFiles(directory=str(static_dir), html=True), name="static") + else: + # Fallback: serve a simple HTML page + @app.get("/") + async def root(): + return {"message": "HyperView API", "docs": "/docs"} + + return app + + +def set_dataset(dataset: Dataset) -> None: + """Set the global dataset for the server.""" + global _current_dataset + _current_dataset = dataset diff --git a/vendor/hyperview/server/static/404.html b/vendor/hyperview/server/static/404.html new file mode 100644 index 0000000000000000000000000000000000000000..dbe5a0e24ccc0d6fef6c4fa0aaaf2385c1cef618 --- /dev/null +++ b/vendor/hyperview/server/static/404.html @@ -0,0 +1 @@ +404: This page could not be found.HyperView

404

This page could not be found.

\ No newline at end of file diff --git a/vendor/hyperview/server/static/404/index.html b/vendor/hyperview/server/static/404/index.html new file mode 100644 index 0000000000000000000000000000000000000000..dbe5a0e24ccc0d6fef6c4fa0aaaf2385c1cef618 --- /dev/null +++ b/vendor/hyperview/server/static/404/index.html @@ -0,0 +1 @@ +404: This page could not be found.HyperView

404

This page could not be found.

\ No newline at end of file diff --git a/vendor/hyperview/server/static/__next.__PAGE__.txt b/vendor/hyperview/server/static/__next.__PAGE__.txt new file mode 100644 index 0000000000000000000000000000000000000000..15ef32cde31a77f41fd9e6d769930609517058d4 --- /dev/null +++ b/vendor/hyperview/server/static/__next.__PAGE__.txt @@ -0,0 +1,9 @@ +1:"$Sreact.fragment" +2:I[73440,["/_next/static/chunks/e954ba82c0a04100.js"],"ClientPageRoot"] +3:I[50912,["/_next/static/chunks/bdfca692596a10e2.js","/_next/static/chunks/8d5a2ef3447cb3ee.js"],"default"] +6:I[64381,["/_next/static/chunks/e954ba82c0a04100.js"],"OutletBoundary"] +7:"$Sreact.suspense" +0:{"buildId":"0EHglxORKBJP1WlpL6tAy","rsc":["$","$1","c",{"children":[["$","$L2",null,{"Component":"$3","serverProvidedParams":{"searchParams":{},"params":{},"promises":["$@4","$@5"]}}],[["$","script","script-0",{"src":"/_next/static/chunks/bdfca692596a10e2.js","async":true}],["$","script","script-1",{"src":"/_next/static/chunks/8d5a2ef3447cb3ee.js","async":true}]],["$","$L6",null,{"children":["$","$7",null,{"name":"Next.MetadataOutlet","children":"$@8"}]}]]}],"loading":null,"isPartial":false} +4:{} +5:"$0:rsc:props:children:0:props:serverProvidedParams:params" +8:null diff --git a/vendor/hyperview/server/static/__next._full.txt b/vendor/hyperview/server/static/__next._full.txt new file mode 100644 index 0000000000000000000000000000000000000000..7dc2eb1da793bbd57200a3dfea2f9bc5f7a7b84d --- /dev/null +++ b/vendor/hyperview/server/static/__next._full.txt @@ -0,0 +1,18 @@ +1:"$Sreact.fragment" +2:I[32035,["/_next/static/chunks/e954ba82c0a04100.js"],"default"] +3:I[91168,["/_next/static/chunks/e954ba82c0a04100.js"],"default"] +4:I[73440,["/_next/static/chunks/e954ba82c0a04100.js"],"ClientPageRoot"] +5:I[50912,["/_next/static/chunks/bdfca692596a10e2.js","/_next/static/chunks/8d5a2ef3447cb3ee.js"],"default"] +8:I[64381,["/_next/static/chunks/e954ba82c0a04100.js"],"OutletBoundary"] +9:"$Sreact.suspense" +b:I[64381,["/_next/static/chunks/e954ba82c0a04100.js"],"ViewportBoundary"] +d:I[64381,["/_next/static/chunks/e954ba82c0a04100.js"],"MetadataBoundary"] +f:I[75115,["/_next/static/chunks/e954ba82c0a04100.js"],"default"] +:HL["/_next/static/chunks/462c5e072cd14e02.css","style"] +:HL["/_next/static/media/83afe278b6a6bb3c-s.p.3a6ba036.woff2","font",{"crossOrigin":"","type":"font/woff2"}] +0:{"P":null,"b":"0EHglxORKBJP1WlpL6tAy","c":["",""],"q":"","i":false,"f":[[["",{"children":["__PAGE__",{}]},"$undefined","$undefined",true],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/462c5e072cd14e02.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","html",null,{"lang":"en","className":"h-full","children":["$","body",null,{"className":"inter_c50830d4-module__9YwRda__className antialiased h-full","children":["$","$L2",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L3",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]}]]}],{"children":[["$","$1","c",{"children":[["$","$L4",null,{"Component":"$5","serverProvidedParams":{"searchParams":{},"params":{},"promises":["$@6","$@7"]}}],[["$","script","script-0",{"src":"/_next/static/chunks/bdfca692596a10e2.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/8d5a2ef3447cb3ee.js","async":true,"nonce":"$undefined"}]],["$","$L8",null,{"children":["$","$9",null,{"name":"Next.MetadataOutlet","children":"$@a"}]}]]}],{},null,false,false]},null,false,false],["$","$1","h",{"children":[null,["$","$Lb",null,{"children":"$Lc"}],["$","div",null,{"hidden":true,"children":["$","$Ld",null,{"children":["$","$9",null,{"name":"Next.Metadata","children":"$Le"}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}],false]],"m":"$undefined","G":["$f",[]],"S":true} +6:{} +7:"$0:f:0:1:1:children:0:props:children:0:props:serverProvidedParams:params" +c:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]] +a:null +e:[["$","title","0",{"children":"HyperView"}],["$","meta","1",{"name":"description","content":"Dataset visualization with hyperbolic embeddings"}]] diff --git a/vendor/hyperview/server/static/__next._head.txt b/vendor/hyperview/server/static/__next._head.txt new file mode 100644 index 0000000000000000000000000000000000000000..0ba8fd7d1995bf9d12cfe9249896dffe1b0ab7af --- /dev/null +++ b/vendor/hyperview/server/static/__next._head.txt @@ -0,0 +1,5 @@ +1:"$Sreact.fragment" +2:I[64381,["/_next/static/chunks/e954ba82c0a04100.js"],"ViewportBoundary"] +3:I[64381,["/_next/static/chunks/e954ba82c0a04100.js"],"MetadataBoundary"] +4:"$Sreact.suspense" +0:{"buildId":"0EHglxORKBJP1WlpL6tAy","rsc":["$","$1","h",{"children":[null,["$","$L2",null,{"children":[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]}],["$","div",null,{"hidden":true,"children":["$","$L3",null,{"children":["$","$4",null,{"name":"Next.Metadata","children":[["$","title","0",{"children":"HyperView"}],["$","meta","1",{"name":"description","content":"Dataset visualization with hyperbolic embeddings"}]]}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}],"loading":null,"isPartial":false} diff --git a/vendor/hyperview/server/static/__next._index.txt b/vendor/hyperview/server/static/__next._index.txt new file mode 100644 index 0000000000000000000000000000000000000000..78e3cc2d681452816a56db1b7c8306bf4e789d7f --- /dev/null +++ b/vendor/hyperview/server/static/__next._index.txt @@ -0,0 +1,5 @@ +1:"$Sreact.fragment" +2:I[32035,["/_next/static/chunks/e954ba82c0a04100.js"],"default"] +3:I[91168,["/_next/static/chunks/e954ba82c0a04100.js"],"default"] +:HL["/_next/static/chunks/462c5e072cd14e02.css","style"] +0:{"buildId":"0EHglxORKBJP1WlpL6tAy","rsc":["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/462c5e072cd14e02.css","precedence":"next"}]],["$","html",null,{"lang":"en","className":"h-full","children":["$","body",null,{"className":"inter_c50830d4-module__9YwRda__className antialiased h-full","children":["$","$L2",null,{"parallelRouterKey":"children","template":["$","$L3",null,{}],"notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]]}]}]}]]}],"loading":null,"isPartial":false} diff --git a/vendor/hyperview/server/static/__next._tree.txt b/vendor/hyperview/server/static/__next._tree.txt new file mode 100644 index 0000000000000000000000000000000000000000..59d7ab335859ddeedcbcb85d3b7bc986c7771eaa --- /dev/null +++ b/vendor/hyperview/server/static/__next._tree.txt @@ -0,0 +1,3 @@ +:HL["/_next/static/chunks/462c5e072cd14e02.css","style"] +:HL["/_next/static/media/83afe278b6a6bb3c-s.p.3a6ba036.woff2","font",{"crossOrigin":"","type":"font/woff2"}] +0:{"buildId":"0EHglxORKBJP1WlpL6tAy","tree":{"name":"","paramType":null,"paramKey":"","hasRuntimePrefetch":false,"slots":{"children":{"name":"__PAGE__","paramType":null,"paramKey":"__PAGE__","hasRuntimePrefetch":false,"slots":null,"isRootLayout":false}},"isRootLayout":true},"staleTime":300} diff --git a/vendor/hyperview/server/static/_next/static/0EHglxORKBJP1WlpL6tAy/_buildManifest.js b/vendor/hyperview/server/static/_next/static/0EHglxORKBJP1WlpL6tAy/_buildManifest.js new file mode 100644 index 0000000000000000000000000000000000000000..1af6a5b0d2690f65f1f5976004fdc904268ef46c --- /dev/null +++ b/vendor/hyperview/server/static/_next/static/0EHglxORKBJP1WlpL6tAy/_buildManifest.js @@ -0,0 +1,15 @@ +self.__BUILD_MANIFEST = { + "__rewrites": { + "afterFiles": [ + { + "source": "/api/:path*" + } + ], + "beforeFiles": [], + "fallback": [] + }, + "sortedPages": [ + "/_app", + "/_error" + ] +};self.__BUILD_MANIFEST_CB && self.__BUILD_MANIFEST_CB() \ No newline at end of file diff --git a/vendor/hyperview/server/static/_next/static/0EHglxORKBJP1WlpL6tAy/_clientMiddlewareManifest.json b/vendor/hyperview/server/static/_next/static/0EHglxORKBJP1WlpL6tAy/_clientMiddlewareManifest.json new file mode 100644 index 0000000000000000000000000000000000000000..0637a088a01e8ddab3bf3fa98dbe804cbde1a0dc --- /dev/null +++ b/vendor/hyperview/server/static/_next/static/0EHglxORKBJP1WlpL6tAy/_clientMiddlewareManifest.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/vendor/hyperview/server/static/_next/static/0EHglxORKBJP1WlpL6tAy/_ssgManifest.js b/vendor/hyperview/server/static/_next/static/0EHglxORKBJP1WlpL6tAy/_ssgManifest.js new file mode 100644 index 0000000000000000000000000000000000000000..5b3ff592fd46c8736892a12864fdf3fed8775202 --- /dev/null +++ b/vendor/hyperview/server/static/_next/static/0EHglxORKBJP1WlpL6tAy/_ssgManifest.js @@ -0,0 +1 @@ +self.__SSG_MANIFEST=new Set([]);self.__SSG_MANIFEST_CB&&self.__SSG_MANIFEST_CB() \ No newline at end of file diff --git a/vendor/hyperview/server/static/_next/static/chunks/462c5e072cd14e02.css b/vendor/hyperview/server/static/_next/static/chunks/462c5e072cd14e02.css new file mode 100644 index 0000000000000000000000000000000000000000..a2bd371eb2112c09b3d10955203ba8c6bb444c29 --- /dev/null +++ b/vendor/hyperview/server/static/_next/static/chunks/462c5e072cd14e02.css @@ -0,0 +1,3 @@ +@font-face{font-family:Inter;font-style:normal;font-weight:400;font-display:swap;src:url(../media/2c55a0e60120577a-s.2a48534a.woff2)format("woff2");unicode-range:U+460-52F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter;font-style:normal;font-weight:400;font-display:swap;src:url(../media/9c72aa0f40e4eef8-s.18a48cbc.woff2)format("woff2");unicode-range:U+301,U+400-45F,U+490-491,U+4B0-4B1,U+2116}@font-face{font-family:Inter;font-style:normal;font-weight:400;font-display:swap;src:url(../media/ad66f9afd8947f86-s.7a40eb73.woff2)format("woff2");unicode-range:U+1F??}@font-face{font-family:Inter;font-style:normal;font-weight:400;font-display:swap;src:url(../media/5476f68d60460930-s.c995e352.woff2)format("woff2");unicode-range:U+370-377,U+37A-37F,U+384-38A,U+38C,U+38E-3A1,U+3A3-3FF}@font-face{font-family:Inter;font-style:normal;font-weight:400;font-display:swap;src:url(../media/2bbe8d2671613f1f-s.76dcb0b2.woff2)format("woff2");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter;font-style:normal;font-weight:400;font-display:swap;src:url(../media/1bffadaabf893a1e-s.7cd81963.woff2)format("woff2");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter;font-style:normal;font-weight:400;font-display:swap;src:url(../media/83afe278b6a6bb3c-s.p.3a6ba036.woff2)format("woff2");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Inter;font-style:normal;font-weight:500;font-display:swap;src:url(../media/2c55a0e60120577a-s.2a48534a.woff2)format("woff2");unicode-range:U+460-52F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter;font-style:normal;font-weight:500;font-display:swap;src:url(../media/9c72aa0f40e4eef8-s.18a48cbc.woff2)format("woff2");unicode-range:U+301,U+400-45F,U+490-491,U+4B0-4B1,U+2116}@font-face{font-family:Inter;font-style:normal;font-weight:500;font-display:swap;src:url(../media/ad66f9afd8947f86-s.7a40eb73.woff2)format("woff2");unicode-range:U+1F??}@font-face{font-family:Inter;font-style:normal;font-weight:500;font-display:swap;src:url(../media/5476f68d60460930-s.c995e352.woff2)format("woff2");unicode-range:U+370-377,U+37A-37F,U+384-38A,U+38C,U+38E-3A1,U+3A3-3FF}@font-face{font-family:Inter;font-style:normal;font-weight:500;font-display:swap;src:url(../media/2bbe8d2671613f1f-s.76dcb0b2.woff2)format("woff2");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter;font-style:normal;font-weight:500;font-display:swap;src:url(../media/1bffadaabf893a1e-s.7cd81963.woff2)format("woff2");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter;font-style:normal;font-weight:500;font-display:swap;src:url(../media/83afe278b6a6bb3c-s.p.3a6ba036.woff2)format("woff2");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Inter Fallback;src:local(Arial);ascent-override:90.44%;descent-override:22.52%;line-gap-override:0.0%;size-adjust:107.12%}.inter_c50830d4-module__9YwRda__className{font-family:Inter,Inter Fallback;font-style:normal} +.dv-scrollable{position:relative;overflow:hidden}.dv-scrollable .dv-scrollbar-horizontal{will-change:background-color,transform;backface-visibility:hidden;background-color:#0000;border-radius:2px;height:4px;transition:background-color 1s ease-in-out;position:absolute;bottom:0;left:0;transform:translate(0,0)}.dv-scrollable:hover .dv-scrollbar-horizontal,.dv-scrollable.dv-scrollable-resizing .dv-scrollbar-horizontal,.dv-scrollable.dv-scrollable-scrolling .dv-scrollbar-horizontal{background-color:var(--dv-scrollbar-background-color,#ffffff40)}.dv-svg{fill:currentColor;stroke:currentColor;stroke-width:0;line-height:1;display:inline-block}.dockview-theme-dark{--dv-paneview-active-outline-color:dodgerblue;--dv-tabs-and-actions-container-font-size:13px;--dv-tabs-and-actions-container-height:35px;--dv-drag-over-background-color:#53595d80;--dv-drag-over-border-color:transparent;--dv-tabs-container-scrollbar-color:#888;--dv-icon-hover-background-color:#5a5d5e4f;--dv-floating-box-shadow:8px 8px 8px 0px #53595d80;--dv-overlay-z-index:999;--dv-tab-font-size:inherit;--dv-border-radius:0px;--dv-tab-margin:0;--dv-sash-color:transparent;--dv-active-sash-color:transparent;--dv-active-sash-transition-duration:.1s;--dv-active-sash-transition-delay:.5s;--dv-group-view-background-color:#1e1e1e;--dv-tabs-and-actions-container-background-color:#252526;--dv-activegroup-visiblepanel-tab-background-color:#1e1e1e;--dv-activegroup-hiddenpanel-tab-background-color:#2d2d2d;--dv-inactivegroup-visiblepanel-tab-background-color:#1e1e1e;--dv-inactivegroup-hiddenpanel-tab-background-color:#2d2d2d;--dv-tab-divider-color:#1e1e1e;--dv-activegroup-visiblepanel-tab-color:white;--dv-activegroup-hiddenpanel-tab-color:#969696;--dv-inactivegroup-visiblepanel-tab-color:#8f8f8f;--dv-inactivegroup-hiddenpanel-tab-color:#626262;--dv-separator-border:#444;--dv-paneview-header-border-color:#ccc3}.dockview-theme-dark .dv-drop-target-container .dv-drop-target-anchor.dv-drop-target-anchor-container-changed{opacity:0;transition:none}.dockview-theme-light{--dv-paneview-active-outline-color:dodgerblue;--dv-tabs-and-actions-container-font-size:13px;--dv-tabs-and-actions-container-height:35px;--dv-drag-over-background-color:#53595d80;--dv-drag-over-border-color:transparent;--dv-tabs-container-scrollbar-color:#888;--dv-icon-hover-background-color:#5a5d5e4f;--dv-floating-box-shadow:8px 8px 8px 0px #53595d80;--dv-overlay-z-index:999;--dv-tab-font-size:inherit;--dv-border-radius:0px;--dv-tab-margin:0;--dv-sash-color:transparent;--dv-active-sash-color:transparent;--dv-active-sash-transition-duration:.1s;--dv-active-sash-transition-delay:.5s;--dv-group-view-background-color:white;--dv-tabs-and-actions-container-background-color:#f3f3f3;--dv-activegroup-visiblepanel-tab-background-color:white;--dv-activegroup-hiddenpanel-tab-background-color:#ececec;--dv-inactivegroup-visiblepanel-tab-background-color:white;--dv-inactivegroup-hiddenpanel-tab-background-color:#ececec;--dv-tab-divider-color:white;--dv-activegroup-visiblepanel-tab-color:#333;--dv-activegroup-hiddenpanel-tab-color:#333333b3;--dv-inactivegroup-visiblepanel-tab-color:#333333b3;--dv-inactivegroup-hiddenpanel-tab-color:#33333359;--dv-separator-border:#80808059;--dv-paneview-header-border-color:#333;--dv-scrollbar-background-color:#00000040}.dockview-theme-light .dv-drop-target-container .dv-drop-target-anchor.dv-drop-target-anchor-container-changed{opacity:0;transition:none}.dockview-theme-vs{--dv-paneview-active-outline-color:dodgerblue;--dv-drag-over-background-color:#53595d80;--dv-drag-over-border-color:transparent;--dv-tabs-container-scrollbar-color:#888;--dv-icon-hover-background-color:#5a5d5e4f;--dv-floating-box-shadow:8px 8px 8px 0px #53595d80;--dv-overlay-z-index:999;--dv-tab-font-size:inherit;--dv-border-radius:0px;--dv-tab-margin:0;--dv-sash-color:transparent;--dv-active-sash-color:transparent;--dv-active-sash-transition-duration:.1s;--dv-active-sash-transition-delay:.5s;--dv-group-view-background-color:#1e1e1e;--dv-tabs-and-actions-container-background-color:#2d2d30;--dv-activegroup-visiblepanel-tab-background-color:#007acc;--dv-activegroup-hiddenpanel-tab-background-color:#2d2d2d;--dv-inactivegroup-visiblepanel-tab-background-color:#3f3f46;--dv-inactivegroup-hiddenpanel-tab-background-color:#2d2d2d;--dv-tab-divider-color:#1e1e1e;--dv-activegroup-hiddenpanel-tab-color:white;--dv-inactivegroup-visiblepanel-tab-color:white;--dv-inactivegroup-hiddenpanel-tab-color:white;--dv-separator-border:#444;--dv-paneview-header-border-color:#ccc3;--dv-tabs-and-actions-container-height:20px;--dv-tabs-and-actions-container-font-size:11px;--dv-activegroup-visiblepanel-tab-color:white}.dockview-theme-vs .dv-drop-target-container .dv-drop-target-anchor.dv-drop-target-anchor-container-changed{opacity:0;transition:none}.dockview-theme-vs .dv-groupview.dv-active-group>.dv-tabs-and-actions-container{box-sizing:content-box;border-bottom:2px solid var(--dv-activegroup-visiblepanel-tab-background-color)}.dockview-theme-vs .dv-groupview.dv-active-group>.dv-tabs-and-actions-container .dv-tab.dv-active-tab{border-top:2px solid var(--dv-activegroup-visiblepanel-tab-background-color)}.dockview-theme-vs .dv-groupview.dv-active-group>.dv-tabs-and-actions-container .dv-tab.dv-inactive-tab{border-top:2px solid var(--dv-activegroup-hiddenpanel-tab-background-color)}.dockview-theme-vs .dv-groupview.dv-inactive-group>.dv-tabs-and-actions-container{box-sizing:content-box;border-bottom:2px solid var(--dv-inactivegroup-visiblepanel-tab-background-color)}.dockview-theme-vs .dv-groupview.dv-inactive-group>.dv-tabs-and-actions-container .dv-tab.dv-active-tab{border-top:2px solid var(--dv-inactivegroup-visiblepanel-tab-background-color)}.dockview-theme-vs .dv-groupview.dv-inactive-group>.dv-tabs-and-actions-container .dv-tab.dv-inactive-tab{border-top:2px solid var(--dv-inactivegroup-hiddenpanel-tab-background-color)}.dockview-theme-abyss{--dv-paneview-active-outline-color:#596f99;--dv-tabs-and-actions-container-font-size:13px;--dv-tabs-and-actions-container-height:35px;--dv-drag-over-background-color:#53595d80;--dv-drag-over-border-color:transparent;--dv-tabs-container-scrollbar-color:#888;--dv-icon-hover-background-color:#5a5d5e4f;--dv-floating-box-shadow:8px 8px 8px 0px #53595d80;--dv-overlay-z-index:999;--dv-tab-font-size:inherit;--dv-border-radius:0px;--dv-tab-margin:0;--dv-sash-color:transparent;--dv-active-sash-color:transparent;--dv-active-sash-transition-duration:.1s;--dv-active-sash-transition-delay:.5s;--dv-color-abyss-dark:#000c18;--dv-color-abyss:#10192c;--dv-color-abyss-light:#1c1c2a;--dv-color-abyss-lighter:#2b2b4a;--dv-color-abyss-accent:#5b1ecf;--dv-color-abyss-primary-text:white;--dv-color-abyss-secondary-text:#9497a9;--dv-group-view-background-color:var(--dv-color-abyss-dark);--dv-tabs-and-actions-container-background-color:var(--dv-color-abyss-light);--dv-activegroup-visiblepanel-tab-background-color:var(--dv-color-abyss-dark);--dv-activegroup-hiddenpanel-tab-background-color:var(--dv-color-abyss);--dv-inactivegroup-visiblepanel-tab-background-color:var(--dv-color-abyss-dark);--dv-inactivegroup-hiddenpanel-tab-background-color:var(--dv-color-abyss);--dv-tab-divider-color:var(--dv-color-abyss-lighter);--dv-activegroup-visiblepanel-tab-color:white;--dv-activegroup-hiddenpanel-tab-color:#ffffff80;--dv-inactivegroup-visiblepanel-tab-color:#ffffff80;--dv-inactivegroup-hiddenpanel-tab-color:#ffffff40;--dv-separator-border:var(--dv-color-abyss-lighter);--dv-paneview-header-border-color:var(--dv-color-abyss-lighter)}.dockview-theme-abyss .dv-drop-target-container .dv-drop-target-anchor.dv-drop-target-anchor-container-changed{opacity:0;transition:none}.dockview-theme-dracula{--dv-paneview-active-outline-color:#6272a4;--dv-tabs-and-actions-container-font-size:13px;--dv-tabs-and-actions-container-height:35px;--dv-drag-over-background-color:#53595d80;--dv-drag-over-border-color:transparent;--dv-tabs-container-scrollbar-color:#888;--dv-icon-hover-background-color:#5a5d5e4f;--dv-floating-box-shadow:8px 8px 8px 0px #53595d80;--dv-overlay-z-index:999;--dv-tab-font-size:inherit;--dv-border-radius:0px;--dv-tab-margin:0;--dv-sash-color:transparent;--dv-active-sash-color:transparent;--dv-active-sash-transition-duration:.1s;--dv-active-sash-transition-delay:.5s;--dv-group-view-background-color:#282a36;--dv-tabs-and-actions-container-background-color:#191a21;--dv-activegroup-visiblepanel-tab-background-color:#282a36;--dv-activegroup-hiddenpanel-tab-background-color:#21222c;--dv-inactivegroup-visiblepanel-tab-background-color:#282a36;--dv-inactivegroup-hiddenpanel-tab-background-color:#21222c;--dv-tab-divider-color:#191a21;--dv-activegroup-visiblepanel-tab-color:#f8f8f2;--dv-activegroup-hiddenpanel-tab-color:#6272a4;--dv-inactivegroup-visiblepanel-tab-color:#f8f8f280;--dv-inactivegroup-hiddenpanel-tab-color:#6272a480;--dv-separator-border:#bd93f9;--dv-paneview-header-border-color:#bd93f9}.dockview-theme-dracula .dv-drop-target-container .dv-drop-target-anchor.dv-drop-target-anchor-container-changed{opacity:0;transition:none}.dockview-theme-dracula .dv-groupview.dv-active-group>.dv-tabs-and-actions-container .dv-tabs-container>.dv-tab.dv-active-tab{position:relative}.dockview-theme-dracula .dv-groupview.dv-active-group>.dv-tabs-and-actions-container .dv-tabs-container>.dv-tab.dv-active-tab:after{content:"";z-index:999;background-color:#94527e;width:100%;height:1px;position:absolute;top:0;left:0}.dockview-theme-dracula .dv-groupview.dv-inactive-group>.dv-tabs-and-actions-container .dv-tabs-container>.dv-tab.dv-active-tab{position:relative}.dockview-theme-dracula .dv-groupview.dv-inactive-group>.dv-tabs-and-actions-container .dv-tabs-container>.dv-tab.dv-active-tab:after{content:"";z-index:999;background-color:#5e3d5a;width:100%;height:1px;position:absolute;bottom:0;left:0}.dockview-theme-replit{--dv-paneview-active-outline-color:dodgerblue;--dv-tabs-and-actions-container-font-size:13px;--dv-tabs-and-actions-container-height:35px;--dv-drag-over-background-color:#53595d80;--dv-drag-over-border-color:transparent;--dv-tabs-container-scrollbar-color:#888;--dv-icon-hover-background-color:#5a5d5e4f;--dv-floating-box-shadow:8px 8px 8px 0px #53595d80;--dv-overlay-z-index:999;--dv-tab-font-size:inherit;--dv-border-radius:0px;--dv-tab-margin:0;--dv-sash-color:#cfd1d3;--dv-active-sash-color:#babbbb;--dv-active-sash-transition-duration:.1s;--dv-active-sash-transition-delay:.5s;box-sizing:border-box;--dv-group-view-background-color:#ebeced;--dv-tabs-and-actions-container-background-color:#fcfcfc;--dv-activegroup-visiblepanel-tab-background-color:#f0f1f2;--dv-activegroup-hiddenpanel-tab-background-color:#fcfcfc;--dv-inactivegroup-visiblepanel-tab-background-color:#f0f1f2;--dv-inactivegroup-hiddenpanel-tab-background-color:#fcfcfc;--dv-tab-divider-color:transparent;--dv-activegroup-visiblepanel-tab-color:#333;--dv-activegroup-hiddenpanel-tab-color:#333;--dv-inactivegroup-visiblepanel-tab-color:#333;--dv-inactivegroup-hiddenpanel-tab-color:#333;--dv-separator-border:transparent;--dv-paneview-header-border-color:#333;background-color:#ebeced;padding:10px}.dockview-theme-replit .dv-drop-target-container .dv-drop-target-anchor.dv-drop-target-anchor-container-changed{opacity:0;transition:none}.dockview-theme-replit .dv-resize-container:has(>.dv-groupview){border-radius:8px}.dockview-theme-replit .dv-resize-container{border:none;border-radius:10px!important}.dockview-theme-replit .dv-groupview{border-radius:10px;overflow:hidden}.dockview-theme-replit .dv-groupview .dv-tabs-and-actions-container{border-bottom:1px solid #80808059}.dockview-theme-replit .dv-groupview .dv-tabs-and-actions-container .dv-tab{border-radius:8px;margin:4px}.dockview-theme-replit .dv-groupview .dv-tabs-and-actions-container .dv-tab .dv-svg{width:8px;height:8px}.dockview-theme-replit .dv-groupview .dv-tabs-and-actions-container .dv-tab:hover{background-color:#e4e5e6!important}.dockview-theme-replit .dv-groupview .dv-content-container{background-color:#fcfcfc}.dockview-theme-replit .dv-groupview.dv-active-group{border:1px solid #80808059}.dockview-theme-replit .dv-groupview.dv-inactive-group{border:1px solid #0000}.dockview-theme-replit .dv-vertical>.dv-sash-container>.dv-sash{background-color:#0000}.dockview-theme-replit .dv-vertical>.dv-sash-container>.dv-sash:not(.disabled):after{content:"";background-color:var(--dv-sash-color);border-radius:2px;width:40px;height:4px;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.dockview-theme-replit .dv-vertical>.dv-sash-container>.dv-sash:not(.disabled):hover,.dockview-theme-replit .dv-vertical>.dv-sash-container>.dv-sash:not(.disabled):active{background-color:#0000}.dockview-theme-replit .dv-vertical>.dv-sash-container>.dv-sash:not(.disabled):hover:after,.dockview-theme-replit .dv-vertical>.dv-sash-container>.dv-sash:not(.disabled):active:after{background-color:var(--dv-active-sash-color)}.dockview-theme-replit .dv-horizontal>.dv-sash-container>.dv-sash{background-color:#0000}.dockview-theme-replit .dv-horizontal>.dv-sash-container>.dv-sash:not(.disabled):after{content:"";background-color:var(--dv-sash-color);border-radius:2px;width:4px;height:40px;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.dockview-theme-replit .dv-horizontal>.dv-sash-container>.dv-sash:not(.disabled):hover,.dockview-theme-replit .dv-horizontal>.dv-sash-container>.dv-sash:not(.disabled):active{background-color:#0000}.dockview-theme-replit .dv-horizontal>.dv-sash-container>.dv-sash:not(.disabled):hover:after,.dockview-theme-replit .dv-horizontal>.dv-sash-container>.dv-sash:not(.disabled):active:after{background-color:var(--dv-active-sash-color)}.dockview-theme-abyss-spaced{--dv-paneview-active-outline-color:dodgerblue;--dv-tabs-and-actions-container-font-size:13px;--dv-drag-over-background-color:"";--dv-drag-over-border-color:transparent;--dv-tabs-container-scrollbar-color:#888;--dv-icon-hover-background-color:#5a5d5e4f;--dv-floating-box-shadow:8px 8px 8px 0px #00000080;--dv-overlay-z-index:999;--dv-tab-font-size:12px;--dv-tab-margin:.5rem .25rem;--dv-sash-color:transparent;--dv-active-sash-color:var(--dv-color-abyss-accent);--dv-active-sash-transition-duration:.1s;--dv-active-sash-transition-delay:.5s;--dv-tabs-and-actions-container-height:44px;--dv-border-radius:20px;box-sizing:border-box;--dv-color-abyss-dark:#0b0611;--dv-color-abyss:#16121f;--dv-color-abyss-light:#201d2b;--dv-color-abyss-lighter:#2a2837;--dv-color-abyss-accent:#5b1ecf;--dv-color-abyss-primary-text:white;--dv-color-abyss-secondary-text:#9497a9;--dv-drag-over-border:2px solid var(--dv-color-abyss-accent);--dv-group-view-background-color:var(--dv-color-abyss-dark);--dv-tabs-and-actions-container-background-color:var(--dv-color-abyss);--dv-activegroup-visiblepanel-tab-background-color:var(--dv-color-abyss-lighter);--dv-activegroup-hiddenpanel-tab-background-color:var(--dv-color-abyss-light);--dv-inactivegroup-visiblepanel-tab-background-color:var(--dv-color-abyss-lighter);--dv-inactivegroup-hiddenpanel-tab-background-color:var(--dv-color-abyss-light);--dv-tab-divider-color:transparent;--dv-activegroup-visiblepanel-tab-color:var(--dv-color-abyss-primary-text);--dv-activegroup-hiddenpanel-tab-color:var(--dv-color-abyss-secondary-text);--dv-inactivegroup-visiblepanel-tab-color:var(--dv-color-abyss-primary-text);--dv-inactivegroup-hiddenpanel-tab-color:var(--dv-color-abyss-secondary-text);--dv-separator-border:transparent;--dv-paneview-header-border-color:#333;background-color:var(--dv-color-abyss-dark);padding:10px}.dockview-theme-abyss-spaced .dv-resize-container:has(>.dv-groupview){border-radius:8px}.dockview-theme-abyss-spaced .dv-sash{border-radius:4px}.dockview-theme-abyss-spaced .dv-drop-target-anchor{border-radius:calc(var(--dv-border-radius)/4)}.dockview-theme-abyss-spaced .dv-drop-target-anchor.dv-drop-target-content{border-radius:var(--dv-border-radius)}.dockview-theme-abyss-spaced .dv-resize-container{border:none;border-radius:var(--dv-border-radius)!important}.dockview-theme-abyss-spaced .dv-tabs-overflow-container,.dockview-theme-abyss-spaced .dv-tabs-overflow-dropdown-default{border-radius:8px;height:unset!important}.dockview-theme-abyss-spaced .dv-tab{border-radius:8px}.dockview-theme-abyss-spaced .dv-tab .dv-svg{width:8px;height:8px}.dockview-theme-abyss-spaced .dv-groupview{border-radius:var(--dv-border-radius)}.dockview-theme-abyss-spaced .dv-groupview .dv-tabs-and-actions-container{padding:0px calc(var(--dv-border-radius)/2)}.dockview-theme-abyss-spaced .dv-groupview .dv-content-container{background-color:var(--dv-tabs-and-actions-container-background-color)}.dockview-theme-abyss-spaced .dv-resize-container .dv-groupview{border:2px solid var(--dv-color-abyss-dark)}.dockview-theme-light-spaced{--dv-paneview-active-outline-color:dodgerblue;--dv-tabs-and-actions-container-font-size:13px;--dv-drag-over-background-color:"";--dv-drag-over-border-color:transparent;--dv-tabs-container-scrollbar-color:#888;--dv-icon-hover-background-color:#5a5d5e4f;--dv-floating-box-shadow:8px 8px 8px 0px #0000001a;--dv-overlay-z-index:999;--dv-tab-font-size:12px;--dv-tab-margin:.5rem .25rem;--dv-sash-color:transparent;--dv-active-sash-color:#5b1ecf;--dv-active-sash-transition-duration:.1s;--dv-active-sash-transition-delay:.5s;--dv-tabs-and-actions-container-height:44px;--dv-border-radius:20px;box-sizing:border-box;--dv-drag-over-border:2px solid #5b1ecf;--dv-group-view-background-color:#f6f5f9;--dv-tabs-and-actions-container-background-color:white;--dv-activegroup-visiblepanel-tab-background-color:#ededf0;--dv-activegroup-hiddenpanel-tab-background-color:#f9f9fa;--dv-inactivegroup-visiblepanel-tab-background-color:#ededf0;--dv-inactivegroup-hiddenpanel-tab-background-color:#f9f9fa;--dv-tab-divider-color:transparent;--dv-activegroup-visiblepanel-tab-color:#686b82;--dv-activegroup-hiddenpanel-tab-color:#9497a9;--dv-inactivegroup-visiblepanel-tab-color:#686b82;--dv-inactivegroup-hiddenpanel-tab-color:#9497a9;--dv-separator-border:transparent;--dv-paneview-header-border-color:#333;--dv-scrollbar-background-color:#00000040;background-color:#f6f5f9;padding:10px}.dockview-theme-light-spaced .dv-resize-container:has(>.dv-groupview){border-radius:8px}.dockview-theme-light-spaced .dv-sash{border-radius:4px}.dockview-theme-light-spaced .dv-drop-target-anchor{border-radius:calc(var(--dv-border-radius)/4)}.dockview-theme-light-spaced .dv-drop-target-anchor.dv-drop-target-content{border-radius:var(--dv-border-radius)}.dockview-theme-light-spaced .dv-resize-container{border:none;border-radius:var(--dv-border-radius)!important}.dockview-theme-light-spaced .dv-tabs-overflow-container,.dockview-theme-light-spaced .dv-tabs-overflow-dropdown-default{border-radius:8px;height:unset!important}.dockview-theme-light-spaced .dv-tab{border-radius:8px}.dockview-theme-light-spaced .dv-tab .dv-svg{width:8px;height:8px}.dockview-theme-light-spaced .dv-groupview{border-radius:var(--dv-border-radius)}.dockview-theme-light-spaced .dv-groupview .dv-tabs-and-actions-container{padding:0px calc(var(--dv-border-radius)/2)}.dockview-theme-light-spaced .dv-groupview .dv-content-container{background-color:var(--dv-tabs-and-actions-container-background-color)}.dockview-theme-light-spaced .dv-resize-container .dv-groupview{border:2px solid #ffffff1a}.dv-drop-target-container{z-index:9999;pointer-events:none;--dv-transition-duration:.3s;width:100%;height:100%;position:absolute;top:0;left:0;overflow:hidden}.dv-drop-target-container .dv-drop-target-anchor{border:var(--dv-drag-over-border);background-color:var(--dv-drag-over-background-color);opacity:1;will-change:transform,opacity;backface-visibility:hidden;contain:layout paint;transition:opacity var(--dv-transition-duration)ease-in,transform var(--dv-transition-duration)ease-out;position:relative;transform:translate(0,0)}.dv-drop-target{--dv-transition-duration:70ms;position:relative}.dv-drop-target>.dv-drop-target-dropzone{z-index:1000;pointer-events:none;width:100%;height:100%;position:absolute;top:0;left:0}.dv-drop-target>.dv-drop-target-dropzone>.dv-drop-target-selection{box-sizing:border-box;border:var(--dv-drag-over-border);background-color:var(--dv-drag-over-background-color);width:100%;height:100%;transition:top var(--dv-transition-duration)ease-out,left var(--dv-transition-duration)ease-out,width var(--dv-transition-duration)ease-out,height var(--dv-transition-duration)ease-out,opacity var(--dv-transition-duration)ease-out;will-change:transform;pointer-events:none;position:relative}.dv-drop-target>.dv-drop-target-dropzone>.dv-drop-target-selection.dv-drop-target-top.dv-drop-target-small-vertical{border-top:1px solid var(--dv-drag-over-border-color)}.dv-drop-target>.dv-drop-target-dropzone>.dv-drop-target-selection.dv-drop-target-bottom.dv-drop-target-small-vertical{border-bottom:1px solid var(--dv-drag-over-border-color)}.dv-drop-target>.dv-drop-target-dropzone>.dv-drop-target-selection.dv-drop-target-left.dv-drop-target-small-horizontal{border-left:1px solid var(--dv-drag-over-border-color)}.dv-drop-target>.dv-drop-target-dropzone>.dv-drop-target-selection.dv-drop-target-right.dv-drop-target-small-horizontal{border-right:1px solid var(--dv-drag-over-border-color)}.dv-dockview{background-color:var(--dv-group-view-background-color);contain:layout;position:relative}.dv-dockview .dv-watermark-container{z-index:1;width:100%;height:100%;position:absolute;top:0;left:0}.dv-dockview .dv-overlay-render-container{position:relative}.dv-groupview.dv-active-group>.dv-tabs-and-actions-container .dv-tabs-container>.dv-tab.dv-active-tab{background-color:var(--dv-activegroup-visiblepanel-tab-background-color);color:var(--dv-activegroup-visiblepanel-tab-color)}.dv-groupview.dv-active-group>.dv-tabs-and-actions-container .dv-tabs-container>.dv-tab.dv-inactive-tab{background-color:var(--dv-activegroup-hiddenpanel-tab-background-color);color:var(--dv-activegroup-hiddenpanel-tab-color)}.dv-groupview.dv-inactive-group>.dv-tabs-and-actions-container .dv-tabs-container>.dv-tab.dv-active-tab{background-color:var(--dv-inactivegroup-visiblepanel-tab-background-color);color:var(--dv-inactivegroup-visiblepanel-tab-color)}.dv-groupview.dv-inactive-group>.dv-tabs-and-actions-container .dv-tabs-container>.dv-tab.dv-inactive-tab{background-color:var(--dv-inactivegroup-hiddenpanel-tab-background-color);color:var(--dv-inactivegroup-hiddenpanel-tab-color)}.dv-tab.dv-tab-dragging{background-color:var(--dv-activegroup-visiblepanel-tab-background-color);color:var(--dv-activegroup-visiblepanel-tab-color)}.dv-groupview{background-color:var(--dv-group-view-background-color);flex-direction:column;height:100%;display:flex;overflow:hidden}.dv-groupview:focus{outline:none}.dv-groupview>.dv-content-container{outline:none;flex-grow:1;min-height:0}.dv-root-wrapper,.dv-grid-view,.dv-branch-node{width:100%;height:100%}.dv-debug .dv-resize-container .dv-resize-handle-top{background-color:red}.dv-debug .dv-resize-container .dv-resize-handle-bottom{background-color:green}.dv-debug .dv-resize-container .dv-resize-handle-left{background-color:#ff0}.dv-debug .dv-resize-container .dv-resize-handle-right{background-color:#00f}.dv-debug .dv-resize-container .dv-resize-handle-topleft,.dv-debug .dv-resize-container .dv-resize-handle-topright,.dv-debug .dv-resize-container .dv-resize-handle-bottomleft,.dv-debug .dv-resize-container .dv-resize-handle-bottomright{background-color:#0ff}.dv-resize-container{--dv-overlay-z-index:var(--dv-overlay-z-index,999);z-index:calc(var(--dv-overlay-z-index) - 2);border:1px solid var(--dv-tab-divider-color);box-shadow:var(--dv-floating-box-shadow);will-change:transform,opacity;backface-visibility:hidden;position:absolute;transform:translate(0,0)}.dv-resize-container.dv-hidden{display:none}.dv-resize-container.dv-resize-container-dragging{opacity:.5;will-change:transform,opacity}.dv-resize-container .dv-resize-handle-top{width:calc(100% - 8px);height:4px;z-index:var(--dv-overlay-z-index);cursor:ns-resize;position:absolute;top:-2px;left:4px}.dv-resize-container .dv-resize-handle-bottom{width:calc(100% - 8px);height:4px;z-index:var(--dv-overlay-z-index);cursor:ns-resize;position:absolute;bottom:-2px;left:4px}.dv-resize-container .dv-resize-handle-left{width:4px;height:calc(100% - 8px);z-index:var(--dv-overlay-z-index);cursor:ew-resize;position:absolute;top:4px;left:-2px}.dv-resize-container .dv-resize-handle-right{width:4px;height:calc(100% - 8px);z-index:var(--dv-overlay-z-index);cursor:ew-resize;position:absolute;top:4px;right:-2px}.dv-resize-container .dv-resize-handle-topleft{width:4px;height:4px;z-index:var(--dv-overlay-z-index);cursor:nw-resize;position:absolute;top:-2px;left:-2px}.dv-resize-container .dv-resize-handle-topright{width:4px;height:4px;z-index:var(--dv-overlay-z-index);cursor:ne-resize;position:absolute;top:-2px;right:-2px}.dv-resize-container .dv-resize-handle-bottomleft{width:4px;height:4px;z-index:var(--dv-overlay-z-index);cursor:sw-resize;position:absolute;bottom:-2px;left:-2px}.dv-resize-container .dv-resize-handle-bottomright{width:4px;height:4px;z-index:var(--dv-overlay-z-index);cursor:se-resize;position:absolute;bottom:-2px;right:-2px}.dv-render-overlay{--dv-overlay-z-index:var(--dv-overlay-z-index,999);z-index:1;contain:layout paint;isolation:isolate;will-change:transform;backface-visibility:hidden;width:100%;height:100%;position:absolute;transform:translate(0,0)}.dv-render-overlay.dv-render-overlay-float{z-index:calc(var(--dv-overlay-z-index) - 1)}.dv-debug .dv-render-overlay{outline-offset:-1;outline:1px solid red}.dv-pane-container{width:100%;height:100%}.dv-pane-container.dv-animated .dv-view{will-change:transform;backface-visibility:hidden;transition:transform .15s ease-out;transform:translate(0,0)}.dv-pane-container .dv-view{flex-direction:column;display:flex;overflow:hidden;padding:0!important}.dv-pane-container .dv-view:not(:first-child):before{background-color:#0000!important}.dv-pane-container .dv-view:not(:first-child) .dv-pane>.dv-pane-header{border-top:1px solid var(--dv-paneview-header-border-color)}.dv-pane-container .dv-view .dv-default-header{background-color:var(--dv-group-view-background-color);color:var(--dv-activegroup-visiblepanel-tab-color);cursor:pointer;padding:0 8px;display:flex}.dv-pane-container .dv-view .dv-default-header .dv-pane-header-icon{justify-content:center;align-items:center;display:flex}.dv-pane-container .dv-view .dv-default-header>span{flex-grow:1;padding-left:8px}.dv-pane-container:first-of-type>.dv-pane>.dv-pane-header{border-top:none!important}.dv-pane-container .dv-pane{flex-direction:column;height:100%;display:flex;overflow:hidden}.dv-pane-container .dv-pane .dv-pane-header{box-sizing:border-box;-webkit-user-select:none;user-select:none;outline:none;position:relative}.dv-pane-container .dv-pane .dv-pane-header.dv-pane-draggable{cursor:pointer}.dv-pane-container .dv-pane .dv-pane-header:focus:before,.dv-pane-container .dv-pane .dv-pane-header:focus-within:before{z-index:5;content:"";pointer-events:none;outline-offset:-1px;outline:-1px solid;outline-color:var(--dv-paneview-active-outline-color);width:100%;height:100%;position:absolute;top:0;left:0}.dv-pane-container .dv-pane .dv-pane-body{outline:none;flex-grow:1;position:relative;overflow:hidden auto}.dv-pane-container .dv-pane .dv-pane-body:focus:before,.dv-pane-container .dv-pane .dv-pane-body:focus-within:before{z-index:5;content:"";pointer-events:none;outline-offset:-1px;outline:-1px solid;outline-color:var(--dv-paneview-active-outline-color);width:100%;height:100%;position:absolute;top:0;left:0}.dv-debug .dv-split-view-container .dv-sash-container .dv-sash.dv-enabled{background-color:#000}.dv-debug .dv-split-view-container .dv-sash-container .dv-sash.dv-disabled{background-color:orange}.dv-debug .dv-split-view-container .dv-sash-container .dv-sash.dv-maximum{background-color:green}.dv-debug .dv-split-view-container .dv-sash-container .dv-sash.dv-minimum{background-color:red}.dv-split-view-container{width:100%;height:100%;position:relative;overflow:hidden}.dv-split-view-container.dv-splitview-disabled>.dv-sash-container>.dv-sash{pointer-events:none}.dv-split-view-container.dv-animation .dv-view,.dv-split-view-container.dv-animation .dv-sash{will-change:transform;backface-visibility:hidden;transition:transform .15s ease-out;transform:translate(0,0)}.dv-split-view-container.dv-horizontal{height:100%}.dv-split-view-container.dv-horizontal>.dv-sash-container>.dv-sash{width:4px;height:100%}.dv-split-view-container.dv-horizontal>.dv-sash-container>.dv-sash.dv-enabled{cursor:ew-resize}.dv-split-view-container.dv-horizontal>.dv-sash-container>.dv-sash.dv-disabled{cursor:default}.dv-split-view-container.dv-horizontal>.dv-sash-container>.dv-sash.dv-maximum{cursor:w-resize}.dv-split-view-container.dv-horizontal>.dv-sash-container>.dv-sash.dv-minimum{cursor:e-resize}.dv-split-view-container.dv-horizontal>.dv-view-container>.dv-view:not(:first-child):before{width:1px;height:100%}.dv-split-view-container.dv-vertical{width:100%}.dv-split-view-container.dv-vertical>.dv-sash-container>.dv-sash{width:100%;height:4px}.dv-split-view-container.dv-vertical>.dv-sash-container>.dv-sash.dv-enabled{cursor:ns-resize}.dv-split-view-container.dv-vertical>.dv-sash-container>.dv-sash.dv-disabled{cursor:default}.dv-split-view-container.dv-vertical>.dv-sash-container>.dv-sash.dv-maximum{cursor:n-resize}.dv-split-view-container.dv-vertical>.dv-sash-container>.dv-sash.dv-minimum{cursor:s-resize}.dv-split-view-container.dv-vertical>.dv-view-container>.dv-view{width:100%}.dv-split-view-container.dv-vertical>.dv-view-container>.dv-view:not(:first-child):before{width:100%;height:1px}.dv-split-view-container .dv-sash-container{width:100%;height:100%;position:absolute}.dv-split-view-container .dv-sash-container .dv-sash{z-index:99;-webkit-user-select:none;user-select:none;touch-action:none;background-color:var(--dv-sash-color,transparent);outline:none;position:absolute}.dv-split-view-container .dv-sash-container .dv-sash:not(.disabled):active,.dv-split-view-container .dv-sash-container .dv-sash:not(.disabled):hover{background-color:var(--dv-active-sash-color,transparent);transition-property:background-color;transition-timing-function:ease-in-out;transition-duration:var(--dv-active-sash-transition-duration,.1s);transition-delay:var(--dv-active-sash-transition-delay,.5s)}.dv-split-view-container .dv-view-container{width:100%;height:100%;position:relative}.dv-split-view-container .dv-view-container .dv-view{box-sizing:border-box;height:100%;position:absolute;overflow:auto}.dv-split-view-container.dv-separator-border .dv-view:not(:first-child):before{content:" ";z-index:5;pointer-events:none;background-color:var(--dv-separator-border);position:absolute;top:0;left:0}.dv-dragged{transform:translate(0,0)}.dv-tab{flex-shrink:0}.dv-tab:focus-within,.dv-tab:focus{position:relative}.dv-tab:focus-within:after,.dv-tab:focus:after{content:"";pointer-events:none;outline-offset:-1px;z-index:5;width:100%;height:100%;position:absolute;top:0;left:0;outline:1px solid var(--dv-tab-divider-color)!important}.dv-tab.dv-tab-dragging .dv-default-tab-action{background-color:var(--dv-activegroup-visiblepanel-tab-color)}.dv-tab.dv-active-tab .dv-default-tab .dv-default-tab-action{visibility:visible}.dv-tab.dv-inactive-tab .dv-default-tab .dv-default-tab-action{visibility:hidden}.dv-tab.dv-inactive-tab .dv-default-tab:hover .dv-default-tab-action{visibility:visible}.dv-tab .dv-default-tab{white-space:nowrap;text-overflow:ellipsis;align-items:center;height:100%;display:flex;position:relative}.dv-tab .dv-default-tab .dv-default-tab-content{flex-grow:1;margin-right:4px}.dv-tab .dv-default-tab .dv-default-tab-action{box-sizing:border-box;justify-content:center;align-items:center;padding:4px;display:flex}.dv-tab .dv-default-tab .dv-default-tab-action:hover{background-color:var(--dv-icon-hover-background-color);border-radius:2px}.dv-tabs-overflow-dropdown-default{height:100%;color:var(--dv-activegroup-hiddenpanel-tab-color);margin:var(--dv-tab-margin);cursor:pointer;flex-shrink:0;align-items:center;padding:.25rem .5rem;display:flex}.dv-tabs-overflow-dropdown-default>span{padding-left:.25rem}.dv-tabs-overflow-dropdown-default>svg{transform:rotate(90deg)}.dv-tabs-container{scrollbar-width:thin;will-change:scroll-position;height:100%;display:flex;overflow:auto;transform:translate(0,0)}.dv-tabs-container.dv-horizontal .dv-tab:not(:first-child):before{content:" ";z-index:5;pointer-events:none;background-color:var(--dv-tab-divider-color);width:1px;height:100%;position:absolute;top:0;left:0}.dv-tabs-container::-webkit-scrollbar{height:3px}.dv-tabs-container::-webkit-scrollbar-track{background:0 0}.dv-tabs-container::-webkit-scrollbar-thumb{background:var(--dv-tabs-container-scrollbar-color)}.dv-scrollable>.dv-tabs-container{overflow:hidden}.dv-tab{-webkit-user-drag:element;cursor:pointer;box-sizing:border-box;font-size:var(--dv-tab-font-size);margin:var(--dv-tab-margin);outline:none;padding:.25rem .5rem;position:relative}.dv-tabs-overflow-container{height:unset;border:1px solid var(--dv-tab-divider-color);background-color:var(--dv-group-view-background-color);flex-direction:column}.dv-tabs-overflow-container .dv-tab:not(:last-child){border-bottom:1px solid var(--dv-tab-divider-color)}.dv-tabs-overflow-container .dv-active-tab{background-color:var(--dv-activegroup-visiblepanel-tab-background-color);color:var(--dv-activegroup-visiblepanel-tab-color)}.dv-tabs-overflow-container .dv-inactive-tab{background-color:var(--dv-activegroup-hiddenpanel-tab-background-color);color:var(--dv-activegroup-hiddenpanel-tab-color)}.dv-tabs-and-actions-container{background-color:var(--dv-tabs-and-actions-container-background-color);box-sizing:border-box;height:var(--dv-tabs-and-actions-container-height);font-size:var(--dv-tabs-and-actions-container-font-size);flex-shrink:0;display:flex}.dv-tabs-and-actions-container.dv-single-tab.dv-full-width-single-tab .dv-scrollable,.dv-tabs-and-actions-container.dv-single-tab.dv-full-width-single-tab .dv-tabs-container{flex-grow:1}.dv-tabs-and-actions-container.dv-single-tab.dv-full-width-single-tab .dv-tabs-container .dv-tab{flex-grow:1;padding:0}.dv-tabs-and-actions-container.dv-single-tab.dv-full-width-single-tab .dv-void-container{flex-grow:0}.dv-tabs-and-actions-container .dv-void-container{flex-grow:1;display:flex}.dv-tabs-and-actions-container .dv-void-container.dv-draggable{cursor:grab}.dv-tabs-and-actions-container .dv-right-actions-container{display:flex}.dv-watermark{height:100%;display:flex} +*,:before,:after,::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#3b82f680;--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border:0 solid #e5e7eb}:before,:after{--tw-content:""}html,:host{-webkit-text-size-adjust:100%;tab-size:4;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;line-height:1.5}body{line-height:inherit;margin:0}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-feature-settings:normal;font-variation-settings:normal;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-feature-settings:inherit;font-variation-settings:inherit;font-family:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:#0000;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{margin:0;padding:0;list-style:none}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder{opacity:1;color:#9ca3af}textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}html,body{height:100%;margin:0;padding:0;overflow:hidden}:root{--background:215 28% 7%;--foreground:213 27% 92%;--card:215 21% 11%;--card-foreground:213 27% 92%;--popover:215 21% 11%;--popover-foreground:213 27% 92%;--primary:212 100% 67%;--primary-foreground:215 28% 7%;--secondary:215 14% 17%;--secondary-foreground:213 27% 92%;--muted:215 14% 17%;--muted-foreground:213 12% 58%;--accent:215 14% 17%;--accent-foreground:213 27% 92%;--destructive:0 62% 50%;--destructive-foreground:0 0% 98%;--border:215 14% 22%;--input:215 14% 22%;--ring:212 100% 67%;--radius:.375rem;--surface:215 21% 11%;--surface-light:215 14% 17%;--surface-elevated:215 14% 22%;--border-subtle:215 14% 17%;--text:213 27% 92%;--text-muted:213 12% 58%;--text-subtle:215 10% 46%;--accent-cyan:176 60% 53%;--accent-orange:27 86% 59%}*{border-color:hsl(var(--border))}body{background-color:hsl(var(--background));color:hsl(var(--foreground));letter-spacing:-.15px;font-feature-settings:"liga" 1,"calt" 1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-size:12px;font-weight:500;line-height:16px}.\!container{width:100%!important}.container{width:100%}@media (min-width:640px){.\!container{max-width:640px!important}.container{max-width:640px}}@media (min-width:768px){.\!container{max-width:768px!important}.container{max-width:768px}}@media (min-width:1024px){.\!container{max-width:1024px!important}.container{max-width:1024px}}@media (min-width:1280px){.\!container{max-width:1280px!important}.container{max-width:1280px}}@media (min-width:1536px){.\!container{max-width:1536px!important}.container{max-width:1536px}}.sr-only{clip:rect(0,0,0,0);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.pointer-events-none{pointer-events:none}.visible{visibility:visible}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.inset-0{inset:0}.bottom-0\.5{bottom:.125rem}.left-0\.5{left:.125rem}.left-1\.5{left:.375rem}.left-\[50\%\]{left:50%}.right-0\.5{right:.125rem}.right-3{right:.75rem}.right-4{right:1rem}.top-0\.5{top:.125rem}.top-3{top:.75rem}.top-4{top:1rem}.top-\[50\%\]{top:50%}.z-10{z-index:10}.z-50{z-index:50}.-mx-1{margin-left:-.25rem;margin-right:-.25rem}.mx-1{margin-left:.25rem;margin-right:.25rem}.mx-auto{margin-left:auto;margin-right:auto}.my-0\.5{margin-top:.125rem;margin-bottom:.125rem}.mb-2{margin-bottom:.5rem}.mb-4{margin-bottom:1rem}.ml-0\.5{margin-left:.125rem}.ml-1{margin-left:.25rem}.ml-2{margin-left:.5rem}.ml-auto{margin-left:auto}.mr-2{margin-right:.5rem}.mt-4{margin-top:1rem}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.grid{display:grid}.hidden{display:none}.h-10{height:2.5rem}.h-12{height:3rem}.h-16{height:4rem}.h-2{height:.5rem}.h-2\.5{height:.625rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-7{height:1.75rem}.h-8{height:2rem}.h-9{height:2.25rem}.h-\[10px\]{height:10px}.h-\[1px\]{height:1px}.h-full{height:100%}.h-px{height:1px}.h-screen{height:100vh}.max-h-\[300px\]{max-height:300px}.max-h-\[var\(--radix-dropdown-menu-content-available-height\)\]{max-height:var(--radix-dropdown-menu-content-available-height)}.min-h-0{min-height:0}.min-h-\[24px\]{min-height:24px}.min-h-\[28px\]{min-height:28px}.w-12{width:3rem}.w-16{width:4rem}.w-2{width:.5rem}.w-2\.5{width:.625rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-4{width:1rem}.w-48{width:12rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-72{width:18rem}.w-8{width:2rem}.w-9{width:2.25rem}.w-\[10px\]{width:10px}.w-\[1px\]{width:1px}.w-\[280px\]{width:280px}.w-\[600px\]{width:600px}.w-full{width:100%}.w-px{width:1px}.min-w-0{min-width:0}.min-w-10{min-width:2.5rem}.min-w-8{min-width:2rem}.min-w-9{min-width:2.25rem}.min-w-\[10rem\]{min-width:10rem}.min-w-\[220px\]{min-width:220px}.min-w-\[240px\]{min-width:240px}.max-w-\[220px\]{max-width:220px}.max-w-\[260px\]{max-width:260px}.max-w-\[340px\]{max-width:340px}.max-w-\[60vw\]{max-width:60vw}.max-w-full{max-width:100%}.max-w-lg{max-width:32rem}.max-w-md{max-width:28rem}.flex-1{flex:1}.flex-shrink-0,.shrink-0{flex-shrink:0}.origin-\[--radix-dropdown-menu-content-transform-origin\]{transform-origin:var(--radix-dropdown-menu-content-transform-origin)}.origin-\[--radix-popover-content-transform-origin\]{transform-origin:var(--radix-popover-content-transform-origin)}.origin-\[--radix-tooltip-content-transform-origin\]{transform-origin:var(--radix-tooltip-content-transform-origin)}.translate-x-\[-50\%\]{--tw-translate-x:-50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y))rotate(var(--tw-rotate))skewX(var(--tw-skew-x))skewY(var(--tw-skew-y))scaleX(var(--tw-scale-x))scaleY(var(--tw-scale-y))}.translate-y-\[-50\%\]{--tw-translate-y:-50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y))rotate(var(--tw-rotate))skewX(var(--tw-skew-x))skewY(var(--tw-skew-y))scaleX(var(--tw-scale-x))scaleY(var(--tw-scale-y))}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y))rotate(var(--tw-rotate))skewX(var(--tw-skew-x))skewY(var(--tw-skew-y))scaleX(var(--tw-scale-x))scaleY(var(--tw-scale-y))}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:1s linear infinite spin}.cursor-default{cursor:default}.cursor-pointer{cursor:pointer}.touch-none{touch-action:none}.select-none{-webkit-user-select:none;user-select:none}.resize{resize:both}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.items-center{align-items:center}.justify-start{justify-content:flex-start}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-0\.5{gap:.125rem}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-4{gap:1rem}.space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.375rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem*var(--tw-space-y-reverse))}.space-y-px>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1px*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1px*var(--tw-space-y-reverse))}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.overflow-x-hidden{overflow-x:hidden}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.whitespace-nowrap{white-space:nowrap}.rounded{border-radius:.25rem}.rounded-\[3px\]{border-radius:3px}.rounded-\[inherit\]{border-radius:inherit}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:var(--radius)}.rounded-md{border-radius:calc(var(--radius) - 2px)}.rounded-sm{border-radius:calc(var(--radius) - 4px)}.border{border-width:1px}.border-2{border-width:2px}.border-b{border-bottom-width:1px}.border-l{border-left-width:1px}.border-t{border-top-width:1px}.border-border{border-color:hsl(var(--border))}.border-border\/50{border-color:hsl(var(--border)/.5)}.border-input{border-color:hsl(var(--input))}.border-primary{border-color:hsl(var(--primary))}.border-l-transparent{border-left-color:#0000}.border-t-transparent{border-top-color:#0000}.bg-background{background-color:hsl(var(--background))}.bg-black\/80{background-color:#000c}.bg-border{background-color:hsl(var(--border))}.bg-border\/80{background-color:hsl(var(--border)/.8)}.bg-card{background-color:hsl(var(--card))}.bg-card\/80{background-color:hsl(var(--card)/.8)}.bg-card\/85{background-color:hsl(var(--card)/.85)}.bg-destructive{background-color:hsl(var(--destructive))}.bg-muted{background-color:hsl(var(--muted))}.bg-muted-foreground\/25{background-color:hsl(var(--muted-foreground)/.25)}.bg-muted\/40{background-color:hsl(var(--muted)/.4)}.bg-muted\/50{background-color:hsl(var(--muted)/.5)}.bg-muted\/60{background-color:hsl(var(--muted)/.6)}.bg-popover{background-color:hsl(var(--popover))}.bg-primary{background-color:hsl(var(--primary))}.bg-secondary{background-color:hsl(var(--secondary))}.bg-secondary\/20{background-color:hsl(var(--secondary)/.2)}.bg-transparent{background-color:#0000}.fill-current{fill:currentColor}.object-cover{-o-object-fit:cover;object-fit:cover}.p-0{padding:0}.p-1{padding:.25rem}.p-1\.5{padding:.375rem}.p-4{padding:1rem}.p-6{padding:1.5rem}.p-\[2px\]{padding:2px}.px-1{padding-left:.25rem;padding-right:.25rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-8{padding-left:2rem;padding-right:2rem}.py-0{padding-top:0;padding-bottom:0}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.pl-6{padding-left:1.5rem}.pl-8{padding-left:2rem}.pr-1\.5{padding-right:.375rem}.pt-0{padding-top:0}.text-left{text-align:left}.text-center{text-align:center}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[12px\]{font-size:12px}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xs{font-size:.75rem;line-height:1rem}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal)var(--tw-slashed-zero)var(--tw-numeric-figure)var(--tw-numeric-spacing)var(--tw-numeric-fraction)}.leading-4{line-height:1rem}.leading-\[16px\]{line-height:16px}.leading-none{line-height:1}.leading-tight{line-height:1.25}.tracking-\[-0\.15px\]{letter-spacing:-.15px}.tracking-\[0\.06em\]{letter-spacing:.06em}.tracking-tight{letter-spacing:-.025em}.tracking-widest{letter-spacing:.1em}.text-destructive{color:hsl(var(--destructive))}.text-destructive-foreground{color:hsl(var(--destructive-foreground))}.text-foreground{color:hsl(var(--foreground))}.text-foreground\/70{color:hsl(var(--foreground)/.7)}.text-muted-foreground{color:hsl(var(--muted-foreground))}.text-muted-foreground\/20{color:hsl(var(--muted-foreground)/.2)}.text-muted-foreground\/50{color:hsl(var(--muted-foreground)/.5)}.text-muted-foreground\/60{color:hsl(var(--muted-foreground)/.6)}.text-muted-foreground\/70{color:hsl(var(--muted-foreground)/.7)}.text-popover-foreground{color:hsl(var(--popover-foreground))}.text-primary{color:hsl(var(--primary))}.text-primary-foreground{color:hsl(var(--primary-foreground))}.text-secondary-foreground{color:hsl(var(--secondary-foreground))}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.underline-offset-4{text-underline-offset:4px}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.opacity-70{opacity:.7}.shadow{--tw-shadow:0 1px 3px 0 #0000001a,0 1px 2px -1px #0000001a;--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a;--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px #0000001a,0 2px 4px -2px #0000001a;--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.outline-none{outline-offset:2px;outline:2px solid #0000}.outline{outline-style:solid}.ring-2{--tw-ring-offset-shadow:var(--tw-ring-inset)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.ring-inset{--tw-ring-inset:inset}.ring-primary{--tw-ring-color:hsl(var(--primary))}.ring-primary\/50{--tw-ring-color:hsl(var(--primary)/.5)}.ring-offset-background{--tw-ring-offset-color:hsl(var(--background))}.filter{filter:var(--tw-blur)var(--tw-brightness)var(--tw-contrast)var(--tw-grayscale)var(--tw-hue-rotate)var(--tw-invert)var(--tw-saturate)var(--tw-sepia)var(--tw-drop-shadow)}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-opacity{transition-property:opacity;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-shadow{transition-property:box-shadow;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.duration-150{transition-duration:.15s}.duration-200{transition-duration:.2s}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}@keyframes enter{0%{opacity:var(--tw-enter-opacity,1);transform:translate3d(var(--tw-enter-translate-x,0),var(--tw-enter-translate-y,0),0)scale3d(var(--tw-enter-scale,1),var(--tw-enter-scale,1),var(--tw-enter-scale,1))rotate(var(--tw-enter-rotate,0))}}@keyframes exit{to{opacity:var(--tw-exit-opacity,1);transform:translate3d(var(--tw-exit-translate-x,0),var(--tw-exit-translate-y,0),0)scale3d(var(--tw-exit-scale,1),var(--tw-exit-scale,1),var(--tw-exit-scale,1))rotate(var(--tw-exit-rotate,0))}}.animate-in{--tw-enter-opacity:initial;--tw-enter-scale:initial;--tw-enter-rotate:initial;--tw-enter-translate-x:initial;--tw-enter-translate-y:initial;animation-name:enter;animation-duration:.15s}.fade-in-0{--tw-enter-opacity:0}.zoom-in-95{--tw-enter-scale:.95}.duration-150{animation-duration:.15s}.duration-200{animation-duration:.2s}.ease-out{animation-timing-function:cubic-bezier(0,0,.2,1)}.running{animation-play-state:running}::-webkit-scrollbar{width:10px;height:10px}::-webkit-scrollbar-track{background:0 0}::-webkit-scrollbar-thumb{background:hsl(var(--muted-foreground)/.2);background-clip:padding-box;border:2px solid #0000;border-radius:3px}::-webkit-scrollbar-thumb:hover{background:hsl(var(--muted-foreground)/.35);background-clip:padding-box;border:2px solid #0000}*{scrollbar-width:thin;scrollbar-color:hsl(var(--muted-foreground)/.25)transparent}.hide-scrollbar::-webkit-scrollbar{display:none}.hide-scrollbar{-ms-overflow-style:none;scrollbar-width:none}.panel-scroll{scrollbar-gutter:stable}.hyperview-dockview{--dv-background-color:hsl(var(--background));--dv-group-view-background-color:hsl(var(--card));--dv-tabs-and-actions-container-background-color:hsl(var(--secondary));--dv-activegroup-visiblepanel-tab-background-color:hsl(var(--card));--dv-activegroup-hiddenpanel-tab-background-color:hsl(var(--secondary));--dv-inactivegroup-visiblepanel-tab-background-color:hsl(var(--secondary));--dv-inactivegroup-hiddenpanel-tab-background-color:hsl(var(--secondary));--dv-activegroup-visiblepanel-tab-color:hsl(var(--foreground));--dv-activegroup-hiddenpanel-tab-color:hsl(var(--muted-foreground));--dv-inactivegroup-visiblepanel-tab-color:hsl(var(--muted-foreground));--dv-inactivegroup-hiddenpanel-tab-color:hsl(var(--muted-foreground));--dv-tabs-and-actions-container-font-size:12px;--dv-tabs-and-actions-container-height:24px;--dv-tab-font-size:12px;--dv-tabs-container-scrollbar-color:hsl(var(--muted-foreground)/.25);--dv-scrollbar-background-color:hsl(var(--muted-foreground)/.25);--dv-tab-divider-color:hsl(var(--border));--dv-separator-border:transparent;--dv-paneview-header-border-color:hsl(var(--border));--dv-sash-color:hsl(var(--border));--dv-icon-hover-background-color:hsl(var(--accent));--dv-active-sash-color:hsl(var(--primary));--dv-drag-over-background-color:hsl(var(--primary)/.15);--dv-drag-over-border-color:hsl(var(--primary)/.6);--dv-tab-margin:0}.hyperview-dockview .dv-groupview{border:none}.hyperview-dockview .dv-tabs-and-actions-container{border-bottom:1px solid hsl(var(--border))}.hyperview-dockview .dv-tab{align-items:center;height:100%;padding:0 8px;line-height:16px;display:flex}.hyperview-dockview .dv-tab .dv-react-part{align-items:center;min-width:0;height:100%;display:flex}.hyperview-dockview .dv-scrollable .dv-scrollbar-horizontal{border-radius:3px;height:6px}.hyperview-dockview .dv-tabs-container{scrollbar-width:none}.hyperview-dockview .dv-tabs-container::-webkit-scrollbar{height:0}.hyperview-dockview .dv-scrollable .dv-scrollbar-horizontal{display:none}.hyperview-dockview .dv-split-view-container>.dv-sash-container>.dv-sash{background-color:#0000!important}.hyperview-dockview .dv-split-view-container.dv-horizontal>.dv-sash-container>.dv-sash:after{content:"";background-color:hsl(var(--border));pointer-events:none;width:1px;position:absolute;top:0;bottom:0;left:50%;transform:translate(-50%)}.hyperview-dockview .dv-split-view-container.dv-horizontal>.dv-sash-container>.dv-sash.dv-enabled:hover:after{background-color:hsl(var(--primary))}.hyperview-dockview .dv-split-view-container.dv-vertical>.dv-sash-container>.dv-sash:after{content:"";background-color:hsl(var(--border));pointer-events:none;height:1px;position:absolute;top:50%;left:0;right:0;transform:translateY(-50%)}.hyperview-dockview .dv-split-view-container.dv-vertical>.dv-sash-container>.dv-sash.dv-enabled:hover:after{background-color:hsl(var(--primary))}.placeholder\:text-muted-foreground::placeholder{color:hsl(var(--muted-foreground))}.placeholder\:text-muted-foreground\/50::placeholder{color:hsl(var(--muted-foreground)/.5)}.hover\:bg-accent:hover{background-color:hsl(var(--accent))}.hover\:bg-destructive\/90:hover{background-color:hsl(var(--destructive)/.9)}.hover\:bg-muted:hover{background-color:hsl(var(--muted))}.hover\:bg-muted-foreground\/40:hover{background-color:hsl(var(--muted-foreground)/.4)}.hover\:bg-muted\/40:hover{background-color:hsl(var(--muted)/.4)}.hover\:bg-muted\/50:hover{background-color:hsl(var(--muted)/.5)}.hover\:bg-muted\/60:hover{background-color:hsl(var(--muted)/.6)}.hover\:bg-primary\/90:hover{background-color:hsl(var(--primary)/.9)}.hover\:bg-secondary\/80:hover{background-color:hsl(var(--secondary)/.8)}.hover\:text-accent-foreground:hover{color:hsl(var(--accent-foreground))}.hover\:text-foreground:hover{color:hsl(var(--foreground))}.hover\:text-muted-foreground:hover{color:hsl(var(--muted-foreground))}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-100:hover{opacity:1}.focus\:border-ring:focus{border-color:hsl(var(--ring))}.focus\:bg-accent\/70:focus{background-color:hsl(var(--accent)/.7)}.focus\:text-accent-foreground:focus{color:hsl(var(--accent-foreground))}.focus\:outline-none:focus{outline-offset:2px;outline:2px solid #0000}.focus\:ring-1:focus{--tw-ring-offset-shadow:var(--tw-ring-inset)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus\:ring-2:focus{--tw-ring-offset-shadow:var(--tw-ring-inset)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus\:ring-ring:focus{--tw-ring-color:hsl(var(--ring))}.focus\:ring-offset-2:focus{--tw-ring-offset-width:2px}.focus-visible\:outline-none:focus-visible{outline-offset:2px;outline:2px solid #0000}.focus-visible\:ring-1:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus-visible\:ring-ring:focus-visible{--tw-ring-color:hsl(var(--ring))}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}.data-\[disabled\=true\]\:pointer-events-none[data-disabled=true],.data-\[disabled\]\:pointer-events-none[data-disabled]{pointer-events:none}.data-\[state\=on\]\:border-primary[data-state=on]{border-color:hsl(var(--primary))}.data-\[selected\=true\]\:bg-accent[data-selected=true]{background-color:hsl(var(--accent))}.data-\[state\=on\]\:bg-primary[data-state=on]{background-color:hsl(var(--primary))}.data-\[state\=open\]\:bg-accent[data-state=open]{background-color:hsl(var(--accent))}.data-\[state\=open\]\:bg-accent\/70[data-state=open]{background-color:hsl(var(--accent)/.7)}.data-\[selected\=true\]\:text-accent-foreground[data-selected=true]{color:hsl(var(--accent-foreground))}.data-\[state\=on\]\:text-primary-foreground[data-state=on]{color:hsl(var(--primary-foreground))}.data-\[state\=open\]\:text-accent-foreground[data-state=open]{color:hsl(var(--accent-foreground))}.data-\[state\=open\]\:text-muted-foreground[data-state=open]{color:hsl(var(--muted-foreground))}.data-\[disabled\=true\]\:opacity-50[data-disabled=true],.data-\[disabled\]\:opacity-50[data-disabled]{opacity:.5}.data-\[state\=open\]\:animate-in[data-state=open]{--tw-enter-opacity:initial;--tw-enter-scale:initial;--tw-enter-rotate:initial;--tw-enter-translate-x:initial;--tw-enter-translate-y:initial;animation-name:enter;animation-duration:.15s}.data-\[state\=closed\]\:animate-out[data-state=closed]{--tw-exit-opacity:initial;--tw-exit-scale:initial;--tw-exit-rotate:initial;--tw-exit-translate-x:initial;--tw-exit-translate-y:initial;animation-name:exit;animation-duration:.15s}.data-\[state\=closed\]\:fade-out-0[data-state=closed]{--tw-exit-opacity:0}.data-\[state\=open\]\:fade-in-0[data-state=open]{--tw-enter-opacity:0}.data-\[state\=closed\]\:zoom-out-95[data-state=closed]{--tw-exit-scale:.95}.data-\[state\=open\]\:zoom-in-95[data-state=open]{--tw-enter-scale:.95}.data-\[side\=bottom\]\:slide-in-from-top-2[data-side=bottom]{--tw-enter-translate-y:-.5rem}.data-\[side\=left\]\:slide-in-from-right-2[data-side=left]{--tw-enter-translate-x:.5rem}.data-\[side\=right\]\:slide-in-from-left-2[data-side=right]{--tw-enter-translate-x:-.5rem}.data-\[side\=top\]\:slide-in-from-bottom-2[data-side=top]{--tw-enter-translate-y:.5rem}.data-\[state\=closed\]\:slide-out-to-left-1\/2[data-state=closed]{--tw-exit-translate-x:-50%}.data-\[state\=closed\]\:slide-out-to-top-\[48\%\][data-state=closed]{--tw-exit-translate-y:-48%}.data-\[state\=open\]\:slide-in-from-left-1\/2[data-state=open]{--tw-enter-translate-x:-50%}.data-\[state\=open\]\:slide-in-from-top-\[48\%\][data-state=open]{--tw-enter-translate-y:-48%}@media (min-width:640px){.sm\:flex-row{flex-direction:row}.sm\:justify-end{justify-content:flex-end}.sm\:space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.5rem*var(--tw-space-x-reverse));margin-left:calc(.5rem*calc(1 - var(--tw-space-x-reverse)))}.sm\:rounded-lg{border-radius:var(--radius)}.sm\:text-left{text-align:left}}.\[\&\>svg\]\:size-3\.5>svg{width:.875rem;height:.875rem}.\[\&\>svg\]\:shrink-0>svg{flex-shrink:0}.\[\&_\[cmdk-group-heading\]\]\:px-2 [cmdk-group-heading]{padding-left:.5rem;padding-right:.5rem}.\[\&_\[cmdk-group-heading\]\]\:py-1\.5 [cmdk-group-heading]{padding-top:.375rem;padding-bottom:.375rem}.\[\&_\[cmdk-group-heading\]\]\:text-xs [cmdk-group-heading]{font-size:.75rem;line-height:1rem}.\[\&_\[cmdk-group-heading\]\]\:font-medium [cmdk-group-heading]{font-weight:500}.\[\&_\[cmdk-group-heading\]\]\:text-muted-foreground [cmdk-group-heading]{color:hsl(var(--muted-foreground))}.\[\&_\[cmdk-group\]\:not\(\[hidden\]\)_\~\[cmdk-group\]\]\:pt-0 [cmdk-group]:not([hidden])~[cmdk-group]{padding-top:0}.\[\&_\[cmdk-group\]\]\:px-2 [cmdk-group]{padding-left:.5rem;padding-right:.5rem}.\[\&_\[cmdk-input-wrapper\]_svg\]\:h-5 [cmdk-input-wrapper] svg{height:1.25rem}.\[\&_\[cmdk-input-wrapper\]_svg\]\:w-5 [cmdk-input-wrapper] svg{width:1.25rem}.\[\&_\[cmdk-input\]\]\:h-12 [cmdk-input]{height:3rem}.\[\&_\[cmdk-item\]\]\:px-2 [cmdk-item]{padding-left:.5rem;padding-right:.5rem}.\[\&_\[cmdk-item\]\]\:py-3 [cmdk-item]{padding-top:.75rem;padding-bottom:.75rem}.\[\&_\[cmdk-item\]_svg\]\:h-5 [cmdk-item] svg{height:1.25rem}.\[\&_\[cmdk-item\]_svg\]\:w-5 [cmdk-item] svg{width:1.25rem}.\[\&_svg\]\:pointer-events-none svg{pointer-events:none}.\[\&_svg\]\:size-3\.5 svg{width:.875rem;height:.875rem}.\[\&_svg\]\:size-4 svg{width:1rem;height:1rem}.\[\&_svg\]\:shrink-0 svg{flex-shrink:0} diff --git a/vendor/hyperview/server/static/_next/static/chunks/567993cf36cd4ab1.js b/vendor/hyperview/server/static/_next/static/chunks/567993cf36cd4ab1.js new file mode 100644 index 0000000000000000000000000000000000000000..277d1524c23b690ffbbf45519315240724cebc83 --- /dev/null +++ b/vendor/hyperview/server/static/_next/static/chunks/567993cf36cd4ab1.js @@ -0,0 +1,5 @@ +(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,84524,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"InvariantError",{enumerable:!0,get:function(){return n}});class n extends Error{constructor(e,t){super(`Invariant: ${e.endsWith(".")?e:e+"."} This is a bug in Next.js.`,t),this.name="InvariantError"}}},35856,(e,t,r)=>{"use strict";r._=function(e){return e&&e.__esModule?e:{default:e}}},19551,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={BailoutToCSRError:function(){return o},isBailoutToCSRError:function(){return l}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let u="BAILOUT_TO_CLIENT_SIDE_RENDERING";class o extends Error{constructor(e){super(`Bail out to client-side rendering: ${e}`),this.reason=e,this.digest=u}}function l(e){return"object"==typeof e&&null!==e&&"digest"in e&&e.digest===u}},64918,(e,t,r)=>{"use strict";var n=e.r(69941),a={stream:!0},u=Object.prototype.hasOwnProperty;function o(t){var r=e.r(t);return"function"!=typeof r.then||"fulfilled"===r.status?null:(r.then(function(e){r.status="fulfilled",r.value=e},function(e){r.status="rejected",r.reason=e}),r)}var l=new WeakSet,i=new WeakSet;function s(){}function c(t){for(var r=t[1],n=[],a=0;af||35===f||114===f||120===f?(p=f,f=3,s++):(p=0,f=3);continue;case 2:44===(_=i[s++])?f=4:h=h<<4|(96<_?_-87:_-48);continue;case 3:_=i.indexOf(10,s);break;case 4:(_=s+h)>i.length&&(_=-1)}var v=i.byteOffset+s;if(-1<_)h=new Uint8Array(i.buffer,v,_-s),98===p?J(e,l,_===g?h:h.slice()):function(e,t,r,n,u,o){switch(n){case 65:J(e,r,ea(u,o).buffer);return;case 79:eu(e,r,u,o,Int8Array,1);return;case 111:J(e,r,0===u.length?o:ea(u,o));return;case 85:eu(e,r,u,o,Uint8ClampedArray,1);return;case 83:eu(e,r,u,o,Int16Array,2);return;case 115:eu(e,r,u,o,Uint16Array,2);return;case 76:eu(e,r,u,o,Int32Array,4);return;case 108:eu(e,r,u,o,Uint32Array,4);return;case 71:eu(e,r,u,o,Float32Array,4);return;case 103:eu(e,r,u,o,Float64Array,8);return;case 77:eu(e,r,u,o,BigInt64Array,8);return;case 109:eu(e,r,u,o,BigUint64Array,8);return;case 86:eu(e,r,u,o,DataView,1);return}t=e._stringDecoder;for(var l="",i=0;i{"use strict";t.exports=e.r(64918)},30545,(e,t,r)=>{"use strict";t.exports=e.r(14992)},88112,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={HTTPAccessErrorStatus:function(){return u},HTTP_ERROR_FALLBACK_ERROR_CODE:function(){return l},getAccessFallbackErrorTypeByStatus:function(){return c},getAccessFallbackHTTPStatus:function(){return s},isHTTPAccessFallbackError:function(){return i}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let u={NOT_FOUND:404,FORBIDDEN:403,UNAUTHORIZED:401},o=new Set(Object.values(u)),l="NEXT_HTTP_ERROR_FALLBACK";function i(e){if("object"!=typeof e||null===e||!("digest"in e)||"string"!=typeof e.digest)return!1;let[t,r]=e.digest.split(";");return t===l&&o.has(Number(r))}function s(e){return Number(e.digest.split(";")[1])}function c(e){switch(e){case 401:return"unauthorized";case 403:return"forbidden";case 404:return"not-found";default:return}}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},91945,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"RedirectStatusCode",{enumerable:!0,get:function(){return a}});var n,a=((n={})[n.SeeOther=303]="SeeOther",n[n.TemporaryRedirect=307]="TemporaryRedirect",n[n.PermanentRedirect=308]="PermanentRedirect",n);("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},84628,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n,a={REDIRECT_ERROR_CODE:function(){return l},RedirectType:function(){return i},isRedirectError:function(){return s}};for(var u in a)Object.defineProperty(r,u,{enumerable:!0,get:a[u]});let o=e.r(91945),l="NEXT_REDIRECT";var i=((n={}).push="push",n.replace="replace",n);function s(e){if("object"!=typeof e||null===e||!("digest"in e)||"string"!=typeof e.digest)return!1;let t=e.digest.split(";"),[r,n]=t,a=t.slice(2,-2).join(";"),u=Number(t.at(-2));return r===l&&("replace"===n||"push"===n)&&"string"==typeof a&&!isNaN(u)&&u in o.RedirectStatusCode}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},31028,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"isNextRouterError",{enumerable:!0,get:function(){return u}});let n=e.r(88112),a=e.r(84628);function u(e){return(0,a.isRedirectError)(e)||(0,n.isHTTPAccessFallbackError)(e)}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},13058,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"ReadonlyURLSearchParams",{enumerable:!0,get:function(){return a}});class n extends Error{constructor(){super("Method unavailable on `ReadonlyURLSearchParams`. Read more: https://nextjs.org/docs/app/api-reference/functions/use-search-params#updating-searchparams")}}class a extends URLSearchParams{append(){throw new n}delete(){throw new n}set(){throw new n}sort(){throw new n}}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},69370,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={NavigationPromisesContext:function(){return c},PathParamsContext:function(){return s},PathnameContext:function(){return i},ReadonlyURLSearchParams:function(){return o.ReadonlyURLSearchParams},SearchParamsContext:function(){return l},createDevToolsInstrumentedPromise:function(){return f}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let u=e.r(30668),o=e.r(13058),l=(0,u.createContext)(null),i=(0,u.createContext)(null),s=(0,u.createContext)(null),c=(0,u.createContext)(null);function f(e,t){let r=Promise.resolve(t);return r.status="fulfilled",r.value=t,r.displayName=`${e} (SSR)`,r}},29037,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"workUnitAsyncStorageInstance",{enumerable:!0,get:function(){return n}});let n=(0,e.r(24171).createAsyncLocalStorage)()},2089,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={ACTION_HEADER:function(){return o},FLIGHT_HEADERS:function(){return h},NEXT_ACTION_NOT_FOUND_HEADER:function(){return R},NEXT_ACTION_REVALIDATED_HEADER:function(){return S},NEXT_DID_POSTPONE_HEADER:function(){return _},NEXT_HMR_REFRESH_HASH_COOKIE:function(){return f},NEXT_HMR_REFRESH_HEADER:function(){return c},NEXT_HTML_REQUEST_ID_HEADER:function(){return P},NEXT_IS_PRERENDER_HEADER:function(){return m},NEXT_REQUEST_ID_HEADER:function(){return E},NEXT_REWRITTEN_PATH_HEADER:function(){return v},NEXT_REWRITTEN_QUERY_HEADER:function(){return b},NEXT_ROUTER_PREFETCH_HEADER:function(){return i},NEXT_ROUTER_SEGMENT_PREFETCH_HEADER:function(){return s},NEXT_ROUTER_STALE_TIME_HEADER:function(){return g},NEXT_ROUTER_STATE_TREE_HEADER:function(){return l},NEXT_RSC_UNION_QUERY:function(){return y},NEXT_URL:function(){return d},RSC_CONTENT_TYPE_HEADER:function(){return p},RSC_HEADER:function(){return u}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let u="rsc",o="next-action",l="next-router-state-tree",i="next-router-prefetch",s="next-router-segment-prefetch",c="next-hmr-refresh",f="__next_hmr_refresh_hash__",d="next-url",p="text/x-component",h=[u,l,i,c,s],y="_rsc",g="x-nextjs-stale-time",_="x-nextjs-postponed",v="x-nextjs-rewritten-path",b="x-nextjs-rewritten-query",m="x-nextjs-prerender",R="x-nextjs-action-not-found",E="x-nextjs-request-id",P="x-nextjs-html-request-id",S="x-action-revalidated";("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},63416,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={getCacheSignal:function(){return g},getDraftModeProviderForCacheScope:function(){return y},getHmrRefreshHash:function(){return d},getPrerenderResumeDataCache:function(){return c},getRenderResumeDataCache:function(){return f},getRuntimeStagePromise:function(){return _},getServerComponentsHmrCache:function(){return h},isHmrRefresh:function(){return p},throwForMissingRequestStore:function(){return i},throwInvariantForMissingStore:function(){return s},workUnitAsyncStorage:function(){return u.workUnitAsyncStorageInstance}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let u=e.r(29037),o=e.r(2089),l=e.r(84524);function i(e){throw Object.defineProperty(Error(`\`${e}\` was called outside a request scope. Read more: https://nextjs.org/docs/messages/next-dynamic-api-wrong-context`),"__NEXT_ERROR_CODE",{value:"E251",enumerable:!1,configurable:!0})}function s(){throw Object.defineProperty(new l.InvariantError("Expected workUnitAsyncStorage to have a store."),"__NEXT_ERROR_CODE",{value:"E696",enumerable:!1,configurable:!0})}function c(e){switch(e.type){case"prerender":case"prerender-runtime":case"prerender-ppr":case"prerender-client":return e.prerenderResumeDataCache;case"request":if(e.prerenderResumeDataCache)return e.prerenderResumeDataCache;case"prerender-legacy":case"cache":case"private-cache":case"unstable-cache":return null;default:return e}}function f(e){switch(e.type){case"request":case"prerender":case"prerender-runtime":case"prerender-client":if(e.renderResumeDataCache)return e.renderResumeDataCache;case"prerender-ppr":return e.prerenderResumeDataCache??null;case"cache":case"private-cache":case"unstable-cache":case"prerender-legacy":return null;default:return e}}function d(e,t){if(e.dev)switch(t.type){case"cache":case"private-cache":case"prerender":case"prerender-runtime":return t.hmrRefreshHash;case"request":var r;return null==(r=t.cookies.get(o.NEXT_HMR_REFRESH_HASH_COOKIE))?void 0:r.value}}function p(e,t){if(e.dev)switch(t.type){case"cache":case"private-cache":case"request":return t.isHmrRefresh??!1}return!1}function h(e,t){if(e.dev)switch(t.type){case"cache":case"private-cache":case"request":return t.serverComponentsHmrCache}}function y(e,t){if(e.isDraftMode)switch(t.type){case"cache":case"private-cache":case"unstable-cache":case"prerender-runtime":case"request":return t.draftMode}}function g(e){switch(e.type){case"prerender":case"prerender-client":case"prerender-runtime":return e.cacheSignal;case"request":if(e.cacheSignal)return e.cacheSignal;case"prerender-ppr":case"prerender-legacy":case"cache":case"private-cache":case"unstable-cache":return null;default:return e}}function _(e){switch(e.type){case"prerender-runtime":case"private-cache":return e.runtimeStagePromise;case"prerender":case"prerender-client":case"prerender-ppr":case"prerender-legacy":case"request":case"cache":case"unstable-cache":return null;default:return e}}},83441,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"useUntrackedPathname",{enumerable:!0,get:function(){return u}});let n=e.r(30668),a=e.r(69370);function u(){return!function(){if("u"0}}return!1}()?(0,n.useContext)(a.PathnameContext):null}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},80118,(e,t,r)=>{"use strict";function n(e,t=!0){return e.pathname+e.search+(t?e.hash:"")}Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"createHrefFromUrl",{enumerable:!0,get:function(){return n}}),("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},61524,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={handleHardNavError:function(){return o},useNavFailureHandler:function(){return l}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});e.r(30668);let u=e.r(80118);function o(e){return!!(e&&"u">typeof window)&&!!window.next.__pendingUrl&&(0,u.createHrefFromUrl)(new URL(window.location.href))!==(0,u.createHrefFromUrl)(window.next.__pendingUrl)&&(console.error("Error occurred during navigation, falling back to hard navigation",e),window.location.href=window.next.__pendingUrl.toString(),!0)}function l(){}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},26470,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"HTML_LIMITED_BOT_UA_RE",{enumerable:!0,get:function(){return n}});let n=/[\w-]+-Google|Google-[\w-]+|Chrome-Lighthouse|Slurp|DuckDuckBot|baiduspider|yandex|sogou|bitlybot|tumblr|vkShare|quora link preview|redditbot|ia_archiver|Bingbot|BingPreview|applebot|facebookexternalhit|facebookcatalog|Twitterbot|LinkedInBot|Slackbot|Discordbot|WhatsApp|SkypeUriPreview|Yeti|googleweblight/i},62112,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={HTML_LIMITED_BOT_UA_RE:function(){return u.HTML_LIMITED_BOT_UA_RE},HTML_LIMITED_BOT_UA_RE_STRING:function(){return l},getBotType:function(){return c},isBot:function(){return s}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let u=e.r(26470),o=/Googlebot(?!-)|Googlebot$/i,l=u.HTML_LIMITED_BOT_UA_RE.source;function i(e){return u.HTML_LIMITED_BOT_UA_RE.test(e)}function s(e){return o.test(e)||i(e)}function c(e){return o.test(e)?"dom":i(e)?"html":void 0}},71202,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={ErrorBoundary:function(){return h},ErrorBoundaryHandler:function(){return p}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let u=e.r(35856),o=e.r(48277),l=u._(e.r(30668)),i=e.r(83441),s=e.r(31028);e.r(61524);let c=e.r(86846),f=e.r(62112),d="u">typeof window&&(0,f.isBot)(window.navigator.userAgent);class p extends l.default.Component{constructor(e){super(e),this.reset=()=>{this.setState({error:null})},this.state={error:null,previousPathname:this.props.pathname}}static getDerivedStateFromError(e){if((0,s.isNextRouterError)(e))throw e;return{error:e}}static getDerivedStateFromProps(e,t){let{error:r}=t;return e.pathname!==t.previousPathname&&t.error?{error:null,previousPathname:e.pathname}:{error:t.error,previousPathname:e.pathname}}render(){return this.state.error&&!d?(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(c.HandleISRError,{error:this.state.error}),this.props.errorStyles,this.props.errorScripts,(0,o.jsx)(this.props.errorComponent,{error:this.state.error,reset:this.reset})]}):this.props.children}}function h({errorComponent:e,errorStyles:t,errorScripts:r,children:n}){let a=(0,i.useUntrackedPathname)();return e?(0,o.jsx)(p,{pathname:a,errorComponent:e,errorStyles:t,errorScripts:r,children:n}):(0,o.jsx)(o.Fragment,{children:n})}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},98165,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n,a={ACTION_HMR_REFRESH:function(){return c},ACTION_NAVIGATE:function(){return l},ACTION_REFRESH:function(){return o},ACTION_RESTORE:function(){return i},ACTION_SERVER_ACTION:function(){return f},ACTION_SERVER_PATCH:function(){return s},PrefetchKind:function(){return d}};for(var u in a)Object.defineProperty(r,u,{enumerable:!0,get:a[u]});let o="refresh",l="navigate",i="restore",s="server-patch",c="hmr-refresh",f="server-action";var d=((n={}).AUTO="auto",n.FULL="full",n);("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},61909,(e,t,r)=>{"use strict";function n(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(n=function(e){return e?r:t})(e)}r._=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var r=n(t);if(r&&r.has(e))return r.get(e);var a={__proto__:null},u=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e)if("default"!==o&&Object.prototype.hasOwnProperty.call(e,o)){var l=u?Object.getOwnPropertyDescriptor(e,o):null;l&&(l.get||l.set)?Object.defineProperty(a,o,l):a[o]=e[o]}return a.default=e,r&&r.set(e,a),a}},65035,(e,t,r)=>{"use strict";function n(e){return null!==e&&"object"==typeof e&&"then"in e&&"function"==typeof e.then}Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"isThenable",{enumerable:!0,get:function(){return n}})},53128,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={dispatchAppRouterAction:function(){return i},useActionQueue:function(){return s}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let u=e.r(61909)._(e.r(30668)),o=e.r(65035),l=null;function i(e){if(null===l)throw Object.defineProperty(Error("Internal Next.js error: Router action dispatched before initialization."),"__NEXT_ERROR_CODE",{value:"E668",enumerable:!1,configurable:!0});l(e)}function s(e){let[t,r]=u.default.useState(e.state);l=t=>e.dispatch(t,r);let n=(0,u.useMemo)(()=>t,[t]);return(0,o.isThenable)(n)?(0,u.use)(n):n}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},59295,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"callServer",{enumerable:!0,get:function(){return o}});let n=e.r(30668),a=e.r(98165),u=e.r(53128);async function o(e,t){return new Promise((r,o)=>{(0,n.startTransition)(()=>{(0,u.dispatchAppRouterAction)({type:a.ACTION_SERVER_ACTION,actionId:e,actionArgs:t,resolve:r,reject:o})})})}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},85045,(e,t,r)=>{"use strict";let n;Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"findSourceMapURL",{enumerable:!0,get:function(){return n}});("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},96670,(e,t,r)=>{"use strict";function n(e){return e.startsWith("/")?e:`/${e}`}Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"ensureLeadingSlash",{enumerable:!0,get:function(){return n}})},91395,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={DEFAULT_SEGMENT_KEY:function(){return f},NOT_FOUND_SEGMENT_KEY:function(){return d},PAGE_SEGMENT_KEY:function(){return c},addSearchParamsIfPageSegment:function(){return i},computeSelectedLayoutSegment:function(){return s},getSegmentValue:function(){return u},getSelectedLayoutSegmentPath:function(){return function e(t,r,n=!0,a=[]){let o;if(n)o=t[1][r];else{let e=t[1];o=e.children??Object.values(e)[0]}if(!o)return a;let l=u(o[0]);return!l||l.startsWith(c)?a:(a.push(l),e(o,r,!1,a))}},isGroupSegment:function(){return o},isParallelRouteSegment:function(){return l}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});function u(e){return Array.isArray(e)?e[1]:e}function o(e){return"("===e[0]&&e.endsWith(")")}function l(e){return e.startsWith("@")&&"@children"!==e}function i(e,t){if(e.includes(c)){let e=JSON.stringify(t);return"{}"!==e?c+"?"+e:c}return e}function s(e,t){if(!e||0===e.length)return null;let r="children"===t?e[0]:e[e.length-1];return r===f?null:r}let c="__PAGE__",f="__DEFAULT__",d="/_not-found"},86511,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={normalizeAppPath:function(){return l},normalizeRscURL:function(){return i}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let u=e.r(96670),o=e.r(91395);function l(e){return(0,u.ensureLeadingSlash)(e.split("/").reduce((e,t,r,n)=>!t||(0,o.isGroupSegment)(t)||"@"===t[0]||("page"===t||"route"===t)&&r===n.length-1?e:`${e}/${t}`,""))}function i(e){return e.replace(/\.rsc($|\?)/,"$1")}},50864,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={INTERCEPTION_ROUTE_MARKERS:function(){return o},extractInterceptionRouteInformation:function(){return i},isInterceptionRouteAppPath:function(){return l}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let u=e.r(86511),o=["(..)(..)","(.)","(..)","(...)"];function l(e){return void 0!==e.split("/").find(e=>o.find(t=>e.startsWith(t)))}function i(e){let t,r,n;for(let a of e.split("/"))if(r=o.find(e=>a.startsWith(e))){[t,n]=e.split(r,2);break}if(!t||!r||!n)throw Object.defineProperty(Error(`Invalid interception route: ${e}. Must be in the format //(..|...|..)(..)/`),"__NEXT_ERROR_CODE",{value:"E269",enumerable:!1,configurable:!0});switch(t=(0,u.normalizeAppPath)(t),r){case"(.)":n="/"===t?`/${n}`:t+"/"+n;break;case"(..)":if("/"===t)throw Object.defineProperty(Error(`Invalid interception route: ${e}. Cannot use (..) marker at the root level, use (.) instead.`),"__NEXT_ERROR_CODE",{value:"E207",enumerable:!1,configurable:!0});n=t.split("/").slice(0,-1).concat(n).join("/");break;case"(...)":n="/"+n;break;case"(..)(..)":let a=t.split("/");if(a.length<=2)throw Object.defineProperty(Error(`Invalid interception route: ${e}. Cannot use (..)(..) marker at the root level or one level up.`),"__NEXT_ERROR_CODE",{value:"E486",enumerable:!1,configurable:!0});n=a.slice(0,-2).concat(n).join("/");break;default:throw Object.defineProperty(Error("Invariant: unexpected marker"),"__NEXT_ERROR_CODE",{value:"E112",enumerable:!1,configurable:!0})}return{interceptingRoute:t,interceptedRoute:n}}},22039,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"matchSegment",{enumerable:!0,get:function(){return n}});let n=(e,t)=>"string"==typeof e?"string"==typeof t&&e===t:"string"!=typeof t&&e[0]===t[0]&&e[1]===t[1];("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},5725,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={computeChangedPath:function(){return f},extractPathFromFlightRouterState:function(){return c},getSelectedParams:function(){return function e(t,r={}){for(let n of Object.values(t[1])){let t=n[0],a=Array.isArray(t),u=a?t[1]:t;!u||u.startsWith(o.PAGE_SEGMENT_KEY)||(a&&("c"===t[2]||"oc"===t[2])?r[t[0]]=t[1].split("/"):a&&(r[t[0]]=t[1]),r=e(n,r))}return r}}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let u=e.r(50864),o=e.r(91395),l=e.r(22039),i=e=>"string"==typeof e?"children"===e?"":e:e[1];function s(e){return e.reduce((e,t)=>{let r;return""===(t="/"===(r=t)[0]?r.slice(1):r)||(0,o.isGroupSegment)(t)?e:`${e}/${t}`},"")||"/"}function c(e){let t=Array.isArray(e[0])?e[0][1]:e[0];if(t===o.DEFAULT_SEGMENT_KEY||u.INTERCEPTION_ROUTE_MARKERS.some(e=>t.startsWith(e)))return;if(t.startsWith(o.PAGE_SEGMENT_KEY))return"";let r=[i(t)],n=e[1]??{},a=n.children?c(n.children):void 0;if(void 0!==a)r.push(a);else for(let[e,t]of Object.entries(n)){if("children"===e)continue;let n=c(t);void 0!==n&&r.push(n)}return s(r)}function f(e,t){let r=function e(t,r){let[n,a]=t,[o,s]=r,f=i(n),d=i(o);if(u.INTERCEPTION_ROUTE_MARKERS.some(e=>f.startsWith(e)||d.startsWith(e)))return"";if(!(0,l.matchSegment)(n,o))return c(r)??"";for(let t in a)if(s[t]){let r=e(a[t],s[t]);if(null!==r)return`${i(o)}/${r}`}return null}(e,t);return null==r||"/"===r?r:s(r.split("/"))}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},40494,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"handleMutable",{enumerable:!0,get:function(){return u}});let n=e.r(5725);function a(e){return void 0!==e}function u(e,t){let r=t.shouldScroll??!0,u=e.previousNextUrl,o=e.nextUrl;if(a(t.patchedTree)){let r=(0,n.computeChangedPath)(e.tree,t.patchedTree);r?(u=o,o=r):o||(o=e.canonicalUrl)}return{canonicalUrl:t.canonicalUrl??e.canonicalUrl,renderedSearch:t.renderedSearch??e.renderedSearch,pushRef:{pendingPush:a(t.pendingPush)?t.pendingPush:e.pushRef.pendingPush,mpaNavigation:a(t.mpaNavigation)?t.mpaNavigation:e.pushRef.mpaNavigation,preserveCustomHistoryState:a(t.preserveCustomHistoryState)?t.preserveCustomHistoryState:e.pushRef.preserveCustomHistoryState},focusAndScrollRef:{apply:!!r&&(!!a(t?.scrollableSegments)||e.focusAndScrollRef.apply),onlyHashChange:t.onlyHashChange||!1,hashFragment:r?t.hashFragment&&""!==t.hashFragment?decodeURIComponent(t.hashFragment.slice(1)):e.focusAndScrollRef.hashFragment:null,segmentPaths:r?t?.scrollableSegments??e.focusAndScrollRef.segmentPaths:[]},cache:t.cache?t.cache:e.cache,tree:a(t.patchedTree)?t.patchedTree:e.tree,nextUrl:o,previousNextUrl:u,debugInfo:t.collectedDebugInfo??null}}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},69434,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={HEAD_REQUEST_KEY:function(){return l},ROOT_SEGMENT_REQUEST_KEY:function(){return o},appendSegmentRequestKeyPart:function(){return s},convertSegmentPathToStaticExportFilename:function(){return d},createSegmentRequestKeyPart:function(){return i}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let u=e.r(91395),o="",l="/_head";function i(e){if("string"==typeof e)return e.startsWith(u.PAGE_SEGMENT_KEY)?u.PAGE_SEGMENT_KEY:"/_not-found"===e?"_not-found":f(e);let t=e[0];return"$"+e[2]+"$"+f(t)}function s(e,t,r){return e+"/"+("children"===t?r:`@${f(t)}/${r}`)}let c=/^[a-zA-Z0-9\-_@]+$/;function f(e){return c.test(e)?e:"!"+btoa(e).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}function d(e){return`__next${e.replace(/\//g,".")}.txt`}},88617,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={doesStaticSegmentAppearInURL:function(){return f},getCacheKeyForDynamicParam:function(){return d},getParamValueFromCacheKey:function(){return h},getRenderedPathname:function(){return s},getRenderedSearch:function(){return i},parseDynamicParamFromURLPart:function(){return c},urlSearchParamsToParsedUrlQuery:function(){return y},urlToUrlWithoutFlightMarker:function(){return p}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let u=e.r(91395),o=e.r(69434),l=e.r(2089);function i(e){let t=e.headers.get(l.NEXT_REWRITTEN_QUERY_HEADER);return null!==t?""===t?"":"?"+t:p(new URL(e.url)).search}function s(e){return e.headers.get(l.NEXT_REWRITTEN_PATH_HEADER)??p(new URL(e.url)).pathname}function c(e,t,r){switch(e){case"c":return rencodeURIComponent(e)):[];case"ci(..)(..)":case"ci(.)":case"ci(..)":case"ci(...)":{let n=e.length-2;return r0===t?encodeURIComponent(e.slice(n)):encodeURIComponent(e)):[]}case"oc":return rencodeURIComponent(e)):null;case"d":if(r>=t.length)return"";return encodeURIComponent(t[r]);case"di(..)(..)":case"di(.)":case"di(..)":case"di(...)":{let n=e.length-2;if(r>=t.length)return"";return encodeURIComponent(t[r].slice(n))}default:return""}}function f(e){return!(e===o.ROOT_SEGMENT_REQUEST_KEY||e.startsWith(u.PAGE_SEGMENT_KEY)||"("===e[0]&&e.endsWith(")"))&&e!==u.DEFAULT_SEGMENT_KEY&&"/_not-found"!==e}function d(e,t){return"string"==typeof e?(0,u.addSearchParamsIfPageSegment)(e,Object.fromEntries(new URLSearchParams(t))):null===e?"":e.join("/")}function p(e){let t=new URL(e);if(t.searchParams.delete(l.NEXT_RSC_UNION_QUERY),t.pathname.endsWith(".txt")){let{pathname:e}=t,r=e.endsWith("/index.txt")?10:4;t.pathname=e.slice(0,-r)}return t}function h(e,t){return"c"===t||"oc"===t?e.split("/"):e}function y(e){let t={};for(let[r,n]of e.entries())void 0===t[r]?t[r]=n:Array.isArray(t[r])?t[r].push(n):t[r]=[t[r],n];return t}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},94955,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={createInitialRSCPayloadFromFallbackPrerender:function(){return s},getFlightDataPartsFromPath:function(){return i},getNextFlightSegmentPath:function(){return c},normalizeFlightData:function(){return f},prepareFlightRouterStateForRequest:function(){return d}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let u=e.r(91395),o=e.r(88617),l=e.r(80118);function i(e){let[t,r,n,a]=e.slice(-4),u=e.slice(0,-4);return{pathToSegment:u.slice(0,-1),segmentPath:u,segment:u[u.length-1]??"",tree:t,seedData:r,head:n,isHeadPartial:a,isRootRender:4===e.length}}function s(e,t){let r=(0,o.getRenderedPathname)(e),n=(0,o.getRenderedSearch)(e),a=(0,l.createHrefFromUrl)(new URL(location.href)),u=t.f[0],i=u[0];return{b:t.b,c:a.split("/"),q:n,i:t.i,f:[[function e(t,r,n,a){let u,l,i=t[0];if("string"==typeof i)u=i,l=(0,o.doesStaticSegmentAppearInURL)(i);else{let e=i[0],t=i[2],s=(0,o.parseDynamicParamFromURLPart)(t,n,a);u=[e,(0,o.getCacheKeyForDynamicParam)(s,r),t],l=!0}let s=l?a+1:a,c=t[1],f={};for(let t in c){let a=c[t];f[t]=e(a,r,n,s)}return[u,f,null,t[3],t[4]]}(i,n,r.split("/").filter(e=>""!==e),0),u[1],u[2],u[2]]],m:t.m,G:t.G,S:t.S}}function c(e){return e.slice(2)}function f(e){return"string"==typeof e?e:e.map(e=>i(e))}function d(e,t){return t?encodeURIComponent(JSON.stringify(e)):encodeURIComponent(JSON.stringify(function e(t){var r,n;let[a,o,l,i,s,c]=t,f="string"==typeof(r=a)&&r.startsWith(u.PAGE_SEGMENT_KEY+"?")?u.PAGE_SEGMENT_KEY:r,d={};for(let[t,r]of Object.entries(o))d[t]=e(r);let p=[f,d,null,(n=i)&&"refresh"!==n?i:null];return void 0!==s&&(p[4]=s),void 0!==c&&(p[5]=c),p}(e)))}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},70410,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={getAppBuildId:function(){return l},setAppBuildId:function(){return o}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let u="";function o(e){u=e}function l(){return u}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},83767,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={djb2Hash:function(){return u},hexHash:function(){return o}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});function u(e){let t=5381;for(let r=0;r>>0}function o(e){return u(e).toString(36).slice(0,5)}},62858,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"computeCacheBustingSearchParam",{enumerable:!0,get:function(){return a}});let n=e.r(83767);function a(e,t,r,a){return(void 0===e||"0"===e)&&void 0===t&&void 0===r&&void 0===a?"":(0,n.hexHash)([e||"0",t||"0",r||"0",a||"0"].join(","))}},57283,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={setCacheBustingSearchParam:function(){return l},setCacheBustingSearchParamWithHash:function(){return i}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let u=e.r(62858),o=e.r(2089),l=(e,t)=>{i(e,(0,u.computeCacheBustingSearchParam)(t[o.NEXT_ROUTER_PREFETCH_HEADER],t[o.NEXT_ROUTER_SEGMENT_PREFETCH_HEADER],t[o.NEXT_ROUTER_STATE_TREE_HEADER],t[o.NEXT_URL]))},i=(e,t)=>{let r=e.search,n=(r.startsWith("?")?r.slice(1):r).split("&").filter(e=>e&&!e.startsWith(`${o.NEXT_RSC_UNION_QUERY}=`));t.length>0?n.push(`${o.NEXT_RSC_UNION_QUERY}=${t}`):n.push(`${o.NEXT_RSC_UNION_QUERY}`),e.search=n.length?`?${n.join("&")}`:""};("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},26159,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={getDeploymentId:function(){return u},getDeploymentIdQueryOrEmptyString:function(){return o}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});function u(){return!1}function o(){return""}},20320,(e,t,r)=>{"use strict";let n;Object.defineProperty(r,"__esModule",{value:!0});var a={createFetch:function(){return m},createFromNextReadableStream:function(){return R},fetchServerResponse:function(){return b}};for(var u in a)Object.defineProperty(r,u,{enumerable:!0,get:a[u]});let o=e.r(30545),l=e.r(2089),i=e.r(59295),s=e.r(85045),c=e.r(94955),f=e.r(70410),d=e.r(57283),p=e.r(88617),h=e.r(26159),y=o.createFromReadableStream,g=o.createFromFetch;function _(e){return(0,p.urlToUrlWithoutFlightMarker)(new URL(e,location.origin)).toString()}let v=!1;async function b(e,t){let{flightRouterState:r,nextUrl:n}=t,a={[l.RSC_HEADER]:"1",[l.NEXT_ROUTER_STATE_TREE_HEADER]:(0,c.prepareFlightRouterStateForRequest)(r,t.isHmrRefresh)};n&&(a[l.NEXT_URL]=n);let u=e;try{(e=new URL(e)).pathname.endsWith("/")?e.pathname+="index.txt":e.pathname+=".txt";let t=await m(e,a,"auto",!0),r=(0,p.urlToUrlWithoutFlightMarker)(new URL(t.url)),n=t.redirected?r:u,o=t.headers.get("content-type")||"",i=!!t.headers.get("vary")?.includes(l.NEXT_URL),s=!!t.headers.get(l.NEXT_DID_POSTPONE_HEADER),d=t.headers.get(l.NEXT_ROUTER_STALE_TIME_HEADER),h=null!==d?1e3*parseInt(d,10):-1,y=o.startsWith(l.RSC_CONTENT_TYPE_HEADER);if(y||(y=o.startsWith("text/plain")),!y||!t.ok||!t.body)return e.hash&&(r.hash=e.hash),_(r.toString());let g=t.flightResponse;if(null===g){let e,r=s?(e=t.body.getReader(),new ReadableStream({async pull(t){for(;;){let{done:r,value:n}=await e.read();if(!r){t.enqueue(n);continue}return}}})):t.body;g=R(r,a)}let v=await g;if((0,f.getAppBuildId)()!==v.b)return _(t.url);let b=(0,c.normalizeFlightData)(v.f);if("string"==typeof b)return _(b);return{flightData:b,canonicalUrl:n,renderedSearch:(0,p.getRenderedSearch)(t),couldBeIntercepted:i,prerendered:v.S,postponed:s,staleTime:h,debugInfo:g._debugInfo??null}}catch(e){return v||console.error(`Failed to fetch RSC payload for ${u}. Falling back to browser navigation.`,e),u.toString()}}async function m(e,t,r,a,u){var o,c;let f=(0,h.getDeploymentId)();f&&(t["x-deployment-id"]=f);let p=new URL(e);(0,d.setCacheBustingSearchParam)(p,t);let y=fetch(p,{credentials:"same-origin",headers:t,priority:r||void 0,signal:u}),_=a?(o=y,c=t,g(o,{callServer:i.callServer,findSourceMapURL:s.findSourceMapURL,debugChannel:n&&n(c)})):null,v=await y,b=v.redirected,m=new URL(v.url,p);return m.searchParams.delete(l.NEXT_RSC_UNION_QUERY),{url:m.href,redirected:b,ok:v.ok,headers:v.headers,body:v.body,status:v.status,flightResponse:_}}function R(e,t){return y(e,{callServer:i.callServer,findSourceMapURL:s.findSourceMapURL,debugChannel:n&&n(t)})}"u">typeof window&&(window.addEventListener("pagehide",()=>{v=!0}),window.addEventListener("pageshow",()=>{v=!1})),("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},91439,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"createRouterCacheKey",{enumerable:!0,get:function(){return a}});let n=e.r(91395);function a(e,t=!1){return Array.isArray(e)?`${e[0]}|${e[1]}|${e[2]}`:t&&e.startsWith(n.PAGE_SEGMENT_KEY)?n.PAGE_SEGMENT_KEY:e}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},84697,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"isNavigatingToNewRootLayout",{enumerable:!0,get:function(){return function e(t,r){let n=t[0],a=r[0];if(Array.isArray(n)&&Array.isArray(a)){if(n[0]!==a[0]||n[2]!==a[2])return!0}else if(n!==a)return!0;if(t[4])return!r[4];if(r[4])return!0;let u=Object.values(t[1])[0],o=Object.values(r[1])[0];return!u||!o||e(u,o)}}}),("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},1989,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n,a={FreshnessPolicy:function(){return g},createInitialCacheNodeForHydration:function(){return v},isDeferredRsc:function(){return D},spawnDynamicRequests:function(){return j},startPPRNavigation:function(){return b}};for(var u in a)Object.defineProperty(r,u,{enumerable:!0,get:a[u]});let o=e.r(91395),l=e.r(22039),i=e.r(80118),s=e.r(91439),c=e.r(20320),f=e.r(53128),d=e.r(98165),p=e.r(84697),h=e.r(28806),y=e.r(94345);var g=((n={})[n.Default=0]="Default",n[n.Hydration=1]="Hydration",n[n.HistoryTraversal=2]="HistoryTraversal",n[n.RefreshAll=3]="RefreshAll",n[n.HMRRefresh=4]="HMRRefresh",n);let _=()=>{};function v(e,t,r,n){return m(e,t,void 0,1,r,n,null,null,!1,null,null,!1,{scrollableSegments:null,separateRefreshUrls:null}).node}function b(e,t,r,n,a,u,c,f,d,h,y,g,_){return function e(t,r,n,a,u,c,f,d,h,y,g,_,v,b,T,j,w,A){var M,N;let D,C,x,U=a[0],k=u[0];if(!(0,l.matchSegment)(k,U))return!f&&(0,p.isNavigatingToNewRootLayout)(a,u)||k===o.NOT_FOUND_SEGMENT_KEY||null===b||null===T?null:m(t,u,n,c,d,h,y,g,_,b,T,j,A);let I=null!==T&&null!==b?b.concat([T,k]):[],F=u[1],L=a[1],H=null!==d?d[1]:null,$=null!==y?y[1]:null,B=!0===u[4],X=f||B,q=void 0!==n?n.parallelRoutes:void 0,W=!1,K=!1;switch(c){case 0:case 2:case 1:W=!1,K=!1;break;case 3:case 4:W=!0,K=!0}let V=new Map(W?void 0:q),G=0===Object.keys(F).length;if(void 0===n||K||G&&v)if(null!==d&&null!==d[0]){let e=d[0],r=d[2],n=null===h;C=S(e,r,!1,h,n,G,V,t),x=G&&n}else if(null!==y){let e=y[0],r=y[2],n=y[3];C=S(e,r,n,g,_,G,V,t),x=n||G&&_}else C=O(V,G,t,c),x=!0;else C=P(!1,n,V),x=!1;let Y=u[2],z="string"==typeof Y&&"refresh"===u[3]?Y:w;x&&null!==z&&(M=A,N=z,null===(D=M.separateRefreshUrls)?M.separateRefreshUrls=new Set([N]):D.add(N));let Q={},J=null,Z=!1,ee={};for(let n in F){let a=F[n],u=L[n];if(void 0===u)return null;let l=void 0!==q?q.get(n):void 0,f=null!==H?H[n]:null,d=null!==$?$[n]:null,p=a[0],y=h,b=g,m=_;2!==c&&p===o.DEFAULT_SEGMENT_KEY&&(p=(a=function(e,t){let r;return"refresh"===t[3]?r=t:((r=R(t,t[1]))[2]=(0,i.createHrefFromUrl)(e),r[3]="refresh"),r}(r,u))[0],f=null,y=null,d=null,b=null,m=!1);let E=(0,s.createRouterCacheKey)(p),P=e(t,r,void 0!==l?l.get(E):void 0,u,a,c,X,f??null,y,d??null,b,m,v,I,n,j||x,z,A);if(null===P)return null;null===J&&(J=new Map),J.set(n,P);let S=P.node;if(null!==S){let e=new Map(W?void 0:l);e.set(E,S),V.set(n,e)}let O=P.route;Q[n]=O;let T=P.dynamicRequestTree;null!==T?(Z=!0,ee[n]=T):ee[n]=O}return{status:+!x,route:R(u,Q),node:C,dynamicRequestTree:E(u,ee,x,Z,j),refreshUrl:z,children:J}}(e,t,null!==r?r:void 0,n,a,u,!1,c,f,d,h,y,g,null,null,!1,null,_)}function m(e,t,r,n,a,u,o,l,i,c,f,d,p){let y,g,_=t[0],v=null!==f&&null!==c?c.concat([f,_]):[],b=t[1],T=null!==o?o[1]:null,j=null!==a?a[1]:null,w=void 0!==r?r.parallelRoutes:void 0,A=!1,M=!1,N=!1;switch(n){case 0:A=!1,M=void 0===r||e-r.navigatedAt>=h.DYNAMIC_STALETIME_MS,N=!1;break;case 1:M=!1,A=!1,N=!1;break;case 2:if(M=!1,M=!1,void 0!==r){let e=r.rsc;N=!D(e)||"pending"!==e.status}else N=!1;break;case 3:case 4:M=!0,A=!0,N=!1}let C=new Map(A?void 0:w),x=0===Object.keys(b).length;if(x&&(null===p.scrollableSegments&&(p.scrollableSegments=[]),p.scrollableSegments.push(v)),M||void 0===r)if(null!==a&&null!==a[0]){let t=a[0],r=a[2],o=null===u&&1!==n;y=S(t,r,!1,u,o,x,C,e),g=x&&o}else if(1===n&&x&&null!==u)y=S(null,null,!1,u,!1,x,C,e),g=!1;else if(1!==n&&null!==o){let t=o[0],r=o[2],n=o[3];y=S(t,r,n,l,i,x,C,e),g=n||x&&i}else y=O(C,x,e,n),g=!0;else y=P(N,r,C),g=!1;let U={},k=null,I=!1,F={};for(let t in b){let r=b[t],a=void 0!==w?w.get(t):void 0,o=null!==j?j[t]:null,c=null!==T?T[t]:null,f=r[0],h=(0,s.createRouterCacheKey)(f),y=m(e,r,void 0!==a?a.get(h):void 0,n,o??null,u,c??null,l,i,v,t,d||g,p);null===k&&(k=new Map),k.set(t,y);let _=y.node;if(null!==_){let e=new Map(A?void 0:a);e.set(h,_),C.set(t,e)}let R=y.route;U[t]=R;let E=y.dynamicRequestTree;null!==E?(I=!0,F[t]=E):F[t]=R}return{status:+!g,route:R(t,U),node:y,dynamicRequestTree:E(t,F,g,I,d),refreshUrl:null,children:k}}function R(e,t){let r=[e[0],t];return 2 in e&&(r[2]=e[2]),3 in e&&(r[3]=e[3]),4 in e&&(r[4]=e[4]),r}function E(e,t,r,n,a){let u=null;return r?(u=R(e,t),a||(u[3]="refetch")):u=n?R(e,t):null,u}function P(e,t,r){return{rsc:t.rsc,prefetchRsc:e?null:t.prefetchRsc,head:t.head,prefetchHead:e?null:t.prefetchHead,loading:t.loading,parallelRoutes:r,navigatedAt:t.navigatedAt}}function S(e,t,r,n,a,u,o,l){let i,s,c,f;return r?(s=e,i=C()):(s=null,i=e),u?a?(c=n,f=C()):(c=null,f=n):(c=null,f=null),{rsc:i,prefetchRsc:s,head:f,prefetchHead:c,loading:t,parallelRoutes:o,navigatedAt:l}}function O(e,t,r,n){let a=1===n;return{rsc:a?null:C(),prefetchRsc:null,head:!a&&t?C():null,prefetchHead:null,loading:a?null:C(),parallelRoutes:e,navigatedAt:r}}let T=!1;function j(e,t,r,n,a){let u=e.dynamicRequestTree;if(null===u){T=!1;return}let o=M(e,u,t,r,n),l=a.separateRefreshUrls,s=null;if(null!==l){s=[];let a=(0,i.createHrefFromUrl)(t);for(let t of l)t!==a&&null!==u&&s.push(M(e,u,new URL(t,location.origin),r,n))}w(e,r,o,s).then(_,_)}async function w(e,t,r,n){var a,u;let o=await (a=r,u=n,new Promise(e=>{let t=t=>{0===t.exitStatus?0==--n&&e(0):e(t.exitStatus)},r=()=>e(2),n=1;a.then(t,r),null!==u&&(n+=u.length,u.forEach(e=>e.then(t,r)))}));switch(0===o&&(o=function e(t,r,n){var a,u,o;let l,i,s,c;0===t.status?(t.status=2,a=t.node,u=r,o=n,D(i=a.rsc)&&(null===u?i.resolve(null,o):i.reject(u,o)),D(s=a.loading)&&s.resolve(null,o),D(c=a.head)&&c.resolve(null,o),l=null===t.refreshUrl?1:2):l=0;let f=t.children;if(null!==f)for(let[,t]of f){let a=e(t,r,n);a>l&&(l=a)}return l}(e,null,null)),o){case 0:T=!1;return;case 1:{let n=await r;A(!1,n.url,t,n.seed,e.route);return}case 2:{let n=await r;A(!0,n.url,t,n.seed,e.route);return}default:return o}}function A(e,t,r,n,a){e=e||T,T=!0;let u={type:d.ACTION_SERVER_PATCH,previousTree:a,url:t,nextUrl:r,seed:n,mpa:e};(0,f.dispatchAppRouterAction)(u)}async function M(e,t,r,n,a){try{let u=await (0,c.fetchServerResponse)(r,{flightRouterState:t,nextUrl:n,isHmrRefresh:4===a});if("string"==typeof u)return{exitStatus:2,url:new URL(u,location.origin),seed:null};let o=(0,y.convertServerPatchToFullTree)(e.route,u.flightData,u.renderedSearch);return{exitStatus:+!!function e(t,r,n,a,u){0===t.status&&null!==n&&(t.status=1,function(e,t,r,n){let a=e.rsc,u=t[0];if(null===u)return;null===a?e.rsc=u:D(a)&&a.resolve(u,n);let o=e.loading;if(D(o)){let e=t[2];o.resolve(e,n)}let l=e.head;D(l)&&l.resolve(r,n)}(t.node,n,a,u));let o=t.children,i=r[1],s=null!==n?n[1]:null,c=!1;if(null!==o)for(let t in i){let r=i[t],n=null!==s?s[t]:null,f=o.get(t);if(void 0===f)c=!0;else{let t=f.route[0];(0,l.matchSegment)(r[0],t)&&null!=n&&e(f,r,n,a,u)&&(c=!0)}}return c}(e,o.tree,o.data,o.head,u.debugInfo),url:new URL(u.canonicalUrl,location.origin),seed:o}}catch{return{exitStatus:2,url:r,seed:null}}}let N=Symbol();function D(e){return e&&"object"==typeof e&&e.tag===N}function C(){let e,t,r=[],n=new Promise((r,n)=>{e=r,t=n});return n.status="pending",n.resolve=(t,a)=>{"pending"===n.status&&(n.status="fulfilled",n.value=t,null!==a&&r.push.apply(r,a),e(t))},n.reject=(e,a)=>{"pending"===n.status&&(n.status="rejected",n.reason=e,null!==a&&r.push.apply(r,a),t(e))},n.tag=N,n._debugInfo=r,n}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},18563,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"HasLoadingBoundary",{enumerable:!0,get:function(){return a}});var n,a=((n={})[n.SegmentHasLoadingBoundary=1]="SegmentHasLoadingBoundary",n[n.SubtreeHasLoadingBoundary=2]="SubtreeHasLoadingBoundary",n[n.SubtreeHasNoLoadingBoundary=3]="SubtreeHasNoLoadingBoundary",n)},24994,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n,a,u,o={FetchStrategy:function(){return c},NavigationResultTag:function(){return i},PrefetchPriority:function(){return s}};for(var l in o)Object.defineProperty(r,l,{enumerable:!0,get:o[l]});var i=((n={})[n.MPA=0]="MPA",n[n.Success=1]="Success",n[n.NoOp=2]="NoOp",n[n.Async=3]="Async",n),s=((a={})[a.Intent=2]="Intent",a[a.Default=1]="Default",a[a.Background=0]="Background",a),c=((u={})[u.LoadingBoundary=0]="LoadingBoundary",u[u.PPR=1]="PPR",u[u.PPRRuntime=2]="PPRRuntime",u[u.Full=3]="Full",u);("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},68323,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={deleteFromLru:function(){return f},lruPut:function(){return s},updateLruSize:function(){return c}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let u=e.r(47661),o=null,l=!1,i=0;function s(e){if(o===e)return;let t=e.prev,r=e.next;if(null===r||null===t?(i+=e.size,d()):(t.next=r,r.prev=t),null===o)e.prev=e,e.next=e;else{let t=o.prev;e.prev=t,null!==t&&(t.next=e),e.next=o,o.prev=e}o=e}function c(e,t){let r=e.size;e.size=t,null!==e.next&&(i=i-r+t,d())}function f(e){let t=e.next,r=e.prev;null!==t&&null!==r&&(i-=e.size,e.next=null,e.prev=null,o===e?t===o?o=null:(o=t,r.next=t,t.prev=r):(r.next=t,t.prev=r))}function d(){l||i<=0x3200000||(l=!0,h(p))}function p(){l=!1;for(;i>0x2d00000&&null!==o;){let e=o.prev;null!==e&&(0,u.deleteMapEntry)(e)}}let h="function"==typeof requestIdleCallback?requestIdleCallback:e=>setTimeout(e,0);("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},47661,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={Fallback:function(){return o},createCacheMap:function(){return i},deleteFromCacheMap:function(){return p},deleteMapEntry:function(){return h},getFromCacheMap:function(){return s},isValueExpired:function(){return c},setInCacheMap:function(){return f},setSizeInCacheMap:function(){return y}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let u=e.r(68323),o={},l={};function i(){return{parent:null,key:null,value:null,map:null,prev:null,next:null,size:0}}function s(e,t,r,n,a){let i=function e(t,r,n,a,u,i){let s,f;if(null!==a)s=a.value,f=a.parent;else if(u&&i!==l)s=l,f=null;else return null===n.value?n:c(t,r,n.value)?(h(n),null):n;let d=n.map;if(null!==d){let n=d.get(s);if(void 0!==n){let a=e(t,r,n,f,u,s);if(null!==a)return a}let a=d.get(o);if(void 0!==a)return e(t,r,a,f,u,s)}return null}(e,t,r,n,a,0);return null===i||null===i.value?null:((0,u.lruPut)(i),i.value)}function c(e,t,r){return r.staleAt<=e||r.version{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={appendLayoutVaryPath:function(){return c},clonePageVaryPathWithNewSearchParams:function(){return y},finalizeLayoutVaryPath:function(){return f},finalizeMetadataVaryPath:function(){return p},finalizePageVaryPath:function(){return d},getFulfilledRouteVaryPath:function(){return s},getRouteVaryPath:function(){return i},getSegmentVaryPathForRequest:function(){return h}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let u=e.r(24994),o=e.r(47661),l=e.r(69434);function i(e,t,r){return{value:e,parent:{value:t,parent:{value:r,parent:null}}}}function s(e,t,r,n){return{value:e,parent:{value:t,parent:{value:n?r:o.Fallback,parent:null}}}}function c(e,t){return{value:t,parent:e}}function f(e,t){return{value:e,parent:t}}function d(e,t,r){return{value:e,parent:{value:t,parent:r}}}function p(e,t,r){return{value:e+l.HEAD_REQUEST_KEY,parent:{value:t,parent:r}}}function h(e,t){let r=t.varyPath;if(t.isPage&&e!==u.FetchStrategy.Full&&e!==u.FetchStrategy.PPRRuntime){let e=r.parent.parent;return{value:r.value,parent:{value:o.Fallback,parent:e}}}return r}function y(e,t){let r=e.parent;return{value:e.value,parent:{value:t,parent:r.parent}}}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},63280,(e,t,r)=>{"use strict";function n(e,t){let r=new URL(e);return{pathname:r.pathname,search:r.search,nextUrl:t}}Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"createCacheKey",{enumerable:!0,get:function(){return n}}),("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},40285,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={cancelPrefetchTask:function(){return R},isPrefetchTaskDirty:function(){return P},pingPrefetchTask:function(){return A},reschedulePrefetchTask:function(){return E},schedulePrefetchTask:function(){return m},startRevalidationCooldown:function(){return b}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let u=e.r(18563),o=e.r(22039),l=e.r(91666),i=e.r(91900),s=e.r(63280),c=e.r(24994),f=e.r(91395),d="function"==typeof queueMicrotask?queueMicrotask:e=>Promise.resolve().then(e).catch(e=>setTimeout(()=>{throw e})),p=[],h=0,y=0,g=!1,_=null,v=null;function b(){null!==v&&clearTimeout(v),v=setTimeout(()=>{v=null,O()},300)}function m(e,t,r,n,a){let u={key:e,treeAtTimeOfPrefetch:t,cacheVersion:(0,l.getCurrentCacheVersion)(),priority:n,phase:1,hasBackgroundWork:!1,spawnedRuntimePrefetches:null,fetchStrategy:r,sortId:y++,isCanceled:!1,onInvalidate:a,_heapIndex:-1};return S(u),$(p,u),O(),u}function R(e){e.isCanceled=!0,function(e,t){let r=t._heapIndex;if(-1!==r&&(t._heapIndex=-1,0!==e.length)){let n=e.pop();n!==t&&(e[r]=n,n._heapIndex=r,K(e,n,r))}}(p,e)}function E(e,t,r,n){e.isCanceled=!1,e.phase=1,e.sortId=y++,e.priority=e===_?c.PrefetchPriority.Intent:n,e.treeAtTimeOfPrefetch=t,e.fetchStrategy=r,S(e),-1!==e._heapIndex?q(p,e):$(p,e),O()}function P(e,t,r){let n=(0,l.getCurrentCacheVersion)();return e.cacheVersion!==n||e.treeAtTimeOfPrefetch!==r||e.key.nextUrl!==t}function S(e){e.priority===c.PrefetchPriority.Intent&&e!==_&&(null!==_&&_.priority!==c.PrefetchPriority.Background&&(_.priority=c.PrefetchPriority.Default,q(p,_)),_=e)}function O(){g||(g=!0,d(M))}function T(e){return null===v&&(e.priority===c.PrefetchPriority.Intent?h<12:h<4)}function j(e){return h++,e.then(e=>null===e?(w(),null):(e.closed.then(w),e.value))}function w(){h--,O()}function A(e){e.isCanceled||-1!==e._heapIndex||($(p,e),O())}function M(){g=!1;let e=Date.now(),t=B(p);for(;null!==t&&T(t);){t.cacheVersion=(0,l.getCurrentCacheVersion)();let r=function(e,t){let r=t.key,n=(0,l.readOrCreateRouteCacheEntry)(e,t,r),a=function(e,t,r){switch(r.status){case l.EntryStatus.Empty:j((0,l.fetchRouteOnCacheMiss)(r,t,t.key)),r.staleAt=e+6e4,r.status=l.EntryStatus.Pending;case l.EntryStatus.Pending:{let e=r.blockedTasks;return null===e?r.blockedTasks=new Set([t]):e.add(t),1}case l.EntryStatus.Rejected:break;case l.EntryStatus.Fulfilled:{if(0!==t.phase)return 2;if(!T(t))return 0;let i=r.tree,s=t.fetchStrategy===c.FetchStrategy.PPR?r.isPPREnabled?c.FetchStrategy.PPR:c.FetchStrategy.LoadingBoundary:t.fetchStrategy;switch(s){case c.FetchStrategy.PPR:{var n,a,o;if(x(n=e,a=t,o=r,(0,l.readOrCreateSegmentCacheEntry)(n,c.FetchStrategy.PPR,o,o.metadata),a.key,o.metadata),0===function e(t,r,n,a,u){let o=(0,l.readOrCreateSegmentCacheEntry)(t,r.fetchStrategy,n,u);x(t,r,n,o,r.key,u);let i=a[1],s=u.slots;if(null!==s)for(let a in s){if(!T(r))return 0;let u=s[a],o=u.segment,c=i[a],f=c?.[0];if(0===(void 0!==f&&L(n,o,f)?e(t,r,n,c,u):function e(t,r,n,a){if(a.hasRuntimePrefetch)return null===r.spawnedRuntimePrefetches?r.spawnedRuntimePrefetches=new Set([a.requestKey]):r.spawnedRuntimePrefetches.add(a.requestKey),2;let u=(0,l.readOrCreateSegmentCacheEntry)(t,r.fetchStrategy,n,a);if(x(t,r,n,u,r.key,a),null!==a.slots){if(!T(r))return 0;for(let u in a.slots)if(0===e(t,r,n,a.slots[u]))return 0}return 2}(t,r,n,u)))return 0}return 2}(e,t,r,t.treeAtTimeOfPrefetch,i))return 0;let u=t.spawnedRuntimePrefetches;if(null!==u){let n=new Map;D(e,t,r,n,c.FetchStrategy.PPRRuntime);let a=function e(t,r,n,a,u,o){if(u.has(a.requestKey))return C(t,r,n,a,!1,o,c.FetchStrategy.PPRRuntime);let l={},i=a.slots;if(null!==i)for(let a in i){let s=i[a];l[a]=e(t,r,n,s,u,o)}return[a.segment,l,null,null]}(e,t,r,i,u,n);n.size>0&&j((0,l.fetchSegmentPrefetchesUsingDynamicRequest)(t,r,c.FetchStrategy.PPRRuntime,a,n))}return 2}case c.FetchStrategy.Full:case c.FetchStrategy.PPRRuntime:case c.FetchStrategy.LoadingBoundary:{let n=new Map;D(e,t,r,n,s);let a=function e(t,r,n,a,o,i,s){let f=a[1],d=o.slots,p={};if(null!==d)for(let a in d){let o=d[a],h=o.segment,y=f[a],g=y?.[0];if(void 0!==g&&L(n,h,g)){let u=e(t,r,n,y,o,i,s);p[a]=u}else switch(s){case c.FetchStrategy.LoadingBoundary:{let e=o.hasLoadingBoundary!==u.HasLoadingBoundary.SubtreeHasNoLoadingBoundary?function e(t,r,n,a,o,i){let s=null===o?"inside-shared-layout":null,f=(0,l.readOrCreateSegmentCacheEntry)(t,r.fetchStrategy,n,a);switch(f.status){case l.EntryStatus.Empty:i.set(a.requestKey,(0,l.upgradeToPendingSegment)(f,c.FetchStrategy.LoadingBoundary)),"refetch"!==o&&(s=o="refetch");break;case l.EntryStatus.Fulfilled:if(a.hasLoadingBoundary===u.HasLoadingBoundary.SegmentHasLoadingBoundary)return(0,l.convertRouteTreeToFlightRouterState)(a);case l.EntryStatus.Pending:case l.EntryStatus.Rejected:}let d={};if(null!==a.slots)for(let u in a.slots){let l=a.slots[u];d[u]=e(t,r,n,l,o,i)}return[a.segment,d,null,s,a.isRootLayout]}(t,r,n,o,null,i):(0,l.convertRouteTreeToFlightRouterState)(o);p[a]=e;break}case c.FetchStrategy.PPRRuntime:{let e=C(t,r,n,o,!1,i,s);p[a]=e;break}case c.FetchStrategy.Full:{let e=C(t,r,n,o,!1,i,s);p[a]=e}}}return[o.segment,p,null,null,o.isRootLayout]}(e,t,r,t.treeAtTimeOfPrefetch,i,n,s);return n.size>0&&j((0,l.fetchSegmentPrefetchesUsingDynamicRequest)(t,r,s,a,n)),2}}}}return 2}(e,t,n);if(0!==a&&""!==r.search){let n=new URL(r.pathname,location.origin),a=(0,s.createCacheKey)(n.href,r.nextUrl),u=(0,l.readOrCreateRouteCacheEntry)(e,t,a);switch(u.status){case l.EntryStatus.Empty:N(t)&&(u.status=l.EntryStatus.Pending,j((0,l.fetchRouteOnCacheMiss)(u,t,a)));case l.EntryStatus.Pending:case l.EntryStatus.Fulfilled:case l.EntryStatus.Rejected:}}return a}(e,t),n=t.hasBackgroundWork;switch(t.hasBackgroundWork=!1,t.spawnedRuntimePrefetches=null,r){case 0:return;case 1:X(p),t=B(p);continue;case 2:1===t.phase?(t.phase=0,q(p,t)):n?(t.priority=c.PrefetchPriority.Background,q(p,t)):X(p),t=B(p);continue}}}function N(e){return e.priority===c.PrefetchPriority.Background||(e.hasBackgroundWork=!0,!1)}function D(e,t,r,n,a){C(e,t,r,r.metadata,!1,n,a===c.FetchStrategy.LoadingBoundary?c.FetchStrategy.Full:a)}function C(e,t,r,n,a,u,o){let i=(0,l.readOrCreateSegmentCacheEntry)(e,o,r,n),s=null;switch(i.status){case l.EntryStatus.Empty:s=(0,l.upgradeToPendingSegment)(i,o);break;case l.EntryStatus.Fulfilled:i.isPartial&&(0,l.canNewFetchStrategyProvideMoreContent)(i.fetchStrategy,o)&&(s=k(e,r,n,o));break;case l.EntryStatus.Pending:case l.EntryStatus.Rejected:(0,l.canNewFetchStrategyProvideMoreContent)(i.fetchStrategy,o)&&(s=k(e,r,n,o))}let c={};if(null!==n.slots)for(let l in n.slots){let i=n.slots[l];c[l]=C(e,t,r,i,a||null!==s,u,o)}null!==s&&u.set(n.requestKey,s);let f=a||null===s?null:"refetch";return[n.segment,c,null,f,n.isRootLayout]}function x(e,t,r,n,a,u){switch(n.status){case l.EntryStatus.Empty:j((0,l.fetchSegmentOnCacheMiss)(r,(0,l.upgradeToPendingSegment)(n,c.FetchStrategy.PPR),a,u));break;case l.EntryStatus.Pending:switch(n.fetchStrategy){case c.FetchStrategy.PPR:case c.FetchStrategy.PPRRuntime:case c.FetchStrategy.Full:break;case c.FetchStrategy.LoadingBoundary:N(t)&&U(e,r,a,u);break;default:n.fetchStrategy}break;case l.EntryStatus.Rejected:switch(n.fetchStrategy){case c.FetchStrategy.PPR:case c.FetchStrategy.PPRRuntime:case c.FetchStrategy.Full:break;case c.FetchStrategy.LoadingBoundary:U(e,r,a,u);break;default:n.fetchStrategy}case l.EntryStatus.Fulfilled:}}function U(e,t,r,n){let a=(0,l.readOrCreateRevalidatingSegmentEntry)(e,c.FetchStrategy.PPR,t,n);switch(a.status){case l.EntryStatus.Empty:F(j((0,l.fetchSegmentOnCacheMiss)(t,(0,l.upgradeToPendingSegment)(a,c.FetchStrategy.PPR),r,n)),(0,i.getSegmentVaryPathForRequest)(c.FetchStrategy.PPR,n));case l.EntryStatus.Pending:case l.EntryStatus.Fulfilled:case l.EntryStatus.Rejected:}}function k(e,t,r,n){let a=(0,l.readOrCreateRevalidatingSegmentEntry)(e,n,t,r);if(a.status===l.EntryStatus.Empty){let e=(0,l.upgradeToPendingSegment)(a,n);return F((0,l.waitForSegmentCacheEntry)(e),(0,i.getSegmentVaryPathForRequest)(n,r)),e}if((0,l.canNewFetchStrategyProvideMoreContent)(a.fetchStrategy,n)){let e=(0,l.overwriteRevalidatingSegmentCacheEntry)(n,t,r),a=(0,l.upgradeToPendingSegment)(e,n);return F((0,l.waitForSegmentCacheEntry)(a),(0,i.getSegmentVaryPathForRequest)(n,r)),a}switch(a.status){case l.EntryStatus.Pending:case l.EntryStatus.Fulfilled:case l.EntryStatus.Rejected:default:return null}}let I=()=>{};function F(e,t){e.then(e=>{null!==e&&(0,l.upsertSegmentEntry)(Date.now(),t,e)},I)}function L(e,t,r){return r===f.PAGE_SEGMENT_KEY?t===(0,f.addSearchParamsIfPageSegment)(f.PAGE_SEGMENT_KEY,Object.fromEntries(new URLSearchParams(e.renderedSearch))):(0,o.matchSegment)(r,t)}function H(e,t){let r=t.priority-e.priority;if(0!==r)return r;let n=t.phase-e.phase;return 0!==n?n:t.sortId-e.sortId}function $(e,t){let r=e.length;e.push(t),t._heapIndex=r,W(e,t,r)}function B(e){return 0===e.length?null:e[0]}function X(e){if(0===e.length)return null;let t=e[0];t._heapIndex=-1;let r=e.pop();return r!==t&&(e[0]=r,r._heapIndex=0,K(e,r,0)),t}function q(e,t){let r=t._heapIndex;-1!==r&&(0===r?K(e,t,0):H(e[r-1>>>1],t)>0?W(e,t,r):K(e,t,r))}function W(e,t,r){let n=r;for(;n>0;){let r=n-1>>>1,a=e[r];if(!(H(a,t)>0))return;e[r]=t,t._heapIndex=r,e[n]=a,a._heapIndex=n,n=r}}function K(e,t,r){let n=r,a=e.length,u=a>>>1;for(;nH(u,t))oH(l,u)?(e[n]=l,l._heapIndex=n,e[o]=t,t._heapIndex=o,n=o):(e[n]=u,u._heapIndex=n,e[r]=t,t._heapIndex=r,n=r);else{if(!(oH(l,t)))return;e[n]=l,l._heapIndex=n,e[o]=t,t._heapIndex=o,n=o}}}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},28732,(e,t,r)=>{"use strict";function n(e){let t=e.indexOf("#"),r=e.indexOf("?"),n=r>-1&&(t<0||r-1?{pathname:e.substring(0,n?r:t),query:n?e.substring(r,t>-1?t:void 0):"",hash:t>-1?e.slice(t):""}:{pathname:e,query:"",hash:""}}Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"parsePath",{enumerable:!0,get:function(){return n}})},26935,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"addPathPrefix",{enumerable:!0,get:function(){return a}});let n=e.r(28732);function a(e,t){if(!e.startsWith("/")||!t)return e;let{pathname:r,query:a,hash:u}=(0,n.parsePath)(e);return`${t}${r}${a}${u}`}},20206,(e,t,r)=>{"use strict";function n(e){return e.replace(/\/$/,"")||"/"}Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"removeTrailingSlash",{enumerable:!0,get:function(){return n}})},67268,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"normalizePathTrailingSlash",{enumerable:!0,get:function(){return u}});let n=e.r(20206),a=e.r(28732),u=e=>{if(!e.startsWith("/"))return e;let{pathname:t,query:r,hash:u}=(0,a.parsePath)(e);return/\.[^/]+\/?$/.test(t)?`${(0,n.removeTrailingSlash)(t)}${r}${u}`:t.endsWith("/")?`${t}${r}${u}`:`${t}/${r}${u}`};("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},39940,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"addBasePath",{enumerable:!0,get:function(){return u}});let n=e.r(26935),a=e.r(67268);function u(e,t){return(0,a.normalizePathTrailingSlash)((0,n.addPathPrefix)(e,""))}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},93259,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={createPrefetchURL:function(){return i},isExternalURL:function(){return l}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let u=e.r(62112),o=e.r(39940);function l(e){return e.origin!==window.location.origin}function i(e){let t;if((0,u.isBot)(window.navigator.userAgent))return null;try{t=new URL((0,o.addBasePath)(e),window.location.href)}catch(t){throw Object.defineProperty(Error(`Cannot prefetch '${e}' because it cannot be converted to a URL.`),"__NEXT_ERROR_CODE",{value:"E234",enumerable:!1,configurable:!0})}return l(t)?null:t}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},79111,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={IDLE_LINK_STATUS:function(){return f},PENDING_LINK_STATUS:function(){return c},mountFormInstance:function(){return m},mountLinkInstance:function(){return b},onLinkVisibilityChanged:function(){return E},onNavigationIntent:function(){return P},pingVisibleLinks:function(){return O},setLinkForCurrentNavigation:function(){return d},unmountLinkForCurrentNavigation:function(){return p},unmountPrefetchableInstance:function(){return R}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let u=e.r(24994),o=e.r(63280),l=e.r(40285),i=e.r(30668),s=null,c={pending:!0},f={pending:!1};function d(e){(0,i.startTransition)(()=>{s?.setOptimisticLinkStatus(f),e?.setOptimisticLinkStatus(c),s=e})}function p(e){s===e&&(s=null)}let h="function"==typeof WeakMap?new WeakMap:new Map,y=new Set,g="function"==typeof IntersectionObserver?new IntersectionObserver(function(e){for(let t of e){let e=t.intersectionRatio>0;E(t.target,e)}},{rootMargin:"200px"}):null;function _(e,t){void 0!==h.get(e)&&R(e),h.set(e,t),null!==g&&g.observe(e)}function v(t){if(!("u">typeof window))return null;{let{createPrefetchURL:r}=e.r(93259);try{return r(t)}catch{return("function"==typeof reportError?reportError:console.error)(`Cannot prefetch '${t}' because it cannot be converted to a URL.`),null}}}function b(e,t,r,n,a,u){if(a){let a=v(t);if(null!==a){let t={router:r,fetchStrategy:n,isVisible:!1,prefetchTask:null,prefetchHref:a.href,setOptimisticLinkStatus:u};return _(e,t),t}}return{router:r,fetchStrategy:n,isVisible:!1,prefetchTask:null,prefetchHref:null,setOptimisticLinkStatus:u}}function m(e,t,r,n){let a=v(t);null===a||_(e,{router:r,fetchStrategy:n,isVisible:!1,prefetchTask:null,prefetchHref:a.href,setOptimisticLinkStatus:null})}function R(e){let t=h.get(e);if(void 0!==t){h.delete(e),y.delete(t);let r=t.prefetchTask;null!==r&&(0,l.cancelPrefetchTask)(r)}null!==g&&g.unobserve(e)}function E(e,t){let r=h.get(e);void 0!==r&&(r.isVisible=t,t?y.add(r):y.delete(r),S(r,u.PrefetchPriority.Default))}function P(e,t){let r=h.get(e);void 0!==r&&void 0!==r&&S(r,u.PrefetchPriority.Intent)}function S(t,r){if("u">typeof window){let n=t.prefetchTask;if(!t.isVisible){null!==n&&(0,l.cancelPrefetchTask)(n);return}let{getCurrentAppRouterState:a}=e.r(19998),u=a();if(null!==u){let e=u.tree;if(null===n){let n=u.nextUrl,a=(0,o.createCacheKey)(t.prefetchHref,n);t.prefetchTask=(0,l.schedulePrefetchTask)(a,e,t.fetchStrategy,r,null)}else(0,l.reschedulePrefetchTask)(n,e,t.fetchStrategy,r)}}}function O(e,t){for(let r of y){let n=r.prefetchTask;if(null!==n&&!(0,l.isPrefetchTaskDirty)(n,e,t))continue;null!==n&&(0,l.cancelPrefetchTask)(n);let a=(0,o.createCacheKey)(r.prefetchHref,e);r.prefetchTask=(0,l.schedulePrefetchTask)(a,t,r.fetchStrategy,u.PrefetchPriority.Default,null)}}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},59162,(e,t,r)=>{"use strict";function n(){let e,t,r=new Promise((r,n)=>{e=r,t=n});return{resolve:e,reject:t,promise:r}}Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"createPromiseWithResolvers",{enumerable:!0,get:function(){return n}})},91666,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n,a={EntryStatus:function(){return S},canNewFetchStrategyProvideMoreContent:function(){return en},convertRouteTreeToFlightRouterState:function(){return function e(t){let r={};if(null!==t.slots)for(let n in t.slots)r[n]=e(t.slots[n]);return[t.segment,r,null,null,t.isRootLayout]}},createDetachedSegmentCacheEntry:function(){return X},fetchRouteOnCacheMiss:function(){return Y},fetchSegmentOnCacheMiss:function(){return z},fetchSegmentPrefetchesUsingDynamicRequest:function(){return Q},getCurrentCacheVersion:function(){return M},getStaleTimeMs:function(){return P},overwriteRevalidatingSegmentCacheEntry:function(){return $},pingInvalidationListeners:function(){return D},readOrCreateRevalidatingSegmentEntry:function(){return H},readOrCreateRouteCacheEntry:function(){return k},readOrCreateSegmentCacheEntry:function(){return L},readRouteCacheEntry:function(){return C},readSegmentCacheEntry:function(){return x},requestOptimisticRouteCacheEntry:function(){return I},revalidateEntireCache:function(){return N},upgradeToPendingSegment:function(){return q},upsertSegmentEntry:function(){return B},waitForSegmentCacheEntry:function(){return U}};for(var u in a)Object.defineProperty(r,u,{enumerable:!0,get:a[u]});let o=e.r(18563),l=e.r(2089),i=e.r(20320),s=e.r(40285),c=e.r(91900),f=e.r(70410),d=e.r(80118),p=e.r(63280),h=e.r(88617),y=e.r(47661),g=e.r(69434),_=e.r(94955),v=e.r(28806),b=e.r(79111),m=e.r(91395),R=e.r(24994),E=e.r(59162);function P(e){return 1e3*Math.max(e,30)}var S=((n={})[n.Empty=0]="Empty",n[n.Pending=1]="Pending",n[n.Fulfilled=2]="Fulfilled",n[n.Rejected=3]="Rejected",n);let O=["",{},null,"metadata-only"],T=(0,y.createCacheMap)(),j=(0,y.createCacheMap)(),w=null,A=0;function M(){return A}function N(e,t){A++,(0,s.startRevalidationCooldown)(),(0,b.pingVisibleLinks)(e,t),D(e,t)}function D(e,t){if(null!==w){let r=w;for(let n of(w=null,r))(0,s.isPrefetchTaskDirty)(n,e,t)&&function(e){let t=e.onInvalidate;if(null!==t){e.onInvalidate=null;try{t()}catch(e){"function"==typeof reportError?reportError(e):console.error(e)}}}(n)}}function C(e,t){let r=(0,c.getRouteVaryPath)(t.pathname,t.search,t.nextUrl);return(0,y.getFromCacheMap)(e,A,T,r,!1)}function x(e,t){return(0,y.getFromCacheMap)(e,A,j,t,!1)}function U(e){let t=e.promise;return null===t&&(t=e.promise=(0,E.createPromiseWithResolvers)()),t.promise}function k(e,t,r){null!==t.onInvalidate&&(null===w?w=new Set([t]):w.add(t));let n=C(e,r);if(null!==n)return n;let a={canonicalUrl:null,status:0,blockedTasks:null,tree:null,metadata:null,couldBeIntercepted:!0,isPPREnabled:!1,renderedSearch:null,ref:null,size:0,staleAt:1/0,version:A},u=(0,c.getRouteVaryPath)(r.pathname,r.search,r.nextUrl);return(0,y.setInCacheMap)(T,u,a,!1),a}function I(e,t,r){let n=t.search;if(""===n)return null;let a=new URL(t);a.search="";let u=C(e,(0,p.createCacheKey)(a.href,r));if(null===u||2!==u.status)return null;let o=new URL(u.canonicalUrl,t.origin),l=""!==o.search?o.search:n,i=""!==u.renderedSearch?u.renderedSearch:n,s=new URL(u.canonicalUrl,location.origin);return s.search=l,{canonicalUrl:(0,d.createHrefFromUrl)(s),status:2,blockedTasks:null,tree:F(u.tree,i),metadata:F(u.metadata,i),couldBeIntercepted:u.couldBeIntercepted,isPPREnabled:u.isPPREnabled,renderedSearch:i,ref:null,size:0,staleAt:u.staleAt,version:u.version}}function F(e,t){let r=null,n=e.slots;if(null!==n)for(let e in r={},n){let a=n[e];r[e]=F(a,t)}return e.isPage?{requestKey:e.requestKey,segment:e.segment,varyPath:(0,c.clonePageVaryPathWithNewSearchParams)(e.varyPath,t),isPage:!0,slots:r,isRootLayout:e.isRootLayout,hasLoadingBoundary:e.hasLoadingBoundary,hasRuntimePrefetch:e.hasRuntimePrefetch}:{requestKey:e.requestKey,segment:e.segment,varyPath:e.varyPath,isPage:!1,slots:r,isRootLayout:e.isRootLayout,hasLoadingBoundary:e.hasLoadingBoundary,hasRuntimePrefetch:e.hasRuntimePrefetch}}function L(e,t,r,n){let a=x(e,n.varyPath);if(null!==a)return a;let u=(0,c.getSegmentVaryPathForRequest)(t,n),o=X(r.staleAt);return(0,y.setInCacheMap)(j,u,o,!1),o}function H(e,t,r,n){var a;let u=(a=n.varyPath,(0,y.getFromCacheMap)(e,A,j,a,!0));if(null!==u)return u;let o=(0,c.getSegmentVaryPathForRequest)(t,n),l=X(r.staleAt);return(0,y.setInCacheMap)(j,o,l,!0),l}function $(e,t,r){let n=(0,c.getSegmentVaryPathForRequest)(e,r),a=X(t.staleAt);return(0,y.setInCacheMap)(j,n,a,!0),a}function B(e,t,r){if((0,y.isValueExpired)(e,A,r))return null;let n=x(e,t);if(null!==n){var a;if(r.fetchStrategy!==n.fetchStrategy&&(a=n.fetchStrategy,!(a=400)return V(e,Date.now()+1e4),null;r=n.redirected?new URL(n.url):v,t=await ee(er(r,s),p)}if(!t||!t.ok||204===t.status||!t.body)return V(e,Date.now()+1e4),null;let b=(0,d.createHrefFromUrl)(r),R=t.headers.get("vary"),S=null!==R&&R.includes(l.NEXT_URL),O=(0,E.createPromiseWithResolvers)(),j="2"===t.headers.get(l.NEXT_DID_POSTPONE_HEADER)||!0;{var _;let r,n,a,u=et(t.body,O.resolve,function(t){(0,y.setSizeInCacheMap)(e,t)}),l=await (0,i.createFromNextReadableStream)(u,p);if(l.buildId!==(0,f.getAppBuildId)())return V(e,Date.now()+1e4),null;let s=(0,h.getRenderedPathname)(t),d=(0,h.getRenderedSearch)(t),v={metadataVaryPath:null},R=(r=s.split("/").filter(e=>""!==e),n=g.ROOT_SEGMENT_REQUEST_KEY,function e(t,r,n,a,u,l,i,s){let f,d,p=null,y=t.slots;if(null!==y)for(let t in f=!1,d=(0,c.finalizeLayoutVaryPath)(a,n),p={},y){let r,o,f,d=y[t],_=d.name,v=d.paramType,b=d.paramKey;if(null!==v){let e=(0,h.parseDynamicParamFromURLPart)(v,u,l),t=null!==b?b:(0,h.getCacheKeyForDynamicParam)(e,"");f=(0,c.appendLayoutVaryPath)(n,t),o=[_,t,v],r=!0}else f=n,o=_,r=(0,h.doesStaticSegmentAppearInURL)(_);let m=r?l+1:l,R=(0,g.createSegmentRequestKeyPart)(o),E=(0,g.appendSegmentRequestKeyPart)(a,t,R);p[t]=e(d,o,f,E,u,m,i,s)}else a.endsWith(m.PAGE_SEGMENT_KEY)?(f=!0,d=(0,c.finalizePageVaryPath)(a,i,n),null===s.metadataVaryPath&&(s.metadataVaryPath=(0,c.finalizeMetadataVaryPath)(a,i,n))):(f=!1,d=(0,c.finalizeLayoutVaryPath)(a,n));return{requestKey:a,segment:r,varyPath:d,isPage:f,slots:p,isRootLayout:t.isRootLayout,hasLoadingBoundary:o.HasLoadingBoundary.SegmentHasLoadingBoundary,hasRuntimePrefetch:t.hasRuntimePrefetch}}(l.tree,n,null,g.ROOT_SEGMENT_REQUEST_KEY,r,0,d,v)),E=v.metadataVaryPath;if(null===E)return V(e,Date.now()+1e4),null;let T=P(l.staleTime);_=Date.now()+T,a={requestKey:g.HEAD_REQUEST_KEY,segment:g.HEAD_REQUEST_KEY,varyPath:E,isPage:!0,slots:null,isRootLayout:!1,hasLoadingBoundary:o.HasLoadingBoundary.SubtreeHasNoLoadingBoundary,hasRuntimePrefetch:!1},e.status=2,e.tree=R,e.metadata=a,e.staleAt=_,e.couldBeIntercepted=S,e.canonicalUrl=b,e.renderedSearch=d,e.isPPREnabled=j,W(e)}if(!S){let t=(0,c.getFulfilledRouteVaryPath)(n,a,u,S);(0,y.setInCacheMap)(T,t,e,!1)}return{value:null,closed:O.promise}}catch(t){return V(e,Date.now()+1e4),null}}async function z(e,t,r,n){let a=new URL(e.canonicalUrl,location.origin),u=r.nextUrl,o=n.requestKey,s=o===g.ROOT_SEGMENT_REQUEST_KEY?"/_index":o,c={[l.RSC_HEADER]:"1",[l.NEXT_ROUTER_PREFETCH_HEADER]:"1",[l.NEXT_ROUTER_SEGMENT_PREFETCH_HEADER]:s};null!==u&&(c[l.NEXT_URL]=u);let d=er(a,s);try{let r=await ee(d,c);if(!r||!r.ok||204===r.status||"2"!==r.headers.get(l.NEXT_DID_POSTPONE_HEADER)&&0||!r.body)return G(t,Date.now()+1e4),null;let n=(0,E.createPromiseWithResolvers)(),a=et(r.body,n.resolve,function(e){(0,y.setSizeInCacheMap)(t,e)}),u=await (0,i.createFromNextReadableStream)(a,c);if(u.buildId!==(0,f.getAppBuildId)())return G(t,Date.now()+1e4),null;return{value:K(t,u.rsc,u.loading,e.staleAt,u.isPartial),closed:n.promise}}catch(e){return G(t,Date.now()+1e4),null}}async function Q(e,t,r,n,a){let u=e.key,o=new URL(t.canonicalUrl,location.origin),s=u.nextUrl;1===a.size&&a.has(t.metadata.requestKey)&&(n=O);let c={[l.RSC_HEADER]:"1",[l.NEXT_ROUTER_STATE_TREE_HEADER]:(0,_.prepareFlightRouterStateForRequest)(n)};switch(null!==s&&(c[l.NEXT_URL]=s),r){case R.FetchStrategy.Full:break;case R.FetchStrategy.PPRRuntime:c[l.NEXT_ROUTER_PREFETCH_HEADER]="2";break;case R.FetchStrategy.LoadingBoundary:c[l.NEXT_ROUTER_PREFETCH_HEADER]="1"}try{let n=await ee(o,c);if(!n||!n.ok||!n.body||(0,h.getRenderedSearch)(n)!==t.renderedSearch)return J(a,Date.now()+1e4),null;let u=(0,E.createPromiseWithResolvers)(),s=null,d=et(n.body,u.resolve,function(e){if(null===s)return;let t=e/s.length;for(let e of s)(0,y.setSizeInCacheMap)(e,t)}),p=await (0,i.createFromNextReadableStream)(d,c),g=r===R.FetchStrategy.PPRRuntime&&p.rp?.[0]===!0;return s=function(e,t,r,n,a,u,o,i){if(a.b!==(0,f.getAppBuildId)())return null!==i&&J(i,e+1e4),null;let s=(0,_.normalizeFlightData)(a.f);if("string"==typeof s)return null;let c="number"==typeof a.rp?.[1]?a.rp[1]:parseInt(n.headers.get(l.NEXT_ROUTER_STALE_TIME_HEADER)??"",10),d=e+(isNaN(c)?v.STATIC_STALETIME_MS:P(c));for(let n of s){let a=n.seedData;if(null!==a){let l=n.segmentPath,s=o.tree;for(let t=0;t{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={convertServerPatchToFullTree:function(){return m},navigate:function(){return d},navigateToSeededRoute:function(){return p}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let u=e.r(20320),o=e.r(1989),l=e.r(80118),i=e.r(91666),s=e.r(63280),c=e.r(91395),f=e.r(24994);function d(e,t,r,n,a,u,o,l){let c=Date.now(),d=e.href,p=d===t.href,y=(0,s.createCacheKey)(d,a),v=(0,i.readRouteCacheEntry)(c,y);if(null!==v&&v.status===i.EntryStatus.Fulfilled){let l=g(c,v,v.tree),i=l.flightRouterState,s=l.seedData,f=_(c,v),d=f.rsc,y=f.isPartial,b=v.canonicalUrl+e.hash;return h(c,e,t,a,p,r,n,i,s,d,y,b,v.renderedSearch,u,o)}if(null===v||v.status!==i.EntryStatus.Rejected){let l=(0,i.requestOptimisticRouteCacheEntry)(c,e,a);if(null!==l){let i=g(c,l,l.tree),s=i.flightRouterState,f=i.seedData,d=_(c,l),y=d.rsc,v=d.isPartial,b=l.canonicalUrl+e.hash;return h(c,e,t,a,p,r,n,s,f,y,v,b,l.renderedSearch,u,o)}}let m=l.collectedDebugInfo??[];return void 0===l.collectedDebugInfo&&(m=l.collectedDebugInfo=[]),{tag:f.NavigationResultTag.Async,data:b(c,e,t,a,r,n,u,o,m)}}function p(e,t,r,n,a,u,l,i,s,c){let d={scrollableSegments:null,separateRefreshUrls:null},p=t.href===a.href,h=(0,o.startPPRNavigation)(e,a,u,l,n.tree,i,n.data,n.head,null,null,!1,p,d);return null!==h?((0,o.spawnDynamicRequests)(h,t,s,i,d),y(h,r,n.renderedSearch,d.scrollableSegments,c,t.hash)):{tag:f.NavigationResultTag.MPA,data:r}}function h(e,t,r,n,a,u,l,i,s,c,d,p,h,g,_){let v={scrollableSegments:null,separateRefreshUrls:null},b=(0,o.startPPRNavigation)(e,r,u,l,i,g,null,null,s,c,d,a,v);return null!==b?((0,o.spawnDynamicRequests)(b,t,n,g,v),y(b,p,h,v.scrollableSegments,_,t.hash)):{tag:f.NavigationResultTag.MPA,data:p}}function y(e,t,r,n,a,u){return{tag:f.NavigationResultTag.Success,data:{flightRouterState:e.route,cacheNode:e.node,canonicalUrl:t,renderedSearch:r,scrollableSegments:n,shouldScroll:a,hash:u}}}function g(e,t,r){let n={},a={},u=r.slots;if(null!==u)for(let r in u){let o=g(e,t,u[r]);n[r]=o.flightRouterState,a[r]=o.seedData}let o=null,l=null,s=!0,f=(0,i.readSegmentCacheEntry)(e,r.varyPath);if(null!==f)switch(f.status){case i.EntryStatus.Fulfilled:o=f.rsc,l=f.loading,s=f.isPartial;break;case i.EntryStatus.Pending:{let e=(0,i.waitForSegmentCacheEntry)(f);o=e.then(e=>null!==e?e.rsc:null),l=e.then(e=>null!==e?e.loading:null),s=f.isPartial}case i.EntryStatus.Empty:case i.EntryStatus.Rejected:}return{flightRouterState:[(0,c.addSearchParamsIfPageSegment)(r.segment,Object.fromEntries(new URLSearchParams(t.renderedSearch))),n,null,null,r.isRootLayout],seedData:[o,a,l,s,!1]}}function _(e,t){let r=null,n=!0,a=(0,i.readSegmentCacheEntry)(e,t.metadata.varyPath);if(null!==a)switch(a.status){case i.EntryStatus.Fulfilled:r=a.rsc,n=a.isPartial;break;case i.EntryStatus.Pending:r=(0,i.waitForSegmentCacheEntry)(a).then(e=>null!==e?e.rsc:null),n=a.isPartial;case i.EntryStatus.Empty:case i.EntryStatus.Rejected:}return{rsc:r,isPartial:n}}let v=["",{},null,"refetch"];async function b(e,t,r,n,a,i,s,c,d){let h;switch(s){case o.FreshnessPolicy.Default:case o.FreshnessPolicy.HistoryTraversal:h=i;break;case o.FreshnessPolicy.Hydration:case o.FreshnessPolicy.RefreshAll:case o.FreshnessPolicy.HMRRefresh:h=v;break;default:h=i}let y=(0,u.fetchServerResponse)(t,{flightRouterState:h,nextUrl:n}),g=await y;if("string"==typeof g)return{tag:f.NavigationResultTag.MPA,data:g};let{flightData:_,canonicalUrl:b,renderedSearch:R,debugInfo:E}=g;null!==E&&d.push(...E);let P=m(i,_,R);return p(e,t,(0,l.createHrefFromUrl)(b),P,r,a,i,s,n,c)}function m(e,t,r){let n=e,a=null,u=null;for(let{segmentPath:e,tree:r,seedData:o,head:l}of t){let t=function e(t,r,n,a,u,o){let l;if(o===u.length)return{tree:n,data:a};let i=u[o],s=t[1],c=null!==r?r[1]:null,f={},d={};for(let t in s){let r=s[t],l=null!==c?c[t]??null:null;if(t===i){let i=e(r,l,n,a,u,o+2);f[t]=i.tree,d[t]=i.data}else f[t]=r,d[t]=l}return l=[t[0],f],2 in t&&(l[2]=t[2]),3 in t&&(l[3]=t[3]),4 in t&&(l[4]=t[4]),{tree:l,data:[null,d,null,!0,!1]}}(n,a,r,o,e,0);n=t.tree,a=t.data,u=l}return{tree:n,data:a,renderedSearch:r,head:u}}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},28806,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={DYNAMIC_STALETIME_MS:function(){return f},STATIC_STALETIME_MS:function(){return d},generateSegmentsFromPatch:function(){return function e(t){let r=[],[n,a]=t;if(0===Object.keys(a).length)return[[n]];for(let[t,u]of Object.entries(a))for(let a of e(u))""===n?r.push([t,...a]):r.push([n,t,...a]);return r}},handleExternalUrl:function(){return p},handleNavigationResult:function(){return h},navigateReducer:function(){return y}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let u=e.r(80118),o=e.r(40494),l=e.r(94345),i=e.r(24994),s=e.r(91666),c=e.r(1989),f=1e3*Number("0"),d=(0,s.getStaleTimeMs)(Number("300"));function p(e,t,r,n){return t.mpaNavigation=!0,t.canonicalUrl=r,t.pendingPush=n,t.scrollableSegments=void 0,(0,o.handleMutable)(e,t)}function h(e,t,r,n,a){switch(a.tag){case i.NavigationResultTag.MPA:return p(t,r,a.data,n);case i.NavigationResultTag.Success:{r.cache=a.data.cacheNode,r.patchedTree=a.data.flightRouterState,r.renderedSearch=a.data.renderedSearch,r.canonicalUrl=a.data.canonicalUrl,r.scrollableSegments=a.data.scrollableSegments??void 0,r.shouldScroll=a.data.shouldScroll,r.hashFragment=a.data.hash;let n=new URL(t.canonicalUrl,e);return e.pathname===n.pathname&&e.search===n.search&&e.hash!==n.hash&&(r.onlyHashChange=!0,r.shouldScroll=a.data.shouldScroll,r.hashFragment=e.hash,r.scrollableSegments=[]),(0,o.handleMutable)(t,r)}case i.NavigationResultTag.Async:return a.data.then(a=>h(e,t,r,n,a),()=>t);default:return t}}function y(e,t){let{url:r,isExternalUrl:n,navigateType:a,shouldScroll:o}=t,i={},s=(0,u.createHrefFromUrl)(r),f="push"===a;if(i.preserveCustomHistoryState=!1,i.pendingPush=f,n)return p(e,i,r.toString(),f);if(document.getElementById("__next-page-redirect"))return p(e,i,s,f);let d=new URL(e.canonicalUrl,location.origin),y=(0,l.navigate)(r,d,e.cache,e.tree,e.nextUrl,c.FreshnessPolicy.Default,o,i);return h(r,e,i,f,y)}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},20017,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"hasInterceptionRouteInCurrentTree",{enumerable:!0,get:function(){return function e([t,r]){if(Array.isArray(t)&&("di(..)(..)"===t[2]||"ci(..)(..)"===t[2]||"di(.)"===t[2]||"ci(.)"===t[2]||"di(..)"===t[2]||"ci(..)"===t[2]||"di(...)"===t[2]||"ci(...)"===t[2])||"string"==typeof t&&(0,n.isInterceptionRouteAppPath)(t))return!0;if(r){for(let t in r)if(e(r[t]))return!0}return!1}}});let n=e.r(50864);("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},64324,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={refreshDynamicData:function(){return f},refreshReducer:function(){return c}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let u=e.r(28806),o=e.r(94345),l=e.r(91666),i=e.r(20017),s=e.r(1989);function c(e){let t=e.nextUrl,r=e.tree;return(0,l.revalidateEntireCache)(t,r),f(e,s.FreshnessPolicy.RefreshAll)}function f(e,t){let r=e.nextUrl,n=(0,i.hasInterceptionRouteInCurrentTree)(e.tree)?e.previousNextUrl||r:null,a=e.canonicalUrl,l=new URL(a,location.origin),s=e.tree,c={tree:e.tree,renderedSearch:e.renderedSearch,data:null,head:null},f=Date.now(),d=(0,o.navigateToSeededRoute)(f,l,a,c,l,e.cache,s,t,n,!0),p={};return p.preserveCustomHistoryState=!1,(0,u.handleNavigationResult)(l,e,p,!1,d)}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},76702,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"serverPatchReducer",{enumerable:!0,get:function(){return i}});let n=e.r(80118),a=e.r(28806),u=e.r(94345),o=e.r(64324),l=e.r(1989);function i(e,t){let r={};r.preserveCustomHistoryState=!1;let i=t.mpa,s=new URL(t.url,location.origin),c=t.seed;if(i||null===c)return(0,a.handleExternalUrl)(e,r,s.href,!1);let f=new URL(e.canonicalUrl,location.origin);if(t.previousTree!==e.tree)return(0,o.refreshReducer)(e);let d=(0,n.createHrefFromUrl)(s),p=t.nextUrl,h=Date.now(),y=(0,u.navigateToSeededRoute)(h,s,d,c,f,e.cache,e.tree,l.FreshnessPolicy.RefreshAll,p,!0);return(0,a.handleNavigationResult)(s,e,r,!1,y)}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},43746,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"restoreReducer",{enumerable:!0,get:function(){return l}});let n=e.r(80118),a=e.r(5725),u=e.r(1989),o=e.r(28806);function l(e,t){let r,l,i=t.historyState;i?(r=i.tree,l=i.renderedSearch):(r=e.tree,l=e.renderedSearch);let s=new URL(e.canonicalUrl,location.origin),c=t.url,f=(0,n.createHrefFromUrl)(c),d=(0,a.extractPathFromFlightRouterState)(r)??c.pathname,p=Date.now(),h={scrollableSegments:null,separateRefreshUrls:null},y=(0,u.startPPRNavigation)(p,s,e.cache,e.tree,r,u.FreshnessPolicy.HistoryTraversal,null,null,null,null,!1,!1,h);return null===y?(0,o.handleExternalUrl)(e,{preserveCustomHistoryState:!0},f,!1):((0,u.spawnDynamicRequests)(y,c,d,u.FreshnessPolicy.HistoryTraversal,h),{canonicalUrl:f,renderedSearch:l,pushRef:{pendingPush:!1,mpaNavigation:!1,preserveCustomHistoryState:!0},focusAndScrollRef:e.focusAndScrollRef,cache:y.node,tree:r,nextUrl:d,previousNextUrl:null,debugInfo:null})}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},1470,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"hmrRefreshReducer",{enumerable:!0,get:function(){return u}});let n=e.r(64324),a=e.r(1989);function u(e){return(0,n.refreshDynamicData)(e,a.FreshnessPolicy.HMRRefresh)}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},40288,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={UnrecognizedActionError:function(){return u},unstable_isUnrecognizedActionError:function(){return o}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});class u extends Error{constructor(...e){super(...e),this.name="UnrecognizedActionError"}}function o(e){return!!(e&&"object"==typeof e&&e instanceof u)}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},98454,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"assignLocation",{enumerable:!0,get:function(){return a}});let n=e.r(39940);function a(e,t){if(e.startsWith(".")){let r=t.origin+t.pathname;return new URL((r.endsWith("/")?r:r+"/")+e)}return new URL((0,n.addBasePath)(e),t.href)}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},39069,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"actionAsyncStorageInstance",{enumerable:!0,get:function(){return n}});let n=(0,e.r(24171).createAsyncLocalStorage)()},93988,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"actionAsyncStorage",{enumerable:!0,get:function(){return n.actionAsyncStorageInstance}});let n=e.r(39069)},44216,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={getRedirectError:function(){return i},getRedirectStatusCodeFromError:function(){return p},getRedirectTypeFromError:function(){return d},getURLFromRedirectError:function(){return f},permanentRedirect:function(){return c},redirect:function(){return s}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let u=e.r(91945),o=e.r(84628),l="u"{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"pathHasPrefix",{enumerable:!0,get:function(){return a}});let n=e.r(28732);function a(e,t){if("string"!=typeof e)return!1;let{pathname:r}=(0,n.parsePath)(e);return r===t||r.startsWith(t+"/")}},37023,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"hasBasePath",{enumerable:!0,get:function(){return a}});let n=e.r(36254);function a(e){return(0,n.pathHasPrefix)(e,"")}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},44351,(e,t,r)=>{"use strict";function n(e){return e}Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"removeBasePath",{enumerable:!0,get:function(){return n}}),e.r(37023),("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},17213,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={extractInfoFromServerReferenceId:function(){return u},omitUnusedArgs:function(){return o}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});function u(e){let t=parseInt(e.slice(0,2),16),r=t>>1&63,n=Array(6);for(let e=0;e<6;e++){let t=r>>5-e&1;n[e]=1===t}return{type:1==(t>>7&1)?"use-cache":"server-action",usedArgs:n,hasRestArgs:1==(1&t)}}function o(e,t){let r=Array(e.length);for(let n=0;n=6&&t.hasRestArgs)&&(r[n]=e[n]);return r}},45044,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={ActionDidNotRevalidate:function(){return u},ActionDidRevalidateDynamicOnly:function(){return l},ActionDidRevalidateStaticAndDynamic:function(){return o}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let u=0,o=1,l=2},92114,(e,t,r)=>{"use strict";let n;Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"serverActionReducer",{enumerable:!0,get:function(){return j}});let a=e.r(59295),u=e.r(85045),o=e.r(2089),l=e.r(40288),i=e.r(30545),s=e.r(98454),c=e.r(80118),f=e.r(28806),d=e.r(20017),p=e.r(94955),h=e.r(44216),y=e.r(84628),g=e.r(44351),_=e.r(37023),v=e.r(17213),b=e.r(91666),m=e.r(26159),R=e.r(94345),E=e.r(45044),P=e.r(93259),S=e.r(1989),O=i.createFromFetch;async function T(e,t,{actionId:r,actionArgs:c}){let f,d,h,g,_,b=(0,i.createTemporaryReferenceSet)(),R=(0,v.extractInfoFromServerReferenceId)(r),P="use-cache"===R.type?(0,v.omitUnusedArgs)(c,R):c,S=await (0,i.encodeReply)(P,{temporaryReferences:b}),T={Accept:o.RSC_CONTENT_TYPE_HEADER,[o.ACTION_HEADER]:r,[o.NEXT_ROUTER_STATE_TREE_HEADER]:(0,p.prepareFlightRouterStateForRequest)(e.tree)},j=(0,m.getDeploymentId)();j&&(T["x-deployment-id"]=j),t&&(T[o.NEXT_URL]=t);let w=await fetch(e.canonicalUrl,{method:"POST",headers:T,body:S});if("1"===w.headers.get(o.NEXT_ACTION_NOT_FOUND_HEADER))throw Object.defineProperty(new l.UnrecognizedActionError(`Server Action "${r}" was not found on the server. +Read more: https://nextjs.org/docs/messages/failed-to-find-server-action`),"__NEXT_ERROR_CODE",{value:"E715",enumerable:!1,configurable:!0});let A=w.headers.get("x-action-redirect"),[M,N]=A?.split(";")||[];switch(N){case"push":f=y.RedirectType.push;break;case"replace":f=y.RedirectType.replace;break;default:f=void 0}let D=!!w.headers.get(o.NEXT_IS_PRERENDER_HEADER),C=E.ActionDidNotRevalidate;try{let e=w.headers.get("x-action-revalidated");if(e){let t=JSON.parse(e);(t===E.ActionDidRevalidateStaticAndDynamic||t===E.ActionDidRevalidateDynamicOnly)&&(C=t)}}catch{}let x=M?(0,s.assignLocation)(M,new URL(e.canonicalUrl,window.location.href)):void 0,U=w.headers.get("content-type"),k=!!(U&&U.startsWith(o.RSC_CONTENT_TYPE_HEADER));if(!k&&!x)throw Object.defineProperty(Error(w.status>=400&&"text/plain"===U?await w.text():"An unexpected response was received from the server."),"__NEXT_ERROR_CODE",{value:"E394",enumerable:!1,configurable:!0});if(k){let e=await O(Promise.resolve(w),{callServer:a.callServer,findSourceMapURL:u.findSourceMapURL,temporaryReferences:b,debugChannel:n&&n(T)});d=x?void 0:e.a;let t=(0,p.normalizeFlightData)(e.f);""!==t&&(h=t,g=e.q,_=e.i)}else d=void 0,h=void 0,g=void 0,_=void 0;return{actionResult:d,actionFlightData:h,actionFlightDataRenderedSearch:g,actionFlightDataCouldBeIntercepted:_,redirectLocation:x,redirectType:f,revalidationKind:C,isPrerender:D}}function j(e,t){let{resolve:r,reject:n}=t,a={};a.preserveCustomHistoryState=!1;let u=(e.previousNextUrl||e.nextUrl)&&(0,d.hasInterceptionRouteInCurrentTree)(e.tree)?e.previousNextUrl||e.nextUrl:null;return T(e,u,t).then(async({revalidationKind:o,actionResult:l,actionFlightData:i,actionFlightDataRenderedSearch:s,actionFlightDataCouldBeIntercepted:d,redirectLocation:p,redirectType:h})=>{o!==E.ActionDidNotRevalidate&&(t.didRevalidate=!0,o===E.ActionDidRevalidateStaticAndDynamic&&(0,b.revalidateEntireCache)(u,e.tree));let v=h!==y.RedirectType.replace;if(e.pushRef.pendingPush=v,a.pendingPush=v,void 0!==p){let t=h||y.RedirectType.push;if((0,P.isExternalURL)(p)){let r=p.href;return n(w(r,t)),(0,f.handleExternalUrl)(e,a,r,v)}{let e=(0,c.createHrefFromUrl)(p,!1);n(w((0,_.hasBasePath)(e)?(0,g.removeBasePath)(e):e,t))}}else r(l);if(void 0===p&&o===E.ActionDidNotRevalidate&&void 0===i)return e;if(void 0===i&&void 0!==p)return(0,f.handleExternalUrl)(e,a,p.href,v);if("string"==typeof i)return(0,f.handleExternalUrl)(e,a,i,v);let m=new URL(e.canonicalUrl,location.origin),O=void 0!==p?p:m,T=e.tree,j=o===E.ActionDidNotRevalidate?S.FreshnessPolicy.Default:S.FreshnessPolicy.RefreshAll;if(void 0!==i){let t=i[0];if(void 0!==t&&t.isRootRender&&void 0!==s&&void 0!==d){let r=(0,c.createHrefFromUrl)(O),n={tree:t.tree,renderedSearch:s,data:t.seedData,head:t.head},o=Date.now(),l=(0,R.navigateToSeededRoute)(o,O,r,n,m,e.cache,T,j,u,!0);return(0,f.handleNavigationResult)(O,e,a,v,l)}}let A=(0,R.navigate)(O,m,e.cache,T,u,j,!0,a);return(0,f.handleNavigationResult)(O,e,a,v,A)},t=>(n(t),e))}function w(e,t){let r=(0,h.getRedirectError)(e,t);return r.handled=!0,r}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},42939,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"reducer",{enumerable:!0,get:function(){return c}});let n=e.r(98165),a=e.r(28806),u=e.r(76702),o=e.r(43746),l=e.r(64324),i=e.r(1470),s=e.r(92114),c="u"{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"prefetch",{enumerable:!0,get:function(){return l}});let n=e.r(93259),a=e.r(63280),u=e.r(40285),o=e.r(24994);function l(e,t,r,l,i){let s=(0,n.createPrefetchURL)(e);if(null===s)return;let c=(0,a.createCacheKey)(s.href,t);(0,u.schedulePrefetchTask)(c,r,l,o.PrefetchPriority.Default,i)}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},19998,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={createMutableActionQueue:function(){return v},dispatchNavigateAction:function(){return R},dispatchTraverseAction:function(){return E},getCurrentAppRouterState:function(){return b},publicAppRouterInstance:function(){return P}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let u=e.r(98165),o=e.r(42939),l=e.r(30668),i=e.r(65035),s=e.r(24994),c=e.r(19939),f=e.r(53128),d=e.r(39940),p=e.r(93259),h=e.r(79111);function y(e,t){null!==e.pending?(e.pending=e.pending.next,null!==e.pending&&g({actionQueue:e,action:e.pending,setState:t})):e.needsRefresh&&(e.needsRefresh=!1,e.dispatch({type:u.ACTION_REFRESH},t))}async function g({actionQueue:e,action:t,setState:r}){let n=e.state;e.pending=t;let a=t.payload,o=e.action(n,a);function l(n){if(t.discarded){t.payload.type===u.ACTION_SERVER_ACTION&&t.payload.didRevalidate&&(e.needsRefresh=!0),y(e,r);return}e.state=n,y(e,r),t.resolve(n)}(0,i.isThenable)(o)?o.then(l,n=>{y(e,r),t.reject(n)}):l(o)}let _=null;function v(e,t){let r={state:e,dispatch:(e,t)=>(function(e,t,r){let n={resolve:r,reject:()=>{}};if(t.type!==u.ACTION_RESTORE){let e=new Promise((e,t)=>{n={resolve:e,reject:t}});(0,l.startTransition)(()=>{r(e)})}let a={payload:t,next:null,resolve:n.resolve,reject:n.reject};null===e.pending?(e.last=a,g({actionQueue:e,action:a,setState:r})):t.type===u.ACTION_NAVIGATE||t.type===u.ACTION_RESTORE?(e.pending.discarded=!0,a.next=e.pending.next,g({actionQueue:e,action:a,setState:r})):(null!==e.last&&(e.last.next=a),e.last=a)})(r,e,t),action:async(e,t)=>(0,o.reducer)(e,t),pending:null,last:null,onRouterTransitionStart:null!==t&&"function"==typeof t.onRouterTransitionStart?t.onRouterTransitionStart:null};if("u">typeof window){if(null!==_)throw Object.defineProperty(Error("Internal Next.js Error: createMutableActionQueue was called more than once"),"__NEXT_ERROR_CODE",{value:"E624",enumerable:!1,configurable:!0});_=r}return r}function b(){return null!==_?_.state:null}function m(){return null!==_?_.onRouterTransitionStart:null}function R(e,t,r,n){let a=new URL((0,d.addBasePath)(e),location.href);(0,h.setLinkForCurrentNavigation)(n);let o=m();null!==o&&o(e,t),(0,f.dispatchAppRouterAction)({type:u.ACTION_NAVIGATE,url:a,isExternalUrl:(0,p.isExternalURL)(a),locationSearch:location.search,shouldScroll:r,navigateType:t})}function E(e,t){let r=m();null!==r&&r(e,"traverse"),(0,f.dispatchAppRouterAction)({type:u.ACTION_RESTORE,url:new URL(e),historyState:t})}let P={back:()=>window.history.back(),forward:()=>window.history.forward(),prefetch:(e,t)=>{let r,n=function(){if(null===_)throw Object.defineProperty(Error("Internal Next.js error: Router action dispatched before initialization."),"__NEXT_ERROR_CODE",{value:"E668",enumerable:!1,configurable:!0});return _}();switch(t?.kind??u.PrefetchKind.AUTO){case u.PrefetchKind.AUTO:r=s.FetchStrategy.PPR;break;case u.PrefetchKind.FULL:r=s.FetchStrategy.Full;break;default:r=s.FetchStrategy.PPR}(0,c.prefetch)(e,n.state.nextUrl,n.state.tree,r,t?.onInvalidate??null)},replace:(e,t)=>{(0,l.startTransition)(()=>{R(e,"replace",t?.scroll??!0,null)})},push:(e,t)=>{(0,l.startTransition)(()=>{R(e,"push",t?.scroll??!0,null)})},refresh:()=>{(0,l.startTransition)(()=>{(0,f.dispatchAppRouterAction)({type:u.ACTION_REFRESH})})},hmrRefresh:()=>{throw Object.defineProperty(Error("hmrRefresh can only be used in development mode. Please use refresh instead."),"__NEXT_ERROR_CODE",{value:"E485",enumerable:!1,configurable:!0})}};"u">typeof window&&window.next&&(window.next.router=P),("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},45243,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={AppRouterContext:function(){return o},GlobalLayoutRouterContext:function(){return i},LayoutRouterContext:function(){return l},MissingSlotContext:function(){return c},TemplateContext:function(){return s}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let u=e.r(35856)._(e.r(30668)),o=u.default.createContext(null),l=u.default.createContext(null),i=u.default.createContext(null),s=u.default.createContext(null),c=u.default.createContext(new Set)},98680,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={ServerInsertedHTMLContext:function(){return o},useServerInsertedHTML:function(){return l}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let u=e.r(61909)._(e.r(30668)),o=u.default.createContext(null);function l(e){let t=(0,u.useContext)(o);t&&t(e)}},48918,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"notFound",{enumerable:!0,get:function(){return u}});let n=e.r(88112),a=`${n.HTTP_ERROR_FALLBACK_ERROR_CODE};404`;function u(){let e=Object.defineProperty(Error(a),"__NEXT_ERROR_CODE",{value:"E394",enumerable:!1,configurable:!0});throw e.digest=a,e}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},92881,(e,t,r)=>{"use strict";function n(){throw Object.defineProperty(Error("`forbidden()` is experimental and only allowed to be enabled when `experimental.authInterrupts` is enabled."),"__NEXT_ERROR_CODE",{value:"E488",enumerable:!1,configurable:!0})}Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"forbidden",{enumerable:!0,get:function(){return n}}),e.r(88112).HTTP_ERROR_FALLBACK_ERROR_CODE,("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},24673,(e,t,r)=>{"use strict";function n(){throw Object.defineProperty(Error("`unauthorized()` is experimental and only allowed to be used when `experimental.authInterrupts` is enabled."),"__NEXT_ERROR_CODE",{value:"E411",enumerable:!1,configurable:!0})}Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"unauthorized",{enumerable:!0,get:function(){return n}}),e.r(88112).HTTP_ERROR_FALLBACK_ERROR_CODE,("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},33517,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"unstable_rethrow",{enumerable:!0,get:function(){return function e(t){if((0,a.isNextRouterError)(t)||(0,n.isBailoutToCSRError)(t))throw t;t instanceof Error&&"cause"in t&&e(t.cause)}}});let n=e.r(19551),a=e.r(31028);("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},64265,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={isHangingPromiseRejectionError:function(){return u},makeDevtoolsIOAwarePromise:function(){return f},makeHangingPromise:function(){return s}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});function u(e){return"object"==typeof e&&null!==e&&"digest"in e&&e.digest===o}let o="HANGING_PROMISE_REJECTION";class l extends Error{constructor(e,t){super(`During prerendering, ${t} rejects when the prerender is complete. Typically these errors are handled by React but if you move ${t} to a different context by using \`setTimeout\`, \`after\`, or similar functions you may observe this error and you should handle it in that context. This occurred at route "${e}".`),this.route=e,this.expression=t,this.digest=o}}let i=new WeakMap;function s(e,t,r){if(e.aborted)return Promise.reject(new l(t,r));{let n=new Promise((n,a)=>{let u=a.bind(null,new l(t,r)),o=i.get(e);if(o)o.push(u);else{let t=[u];i.set(e,t),e.addEventListener("abort",()=>{for(let e=0;e{setTimeout(()=>{t(e)},0)})}},67867,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"isPostpone",{enumerable:!0,get:function(){return a}});let n=Symbol.for("react.postpone");function a(e){return"object"==typeof e&&null!==e&&e.$$typeof===n}},61541,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={DynamicServerError:function(){return o},isDynamicServerError:function(){return l}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let u="DYNAMIC_SERVER_USAGE";class o extends Error{constructor(e){super(`Dynamic server usage: ${e}`),this.description=e,this.digest=u}}function l(e){return"object"==typeof e&&null!==e&&"digest"in e&&"string"==typeof e.digest&&e.digest===u}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},16819,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={StaticGenBailoutError:function(){return o},isStaticGenBailoutError:function(){return l}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let u="NEXT_STATIC_GEN_BAILOUT";class o extends Error{constructor(...e){super(...e),this.code=u}}function l(e){return"object"==typeof e&&null!==e&&"code"in e&&e.code===u}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},66251,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={METADATA_BOUNDARY_NAME:function(){return u},OUTLET_BOUNDARY_NAME:function(){return l},ROOT_LAYOUT_BOUNDARY_NAME:function(){return i},VIEWPORT_BOUNDARY_NAME:function(){return o}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let u="__next_metadata_boundary__",o="__next_viewport_boundary__",l="__next_outlet_boundary__",i="__next_root_layout_boundary__"},25992,(e,t,r)=>{"use strict";var n=e.i(39057);Object.defineProperty(r,"__esModule",{value:!0});var a={atLeastOneTask:function(){return i},scheduleImmediate:function(){return l},scheduleOnNextTick:function(){return o},waitAtLeastOneReactRenderTask:function(){return s}};for(var u in a)Object.defineProperty(r,u,{enumerable:!0,get:a[u]});let o=e=>{Promise.resolve().then(()=>{n.default.nextTick(e)})},l=e=>{setImmediate(e)};function i(){return new Promise(e=>l(e))}function s(){return new Promise(e=>setImmediate(e))}},93869,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n,a,u={Postpone:function(){return j},PreludeState:function(){return J},abortAndThrowOnSynchronousRequestDataAccess:function(){return T},abortOnSynchronousPlatformIOAccess:function(){return O},accessedDynamicData:function(){return U},annotateDynamicAccess:function(){return H},consumeDynamicAccess:function(){return k},createDynamicTrackingState:function(){return v},createDynamicValidationState:function(){return b},createHangingInputAbortSignal:function(){return L},createRenderInBrowserAbortSignal:function(){return F},delayUntilRuntimeStage:function(){return er},formatDynamicAPIAccesses:function(){return I},getFirstDynamicReason:function(){return m},getStaticShellDisallowedDynamicReasons:function(){return et},isDynamicPostpone:function(){return M},isPrerenderInterruptedError:function(){return x},logDisallowedDynamicError:function(){return Z},markCurrentScopeAsDynamic:function(){return R},postponeWithTracking:function(){return w},throwIfDisallowedDynamic:function(){return ee},throwToInterruptStaticGeneration:function(){return E},trackAllowedDynamicAccess:function(){return G},trackDynamicDataInDynamicRender:function(){return P},trackDynamicHoleInRuntimeShell:function(){return Y},trackDynamicHoleInStaticShell:function(){return z},useDynamicRouteParams:function(){return $},useDynamicSearchParams:function(){return B}};for(var o in u)Object.defineProperty(r,o,{enumerable:!0,get:u[o]});let l=(n=e.r(30668))&&n.__esModule?n:{default:n},i=e.r(61541),s=e.r(16819),c=e.r(63416),f=e.r(26628),d=e.r(64265),p=e.r(66251),h=e.r(25992),y=e.r(19551),g=e.r(84524),_="function"==typeof l.default.unstable_postpone;function v(e){return{isDebugDynamicAccesses:e,dynamicAccesses:[],syncDynamicErrorWithStack:null}}function b(){return{hasSuspenseAboveBody:!1,hasDynamicMetadata:!1,dynamicMetadata:null,hasDynamicViewport:!1,hasAllowedDynamic:!1,dynamicErrors:[]}}function m(e){var t;return null==(t=e.dynamicAccesses[0])?void 0:t.expression}function R(e,t,r){if(t)switch(t.type){case"cache":case"unstable-cache":case"private-cache":return}if(!e.forceDynamic&&!e.forceStatic){if(e.dynamicShouldError)throw Object.defineProperty(new s.StaticGenBailoutError(`Route ${e.route} with \`dynamic = "error"\` couldn't be rendered statically because it used \`${r}\`. See more info here: https://nextjs.org/docs/app/building-your-application/rendering/static-and-dynamic#dynamic-rendering`),"__NEXT_ERROR_CODE",{value:"E553",enumerable:!1,configurable:!0});if(t)switch(t.type){case"prerender-ppr":return w(e.route,r,t.dynamicTracking);case"prerender-legacy":t.revalidate=0;let n=Object.defineProperty(new i.DynamicServerError(`Route ${e.route} couldn't be rendered statically because it used ${r}. See more info here: https://nextjs.org/docs/messages/dynamic-server-error`),"__NEXT_ERROR_CODE",{value:"E550",enumerable:!1,configurable:!0});throw e.dynamicUsageDescription=r,e.dynamicUsageStack=n.stack,n}}}function E(e,t,r){let n=Object.defineProperty(new i.DynamicServerError(`Route ${t.route} couldn't be rendered statically because it used \`${e}\`. See more info here: https://nextjs.org/docs/messages/dynamic-server-error`),"__NEXT_ERROR_CODE",{value:"E558",enumerable:!1,configurable:!0});throw r.revalidate=0,t.dynamicUsageDescription=e,t.dynamicUsageStack=n.stack,n}function P(e){switch(e.type){case"cache":case"unstable-cache":case"private-cache":return}}function S(e,t,r){let n=C(`Route ${e} needs to bail out of prerendering at this point because it used ${t}.`);r.controller.abort(n);let a=r.dynamicTracking;a&&a.dynamicAccesses.push({stack:a.isDebugDynamicAccesses?Error().stack:void 0,expression:t})}function O(e,t,r,n){let a=n.dynamicTracking;S(e,t,n),a&&null===a.syncDynamicErrorWithStack&&(a.syncDynamicErrorWithStack=r)}function T(e,t,r,n){if(!1===n.controller.signal.aborted){S(e,t,n);let a=n.dynamicTracking;a&&null===a.syncDynamicErrorWithStack&&(a.syncDynamicErrorWithStack=r)}throw C(`Route ${e} needs to bail out of prerendering at this point because it used ${t}.`)}function j({reason:e,route:t}){let r=c.workUnitAsyncStorage.getStore();w(t,e,r&&"prerender-ppr"===r.type?r.dynamicTracking:null)}function w(e,t,r){(function(){if(!_)throw Object.defineProperty(Error("Invariant: React.unstable_postpone is not defined. This suggests the wrong version of React was loaded. This is a bug in Next.js"),"__NEXT_ERROR_CODE",{value:"E224",enumerable:!1,configurable:!0})})(),r&&r.dynamicAccesses.push({stack:r.isDebugDynamicAccesses?Error().stack:void 0,expression:t}),l.default.unstable_postpone(A(e,t))}function A(e,t){return`Route ${e} needs to bail out of prerendering at this point because it used ${t}. React throws this special object to indicate where. It should not be caught by your own try/catch. Learn more: https://nextjs.org/docs/messages/ppr-caught-error`}function M(e){return"object"==typeof e&&null!==e&&"string"==typeof e.message&&N(e.message)}function N(e){return e.includes("needs to bail out of prerendering at this point because it used")&&e.includes("Learn more: https://nextjs.org/docs/messages/ppr-caught-error")}if(!1===N(A("%%%","^^^")))throw Object.defineProperty(Error("Invariant: isDynamicPostpone misidentified a postpone reason. This is a bug in Next.js"),"__NEXT_ERROR_CODE",{value:"E296",enumerable:!1,configurable:!0});let D="NEXT_PRERENDER_INTERRUPTED";function C(e){let t=Object.defineProperty(Error(e),"__NEXT_ERROR_CODE",{value:"E394",enumerable:!1,configurable:!0});return t.digest=D,t}function x(e){return"object"==typeof e&&null!==e&&e.digest===D&&"name"in e&&"message"in e&&e instanceof Error}function U(e){return e.length>0}function k(e,t){return e.dynamicAccesses.push(...t.dynamicAccesses),e.dynamicAccesses}function I(e){return e.filter(e=>"string"==typeof e.stack&&e.stack.length>0).map(({expression:e,stack:t})=>(t=t.split("\n").slice(4).filter(e=>!(e.includes("node_modules/next/")||e.includes(" ()")||e.includes(" (node:"))).join("\n"),`Dynamic API Usage Debug - ${e}: +${t}`))}function F(){let e=new AbortController;return e.abort(Object.defineProperty(new y.BailoutToCSRError("Render in Browser"),"__NEXT_ERROR_CODE",{value:"E721",enumerable:!1,configurable:!0})),e.signal}function L(e){switch(e.type){case"prerender":case"prerender-runtime":let t=new AbortController;if(e.cacheSignal)e.cacheSignal.inputReady().then(()=>{t.abort()});else{let r=(0,c.getRuntimeStagePromise)(e);r?r.then(()=>(0,h.scheduleOnNextTick)(()=>t.abort())):(0,h.scheduleOnNextTick)(()=>t.abort())}return t.signal;case"prerender-client":case"prerender-ppr":case"prerender-legacy":case"request":case"cache":case"private-cache":case"unstable-cache":return}}function H(e,t){let r=t.dynamicTracking;r&&r.dynamicAccesses.push({stack:r.isDebugDynamicAccesses?Error().stack:void 0,expression:e})}function $(e){let t=f.workAsyncStorage.getStore(),r=c.workUnitAsyncStorage.getStore();if(t&&r)switch(r.type){case"prerender-client":case"prerender":{let n=r.fallbackRouteParams;n&&n.size>0&&l.default.use((0,d.makeHangingPromise)(r.renderSignal,t.route,e));break}case"prerender-ppr":{let n=r.fallbackRouteParams;if(n&&n.size>0)return w(t.route,e,r.dynamicTracking);break}case"prerender-runtime":throw Object.defineProperty(new g.InvariantError(`\`${e}\` was called during a runtime prerender. Next.js should be preventing ${e} from being included in server components statically, but did not in this case.`),"__NEXT_ERROR_CODE",{value:"E771",enumerable:!1,configurable:!0});case"cache":case"private-cache":throw Object.defineProperty(new g.InvariantError(`\`${e}\` was called inside a cache scope. Next.js should be preventing ${e} from being included in server components statically, but did not in this case.`),"__NEXT_ERROR_CODE",{value:"E745",enumerable:!1,configurable:!0})}}function B(e){let t=f.workAsyncStorage.getStore(),r=c.workUnitAsyncStorage.getStore();if(t)switch(!r&&(0,c.throwForMissingRequestStore)(e),r.type){case"prerender-client":l.default.use((0,d.makeHangingPromise)(r.renderSignal,t.route,e));break;case"prerender-legacy":case"prerender-ppr":if(t.forceStatic)return;throw Object.defineProperty(new y.BailoutToCSRError(e),"__NEXT_ERROR_CODE",{value:"E394",enumerable:!1,configurable:!0});case"prerender":case"prerender-runtime":throw Object.defineProperty(new g.InvariantError(`\`${e}\` was called from a Server Component. Next.js should be preventing ${e} from being included in server components statically, but did not in this case.`),"__NEXT_ERROR_CODE",{value:"E795",enumerable:!1,configurable:!0});case"cache":case"unstable-cache":case"private-cache":throw Object.defineProperty(new g.InvariantError(`\`${e}\` was called inside a cache scope. Next.js should be preventing ${e} from being included in server components statically, but did not in this case.`),"__NEXT_ERROR_CODE",{value:"E745",enumerable:!1,configurable:!0});case"request":return}}let X=/\n\s+at Suspense \(\)/,q=RegExp(`\\n\\s+at Suspense \\(\\)(?:(?!\\n\\s+at (?:body|div|main|section|article|aside|header|footer|nav|form|p|span|h1|h2|h3|h4|h5|h6) \\(\\))[\\s\\S])*?\\n\\s+at ${p.ROOT_LAYOUT_BOUNDARY_NAME} \\([^\\n]*\\)`),W=RegExp(`\\n\\s+at ${p.METADATA_BOUNDARY_NAME}[\\n\\s]`),K=RegExp(`\\n\\s+at ${p.VIEWPORT_BOUNDARY_NAME}[\\n\\s]`),V=RegExp(`\\n\\s+at ${p.OUTLET_BOUNDARY_NAME}[\\n\\s]`);function G(e,t,r,n){if(!V.test(t)){if(W.test(t)){r.hasDynamicMetadata=!0;return}if(K.test(t)){r.hasDynamicViewport=!0;return}if(q.test(t)){r.hasAllowedDynamic=!0,r.hasSuspenseAboveBody=!0;return}else if(X.test(t)){r.hasAllowedDynamic=!0;return}else{if(n.syncDynamicErrorWithStack)return void r.dynamicErrors.push(n.syncDynamicErrorWithStack);let a=Q(`Route "${e.route}": Uncached data was accessed outside of . This delays the entire page from rendering, resulting in a slow user experience. Learn more: https://nextjs.org/docs/messages/blocking-route`,t);return void r.dynamicErrors.push(a)}}}function Y(e,t,r,n){if(!V.test(t)){if(W.test(t)){r.dynamicMetadata=Q(`Route "${e.route}": Uncached data or \`connection()\` was accessed inside \`generateMetadata\`. Except for this instance, the page would have been entirely prerenderable which may have been the intended behavior. See more info here: https://nextjs.org/docs/messages/next-prerender-dynamic-metadata`,t);return}if(K.test(t)){let n=Q(`Route "${e.route}": Uncached data or \`connection()\` was accessed inside \`generateViewport\`. This delays the entire page from rendering, resulting in a slow user experience. Learn more: https://nextjs.org/docs/messages/next-prerender-dynamic-viewport`,t);r.dynamicErrors.push(n);return}if(q.test(t)){r.hasAllowedDynamic=!0,r.hasSuspenseAboveBody=!0;return}else if(X.test(t)){r.hasAllowedDynamic=!0;return}else{if(n.syncDynamicErrorWithStack)return void r.dynamicErrors.push(n.syncDynamicErrorWithStack);let a=Q(`Route "${e.route}": Uncached data or \`connection()\` was accessed outside of \`\`. This delays the entire page from rendering, resulting in a slow user experience. Learn more: https://nextjs.org/docs/messages/blocking-route`,t);return void r.dynamicErrors.push(a)}}}function z(e,t,r,n){if(!V.test(t)){if(W.test(t)){r.dynamicMetadata=Q(`Route "${e.route}": Runtime data such as \`cookies()\`, \`headers()\`, \`params\`, or \`searchParams\` was accessed inside \`generateMetadata\` or you have file-based metadata such as icons that depend on dynamic params segments. Except for this instance, the page would have been entirely prerenderable which may have been the intended behavior. See more info here: https://nextjs.org/docs/messages/next-prerender-dynamic-metadata`,t);return}if(K.test(t)){let n=Q(`Route "${e.route}": Runtime data such as \`cookies()\`, \`headers()\`, \`params\`, or \`searchParams\` was accessed inside \`generateViewport\`. This delays the entire page from rendering, resulting in a slow user experience. Learn more: https://nextjs.org/docs/messages/next-prerender-dynamic-viewport`,t);r.dynamicErrors.push(n);return}if(q.test(t)){r.hasAllowedDynamic=!0,r.hasSuspenseAboveBody=!0;return}else if(X.test(t)){r.hasAllowedDynamic=!0;return}else{if(n.syncDynamicErrorWithStack)return void r.dynamicErrors.push(n.syncDynamicErrorWithStack);let a=Q(`Route "${e.route}": Runtime data such as \`cookies()\`, \`headers()\`, \`params\`, or \`searchParams\` was accessed outside of \`\`. This delays the entire page from rendering, resulting in a slow user experience. Learn more: https://nextjs.org/docs/messages/blocking-route`,t);return void r.dynamicErrors.push(a)}}}function Q(e,t){let r=Object.defineProperty(Error(e),"__NEXT_ERROR_CODE",{value:"E394",enumerable:!1,configurable:!0});return r.stack=r.name+": "+e+t,r}var J=((a={})[a.Full=0]="Full",a[a.Empty=1]="Empty",a[a.Errored=2]="Errored",a);function Z(e,t){console.error(t),e.dev||(e.hasReadableErrorStacks?console.error(`To get a more detailed stack trace and pinpoint the issue, start the app in development mode by running \`next dev\`, then open "${e.route}" in your browser to investigate the error.`):console.error(`To get a more detailed stack trace and pinpoint the issue, try one of the following: + - Start the app in development mode by running \`next dev\`, then open "${e.route}" in your browser to investigate the error. + - Rerun the production build with \`next build --debug-prerender\` to generate better stack traces.`))}function ee(e,t,r,n){if(n.syncDynamicErrorWithStack)throw Z(e,n.syncDynamicErrorWithStack),new s.StaticGenBailoutError;if(0!==t){if(r.hasSuspenseAboveBody)return;let n=r.dynamicErrors;if(n.length>0){for(let t=0;t0)return n;if(1===t)return[Object.defineProperty(new g.InvariantError(`Route "${e.route}" did not produce a static shell and Next.js was unable to determine a reason.`),"__NEXT_ERROR_CODE",{value:"E936",enumerable:!1,configurable:!0})]}else if(!1===r.hasAllowedDynamic&&0===r.dynamicErrors.length&&r.dynamicMetadata)return[r.dynamicMetadata];return[]}function er(e,t){return e.runtimeStagePromise?e.runtimeStagePromise.then(()=>t):t}},57617,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"unstable_rethrow",{enumerable:!0,get:function(){return function e(t){if((0,o.isNextRouterError)(t)||(0,u.isBailoutToCSRError)(t)||(0,i.isDynamicServerError)(t)||(0,l.isDynamicPostpone)(t)||(0,a.isPostpone)(t)||(0,n.isHangingPromiseRejectionError)(t)||(0,l.isPrerenderInterruptedError)(t))throw t;t instanceof Error&&"cause"in t&&e(t.cause)}}});let n=e.r(64265),a=e.r(67867),u=e.r(19551),o=e.r(31028),l=e.r(93869),i=e.r(61541);("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},60516,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"unstable_rethrow",{enumerable:!0,get:function(){return n}});let n="u"{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={ReadonlyURLSearchParams:function(){return u.ReadonlyURLSearchParams},RedirectType:function(){return l.RedirectType},forbidden:function(){return s.forbidden},notFound:function(){return i.notFound},permanentRedirect:function(){return o.permanentRedirect},redirect:function(){return o.redirect},unauthorized:function(){return c.unauthorized},unstable_isUnrecognizedActionError:function(){return d},unstable_rethrow:function(){return f.unstable_rethrow}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let u=e.r(13058),o=e.r(44216),l=e.r(84628),i=e.r(48918),s=e.r(92881),c=e.r(24673),f=e.r(60516);function d(){throw Object.defineProperty(Error("`unstable_isUnrecognizedActionError` can only be used on the client."),"__NEXT_ERROR_CODE",{value:"E776",enumerable:!1,configurable:!0})}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},9187,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={ReadonlyURLSearchParams:function(){return l.ReadonlyURLSearchParams},RedirectType:function(){return f.RedirectType},ServerInsertedHTMLContext:function(){return s.ServerInsertedHTMLContext},forbidden:function(){return f.forbidden},notFound:function(){return f.notFound},permanentRedirect:function(){return f.permanentRedirect},redirect:function(){return f.redirect},unauthorized:function(){return f.unauthorized},unstable_isUnrecognizedActionError:function(){return c.unstable_isUnrecognizedActionError},unstable_rethrow:function(){return f.unstable_rethrow},useParams:function(){return _},usePathname:function(){return y},useRouter:function(){return g},useSearchParams:function(){return h},useSelectedLayoutSegment:function(){return b},useSelectedLayoutSegments:function(){return v},useServerInsertedHTML:function(){return s.useServerInsertedHTML}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let u=e.r(61909)._(e.r(30668)),o=e.r(45243),l=e.r(69370),i=e.r(91395),s=e.r(98680),c=e.r(40288),f=e.r(8e3),d="u"e?new l.ReadonlyURLSearchParams(e):null,[e])}function y(){return d?.("usePathname()"),(0,u.useContext)(l.PathnameContext)}function g(){let e=(0,u.useContext)(o.AppRouterContext);if(null===e)throw Object.defineProperty(Error("invariant expected app router to be mounted"),"__NEXT_ERROR_CODE",{value:"E238",enumerable:!1,configurable:!0});return e}function _(){return d?.("useParams()"),(0,u.useContext)(l.PathParamsContext)}function v(e="children"){d?.("useSelectedLayoutSegments()");let t=(0,u.useContext)(o.LayoutRouterContext);return t?(0,i.getSelectedLayoutSegmentPath)(t.parentTree,e):null}function b(e="children"){d?.("useSelectedLayoutSegment()"),(0,u.useContext)(l.NavigationPromisesContext);let t=v(e);return(0,i.computeSelectedLayoutSegment)(t,e)}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},2188,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={RedirectBoundary:function(){return p},RedirectErrorBoundary:function(){return d}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let u=e.r(61909),o=e.r(48277),l=u._(e.r(30668)),i=e.r(9187),s=e.r(44216),c=e.r(84628);function f({redirect:e,reset:t,redirectType:r}){let n=(0,i.useRouter)();return(0,l.useEffect)(()=>{l.default.startTransition(()=>{r===c.RedirectType.push?n.push(e,{}):n.replace(e,{}),t()})},[e,r,t,n]),null}class d extends l.default.Component{constructor(e){super(e),this.state={redirect:null,redirectType:null}}static getDerivedStateFromError(e){if((0,c.isRedirectError)(e)){let t=(0,s.getURLFromRedirectError)(e),r=(0,s.getRedirectTypeFromError)(e);return"handled"in e?{redirect:null,redirectType:null}:{redirect:t,redirectType:r}}throw e}render(){let{redirect:e,redirectType:t}=this.state;return null!==e&&null!==t?(0,o.jsx)(f,{redirect:e,redirectType:t,reset:()=>this.setState({redirect:null})}):this.props.children}}function p({children:e}){let t=(0,i.useRouter)();return(0,o.jsx)(d,{router:t,children:e})}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},83648,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"unresolvedThenable",{enumerable:!0,get:function(){return n}});let n={then:()=>{}};("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},64381,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={MetadataBoundary:function(){return l},OutletBoundary:function(){return s},RootLayoutBoundary:function(){return c},ViewportBoundary:function(){return i}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let u=e.r(66251),o={[u.METADATA_BOUNDARY_NAME]:function({children:e}){return e},[u.VIEWPORT_BOUNDARY_NAME]:function({children:e}){return e},[u.OUTLET_BOUNDARY_NAME]:function({children:e}){return e},[u.ROOT_LAYOUT_BOUNDARY_NAME]:function({children:e}){return e}},l=o[u.METADATA_BOUNDARY_NAME.slice(0)],i=o[u.VIEWPORT_BOUNDARY_NAME.slice(0)],s=o[u.OUTLET_BOUNDARY_NAME.slice(0)],c=o[u.ROOT_LAYOUT_BOUNDARY_NAME.slice(0)]}]); \ No newline at end of file diff --git a/vendor/hyperview/server/static/_next/static/chunks/86c1fc4cf542f408.js b/vendor/hyperview/server/static/_next/static/chunks/86c1fc4cf542f408.js new file mode 100644 index 0000000000000000000000000000000000000000..cf35f41af7ce1b2ba08dbb11baeb306fe1d92ff0 --- /dev/null +++ b/vendor/hyperview/server/static/_next/static/chunks/86c1fc4cf542f408.js @@ -0,0 +1 @@ +(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,75115,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"default",{enumerable:!0,get:function(){return s}});let n=e.r(48277),o=e.r(86846),i={fontFamily:'system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji"',height:"100vh",textAlign:"center",display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center"},u={fontSize:"14px",fontWeight:400,lineHeight:"28px",margin:"0 8px"},s=function({error:e}){let t=e?.digest;return(0,n.jsxs)("html",{id:"__next_error__",children:[(0,n.jsx)("head",{}),(0,n.jsxs)("body",{children:[(0,n.jsx)(o.HandleISRError,{error:e}),(0,n.jsx)("div",{style:i,children:(0,n.jsxs)("div",{children:[(0,n.jsxs)("h2",{style:u,children:["Application error: a ",t?"server":"client","-side exception has occurred while loading ",window.location.hostname," (see the"," ",t?"server logs":"browser console"," for more information)."]}),t?(0,n.jsx)("p",{style:u,children:`Digest: ${t}`}):null]})})]})]})};("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},90175,(e,t,r)=>{var n={229:function(e){var t,r,n,o=e.exports={};function i(){throw Error("setTimeout has not been defined")}function u(){throw Error("clearTimeout has not been defined")}try{t="function"==typeof setTimeout?setTimeout:i}catch(e){t=i}try{r="function"==typeof clearTimeout?clearTimeout:u}catch(e){r=u}function s(e){if(t===setTimeout)return setTimeout(e,0);if((t===i||!t)&&setTimeout)return t=setTimeout,setTimeout(e,0);try{return t(e,0)}catch(r){try{return t.call(null,e,0)}catch(r){return t.call(this,e,0)}}}var c=[],a=!1,l=-1;function f(){a&&n&&(a=!1,n.length?c=n.concat(c):l=-1,c.length&&p())}function p(){if(!a){var e=s(f);a=!0;for(var t=c.length;t;){for(n=c,c=[];++l1)for(var r=1;r{"use strict";var n,o;t.exports=(null==(n=e.g.process)?void 0:n.env)&&"object"==typeof(null==(o=e.g.process)?void 0:o.env)?e.g.process:e.r(90175)},14871,(e,t,r)=>{"use strict";var n=Symbol.for("react.transitional.element");function o(e,t,r){var o=null;if(void 0!==r&&(o=""+r),void 0!==t.key&&(o=""+t.key),"key"in t)for(var i in r={},t)"key"!==i&&(r[i]=t[i]);else r=t;return{$$typeof:n,type:e,key:o,ref:void 0!==(t=r.ref)?t:null,props:r}}r.Fragment=Symbol.for("react.fragment"),r.jsx=o,r.jsxs=o},48277,(e,t,r)=>{"use strict";t.exports=e.r(14871)},24171,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={bindSnapshot:function(){return a},createAsyncLocalStorage:function(){return c},createSnapshot:function(){return l}};for(var o in n)Object.defineProperty(r,o,{enumerable:!0,get:n[o]});let i=Object.defineProperty(Error("Invariant: AsyncLocalStorage accessed in runtime where it is not available"),"__NEXT_ERROR_CODE",{value:"E504",enumerable:!1,configurable:!0});class u{disable(){throw i}getStore(){}run(){throw i}exit(){throw i}enterWith(){throw i}static bind(e){return e}}let s="u">typeof globalThis&&globalThis.AsyncLocalStorage;function c(){return s?new s:new u}function a(e){return s?s.bind(e):u.bind(e)}function l(){return s?s.snapshot():function(e,...t){return e(...t)}}},98616,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"workAsyncStorageInstance",{enumerable:!0,get:function(){return n}});let n=(0,e.r(24171).createAsyncLocalStorage)()},26628,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"workAsyncStorage",{enumerable:!0,get:function(){return n.workAsyncStorageInstance}});let n=e.r(98616)},86846,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"HandleISRError",{enumerable:!0,get:function(){return o}});let n="u"{"use strict";var n=e.i(39057),o=Symbol.for("react.transitional.element"),i=Symbol.for("react.portal"),u=Symbol.for("react.fragment"),s=Symbol.for("react.strict_mode"),c=Symbol.for("react.profiler"),a=Symbol.for("react.consumer"),l=Symbol.for("react.context"),f=Symbol.for("react.forward_ref"),p=Symbol.for("react.suspense"),d=Symbol.for("react.memo"),y=Symbol.for("react.lazy"),h=Symbol.for("react.activity"),g=Symbol.for("react.view_transition"),v=Symbol.iterator,_={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},m=Object.assign,b={};function S(e,t,r){this.props=e,this.context=t,this.refs=b,this.updater=r||_}function O(){}function E(e,t,r){this.props=e,this.context=t,this.refs=b,this.updater=r||_}S.prototype.isReactComponent={},S.prototype.setState=function(e,t){if("object"!=typeof e&&"function"!=typeof e&&null!=e)throw Error("takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,e,t,"setState")},S.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")},O.prototype=S.prototype;var T=E.prototype=new O;T.constructor=E,m(T,S.prototype),T.isPureReactComponent=!0;var w=Array.isArray;function j(){}var R={H:null,A:null,T:null,S:null},x=Object.prototype.hasOwnProperty;function A(e,t,r){var n=r.ref;return{$$typeof:o,type:e,key:t,ref:void 0!==n?n:null,props:r}}function P(e){return"object"==typeof e&&null!==e&&e.$$typeof===o}var C=/\/+/g;function k(e,t){var r,n;return"object"==typeof e&&null!==e&&null!=e.key?(r=""+e.key,n={"=":"=0",":":"=2"},"$"+r.replace(/[=:]/g,function(e){return n[e]})):t.toString(36)}function H(e,t,r){if(null==e)return e;var n=[],u=0;return!function e(t,r,n,u,s){var c,a,l,f=typeof t;("undefined"===f||"boolean"===f)&&(t=null);var p=!1;if(null===t)p=!0;else switch(f){case"bigint":case"string":case"number":p=!0;break;case"object":switch(t.$$typeof){case o:case i:p=!0;break;case y:return e((p=t._init)(t._payload),r,n,u,s)}}if(p)return s=s(t),p=""===u?"."+k(t,0):u,w(s)?(n="",null!=p&&(n=p.replace(C,"$&/")+"/"),e(s,r,n,"",function(e){return e})):null!=s&&(P(s)&&(c=s,a=n+(null==s.key||t&&t.key===s.key?"":(""+s.key).replace(C,"$&/")+"/")+p,s=A(c.type,a,c.props)),r.push(s)),1;p=0;var d=""===u?".":u+":";if(w(t))for(var h=0;h{"use strict";t.exports=e.r(42124)},15501,(e,t,r)=>{"use strict";var n=e.r(30668);function o(e){var t="https://react.dev/errors/"+e;if(1{"use strict";!function e(){if("u">typeof __REACT_DEVTOOLS_GLOBAL_HOOK__&&"function"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE)try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(e)}catch(e){console.error(e)}}(),t.exports=e.r(15501)}]); \ No newline at end of file diff --git a/vendor/hyperview/server/static/_next/static/chunks/8d5a2ef3447cb3ee.js b/vendor/hyperview/server/static/_next/static/chunks/8d5a2ef3447cb3ee.js new file mode 100644 index 0000000000000000000000000000000000000000..2f8226504f05fe397d3ddb4dfec6179030a3c6f3 --- /dev/null +++ b/vendor/hyperview/server/static/_next/static/chunks/8d5a2ef3447cb3ee.js @@ -0,0 +1,13 @@ +(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,9556,(e,t,i)=>{(t.exports=function(e){this.top=e.top,this.left=e.left,this.width=e.width,this.spacing=e.spacing,this.targetRowHeight=e.targetRowHeight,this.targetRowHeightTolerance=e.targetRowHeightTolerance,this.minAspectRatio=this.width/e.targetRowHeight*(1-e.targetRowHeightTolerance),this.maxAspectRatio=this.width/e.targetRowHeight*(1+e.targetRowHeightTolerance),this.edgeCaseMinRowHeight=e.edgeCaseMinRowHeight,this.edgeCaseMaxRowHeight=e.edgeCaseMaxRowHeight,this.widowLayoutStyle=e.widowLayoutStyle,this.isBreakoutRow=e.isBreakoutRow,this.items=[],this.height=0}).prototype={addItem:function(e){var t,i,n=this.items.concat(e),o=this.width-(n.length-1)*this.spacing,r=n.reduce(function(e,t){return e+t.aspectRatio},0),s=o/this.targetRowHeight;return this.isBreakoutRow&&0===this.items.length&&e.aspectRatio>=1?(this.items.push(e),this.completeLayout(o/e.aspectRatio,"justify"),!0):rthis.maxAspectRatio?0===this.items.length?(this.items.push(Object.assign({},e)),this.completeLayout(o/r,"justify"),!0):(t=this.width-(this.items.length-1)*this.spacing,Math.abs(r-s)>Math.abs((i=this.items.reduce(function(e,t){return e+t.aspectRatio},0))-t/this.targetRowHeight))?(this.completeLayout(t/i,"justify"),!1):(this.items.push(Object.assign({},e)),this.completeLayout(o/r,"justify"),!0):(this.items.push(Object.assign({},e)),this.completeLayout(o/r,"justify"),!0)},isLayoutComplete:function(){return this.height>0},completeLayout:function(e,t){var i,n,o,r,s,a,l=this.left,d=this.width-(this.items.length-1)*this.spacing;(void 0===t||0>["justify","center","left"].indexOf(t))&&(t="left"),n=Math.max(this.edgeCaseMinRowHeight,Math.min(e,this.edgeCaseMaxRowHeight)),e!==n?(this.height=n,i=d/n/(d/e)):(this.height=e,i=1),this.items.forEach(function(e){e.top=this.top,e.width=e.aspectRatio*this.height*i,e.height=this.height,e.left=l,l+=e.width+this.spacing},this),"justify"===t?(l-=this.spacing+this.left,o=(l-this.width)/this.items.length,r=this.items.map(function(e,t){return Math.round((t+1)*o)}),1===this.items.length?(s=this.items[0],s.width-=Math.round(o)):this.items.forEach(function(e,t){t>0?(e.left-=r[t-1],e.width-=r[t]-r[t-1]):e.width-=r[t]})):"center"===t&&(a=(this.width-l)/2,this.items.forEach(function(e){e.left+=a+this.spacing},this))},forceComplete:function(e,t){"number"==typeof t?this.completeLayout(t,this.widowLayoutStyle):this.completeLayout(this.targetRowHeight,this.widowLayoutStyle)},getItems:function(){return this.items}}},49279,(e,t,i)=>{"use strict";var n=e.r(9556);function o(e,t){var i;return!1!==e.fullWidthBreakoutRowCadence&&(t._rows.length+1)%e.fullWidthBreakoutRowCadence==0&&(i=!0),new n({top:t._containerHeight,left:e.containerPadding.left,width:e.containerWidth-e.containerPadding.left-e.containerPadding.right,spacing:e.boxSpacing.horizontal,targetRowHeight:e.targetRowHeight,targetRowHeightTolerance:e.targetRowHeightTolerance,edgeCaseMinRowHeight:.5*e.targetRowHeight,edgeCaseMaxRowHeight:2*e.targetRowHeight,rightToLeft:!1,isBreakoutRow:i,widowLayoutStyle:e.widowLayoutStyle})}function r(e,t,i){return t._rows.push(i),t._layoutItems=t._layoutItems.concat(i.getItems()),t._containerHeight+=i.height+e.boxSpacing.vertical,i.items}t.exports=function(e,t){var i,n,s,a,l,d,h={},u={},c={},p={};return c.top=isNaN(parseFloat((h=Object.assign({containerWidth:1060,containerPadding:10,boxSpacing:10,targetRowHeight:320,targetRowHeightTolerance:.25,maxNumRows:1/0,forceAspectRatio:!1,showWidows:!0,fullWidthBreakoutRowCadence:!1,widowLayoutStyle:"left"},t=t||{})).containerPadding.top))?h.containerPadding:h.containerPadding.top,c.right=isNaN(parseFloat(h.containerPadding.right))?h.containerPadding:h.containerPadding.right,c.bottom=isNaN(parseFloat(h.containerPadding.bottom))?h.containerPadding:h.containerPadding.bottom,c.left=isNaN(parseFloat(h.containerPadding.left))?h.containerPadding:h.containerPadding.left,p.horizontal=isNaN(parseFloat(h.boxSpacing.horizontal))?h.boxSpacing:h.boxSpacing.horizontal,p.vertical=isNaN(parseFloat(h.boxSpacing.vertical))?h.boxSpacing:h.boxSpacing.vertical,h.containerPadding=c,h.boxSpacing=p,u._layoutItems=[],u._awakeItems=[],u._inViewportItems=[],u._leadingOrphans=[],u._trailingOrphans=[],u._containerHeight=h.containerPadding.top,u._rows=[],u._orphans=[],h._widowCount=0,i=h,n=e.map(function(e){return e.width&&e.height?{aspectRatio:e.width/e.height}:{aspectRatio:e}}),d=[],i.forceAspectRatio&&n.forEach(function(e){e.forcedAspectRatio=!0,e.aspectRatio=i.forceAspectRatio}),n.some(function(e,t){if(isNaN(e.aspectRatio))throw Error("Item "+t+" has an invalid aspect ratio");if(a||(a=o(i,u)),s=a.addItem(e),a.isLayoutComplete()){if(d=d.concat(r(i,u,a)),u._rows.length>=i.maxNumRows)return a=null,!0;if(a=o(i,u),!s&&(s=a.addItem(e),a.isLayoutComplete())){if(d=d.concat(r(i,u,a)),u._rows.length>=i.maxNumRows)return a=null,!0;a=o(i,u)}}}),a&&a.getItems().length&&i.showWidows&&(u._rows.length?(l=u._rows[u._rows.length-1].isBreakoutRow?u._rows[u._rows.length-1].targetRowHeight:u._rows[u._rows.length-1].height,a.forceComplete(!1,l)):a.forceComplete(!1),d=d.concat(r(i,u,a)),i._widowCount=a.getItems().length),u._containerHeight=u._containerHeight-i.boxSpacing.vertical,u._containerHeight=u._containerHeight+i.containerPadding.bottom,{containerHeight:u._containerHeight,widowCount:i._widowCount,boxes:u._layoutItems}}},50912,e=>{"use strict";let t,i,n,o,r,s,a,l,d,h,u,c,p,m,f,g,v,w,b,y;var x,_,D,C,S,E,A,k,P,z,O,R,N,I,M,j,L,T,G,V,W=e.i(48277),H=e.i(30668),F=e.i(69941),B=e.i(39057);function $(e,t,i){let n,o=i.initialDeps??[],r=!0;function s(){var s,a,l;let d,h;i.key&&(null==(s=i.debug)?void 0:s.call(i))&&(d=Date.now());let u=e();if(!(u.length!==o.length||u.some((e,t)=>o[t]!==e)))return n;if(o=u,i.key&&(null==(a=i.debug)?void 0:a.call(i))&&(h=Date.now()),n=t(...u),i.key&&(null==(l=i.debug)?void 0:l.call(i))){let e=Math.round((Date.now()-d)*100)/100,t=Math.round((Date.now()-h)*100)/100,n=t/16,o=(e,t)=>{for(e=String(e);e.length{o=e},s}function U(e,t){if(void 0!==e)return e;throw Error(`Unexpected undefined${t?`: ${t}`:""}`)}let K=e=>{let{offsetWidth:t,offsetHeight:i}=e;return{width:t,height:i}},J=e=>e,Z=e=>{let t=Math.max(e.startIndex-e.overscan,0),i=Math.min(e.endIndex+e.overscan,e.count-1),n=[];for(let e=t;e<=i;e++)n.push(e);return n},X=(e,t)=>{let i=e.scrollElement;if(!i)return;let n=e.targetWindow;if(!n)return;let o=e=>{let{width:i,height:n}=e;t({width:Math.round(i),height:Math.round(n)})};if(o(K(i)),!n.ResizeObserver)return()=>{};let r=new n.ResizeObserver(t=>{let n=()=>{let e=t[0];if(null==e?void 0:e.borderBoxSize){let t=e.borderBoxSize[0];if(t)return void o({width:t.inlineSize,height:t.blockSize})}o(K(i))};e.options.useAnimationFrameWithResizeObserver?requestAnimationFrame(n):n()});return r.observe(i,{box:"border-box"}),()=>{r.unobserve(i)}},q={passive:!0},Y="u"{var i,n;let o,r=e.scrollElement;if(!r)return;let s=e.targetWindow;if(!s)return;let a=0,l=e.options.useScrollendEvent&&Y?()=>void 0:(i=()=>{t(a,!1)},n=e.options.isScrollingResetDelay,function(...e){s.clearTimeout(o),o=s.setTimeout(()=>i.apply(this,e),n)}),d=i=>()=>{let{horizontal:n,isRtl:o}=e.options;a=n?r.scrollLeft*(o&&-1||1):r.scrollTop,l(),t(a,i)},h=d(!0),u=d(!1);r.addEventListener("scroll",h,q);let c=e.options.useScrollendEvent&&Y;return c&&r.addEventListener("scrollend",u,q),()=>{r.removeEventListener("scroll",h),c&&r.removeEventListener("scrollend",u)}},ee=(e,t,i)=>{if(null==t?void 0:t.borderBoxSize){let e=t.borderBoxSize[0];if(e)return Math.round(e[i.options.horizontal?"inlineSize":"blockSize"])}return e[i.options.horizontal?"offsetWidth":"offsetHeight"]},et=(e,{adjustments:t=0,behavior:i},n)=>{var o,r;null==(r=null==(o=n.scrollElement)?void 0:o.scrollTo)||r.call(o,{[n.options.horizontal?"left":"top"]:e+t,behavior:i})};class ei{constructor(e){this.unsubs=[],this.scrollElement=null,this.targetWindow=null,this.isScrolling=!1,this.currentScrollToIndex=null,this.measurementsCache=[],this.itemSizeCache=new Map,this.laneAssignments=new Map,this.pendingMeasuredCacheIndexes=[],this.prevLanes=void 0,this.lanesChangedFlag=!1,this.lanesSettling=!1,this.scrollRect=null,this.scrollOffset=null,this.scrollDirection=null,this.scrollAdjustments=0,this.elementsCache=new Map,this.observer=(()=>{let e=null,t=()=>e||(this.targetWindow&&this.targetWindow.ResizeObserver?e=new this.targetWindow.ResizeObserver(e=>{e.forEach(e=>{let t=()=>{this._measureElement(e.target,e)};this.options.useAnimationFrameWithResizeObserver?requestAnimationFrame(t):t()})}):null);return{disconnect:()=>{var i;null==(i=t())||i.disconnect(),e=null},observe:e=>{var i;return null==(i=t())?void 0:i.observe(e,{box:"border-box"})},unobserve:e=>{var i;return null==(i=t())?void 0:i.unobserve(e)}}})(),this.range=null,this.setOptions=e=>{Object.entries(e).forEach(([t,i])=>{void 0===i&&delete e[t]}),this.options={debug:!1,initialOffset:0,overscan:1,paddingStart:0,paddingEnd:0,scrollPaddingStart:0,scrollPaddingEnd:0,horizontal:!1,getItemKey:J,rangeExtractor:Z,onChange:()=>{},measureElement:ee,initialRect:{width:0,height:0},scrollMargin:0,gap:0,indexAttribute:"data-index",initialMeasurementsCache:[],lanes:1,isScrollingResetDelay:150,enabled:!0,isRtl:!1,useScrollendEvent:!1,useAnimationFrameWithResizeObserver:!1,...e}},this.notify=e=>{var t,i;null==(i=(t=this.options).onChange)||i.call(t,this,e)},this.maybeNotify=$(()=>(this.calculateRange(),[this.isScrolling,this.range?this.range.startIndex:null,this.range?this.range.endIndex:null]),e=>{this.notify(e)},{key:!1,debug:()=>this.options.debug,initialDeps:[this.isScrolling,this.range?this.range.startIndex:null,this.range?this.range.endIndex:null]}),this.cleanup=()=>{this.unsubs.filter(Boolean).forEach(e=>e()),this.unsubs=[],this.observer.disconnect(),this.scrollElement=null,this.targetWindow=null},this._didMount=()=>()=>{this.cleanup()},this._willUpdate=()=>{var e;let t=this.options.enabled?this.options.getScrollElement():null;if(this.scrollElement!==t){if(this.cleanup(),!t)return void this.maybeNotify();this.scrollElement=t,this.scrollElement&&"ownerDocument"in this.scrollElement?this.targetWindow=this.scrollElement.ownerDocument.defaultView:this.targetWindow=(null==(e=this.scrollElement)?void 0:e.window)??null,this.elementsCache.forEach(e=>{this.observer.observe(e)}),this.unsubs.push(this.options.observeElementRect(this,e=>{this.scrollRect=e,this.maybeNotify()})),this.unsubs.push(this.options.observeElementOffset(this,(e,t)=>{this.scrollAdjustments=0,this.scrollDirection=t?this.getScrollOffset()this.options.enabled?(this.scrollRect=this.scrollRect??this.options.initialRect,this.scrollRect[this.options.horizontal?"width":"height"]):(this.scrollRect=null,0),this.getScrollOffset=()=>this.options.enabled?(this.scrollOffset=this.scrollOffset??("function"==typeof this.options.initialOffset?this.options.initialOffset():this.options.initialOffset),this.scrollOffset):(this.scrollOffset=null,0),this.getFurthestMeasurement=(e,t)=>{let i=new Map,n=new Map;for(let o=t-1;o>=0;o--){let t=e[o];if(i.has(t.lane))continue;let r=n.get(t.lane);if(null==r||t.end>r.end?n.set(t.lane,t):t.ende.end===t.end?e.index-t.index:e.end-t.end)[0]:void 0},this.getMeasurementOptions=$(()=>[this.options.count,this.options.paddingStart,this.options.scrollMargin,this.options.getItemKey,this.options.enabled,this.options.lanes],(e,t,i,n,o,r)=>(void 0!==this.prevLanes&&this.prevLanes!==r&&(this.lanesChangedFlag=!0),this.prevLanes=r,this.pendingMeasuredCacheIndexes=[],{count:e,paddingStart:t,scrollMargin:i,getItemKey:n,enabled:o,lanes:r}),{key:!1}),this.getMeasurements=$(()=>[this.getMeasurementOptions(),this.itemSizeCache],({count:e,paddingStart:t,scrollMargin:i,getItemKey:n,enabled:o,lanes:r},s)=>{if(!o)return this.measurementsCache=[],this.itemSizeCache.clear(),this.laneAssignments.clear(),[];if(this.laneAssignments.size>e)for(let t of this.laneAssignments.keys())t>=e&&this.laneAssignments.delete(t);this.lanesChangedFlag&&(this.lanesChangedFlag=!1,this.lanesSettling=!0,this.measurementsCache=[],this.itemSizeCache.clear(),this.laneAssignments.clear(),this.pendingMeasuredCacheIndexes=[]),0!==this.measurementsCache.length||this.lanesSettling||(this.measurementsCache=this.options.initialMeasurementsCache,this.measurementsCache.forEach(e=>{this.itemSizeCache.set(e.key,e.size)}));let a=this.lanesSettling?0:this.pendingMeasuredCacheIndexes.length>0?Math.min(...this.pendingMeasuredCacheIndexes):0;this.pendingMeasuredCacheIndexes=[],this.lanesSettling&&this.measurementsCache.length===e&&(this.lanesSettling=!1);let l=this.measurementsCache.slice(0,a),d=Array(r).fill(void 0);for(let e=0;e1){let n=d[e=h],o=void 0!==n?l[n]:void 0;r=o?o.end+this.options.gap:t+i}else{let n=1===this.options.lanes?l[o-1]:this.getFurthestMeasurement(l,o);r=n?n.end+this.options.gap:t+i,e=n?n.lane:o%this.options.lanes,this.options.lanes>1&&this.laneAssignments.set(o,e)}let u=s.get(a),c="number"==typeof u?u:this.options.estimateSize(o),p=r+c;l[o]={index:o,start:r,size:c,end:p,key:a,lane:e},d[e]=o}return this.measurementsCache=l,l},{key:!1,debug:()=>this.options.debug}),this.calculateRange=$(()=>[this.getMeasurements(),this.getSize(),this.getScrollOffset(),this.options.lanes],(e,t,i,n)=>this.range=e.length>0&&t>0?function({measurements:e,outerSize:t,scrollOffset:i,lanes:n}){let o=e.length-1;if(e.length<=n)return{startIndex:0,endIndex:o};let r=en(0,o,t=>e[t].start,i),s=r;if(1===n)for(;s1){let a=Array(n).fill(0);for(;se=0&&l.some(e=>e>=i);){let t=e[r];l[t.lane]=t.start,r--}r=Math.max(0,r-r%n),s=Math.min(o,s+(n-1-s%n))}return{startIndex:r,endIndex:s}}({measurements:e,outerSize:t,scrollOffset:i,lanes:n}):null,{key:!1,debug:()=>this.options.debug}),this.getVirtualIndexes=$(()=>{let e=null,t=null,i=this.calculateRange();return i&&(e=i.startIndex,t=i.endIndex),this.maybeNotify.updateDeps([this.isScrolling,e,t]),[this.options.rangeExtractor,this.options.overscan,this.options.count,e,t]},(e,t,i,n,o)=>null===n||null===o?[]:e({startIndex:n,endIndex:o,overscan:t,count:i}),{key:!1,debug:()=>this.options.debug}),this.indexFromElement=e=>{let t=this.options.indexAttribute,i=e.getAttribute(t);return i?parseInt(i,10):(console.warn(`Missing attribute name '${t}={index}' on measured element.`),-1)},this._measureElement=(e,t)=>{let i=this.indexFromElement(e),n=this.measurementsCache[i];if(!n)return;let o=n.key,r=this.elementsCache.get(o);r!==e&&(r&&this.observer.unobserve(r),this.observer.observe(e),this.elementsCache.set(o,e)),e.isConnected&&this.resizeItem(i,this.options.measureElement(e,t,this))},this.resizeItem=(e,t)=>{let i=this.measurementsCache[e];if(!i)return;let n=t-(this.itemSizeCache.get(i.key)??i.size);0!==n&&((void 0!==this.shouldAdjustScrollPositionOnItemSizeChange?this.shouldAdjustScrollPositionOnItemSizeChange(i,n,this):i.start{e?this._measureElement(e,void 0):this.elementsCache.forEach((e,t)=>{e.isConnected||(this.observer.unobserve(e),this.elementsCache.delete(t))})},this.getVirtualItems=$(()=>[this.getVirtualIndexes(),this.getMeasurements()],(e,t)=>{let i=[];for(let n=0,o=e.length;nthis.options.debug}),this.getVirtualItemForOffset=e=>{let t=this.getMeasurements();if(0!==t.length)return U(t[en(0,t.length-1,e=>U(t[e]).start,e)])},this.getMaxScrollOffset=()=>{if(!this.scrollElement)return 0;if("scrollHeight"in this.scrollElement)return this.options.horizontal?this.scrollElement.scrollWidth-this.scrollElement.clientWidth:this.scrollElement.scrollHeight-this.scrollElement.clientHeight;{let e=this.scrollElement.document.documentElement;return this.options.horizontal?e.scrollWidth-this.scrollElement.innerWidth:e.scrollHeight-this.scrollElement.innerHeight}},this.getOffsetForAlignment=(e,t,i=0)=>{if(!this.scrollElement)return 0;let n=this.getSize(),o=this.getScrollOffset();return"auto"===t&&(t=e>=o+n?"end":"start"),"center"===t?e+=(i-n)/2:"end"===t&&(e-=n),Math.max(Math.min(this.getMaxScrollOffset(),e),0)},this.getOffsetForIndex=(e,t="auto")=>{e=Math.max(0,Math.min(e,this.options.count-1));let i=this.measurementsCache[e];if(!i)return;let n=this.getSize(),o=this.getScrollOffset();if("auto"===t)if(i.end>=o+n-this.options.scrollPaddingEnd)t="end";else{if(!(i.start<=o+this.options.scrollPaddingStart))return[o,t];t="start"}if("end"===t&&e===this.options.count-1)return[this.getMaxScrollOffset(),t];let r="end"===t?i.end+this.options.scrollPaddingEnd:i.start-this.options.scrollPaddingStart;return[this.getOffsetForAlignment(r,t,i.size),t]},this.isDynamicMode=()=>this.elementsCache.size>0,this.scrollToOffset=(e,{align:t="start",behavior:i}={})=>{"smooth"===i&&this.isDynamicMode()&&console.warn("The `smooth` scroll behavior is not fully supported with dynamic size."),this._scrollToOffset(this.getOffsetForAlignment(e,t),{adjustments:void 0,behavior:i})},this.scrollToIndex=(e,{align:t="auto",behavior:i}={})=>{"smooth"===i&&this.isDynamicMode()&&console.warn("The `smooth` scroll behavior is not fully supported with dynamic size."),e=Math.max(0,Math.min(e,this.options.count-1)),this.currentScrollToIndex=e;let n=0,o=t=>{if(!this.targetWindow)return;let n=this.getOffsetForIndex(e,t);if(!n)return void console.warn("Failed to get offset for index:",e);let[o,s]=n;this._scrollToOffset(o,{adjustments:void 0,behavior:i}),this.targetWindow.requestAnimationFrame(()=>{let t=()=>{if(this.currentScrollToIndex!==e)return;let t=this.getScrollOffset(),i=this.getOffsetForIndex(e,s);i?1.01>Math.abs(i[0]-t)||r(s):console.warn("Failed to get offset for index:",e)};this.isDynamicMode()?this.targetWindow.requestAnimationFrame(t):t()})},r=t=>{this.targetWindow&&this.currentScrollToIndex===e&&(++n<10?this.targetWindow.requestAnimationFrame(()=>o(t)):console.warn(`Failed to scroll to index ${e} after 10 attempts.`))};o(t)},this.scrollBy=(e,{behavior:t}={})=>{"smooth"===t&&this.isDynamicMode()&&console.warn("The `smooth` scroll behavior is not fully supported with dynamic size."),this._scrollToOffset(this.getScrollOffset()+e,{adjustments:void 0,behavior:t})},this.getTotalSize=()=>{var e;let t,i=this.getMeasurements();if(0===i.length)t=this.options.paddingStart;else if(1===this.options.lanes)t=(null==(e=i[i.length-1])?void 0:e.end)??0;else{let e=Array(this.options.lanes).fill(null),n=i.length-1;for(;n>=0&&e.some(e=>null===e);){let t=i[n];null===e[t.lane]&&(e[t.lane]=t.end),n--}t=Math.max(...e.filter(e=>null!==e))}return Math.max(t-this.options.scrollMargin+this.options.paddingEnd,0)},this._scrollToOffset=(e,{adjustments:t,behavior:i})=>{this.options.scrollToFn(e,{behavior:i,adjustments:t},this)},this.measure=()=>{this.itemSizeCache=new Map,this.laneAssignments=new Map,this.notify(!1)},this.setOptions(e)}}let en=(e,t,i,n)=>{for(;e<=t;){let o=(e+t)/2|0,r=i(o);if(rn))return o;t=o-1}}return e>0?e-1:0},eo="u">typeof document?H.useLayoutEffect:H.useEffect;var er=e.i(49279);let es=e=>{let t,i=new Set,n=(e,n)=>{let o="function"==typeof e?e(t):e;if(!Object.is(o,t)){let e=t;t=(null!=n?n:"object"!=typeof o||null===o)?o:Object.assign({},t,o),i.forEach(i=>i(t,e))}},o=()=>t,r={setState:n,getState:o,getInitialState:()=>s,subscribe:e=>(i.add(e),()=>i.delete(e))},s=t=e(n,o,r);return r},ea=e=>{let t=e?es(e):es,i=e=>(function(e,t=e=>e){let i=H.default.useSyncExternalStore(e.subscribe,H.default.useCallback(()=>t(e.getState()),[e,t]),H.default.useCallback(()=>t(e.getInitialState()),[e,t]));return H.default.useDebugValue(i),i})(t,e);return Object.assign(i,t),i},el=e=>e?ea(e):ea,ed="undefined",eh="#39d3cc",eu="#8b949e",ec=["auto","classic20","tab10","tab20","wong"],ep=["#e6194b","#3cb44b","#ffe119","#4363d8","#f58231","#911eb4","#46f0f0","#f032e6","#bcf60c","#fabebe","#008080","#e6beff","#9a6324","#fffac8","#800000","#aaffc3","#808000","#ffd8b1","#000075","#808080"],em=["#4e79a7","#f28e2b","#e15759","#76b7b2","#59a14f","#edc948","#b07aa1","#ff9da7","#9c755f","#bab0ab"],ef=["#1f77b4","#aec7e8","#ff7f0e","#ffbb78","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5","#8c564b","#c49c94","#e377c2","#f7b6d2","#7f7f7f","#c7c7c7","#bcbd22","#dbdb8d","#17becf","#9edae5"],eg=["#e69f00","#56b4e9","#009e73","#f0e442","#0072b2","#d55e00","#cc79a7"];function ev(e){return e<0?0:e>1?1:e}function ew(e,t){let i=[.72,.64,.78],n=[.46,.54,.38,.62];return function(e,t,i){let n=(e%360+360)%360/360%1,o=ev(t),r=ev(i),s=r,a=r,l=r;if(o>0){let e=r<.5?r*(1+o):r+o-r*o,t=2*r-e,i=i=>{let n=i;return(n<0&&(n+=1),n>1&&(n-=1),n<1/6)?t+(e-t)*6*n:n<.5?e:n<2/3?t+(e-t)*(2/3-n)*6:t};s=i(n+1/3),a=i(n),l=i(n-1/3)}let d=e=>Math.round(255*ev(e)).toString(16).padStart(2,"0");return`#${d(s)}${d(a)}${d(l)}`}((("tab10"===t?17:"tab20"===t?43:"wong"===t?71:"classic20"===t?101:131)+137.508*e)%360,i[e%i.length],n[Math.floor(e/i.length)%n.length])}function eb(e,t){return e===ed&&t!==ed?1:t===ed&&e!==ed?-1:e.localeCompare(t)}function ey(e,t,i){let n={},o=new Set,r=0,s=0;for(let a of e){if(a===ed){n[a]=eh,o.add(eh.toLowerCase());continue}let e=r=t.length&&(s+=1),o.has(e.toLowerCase())&&(e=eu),n[a]=e,o.add(e.toLowerCase()),r+=1}return n}function ex(e){return e&&e.length>0?e:ed}function e_(e,t){let i=ex(t),n=new Set;for(let t=0;t({leftPanelOpen:!1,rightPanelOpen:!1,bottomPanelOpen:!1,setLeftPanelOpen:t=>e({leftPanelOpen:t}),setRightPanelOpen:t=>e({rightPanelOpen:t}),setBottomPanelOpen:t=>e({bottomPanelOpen:t}),datasetInfo:null,setDatasetInfo:t=>e({datasetInfo:t}),samples:[],totalSamples:0,samplesLoaded:0,setSamples:(t,i)=>e({samples:t,totalSamples:i,samplesLoaded:t.length}),appendSamples:t=>e(e=>{let i=new Set(e.samples.map(e=>e.id)),n=t.filter(e=>!i.has(e.id)),o=e.samplesLoaded+t.length;return 0===n.length?{samplesLoaded:o}:{samples:[...e.samples,...n],samplesLoaded:o}}),addSamplesIfMissing:t=>e(e=>{let i=new Set(e.samples.map(e=>e.id)),n=t.filter(e=>!i.has(e.id));return 0===n.length?e:{samples:[...e.samples,...n]}}),embeddingsByLayoutKey:{},setEmbeddingsForLayout:(t,i)=>e(e=>{let n=e.labelFilter&&"label"===e.selectionSource&&e.activeLayoutKey===t?{selectedIds:e_(i,e.labelFilter),selectionSource:"label"}:{};return{embeddingsByLayoutKey:{...e.embeddingsByLayoutKey,[t]:i},...n}}),activeLayoutKey:null,setActiveLayoutKey:t=>e(e=>{if(!t)return{activeLayoutKey:null};if(!e.labelFilter||"label"!==e.selectionSource)return{activeLayoutKey:t};let i=e.embeddingsByLayoutKey[t];return i?{activeLayoutKey:t,selectedIds:e_(i,e.labelFilter),selectionSource:"label"}:{activeLayoutKey:t,selectedIds:new Set,selectionSource:"label"}}),labelFilter:null,setLabelFilter:t=>e(e=>{let i=t?ex(t):null,n={labelFilter:i};if(i){let t=e.activeLayoutKey,o=t?e.embeddingsByLayoutKey[t]:null;n.selectedIds=o?e_(o,i):new Set,n.selectionSource="label",n.isLassoSelection=!1,n.lassoQuery=null,n.lassoSamples=[],n.lassoTotal=0,n.lassoIsLoading=!1}else"label"===e.selectionSource&&(n.selectedIds=new Set,n.selectionSource=null);return n}),selectedIds:new Set,isLassoSelection:!1,selectionSource:null,setSelectedIds:(t,i="grid")=>e({selectedIds:t,selectionSource:t.size>0?i:null,isLassoSelection:!1,lassoQuery:null,lassoSamples:[],lassoTotal:0,lassoIsLoading:!1}),toggleSelection:t=>e(e=>{let i=new Set(e.selectedIds);return i.has(t)?i.delete(t):i.add(t),{selectedIds:i,selectionSource:i.size>0?"grid":null,isLassoSelection:!1,lassoQuery:null,lassoSamples:[],lassoTotal:0,lassoIsLoading:!1}}),addToSelection:t=>e(e=>{let i=new Set(e.selectedIds);return t.forEach(e=>i.add(e)),{selectedIds:i,selectionSource:i.size>0?"grid":null,isLassoSelection:!1,lassoQuery:null,lassoSamples:[],lassoTotal:0,lassoIsLoading:!1}}),clearSelection:()=>e({selectedIds:new Set,selectionSource:null,isLassoSelection:!1,lassoQuery:null,lassoSamples:[],lassoTotal:0,lassoIsLoading:!1}),lassoQuery:null,lassoSamples:[],lassoTotal:0,lassoIsLoading:!1,beginLassoSelection:t=>e({isLassoSelection:!0,selectedIds:new Set,selectionSource:"lasso",lassoQuery:t,lassoSamples:[],lassoTotal:0,lassoIsLoading:!0}),setLassoResults:(t,i,n=!1)=>e(e=>({lassoSamples:n?[...e.lassoSamples,...t]:t,lassoTotal:i,lassoIsLoading:!1})),clearLassoSelection:()=>e({isLassoSelection:!1,selectionSource:null,lassoQuery:null,lassoSamples:[],lassoTotal:0,lassoIsLoading:!1}),hoveredId:null,setHoveredId:t=>e({hoveredId:t}),isLoading:!1,setIsLoading:t=>e({isLoading:t}),error:null,setError:t=>e({error:t})}));function eC(){for(var e,t,i=0,n="",o=arguments.length;i({nextPart:e,validators:t,classGroupId:i}),eE=[],eA=(e,t,i)=>{if(0==e.length-t)return i.classGroupId;let n=e[t],o=i.nextPart.get(n);if(o){let i=eA(e,t+1,o);if(i)return i}let r=i.validators;if(null===r)return;let s=0===t?e.join("-"):e.slice(t).join("-"),a=r.length;for(let e=0;e{let i=eS();for(let n in e)eP(e[n],i,n,t);return i},eP=(e,t,i,n)=>{let o=e.length;for(let r=0;r{"string"==typeof e?eO(e,t,i):"function"==typeof e?eR(e,t,i,n):eN(e,t,i,n)},eO=(e,t,i)=>{(""===e?t:eI(t,e)).classGroupId=i},eR=(e,t,i,n)=>{eM(e)?eP(e(n),t,i,n):(null===t.validators&&(t.validators=[]),t.validators.push({classGroupId:i,validator:e}))},eN=(e,t,i,n)=>{let o=Object.entries(e),r=o.length;for(let e=0;e{let i=e,n=t.split("-"),o=n.length;for(let e=0;e"isThemeGetter"in e&&!0===e.isThemeGetter,ej=[],eL=(e,t,i,n,o)=>({modifiers:e,hasImportantModifier:t,baseClassName:i,maybePostfixModifierPosition:n,isExternal:o}),eT=/\s+/,eG=e=>{let t;if("string"==typeof e)return e;let i="";for(let n=0;n{let t=t=>t[e]||eV;return t.isThemeGetter=!0,t},eH=/^\[(?:(\w[\w-]*):)?(.+)\]$/i,eF=/^\((?:(\w[\w-]*):)?(.+)\)$/i,eB=/^\d+\/\d+$/,e$=/^(\d+(\.\d+)?)?(xs|sm|md|lg|xl)$/,eU=/\d+(%|px|r?em|[sdl]?v([hwib]|min|max)|pt|pc|in|cm|mm|cap|ch|ex|r?lh|cq(w|h|i|b|min|max))|\b(calc|min|max|clamp)\(.+\)|^0$/,eK=/^(rgba?|hsla?|hwb|(ok)?(lab|lch)|color-mix)\(.+\)$/,eJ=/^(inset_)?-?((\d+)?\.?(\d+)[a-z]+|0)_-?((\d+)?\.?(\d+)[a-z]+|0)/,eZ=/^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\(.+\)$/,eX=e=>eB.test(e),eq=e=>!!e&&!Number.isNaN(Number(e)),eY=e=>!!e&&Number.isInteger(Number(e)),eQ=e=>e.endsWith("%")&&eq(e.slice(0,-1)),e0=e=>e$.test(e),e1=()=>!0,e2=e=>eU.test(e)&&!eK.test(e),e3=()=>!1,e5=e=>eJ.test(e),e4=e=>eZ.test(e),e6=e=>!e8(e)&&!to(e),e9=e=>tu(e,tf,e3),e8=e=>eH.test(e),e7=e=>tu(e,tg,e2),te=e=>tu(e,tv,eq),tt=e=>tu(e,tp,e3),ti=e=>tu(e,tm,e4),tn=e=>tu(e,tb,e5),to=e=>eF.test(e),tr=e=>tc(e,tg),ts=e=>tc(e,tw),ta=e=>tc(e,tp),tl=e=>tc(e,tf),td=e=>tc(e,tm),th=e=>tc(e,tb,!0),tu=(e,t,i)=>{let n=eH.exec(e);return!!n&&(n[1]?t(n[1]):i(n[2]))},tc=(e,t,i=!1)=>{let n=eF.exec(e);return!!n&&(n[1]?t(n[1]):i)},tp=e=>"position"===e||"percentage"===e,tm=e=>"image"===e||"url"===e,tf=e=>"length"===e||"size"===e||"bg-size"===e,tg=e=>"length"===e,tv=e=>"number"===e,tw=e=>"family-name"===e,tb=e=>"shadow"===e,ty=((e,...t)=>{let i,n,o,r,s=e=>{let t=n(e);if(t)return t;let r=((e,t)=>{let{parseClassName:i,getClassGroupId:n,getConflictingClassGroupIds:o,sortModifiers:r}=t,s=[],a=e.trim().split(eT),l="";for(let e=a.length-1;e>=0;e-=1){let t=a[e],{isExternal:d,modifiers:h,hasImportantModifier:u,baseClassName:c,maybePostfixModifierPosition:p}=i(t);if(d){l=t+(l.length>0?" "+l:l);continue}let m=!!p,f=n(m?c.substring(0,p):c);if(!f){if(!m||!(f=n(c))){l=t+(l.length>0?" "+l:l);continue}m=!1}let g=0===h.length?"":1===h.length?h[0]:r(h).join(":"),v=u?g+"!":g,w=v+f;if(s.indexOf(w)>-1)continue;s.push(w);let b=o(f,m);for(let e=0;e0?" "+l:l)}return l})(e,i);return o(e,r),r};return r=a=>{var l;let d;return n=(i={cache:(e=>{if(e<1)return{get:()=>void 0,set:()=>{}};let t=0,i=Object.create(null),n=Object.create(null),o=(o,r)=>{i[o]=r,++t>e&&(t=0,n=i,i=Object.create(null))};return{get(e){let t=i[e];return void 0!==t?t:void 0!==(t=n[e])?(o(e,t),t):void 0},set(e,t){e in i?i[e]=t:o(e,t)}}})((l=t.reduce((e,t)=>t(e),e())).cacheSize),parseClassName:(e=>{let{prefix:t,experimentalParseClassName:i}=e,n=e=>{let t,i=[],n=0,o=0,r=0,s=e.length;for(let a=0;ar?t-r:void 0)};if(t){let e=t+":",i=n;n=t=>t.startsWith(e)?i(t.slice(e.length)):eL(ej,!1,t,void 0,!0)}if(i){let e=n;n=t=>i({className:t,parseClassName:e})}return n})(l),sortModifiers:(d=new Map,l.orderSensitiveModifiers.forEach((e,t)=>{d.set(e,1e6+t)}),e=>{let t=[],i=[];for(let n=0;n0&&(i.sort(),t.push(...i),i=[]),t.push(o)):i.push(o)}return i.length>0&&(i.sort(),t.push(...i)),t}),...(e=>{let t=(e=>{let{theme:t,classGroups:i}=e;return ek(i,t)})(e),{conflictingClassGroups:i,conflictingClassGroupModifiers:n}=e;return{getClassGroupId:e=>{if(e.startsWith("[")&&e.endsWith("]")){var i;let t,n,o;return -1===(i=e).slice(1,-1).indexOf(":")?void 0:(n=(t=i.slice(1,-1)).indexOf(":"),(o=t.slice(0,n))?"arbitrary.."+o:void 0)}let n=e.split("-"),o=+(""===n[0]&&n.length>1);return eA(n,o,t)},getConflictingClassGroupIds:(e,t)=>{if(t){let t=n[e],o=i[e];if(t){if(o){let e=Array(o.length+t.length);for(let t=0;tr(((...e)=>{let t,i,n=0,o="";for(;n{let e=eW("color"),t=eW("font"),i=eW("text"),n=eW("font-weight"),o=eW("tracking"),r=eW("leading"),s=eW("breakpoint"),a=eW("container"),l=eW("spacing"),d=eW("radius"),h=eW("shadow"),u=eW("inset-shadow"),c=eW("text-shadow"),p=eW("drop-shadow"),m=eW("blur"),f=eW("perspective"),g=eW("aspect"),v=eW("ease"),w=eW("animate"),b=()=>["auto","avoid","all","avoid-page","page","left","right","column"],y=()=>["center","top","bottom","left","right","top-left","left-top","top-right","right-top","bottom-right","right-bottom","bottom-left","left-bottom"],x=()=>[...y(),to,e8],_=()=>["auto","hidden","clip","visible","scroll"],D=()=>["auto","contain","none"],C=()=>[to,e8,l],S=()=>[eX,"full","auto",...C()],E=()=>[eY,"none","subgrid",to,e8],A=()=>["auto",{span:["full",eY,to,e8]},eY,to,e8],k=()=>[eY,"auto",to,e8],P=()=>["auto","min","max","fr",to,e8],z=()=>["start","end","center","between","around","evenly","stretch","baseline","center-safe","end-safe"],O=()=>["start","end","center","stretch","center-safe","end-safe"],R=()=>["auto",...C()],N=()=>[eX,"auto","full","dvw","dvh","lvw","lvh","svw","svh","min","max","fit",...C()],I=()=>[e,to,e8],M=()=>[...y(),ta,tt,{position:[to,e8]}],j=()=>["no-repeat",{repeat:["","x","y","space","round"]}],L=()=>["auto","cover","contain",tl,e9,{size:[to,e8]}],T=()=>[eQ,tr,e7],G=()=>["","none","full",d,to,e8],V=()=>["",eq,tr,e7],W=()=>["solid","dashed","dotted","double"],H=()=>["normal","multiply","screen","overlay","darken","lighten","color-dodge","color-burn","hard-light","soft-light","difference","exclusion","hue","saturation","color","luminosity"],F=()=>[eq,eQ,ta,tt],B=()=>["","none",m,to,e8],$=()=>["none",eq,to,e8],U=()=>["none",eq,to,e8],K=()=>[eq,to,e8],J=()=>[eX,"full",...C()];return{cacheSize:500,theme:{animate:["spin","ping","pulse","bounce"],aspect:["video"],blur:[e0],breakpoint:[e0],color:[e1],container:[e0],"drop-shadow":[e0],ease:["in","out","in-out"],font:[e6],"font-weight":["thin","extralight","light","normal","medium","semibold","bold","extrabold","black"],"inset-shadow":[e0],leading:["none","tight","snug","normal","relaxed","loose"],perspective:["dramatic","near","normal","midrange","distant","none"],radius:[e0],shadow:[e0],spacing:["px",eq],text:[e0],"text-shadow":[e0],tracking:["tighter","tight","normal","wide","wider","widest"]},classGroups:{aspect:[{aspect:["auto","square",eX,e8,to,g]}],container:["container"],columns:[{columns:[eq,e8,to,a]}],"break-after":[{"break-after":b()}],"break-before":[{"break-before":b()}],"break-inside":[{"break-inside":["auto","avoid","avoid-page","avoid-column"]}],"box-decoration":[{"box-decoration":["slice","clone"]}],box:[{box:["border","content"]}],display:["block","inline-block","inline","flex","inline-flex","table","inline-table","table-caption","table-cell","table-column","table-column-group","table-footer-group","table-header-group","table-row-group","table-row","flow-root","grid","inline-grid","contents","list-item","hidden"],sr:["sr-only","not-sr-only"],float:[{float:["right","left","none","start","end"]}],clear:[{clear:["left","right","both","none","start","end"]}],isolation:["isolate","isolation-auto"],"object-fit":[{object:["contain","cover","fill","none","scale-down"]}],"object-position":[{object:x()}],overflow:[{overflow:_()}],"overflow-x":[{"overflow-x":_()}],"overflow-y":[{"overflow-y":_()}],overscroll:[{overscroll:D()}],"overscroll-x":[{"overscroll-x":D()}],"overscroll-y":[{"overscroll-y":D()}],position:["static","fixed","absolute","relative","sticky"],inset:[{inset:S()}],"inset-x":[{"inset-x":S()}],"inset-y":[{"inset-y":S()}],start:[{start:S()}],end:[{end:S()}],top:[{top:S()}],right:[{right:S()}],bottom:[{bottom:S()}],left:[{left:S()}],visibility:["visible","invisible","collapse"],z:[{z:[eY,"auto",to,e8]}],basis:[{basis:[eX,"full","auto",a,...C()]}],"flex-direction":[{flex:["row","row-reverse","col","col-reverse"]}],"flex-wrap":[{flex:["nowrap","wrap","wrap-reverse"]}],flex:[{flex:[eq,eX,"auto","initial","none",e8]}],grow:[{grow:["",eq,to,e8]}],shrink:[{shrink:["",eq,to,e8]}],order:[{order:[eY,"first","last","none",to,e8]}],"grid-cols":[{"grid-cols":E()}],"col-start-end":[{col:A()}],"col-start":[{"col-start":k()}],"col-end":[{"col-end":k()}],"grid-rows":[{"grid-rows":E()}],"row-start-end":[{row:A()}],"row-start":[{"row-start":k()}],"row-end":[{"row-end":k()}],"grid-flow":[{"grid-flow":["row","col","dense","row-dense","col-dense"]}],"auto-cols":[{"auto-cols":P()}],"auto-rows":[{"auto-rows":P()}],gap:[{gap:C()}],"gap-x":[{"gap-x":C()}],"gap-y":[{"gap-y":C()}],"justify-content":[{justify:[...z(),"normal"]}],"justify-items":[{"justify-items":[...O(),"normal"]}],"justify-self":[{"justify-self":["auto",...O()]}],"align-content":[{content:["normal",...z()]}],"align-items":[{items:[...O(),{baseline:["","last"]}]}],"align-self":[{self:["auto",...O(),{baseline:["","last"]}]}],"place-content":[{"place-content":z()}],"place-items":[{"place-items":[...O(),"baseline"]}],"place-self":[{"place-self":["auto",...O()]}],p:[{p:C()}],px:[{px:C()}],py:[{py:C()}],ps:[{ps:C()}],pe:[{pe:C()}],pt:[{pt:C()}],pr:[{pr:C()}],pb:[{pb:C()}],pl:[{pl:C()}],m:[{m:R()}],mx:[{mx:R()}],my:[{my:R()}],ms:[{ms:R()}],me:[{me:R()}],mt:[{mt:R()}],mr:[{mr:R()}],mb:[{mb:R()}],ml:[{ml:R()}],"space-x":[{"space-x":C()}],"space-x-reverse":["space-x-reverse"],"space-y":[{"space-y":C()}],"space-y-reverse":["space-y-reverse"],size:[{size:N()}],w:[{w:[a,"screen",...N()]}],"min-w":[{"min-w":[a,"screen","none",...N()]}],"max-w":[{"max-w":[a,"screen","none","prose",{screen:[s]},...N()]}],h:[{h:["screen","lh",...N()]}],"min-h":[{"min-h":["screen","lh","none",...N()]}],"max-h":[{"max-h":["screen","lh",...N()]}],"font-size":[{text:["base",i,tr,e7]}],"font-smoothing":["antialiased","subpixel-antialiased"],"font-style":["italic","not-italic"],"font-weight":[{font:[n,to,te]}],"font-stretch":[{"font-stretch":["ultra-condensed","extra-condensed","condensed","semi-condensed","normal","semi-expanded","expanded","extra-expanded","ultra-expanded",eQ,e8]}],"font-family":[{font:[ts,e8,t]}],"fvn-normal":["normal-nums"],"fvn-ordinal":["ordinal"],"fvn-slashed-zero":["slashed-zero"],"fvn-figure":["lining-nums","oldstyle-nums"],"fvn-spacing":["proportional-nums","tabular-nums"],"fvn-fraction":["diagonal-fractions","stacked-fractions"],tracking:[{tracking:[o,to,e8]}],"line-clamp":[{"line-clamp":[eq,"none",to,te]}],leading:[{leading:[r,...C()]}],"list-image":[{"list-image":["none",to,e8]}],"list-style-position":[{list:["inside","outside"]}],"list-style-type":[{list:["disc","decimal","none",to,e8]}],"text-alignment":[{text:["left","center","right","justify","start","end"]}],"placeholder-color":[{placeholder:I()}],"text-color":[{text:I()}],"text-decoration":["underline","overline","line-through","no-underline"],"text-decoration-style":[{decoration:[...W(),"wavy"]}],"text-decoration-thickness":[{decoration:[eq,"from-font","auto",to,e7]}],"text-decoration-color":[{decoration:I()}],"underline-offset":[{"underline-offset":[eq,"auto",to,e8]}],"text-transform":["uppercase","lowercase","capitalize","normal-case"],"text-overflow":["truncate","text-ellipsis","text-clip"],"text-wrap":[{text:["wrap","nowrap","balance","pretty"]}],indent:[{indent:C()}],"vertical-align":[{align:["baseline","top","middle","bottom","text-top","text-bottom","sub","super",to,e8]}],whitespace:[{whitespace:["normal","nowrap","pre","pre-line","pre-wrap","break-spaces"]}],break:[{break:["normal","words","all","keep"]}],wrap:[{wrap:["break-word","anywhere","normal"]}],hyphens:[{hyphens:["none","manual","auto"]}],content:[{content:["none",to,e8]}],"bg-attachment":[{bg:["fixed","local","scroll"]}],"bg-clip":[{"bg-clip":["border","padding","content","text"]}],"bg-origin":[{"bg-origin":["border","padding","content"]}],"bg-position":[{bg:M()}],"bg-repeat":[{bg:j()}],"bg-size":[{bg:L()}],"bg-image":[{bg:["none",{linear:[{to:["t","tr","r","br","b","bl","l","tl"]},eY,to,e8],radial:["",to,e8],conic:[eY,to,e8]},td,ti]}],"bg-color":[{bg:I()}],"gradient-from-pos":[{from:T()}],"gradient-via-pos":[{via:T()}],"gradient-to-pos":[{to:T()}],"gradient-from":[{from:I()}],"gradient-via":[{via:I()}],"gradient-to":[{to:I()}],rounded:[{rounded:G()}],"rounded-s":[{"rounded-s":G()}],"rounded-e":[{"rounded-e":G()}],"rounded-t":[{"rounded-t":G()}],"rounded-r":[{"rounded-r":G()}],"rounded-b":[{"rounded-b":G()}],"rounded-l":[{"rounded-l":G()}],"rounded-ss":[{"rounded-ss":G()}],"rounded-se":[{"rounded-se":G()}],"rounded-ee":[{"rounded-ee":G()}],"rounded-es":[{"rounded-es":G()}],"rounded-tl":[{"rounded-tl":G()}],"rounded-tr":[{"rounded-tr":G()}],"rounded-br":[{"rounded-br":G()}],"rounded-bl":[{"rounded-bl":G()}],"border-w":[{border:V()}],"border-w-x":[{"border-x":V()}],"border-w-y":[{"border-y":V()}],"border-w-s":[{"border-s":V()}],"border-w-e":[{"border-e":V()}],"border-w-t":[{"border-t":V()}],"border-w-r":[{"border-r":V()}],"border-w-b":[{"border-b":V()}],"border-w-l":[{"border-l":V()}],"divide-x":[{"divide-x":V()}],"divide-x-reverse":["divide-x-reverse"],"divide-y":[{"divide-y":V()}],"divide-y-reverse":["divide-y-reverse"],"border-style":[{border:[...W(),"hidden","none"]}],"divide-style":[{divide:[...W(),"hidden","none"]}],"border-color":[{border:I()}],"border-color-x":[{"border-x":I()}],"border-color-y":[{"border-y":I()}],"border-color-s":[{"border-s":I()}],"border-color-e":[{"border-e":I()}],"border-color-t":[{"border-t":I()}],"border-color-r":[{"border-r":I()}],"border-color-b":[{"border-b":I()}],"border-color-l":[{"border-l":I()}],"divide-color":[{divide:I()}],"outline-style":[{outline:[...W(),"none","hidden"]}],"outline-offset":[{"outline-offset":[eq,to,e8]}],"outline-w":[{outline:["",eq,tr,e7]}],"outline-color":[{outline:I()}],shadow:[{shadow:["","none",h,th,tn]}],"shadow-color":[{shadow:I()}],"inset-shadow":[{"inset-shadow":["none",u,th,tn]}],"inset-shadow-color":[{"inset-shadow":I()}],"ring-w":[{ring:V()}],"ring-w-inset":["ring-inset"],"ring-color":[{ring:I()}],"ring-offset-w":[{"ring-offset":[eq,e7]}],"ring-offset-color":[{"ring-offset":I()}],"inset-ring-w":[{"inset-ring":V()}],"inset-ring-color":[{"inset-ring":I()}],"text-shadow":[{"text-shadow":["none",c,th,tn]}],"text-shadow-color":[{"text-shadow":I()}],opacity:[{opacity:[eq,to,e8]}],"mix-blend":[{"mix-blend":[...H(),"plus-darker","plus-lighter"]}],"bg-blend":[{"bg-blend":H()}],"mask-clip":[{"mask-clip":["border","padding","content","fill","stroke","view"]},"mask-no-clip"],"mask-composite":[{mask:["add","subtract","intersect","exclude"]}],"mask-image-linear-pos":[{"mask-linear":[eq]}],"mask-image-linear-from-pos":[{"mask-linear-from":F()}],"mask-image-linear-to-pos":[{"mask-linear-to":F()}],"mask-image-linear-from-color":[{"mask-linear-from":I()}],"mask-image-linear-to-color":[{"mask-linear-to":I()}],"mask-image-t-from-pos":[{"mask-t-from":F()}],"mask-image-t-to-pos":[{"mask-t-to":F()}],"mask-image-t-from-color":[{"mask-t-from":I()}],"mask-image-t-to-color":[{"mask-t-to":I()}],"mask-image-r-from-pos":[{"mask-r-from":F()}],"mask-image-r-to-pos":[{"mask-r-to":F()}],"mask-image-r-from-color":[{"mask-r-from":I()}],"mask-image-r-to-color":[{"mask-r-to":I()}],"mask-image-b-from-pos":[{"mask-b-from":F()}],"mask-image-b-to-pos":[{"mask-b-to":F()}],"mask-image-b-from-color":[{"mask-b-from":I()}],"mask-image-b-to-color":[{"mask-b-to":I()}],"mask-image-l-from-pos":[{"mask-l-from":F()}],"mask-image-l-to-pos":[{"mask-l-to":F()}],"mask-image-l-from-color":[{"mask-l-from":I()}],"mask-image-l-to-color":[{"mask-l-to":I()}],"mask-image-x-from-pos":[{"mask-x-from":F()}],"mask-image-x-to-pos":[{"mask-x-to":F()}],"mask-image-x-from-color":[{"mask-x-from":I()}],"mask-image-x-to-color":[{"mask-x-to":I()}],"mask-image-y-from-pos":[{"mask-y-from":F()}],"mask-image-y-to-pos":[{"mask-y-to":F()}],"mask-image-y-from-color":[{"mask-y-from":I()}],"mask-image-y-to-color":[{"mask-y-to":I()}],"mask-image-radial":[{"mask-radial":[to,e8]}],"mask-image-radial-from-pos":[{"mask-radial-from":F()}],"mask-image-radial-to-pos":[{"mask-radial-to":F()}],"mask-image-radial-from-color":[{"mask-radial-from":I()}],"mask-image-radial-to-color":[{"mask-radial-to":I()}],"mask-image-radial-shape":[{"mask-radial":["circle","ellipse"]}],"mask-image-radial-size":[{"mask-radial":[{closest:["side","corner"],farthest:["side","corner"]}]}],"mask-image-radial-pos":[{"mask-radial-at":y()}],"mask-image-conic-pos":[{"mask-conic":[eq]}],"mask-image-conic-from-pos":[{"mask-conic-from":F()}],"mask-image-conic-to-pos":[{"mask-conic-to":F()}],"mask-image-conic-from-color":[{"mask-conic-from":I()}],"mask-image-conic-to-color":[{"mask-conic-to":I()}],"mask-mode":[{mask:["alpha","luminance","match"]}],"mask-origin":[{"mask-origin":["border","padding","content","fill","stroke","view"]}],"mask-position":[{mask:M()}],"mask-repeat":[{mask:j()}],"mask-size":[{mask:L()}],"mask-type":[{"mask-type":["alpha","luminance"]}],"mask-image":[{mask:["none",to,e8]}],filter:[{filter:["","none",to,e8]}],blur:[{blur:B()}],brightness:[{brightness:[eq,to,e8]}],contrast:[{contrast:[eq,to,e8]}],"drop-shadow":[{"drop-shadow":["","none",p,th,tn]}],"drop-shadow-color":[{"drop-shadow":I()}],grayscale:[{grayscale:["",eq,to,e8]}],"hue-rotate":[{"hue-rotate":[eq,to,e8]}],invert:[{invert:["",eq,to,e8]}],saturate:[{saturate:[eq,to,e8]}],sepia:[{sepia:["",eq,to,e8]}],"backdrop-filter":[{"backdrop-filter":["","none",to,e8]}],"backdrop-blur":[{"backdrop-blur":B()}],"backdrop-brightness":[{"backdrop-brightness":[eq,to,e8]}],"backdrop-contrast":[{"backdrop-contrast":[eq,to,e8]}],"backdrop-grayscale":[{"backdrop-grayscale":["",eq,to,e8]}],"backdrop-hue-rotate":[{"backdrop-hue-rotate":[eq,to,e8]}],"backdrop-invert":[{"backdrop-invert":["",eq,to,e8]}],"backdrop-opacity":[{"backdrop-opacity":[eq,to,e8]}],"backdrop-saturate":[{"backdrop-saturate":[eq,to,e8]}],"backdrop-sepia":[{"backdrop-sepia":["",eq,to,e8]}],"border-collapse":[{border:["collapse","separate"]}],"border-spacing":[{"border-spacing":C()}],"border-spacing-x":[{"border-spacing-x":C()}],"border-spacing-y":[{"border-spacing-y":C()}],"table-layout":[{table:["auto","fixed"]}],caption:[{caption:["top","bottom"]}],transition:[{transition:["","all","colors","opacity","shadow","transform","none",to,e8]}],"transition-behavior":[{transition:["normal","discrete"]}],duration:[{duration:[eq,"initial",to,e8]}],ease:[{ease:["linear","initial",v,to,e8]}],delay:[{delay:[eq,to,e8]}],animate:[{animate:["none",w,to,e8]}],backface:[{backface:["hidden","visible"]}],perspective:[{perspective:[f,to,e8]}],"perspective-origin":[{"perspective-origin":x()}],rotate:[{rotate:$()}],"rotate-x":[{"rotate-x":$()}],"rotate-y":[{"rotate-y":$()}],"rotate-z":[{"rotate-z":$()}],scale:[{scale:U()}],"scale-x":[{"scale-x":U()}],"scale-y":[{"scale-y":U()}],"scale-z":[{"scale-z":U()}],"scale-3d":["scale-3d"],skew:[{skew:K()}],"skew-x":[{"skew-x":K()}],"skew-y":[{"skew-y":K()}],transform:[{transform:[to,e8,"","none","gpu","cpu"]}],"transform-origin":[{origin:x()}],"transform-style":[{transform:["3d","flat"]}],translate:[{translate:J()}],"translate-x":[{"translate-x":J()}],"translate-y":[{"translate-y":J()}],"translate-z":[{"translate-z":J()}],"translate-none":["translate-none"],accent:[{accent:I()}],appearance:[{appearance:["none","auto"]}],"caret-color":[{caret:I()}],"color-scheme":[{scheme:["normal","dark","light","light-dark","only-dark","only-light"]}],cursor:[{cursor:["auto","default","pointer","wait","text","move","help","not-allowed","none","context-menu","progress","cell","crosshair","vertical-text","alias","copy","no-drop","grab","grabbing","all-scroll","col-resize","row-resize","n-resize","e-resize","s-resize","w-resize","ne-resize","nw-resize","se-resize","sw-resize","ew-resize","ns-resize","nesw-resize","nwse-resize","zoom-in","zoom-out",to,e8]}],"field-sizing":[{"field-sizing":["fixed","content"]}],"pointer-events":[{"pointer-events":["auto","none"]}],resize:[{resize:["none","","y","x"]}],"scroll-behavior":[{scroll:["auto","smooth"]}],"scroll-m":[{"scroll-m":C()}],"scroll-mx":[{"scroll-mx":C()}],"scroll-my":[{"scroll-my":C()}],"scroll-ms":[{"scroll-ms":C()}],"scroll-me":[{"scroll-me":C()}],"scroll-mt":[{"scroll-mt":C()}],"scroll-mr":[{"scroll-mr":C()}],"scroll-mb":[{"scroll-mb":C()}],"scroll-ml":[{"scroll-ml":C()}],"scroll-p":[{"scroll-p":C()}],"scroll-px":[{"scroll-px":C()}],"scroll-py":[{"scroll-py":C()}],"scroll-ps":[{"scroll-ps":C()}],"scroll-pe":[{"scroll-pe":C()}],"scroll-pt":[{"scroll-pt":C()}],"scroll-pr":[{"scroll-pr":C()}],"scroll-pb":[{"scroll-pb":C()}],"scroll-pl":[{"scroll-pl":C()}],"snap-align":[{snap:["start","end","center","align-none"]}],"snap-stop":[{snap:["normal","always"]}],"snap-type":[{snap:["none","x","y","both"]}],"snap-strictness":[{snap:["mandatory","proximity"]}],touch:[{touch:["auto","none","manipulation"]}],"touch-x":[{"touch-pan":["x","left","right"]}],"touch-y":[{"touch-pan":["y","up","down"]}],"touch-pz":["touch-pinch-zoom"],select:[{select:["none","text","all","auto"]}],"will-change":[{"will-change":["auto","scroll","contents","transform",to,e8]}],fill:[{fill:["none",...I()]}],"stroke-w":[{stroke:[eq,tr,e7,te]}],stroke:[{stroke:["none",...I()]}],"forced-color-adjust":[{"forced-color-adjust":["auto","none"]}]},conflictingClassGroups:{overflow:["overflow-x","overflow-y"],overscroll:["overscroll-x","overscroll-y"],inset:["inset-x","inset-y","start","end","top","right","bottom","left"],"inset-x":["right","left"],"inset-y":["top","bottom"],flex:["basis","grow","shrink"],gap:["gap-x","gap-y"],p:["px","py","ps","pe","pt","pr","pb","pl"],px:["pr","pl"],py:["pt","pb"],m:["mx","my","ms","me","mt","mr","mb","ml"],mx:["mr","ml"],my:["mt","mb"],size:["w","h"],"font-size":["leading"],"fvn-normal":["fvn-ordinal","fvn-slashed-zero","fvn-figure","fvn-spacing","fvn-fraction"],"fvn-ordinal":["fvn-normal"],"fvn-slashed-zero":["fvn-normal"],"fvn-figure":["fvn-normal"],"fvn-spacing":["fvn-normal"],"fvn-fraction":["fvn-normal"],"line-clamp":["display","overflow"],rounded:["rounded-s","rounded-e","rounded-t","rounded-r","rounded-b","rounded-l","rounded-ss","rounded-se","rounded-ee","rounded-es","rounded-tl","rounded-tr","rounded-br","rounded-bl"],"rounded-s":["rounded-ss","rounded-es"],"rounded-e":["rounded-se","rounded-ee"],"rounded-t":["rounded-tl","rounded-tr"],"rounded-r":["rounded-tr","rounded-br"],"rounded-b":["rounded-br","rounded-bl"],"rounded-l":["rounded-tl","rounded-bl"],"border-spacing":["border-spacing-x","border-spacing-y"],"border-w":["border-w-x","border-w-y","border-w-s","border-w-e","border-w-t","border-w-r","border-w-b","border-w-l"],"border-w-x":["border-w-r","border-w-l"],"border-w-y":["border-w-t","border-w-b"],"border-color":["border-color-x","border-color-y","border-color-s","border-color-e","border-color-t","border-color-r","border-color-b","border-color-l"],"border-color-x":["border-color-r","border-color-l"],"border-color-y":["border-color-t","border-color-b"],translate:["translate-x","translate-y","translate-none"],"translate-none":["translate","translate-x","translate-y","translate-z"],"scroll-m":["scroll-mx","scroll-my","scroll-ms","scroll-me","scroll-mt","scroll-mr","scroll-mb","scroll-ml"],"scroll-mx":["scroll-mr","scroll-ml"],"scroll-my":["scroll-mt","scroll-mb"],"scroll-p":["scroll-px","scroll-py","scroll-ps","scroll-pe","scroll-pt","scroll-pr","scroll-pb","scroll-pl"],"scroll-px":["scroll-pr","scroll-pl"],"scroll-py":["scroll-pt","scroll-pb"],touch:["touch-x","touch-y","touch-pz"],"touch-x":["touch"],"touch-y":["touch"],"touch-pz":["touch"]},conflictingClassGroupModifiers:{"font-size":["leading"]},orderSensitiveModifiers:["*","**","after","backdrop","before","details-content","file","first-letter","first-line","marker","placeholder","selection"]}});function tx(...e){return ty(eC(e))}function t_({children:e,className:t}){return(0,W.jsx)("div",{className:tx("flex flex-col h-full bg-card overflow-hidden",t),children:e})}let tD=({className:e="w-5 h-5"})=>(0,W.jsxs)("svg",{viewBox:"0 0 24 24",fill:"none",className:e,children:[(0,W.jsx)("circle",{cx:"12",cy:"12",r:"10",stroke:"currentColor",strokeWidth:"1.5"}),(0,W.jsx)("circle",{cx:"12",cy:"12",r:"6",stroke:"currentColor",strokeWidth:"1.5",opacity:"0.6"}),(0,W.jsx)("circle",{cx:"12",cy:"12",r:"2",fill:"currentColor"})]}),tC=()=>(0,W.jsx)("svg",{className:"w-3 h-3 text-white",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:(0,W.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:3,d:"M5 13l4 4L19 7"})});function tS(e){return e.width&&e.height&&e.height>0?e.width/e.height:1}function tE({samples:e,onLoadMore:t,hasMore:i}){let n=(0,H.useRef)(null),[o,r]=(0,H.useState)(0),{selectedIds:s,isLassoSelection:a,selectionSource:l,toggleSelection:d,addToSelection:h,setHoveredId:u,hoveredId:c,labelFilter:p}=eD();(0,H.useEffect)(()=>{let e=n.current;if(!e)return;let t=()=>{let t=e.clientWidth;t>0&&t!==o&&r(t)};t();let i=new ResizeObserver(()=>{requestAnimationFrame(t)});return i.observe(e),()=>i.disconnect()},[o]);let{boxes:m,containerHeight:f}=(0,H.useMemo)(()=>(function(e,t){if(0===e.length||t<=0)return{boxes:[],containerHeight:0};let i=e.map(tS),n=(0,er.default)(i,{containerWidth:t,containerPadding:0,boxSpacing:2,targetRowHeight:180,targetRowHeightTolerance:.25,showWidows:!0});return{boxes:n.boxes,containerHeight:n.containerHeight}})(e,o),[e,o]),g=(0,H.useMemo)(()=>(function(e){if(0===e.length)return[];let t=[],i=e[0].top,n=0,o=e[0].height;for(let r=1;r1?(t.push({startIndex:n,endIndex:r,top:i,height:o}),n=r,i=s.top,o=s.height):o=Math.max(o,s.height)}return t.push({startIndex:n,endIndex:e.length,top:i,height:o}),t})(m),[m]),v=function({useFlushSync:e=!0,...t}){let i=H.useReducer(()=>({}),{})[1],n={...t,onChange:(n,o)=>{var r;e&&o?(0,F.flushSync)(i):i(),null==(r=t.onChange)||r.call(t,n,o)}},[o]=H.useState(()=>new ei(n));return o.setOptions(n),eo(()=>o._didMount(),[]),eo(()=>o._willUpdate()),o}({observeElementRect:X,observeElementOffset:Q,scrollToFn:et,...{count:g.length,getScrollElement:()=>n.current,estimateSize:e=>g[e]?.height??180,overscan:3,getItemKey:t=>{let i=g[t];return i&&e.slice(i.startIndex,i.endIndex).map(e=>e.id).join("-")||`row-${t}`}}});(0,H.useEffect)(()=>{let e=n.current;if(!e||!t||!i)return;let o=()=>{let{scrollTop:i,scrollHeight:n,clientHeight:o}=e;n-i-o<500&&t()};return e.addEventListener("scroll",o),()=>e.removeEventListener("scroll",o)},[t,i]),(0,H.useEffect)(()=>{n.current?.scrollTo({top:0})},[p]),(0,H.useEffect)(()=>{if(!a&&"scatter"===l&&0!==s.size)try{v.scrollToIndex(0,{align:"start"})}catch{n.current?.scrollTo({top:0})}},[a,s,l,v]);let w=(0,H.useCallback)((t,i)=>{if(i.metaKey||i.ctrlKey)d(t.id);else if(i.shiftKey&&s.size>0){let i=Array.from(s),n=i[i.length-1],o=e.findIndex(e=>e.id===n),r=e.findIndex(e=>e.id===t.id);if(-1!==o&&-1!==r){let t=Math.min(o,r),i=Math.max(o,r);h(e.slice(t,i+1).map(e=>e.id))}}else{let e=new Set;e.add(t.id),eD.getState().setSelectedIds(e,"grid")}},[e,s,d,h]),b=v.getVirtualItems();return(0,W.jsx)(t_,{children:(0,W.jsx)("div",{className:"flex-1 min-h-0 overflow-hidden",children:(0,W.jsx)("div",{ref:n,className:"panel-scroll h-full min-h-0 overflow-auto",children:(0,W.jsx)("div",{style:{height:f||"100%",width:"100%",position:"relative"},children:b.map(t=>{let i=g[t.index];if(!i)return null;let n=e.slice(i.startIndex,i.endIndex),o=m.slice(i.startIndex,i.endIndex);return(0,W.jsx)("div",{style:{position:"absolute",top:0,left:0,width:"100%",height:i.height,transform:`translateY(${i.top}px)`},children:n.map((e,t)=>{let i=o[t];if(!i)return null;let n=!!a||s.has(e.id),r=c===e.id;return(0,W.jsxs)("div",{style:{position:"absolute",left:i.left,top:0,width:i.width,height:i.height},className:` + overflow-hidden cursor-pointer + transition-shadow duration-150 ease-out + ${n?"ring-2 ring-inset ring-primary":""} + ${r&&!n?"ring-2 ring-inset ring-primary/50":""} + `,onClick:t=>w(e,t),onMouseEnter:()=>u(e.id),onMouseLeave:()=>u(null),children:[e.thumbnail?(0,W.jsx)("img",{src:`data:image/jpeg;base64,${e.thumbnail}`,alt:e.filename,className:"w-full h-full object-cover",loading:"lazy"}):(0,W.jsx)("div",{className:"w-full h-full bg-muted flex items-center justify-center",children:(0,W.jsx)("span",{className:"text-muted-foreground text-xs",children:"No image"})}),e.label&&(0,W.jsx)("div",{className:"absolute bottom-0.5 left-0.5 right-0.5",children:(0,W.jsx)("span",{className:"inline-block px-1 py-0.5 text-[10px] leading-tight truncate max-w-full",style:{backgroundColor:"rgba(0,0,0,0.7)",color:"#fff"},children:e.label})}),n&&(0,W.jsx)("div",{className:"absolute top-0.5 right-0.5 w-4 h-4 rounded-full bg-primary flex items-center justify-center",children:(0,W.jsx)(tC,{})})]},e.id)})},t.key)})})})})})}let tA=e=>{let t=e.replace(/^([A-Z])|[\s-_]+(\w)/g,(e,t,i)=>i?i.toUpperCase():t.toLowerCase());return t.charAt(0).toUpperCase()+t.slice(1)},tk=(...e)=>e.filter((e,t,i)=>!!e&&""!==e.trim()&&i.indexOf(e)===t).join(" ").trim();var tP={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};let tz=(0,H.forwardRef)(({color:e="currentColor",size:t=24,strokeWidth:i=2,absoluteStrokeWidth:n,className:o="",children:r,iconNode:s,...a},l)=>(0,H.createElement)("svg",{ref:l,...tP,width:t,height:t,stroke:e,strokeWidth:n?24*Number(i)/Number(t):i,className:tk("lucide",o),...!r&&!(e=>{for(let t in e)if(t.startsWith("aria-")||"role"===t||"title"===t)return!0})(a)&&{"aria-hidden":"true"},...a},[...s.map(([e,t])=>(0,H.createElement)(e,t)),...Array.isArray(r)?r:[r]])),tO=(e,t)=>{let i=(0,H.forwardRef)(({className:i,...n},o)=>(0,H.createElement)(tz,{ref:o,iconNode:t,className:tk(`lucide-${tA(e).replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase()}`,`lucide-${e}`,i),...n}));return i.displayName=tA(e),i},tR=tO("settings-2",[["path",{d:"M14 17H5",key:"gfn3mx"}],["path",{d:"M19 7h-9",key:"6i9tg"}],["circle",{cx:"17",cy:"17",r:"3",key:"18b49y"}],["circle",{cx:"7",cy:"7",r:"3",key:"dfmy0x"}]]);function tN(e,t){if("function"==typeof e)return e(t);null!=e&&(e.current=t)}function tI(...e){return t=>{let i=!1,n=e.map(e=>{let n=tN(e,t);return i||"function"!=typeof n||(i=!0),n});if(i)return()=>{for(let t=0;t{let{children:i,...n}=e;if(tT(i)&&"function"==typeof tL&&(i=tL(i._payload)),H.isValidElement(i)){var o;let e,r,s=(o=i,(r=(e=Object.getOwnPropertyDescriptor(o.props,"ref")?.get)&&"isReactWarning"in e&&e.isReactWarning)?o.ref:(r=(e=Object.getOwnPropertyDescriptor(o,"ref")?.get)&&"isReactWarning"in e&&e.isReactWarning)?o.props.ref:o.props.ref||o.ref),a=function(e,t){let i={...t};for(let n in t){let o=e[n],r=t[n];/^on[A-Z]/.test(n)?o&&r?i[n]=(...e)=>{let t=r(...e);return o(...e),t}:o&&(i[n]=o):"style"===n?i[n]={...o,...r}:"className"===n&&(i[n]=[o,r].filter(Boolean).join(" "))}return{...e,...i}}(n,i.props);return i.type!==H.Fragment&&(a.ref=t?tI(t,s):s),H.cloneElement(i,a)}return H.Children.count(i)>1?H.Children.only(null):null})).displayName="Slot.SlotClone",t=g,(i=H.forwardRef((e,i)=>{let{children:n,...o}=e;tT(n)&&"function"==typeof tL&&(n=tL(n._payload));let r=H.Children.toArray(n),s=r.find(tW);if(s){let e=s.props.children,n=r.map(t=>t!==s?t:H.Children.count(e)>1?H.Children.only(null):H.isValidElement(e)?e.props.children:null);return(0,W.jsx)(t,{...o,ref:i,children:H.isValidElement(e)?H.cloneElement(e,void 0,n):null})}return(0,W.jsx)(t,{...o,ref:i,children:n})})).displayName="Slot.Slot",i),tV=Symbol("radix.slottable");function tW(e){return H.isValidElement(e)&&"function"==typeof e.type&&"__radixId"in e.type&&e.type.__radixId===tV}let tH=e=>"boolean"==typeof e?`${e}`:0===e?"0":e,tF=(n="inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",o={variants:{variant:{default:"bg-primary text-primary-foreground shadow hover:bg-primary/90",destructive:"bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90",outline:"border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground",secondary:"bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80",ghost:"hover:bg-accent hover:text-accent-foreground",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-9 px-4 py-2",sm:"h-8 rounded-md px-3 text-xs",lg:"h-10 rounded-md px-8",icon:"h-9 w-9"}},defaultVariants:{variant:"default",size:"default"}},e=>{var t;if((null==o?void 0:o.variants)==null)return eC(n,null==e?void 0:e.class,null==e?void 0:e.className);let{variants:i,defaultVariants:r}=o,s=Object.keys(i).map(t=>{let n=null==e?void 0:e[t],o=null==r?void 0:r[t];if(null===n)return null;let s=tH(n)||tH(o);return i[t][s]}),a=e&&Object.entries(e).reduce((e,t)=>{let[i,n]=t;return void 0===n||(e[i]=n),e},{});return eC(n,s,null==o||null==(t=o.compoundVariants)?void 0:t.reduce((e,t)=>{let{class:i,className:n,...o}=t;return Object.entries(o).every(e=>{let[t,i]=e;return Array.isArray(i)?i.includes({...r,...a}[t]):({...r,...a})[t]===i})?[...e,i,n]:e},[]),null==e?void 0:e.class,null==e?void 0:e.className)}),tB=H.forwardRef(({className:e,variant:t,size:i,asChild:n=!1,...o},r)=>(0,W.jsx)(n?tG:"button",{className:tx(tF({variant:t,size:i,className:e})),ref:r,...o}));function t$(e,t,{checkForDefaultPrevented:i=!0}={}){return function(n){if(e?.(n),!1===i||!n.defaultPrevented)return t?.(n)}}function tU(e,t=[]){let i=[],n=()=>{let t=i.map(e=>H.createContext(e));return function(i){let n=i?.[e]||t;return H.useMemo(()=>({[`__scope${e}`]:{...i,[e]:n}}),[i,n])}};return n.scopeName=e,[function(t,n){let o=H.createContext(n),r=i.length;i=[...i,n];let s=t=>{let{scope:i,children:n,...s}=t,a=i?.[e]?.[r]||o,l=H.useMemo(()=>s,Object.values(s));return(0,W.jsx)(a.Provider,{value:l,children:n})};return s.displayName=t+"Provider",[s,function(i,s){let a=s?.[e]?.[r]||o,l=H.useContext(a);if(l)return l;if(void 0!==n)return n;throw Error(`\`${i}\` must be used within \`${t}\``)}]},function(...e){let t=e[0];if(1===e.length)return t;let i=()=>{let i=e.map(e=>({useScope:e(),scopeName:e.scopeName}));return function(e){let n=i.reduce((t,{useScope:i,scopeName:n})=>{let o=i(e)[`__scope${n}`];return{...t,...o}},{});return H.useMemo(()=>({[`__scope${t.scopeName}`]:n}),[n])}};return i.scopeName=t.scopeName,i}(n,...t)]}tB.displayName="Button","u">typeof window&&window.document&&window.document.createElement;var tK=globalThis?.document?H.useLayoutEffect:()=>{};H[" useEffectEvent ".trim().toString()],H[" useInsertionEffect ".trim().toString()];var tJ=H[" useInsertionEffect ".trim().toString()]||tK;function tZ({prop:e,defaultProp:t,onChange:i=()=>{},caller:n}){let[o,r,s]=function({defaultProp:e,onChange:t}){let[i,n]=H.useState(e),o=H.useRef(i),r=H.useRef(t);return tJ(()=>{r.current=t},[t]),H.useEffect(()=>{o.current!==i&&(r.current?.(i),o.current=i)},[i,o]),[i,n,r]}({defaultProp:t,onChange:i}),a=void 0!==e,l=a?e:o;{let t=H.useRef(void 0!==e);H.useEffect(()=>{let e=t.current;if(e!==a){let t=a?"controlled":"uncontrolled";console.warn(`${n} is changing from ${e?"controlled":"uncontrolled"} to ${t}. Components should not switch from controlled to uncontrolled (or vice versa). Decide between using a controlled or uncontrolled value for the lifetime of the component.`)}t.current=a},[a,n])}return[l,H.useCallback(t=>{if(a){let i="function"==typeof t?t(e):t;i!==e&&s.current?.(i)}else r(t)},[a,e,r,s])]}Symbol("RADIX:SYNC_STATE");var tX=Symbol("radix.slottable");function tq(e){return H.isValidElement(e)&&"function"==typeof e.type&&"__radixId"in e.type&&e.type.__radixId===tX}var tY=["a","button","div","form","h2","h3","img","input","label","li","nav","ol","p","select","span","svg","ul"].reduce((e,t)=>{var i,n;let o,r,s,a=(n=i=`Primitive.${t}`,(o=H.forwardRef((e,t)=>{let{children:i,...n}=e;if(H.isValidElement(i)){var o;let e,r,s=(o=i,(r=(e=Object.getOwnPropertyDescriptor(o.props,"ref")?.get)&&"isReactWarning"in e&&e.isReactWarning)?o.ref:(r=(e=Object.getOwnPropertyDescriptor(o,"ref")?.get)&&"isReactWarning"in e&&e.isReactWarning)?o.props.ref:o.props.ref||o.ref),a=function(e,t){let i={...t};for(let n in t){let o=e[n],r=t[n];/^on[A-Z]/.test(n)?o&&r?i[n]=(...e)=>{let t=r(...e);return o(...e),t}:o&&(i[n]=o):"style"===n?i[n]={...o,...r}:"className"===n&&(i[n]=[o,r].filter(Boolean).join(" "))}return{...e,...i}}(n,i.props);return i.type!==H.Fragment&&(a.ref=t?tI(t,s):s),H.cloneElement(i,a)}return H.Children.count(i)>1?H.Children.only(null):null})).displayName=`${n}.SlotClone`,r=o,(s=H.forwardRef((e,t)=>{let{children:i,...n}=e,o=H.Children.toArray(i),s=o.find(tq);if(s){let e=s.props.children,i=o.map(t=>t!==s?t:H.Children.count(e)>1?H.Children.only(null):H.isValidElement(e)?e.props.children:null);return(0,W.jsx)(r,{...n,ref:t,children:H.isValidElement(e)?H.cloneElement(e,void 0,i):null})}return(0,W.jsx)(r,{...n,ref:t,children:i})})).displayName=`${i}.Slot`,s),l=H.forwardRef((e,i)=>{let{asChild:n,...o}=e;return"u">typeof window&&(window[Symbol.for("radix-ui")]=!0),(0,W.jsx)(n?a:t,{...o,ref:i})});return l.displayName=`Primitive.${t}`,{...e,[t]:l}},{});function tQ(e,t){e&&F.flushSync(()=>e.dispatchEvent(t))}function t0(e){var t;let i,n=(t=e,(i=H.forwardRef((e,t)=>{let{children:i,...n}=e;if(H.isValidElement(i)){var o;let e,r,s=(o=i,(r=(e=Object.getOwnPropertyDescriptor(o.props,"ref")?.get)&&"isReactWarning"in e&&e.isReactWarning)?o.ref:(r=(e=Object.getOwnPropertyDescriptor(o,"ref")?.get)&&"isReactWarning"in e&&e.isReactWarning)?o.props.ref:o.props.ref||o.ref),a=function(e,t){let i={...t};for(let n in t){let o=e[n],r=t[n];/^on[A-Z]/.test(n)?o&&r?i[n]=(...e)=>{let t=r(...e);return o(...e),t}:o&&(i[n]=o):"style"===n?i[n]={...o,...r}:"className"===n&&(i[n]=[o,r].filter(Boolean).join(" "))}return{...e,...i}}(n,i.props);return i.type!==H.Fragment&&(a.ref=t?tI(t,s):s),H.cloneElement(i,a)}return H.Children.count(i)>1?H.Children.only(null):null})).displayName=`${t}.SlotClone`,i),o=H.forwardRef((e,t)=>{let{children:i,...o}=e,r=H.Children.toArray(i),s=r.find(t2);if(s){let e=s.props.children,i=r.map(t=>t!==s?t:H.Children.count(e)>1?H.Children.only(null):H.isValidElement(e)?e.props.children:null);return(0,W.jsx)(n,{...o,ref:t,children:H.isValidElement(e)?H.cloneElement(e,void 0,i):null})}return(0,W.jsx)(n,{...o,ref:t,children:i})});return o.displayName=`${e}.Slot`,o}var t1=Symbol("radix.slottable");function t2(e){return H.isValidElement(e)&&"function"==typeof e.type&&"__radixId"in e.type&&e.type.__radixId===t1}function t3(e){let t=e+"CollectionProvider",[i,n]=tU(t),[o,r]=i(t,{collectionRef:{current:null},itemMap:new Map}),s=e=>{let{scope:t,children:i}=e,n=H.default.useRef(null),r=H.default.useRef(new Map).current;return(0,W.jsx)(o,{scope:t,itemMap:r,collectionRef:n,children:i})};s.displayName=t;let a=e+"CollectionSlot",l=t0(a),d=H.default.forwardRef((e,t)=>{let{scope:i,children:n}=e,o=tM(t,r(a,i).collectionRef);return(0,W.jsx)(l,{ref:o,children:n})});d.displayName=a;let h=e+"CollectionItemSlot",u="data-radix-collection-item",c=t0(h),p=H.default.forwardRef((e,t)=>{let{scope:i,children:n,...o}=e,s=H.default.useRef(null),a=tM(t,s),l=r(h,i);return H.default.useEffect(()=>(l.itemMap.set(s,{ref:s,...o}),()=>void l.itemMap.delete(s))),(0,W.jsx)(c,{...{[u]:""},ref:a,children:n})});return p.displayName=h,[{Provider:s,Slot:d,ItemSlot:p},function(t){let i=r(e+"CollectionConsumer",t);return H.default.useCallback(()=>{let e=i.collectionRef.current;if(!e)return[];let t=Array.from(e.querySelectorAll(`[${u}]`));return Array.from(i.itemMap.values()).sort((e,i)=>t.indexOf(e.ref.current)-t.indexOf(i.ref.current))},[i.collectionRef,i.itemMap])},n]}var t5=new WeakMap;function t4(e,t){var i,n;let o,r,s;if("at"in Array.prototype)return Array.prototype.at.call(e,t);let a=(i=e,n=t,o=i.length,(s=(r=t6(n))>=0?r:o+r)<0||s>=o?-1:s);return -1===a?void 0:e[a]}function t6(e){return e!=e||0===e?0:Math.trunc(e)}(class e extends Map{#e;constructor(e){super(e),this.#e=[...super.keys()],t5.set(this,!0)}set(e,t){return t5.get(this)&&(this.has(e)?this.#e[this.#e.indexOf(e)]=e:this.#e.push(e)),super.set(e,t),this}insert(e,t,i){let n,o=this.has(t),r=this.#e.length,s=t6(e),a=s>=0?s:r+s,l=a<0||a>=r?-1:a;if(l===this.size||o&&l===this.size-1||-1===l)return this.set(t,i),this;let d=this.size+ +!o;s<0&&a++;let h=[...this.#e],u=!1;for(let e=a;e=this.size&&(n=this.size-1),this.at(n)}keyFrom(e,t){let i=this.indexOf(e);if(-1===i)return;let n=i+t;return n<0&&(n=0),n>=this.size&&(n=this.size-1),this.keyAt(n)}find(e,t){let i=0;for(let n of this){if(Reflect.apply(e,t,[n,i,this]))return n;i++}}findIndex(e,t){let i=0;for(let n of this){if(Reflect.apply(e,t,[n,i,this]))return i;i++}return -1}filter(t,i){let n=[],o=0;for(let e of this)Reflect.apply(t,i,[e,o,this])&&n.push(e),o++;return new e(n)}map(t,i){let n=[],o=0;for(let e of this)n.push([e[0],Reflect.apply(t,i,[e,o,this])]),o++;return new e(n)}reduce(...e){let[t,i]=e,n=0,o=i??this.at(0);for(let i of this)o=0===n&&1===e.length?i:Reflect.apply(t,this,[o,i,n,this]),n++;return o}reduceRight(...e){let[t,i]=e,n=i??this.at(-1);for(let i=this.size-1;i>=0;i--){let o=this.at(i);n=i===this.size-1&&1===e.length?o:Reflect.apply(t,this,[n,o,i,this])}return n}toSorted(t){return new e([...this.entries()].sort(t))}toReversed(){let t=new e;for(let e=this.size-1;e>=0;e--){let i=this.keyAt(e),n=this.get(i);t.set(i,n)}return t}toSpliced(...t){let i=[...this.entries()];return i.splice(...t),new e(i)}slice(t,i){let n=new e,o=this.size-1;if(void 0===t)return n;t<0&&(t+=this.size),void 0!==i&&i>0&&(o=i-1);for(let e=t;e<=o;e++){let t=this.keyAt(e),i=this.get(t);n.set(t,i)}return n}every(e,t){let i=0;for(let n of this){if(!Reflect.apply(e,t,[n,i,this]))return!1;i++}return!0}some(e,t){let i=0;for(let n of this){if(Reflect.apply(e,t,[n,i,this]))return!0;i++}return!1}});var t9=H.createContext(void 0);function t8(e){let t=H.useContext(t9);return e||t||"ltr"}function t7(e){let t=H.useRef(e);return H.useEffect(()=>{t.current=e}),H.useMemo(()=>(...e)=>t.current?.(...e),[])}var ie="dismissableLayer.update",it=H.createContext({layers:new Set,layersWithOutsidePointerEventsDisabled:new Set,branches:new Set}),ii=H.forwardRef((e,t)=>{let{disableOutsidePointerEvents:i=!1,onEscapeKeyDown:n,onPointerDownOutside:o,onFocusOutside:r,onInteractOutside:s,onDismiss:a,...l}=e,d=H.useContext(it),[h,u]=H.useState(null),c=h?.ownerDocument??globalThis?.document,[,p]=H.useState({}),m=tM(t,e=>u(e)),f=Array.from(d.layers),[g]=[...d.layersWithOutsidePointerEventsDisabled].slice(-1),v=f.indexOf(g),w=h?f.indexOf(h):-1,b=d.layersWithOutsidePointerEventsDisabled.size>0,y=w>=v,x=function(e,t=globalThis?.document){let i=t7(e),n=H.useRef(!1),o=H.useRef(()=>{});return H.useEffect(()=>{let e=e=>{if(e.target&&!n.current){let n=function(){ir("dismissableLayer.pointerDownOutside",i,r,{discrete:!0})},r={originalEvent:e};"touch"===e.pointerType?(t.removeEventListener("click",o.current),o.current=n,t.addEventListener("click",o.current,{once:!0})):n()}else t.removeEventListener("click",o.current);n.current=!1},r=window.setTimeout(()=>{t.addEventListener("pointerdown",e)},0);return()=>{window.clearTimeout(r),t.removeEventListener("pointerdown",e),t.removeEventListener("click",o.current)}},[t,i]),{onPointerDownCapture:()=>n.current=!0}}(e=>{let t=e.target,i=[...d.branches].some(e=>e.contains(t));y&&!i&&(o?.(e),s?.(e),e.defaultPrevented||a?.())},c),_=function(e,t=globalThis?.document){let i=t7(e),n=H.useRef(!1);return H.useEffect(()=>{let e=e=>{e.target&&!n.current&&ir("dismissableLayer.focusOutside",i,{originalEvent:e},{discrete:!1})};return t.addEventListener("focusin",e),()=>t.removeEventListener("focusin",e)},[t,i]),{onFocusCapture:()=>n.current=!0,onBlurCapture:()=>n.current=!1}}(e=>{let t=e.target;![...d.branches].some(e=>e.contains(t))&&(r?.(e),s?.(e),e.defaultPrevented||a?.())},c);return!function(e,t=globalThis?.document){let i=t7(e);H.useEffect(()=>{let e=e=>{"Escape"===e.key&&i(e)};return t.addEventListener("keydown",e,{capture:!0}),()=>t.removeEventListener("keydown",e,{capture:!0})},[i,t])}(e=>{w===d.layers.size-1&&(n?.(e),!e.defaultPrevented&&a&&(e.preventDefault(),a()))},c),H.useEffect(()=>{if(h)return i&&(0===d.layersWithOutsidePointerEventsDisabled.size&&(N=c.body.style.pointerEvents,c.body.style.pointerEvents="none"),d.layersWithOutsidePointerEventsDisabled.add(h)),d.layers.add(h),io(),()=>{i&&1===d.layersWithOutsidePointerEventsDisabled.size&&(c.body.style.pointerEvents=N)}},[h,c,i,d]),H.useEffect(()=>()=>{h&&(d.layers.delete(h),d.layersWithOutsidePointerEventsDisabled.delete(h),io())},[h,d]),H.useEffect(()=>{let e=()=>p({});return document.addEventListener(ie,e),()=>document.removeEventListener(ie,e)},[]),(0,W.jsx)(tY.div,{...l,ref:m,style:{pointerEvents:b?y?"auto":"none":void 0,...e.style},onFocusCapture:t$(e.onFocusCapture,_.onFocusCapture),onBlurCapture:t$(e.onBlurCapture,_.onBlurCapture),onPointerDownCapture:t$(e.onPointerDownCapture,x.onPointerDownCapture)})});function io(){let e=new CustomEvent(ie);document.dispatchEvent(e)}function ir(e,t,i,{discrete:n}){let o=i.originalEvent.target,r=new CustomEvent(e,{bubbles:!1,cancelable:!0,detail:i});t&&o.addEventListener(e,t,{once:!0}),n?tQ(o,r):o.dispatchEvent(r)}ii.displayName="DismissableLayer",H.forwardRef((e,t)=>{let i=H.useContext(it),n=H.useRef(null),o=tM(t,n);return H.useEffect(()=>{let e=n.current;if(e)return i.branches.add(e),()=>{i.branches.delete(e)}},[i.branches]),(0,W.jsx)(tY.div,{...e,ref:o})}).displayName="DismissableLayerBranch";var is=0;function ia(){H.useEffect(()=>{let e=document.querySelectorAll("[data-radix-focus-guard]");return document.body.insertAdjacentElement("afterbegin",e[0]??il()),document.body.insertAdjacentElement("beforeend",e[1]??il()),is++,()=>{1===is&&document.querySelectorAll("[data-radix-focus-guard]").forEach(e=>e.remove()),is--}},[])}function il(){let e=document.createElement("span");return e.setAttribute("data-radix-focus-guard",""),e.tabIndex=0,e.style.outline="none",e.style.opacity="0",e.style.position="fixed",e.style.pointerEvents="none",e}var id="focusScope.autoFocusOnMount",ih="focusScope.autoFocusOnUnmount",iu={bubbles:!1,cancelable:!0},ic=H.forwardRef((e,t)=>{let{loop:i=!1,trapped:n=!1,onMountAutoFocus:o,onUnmountAutoFocus:r,...s}=e,[a,l]=H.useState(null),d=t7(o),h=t7(r),u=H.useRef(null),c=tM(t,e=>l(e)),p=H.useRef({paused:!1,pause(){this.paused=!0},resume(){this.paused=!1}}).current;H.useEffect(()=>{if(n){let e=function(e){if(p.paused||!a)return;let t=e.target;a.contains(t)?u.current=t:ig(u.current,{select:!0})},t=function(e){if(p.paused||!a)return;let t=e.relatedTarget;null!==t&&(a.contains(t)||ig(u.current,{select:!0}))};document.addEventListener("focusin",e),document.addEventListener("focusout",t);let i=new MutationObserver(function(e){if(document.activeElement===document.body)for(let t of e)t.removedNodes.length>0&&ig(a)});return a&&i.observe(a,{childList:!0,subtree:!0}),()=>{document.removeEventListener("focusin",e),document.removeEventListener("focusout",t),i.disconnect()}}},[n,a,p.paused]),H.useEffect(()=>{if(a){iv.add(p);let e=document.activeElement;if(!a.contains(e)){let t=new CustomEvent(id,iu);a.addEventListener(id,d),a.dispatchEvent(t),t.defaultPrevented||(function(e,{select:t=!1}={}){let i=document.activeElement;for(let n of e)if(ig(n,{select:t}),document.activeElement!==i)return}(ip(a).filter(e=>"A"!==e.tagName),{select:!0}),document.activeElement===e&&ig(a))}return()=>{a.removeEventListener(id,d),setTimeout(()=>{let t=new CustomEvent(ih,iu);a.addEventListener(ih,h),a.dispatchEvent(t),t.defaultPrevented||ig(e??document.body,{select:!0}),a.removeEventListener(ih,h),iv.remove(p)},0)}}},[a,d,h,p]);let m=H.useCallback(e=>{if(!i&&!n||p.paused)return;let t="Tab"===e.key&&!e.altKey&&!e.ctrlKey&&!e.metaKey,o=document.activeElement;if(t&&o){var r;let t,n=e.currentTarget,[s,a]=[im(t=ip(r=n),r),im(t.reverse(),r)];s&&a?e.shiftKey||o!==a?e.shiftKey&&o===s&&(e.preventDefault(),i&&ig(a,{select:!0})):(e.preventDefault(),i&&ig(s,{select:!0})):o===n&&e.preventDefault()}},[i,n,p.paused]);return(0,W.jsx)(tY.div,{tabIndex:-1,...s,ref:c,onKeyDown:m})});function ip(e){let t=[],i=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT,{acceptNode:e=>{let t="INPUT"===e.tagName&&"hidden"===e.type;return e.disabled||e.hidden||t?NodeFilter.FILTER_SKIP:e.tabIndex>=0?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP}});for(;i.nextNode();)t.push(i.currentNode);return t}function im(e,t){for(let i of e)if(!function(e,{upTo:t}){if("hidden"===getComputedStyle(e).visibility)return!0;for(;e&&(void 0===t||e!==t);){if("none"===getComputedStyle(e).display)return!0;e=e.parentElement}return!1}(i,{upTo:t}))return i}function ig(e,{select:t=!1}={}){if(e&&e.focus){var i;let n=document.activeElement;e.focus({preventScroll:!0}),e!==n&&(i=e)instanceof HTMLInputElement&&"select"in i&&t&&e.select()}}ic.displayName="FocusScope";var iv=(v=[],{add(e){let t=v[0];e!==t&&t?.pause(),(v=iw(v,e)).unshift(e)},remove(e){v=iw(v,e),v[0]?.resume()}});function iw(e,t){let i=[...e],n=i.indexOf(t);return -1!==n&&i.splice(n,1),i}var ib=H[" useId ".trim().toString()]||(()=>void 0),iy=0;function ix(e){let[t,i]=H.useState(ib());return tK(()=>{e||i(e=>e??String(iy++))},[e]),e||(t?`radix-${t}`:"")}let i_=["top","right","bottom","left"],iD=Math.min,iC=Math.max,iS=Math.round,iE=Math.floor,iA=e=>({x:e,y:e}),ik={left:"right",right:"left",bottom:"top",top:"bottom"},iP={start:"end",end:"start"};function iz(e,t){return"function"==typeof e?e(t):e}function iO(e){return e.split("-")[0]}function iR(e){return e.split("-")[1]}function iN(e){return"x"===e?"y":"x"}function iI(e){return"y"===e?"height":"width"}let iM=new Set(["top","bottom"]);function ij(e){return iM.has(iO(e))?"y":"x"}function iL(e){return e.replace(/start|end/g,e=>iP[e])}let iT=["left","right"],iG=["right","left"],iV=["top","bottom"],iW=["bottom","top"];function iH(e){return e.replace(/left|right|bottom|top/g,e=>ik[e])}function iF(e){return"number"!=typeof e?{top:0,right:0,bottom:0,left:0,...e}:{top:e,right:e,bottom:e,left:e}}function iB(e){let{x:t,y:i,width:n,height:o}=e;return{width:n,height:o,top:i,left:t,right:t+n,bottom:i+o,x:t,y:i}}function i$(e,t,i){let n,{reference:o,floating:r}=e,s=ij(t),a=iN(ij(t)),l=iI(a),d=iO(t),h="y"===s,u=o.x+o.width/2-r.width/2,c=o.y+o.height/2-r.height/2,p=o[l]/2-r[l]/2;switch(d){case"top":n={x:u,y:o.y-r.height};break;case"bottom":n={x:u,y:o.y+o.height};break;case"right":n={x:o.x+o.width,y:c};break;case"left":n={x:o.x-r.width,y:c};break;default:n={x:o.x,y:o.y}}switch(iR(t)){case"start":n[a]-=p*(i&&h?-1:1);break;case"end":n[a]+=p*(i&&h?-1:1)}return n}async function iU(e,t){var i;void 0===t&&(t={});let{x:n,y:o,platform:r,rects:s,elements:a,strategy:l}=e,{boundary:d="clippingAncestors",rootBoundary:h="viewport",elementContext:u="floating",altBoundary:c=!1,padding:p=0}=iz(t,e),m=iF(p),f=a[c?"floating"===u?"reference":"floating":u],g=iB(await r.getClippingRect({element:null==(i=await (null==r.isElement?void 0:r.isElement(f)))||i?f:f.contextElement||await (null==r.getDocumentElement?void 0:r.getDocumentElement(a.floating)),boundary:d,rootBoundary:h,strategy:l})),v="floating"===u?{x:n,y:o,width:s.floating.width,height:s.floating.height}:s.reference,w=await (null==r.getOffsetParent?void 0:r.getOffsetParent(a.floating)),b=await (null==r.isElement?void 0:r.isElement(w))&&await (null==r.getScale?void 0:r.getScale(w))||{x:1,y:1},y=iB(r.convertOffsetParentRelativeRectToViewportRelativeRect?await r.convertOffsetParentRelativeRectToViewportRelativeRect({elements:a,rect:v,offsetParent:w,strategy:l}):v);return{top:(g.top-y.top+m.top)/b.y,bottom:(y.bottom-g.bottom+m.bottom)/b.y,left:(g.left-y.left+m.left)/b.x,right:(y.right-g.right+m.right)/b.x}}let iK=async(e,t,i)=>{let{placement:n="bottom",strategy:o="absolute",middleware:r=[],platform:s}=i,a=r.filter(Boolean),l=await (null==s.isRTL?void 0:s.isRTL(t)),d=await s.getElementRects({reference:e,floating:t,strategy:o}),{x:h,y:u}=i$(d,n,l),c=n,p={},m=0;for(let i=0;ie[t]>=0)}let iX=new Set(["left","top"]);async function iq(e,t){let{placement:i,platform:n,elements:o}=e,r=await (null==n.isRTL?void 0:n.isRTL(o.floating)),s=iO(i),a=iR(i),l="y"===ij(i),d=iX.has(s)?-1:1,h=r&&l?-1:1,u=iz(t,e),{mainAxis:c,crossAxis:p,alignmentAxis:m}="number"==typeof u?{mainAxis:u,crossAxis:0,alignmentAxis:null}:{mainAxis:u.mainAxis||0,crossAxis:u.crossAxis||0,alignmentAxis:u.alignmentAxis};return a&&"number"==typeof m&&(p="end"===a?-1*m:m),l?{x:p*h,y:c*d}:{x:c*d,y:p*h}}function iY(){return"u">typeof window}function iQ(e){return i2(e)?(e.nodeName||"").toLowerCase():"#document"}function i0(e){var t;return(null==e||null==(t=e.ownerDocument)?void 0:t.defaultView)||window}function i1(e){var t;return null==(t=(i2(e)?e.ownerDocument:e.document)||window.document)?void 0:t.documentElement}function i2(e){return!!iY()&&(e instanceof Node||e instanceof i0(e).Node)}function i3(e){return!!iY()&&(e instanceof Element||e instanceof i0(e).Element)}function i5(e){return!!iY()&&(e instanceof HTMLElement||e instanceof i0(e).HTMLElement)}function i4(e){return!(!iY()||"u"{try{return e.matches(t)}catch(e){return!1}})}let nt=["transform","translate","scale","rotate","perspective"],ni=["transform","translate","scale","rotate","perspective","filter"],nn=["paint","layout","strict","content"];function no(e){let t=nr(),i=i3(e)?nl(e):e;return nt.some(e=>!!i[e]&&"none"!==i[e])||!!i.containerType&&"normal"!==i.containerType||!t&&!!i.backdropFilter&&"none"!==i.backdropFilter||!t&&!!i.filter&&"none"!==i.filter||ni.some(e=>(i.willChange||"").includes(e))||nn.some(e=>(i.contain||"").includes(e))}function nr(){return!("u"i3(e)&&"body"!==iQ(e)),o=null,r="fixed"===nl(e).position,s=r?nh(e):e;for(;i3(s)&&!na(s);){let t=nl(s),i=no(s);i||"fixed"!==t.position||(o=null),(r?!i&&!o:!i&&"static"===t.position&&!!o&&nx.has(o.position)||i9(s)&&!i&&function e(t,i){let n=nh(t);return!(n===i||!i3(n)||na(n))&&("fixed"===nl(n).position||e(n,i))}(e,s))?n=n.filter(e=>e!==s):o=t,s=nh(s)}return t.set(e,n),n}(t,this._c):[].concat(i),n],s=r[0],a=r.reduce((e,i)=>{let n=n_(t,i,o);return e.top=iC(n.top,e.top),e.right=iD(n.right,e.right),e.bottom=iD(n.bottom,e.bottom),e.left=iC(n.left,e.left),e},n_(t,s,o));return{width:a.right-a.left,height:a.bottom-a.top,x:a.left,y:a.top}},getOffsetParent:nS,getElementRects:nE,getClientRects:function(e){return Array.from(e.getClientRects())},getDimensions:function(e){let{width:t,height:i}=np(e);return{width:t,height:i}},getScale:nf,isElement:i3,isRTL:function(e){return"rtl"===nl(e).direction}};function nk(e,t){return e.x===t.x&&e.y===t.y&&e.width===t.width&&e.height===t.height}let nP=e=>({name:"arrow",options:e,async fn(t){let{x:i,y:n,placement:o,rects:r,platform:s,elements:a,middlewareData:l}=t,{element:d,padding:h=0}=iz(e,t)||{};if(null==d)return{};let u=iF(h),c={x:i,y:n},p=iN(ij(o)),m=iI(p),f=await s.getDimensions(d),g="y"===p,v=g?"clientHeight":"clientWidth",w=r.reference[m]+r.reference[p]-c[p]-r.floating[m],b=c[p]-r.reference[p],y=await (null==s.getOffsetParent?void 0:s.getOffsetParent(d)),x=y?y[v]:0;x&&await (null==s.isElement?void 0:s.isElement(y))||(x=a.floating[v]||r.floating[m]);let _=x/2-f[m]/2-1,D=iD(u[g?"top":"left"],_),C=iD(u[g?"bottom":"right"],_),S=x-f[m]-C,E=x/2-f[m]/2+(w/2-b/2),A=iC(D,iD(E,S)),k=!l.arrow&&null!=iR(o)&&E!==A&&r.reference[m]/2-(Etypeof document?H.useLayoutEffect:function(){};function nO(e,t){let i,n,o;if(e===t)return!0;if(typeof e!=typeof t)return!1;if("function"==typeof e&&e.toString()===t.toString())return!0;if(e&&t&&"object"==typeof e){if(Array.isArray(e)){if((i=e.length)!==t.length)return!1;for(n=i;0!=n--;)if(!nO(e[n],t[n]))return!1;return!0}if((i=(o=Object.keys(e)).length)!==Object.keys(t).length)return!1;for(n=i;0!=n--;)if(!({}).hasOwnProperty.call(t,o[n]))return!1;for(n=i;0!=n--;){let i=o[n];if(("_owner"!==i||!e.$$typeof)&&!nO(e[i],t[i]))return!1}return!0}return e!=e&&t!=t}function nR(e){return"u"{t.current=e}),t}var nM=H.forwardRef((e,t)=>{let{children:i,width:n=10,height:o=5,...r}=e;return(0,W.jsx)(tY.svg,{...r,ref:t,width:n,height:o,viewBox:"0 0 30 10",preserveAspectRatio:"none",children:e.asChild?i:(0,W.jsx)("polygon",{points:"0,0 30,0 15,10"})})});nM.displayName="Arrow";var nj="Popper",[nL,nT]=tU(nj),[nG,nV]=nL(nj),nW=e=>{let{__scopePopper:t,children:i}=e,[n,o]=H.useState(null);return(0,W.jsx)(nG,{scope:t,anchor:n,onAnchorChange:o,children:i})};nW.displayName=nj;var nH="PopperAnchor",nF=H.forwardRef((e,t)=>{let{__scopePopper:i,virtualRef:n,...o}=e,r=nV(nH,i),s=H.useRef(null),a=tM(t,s),l=H.useRef(null);return H.useEffect(()=>{let e=l.current;l.current=n?.current||s.current,e!==l.current&&r.onAnchorChange(l.current)}),n?null:(0,W.jsx)(tY.div,{...o,ref:a})});nF.displayName=nH;var nB="PopperContent",[n$,nU]=nL(nB),nK=H.forwardRef((e,t)=>{var i,n,o,r,s,a,l,d,h,u,c,p,m,f,g,v,w,b,y,x,_;let{__scopePopper:D,side:C="bottom",sideOffset:S=0,align:E="center",alignOffset:A=0,arrowPadding:k=0,avoidCollisions:P=!0,collisionBoundary:z=[],collisionPadding:O=0,sticky:R="partial",hideWhenDetached:N=!1,updatePositionStrategy:I="optimized",onPlaced:M,...j}=e,L=nV(nB,D),[T,G]=H.useState(null),V=tM(t,e=>G(e)),[B,$]=H.useState(null),U=function(e){let[t,i]=H.useState(void 0);return tK(()=>{if(e){i({width:e.offsetWidth,height:e.offsetHeight});let t=new ResizeObserver(t=>{let n,o;if(!Array.isArray(t)||!t.length)return;let r=t[0];if("borderBoxSize"in r){let e=r.borderBoxSize,t=Array.isArray(e)?e[0]:e;n=t.inlineSize,o=t.blockSize}else n=e.offsetWidth,o=e.offsetHeight;i({width:n,height:o})});return t.observe(e,{box:"border-box"}),()=>t.unobserve(e)}i(void 0)},[e]),t}(B),K=U?.width??0,J=U?.height??0,Z="number"==typeof O?O:{top:0,right:0,bottom:0,left:0,...O},X=Array.isArray(z)?z:[z],q=X.length>0,Y={padding:Z,boundary:X.filter(nq),altBoundary:q},{refs:Q,floatingStyles:ee,placement:et,isPositioned:ei,middlewareData:en}=function(e){void 0===e&&(e={});let{placement:t="bottom",strategy:i="absolute",middleware:n=[],platform:o,elements:{reference:r,floating:s}={},transform:a=!0,whileElementsMounted:l,open:d}=e,[h,u]=H.useState({x:0,y:0,strategy:i,placement:t,middlewareData:{},isPositioned:!1}),[c,p]=H.useState(n);nO(c,n)||p(n);let[m,f]=H.useState(null),[g,v]=H.useState(null),w=H.useCallback(e=>{e!==_.current&&(_.current=e,f(e))},[]),b=H.useCallback(e=>{e!==D.current&&(D.current=e,v(e))},[]),y=r||m,x=s||g,_=H.useRef(null),D=H.useRef(null),C=H.useRef(h),S=null!=l,E=nI(l),A=nI(o),k=nI(d),P=H.useCallback(()=>{var e,n;let o,r,s;if(!_.current||!D.current)return;let a={placement:t,strategy:i,middleware:c};A.current&&(a.platform=A.current),(e=_.current,n=D.current,o=new Map,s={...(r={platform:nA,...a}).platform,_c:o},iK(e,n,{...r,platform:s})).then(e=>{let t={...e,isPositioned:!1!==k.current};z.current&&!nO(C.current,t)&&(C.current=t,F.flushSync(()=>{u(t)}))})},[c,t,i,A,k]);nz(()=>{!1===d&&C.current.isPositioned&&(C.current.isPositioned=!1,u(e=>({...e,isPositioned:!1})))},[d]);let z=H.useRef(!1);nz(()=>(z.current=!0,()=>{z.current=!1}),[]),nz(()=>{if(y&&(_.current=y),x&&(D.current=x),y&&x){if(E.current)return E.current(y,x,P);P()}},[y,x,P,E,S]);let O=H.useMemo(()=>({reference:_,floating:D,setReference:w,setFloating:b}),[w,b]),R=H.useMemo(()=>({reference:y,floating:x}),[y,x]),N=H.useMemo(()=>{let e={position:i,left:0,top:0};if(!R.floating)return e;let t=nN(R.floating,h.x),n=nN(R.floating,h.y);return a?{...e,transform:"translate("+t+"px, "+n+"px)",...nR(R.floating)>=1.5&&{willChange:"transform"}}:{position:i,left:t,top:n}},[i,a,R.floating,h.x,h.y]);return H.useMemo(()=>({...h,update:P,refs:O,elements:R,floatingStyles:N}),[h,P,O,R,N])}({strategy:"fixed",placement:C+("center"!==E?"-"+E:""),whileElementsMounted:(...e)=>(function(e,t,i,n){let o;void 0===n&&(n={});let{ancestorScroll:r=!0,ancestorResize:s=!0,elementResize:a="function"==typeof ResizeObserver,layoutShift:l="function"==typeof IntersectionObserver,animationFrame:d=!1}=n,h=nm(e),u=r||s?[...h?nu(h):[],...nu(t)]:[];u.forEach(e=>{r&&e.addEventListener("scroll",i,{passive:!0}),s&&e.addEventListener("resize",i)});let c=h&&l?function(e,t){let i,n=null,o=i1(e);function r(){var e;clearTimeout(i),null==(e=n)||e.disconnect(),n=null}return!function s(a,l){void 0===a&&(a=!1),void 0===l&&(l=1),r();let d=e.getBoundingClientRect(),{left:h,top:u,width:c,height:p}=d;if(a||t(),!c||!p)return;let m={rootMargin:-iE(u)+"px "+-iE(o.clientWidth-(h+c))+"px "+-iE(o.clientHeight-(u+p))+"px "+-iE(h)+"px",threshold:iC(0,iD(1,l))||1},f=!0;function g(t){let n=t[0].intersectionRatio;if(n!==l){if(!f)return s();n?s(!1,n):i=setTimeout(()=>{s(!1,1e-7)},1e3)}1!==n||nk(d,e.getBoundingClientRect())||s(),f=!1}try{n=new IntersectionObserver(g,{...m,root:o.ownerDocument})}catch(e){n=new IntersectionObserver(g,m)}n.observe(e)}(!0),r}(h,i):null,p=-1,m=null;a&&(m=new ResizeObserver(e=>{let[n]=e;n&&n.target===h&&m&&(m.unobserve(t),cancelAnimationFrame(p),p=requestAnimationFrame(()=>{var e;null==(e=m)||e.observe(t)})),i()}),h&&!d&&m.observe(h),m.observe(t));let f=d?nw(e):null;return d&&function t(){let n=nw(e);f&&!nk(f,n)&&i(),f=n,o=requestAnimationFrame(t)}(),i(),()=>{var e;u.forEach(e=>{r&&e.removeEventListener("scroll",i),s&&e.removeEventListener("resize",i)}),null==c||c(),null==(e=m)||e.disconnect(),m=null,d&&cancelAnimationFrame(o)}})(...e,{animationFrame:"always"===I}),elements:{reference:L.anchor},middleware:[{...{name:"offset",options:o=i={mainAxis:S+J,alignmentAxis:A},async fn(e){var t,i;let{x:n,y:r,placement:s,middlewareData:a}=e,l=await iq(e,o);return s===(null==(t=a.offset)?void 0:t.placement)&&null!=(i=a.arrow)&&i.alignmentOffset?{}:{x:n+l.x,y:r+l.y,data:{...l,placement:s}}}},options:[i,n]},P&&{...{name:"shift",options:h=l={mainAxis:!0,crossAxis:!1,limiter:"partial"===R?{...(void 0===(a=r)&&(a={}),{options:a,fn(e){let{x:t,y:i,placement:n,rects:o,middlewareData:r}=e,{offset:s=0,mainAxis:l=!0,crossAxis:d=!0}=iz(a,e),h={x:t,y:i},u=ij(n),c=iN(u),p=h[c],m=h[u],f=iz(s,e),g="number"==typeof f?{mainAxis:f,crossAxis:0}:{mainAxis:0,crossAxis:0,...f};if(l){let e="y"===c?"height":"width",t=o.reference[c]-o.floating[e]+g.mainAxis,i=o.reference[c]+o.reference[e]-g.mainAxis;pi&&(p=i)}if(d){var v,w;let e="y"===c?"width":"height",t=iX.has(iO(n)),i=o.reference[u]-o.floating[e]+(t&&(null==(v=r.offset)?void 0:v[u])||0)+(t?0:g.crossAxis),s=o.reference[u]+o.reference[e]+(t?0:(null==(w=r.offset)?void 0:w[u])||0)-(t?g.crossAxis:0);ms&&(m=s)}return{[c]:p,[u]:m}}}),options:[r,s]}:void 0,...Y},async fn(e){let{x:t,y:i,placement:n,platform:o}=e,{mainAxis:r=!0,crossAxis:s=!1,limiter:a={fn:e=>{let{x:t,y:i}=e;return{x:t,y:i}}},...l}=iz(h,e),d={x:t,y:i},u=await o.detectOverflow(e,l),c=ij(iO(n)),p=iN(c),m=d[p],f=d[c];if(r){let e="y"===p?"top":"left",t="y"===p?"bottom":"right",i=m+u[e],n=m-u[t];m=iC(i,iD(m,n))}if(s){let e="y"===c?"top":"left",t="y"===c?"bottom":"right",i=f+u[e],n=f-u[t];f=iC(i,iD(f,n))}let g=a.fn({...e,[p]:m,[c]:f});return{...g,data:{x:g.x-t,y:g.y-i,enabled:{[p]:r,[c]:s}}}}},options:[l,d]},P&&{...{name:"flip",options:p=u={...Y},async fn(e){var t,i,n,o,r,s,a,l;let d,h,u,{placement:c,middlewareData:m,rects:f,initialPlacement:g,platform:v,elements:w}=e,{mainAxis:b=!0,crossAxis:y=!0,fallbackPlacements:x,fallbackStrategy:_="bestFit",fallbackAxisSideDirection:D="none",flipAlignment:C=!0,...S}=iz(p,e);if(null!=(t=m.arrow)&&t.alignmentOffset)return{};let E=iO(c),A=ij(g),k=iO(g)===g,P=await (null==v.isRTL?void 0:v.isRTL(w.floating)),z=x||(k||!C?[iH(g)]:(d=iH(g),[iL(g),d,iL(d)])),O="none"!==D;!x&&O&&z.push(...(h=iR(g),u=function(e,t,i){switch(e){case"top":case"bottom":if(i)return t?iG:iT;return t?iT:iG;case"left":case"right":return t?iV:iW;default:return[]}}(iO(g),"start"===D,P),h&&(u=u.map(e=>e+"-"+h),C&&(u=u.concat(u.map(iL)))),u));let R=[g,...z],N=await v.detectOverflow(e,S),I=[],M=(null==(i=m.flip)?void 0:i.overflows)||[];if(b&&I.push(N[E]),y){let e,t,i,n,o=(s=c,a=f,void 0===(l=P)&&(l=!1),e=iR(s),i=iI(t=iN(ij(s))),n="x"===t?e===(l?"end":"start")?"right":"left":"start"===e?"bottom":"top",a.reference[i]>a.floating[i]&&(n=iH(n)),[n,iH(n)]);I.push(N[o[0]],N[o[1]])}if(M=[...M,{placement:c,overflows:I}],!I.every(e=>e<=0)){let e=((null==(n=m.flip)?void 0:n.index)||0)+1,t=R[e];if(t&&("alignment"!==y||A===ij(t)||M.every(e=>ij(e.placement)!==A||e.overflows[0]>0)))return{data:{index:e,overflows:M},reset:{placement:t}};let i=null==(o=M.filter(e=>e.overflows[0]<=0).sort((e,t)=>e.overflows[1]-t.overflows[1])[0])?void 0:o.placement;if(!i)switch(_){case"bestFit":{let e=null==(r=M.filter(e=>{if(O){let t=ij(e.placement);return t===A||"y"===t}return!0}).map(e=>[e.placement,e.overflows.filter(e=>e>0).reduce((e,t)=>e+t,0)]).sort((e,t)=>e[1]-t[1])[0])?void 0:r[0];e&&(i=e);break}case"initialPlacement":i=g}if(c!==i)return{reset:{placement:i}}}return{}}},options:[u,c]},{...{name:"size",options:g=m={...Y,apply:({elements:e,rects:t,availableWidth:i,availableHeight:n})=>{let{width:o,height:r}=t.reference,s=e.floating.style;s.setProperty("--radix-popper-available-width",`${i}px`),s.setProperty("--radix-popper-available-height",`${n}px`),s.setProperty("--radix-popper-anchor-width",`${o}px`),s.setProperty("--radix-popper-anchor-height",`${r}px`)}},async fn(e){var t,i;let n,o,{placement:r,rects:s,platform:a,elements:l}=e,{apply:d=()=>{},...h}=iz(g,e),u=await a.detectOverflow(e,h),c=iO(r),p=iR(r),m="y"===ij(r),{width:f,height:v}=s.floating;"top"===c||"bottom"===c?(n=c,o=p===(await (null==a.isRTL?void 0:a.isRTL(l.floating))?"start":"end")?"left":"right"):(o=c,n="end"===p?"top":"bottom");let w=v-u.top-u.bottom,b=f-u.left-u.right,y=iD(v-u[n],w),x=iD(f-u[o],b),_=!e.middlewareData.shift,D=y,C=x;if(null!=(t=e.middlewareData.shift)&&t.enabled.x&&(C=b),null!=(i=e.middlewareData.shift)&&i.enabled.y&&(D=w),_&&!p){let e=iC(u.left,0),t=iC(u.right,0),i=iC(u.top,0),n=iC(u.bottom,0);m?C=f-2*(0!==e||0!==t?e+t:iC(u.left,u.right)):D=v-2*(0!==i||0!==n?i+n:iC(u.top,u.bottom))}await d({...e,availableWidth:C,availableHeight:D});let S=await a.getDimensions(l.floating);return f!==S.width||v!==S.height?{reset:{rects:!0}}:{}}},options:[m,f]},B&&{...{name:"arrow",options:b=v={element:B,padding:k},fn(e){let{element:t,padding:i}="function"==typeof b?b(e):b;return t&&({}).hasOwnProperty.call(t,"current")?null!=t.current?nP({element:t.current,padding:i}).fn(e):{}:t?nP({element:t,padding:i}).fn(e):{}}},options:[v,w]},nY({arrowWidth:K,arrowHeight:J}),N&&{...{name:"hide",options:_=y={strategy:"referenceHidden",...Y},async fn(e){let{rects:t,platform:i}=e,{strategy:n="referenceHidden",...o}=iz(_,e);switch(n){case"referenceHidden":{let n=iJ(await i.detectOverflow(e,{...o,elementContext:"reference"}),t.reference);return{data:{referenceHiddenOffsets:n,referenceHidden:iZ(n)}}}case"escaped":{let n=iJ(await i.detectOverflow(e,{...o,altBoundary:!0}),t.floating);return{data:{escapedOffsets:n,escaped:iZ(n)}}}default:return{}}}},options:[y,x]}]}),[eo,er]=nQ(et),es=t7(M);tK(()=>{ei&&es?.()},[ei,es]);let ea=en.arrow?.x,el=en.arrow?.y,ed=en.arrow?.centerOffset!==0,[eh,eu]=H.useState();return tK(()=>{T&&eu(window.getComputedStyle(T).zIndex)},[T]),(0,W.jsx)("div",{ref:Q.setFloating,"data-radix-popper-content-wrapper":"",style:{...ee,transform:ei?ee.transform:"translate(0, -200%)",minWidth:"max-content",zIndex:eh,"--radix-popper-transform-origin":[en.transformOrigin?.x,en.transformOrigin?.y].join(" "),...en.hide?.referenceHidden&&{visibility:"hidden",pointerEvents:"none"}},dir:e.dir,children:(0,W.jsx)(n$,{scope:D,placedSide:eo,onArrowChange:$,arrowX:ea,arrowY:el,shouldHideArrow:ed,children:(0,W.jsx)(tY.div,{"data-side":eo,"data-align":er,...j,ref:V,style:{...j.style,animation:ei?void 0:"none"}})})})});nK.displayName=nB;var nJ="PopperArrow",nZ={top:"bottom",right:"left",bottom:"top",left:"right"},nX=H.forwardRef(function(e,t){let{__scopePopper:i,...n}=e,o=nU(nJ,i),r=nZ[o.placedSide];return(0,W.jsx)("span",{ref:o.onArrowChange,style:{position:"absolute",left:o.arrowX,top:o.arrowY,[r]:0,transformOrigin:{top:"",right:"0 0",bottom:"center 0",left:"100% 0"}[o.placedSide],transform:{top:"translateY(100%)",right:"translateY(50%) rotate(90deg) translateX(-50%)",bottom:"rotate(180deg)",left:"translateY(50%) rotate(-90deg) translateX(50%)"}[o.placedSide],visibility:o.shouldHideArrow?"hidden":void 0},children:(0,W.jsx)(nM,{...n,ref:t,style:{...n.style,display:"block"}})})});function nq(e){return null!==e}nX.displayName=nJ;var nY=e=>({name:"transformOrigin",options:e,fn(t){let{placement:i,rects:n,middlewareData:o}=t,r=o.arrow?.centerOffset!==0,s=r?0:e.arrowWidth,a=r?0:e.arrowHeight,[l,d]=nQ(i),h={start:"0%",center:"50%",end:"100%"}[d],u=(o.arrow?.x??0)+s/2,c=(o.arrow?.y??0)+a/2,p="",m="";return"bottom"===l?(p=r?h:`${u}px`,m=`${-a}px`):"top"===l?(p=r?h:`${u}px`,m=`${n.floating.height+a}px`):"right"===l?(p=`${-a}px`,m=r?h:`${c}px`):"left"===l&&(p=`${n.floating.width+a}px`,m=r?h:`${c}px`),{data:{x:p,y:m}}}});function nQ(e){let[t,i="center"]=e.split("-");return[t,i]}var n0=H.forwardRef((e,t)=>{let{container:i,...n}=e,[o,r]=H.useState(!1);tK(()=>r(!0),[]);let s=i||o&&globalThis?.document?.body;return s?F.default.createPortal((0,W.jsx)(tY.div,{...n,ref:t}),s):null});n0.displayName="Portal";var n1=e=>{var t;let i,n,{present:o,children:r}=e,s=function(e){var t,i;let[n,o]=H.useState(),r=H.useRef(null),s=H.useRef(e),a=H.useRef("none"),[l,d]=(t=e?"mounted":"unmounted",i={mounted:{UNMOUNT:"unmounted",ANIMATION_OUT:"unmountSuspended"},unmountSuspended:{MOUNT:"mounted",ANIMATION_END:"unmounted"},unmounted:{MOUNT:"mounted"}},H.useReducer((e,t)=>i[e][t]??e,t));return H.useEffect(()=>{let e=n2(r.current);a.current="mounted"===l?e:"none"},[l]),tK(()=>{let t=r.current,i=s.current;if(i!==e){let n=a.current,o=n2(t);e?d("MOUNT"):"none"===o||t?.display==="none"?d("UNMOUNT"):i&&n!==o?d("ANIMATION_OUT"):d("UNMOUNT"),s.current=e}},[e,d]),tK(()=>{if(n){let e,t=n.ownerDocument.defaultView??window,i=i=>{let o=n2(r.current).includes(CSS.escape(i.animationName));if(i.target===n&&o&&(d("ANIMATION_END"),!s.current)){let i=n.style.animationFillMode;n.style.animationFillMode="forwards",e=t.setTimeout(()=>{"forwards"===n.style.animationFillMode&&(n.style.animationFillMode=i)})}},o=e=>{e.target===n&&(a.current=n2(r.current))};return n.addEventListener("animationstart",o),n.addEventListener("animationcancel",i),n.addEventListener("animationend",i),()=>{t.clearTimeout(e),n.removeEventListener("animationstart",o),n.removeEventListener("animationcancel",i),n.removeEventListener("animationend",i)}}d("ANIMATION_END")},[n,d]),{isPresent:["mounted","unmountSuspended"].includes(l),ref:H.useCallback(e=>{r.current=e?getComputedStyle(e):null,o(e)},[])}}(o),a="function"==typeof r?r({present:s.isPresent}):H.Children.only(r),l=tM(s.ref,(t=a,(n=(i=Object.getOwnPropertyDescriptor(t.props,"ref")?.get)&&"isReactWarning"in i&&i.isReactWarning)?t.ref:(n=(i=Object.getOwnPropertyDescriptor(t,"ref")?.get)&&"isReactWarning"in i&&i.isReactWarning)?t.props.ref:t.props.ref||t.ref));return"function"==typeof r||s.isPresent?H.cloneElement(a,{ref:l}):null};function n2(e){return e?.animationName||"none"}n1.displayName="Presence";var n3="rovingFocusGroup.onEntryFocus",n5={bubbles:!1,cancelable:!0},n4="RovingFocusGroup",[n6,n9,n8]=t3(n4),[n7,oe]=tU(n4,[n8]),[ot,oi]=n7(n4),on=H.forwardRef((e,t)=>(0,W.jsx)(n6.Provider,{scope:e.__scopeRovingFocusGroup,children:(0,W.jsx)(n6.Slot,{scope:e.__scopeRovingFocusGroup,children:(0,W.jsx)(oo,{...e,ref:t})})}));on.displayName=n4;var oo=H.forwardRef((e,t)=>{let{__scopeRovingFocusGroup:i,orientation:n,loop:o=!1,dir:r,currentTabStopId:s,defaultCurrentTabStopId:a,onCurrentTabStopIdChange:l,onEntryFocus:d,preventScrollOnEntryFocus:h=!1,...u}=e,c=H.useRef(null),p=tM(t,c),m=t8(r),[f,g]=tZ({prop:s,defaultProp:a??null,onChange:l,caller:n4}),[v,w]=H.useState(!1),b=t7(d),y=n9(i),x=H.useRef(!1),[_,D]=H.useState(0);return H.useEffect(()=>{let e=c.current;if(e)return e.addEventListener(n3,b),()=>e.removeEventListener(n3,b)},[b]),(0,W.jsx)(ot,{scope:i,orientation:n,dir:m,loop:o,currentTabStopId:f,onItemFocus:H.useCallback(e=>g(e),[g]),onItemShiftTab:H.useCallback(()=>w(!0),[]),onFocusableItemAdd:H.useCallback(()=>D(e=>e+1),[]),onFocusableItemRemove:H.useCallback(()=>D(e=>e-1),[]),children:(0,W.jsx)(tY.div,{tabIndex:v||0===_?-1:0,"data-orientation":n,...u,ref:p,style:{outline:"none",...e.style},onMouseDown:t$(e.onMouseDown,()=>{x.current=!0}),onFocus:t$(e.onFocus,e=>{let t=!x.current;if(e.target===e.currentTarget&&t&&!v){let t=new CustomEvent(n3,n5);if(e.currentTarget.dispatchEvent(t),!t.defaultPrevented){let e=y().filter(e=>e.focusable);ol([e.find(e=>e.active),e.find(e=>e.id===f),...e].filter(Boolean).map(e=>e.ref.current),h)}}x.current=!1}),onBlur:t$(e.onBlur,()=>w(!1))})})}),or="RovingFocusGroupItem",os=H.forwardRef((e,t)=>{let{__scopeRovingFocusGroup:i,focusable:n=!0,active:o=!1,tabStopId:r,children:s,...a}=e,l=ix(),d=r||l,h=oi(or,i),u=h.currentTabStopId===d,c=n9(i),{onFocusableItemAdd:p,onFocusableItemRemove:m,currentTabStopId:f}=h;return H.useEffect(()=>{if(n)return p(),()=>m()},[n,p,m]),(0,W.jsx)(n6.ItemSlot,{scope:i,id:d,focusable:n,active:o,children:(0,W.jsx)(tY.span,{tabIndex:u?0:-1,"data-orientation":h.orientation,...a,ref:t,onMouseDown:t$(e.onMouseDown,e=>{n?h.onItemFocus(d):e.preventDefault()}),onFocus:t$(e.onFocus,()=>h.onItemFocus(d)),onKeyDown:t$(e.onKeyDown,e=>{if("Tab"===e.key&&e.shiftKey)return void h.onItemShiftTab();if(e.target!==e.currentTarget)return;let t=function(e,t,i){var n;let o=(n=e.key,"rtl"!==i?n:"ArrowLeft"===n?"ArrowRight":"ArrowRight"===n?"ArrowLeft":n);if(!("vertical"===t&&["ArrowLeft","ArrowRight"].includes(o))&&!("horizontal"===t&&["ArrowUp","ArrowDown"].includes(o)))return oa[o]}(e,h.orientation,h.dir);if(void 0!==t){if(e.metaKey||e.ctrlKey||e.altKey||e.shiftKey)return;e.preventDefault();let o=c().filter(e=>e.focusable).map(e=>e.ref.current);if("last"===t)o.reverse();else if("prev"===t||"next"===t){var i,n;"prev"===t&&o.reverse();let r=o.indexOf(e.currentTarget);o=h.loop?(i=o,n=r+1,i.map((e,t)=>i[(n+t)%i.length])):o.slice(r+1)}setTimeout(()=>ol(o))}}),children:"function"==typeof s?s({isCurrentTabStop:u,hasTabStop:null!=f}):s})})});os.displayName=or;var oa={ArrowLeft:"prev",ArrowUp:"prev",ArrowRight:"next",ArrowDown:"next",PageUp:"first",Home:"first",PageDown:"last",End:"last"};function ol(e,t=!1){let i=document.activeElement;for(let n of e)if(n===i||(n.focus({preventScroll:t}),document.activeElement!==i))return}var od=Symbol("radix.slottable");function oh(e){return H.isValidElement(e)&&"function"==typeof e.type&&"__radixId"in e.type&&e.type.__radixId===od}var ou=new WeakMap,oc=new WeakMap,op={},om=0,of=function(e){return e&&(e.host||of(e.parentNode))},og=function(e,t,i,n){var o=(Array.isArray(e)?e:[e]).map(function(e){if(t.contains(e))return e;var i=of(e);return i&&t.contains(i)?i:(console.error("aria-hidden",e,"in not contained inside",t,". Doing nothing"),null)}).filter(function(e){return!!e});op[i]||(op[i]=new WeakMap);var r=op[i],s=[],a=new Set,l=new Set(o),d=function(e){!e||a.has(e)||(a.add(e),d(e.parentNode))};o.forEach(d);var h=function(e){!e||l.has(e)||Array.prototype.forEach.call(e.children,function(e){if(a.has(e))h(e);else try{var t=e.getAttribute(n),o=null!==t&&"false"!==t,l=(ou.get(e)||0)+1,d=(r.get(e)||0)+1;ou.set(e,l),r.set(e,d),s.push(e),1===l&&o&&oc.set(e,!0),1===d&&e.setAttribute(i,"true"),o||e.setAttribute(n,"true")}catch(t){console.error("aria-hidden: cannot operate on ",e,t)}})};return h(t),a.clear(),om++,function(){s.forEach(function(e){var t=ou.get(e)-1,o=r.get(e)-1;ou.set(e,t),r.set(e,o),t||(oc.has(e)||e.removeAttribute(n),oc.delete(e)),o||e.removeAttribute(i)}),--om||(ou=new WeakMap,ou=new WeakMap,oc=new WeakMap,op={})}},ov=function(e,t,i){void 0===i&&(i="data-aria-hidden");var n=Array.from(Array.isArray(e)?e:[e]),o=t||("u"t.indexOf(n)&&(i[n]=e[n]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var o=0,n=Object.getOwnPropertySymbols(e);ot.indexOf(n[o])&&Object.prototype.propertyIsEnumerable.call(e,n[o])&&(i[n[o]]=e[n[o]]);return i}var oy=("function"==typeof SuppressedError&&SuppressedError,"right-scroll-bar-position"),ox="width-before-scroll-bar";function o_(e,t){return"function"==typeof e?e(t):e&&(e.current=t),e}var oD="u">typeof window?H.useLayoutEffect:H.useEffect,oC=new WeakMap,oS=(void 0===x&&(x={}),(void 0===_&&(_=function(e){return e}),D=[],C=!1,S={read:function(){if(C)throw Error("Sidecar: could not `read` from an `assigned` medium. `read` could be used only with `useMedium`.");return D.length?D[D.length-1]:null},useMedium:function(e){var t=_(e,C);return D.push(t),function(){D=D.filter(function(e){return e!==t})}},assignSyncMedium:function(e){for(C=!0;D.length;){var t=D;D=[],t.forEach(e)}D={push:function(t){return e(t)},filter:function(){return D}}},assignMedium:function(e){C=!0;var t=[];if(D.length){var i=D;D=[],i.forEach(e),t=D}var n=function(){var i=t;t=[],i.forEach(e)},o=function(){return Promise.resolve().then(n)};o(),D={push:function(e){t.push(e),o()},filter:function(e){return t=t.filter(e),D}}}}).options=ow({async:!0,ssr:!1},x),S),oE=function(){},oA=H.forwardRef(function(e,t){var i,n,o,r,s=H.useRef(null),a=H.useState({onScrollCapture:oE,onWheelCapture:oE,onTouchMoveCapture:oE}),l=a[0],d=a[1],h=e.forwardProps,u=e.children,c=e.className,p=e.removeScrollBar,m=e.enabled,f=e.shards,g=e.sideCar,v=e.noRelative,w=e.noIsolation,b=e.inert,y=e.allowPinchZoom,x=e.as,_=e.gapMode,D=ob(e,["forwardProps","children","className","removeScrollBar","enabled","shards","sideCar","noRelative","noIsolation","inert","allowPinchZoom","as","gapMode"]),C=(i=[s,t],n=function(e){return i.forEach(function(t){return o_(t,e)})},(o=(0,H.useState)(function(){return{value:null,callback:n,facade:{get current(){return o.value},set current(value){var e=o.value;e!==value&&(o.value=value,o.callback(value,e))}}}})[0]).callback=n,r=o.facade,oD(function(){var e=oC.get(r);if(e){var t=new Set(e),n=new Set(i),o=r.current;t.forEach(function(e){n.has(e)||o_(e,null)}),n.forEach(function(e){t.has(e)||o_(e,o)})}oC.set(r,i)},[i]),r),S=ow(ow({},D),l);return H.createElement(H.Fragment,null,m&&H.createElement(g,{sideCar:oS,removeScrollBar:p,shards:f,noRelative:v,noIsolation:w,inert:b,setCallbacks:d,allowPinchZoom:!!y,lockRef:s,gapMode:_}),h?H.cloneElement(H.Children.only(u),ow(ow({},S),{ref:C})):H.createElement(void 0===x?"div":x,ow({},S,{className:c,ref:C}),u))});oA.defaultProps={enabled:!0,removeScrollBar:!0,inert:!1},oA.classNames={fullWidth:ox,zeroRight:oy};var ok=function(e){var t=e.sideCar,i=ob(e,["sideCar"]);if(!t)throw Error("Sidecar: please provide `sideCar` property to import the right car");var n=t.read();if(!n)throw Error("Sidecar medium not found");return H.createElement(n,ow({},i))};ok.isSideCarExport=!0;var oP=function(){var e=0,t=null;return{add:function(i){if(0==e&&(t=function(){if(!document)return null;var e=document.createElement("style");e.type="text/css";var t=I||("u">typeof __webpack_nonce__?__webpack_nonce__:void 0);return t&&e.setAttribute("nonce",t),e}())){var n,o;(n=t).styleSheet?n.styleSheet.cssText=i:n.appendChild(document.createTextNode(i)),o=t,(document.head||document.getElementsByTagName("head")[0]).appendChild(o)}e++},remove:function(){--e||!t||(t.parentNode&&t.parentNode.removeChild(t),t=null)}}},oz=function(){var e=oP();return function(t,i){H.useEffect(function(){return e.add(t),function(){e.remove()}},[t&&i])}},oO=function(){var e=oz();return function(t){return e(t.styles,t.dynamic),null}},oR={left:0,top:0,right:0,gap:0},oN=function(e){return parseInt(e||"",10)||0},oI=function(e){var t=window.getComputedStyle(document.body),i=t["padding"===e?"paddingLeft":"marginLeft"],n=t["padding"===e?"paddingTop":"marginTop"],o=t["padding"===e?"paddingRight":"marginRight"];return[oN(i),oN(n),oN(o)]},oM=function(e){if(void 0===e&&(e="margin"),"u"