From 54573b571bf4901a7f3e373cca01fc0425656e01 Mon Sep 17 00:00:00 2001 From: Viren070 Date: Sat, 13 Sep 2025 17:32:20 +0100 Subject: [PATCH] feat: stuff --- .env.sample | 69 +- Dockerfile | 31 +- package-lock.json | 14997 ---------------- package.json | 11 +- packages/core/package.json | 6 +- packages/core/src/builtins/base/debrid.ts | 385 + packages/core/src/builtins/base/nab/addon.ts | 181 + packages/core/src/builtins/base/nab/api.ts | 322 + packages/core/src/builtins/gdrive/addon.ts | 76 +- packages/core/src/builtins/index.ts | 3 + packages/core/src/builtins/newznab/addon.ts | 91 + packages/core/src/builtins/newznab/index.ts | 1 + packages/core/src/builtins/prowlarr/addon.ts | 151 + packages/core/src/builtins/prowlarr/api.ts | 248 + packages/core/src/builtins/prowlarr/index.ts | 1 + .../core/src/builtins/torbox-search/addon.ts | 47 +- .../builtins/torbox-search/debrid-service.ts | 200 - .../src/builtins/torbox-search/schemas.ts | 27 +- .../src/builtins/torbox-search/search-api.ts | 65 +- .../builtins/torbox-search/source-handlers.ts | 536 +- .../src/builtins/torbox-search/torrent.ts | 17 +- packages/core/src/builtins/torznab/addon.ts | 97 + packages/core/src/builtins/torznab/index.ts | 1 + packages/core/src/builtins/utils/debrid.ts | 391 + packages/core/src/builtins/utils/id-parser.ts | 92 - packages/core/src/db/db.ts | 59 +- packages/core/src/db/queue.ts | 49 +- packages/core/src/db/schemas.ts | 6 + packages/core/src/debrid/base.ts | 178 + packages/core/src/debrid/index.ts | 32 +- packages/core/src/debrid/interface.ts | 355 - packages/core/src/debrid/stremthru.ts | 283 + packages/core/src/debrid/torbox.ts | 448 + packages/core/src/debrid/utils.ts | 309 +- packages/core/src/index.ts | 3 + packages/core/src/main.ts | 14 +- packages/core/src/metadata/imdb.ts | 52 +- packages/core/src/metadata/kitsu.ts | 79 - packages/core/src/metadata/service.ts | 214 + packages/core/src/metadata/tmdb.ts | 122 +- packages/core/src/metadata/trakt.ts | 80 + packages/core/src/metadata/utils.ts | 1 + packages/core/src/parser/file.ts | 2 +- packages/core/src/parser/go-ptt.ts | 94 + packages/core/src/parser/index.ts | 1 + packages/core/src/parser/regex.ts | 6 +- packages/core/src/parser/utils.ts | 37 + packages/core/src/presets/aiCompanion.ts | 2 +- packages/core/src/presets/animetosho.ts | 70 + packages/core/src/presets/builtin.ts | 70 + packages/core/src/presets/moreLikeThis.ts | 32 +- packages/core/src/presets/newznab.ts | 148 + packages/core/src/presets/presetManager.ts | 22 +- packages/core/src/presets/prowlarr.ts | 135 + packages/core/src/presets/stremthru.ts | 17 +- packages/core/src/presets/torznab.ts | 164 + packages/core/src/presets/zilean.ts | 77 + packages/core/src/streams/fetcher.ts | 17 +- packages/core/src/streams/filterer.ts | 155 +- packages/core/src/utils/anime-database.ts | 858 + packages/core/src/utils/cache.ts | 8 + packages/core/src/utils/config.ts | 22 +- packages/core/src/utils/constants.ts | 15 +- packages/core/src/utils/distributed-lock.ts | 263 + packages/core/src/utils/env.ts | 145 +- packages/core/src/utils/general.ts | 11 + packages/core/src/utils/http.ts | 67 +- packages/core/src/utils/id-parser.ts | 174 + packages/core/src/utils/index.ts | 3 + packages/core/src/utils/logger.ts | 6 + packages/core/src/utils/rpdb.ts | 100 +- packages/core/src/utils/startup.ts | 132 +- packages/core/src/utils/torrent.ts | 112 + packages/frontend/package.json | 6 +- .../public/assets/animetosho_logo.png | Bin 0 -> 88133 bytes .../frontend/public/assets/zilean_logo.jpg | Bin 0 -> 46841 bytes packages/frontend/src/app/page.tsx | 5 +- .../src/components/menu/formatter.tsx | 2 +- packages/frontend/src/context/status.tsx | 8 +- packages/frontend/tsconfig.json | 23 +- packages/server/package.json | 5 +- packages/server/src/app.ts | 18 +- packages/server/src/middlewares/ip.ts | 11 +- packages/server/src/middlewares/ratelimit.ts | 7 + packages/server/src/routes/api/anime.ts | 63 + packages/server/src/routes/api/catalog.ts | 2 +- packages/server/src/routes/api/debrid.ts | 36 +- packages/server/src/routes/api/format.ts | 22 +- packages/server/src/routes/api/gdrive.ts | 2 +- packages/server/src/routes/api/health.ts | 2 +- packages/server/src/routes/api/index.ts | 1 + packages/server/src/routes/api/rpdb.ts | 5 +- packages/server/src/routes/api/search.ts | 2 +- packages/server/src/routes/api/status.ts | 2 +- packages/server/src/routes/api/user.ts | 2 +- packages/server/src/routes/builtins/gdrive.ts | 4 +- packages/server/src/routes/builtins/index.ts | 3 + .../server/src/routes/builtins/newznab.ts | 45 + .../server/src/routes/builtins/prowlarr.ts | 46 + .../src/routes/builtins/torbox-search.ts | 2 +- .../server/src/routes/builtins/torznab.ts | 46 + .../server/src/routes/stremio/addonCatalog.ts | 2 +- packages/server/src/routes/stremio/alias.ts | 39 +- packages/server/src/routes/stremio/catalog.ts | 2 +- .../server/src/routes/stremio/configure.ts | 6 +- .../server/src/routes/stremio/manifest.ts | 2 +- packages/server/src/routes/stremio/meta.ts | 2 +- packages/server/src/routes/stremio/stream.ts | 2 +- .../server/src/routes/stremio/subtitle.ts | 2 +- packages/server/src/server.ts | 26 +- pnpm-lock.yaml | 10211 +++++++++++ pnpm-workspace.yaml | 16 + tsconfig.base.json | 4 +- 113 files changed, 17429 insertions(+), 16550 deletions(-) delete mode 100644 package-lock.json create mode 100644 packages/core/src/builtins/base/debrid.ts create mode 100644 packages/core/src/builtins/base/nab/addon.ts create mode 100644 packages/core/src/builtins/base/nab/api.ts create mode 100644 packages/core/src/builtins/newznab/addon.ts create mode 100644 packages/core/src/builtins/newznab/index.ts create mode 100644 packages/core/src/builtins/prowlarr/addon.ts create mode 100644 packages/core/src/builtins/prowlarr/api.ts create mode 100644 packages/core/src/builtins/prowlarr/index.ts delete mode 100644 packages/core/src/builtins/torbox-search/debrid-service.ts create mode 100644 packages/core/src/builtins/torznab/addon.ts create mode 100644 packages/core/src/builtins/torznab/index.ts create mode 100644 packages/core/src/builtins/utils/debrid.ts delete mode 100644 packages/core/src/builtins/utils/id-parser.ts create mode 100644 packages/core/src/debrid/base.ts delete mode 100644 packages/core/src/debrid/interface.ts create mode 100644 packages/core/src/debrid/stremthru.ts create mode 100644 packages/core/src/debrid/torbox.ts delete mode 100644 packages/core/src/metadata/kitsu.ts create mode 100644 packages/core/src/metadata/service.ts create mode 100644 packages/core/src/metadata/trakt.ts create mode 100644 packages/core/src/parser/go-ptt.ts create mode 100644 packages/core/src/parser/utils.ts create mode 100644 packages/core/src/presets/animetosho.ts create mode 100644 packages/core/src/presets/builtin.ts create mode 100644 packages/core/src/presets/newznab.ts create mode 100644 packages/core/src/presets/prowlarr.ts create mode 100644 packages/core/src/presets/torznab.ts create mode 100644 packages/core/src/presets/zilean.ts create mode 100644 packages/core/src/utils/anime-database.ts create mode 100644 packages/core/src/utils/distributed-lock.ts create mode 100644 packages/core/src/utils/id-parser.ts create mode 100644 packages/core/src/utils/torrent.ts create mode 100644 packages/frontend/public/assets/animetosho_logo.png create mode 100644 packages/frontend/public/assets/zilean_logo.jpg create mode 100644 packages/server/src/routes/api/anime.ts create mode 100644 packages/server/src/routes/builtins/newznab.ts create mode 100644 packages/server/src/routes/builtins/prowlarr.ts create mode 100644 packages/server/src/routes/builtins/torznab.ts create mode 100644 pnpm-lock.yaml create mode 100644 pnpm-workspace.yaml diff --git a/.env.sample b/.env.sample index 32e464a5..dc69e387 100644 --- a/.env.sample +++ b/.env.sample @@ -71,6 +71,25 @@ DATABASE_URI=sqlite://./data/db.sqlite # Set the URL to your StremThru instance here: BUILTIN_STREMTHRU_URL=https://stremthru.13377001.xyz +# How long the cache status of an item is cached. Only applies to cached items, uncached items are always checked again. +# Default: 30 minutes +BUILTIN_DEBRID_INSTANT_AVAILABILITY_CACHE_TTL=1800 +# How long download links for an item remain cached for. +# Default: 1 hour +BUILTIN_DEBRID_PLAYBACK_LINK_CACHE_TTL=3600 + +# ---- Prowlarr ------ +# To enable the built-in prowlarr addon, provide the URL and API key here. +BUILTIN_PROWLARR_URL= +BUILTIN_PROWLARR_API_KEY= +# Optionally provide a comma separated list of indexers to limit the addon to use. If not provided, it uses all indexers. +# BUILTIN_PROWLARR_INDEXERS= +# The timeout for search requests. +BUILTIN_PROWLARR_SEARCH_TIMEOUT= +# How long specific responses should be cached for. +BUILTIN_PROWLARR_SEARCH_CACHE_TTL=604800 +BUILTIN_PROWLARR_INDEXERS_CACHE_TTL=1209600 + # ---- Stremio GDrive ----- # Client ID and Secret generated following this guide: https://guides.viren070.me/stremio/addons/stremio-gdrive @@ -92,9 +111,42 @@ BUILTIN_TORBOX_SEARCH_SEARCH_API_TIMEOUT=30000 # Whether to cache results for users who've enabled user search engines. This requires a cache entry for each user for each title rather than # A shared cache. BUILTIN_TORBOX_SEARCH_CACHE_PER_USER_SEARCH_ENGINE=false -# BUILTIN_TORBOX_SEARCH_SEARCH_API_CACHE_TTL=3600 -# BUILTIN_TORBOX_SEARCH_METADATA_CACHE_TTL=604800 -# BUILTIN_TORBOX_SEARCH_INSTANT_AVAILABILITY_CACHE_TTL=900 +# The amount of time that the results of a search remain cached for. Applies to both usenet and torrents. +# Default: 7 days. +# BUILTIN_TORBOX_SEARCH_SEARCH_API_CACHE_TTL=604800 +# BUILTIN_TORBOX_SEARCH_METADATA_CACHE_TTL=1209600 + +# ---- Torznab ---- + +BUILTIN_TORZNAB_SEARCH_TIMEOUT=30000 +BUILTIN_TORZNAB_SEARCH_CACHE_TTL=604800 +BUILTIN_TORZNAB_CAPABILITIES_CACHE_TTL=1209600 + +# --- Newznab --- + +BUILTIN_NEWZNAB_SEARCH_TIMEOUT=30000 +BUILTIN_NEWZNAB_SEARCH_CACHE_TTL=604800 +BUILTIN_TORZNAB_CAPABILITIES_CACHE_TTL=1209600 + +# --- Zilean --- +BUILTIN_ZILEAN_URL="https://zilean.elfhosted.com" +# BUILTIN_ZILEAN_TIMEOUT= + +# --- AnimeTosho --- +BUILTIN_ANIMETOSHO_URL="https://feed.animetosho.org" +# BUILTIN_ANIMETOSHO_TIMEOUT= + + +# ============================================================================= +# # ANIME DATABASE +# ============================================================================= +# Control how often the datasources for the local anime database will refresh. + +ANIME_DB_FRIBB_MAPPINGS_REFRESH_INTERVAL=86400000 +ANIME_DB_MANAMI_DB_REFRESH_INTERVAL=604800000 +ANIME_DB_KITSU_IMDB_MAPPING_REFRESH_INTERVAL=86400000 +ANIME_DB_EXTENDED_ANITRAKT_MOVIES_REFRESH_INTERVAL=86400000 +ANIME_DB_EXTENDED_ANITRAKT_TV_REFRESH_INTERVAL=86400000 # ============================================================================== # DEBRID & OTHER SERVICE API KEYS @@ -104,6 +156,9 @@ BUILTIN_TORBOX_SEARCH_CACHE_PER_USER_SEARCH_ENGINE=false TMDB_ACCESS_TOKEN= TMDB_API_KEY= +# Provide a trakt client ID for authorised requests to get trakt aliases. +TRAKT_CLIENT_ID= + # Configure API keys for debrid services and others you plan to use. # 'DEFAULT_' values are pre-filled in the user's config page. # 'FORCED_' values override user settings and hide the option. @@ -463,6 +518,10 @@ FORMAT_API_RATE_LIMIT_MAX_REQUESTS=30 CATALOG_API_RATE_LIMIT_WINDOW=5 CATALOG_API_RATE_LIMIT_MAX_REQUESTS=5 +# --- Anime API --- +ANIME_API_RATE_LIMIT_WINDOW=60 +ANIME_API_RATE_LIMIT_MAX_REQUESTS=120 + # --- Stremio Stream --- STREMIO_STREAM_RATE_LIMIT_WINDOW=15 STREMIO_STREAM_RATE_LIMIT_MAX_REQUESTS=10 @@ -543,14 +602,14 @@ PRUNE_MAX_DAYS=-1 # FORCE_JACKETTIO_PROTOCOL= # --------- STREMTHRU-STORE --------- -# STREMTHRU_STORE_URL=https://stremthru.elfhosted.com/stremio/store/ +# STREMTHRU_STORE_URL=https://stremthru.13377001.xyz/stremio/store/ # DEFAULT_STREMTHRU_STORE_TIMEOUT= # Advanced: Override StremThru Store hostname/port/protocol (similar to Comet). # FORCE_STREMTHRU_STORE_HOSTNAME= # FORCE_STREMTHRU_STORE_PORT= # FORCE_STREMTHRU_STORE_PROTOCOL= # --------- STREMTHRU-TORZ ----- -# STREMTHRU_TORZ_URL=https://stremthru.elfhosted.com/stremio/torz/ +# STREMTHRU_TORZ_URL=https://stremthru.13377001.xyz/stremio/torz/ # DEFAULT_STREMTHRU_TORZ_TIMEOUT= # Advanced: Override StremThru Torz hostname/port/protocol (similar to Comet). # FORCE_STREMTHRU_TORZ_HOSTNAME= diff --git a/Dockerfile b/Dockerfile index fe49f7a9..a3b7e51f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,10 @@ -FROM node:22-alpine AS builder +FROM node:22-alpine AS base + +ENV PNPM_HOME="/pnpm" +ENV PATH="$PNPM_HOME:$PATH" +RUN corepack enable + +FROM base AS builder WORKDIR /build @@ -10,9 +16,11 @@ COPY package*.json ./ COPY packages/server/package*.json ./packages/server/ COPY packages/core/package*.json ./packages/core/ COPY packages/frontend/package*.json ./packages/frontend/ +COPY pnpm-workspace.yaml ./pnpm-workspace.yaml +COPY pnpm-lock.yaml ./pnpm-lock.yaml # Install dependencies. -RUN npm install +RUN pnpm install --frozen-lockfile # Copy source files. COPY tsconfig.*json ./ @@ -25,12 +33,18 @@ COPY resources ./resources # Build the project. -RUN npm run build +RUN pnpm run build # Remove development dependencies. -RUN npm --workspaces prune --omit=dev +RUN rm -rf node_modules +RUN rm -rf packages/core/node_modules +RUN rm -rf packages/server/node_modules +RUN rm -rf packages/frontend/node_modules -FROM node:22-alpine AS final +RUN pnpm install --prod --frozen-lockfile + + +FROM base AS final RUN apk add --no-cache curl WORKDIR /app @@ -38,6 +52,8 @@ WORKDIR /app # Copy the built files from the builder. # The package.json files must be copied as well for NPM workspace symlinks between local packages to work. COPY --from=builder /build/package*.json /build/LICENSE ./ +COPY --from=builder /build/pnpm-workspace.yaml ./pnpm-workspace.yaml +COPY --from=builder /build/pnpm-lock.yaml ./pnpm-lock.yaml COPY --from=builder /build/packages/core/package.*json ./packages/core/ COPY --from=builder /build/packages/frontend/package.*json ./packages/frontend/ @@ -51,10 +67,13 @@ COPY --from=builder /build/packages/server/src/static ./packages/server/dist/sta COPY --from=builder /build/resources ./resources COPY --from=builder /build/node_modules ./node_modules +COPY --from=builder /build/packages/core/node_modules ./packages/core/node_modules +COPY --from=builder /build/packages/server/node_modules ./packages/server/node_modules +COPY --from=builder /build/packages/frontend/node_modules ./packages/frontend/node_modules HEALTHCHECK --interval=30s --timeout=5s --start-period=5s --retries=3 \ CMD curl -fsS http://localhost:${PORT:-3000}/api/v1/status || exit 1 EXPOSE ${PORT:-3000} -ENTRYPOINT ["npm", "run", "start"] \ No newline at end of file +ENTRYPOINT ["pnpm", "run", "start"] \ No newline at end of file diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 24dc8450..00000000 --- a/package-lock.json +++ /dev/null @@ -1,14997 +0,0 @@ -{ - "name": "aiostreams", - "version": "2.12.2", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "aiostreams", - "version": "2.12.2", - "license": "MIT", - "workspaces": [ - "packages/*" - ], - "devDependencies": { - "cross-env": "^7.0.3", - "prettier": "^3.3.2", - "ts-node": "^10.9.2", - "tsx": "^4.16.2", - "typescript": "^5.5.3", - "vitest": "^2.1.5" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aiostreams/core": { - "resolved": "packages/core", - "link": true - }, - "node_modules/@aiostreams/frontend": { - "resolved": "packages/frontend", - "link": true - }, - "node_modules/@aiostreams/server": { - "resolved": "packages/server", - "link": true - }, - "node_modules/@alloc/quick-lru": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", - "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@colors/colors": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", - "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==", - "license": "MIT", - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "node_modules/@dabh/diagnostics": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz", - "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==", - "license": "MIT", - "dependencies": { - "colorspace": "1.1.x", - "enabled": "2.0.x", - "kuler": "^2.0.0" - } - }, - "node_modules/@dnd-kit/accessibility": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@dnd-kit/accessibility/-/accessibility-3.1.1.tgz", - "integrity": "sha512-2P+YgaXF+gRsIihwwY1gCsQSYnu9Zyj2py8kY5fFvUM1qm2WA2u639R6YNVfU4GWr+ZM5mqEsfHZZLoRONbemw==", - "license": "MIT", - "dependencies": { - "tslib": "^2.0.0" - }, - "peerDependencies": { - "react": ">=16.8.0" - } - }, - "node_modules/@dnd-kit/core": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/@dnd-kit/core/-/core-6.3.1.tgz", - "integrity": "sha512-xkGBRQQab4RLwgXxoqETICr6S5JlogafbhNsidmrkVv2YRs5MLwpjoF2qpiGjQt8S9AoxtIV603s0GIUpY5eYQ==", - "license": "MIT", - "dependencies": { - "@dnd-kit/accessibility": "^3.1.1", - "@dnd-kit/utilities": "^3.2.2", - "tslib": "^2.0.0" - }, - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - } - }, - "node_modules/@dnd-kit/modifiers": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/@dnd-kit/modifiers/-/modifiers-9.0.0.tgz", - "integrity": "sha512-ybiLc66qRGuZoC20wdSSG6pDXFikui/dCNGthxv4Ndy8ylErY0N3KVxY2bgo7AWwIbxDmXDg3ylAFmnrjcbVvw==", - "license": "MIT", - "dependencies": { - "@dnd-kit/utilities": "^3.2.2", - "tslib": "^2.0.0" - }, - "peerDependencies": { - "@dnd-kit/core": "^6.3.0", - "react": ">=16.8.0" - } - }, - "node_modules/@dnd-kit/sortable": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/@dnd-kit/sortable/-/sortable-10.0.0.tgz", - "integrity": "sha512-+xqhmIIzvAYMGfBYYnbKuNicfSsk4RksY2XdmJhT+HAC01nix6fHCztU68jooFiMUB01Ky3F0FyOvhG/BZrWkg==", - "license": "MIT", - "dependencies": { - "@dnd-kit/utilities": "^3.2.2", - "tslib": "^2.0.0" - }, - "peerDependencies": { - "@dnd-kit/core": "^6.3.0", - "react": ">=16.8.0" - } - }, - "node_modules/@dnd-kit/utilities": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@dnd-kit/utilities/-/utilities-3.2.2.tgz", - "integrity": "sha512-+MKAJEOfaBe5SmV6t34p80MMKhjvUz0vRrvVJbPT0WElzaOJ/1xs+D+KDv+tD/NE5ujfrChEcshd4fLn0wpiqg==", - "license": "MIT", - "dependencies": { - "tslib": "^2.0.0" - }, - "peerDependencies": { - "react": ">=16.8.0" - } - }, - "node_modules/@emnapi/core": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.4.5.tgz", - "integrity": "sha512-XsLw1dEOpkSX/WucdqUhPWP7hDxSvZiY+fsUC14h+FtQ2Ifni4znbBt8punRX+Uj2JG/uDb8nEHVKvrVlvdZ5Q==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/wasi-threads": "1.0.4", - "tslib": "^2.4.0" - } - }, - "node_modules/@emnapi/runtime": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.5.tgz", - "integrity": "sha512-++LApOtY0pEEz1zrd9vy1/zXVaVJJ/EbAF3u0fXIzPJEDtnITsBGbbK0EkM72amhl/R5b+5xx0Y/QhcVOpuulg==", - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@emnapi/wasi-threads": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.0.4.tgz", - "integrity": "sha512-PJR+bOmMOPH8AtcTGAyYNiuJ3/Fcoj2XN/gBEWzDIKh254XO+mM9XoXHk5GNEhodxeMznbg7BlRojVbKN+gC6g==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.8.tgz", - "integrity": "sha512-urAvrUedIqEiFR3FYSLTWQgLu5tb+m0qZw0NBEasUeo6wuqatkMDaRT+1uABiGXEu5vqgPd7FGE1BhsAIy9QVA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.8.tgz", - "integrity": "sha512-RONsAvGCz5oWyePVnLdZY/HHwA++nxYWIX1atInlaW6SEkwq6XkP3+cb825EUcRs5Vss/lGh/2YxAb5xqc07Uw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.8.tgz", - "integrity": "sha512-OD3p7LYzWpLhZEyATcTSJ67qB5D+20vbtr6vHlHWSQYhKtzUYrETuWThmzFpZtFsBIxRvhO07+UgVA9m0i/O1w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.8.tgz", - "integrity": "sha512-yJAVPklM5+4+9dTeKwHOaA+LQkmrKFX96BM0A/2zQrbS6ENCmxc4OVoBs5dPkCCak2roAD+jKCdnmOqKszPkjA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.8.tgz", - "integrity": "sha512-Jw0mxgIaYX6R8ODrdkLLPwBqHTtYHJSmzzd+QeytSugzQ0Vg4c5rDky5VgkoowbZQahCbsv1rT1KW72MPIkevw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.8.tgz", - "integrity": "sha512-Vh2gLxxHnuoQ+GjPNvDSDRpoBCUzY4Pu0kBqMBDlK4fuWbKgGtmDIeEC081xi26PPjn+1tct+Bh8FjyLlw1Zlg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.8.tgz", - "integrity": "sha512-YPJ7hDQ9DnNe5vxOm6jaie9QsTwcKedPvizTVlqWG9GBSq+BuyWEDazlGaDTC5NGU4QJd666V0yqCBL2oWKPfA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.8.tgz", - "integrity": "sha512-MmaEXxQRdXNFsRN/KcIimLnSJrk2r5H8v+WVafRWz5xdSVmWLoITZQXcgehI2ZE6gioE6HirAEToM/RvFBeuhw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.8.tgz", - "integrity": "sha512-FuzEP9BixzZohl1kLf76KEVOsxtIBFwCaLupVuk4eFVnOZfU+Wsn+x5Ryam7nILV2pkq2TqQM9EZPsOBuMC+kg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.8.tgz", - "integrity": "sha512-WIgg00ARWv/uYLU7lsuDK00d/hHSfES5BzdWAdAig1ioV5kaFNrtK8EqGcUBJhYqotlUByUKz5Qo6u8tt7iD/w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.8.tgz", - "integrity": "sha512-A1D9YzRX1i+1AJZuFFUMP1E9fMaYY+GnSQil9Tlw05utlE86EKTUA7RjwHDkEitmLYiFsRd9HwKBPEftNdBfjg==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.8.tgz", - "integrity": "sha512-O7k1J/dwHkY1RMVvglFHl1HzutGEFFZ3kNiDMSOyUrB7WcoHGf96Sh+64nTRT26l3GMbCW01Ekh/ThKM5iI7hQ==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.8.tgz", - "integrity": "sha512-uv+dqfRazte3BzfMp8PAQXmdGHQt2oC/y2ovwpTteqrMx2lwaksiFZ/bdkXJC19ttTvNXBuWH53zy/aTj1FgGw==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.8.tgz", - "integrity": "sha512-GyG0KcMi1GBavP5JgAkkstMGyMholMDybAf8wF5A70CALlDM2p/f7YFE7H92eDeH/VBtFJA5MT4nRPDGg4JuzQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.8.tgz", - "integrity": "sha512-rAqDYFv3yzMrq7GIcen3XP7TUEG/4LK86LUPMIz6RT8A6pRIDn0sDcvjudVZBiiTcZCY9y2SgYX2lgK3AF+1eg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.8.tgz", - "integrity": "sha512-Xutvh6VjlbcHpsIIbwY8GVRbwoviWT19tFhgdA7DlenLGC/mbc3lBoVb7jxj9Z+eyGqvcnSyIltYUrkKzWqSvg==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.8.tgz", - "integrity": "sha512-ASFQhgY4ElXh3nDcOMTkQero4b1lgubskNlhIfJrsH5OKZXDpUAKBlNS0Kx81jwOBp+HCeZqmoJuihTv57/jvQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.8.tgz", - "integrity": "sha512-d1KfruIeohqAi6SA+gENMuObDbEjn22olAR7egqnkCD9DGBG0wsEARotkLgXDu6c4ncgWTZJtN5vcgxzWRMzcw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.8.tgz", - "integrity": "sha512-nVDCkrvx2ua+XQNyfrujIG38+YGyuy2Ru9kKVNyh5jAys6n+l44tTtToqHjino2My8VAY6Lw9H7RI73XFi66Cg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.8.tgz", - "integrity": "sha512-j8HgrDuSJFAujkivSMSfPQSAa5Fxbvk4rgNAS5i3K+r8s1X0p1uOO2Hl2xNsGFppOeHOLAVgYwDVlmxhq5h+SQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.8.tgz", - "integrity": "sha512-1h8MUAwa0VhNCDp6Af0HToI2TJFAn1uqT9Al6DJVzdIBAd21m/G0Yfc77KDM3uF3T/YaOgQq3qTJHPbTOInaIQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openharmony-arm64": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.8.tgz", - "integrity": "sha512-r2nVa5SIK9tSWd0kJd9HCffnDHKchTGikb//9c7HX+r+wHYCpQrSgxhlY6KWV1nFo1l4KFbsMlHk+L6fekLsUg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.8.tgz", - "integrity": "sha512-zUlaP2S12YhQ2UzUfcCuMDHQFJyKABkAjvO5YSndMiIkMimPmxA+BYSBikWgsRpvyxuRnow4nS5NPnf9fpv41w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.8.tgz", - "integrity": "sha512-YEGFFWESlPva8hGL+zvj2z/SaK+pH0SwOM0Nc/d+rVnW7GSTFlLBGzZkuSU9kFIGIo8q9X3ucpZhu8PDN5A2sQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.8.tgz", - "integrity": "sha512-hiGgGC6KZ5LZz58OL/+qVVoZiuZlUYlYHNAmczOm7bs2oE1XriPFi5ZHHrS8ACpV5EjySrnoCKmcbQMN+ojnHg==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.8.tgz", - "integrity": "sha512-cn3Yr7+OaaZq1c+2pe+8yxC8E144SReCQjN6/2ynubzYjvyqZjTXfQJpAcQpsdJq3My7XADANiYGHoFC69pLQw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", - "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", - "dev": true, - "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", - "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/config-array": { - "version": "0.21.0", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz", - "integrity": "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/object-schema": "^2.1.6", - "debug": "^4.3.1", - "minimatch": "^3.1.2" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/config-helpers": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.1.tgz", - "integrity": "sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/core": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.2.tgz", - "integrity": "sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@types/json-schema": "^7.0.15" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", - "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^10.0.1", - "globals": "^14.0.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/js": { - "version": "9.32.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.32.0.tgz", - "integrity": "sha512-BBpRFZK3eX6uMLKz8WxFOBIFFcGFJ/g8XuwjTHCqHROSIsopI+ddn/d5Cfh36+7+e5edVS8dbSHnBNhrLEX0zg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://eslint.org/donate" - } - }, - "node_modules/@eslint/object-schema": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", - "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/plugin-kit": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.5.tgz", - "integrity": "sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/core": "^0.15.2", - "levn": "^0.4.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@floating-ui/core": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.3.tgz", - "integrity": "sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==", - "license": "MIT", - "dependencies": { - "@floating-ui/utils": "^0.2.10" - } - }, - "node_modules/@floating-ui/dom": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.3.tgz", - "integrity": "sha512-uZA413QEpNuhtb3/iIKoYMSK07keHPYeXF02Zhd6e213j+d1NamLix/mCLxBUDW/Gx52sPH2m+chlUsyaBs/Ag==", - "license": "MIT", - "dependencies": { - "@floating-ui/core": "^1.7.3", - "@floating-ui/utils": "^0.2.10" - } - }, - "node_modules/@floating-ui/react": { - "version": "0.26.28", - "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.26.28.tgz", - "integrity": "sha512-yORQuuAtVpiRjpMhdc0wJj06b9JFjrYF4qp96j++v2NBpbi6SEGF7donUJ3TMieerQ6qVkAv1tgr7L4r5roTqw==", - "license": "MIT", - "dependencies": { - "@floating-ui/react-dom": "^2.1.2", - "@floating-ui/utils": "^0.2.8", - "tabbable": "^6.0.0" - }, - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - } - }, - "node_modules/@floating-ui/react-dom": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.5.tgz", - "integrity": "sha512-HDO/1/1oH9fjj4eLgegrlH3dklZpHtUYYFiVwMUwfGvk9jWDRWqkklA2/NFScknrcNSspbV868WjXORvreDX+Q==", - "license": "MIT", - "dependencies": { - "@floating-ui/dom": "^1.7.3" - }, - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - } - }, - "node_modules/@floating-ui/utils": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.10.tgz", - "integrity": "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==", - "license": "MIT" - }, - "node_modules/@gar/promisify": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", - "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", - "license": "MIT", - "optional": true - }, - "node_modules/@headlessui/react": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/@headlessui/react/-/react-2.2.7.tgz", - "integrity": "sha512-WKdTymY8Y49H8/gUc/lIyYK1M+/6dq0Iywh4zTZVAaiTDprRfioxSgD0wnXTQTBpjpGJuTL1NO/mqEvc//5SSg==", - "license": "MIT", - "dependencies": { - "@floating-ui/react": "^0.26.16", - "@react-aria/focus": "^3.20.2", - "@react-aria/interactions": "^3.25.0", - "@tanstack/react-virtual": "^3.13.9", - "use-sync-external-store": "^1.5.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "react": "^18 || ^19 || ^19.0.0-rc", - "react-dom": "^18 || ^19 || ^19.0.0-rc" - } - }, - "node_modules/@headlessui/tailwindcss": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@headlessui/tailwindcss/-/tailwindcss-0.2.2.tgz", - "integrity": "sha512-xNe42KjdyA4kfUKLLPGzME9zkH7Q3rOZ5huFihWNWOQFxnItxPB3/67yBI8/qBfY8nwBRx5GHn4VprsoluVMGw==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "tailwindcss": "^3.0 || ^4.0" - } - }, - "node_modules/@humanfs/core": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", - "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanfs/node": { - "version": "0.16.6", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", - "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@humanfs/core": "^0.19.1", - "@humanwhocodes/retry": "^0.3.0" - }, - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", - "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/retry": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", - "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@img/sharp-darwin-arm64": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.3.tgz", - "integrity": "sha512-ryFMfvxxpQRsgZJqBd4wsttYQbCxsJksrv9Lw/v798JcQ8+w84mBWuXwl+TT0WJ/WrYOLaYpwQXi3sA9nTIaIg==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-darwin-arm64": "1.2.0" - } - }, - "node_modules/@img/sharp-darwin-x64": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.3.tgz", - "integrity": "sha512-yHpJYynROAj12TA6qil58hmPmAwxKKC7reUqtGLzsOHfP7/rniNGTL8tjWX6L3CTV4+5P4ypcS7Pp+7OB+8ihA==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-darwin-x64": "1.2.0" - } - }, - "node_modules/@img/sharp-libvips-darwin-arm64": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.0.tgz", - "integrity": "sha512-sBZmpwmxqwlqG9ueWFXtockhsxefaV6O84BMOrhtg/YqbTaRdqDE7hxraVE3y6gVM4eExmfzW4a8el9ArLeEiQ==", - "cpu": [ - "arm64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "darwin" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-darwin-x64": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.0.tgz", - "integrity": "sha512-M64XVuL94OgiNHa5/m2YvEQI5q2cl9d/wk0qFTDVXcYzi43lxuiFTftMR1tOnFQovVXNZJ5TURSDK2pNe9Yzqg==", - "cpu": [ - "x64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "darwin" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-arm": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.0.tgz", - "integrity": "sha512-mWd2uWvDtL/nvIzThLq3fr2nnGfyr/XMXlq8ZJ9WMR6PXijHlC3ksp0IpuhK6bougvQrchUAfzRLnbsen0Cqvw==", - "cpu": [ - "arm" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-arm64": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.0.tgz", - "integrity": "sha512-RXwd0CgG+uPRX5YYrkzKyalt2OJYRiJQ8ED/fi1tq9WQW2jsQIn0tqrlR5l5dr/rjqq6AHAxURhj2DVjyQWSOA==", - "cpu": [ - "arm64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-ppc64": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.0.tgz", - "integrity": "sha512-Xod/7KaDDHkYu2phxxfeEPXfVXFKx70EAFZ0qyUdOjCcxbjqyJOEUpDe6RIyaunGxT34Anf9ue/wuWOqBW2WcQ==", - "cpu": [ - "ppc64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-s390x": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.0.tgz", - "integrity": "sha512-eMKfzDxLGT8mnmPJTNMcjfO33fLiTDsrMlUVcp6b96ETbnJmd4uvZxVJSKPQfS+odwfVaGifhsB07J1LynFehw==", - "cpu": [ - "s390x" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-x64": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.0.tgz", - "integrity": "sha512-ZW3FPWIc7K1sH9E3nxIGB3y3dZkpJlMnkk7z5tu1nSkBoCgw2nSRTFHI5pB/3CQaJM0pdzMF3paf9ckKMSE9Tg==", - "cpu": [ - "x64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linuxmusl-arm64": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.0.tgz", - "integrity": "sha512-UG+LqQJbf5VJ8NWJ5Z3tdIe/HXjuIdo4JeVNADXBFuG7z9zjoegpzzGIyV5zQKi4zaJjnAd2+g2nna8TZvuW9Q==", - "cpu": [ - "arm64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linuxmusl-x64": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.0.tgz", - "integrity": "sha512-SRYOLR7CXPgNze8akZwjoGBoN1ThNZoqpOgfnOxmWsklTGVfJiGJoC/Lod7aNMGA1jSsKWM1+HRX43OP6p9+6Q==", - "cpu": [ - "x64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-linux-arm": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.3.tgz", - "integrity": "sha512-oBK9l+h6KBN0i3dC8rYntLiVfW8D8wH+NPNT3O/WBHeW0OQWCjfWksLUaPidsrDKpJgXp3G3/hkmhptAW0I3+A==", - "cpu": [ - "arm" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-arm": "1.2.0" - } - }, - "node_modules/@img/sharp-linux-arm64": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.3.tgz", - "integrity": "sha512-QdrKe3EvQrqwkDrtuTIjI0bu6YEJHTgEeqdzI3uWJOH6G1O8Nl1iEeVYRGdj1h5I21CqxSvQp1Yv7xeU3ZewbA==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-arm64": "1.2.0" - } - }, - "node_modules/@img/sharp-linux-ppc64": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.3.tgz", - "integrity": "sha512-GLtbLQMCNC5nxuImPR2+RgrviwKwVql28FWZIW1zWruy6zLgA5/x2ZXk3mxj58X/tszVF69KK0Is83V8YgWhLA==", - "cpu": [ - "ppc64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-ppc64": "1.2.0" - } - }, - "node_modules/@img/sharp-linux-s390x": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.3.tgz", - "integrity": "sha512-3gahT+A6c4cdc2edhsLHmIOXMb17ltffJlxR0aC2VPZfwKoTGZec6u5GrFgdR7ciJSsHT27BD3TIuGcuRT0KmQ==", - "cpu": [ - "s390x" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-s390x": "1.2.0" - } - }, - "node_modules/@img/sharp-linux-x64": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.3.tgz", - "integrity": "sha512-8kYso8d806ypnSq3/Ly0QEw90V5ZoHh10yH0HnrzOCr6DKAPI6QVHvwleqMkVQ0m+fc7EH8ah0BB0QPuWY6zJQ==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-x64": "1.2.0" - } - }, - "node_modules/@img/sharp-linuxmusl-arm64": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.3.tgz", - "integrity": "sha512-vAjbHDlr4izEiXM1OTggpCcPg9tn4YriK5vAjowJsHwdBIdx0fYRsURkxLG2RLm9gyBq66gwtWI8Gx0/ov+JKQ==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-arm64": "1.2.0" - } - }, - "node_modules/@img/sharp-linuxmusl-x64": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.3.tgz", - "integrity": "sha512-gCWUn9547K5bwvOn9l5XGAEjVTTRji4aPTqLzGXHvIr6bIDZKNTA34seMPgM0WmSf+RYBH411VavCejp3PkOeQ==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-x64": "1.2.0" - } - }, - "node_modules/@img/sharp-wasm32": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.3.tgz", - "integrity": "sha512-+CyRcpagHMGteySaWos8IbnXcHgfDn7pO2fiC2slJxvNq9gDipYBN42/RagzctVRKgxATmfqOSulgZv5e1RdMg==", - "cpu": [ - "wasm32" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", - "optional": true, - "dependencies": { - "@emnapi/runtime": "^1.4.4" - }, - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-win32-arm64": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.3.tgz", - "integrity": "sha512-MjnHPnbqMXNC2UgeLJtX4XqoVHHlZNd+nPt1kRPmj63wURegwBhZlApELdtxM2OIZDRv/DFtLcNhVbd1z8GYXQ==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-win32-ia32": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.3.tgz", - "integrity": "sha512-xuCdhH44WxuXgOM714hn4amodJMZl3OEvf0GVTm0BEyMeA2to+8HEdRPShH0SLYptJY1uBw+SCFP9WVQi1Q/cw==", - "cpu": [ - "ia32" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-win32-x64": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.3.tgz", - "integrity": "sha512-OWwz05d++TxzLEv4VnsTz5CmZ6mI6S05sfQGEMrNrQcOEERbX46332IvE7pO/EUiw7jUrrS40z/M7kPyjfl04g==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@internationalized/number": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@internationalized/number/-/number-3.6.3.tgz", - "integrity": "sha512-p+Zh1sb6EfrfVaS86jlHGQ9HA66fJhV9x5LiE5vCbZtXEHAuhcmUZUdZ4WrFpUBfNalr2OkAJI5AcKEQF+Lebw==", - "license": "Apache-2.0", - "dependencies": { - "@swc/helpers": "^0.5.0" - } - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "license": "ISC", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/@isaacs/fs-minipass": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", - "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^7.0.4" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@isaacs/fs-minipass/node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.12", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz", - "integrity": "sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==", - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz", - "integrity": "sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==", - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.29", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.29.tgz", - "integrity": "sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==", - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@napi-rs/wasm-runtime": { - "version": "0.2.12", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", - "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/core": "^1.4.3", - "@emnapi/runtime": "^1.4.3", - "@tybys/wasm-util": "^0.10.0" - } - }, - "node_modules/@next/env": { - "version": "15.3.2", - "resolved": "https://registry.npmjs.org/@next/env/-/env-15.3.2.tgz", - "integrity": "sha512-xURk++7P7qR9JG1jJtLzPzf0qEvqCN0A/T3DXf8IPMKo9/6FfjxtEffRJIIew/bIL4T3C2jLLqBor8B/zVlx6g==", - "license": "MIT" - }, - "node_modules/@next/eslint-plugin-next": { - "version": "15.3.2", - "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-15.3.2.tgz", - "integrity": "sha512-ijVRTXBgnHT33aWnDtmlG+LJD+5vhc9AKTJPquGG5NKXjpKNjc62woIhFtrAcWdBobt8kqjCoaJ0q6sDQoX7aQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-glob": "3.3.1" - } - }, - "node_modules/@next/swc-darwin-arm64": { - "version": "15.3.2", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.3.2.tgz", - "integrity": "sha512-2DR6kY/OGcokbnCsjHpNeQblqCZ85/1j6njYSkzRdpLn5At7OkSdmk7WyAmB9G0k25+VgqVZ/u356OSoQZ3z0g==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-darwin-x64": { - "version": "15.3.2", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.3.2.tgz", - "integrity": "sha512-ro/fdqaZWL6k1S/5CLv1I0DaZfDVJkWNaUU3un8Lg6m0YENWlDulmIWzV96Iou2wEYyEsZq51mwV8+XQXqMp3w==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-arm64-gnu": { - "version": "15.3.2", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.3.2.tgz", - "integrity": "sha512-covwwtZYhlbRWK2HlYX9835qXum4xYZ3E2Mra1mdQ+0ICGoMiw1+nVAn4d9Bo7R3JqSmK1grMq/va+0cdh7bJA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-arm64-musl": { - "version": "15.3.2", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.3.2.tgz", - "integrity": "sha512-KQkMEillvlW5Qk5mtGA/3Yz0/tzpNlSw6/3/ttsV1lNtMuOHcGii3zVeXZyi4EJmmLDKYcTcByV2wVsOhDt/zg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-x64-gnu": { - "version": "15.3.2", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.3.2.tgz", - "integrity": "sha512-uRBo6THWei0chz+Y5j37qzx+BtoDRFIkDzZjlpCItBRXyMPIg079eIkOCl3aqr2tkxL4HFyJ4GHDes7W8HuAUg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-x64-musl": { - "version": "15.3.2", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.3.2.tgz", - "integrity": "sha512-+uxFlPuCNx/T9PdMClOqeE8USKzj8tVz37KflT3Kdbx/LOlZBRI2yxuIcmx1mPNK8DwSOMNCr4ureSet7eyC0w==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-arm64-msvc": { - "version": "15.3.2", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.3.2.tgz", - "integrity": "sha512-LLTKmaI5cfD8dVzh5Vt7+OMo+AIOClEdIU/TSKbXXT2iScUTSxOGoBhfuv+FU8R9MLmrkIL1e2fBMkEEjYAtPQ==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-x64-msvc": { - "version": "15.3.2", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.3.2.tgz", - "integrity": "sha512-aW5B8wOPioJ4mBdMDXkt5f3j8pUr9W8AnlX0Df35uRWNT1Y6RIybxjnSUe+PhM+M1bwgyY8PHLmXZC6zT1o5tA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nolyfill/is-core-module": { - "version": "1.0.39", - "resolved": "https://registry.npmjs.org/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz", - "integrity": "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.4.0" - } - }, - "node_modules/@npmcli/fs": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", - "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==", - "license": "ISC", - "optional": true, - "dependencies": { - "@gar/promisify": "^1.0.1", - "semver": "^7.3.5" - } - }, - "node_modules/@npmcli/move-file": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", - "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", - "deprecated": "This functionality has been moved to @npmcli/fs", - "license": "MIT", - "optional": true, - "dependencies": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@radix-ui/number": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.1.tgz", - "integrity": "sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==", - "license": "MIT" - }, - "node_modules/@radix-ui/primitive": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.2.tgz", - "integrity": "sha512-XnbHrrprsNqZKQhStrSwgRUQzoCI1glLzdw79xiZPoofhGICeZRSQ3dIxAKH1gb3OHfNf4d6f+vAv3kil2eggA==", - "license": "MIT" - }, - "node_modules/@radix-ui/react-accordion": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/@radix-ui/react-accordion/-/react-accordion-1.2.11.tgz", - "integrity": "sha512-l3W5D54emV2ues7jjeG1xcyN7S3jnK3zE2zHqgn0CmMsy9lNJwmgcrmaxS+7ipw15FAivzKNzH3d5EcGoFKw0A==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-collapsible": "1.1.11", - "@radix-ui/react-collection": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-controllable-state": "1.2.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-arrow": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.7.tgz", - "integrity": "sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-primitive": "2.1.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-collapsible": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.1.11.tgz", - "integrity": "sha512-2qrRsVGSCYasSz1RFOorXwl0H7g7J1frQtgpQgYrt+MOidtPAINHn9CPovQXb83r8ahapdx3Tu0fa/pdFFSdPg==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-presence": "1.1.4", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-collection": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.7.tgz", - "integrity": "sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-slot": "1.2.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-compose-refs": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz", - "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-context": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz", - "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-dialog": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.14.tgz", - "integrity": "sha512-+CpweKjqpzTmwRwcYECQcNYbI8V9VSQt0SNFKeEBLgfucbsLssU6Ppq7wUdNXEGb573bMjFhVjKVll8rmV6zMw==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-dismissable-layer": "1.1.10", - "@radix-ui/react-focus-guards": "1.1.2", - "@radix-ui/react-focus-scope": "1.1.7", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-portal": "1.1.9", - "@radix-ui/react-presence": "1.1.4", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-slot": "1.2.3", - "@radix-ui/react-use-controllable-state": "1.2.2", - "aria-hidden": "^1.2.4", - "react-remove-scroll": "^2.6.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-direction": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.1.tgz", - "integrity": "sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-dismissable-layer": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.10.tgz", - "integrity": "sha512-IM1zzRV4W3HtVgftdQiiOmA0AdJlCtMLe00FXaHwgt3rAnNsIyDqshvkIW3hj/iu5hu8ERP7KIYki6NkqDxAwQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-escape-keydown": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-dropdown-menu": { - "version": "2.1.15", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.15.tgz", - "integrity": "sha512-mIBnOjgwo9AH3FyKaSWoSu/dYj6VdhJ7frEPiGTeXCdUFHjl9h3mFh2wwhEtINOmYXWhdpf1rY2minFsmaNgVQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-menu": "2.1.15", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-controllable-state": "1.2.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-focus-guards": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.2.tgz", - "integrity": "sha512-fyjAACV62oPV925xFCrH8DR5xWhg9KYtJT4s3u54jxp+L/hbpTY2kIeEFFbFe+a/HCE94zGQMZLIpVTPVZDhaA==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-focus-scope": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.7.tgz", - "integrity": "sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-id": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.1.tgz", - "integrity": "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-menu": { - "version": "2.1.15", - "resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.1.15.tgz", - "integrity": "sha512-tVlmA3Vb9n8SZSd+YSbuFR66l87Wiy4du+YE+0hzKQEANA+7cWKH1WgqcEX4pXqxUFQKrWQGHdvEfw00TjFiew==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-collection": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-dismissable-layer": "1.1.10", - "@radix-ui/react-focus-guards": "1.1.2", - "@radix-ui/react-focus-scope": "1.1.7", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-popper": "1.2.7", - "@radix-ui/react-portal": "1.1.9", - "@radix-ui/react-presence": "1.1.4", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-roving-focus": "1.1.10", - "@radix-ui/react-slot": "1.2.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "aria-hidden": "^1.2.4", - "react-remove-scroll": "^2.6.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-password-toggle-field": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-password-toggle-field/-/react-password-toggle-field-0.1.2.tgz", - "integrity": "sha512-F90uYnlBsLPU1UbSLciLsWQmk8+hdWa6SFw4GXaIdNWxFxI5ITKVdAG64f+Twaa9ic6xE7pqxPyUmodrGjT4pQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-use-effect-event": "0.0.2", - "@radix-ui/react-use-is-hydrated": "0.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-popover": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.1.14.tgz", - "integrity": "sha512-ODz16+1iIbGUfFEfKx2HTPKizg2MN39uIOV8MXeHnmdd3i/N9Wt7vU46wbHsqA0xoaQyXVcs0KIlBdOA2Y95bw==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-dismissable-layer": "1.1.10", - "@radix-ui/react-focus-guards": "1.1.2", - "@radix-ui/react-focus-scope": "1.1.7", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-popper": "1.2.7", - "@radix-ui/react-portal": "1.1.9", - "@radix-ui/react-presence": "1.1.4", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-slot": "1.2.3", - "@radix-ui/react-use-controllable-state": "1.2.2", - "aria-hidden": "^1.2.4", - "react-remove-scroll": "^2.6.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-popper": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.7.tgz", - "integrity": "sha512-IUFAccz1JyKcf/RjB552PlWwxjeCJB8/4KxT7EhBHOJM+mN7LdW+B3kacJXILm32xawcMMjb2i0cIZpo+f9kiQ==", - "license": "MIT", - "dependencies": { - "@floating-ui/react-dom": "^2.0.0", - "@radix-ui/react-arrow": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-layout-effect": "1.1.1", - "@radix-ui/react-use-rect": "1.1.1", - "@radix-ui/react-use-size": "1.1.1", - "@radix-ui/rect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-portal": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.9.tgz", - "integrity": "sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-presence": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.4.tgz", - "integrity": "sha512-ueDqRbdc4/bkaQT3GIpLQssRlFgWaL/U2z/S31qRwwLWoxHLgry3SIfCwhxeQNbirEUXFa+lq3RL3oBYXtcmIA==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-primitive": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", - "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-slot": "1.2.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-roving-focus": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.10.tgz", - "integrity": "sha512-dT9aOXUen9JSsxnMPv/0VqySQf5eDQ6LCk5Sw28kamz8wSOW2bJdlX2Bg5VUIIcV+6XlHpWTIuTPCf/UNIyq8Q==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-collection": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-controllable-state": "1.2.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-select": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.2.5.tgz", - "integrity": "sha512-HnMTdXEVuuyzx63ME0ut4+sEMYW6oouHWNGUZc7ddvUWIcfCva/AMoqEW/3wnEllriMWBa0RHspCYnfCWJQYmA==", - "license": "MIT", - "dependencies": { - "@radix-ui/number": "1.1.1", - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-collection": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-dismissable-layer": "1.1.10", - "@radix-ui/react-focus-guards": "1.1.2", - "@radix-ui/react-focus-scope": "1.1.7", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-popper": "1.2.7", - "@radix-ui/react-portal": "1.1.9", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-slot": "1.2.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-use-layout-effect": "1.1.1", - "@radix-ui/react-use-previous": "1.1.1", - "@radix-ui/react-visually-hidden": "1.2.3", - "aria-hidden": "^1.2.4", - "react-remove-scroll": "^2.6.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-separator": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.1.7.tgz", - "integrity": "sha512-0HEb8R9E8A+jZjvmFCy/J4xhbXy3TV+9XSnGJ3KvTtjlIUy/YQ/p6UYZvi7YbeoeXdyU9+Y3scizK6hkY37baA==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-primitive": "2.1.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-slider": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slider/-/react-slider-1.3.5.tgz", - "integrity": "sha512-rkfe2pU2NBAYfGaxa3Mqosi7VZEWX5CxKaanRv0vZd4Zhl9fvQrg0VM93dv3xGLGfrHuoTRF3JXH8nb9g+B3fw==", - "license": "MIT", - "dependencies": { - "@radix-ui/number": "1.1.1", - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-collection": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-use-layout-effect": "1.1.1", - "@radix-ui/react-use-previous": "1.1.1", - "@radix-ui/react-use-size": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-slot": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", - "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-switch": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@radix-ui/react-switch/-/react-switch-1.2.5.tgz", - "integrity": "sha512-5ijLkak6ZMylXsaImpZ8u4Rlf5grRmoc0p0QeX9VJtlrM4f5m3nCTX8tWga/zOA8PZYIR/t0p2Mnvd7InrJ6yQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-use-previous": "1.1.1", - "@radix-ui/react-use-size": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-tabs": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.12.tgz", - "integrity": "sha512-GTVAlRVrQrSw3cEARM0nAx73ixrWDPNZAruETn3oHCNP6SbZ/hNxdxp+u7VkIEv3/sFoLq1PfcHrl7Pnp0CDpw==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-presence": "1.1.4", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-roving-focus": "1.1.10", - "@radix-ui/react-use-controllable-state": "1.2.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-tooltip": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.2.7.tgz", - "integrity": "sha512-Ap+fNYwKTYJ9pzqW+Xe2HtMRbQ/EeWkj2qykZ6SuEV4iS/o1bZI5ssJbk4D2r8XuDuOBVz/tIx2JObtuqU+5Zw==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-dismissable-layer": "1.1.10", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-popper": "1.2.7", - "@radix-ui/react-portal": "1.1.9", - "@radix-ui/react-presence": "1.1.4", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-slot": "1.2.3", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-visually-hidden": "1.2.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-callback-ref": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz", - "integrity": "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-controllable-state": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz", - "integrity": "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-effect-event": "0.0.2", - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-effect-event": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.2.tgz", - "integrity": "sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-escape-keydown": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.1.tgz", - "integrity": "sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-callback-ref": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-is-hydrated": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-is-hydrated/-/react-use-is-hydrated-0.1.0.tgz", - "integrity": "sha512-U+UORVEq+cTnRIaostJv9AGdV3G6Y+zbVd+12e18jQ5A3c0xL03IhnHuiU4UV69wolOQp5GfR58NW/EgdQhwOA==", - "license": "MIT", - "dependencies": { - "use-sync-external-store": "^1.5.0" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-layout-effect": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz", - "integrity": "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-previous": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.1.tgz", - "integrity": "sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-rect": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.1.tgz", - "integrity": "sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==", - "license": "MIT", - "dependencies": { - "@radix-ui/rect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-size": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.1.tgz", - "integrity": "sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-visually-hidden": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.2.3.tgz", - "integrity": "sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-primitive": "2.1.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/rect": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.1.tgz", - "integrity": "sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==", - "license": "MIT" - }, - "node_modules/@react-aria/focus": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/@react-aria/focus/-/focus-3.21.0.tgz", - "integrity": "sha512-7NEGtTPsBy52EZ/ToVKCu0HSelE3kq9qeis+2eEq90XSuJOMaDHUQrA7RC2Y89tlEwQB31bud/kKRi9Qme1dkA==", - "license": "Apache-2.0", - "dependencies": { - "@react-aria/interactions": "^3.25.4", - "@react-aria/utils": "^3.30.0", - "@react-types/shared": "^3.31.0", - "@swc/helpers": "^0.5.0", - "clsx": "^2.0.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", - "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" - } - }, - "node_modules/@react-aria/interactions": { - "version": "3.25.4", - "resolved": "https://registry.npmjs.org/@react-aria/interactions/-/interactions-3.25.4.tgz", - "integrity": "sha512-HBQMxgUPHrW8V63u9uGgBymkMfj6vdWbB0GgUJY49K9mBKMsypcHeWkWM6+bF7kxRO728/IK8bWDV6whDbqjHg==", - "license": "Apache-2.0", - "dependencies": { - "@react-aria/ssr": "^3.9.10", - "@react-aria/utils": "^3.30.0", - "@react-stately/flags": "^3.1.2", - "@react-types/shared": "^3.31.0", - "@swc/helpers": "^0.5.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", - "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" - } - }, - "node_modules/@react-aria/ssr": { - "version": "3.9.10", - "resolved": "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.9.10.tgz", - "integrity": "sha512-hvTm77Pf+pMBhuBm760Li0BVIO38jv1IBws1xFm1NoL26PU+fe+FMW5+VZWyANR6nYL65joaJKZqOdTQMkO9IQ==", - "license": "Apache-2.0", - "dependencies": { - "@swc/helpers": "^0.5.0" - }, - "engines": { - "node": ">= 12" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" - } - }, - "node_modules/@react-aria/utils": { - "version": "3.30.0", - "resolved": "https://registry.npmjs.org/@react-aria/utils/-/utils-3.30.0.tgz", - "integrity": "sha512-ydA6y5G1+gbem3Va2nczj/0G0W7/jUVo/cbN10WA5IizzWIwMP5qhFr7macgbKfHMkZ+YZC3oXnt2NNre5odKw==", - "license": "Apache-2.0", - "dependencies": { - "@react-aria/ssr": "^3.9.10", - "@react-stately/flags": "^3.1.2", - "@react-stately/utils": "^3.10.8", - "@react-types/shared": "^3.31.0", - "@swc/helpers": "^0.5.0", - "clsx": "^2.0.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", - "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" - } - }, - "node_modules/@react-stately/flags": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@react-stately/flags/-/flags-3.1.2.tgz", - "integrity": "sha512-2HjFcZx1MyQXoPqcBGALwWWmgFVUk2TuKVIQxCbRq7fPyWXIl6VHcakCLurdtYC2Iks7zizvz0Idv48MQ38DWg==", - "license": "Apache-2.0", - "dependencies": { - "@swc/helpers": "^0.5.0" - } - }, - "node_modules/@react-stately/utils": { - "version": "3.10.8", - "resolved": "https://registry.npmjs.org/@react-stately/utils/-/utils-3.10.8.tgz", - "integrity": "sha512-SN3/h7SzRsusVQjQ4v10LaVsDc81jyyR0DD5HnsQitm/I5WDpaSr2nRHtyloPFU48jlql1XX/S04T2DLQM7Y3g==", - "license": "Apache-2.0", - "dependencies": { - "@swc/helpers": "^0.5.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" - } - }, - "node_modules/@react-types/shared": { - "version": "3.31.0", - "resolved": "https://registry.npmjs.org/@react-types/shared/-/shared-3.31.0.tgz", - "integrity": "sha512-ua5U6V66gDcbLZe4P2QeyNgPp4YWD1ymGA6j3n+s8CGExtrCPe64v+g4mvpT8Bnb985R96e4zFT61+m0YCwqMg==", - "license": "Apache-2.0", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" - } - }, - "node_modules/@redis/bloom": { - "version": "5.8.2", - "resolved": "https://registry.npmjs.org/@redis/bloom/-/bloom-5.8.2.tgz", - "integrity": "sha512-855DR0ChetZLarblio5eM0yLwxA9Dqq50t8StXKp5bAtLT0G+rZ+eRzzqxl37sPqQKjUudSYypz55o6nNhbz0A==", - "license": "MIT", - "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "@redis/client": "^5.8.2" - } - }, - "node_modules/@redis/client": { - "version": "5.8.2", - "resolved": "https://registry.npmjs.org/@redis/client/-/client-5.8.2.tgz", - "integrity": "sha512-WtMScno3+eBpTac1Uav2zugXEoXqaU23YznwvFgkPwBQVwEHTDgOG7uEAObtZ/Nyn8SmAMbqkEubJaMOvnqdsQ==", - "license": "MIT", - "dependencies": { - "cluster-key-slot": "1.1.2" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@redis/json": { - "version": "5.8.2", - "resolved": "https://registry.npmjs.org/@redis/json/-/json-5.8.2.tgz", - "integrity": "sha512-uxpVfas3I0LccBX9rIfDgJ0dBrUa3+0Gc8sEwmQQH0vHi7C1Rx1Qn8Nv1QWz5bohoeIXMICFZRcyDONvum2l/w==", - "license": "MIT", - "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "@redis/client": "^5.8.2" - } - }, - "node_modules/@redis/search": { - "version": "5.8.2", - "resolved": "https://registry.npmjs.org/@redis/search/-/search-5.8.2.tgz", - "integrity": "sha512-cNv7HlgayavCBXqPXgaS97DRPVWFznuzsAmmuemi2TMCx5scwLiP50TeZvUS06h/MG96YNPe6A0Zt57yayfxwA==", - "license": "MIT", - "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "@redis/client": "^5.8.2" - } - }, - "node_modules/@redis/time-series": { - "version": "5.8.2", - "resolved": "https://registry.npmjs.org/@redis/time-series/-/time-series-5.8.2.tgz", - "integrity": "sha512-g2NlHM07fK8H4k+613NBsk3y70R2JIM2dPMSkhIjl2Z17SYvaYKdusz85d7VYOrZBWtDrHV/WD2E3vGu+zni8A==", - "license": "MIT", - "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "@redis/client": "^5.8.2" - } - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.46.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.46.2.tgz", - "integrity": "sha512-Zj3Hl6sN34xJtMv7Anwb5Gu01yujyE/cLBDB2gnHTAHaWS1Z38L7kuSG+oAh0giZMqG060f/YBStXtMH6FvPMA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.46.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.46.2.tgz", - "integrity": "sha512-nTeCWY83kN64oQ5MGz3CgtPx8NSOhC5lWtsjTs+8JAJNLcP3QbLCtDDgUKQc/Ro/frpMq4SHUaHN6AMltcEoLQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.46.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.46.2.tgz", - "integrity": "sha512-HV7bW2Fb/F5KPdM/9bApunQh68YVDU8sO8BvcW9OngQVN3HHHkw99wFupuUJfGR9pYLLAjcAOA6iO+evsbBaPQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.46.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.46.2.tgz", - "integrity": "sha512-SSj8TlYV5nJixSsm/y3QXfhspSiLYP11zpfwp6G/YDXctf3Xkdnk4woJIF5VQe0of2OjzTt8EsxnJDCdHd2xMA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.46.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.46.2.tgz", - "integrity": "sha512-ZyrsG4TIT9xnOlLsSSi9w/X29tCbK1yegE49RYm3tu3wF1L/B6LVMqnEWyDB26d9Ecx9zrmXCiPmIabVuLmNSg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.46.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.46.2.tgz", - "integrity": "sha512-pCgHFoOECwVCJ5GFq8+gR8SBKnMO+xe5UEqbemxBpCKYQddRQMgomv1104RnLSg7nNvgKy05sLsY51+OVRyiVw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.46.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.46.2.tgz", - "integrity": "sha512-EtP8aquZ0xQg0ETFcxUbU71MZlHaw9MChwrQzatiE8U/bvi5uv/oChExXC4mWhjiqK7azGJBqU0tt5H123SzVA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.46.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.46.2.tgz", - "integrity": "sha512-qO7F7U3u1nfxYRPM8HqFtLd+raev2K137dsV08q/LRKRLEc7RsiDWihUnrINdsWQxPR9jqZ8DIIZ1zJJAm5PjQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.46.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.46.2.tgz", - "integrity": "sha512-3dRaqLfcOXYsfvw5xMrxAk9Lb1f395gkoBYzSFcc/scgRFptRXL9DOaDpMiehf9CO8ZDRJW2z45b6fpU5nwjng==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.46.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.46.2.tgz", - "integrity": "sha512-fhHFTutA7SM+IrR6lIfiHskxmpmPTJUXpWIsBXpeEwNgZzZZSg/q4i6FU4J8qOGyJ0TR+wXBwx/L7Ho9z0+uDg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.46.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.46.2.tgz", - "integrity": "sha512-i7wfGFXu8x4+FRqPymzjD+Hyav8l95UIZ773j7J7zRYc3Xsxy2wIn4x+llpunexXe6laaO72iEjeeGyUFmjKeA==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.46.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.46.2.tgz", - "integrity": "sha512-B/l0dFcHVUnqcGZWKcWBSV2PF01YUt0Rvlurci5P+neqY/yMKchGU8ullZvIv5e8Y1C6wOn+U03mrDylP5q9Yw==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.46.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.46.2.tgz", - "integrity": "sha512-32k4ENb5ygtkMwPMucAb8MtV8olkPT03oiTxJbgkJa7lJ7dZMr0GCFJlyvy+K8iq7F/iuOr41ZdUHaOiqyR3iQ==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.46.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.46.2.tgz", - "integrity": "sha512-t5B2loThlFEauloaQkZg9gxV05BYeITLvLkWOkRXogP4qHXLkWSbSHKM9S6H1schf/0YGP/qNKtiISlxvfmmZw==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.46.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.46.2.tgz", - "integrity": "sha512-YKjekwTEKgbB7n17gmODSmJVUIvj8CX7q5442/CK80L8nqOUbMtf8b01QkG3jOqyr1rotrAnW6B/qiHwfcuWQA==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.46.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.46.2.tgz", - "integrity": "sha512-Jj5a9RUoe5ra+MEyERkDKLwTXVu6s3aACP51nkfnK9wJTraCC8IMe3snOfALkrjTYd2G1ViE1hICj0fZ7ALBPA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.46.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.46.2.tgz", - "integrity": "sha512-7kX69DIrBeD7yNp4A5b81izs8BqoZkCIaxQaOpumcJ1S/kmqNFjPhDu1LHeVXv0SexfHQv5cqHsxLOjETuqDuA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.46.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.46.2.tgz", - "integrity": "sha512-wiJWMIpeaak/jsbaq2HMh/rzZxHVW1rU6coyeNNpMwk5isiPjSTx0a4YLSlYDwBH/WBvLz+EtsNqQScZTLJy3g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.46.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.46.2.tgz", - "integrity": "sha512-gBgaUDESVzMgWZhcyjfs9QFK16D8K6QZpwAaVNJxYDLHWayOta4ZMjGm/vsAEy3hvlS2GosVFlBlP9/Wb85DqQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.46.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.46.2.tgz", - "integrity": "sha512-CvUo2ixeIQGtF6WvuB87XWqPQkoFAFqW+HUo/WzHwuHDvIwZCtjdWXoYCcr06iKGydiqTclC4jU/TNObC/xKZg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rtsao/scc": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", - "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", - "dev": true, - "license": "MIT" - }, - "node_modules/@rushstack/eslint-patch": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.12.0.tgz", - "integrity": "sha512-5EwMtOqvJMMa3HbmxLlF74e+3/HhwBTMcvt3nqVJgGCozO6hzIPOBlwm8mGVNR9SN2IJpxSnlxczyDjcn7qIyw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@swc/counter": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", - "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", - "license": "Apache-2.0" - }, - "node_modules/@swc/helpers": { - "version": "0.5.17", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.17.tgz", - "integrity": "sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.8.0" - } - }, - "node_modules/@tailwindcss/forms": { - "version": "0.5.10", - "resolved": "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.5.10.tgz", - "integrity": "sha512-utI1ONF6uf/pPNO68kmN1b8rEwNXv3czukalo8VtJH8ksIkZXr3Q3VYudZLkCsDd4Wku120uF02hYK25XGPorw==", - "license": "MIT", - "dependencies": { - "mini-svg-data-uri": "^1.2.3" - }, - "peerDependencies": { - "tailwindcss": ">=3.0.0 || >= 3.0.0-alpha.1 || >= 4.0.0-alpha.20 || >= 4.0.0-beta.1" - } - }, - "node_modules/@tailwindcss/node": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.11.tgz", - "integrity": "sha512-yzhzuGRmv5QyU9qLNg4GTlYI6STedBWRE7NjxP45CsFYYq9taI0zJXZBMqIC/c8fViNLhmrbpSFS57EoxUmD6Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@ampproject/remapping": "^2.3.0", - "enhanced-resolve": "^5.18.1", - "jiti": "^2.4.2", - "lightningcss": "1.30.1", - "magic-string": "^0.30.17", - "source-map-js": "^1.2.1", - "tailwindcss": "4.1.11" - } - }, - "node_modules/@tailwindcss/node/node_modules/tailwindcss": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.11.tgz", - "integrity": "sha512-2E9TBm6MDD/xKYe+dvJZAmg3yxIEDNRc0jwlNyDg/4Fil2QcSLjFKGVff0lAf1jjeaArlG/M75Ey/EYr/OJtBA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@tailwindcss/oxide": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.11.tgz", - "integrity": "sha512-Q69XzrtAhuyfHo+5/HMgr1lAiPP/G40OMFAnws7xcFEYqcypZmdW8eGXaOUIeOl1dzPJBPENXgbjsOyhg2nkrg==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "detect-libc": "^2.0.4", - "tar": "^7.4.3" - }, - "engines": { - "node": ">= 10" - }, - "optionalDependencies": { - "@tailwindcss/oxide-android-arm64": "4.1.11", - "@tailwindcss/oxide-darwin-arm64": "4.1.11", - "@tailwindcss/oxide-darwin-x64": "4.1.11", - "@tailwindcss/oxide-freebsd-x64": "4.1.11", - "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.11", - "@tailwindcss/oxide-linux-arm64-gnu": "4.1.11", - "@tailwindcss/oxide-linux-arm64-musl": "4.1.11", - "@tailwindcss/oxide-linux-x64-gnu": "4.1.11", - "@tailwindcss/oxide-linux-x64-musl": "4.1.11", - "@tailwindcss/oxide-wasm32-wasi": "4.1.11", - "@tailwindcss/oxide-win32-arm64-msvc": "4.1.11", - "@tailwindcss/oxide-win32-x64-msvc": "4.1.11" - } - }, - "node_modules/@tailwindcss/oxide-android-arm64": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.11.tgz", - "integrity": "sha512-3IfFuATVRUMZZprEIx9OGDjG3Ou3jG4xQzNTvjDoKmU9JdmoCohQJ83MYd0GPnQIu89YoJqvMM0G3uqLRFtetg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-darwin-arm64": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.11.tgz", - "integrity": "sha512-ESgStEOEsyg8J5YcMb1xl8WFOXfeBmrhAwGsFxxB2CxY9evy63+AtpbDLAyRkJnxLy2WsD1qF13E97uQyP1lfQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-darwin-x64": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.11.tgz", - "integrity": "sha512-EgnK8kRchgmgzG6jE10UQNaH9Mwi2n+yw1jWmof9Vyg2lpKNX2ioe7CJdf9M5f8V9uaQxInenZkOxnTVL3fhAw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-freebsd-x64": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.11.tgz", - "integrity": "sha512-xdqKtbpHs7pQhIKmqVpxStnY1skuNh4CtbcyOHeX1YBE0hArj2romsFGb6yUmzkq/6M24nkxDqU8GYrKrz+UcA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.11.tgz", - "integrity": "sha512-ryHQK2eyDYYMwB5wZL46uoxz2zzDZsFBwfjssgB7pzytAeCCa6glsiJGjhTEddq/4OsIjsLNMAiMlHNYnkEEeg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.11.tgz", - "integrity": "sha512-mYwqheq4BXF83j/w75ewkPJmPZIqqP1nhoghS9D57CLjsh3Nfq0m4ftTotRYtGnZd3eCztgbSPJ9QhfC91gDZQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-linux-arm64-musl": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.11.tgz", - "integrity": "sha512-m/NVRFNGlEHJrNVk3O6I9ggVuNjXHIPoD6bqay/pubtYC9QIdAMpS+cswZQPBLvVvEF6GtSNONbDkZrjWZXYNQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-linux-x64-gnu": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.11.tgz", - "integrity": "sha512-YW6sblI7xukSD2TdbbaeQVDysIm/UPJtObHJHKxDEcW2exAtY47j52f8jZXkqE1krdnkhCMGqP3dbniu1Te2Fg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-linux-x64-musl": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.11.tgz", - "integrity": "sha512-e3C/RRhGunWYNC3aSF7exsQkdXzQ/M+aYuZHKnw4U7KQwTJotnWsGOIVih0s2qQzmEzOFIJ3+xt7iq67K/p56Q==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-wasm32-wasi": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.11.tgz", - "integrity": "sha512-Xo1+/GU0JEN/C/dvcammKHzeM6NqKovG+6921MR6oadee5XPBaKOumrJCXvopJ/Qb5TH7LX/UAywbqrP4lax0g==", - "bundleDependencies": [ - "@napi-rs/wasm-runtime", - "@emnapi/core", - "@emnapi/runtime", - "@tybys/wasm-util", - "@emnapi/wasi-threads", - "tslib" - ], - "cpu": [ - "wasm32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/core": "^1.4.3", - "@emnapi/runtime": "^1.4.3", - "@emnapi/wasi-threads": "^1.0.2", - "@napi-rs/wasm-runtime": "^0.2.11", - "@tybys/wasm-util": "^0.9.0", - "tslib": "^2.8.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.11.tgz", - "integrity": "sha512-UgKYx5PwEKrac3GPNPf6HVMNhUIGuUh4wlDFR2jYYdkX6pL/rn73zTq/4pzUm8fOjAn5L8zDeHp9iXmUGOXZ+w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-win32-x64-msvc": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.11.tgz", - "integrity": "sha512-YfHoggn1j0LK7wR82TOucWc5LDCguHnoS879idHekmmiR7g9HUtMw9MI0NHatS28u/Xlkfi9w5RJWgz2Dl+5Qg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/postcss": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.1.11.tgz", - "integrity": "sha512-q/EAIIpF6WpLhKEuQSEVMZNMIY8KhWoAemZ9eylNAih9jxMGAYPPWBn3I9QL/2jZ+e7OEz/tZkX5HwbBR4HohA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@alloc/quick-lru": "^5.2.0", - "@tailwindcss/node": "4.1.11", - "@tailwindcss/oxide": "4.1.11", - "postcss": "^8.4.41", - "tailwindcss": "4.1.11" - } - }, - "node_modules/@tailwindcss/postcss/node_modules/tailwindcss": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.11.tgz", - "integrity": "sha512-2E9TBm6MDD/xKYe+dvJZAmg3yxIEDNRc0jwlNyDg/4Fil2QcSLjFKGVff0lAf1jjeaArlG/M75Ey/EYr/OJtBA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@tailwindcss/typography": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.16.tgz", - "integrity": "sha512-0wDLwCVF5V3x3b1SGXPCDcdsbDHMBe+lkFzBRaHeLvNi+nrrnZ1lA18u+OTWO8iSWU2GxUOCvlXtDuqftc1oiA==", - "license": "MIT", - "dependencies": { - "lodash.castarray": "^4.4.0", - "lodash.isplainobject": "^4.0.6", - "lodash.merge": "^4.6.2", - "postcss-selector-parser": "6.0.10" - }, - "peerDependencies": { - "tailwindcss": ">=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1" - } - }, - "node_modules/@tanstack/react-virtual": { - "version": "3.13.12", - "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.13.12.tgz", - "integrity": "sha512-Gd13QdxPSukP8ZrkbgS2RwoZseTTbQPLnQEn7HY/rqtM+8Zt95f7xKC7N0EsKs7aoz0WzZ+fditZux+F8EzYxA==", - "license": "MIT", - "dependencies": { - "@tanstack/virtual-core": "3.13.12" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, - "node_modules/@tanstack/virtual-core": { - "version": "3.13.12", - "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.13.12.tgz", - "integrity": "sha512-1YBOJfRHV4sXUmWsFSf5rQor4Ss82G8dQWLRbnk3GA4jeP8hQt1hxXh0tmflpC0dz3VgEv/1+qwPyLeWkQuPFA==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - } - }, - "node_modules/@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@torbox/torbox-api": { - "version": "1.0.9", - "resolved": "git+ssh://git@github.com/viren070/torbox-sdk-js.git#dc1d0bc148dd35fa5e5d39f699f070aadeccad5c", - "license": "MIT", - "dependencies": { - "zod": "3.22.0" - } - }, - "node_modules/@torbox/torbox-api/node_modules/zod": { - "version": "3.22.0", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.22.0.tgz", - "integrity": "sha512-y5KZY/ssf5n7hCGDGGtcJO/EBJEm5Pa+QQvFBeyMOtnFYOSflalxIFFvdaYevPhePcmcKC4aTbFkCcXN7D0O8Q==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - }, - "node_modules/@tsconfig/node10": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", - "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/@tybys/wasm-util": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.0.tgz", - "integrity": "sha512-VyyPYFlOMNylG45GoAe0xDoLwWuowvf92F9kySqzYh8vmYm7D2u4iUJKa1tOUpS70Ku13ASrOkS4ScXFsTaCNQ==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@types/bcrypt": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@types/bcrypt/-/bcrypt-5.0.2.tgz", - "integrity": "sha512-6atioO8Y75fNcbmj0G7UjI9lXN2pQ/IGJ2FWT4a/btd0Lk9lQalHLKhkgKVZ3r+spnmWUKfbMi1GEe9wyHQfNQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/body-parser": { - "version": "1.19.6", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", - "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "node_modules/@types/bytes": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@types/bytes/-/bytes-3.1.5.tgz", - "integrity": "sha512-VgZkrJckypj85YxEsEavcMmmSOIzkUHqWmM4CCyia5dc54YwsXzJ5uT4fYxBQNEXx+oF1krlhgCbvfubXqZYsQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/connect": { - "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", - "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/debug": { - "version": "4.1.12", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", - "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", - "license": "MIT", - "dependencies": { - "@types/ms": "*" - } - }, - "node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "license": "MIT" - }, - "node_modules/@types/estree-jsx": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", - "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", - "license": "MIT", - "dependencies": { - "@types/estree": "*" - } - }, - "node_modules/@types/express": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.3.tgz", - "integrity": "sha512-wGA0NX93b19/dZC1J18tKWVIYWyyF2ZjT9vin/NRu0qzzvfVzWjs04iq2rQ3H65vCTQYlRqs3YHfY7zjdV+9Kw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^5.0.0", - "@types/serve-static": "*" - } - }, - "node_modules/@types/express-rate-limit": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/@types/express-rate-limit/-/express-rate-limit-5.1.3.tgz", - "integrity": "sha512-H+TYy3K53uPU2TqPGFYaiWc2xJV6+bIFkDd/Ma2/h67Pa6ARk9kWE0p/K9OH1Okm0et9Sfm66fmXoAxsH2PHXg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/express": "*" - } - }, - "node_modules/@types/express-serve-static-core": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.7.tgz", - "integrity": "sha512-R+33OsgWw7rOhD1emjU7dzCDHucJrgJXMA5PYCzJxVil0dsyx5iBEPHqpPfiKNJQb7lZ1vxwoLR4Z87bBUpeGQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "node_modules/@types/hast": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", - "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", - "license": "MIT", - "dependencies": { - "@types/unist": "*" - } - }, - "node_modules/@types/http-errors": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", - "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/mdast": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", - "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", - "license": "MIT", - "dependencies": { - "@types/unist": "*" - } - }, - "node_modules/@types/mime": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", - "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/ms": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", - "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "24.2.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.2.1.tgz", - "integrity": "sha512-DRh5K+ka5eJic8CjH7td8QpYEV6Zo10gfRkjHCO3weqZHWDtAaSTFtl4+VMqOJ4N5jcuhZ9/l+yy8rVgw7BQeQ==", - "license": "MIT", - "dependencies": { - "undici-types": "~7.10.0" - } - }, - "node_modules/@types/node-fetch": { - "version": "2.6.13", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.13.tgz", - "integrity": "sha512-QGpRVpzSaUs30JBSGPjOg4Uveu384erbHBoT1zeONvyCfwQxIkUshLAOqN/k9EjGviPRmWTTe6aH2qySWKTVSw==", - "license": "MIT", - "dependencies": { - "@types/node": "*", - "form-data": "^4.0.4" - } - }, - "node_modules/@types/pg": { - "version": "8.15.5", - "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.15.5.tgz", - "integrity": "sha512-LF7lF6zWEKxuT3/OR8wAZGzkg4ENGXFNyiV/JeOt9z5B+0ZVwbql9McqX5c/WStFq1GaGso7H1AzP/qSzmlCKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "pg-protocol": "*", - "pg-types": "^2.2.0" - } - }, - "node_modules/@types/qs": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/range-parser": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", - "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/react": { - "version": "19.1.9", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.9.tgz", - "integrity": "sha512-WmdoynAX8Stew/36uTSVMcLJJ1KRh6L3IZRx1PZ7qJtBqT3dYTgyDTx8H1qoRghErydW7xw9mSJ3wS//tCRpFA==", - "license": "MIT", - "dependencies": { - "csstype": "^3.0.2" - } - }, - "node_modules/@types/react-dom": { - "version": "19.1.7", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.1.7.tgz", - "integrity": "sha512-i5ZzwYpqjmrKenzkoLM2Ibzt6mAsM7pxB6BCIouEVVmgiqaMj1TjaK7hnA36hbW5aZv20kx7Lw6hWzPWg0Rurw==", - "devOptional": true, - "license": "MIT", - "peerDependencies": { - "@types/react": "^19.0.0" - } - }, - "node_modules/@types/send": { - "version": "0.17.5", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.5.tgz", - "integrity": "sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "node_modules/@types/serve-static": { - "version": "1.15.8", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.8.tgz", - "integrity": "sha512-roei0UY3LhpOJvjbIP6ZZFngyLKl5dskOtDhxY5THRSpO+ZI+nzJ+m5yUMzGrp89YRa7lvknKkMYjqQFGwA7Sg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/http-errors": "*", - "@types/node": "*", - "@types/send": "*" - } - }, - "node_modules/@types/triple-beam": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", - "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==", - "license": "MIT" - }, - "node_modules/@types/unist": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", - "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", - "license": "MIT" - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.39.0.tgz", - "integrity": "sha512-bhEz6OZeUR+O/6yx9Jk6ohX6H9JSFTaiY0v9/PuKT3oGK0rn0jNplLmyFUGV+a9gfYnVNwGDwS/UkLIuXNb2Rw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.39.0", - "@typescript-eslint/type-utils": "8.39.0", - "@typescript-eslint/utils": "8.39.0", - "@typescript-eslint/visitor-keys": "8.39.0", - "graphemer": "^1.4.0", - "ignore": "^7.0.0", - "natural-compare": "^1.4.0", - "ts-api-utils": "^2.1.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^8.39.0", - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", - "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.39.0.tgz", - "integrity": "sha512-g3WpVQHngx0aLXn6kfIYCZxM6rRJlWzEkVpqEFLT3SgEDsp9cpCbxxgwnE504q4H+ruSDh/VGS6nqZIDynP+vg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/scope-manager": "8.39.0", - "@typescript-eslint/types": "8.39.0", - "@typescript-eslint/typescript-estree": "8.39.0", - "@typescript-eslint/visitor-keys": "8.39.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/project-service": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.39.0.tgz", - "integrity": "sha512-CTzJqaSq30V/Z2Og9jogzZt8lJRR5TKlAdXmWgdu4hgcC9Kww5flQ+xFvMxIBWVNdxJO7OifgdOK4PokMIWPew==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.39.0", - "@typescript-eslint/types": "^8.39.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.39.0.tgz", - "integrity": "sha512-8QOzff9UKxOh6npZQ/4FQu4mjdOCGSdO3p44ww0hk8Vu+IGbg0tB/H1LcTARRDzGCC8pDGbh2rissBuuoPgH8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.39.0", - "@typescript-eslint/visitor-keys": "8.39.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.39.0.tgz", - "integrity": "sha512-Fd3/QjmFV2sKmvv3Mrj8r6N8CryYiCS8Wdb/6/rgOXAWGcFuc+VkQuG28uk/4kVNVZBQuuDHEDUpo/pQ32zsIQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.39.0.tgz", - "integrity": "sha512-6B3z0c1DXVT2vYA9+z9axjtc09rqKUPRmijD5m9iv8iQpHBRYRMBcgxSiKTZKm6FwWw1/cI4v6em35OsKCiN5Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.39.0", - "@typescript-eslint/typescript-estree": "8.39.0", - "@typescript-eslint/utils": "8.39.0", - "debug": "^4.3.4", - "ts-api-utils": "^2.1.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/types": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.39.0.tgz", - "integrity": "sha512-ArDdaOllnCj3yn/lzKn9s0pBQYmmyme/v1HbGIGB0GB/knFI3fWMHloC+oYTJW46tVbYnGKTMDK4ah1sC2v0Kg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.39.0.tgz", - "integrity": "sha512-ndWdiflRMvfIgQRpckQQLiB5qAKQ7w++V4LlCHwp62eym1HLB/kw7D9f2e8ytONls/jt89TEasgvb+VwnRprsw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/project-service": "8.39.0", - "@typescript-eslint/tsconfig-utils": "8.39.0", - "@typescript-eslint/types": "8.39.0", - "@typescript-eslint/visitor-keys": "8.39.0", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^2.1.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.39.0.tgz", - "integrity": "sha512-4GVSvNA0Vx1Ktwvf4sFE+exxJ3QGUorQG1/A5mRfRNZtkBT2xrA/BCO2H0eALx/PnvCS6/vmYwRdDA41EoffkQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.39.0", - "@typescript-eslint/types": "8.39.0", - "@typescript-eslint/typescript-estree": "8.39.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.39.0.tgz", - "integrity": "sha512-ldgiJ+VAhQCfIjeOgu8Kj5nSxds0ktPOSO9p4+0VDH2R2pLvQraaM5Oen2d7NxzMCm+Sn/vJT+mv2H5u6b/3fA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.39.0", - "eslint-visitor-keys": "^4.2.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@ungap/structured-clone": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", - "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", - "license": "ISC" - }, - "node_modules/@unrs/resolver-binding-android-arm-eabi": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.11.1.tgz", - "integrity": "sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@unrs/resolver-binding-android-arm64": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.11.1.tgz", - "integrity": "sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@unrs/resolver-binding-darwin-arm64": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.11.1.tgz", - "integrity": "sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@unrs/resolver-binding-darwin-x64": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.11.1.tgz", - "integrity": "sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@unrs/resolver-binding-freebsd-x64": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.11.1.tgz", - "integrity": "sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.11.1.tgz", - "integrity": "sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.11.1.tgz", - "integrity": "sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-arm64-gnu": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.11.1.tgz", - "integrity": "sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-arm64-musl": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.11.1.tgz", - "integrity": "sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.11.1.tgz", - "integrity": "sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.11.1.tgz", - "integrity": "sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-riscv64-musl": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.11.1.tgz", - "integrity": "sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-s390x-gnu": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.11.1.tgz", - "integrity": "sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-x64-gnu": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.11.1.tgz", - "integrity": "sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-x64-musl": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.11.1.tgz", - "integrity": "sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-wasm32-wasi": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.11.1.tgz", - "integrity": "sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==", - "cpu": [ - "wasm32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@napi-rs/wasm-runtime": "^0.2.11" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@unrs/resolver-binding-win32-arm64-msvc": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.11.1.tgz", - "integrity": "sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@unrs/resolver-binding-win32-ia32-msvc": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.11.1.tgz", - "integrity": "sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@unrs/resolver-binding-win32-x64-msvc": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.11.1.tgz", - "integrity": "sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@vitest/expect": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.1.9.tgz", - "integrity": "sha512-UJCIkTBenHeKT1TTlKMJWy1laZewsRIzYighyYiJKZreqtdxSos/S1t+ktRMQWu2CKqaarrkeszJx1cgC5tGZw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/spy": "2.1.9", - "@vitest/utils": "2.1.9", - "chai": "^5.1.2", - "tinyrainbow": "^1.2.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/mocker": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-2.1.9.tgz", - "integrity": "sha512-tVL6uJgoUdi6icpxmdrn5YNo3g3Dxv+IHJBr0GXHaEdTcw3F+cPKnsXFhli6nO+f/6SDKPHEK1UN+k+TQv0Ehg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/spy": "2.1.9", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.12" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "msw": "^2.4.9", - "vite": "^5.0.0" - }, - "peerDependenciesMeta": { - "msw": { - "optional": true - }, - "vite": { - "optional": true - } - } - }, - "node_modules/@vitest/pretty-format": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.9.tgz", - "integrity": "sha512-KhRIdGV2U9HOUzxfiHmY8IFHTdqtOhIzCpd8WRdJiE7D/HUcZVD0EgQCVjm+Q9gkUXWgBvMmTtZgIG48wq7sOQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyrainbow": "^1.2.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/runner": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.1.9.tgz", - "integrity": "sha512-ZXSSqTFIrzduD63btIfEyOmNcBmQvgOVsPNPe0jYtESiXkhd8u2erDLnMxmGrDCwHCCHE7hxwRDCT3pt0esT4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/utils": "2.1.9", - "pathe": "^1.1.2" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/snapshot": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.1.9.tgz", - "integrity": "sha512-oBO82rEjsxLNJincVhLhaxxZdEtV0EFHMK5Kmx5sJ6H9L183dHECjiefOAdnqpIgT5eZwT04PoggUnW88vOBNQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "2.1.9", - "magic-string": "^0.30.12", - "pathe": "^1.1.2" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/spy": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.1.9.tgz", - "integrity": "sha512-E1B35FwzXXTs9FHNK6bDszs7mtydNi5MIfUWpceJ8Xbfb1gBMscAnwLbEu+B44ed6W3XjL9/ehLPHR1fkf1KLQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyspy": "^3.0.2" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/utils": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.9.tgz", - "integrity": "sha512-v0psaMSkNJ3A2NMrUEHFRzJtDPFn+/VWZ5WxImB21T9fjucJRmS7xCS3ppEnARb9y11OAzaD+P2Ps+b+BGX5iQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "2.1.9", - "loupe": "^3.1.2", - "tinyrainbow": "^1.2.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@zag-js/anatomy": { - "version": "1.21.1", - "resolved": "https://registry.npmjs.org/@zag-js/anatomy/-/anatomy-1.21.1.tgz", - "integrity": "sha512-KFDf1kMLJblsuzAPpfqt2Ti1B0jVtC3ZAQUYLixgUIzI+bnyq7T3IlPK38wpczqvruUijFSKtjS+tXBfR/P4fg==", - "license": "MIT" - }, - "node_modules/@zag-js/core": { - "version": "1.21.1", - "resolved": "https://registry.npmjs.org/@zag-js/core/-/core-1.21.1.tgz", - "integrity": "sha512-bxkrKpT2F6oyy4NovQDRvFhFEf13Owyr100aty+xiYxvrWz0rNAOaid+hmjIP4f+QDvxGF1XiYFmXgqls3sUTw==", - "license": "MIT", - "dependencies": { - "@zag-js/dom-query": "1.21.1", - "@zag-js/utils": "1.21.1" - } - }, - "node_modules/@zag-js/dom-query": { - "version": "1.21.1", - "resolved": "https://registry.npmjs.org/@zag-js/dom-query/-/dom-query-1.21.1.tgz", - "integrity": "sha512-O4db9iYvKeHPjBOtE92p01WXKHngzRRsR7Y5p1cNZ4cbBq15PH2lICcWwUyIxx5zjADZHx6HIv3E+Mg/KCauKA==", - "license": "MIT", - "dependencies": { - "@zag-js/types": "1.21.1" - } - }, - "node_modules/@zag-js/number-input": { - "version": "1.21.1", - "resolved": "https://registry.npmjs.org/@zag-js/number-input/-/number-input-1.21.1.tgz", - "integrity": "sha512-FLCb1DcxqfKDcsS4CwIRsjjHdTh5jhgdlik089U+ybIltdBUPuz8JBymXIKgKNEY5uaY7wcxZSesa2N5iRG4nw==", - "license": "MIT", - "dependencies": { - "@internationalized/number": "3.6.3", - "@zag-js/anatomy": "1.21.1", - "@zag-js/core": "1.21.1", - "@zag-js/dom-query": "1.21.1", - "@zag-js/types": "1.21.1", - "@zag-js/utils": "1.21.1" - } - }, - "node_modules/@zag-js/react": { - "version": "1.21.1", - "resolved": "https://registry.npmjs.org/@zag-js/react/-/react-1.21.1.tgz", - "integrity": "sha512-v2sOqTi2uQ67lz3n5AfUqASla5vHB3zAzSeTZvO479krmcYw44VatVHtxMmr+gx12p7XFGONkFau+MxURXp9Dw==", - "license": "MIT", - "dependencies": { - "@zag-js/core": "1.21.1", - "@zag-js/store": "1.21.1", - "@zag-js/types": "1.21.1", - "@zag-js/utils": "1.21.1" - }, - "peerDependencies": { - "react": ">=18.0.0", - "react-dom": ">=18.0.0" - } - }, - "node_modules/@zag-js/store": { - "version": "1.21.1", - "resolved": "https://registry.npmjs.org/@zag-js/store/-/store-1.21.1.tgz", - "integrity": "sha512-nuRIWUmL6I80Uxvap54ubuC6wTUBdGrY/LF7snnuK+/bZmcuif/202Oeepo+mlaaiyJ+z3abj2LNosPLKJT4eg==", - "license": "MIT", - "dependencies": { - "proxy-compare": "3.0.1" - } - }, - "node_modules/@zag-js/types": { - "version": "1.21.1", - "resolved": "https://registry.npmjs.org/@zag-js/types/-/types-1.21.1.tgz", - "integrity": "sha512-KbKMwJnrj6wmi4FOcaIMwqBVPz4KZRAn0D7Il8QjvAaJc5SdqkK18lcxQz4/v02EmQ4uOrHgKchcnB+ZHcBFCw==", - "license": "MIT", - "dependencies": { - "csstype": "3.1.3" - } - }, - "node_modules/@zag-js/utils": { - "version": "1.21.1", - "resolved": "https://registry.npmjs.org/@zag-js/utils/-/utils-1.21.1.tgz", - "integrity": "sha512-YXkmKoQilMaCQolPnfyyF1xIDOkvSGUQ3RfNlGCxcfnXZeuLWhV/9kalXql5OhtDMChaSeI5IgoV6zH2KEeN0A==", - "license": "MIT" - }, - "node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "license": "ISC", - "optional": true - }, - "node_modules/accepts": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", - "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", - "license": "MIT", - "dependencies": { - "mime-types": "^3.0.0", - "negotiator": "^1.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/accepts/node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/accepts/node_modules/mime-types": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", - "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", - "license": "MIT", - "dependencies": { - "mime-db": "^1.54.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/accepts/node_modules/negotiator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", - "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", - "devOptional": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/acorn-walk": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", - "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "acorn": "^8.11.0" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/agentkeepalive": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.6.0.tgz", - "integrity": "sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "humanize-ms": "^1.2.1" - }, - "engines": { - "node": ">= 8.0.0" - } - }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "license": "MIT", - "optional": true, - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", - "license": "MIT" - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/aproba": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.1.0.tgz", - "integrity": "sha512-tLIEcj5GuR2RSTnxNKdkK0dJ/GrC7P38sUkiDmDuHfsHmbagTFAxDVIBltoklXEVIQ/f14IL8IMJ5pn9Hez1Ew==", - "license": "ISC", - "optional": true - }, - "node_modules/are-we-there-yet": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", - "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", - "deprecated": "This package is no longer supported.", - "license": "ISC", - "optional": true, - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "license": "MIT" - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, - "license": "Python-2.0" - }, - "node_modules/aria-hidden": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz", - "integrity": "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==", - "license": "MIT", - "dependencies": { - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/aria-query": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", - "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", - "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "is-array-buffer": "^3.0.5" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-includes": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", - "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.24.0", - "es-object-atoms": "^1.1.1", - "get-intrinsic": "^1.3.0", - "is-string": "^1.1.1", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.findlast": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", - "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.findlastindex": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", - "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.9", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "es-shim-unscopables": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flat": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", - "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flatmap": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", - "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.tosorted": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", - "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.3", - "es-errors": "^1.3.0", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", - "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "is-array-buffer": "^3.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/assertion-error": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", - "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - } - }, - "node_modules/ast-types-flow": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", - "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/async": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", - "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", - "license": "MIT" - }, - "node_modules/async-function": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", - "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "license": "MIT" - }, - "node_modules/autoprefixer": { - "version": "10.4.21", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz", - "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "browserslist": "^4.24.4", - "caniuse-lite": "^1.0.30001702", - "fraction.js": "^4.3.7", - "normalize-range": "^0.1.2", - "picocolors": "^1.1.1", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/axe-core": { - "version": "4.10.3", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.3.tgz", - "integrity": "sha512-Xm7bpRXnDSX2YE2YFfBk2FnF0ep6tmG7xPh8iHee8MIcrgq762Nkce856dYtJYLkuIoYZvGfTs/PbZhideTcEg==", - "dev": true, - "license": "MPL-2.0", - "engines": { - "node": ">=4" - } - }, - "node_modules/axobject-query": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", - "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/bail": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", - "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "license": "MIT" - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/bcrypt": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-6.0.0.tgz", - "integrity": "sha512-cU8v/EGSrnH+HnxV2z0J7/blxH8gq7Xh2JFT6Aroax7UohdmiJJlxApMxtKfuI7z68NvvVcmR78k2LbT6efhRg==", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "node-addon-api": "^8.3.0", - "node-gyp-build": "^4.8.4" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "license": "MIT", - "dependencies": { - "file-uri-to-path": "1.0.0" - } - }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "license": "MIT", - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/body-parser": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz", - "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==", - "license": "MIT", - "dependencies": { - "bytes": "^3.1.2", - "content-type": "^1.0.5", - "debug": "^4.4.0", - "http-errors": "^2.0.0", - "iconv-lite": "^0.6.3", - "on-finished": "^2.4.1", - "qs": "^6.14.0", - "raw-body": "^3.0.0", - "type-is": "^2.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.25.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.1.tgz", - "integrity": "sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "caniuse-lite": "^1.0.30001726", - "electron-to-chromium": "^1.5.173", - "node-releases": "^2.0.19", - "update-browserslist-db": "^1.1.3" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/busboy": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", - "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", - "dependencies": { - "streamsearch": "^1.1.0" - }, - "engines": { - "node": ">=10.16.0" - } - }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/cac": { - "version": "6.7.14", - "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", - "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/cacache": { - "version": "15.3.0", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", - "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", - "license": "ISC", - "optional": true, - "dependencies": { - "@npmcli/fs": "^1.0.0", - "@npmcli/move-file": "^1.0.1", - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "glob": "^7.1.4", - "infer-owner": "^1.0.4", - "lru-cache": "^6.0.0", - "minipass": "^3.1.1", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.2", - "mkdirp": "^1.0.3", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^8.0.1", - "tar": "^6.0.2", - "unique-filename": "^1.1.1" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/cacache/node_modules/tar": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", - "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", - "license": "ISC", - "optional": true, - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/cacache/node_modules/tar/node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "license": "ISC", - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/call-bind": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", - "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.0", - "es-define-property": "^1.0.0", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase-css": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001733", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001733.tgz", - "integrity": "sha512-e4QKw/O2Kavj2VQTKZWrwzkt3IxOmIlU6ajRb6LP64LHpBo1J67k2Hi4Vu/TgJWsNtynurfS0uK3MaUTCPfu5Q==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, - "node_modules/ccount": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", - "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/chai": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/chai/-/chai-5.2.1.tgz", - "integrity": "sha512-5nFxhUrX0PqtyogoYOA8IPswy5sZFTOsBFl/9bNsmDLgsxYTzSZQJDPppDnZPTQbzSEm0hqGjWPzRemQCYbD6A==", - "dev": true, - "license": "MIT", - "dependencies": { - "assertion-error": "^2.0.1", - "check-error": "^2.1.1", - "deep-eql": "^5.0.1", - "loupe": "^3.1.0", - "pathval": "^2.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/character-entities": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", - "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-entities-html4": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", - "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-entities-legacy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", - "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-reference-invalid": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", - "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/check-error": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", - "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 16" - } - }, - "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "license": "MIT", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/class-variance-authority": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz", - "integrity": "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==", - "license": "Apache-2.0", - "dependencies": { - "clsx": "^2.1.1" - }, - "funding": { - "url": "https://polar.sh/cva" - } - }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/client-only": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", - "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", - "license": "MIT" - }, - "node_modules/clsx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/cluster-key-slot": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz", - "integrity": "sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==", - "license": "Apache-2.0", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cmdk": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/cmdk/-/cmdk-1.1.1.tgz", - "integrity": "sha512-Vsv7kFaXm+ptHDMZ7izaRsP70GgrW9NBNGswt9OZaVBLlE0SNpDq8eu/VGXyF9r7M0azK3Wy7OlYXsuyYLFzHg==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "^1.1.1", - "@radix-ui/react-dialog": "^1.1.6", - "@radix-ui/react-id": "^1.1.0", - "@radix-ui/react-primitive": "^2.0.2" - }, - "peerDependencies": { - "react": "^18 || ^19 || ^19.0.0-rc", - "react-dom": "^18 || ^19 || ^19.0.0-rc" - } - }, - "node_modules/color": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", - "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", - "license": "MIT", - "optional": true, - "dependencies": { - "color-convert": "^2.0.1", - "color-string": "^1.9.0" - }, - "engines": { - "node": ">=12.5.0" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "license": "MIT" - }, - "node_modules/color-string": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", - "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", - "license": "MIT", - "dependencies": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, - "node_modules/color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "license": "ISC", - "optional": true, - "bin": { - "color-support": "bin.js" - } - }, - "node_modules/colorspace": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz", - "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==", - "license": "MIT", - "dependencies": { - "color": "^3.1.3", - "text-hex": "1.0.x" - } - }, - "node_modules/colorspace/node_modules/color": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", - "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.3", - "color-string": "^1.6.0" - } - }, - "node_modules/colorspace/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/colorspace/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "license": "MIT" - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/comma-separated-tokens": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", - "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", - "license": "ISC", - "optional": true - }, - "node_modules/content-disposition": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz", - "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==", - "license": "MIT", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/convert-hrtime": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/convert-hrtime/-/convert-hrtime-5.0.0.tgz", - "integrity": "sha512-lOETlkIeYSJWcbbcvjRKGxVMXJR+8+OQb/mTPbA4ObPMytYIsUbuOE0Jzy60hjARYszq1id0j8KgVhC+WGZVTg==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cookie": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", - "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", - "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", - "license": "MIT", - "engines": { - "node": ">=6.6.0" - } - }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/cross-env": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", - "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.1" - }, - "bin": { - "cross-env": "src/bin/cross-env.js", - "cross-env-shell": "src/bin/cross-env-shell.js" - }, - "engines": { - "node": ">=10.14", - "npm": ">=6", - "yarn": ">=1" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "license": "MIT", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "license": "MIT" - }, - "node_modules/damerau-levenshtein": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", - "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", - "dev": true, - "license": "BSD-2-Clause" - }, - "node_modules/data-view-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", - "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/data-view-byte-length": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", - "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/inspect-js" - } - }, - "node_modules/data-view-byte-offset": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", - "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decode-named-character-reference": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.2.0.tgz", - "integrity": "sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==", - "license": "MIT", - "dependencies": { - "character-entities": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "license": "MIT", - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/deep-eql": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", - "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "license": "MIT", - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", - "license": "MIT", - "optional": true - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/detect-libc": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", - "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", - "license": "Apache-2.0", - "engines": { - "node": ">=8" - } - }, - "node_modules/detect-node-es": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", - "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==", - "license": "MIT" - }, - "node_modules/devlop": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", - "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", - "license": "MIT", - "dependencies": { - "dequal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/didyoumean": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", - "license": "Apache-2.0" - }, - "node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "devOptional": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "license": "MIT" - }, - "node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/dotenv": { - "version": "16.6.1", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", - "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "license": "MIT" - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "license": "MIT" - }, - "node_modules/electron-to-chromium": { - "version": "1.5.199", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.199.tgz", - "integrity": "sha512-3gl0S7zQd88kCAZRO/DnxtBKuhMO4h0EaQIN3YgZfV6+pW+5+bf2AdQeHNESCoaQqo/gjGVYEf2YM4O5HJQqpQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "license": "MIT" - }, - "node_modules/enabled": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", - "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==", - "license": "MIT" - }, - "node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "license": "MIT", - "optional": true, - "dependencies": { - "iconv-lite": "^0.6.2" - } - }, - "node_modules/end-of-stream": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", - "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", - "license": "MIT", - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/enhanced-resolve": { - "version": "5.18.3", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz", - "integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/envalid": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/envalid/-/envalid-8.1.0.tgz", - "integrity": "sha512-OT6+qVhKVyCidaGoXflb2iK1tC8pd0OV2Q+v9n33wNhUJ+lus+rJobUj4vJaQBPxPZ0vYrPGuxdrenyCAIJcow==", - "license": "MIT", - "dependencies": { - "tslib": "2.8.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/err-code": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", - "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", - "license": "MIT", - "optional": true - }, - "node_modules/es-abstract": { - "version": "1.24.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz", - "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-buffer-byte-length": "^1.0.2", - "arraybuffer.prototype.slice": "^1.0.4", - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "data-view-buffer": "^1.0.2", - "data-view-byte-length": "^1.0.2", - "data-view-byte-offset": "^1.0.1", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "es-set-tostringtag": "^2.1.0", - "es-to-primitive": "^1.3.0", - "function.prototype.name": "^1.1.8", - "get-intrinsic": "^1.3.0", - "get-proto": "^1.0.1", - "get-symbol-description": "^1.1.0", - "globalthis": "^1.0.4", - "gopd": "^1.2.0", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "internal-slot": "^1.1.0", - "is-array-buffer": "^3.0.5", - "is-callable": "^1.2.7", - "is-data-view": "^1.0.2", - "is-negative-zero": "^2.0.3", - "is-regex": "^1.2.1", - "is-set": "^2.0.3", - "is-shared-array-buffer": "^1.0.4", - "is-string": "^1.1.1", - "is-typed-array": "^1.1.15", - "is-weakref": "^1.1.1", - "math-intrinsics": "^1.1.0", - "object-inspect": "^1.13.4", - "object-keys": "^1.1.1", - "object.assign": "^4.1.7", - "own-keys": "^1.0.1", - "regexp.prototype.flags": "^1.5.4", - "safe-array-concat": "^1.1.3", - "safe-push-apply": "^1.0.0", - "safe-regex-test": "^1.1.0", - "set-proto": "^1.0.0", - "stop-iteration-iterator": "^1.1.0", - "string.prototype.trim": "^1.2.10", - "string.prototype.trimend": "^1.0.9", - "string.prototype.trimstart": "^1.0.8", - "typed-array-buffer": "^1.0.3", - "typed-array-byte-length": "^1.0.3", - "typed-array-byte-offset": "^1.0.4", - "typed-array-length": "^1.0.7", - "unbox-primitive": "^1.1.0", - "which-typed-array": "^1.1.19" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-iterator-helpers": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz", - "integrity": "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.6", - "es-errors": "^1.3.0", - "es-set-tostringtag": "^2.0.3", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.6", - "globalthis": "^1.0.4", - "gopd": "^1.2.0", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.2.0", - "has-symbols": "^1.1.0", - "internal-slot": "^1.1.0", - "iterator.prototype": "^1.1.4", - "safe-array-concat": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-module-lexer": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", - "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", - "dev": true, - "license": "MIT" - }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-shim-unscopables": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", - "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", - "dev": true, - "license": "MIT", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-to-primitive": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", - "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-callable": "^1.2.7", - "is-date-object": "^1.0.5", - "is-symbol": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/esbuild": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.8.tgz", - "integrity": "sha512-vVC0USHGtMi8+R4Kz8rt6JhEWLxsv9Rnu/lGYbPR8u47B+DCBksq9JarW0zOO7bs37hyOK1l2/oqtbciutL5+Q==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.8", - "@esbuild/android-arm": "0.25.8", - "@esbuild/android-arm64": "0.25.8", - "@esbuild/android-x64": "0.25.8", - "@esbuild/darwin-arm64": "0.25.8", - "@esbuild/darwin-x64": "0.25.8", - "@esbuild/freebsd-arm64": "0.25.8", - "@esbuild/freebsd-x64": "0.25.8", - "@esbuild/linux-arm": "0.25.8", - "@esbuild/linux-arm64": "0.25.8", - "@esbuild/linux-ia32": "0.25.8", - "@esbuild/linux-loong64": "0.25.8", - "@esbuild/linux-mips64el": "0.25.8", - "@esbuild/linux-ppc64": "0.25.8", - "@esbuild/linux-riscv64": "0.25.8", - "@esbuild/linux-s390x": "0.25.8", - "@esbuild/linux-x64": "0.25.8", - "@esbuild/netbsd-arm64": "0.25.8", - "@esbuild/netbsd-x64": "0.25.8", - "@esbuild/openbsd-arm64": "0.25.8", - "@esbuild/openbsd-x64": "0.25.8", - "@esbuild/openharmony-arm64": "0.25.8", - "@esbuild/sunos-x64": "0.25.8", - "@esbuild/win32-arm64": "0.25.8", - "@esbuild/win32-ia32": "0.25.8", - "@esbuild/win32-x64": "0.25.8" - } - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "license": "MIT" - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "9.32.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.32.0.tgz", - "integrity": "sha512-LSehfdpgMeWcTZkWZVIJl+tkZ2nuSkyyB9C27MZqFWXuph7DvaowgcTvKqxvpLW1JZIk8PN7hFY3Rj9LQ7m7lg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.21.0", - "@eslint/config-helpers": "^0.3.0", - "@eslint/core": "^0.15.0", - "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.32.0", - "@eslint/plugin-kit": "^0.3.4", - "@humanfs/node": "^0.16.6", - "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.4.2", - "@types/estree": "^1.0.6", - "@types/json-schema": "^7.0.15", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.6", - "debug": "^4.3.2", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.4.0", - "eslint-visitor-keys": "^4.2.1", - "espree": "^10.4.0", - "esquery": "^1.5.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^8.0.0", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://eslint.org/donate" - }, - "peerDependencies": { - "jiti": "*" - }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - } - } - }, - "node_modules/eslint-config-next": { - "version": "15.3.2", - "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-15.3.2.tgz", - "integrity": "sha512-FerU4DYccO4FgeYFFglz0SnaKRe1ejXQrDb8kWUkTAg036YWi+jUsgg4sIGNCDhAsDITsZaL4MzBWKB6f4G1Dg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@next/eslint-plugin-next": "15.3.2", - "@rushstack/eslint-patch": "^1.10.3", - "@typescript-eslint/eslint-plugin": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", - "@typescript-eslint/parser": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", - "eslint-import-resolver-node": "^0.3.6", - "eslint-import-resolver-typescript": "^3.5.2", - "eslint-plugin-import": "^2.31.0", - "eslint-plugin-jsx-a11y": "^6.10.0", - "eslint-plugin-react": "^7.37.0", - "eslint-plugin-react-hooks": "^5.0.0" - }, - "peerDependencies": { - "eslint": "^7.23.0 || ^8.0.0 || ^9.0.0", - "typescript": ">=3.3.1" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", - "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^3.2.7", - "is-core-module": "^2.13.0", - "resolve": "^1.22.4" - } - }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-import-resolver-typescript": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.10.1.tgz", - "integrity": "sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "@nolyfill/is-core-module": "1.0.39", - "debug": "^4.4.0", - "get-tsconfig": "^4.10.0", - "is-bun-module": "^2.0.0", - "stable-hash": "^0.0.5", - "tinyglobby": "^0.2.13", - "unrs-resolver": "^1.6.2" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint-import-resolver-typescript" - }, - "peerDependencies": { - "eslint": "*", - "eslint-plugin-import": "*", - "eslint-plugin-import-x": "*" - }, - "peerDependenciesMeta": { - "eslint-plugin-import": { - "optional": true - }, - "eslint-plugin-import-x": { - "optional": true - } - } - }, - "node_modules/eslint-module-utils": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz", - "integrity": "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^3.2.7" - }, - "engines": { - "node": ">=4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } - } - }, - "node_modules/eslint-module-utils/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-import": { - "version": "2.32.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", - "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@rtsao/scc": "^1.1.0", - "array-includes": "^3.1.9", - "array.prototype.findlastindex": "^1.2.6", - "array.prototype.flat": "^1.3.3", - "array.prototype.flatmap": "^1.3.3", - "debug": "^3.2.7", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.12.1", - "hasown": "^2.0.2", - "is-core-module": "^2.16.1", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.8", - "object.groupby": "^1.0.3", - "object.values": "^1.2.1", - "semver": "^6.3.1", - "string.prototype.trimend": "^1.0.9", - "tsconfig-paths": "^3.15.0" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" - } - }, - "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-import/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/eslint-plugin-jsx-a11y": { - "version": "6.10.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz", - "integrity": "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "aria-query": "^5.3.2", - "array-includes": "^3.1.8", - "array.prototype.flatmap": "^1.3.2", - "ast-types-flow": "^0.0.8", - "axe-core": "^4.10.0", - "axobject-query": "^4.1.0", - "damerau-levenshtein": "^1.0.8", - "emoji-regex": "^9.2.2", - "hasown": "^2.0.2", - "jsx-ast-utils": "^3.3.5", - "language-tags": "^1.0.9", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.8", - "safe-regex-test": "^1.0.3", - "string.prototype.includes": "^2.0.1" - }, - "engines": { - "node": ">=4.0" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" - } - }, - "node_modules/eslint-plugin-react": { - "version": "7.37.5", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", - "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-includes": "^3.1.8", - "array.prototype.findlast": "^1.2.5", - "array.prototype.flatmap": "^1.3.3", - "array.prototype.tosorted": "^1.1.4", - "doctrine": "^2.1.0", - "es-iterator-helpers": "^1.2.1", - "estraverse": "^5.3.0", - "hasown": "^2.0.2", - "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "minimatch": "^3.1.2", - "object.entries": "^1.1.9", - "object.fromentries": "^2.0.8", - "object.values": "^1.2.1", - "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.5", - "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.12", - "string.prototype.repeat": "^1.0.0" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" - } - }, - "node_modules/eslint-plugin-react-hooks": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz", - "integrity": "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" - } - }, - "node_modules/eslint-plugin-react/node_modules/resolve": { - "version": "2.0.0-next.5", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", - "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/eslint-plugin-react/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/eslint-scope": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", - "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/espree": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", - "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "acorn": "^8.15.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.2.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esquery": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estree-util-is-identifier-name": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", - "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/expand-template": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", - "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", - "license": "(MIT OR WTFPL)", - "engines": { - "node": ">=6" - } - }, - "node_modules/expect-type": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.2.2.tgz", - "integrity": "sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/expr-eval": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expr-eval/-/expr-eval-2.0.2.tgz", - "integrity": "sha512-4EMSHGOPSwAfBiibw3ndnP0AvjDWLsMvGOvWEZ2F96IGk0bIVdjQisOHxReSkE13mHcfbuCiXw+G4y0zv6N8Eg==", - "license": "MIT" - }, - "node_modules/express": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz", - "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==", - "license": "MIT", - "dependencies": { - "accepts": "^2.0.0", - "body-parser": "^2.2.0", - "content-disposition": "^1.0.0", - "content-type": "^1.0.5", - "cookie": "^0.7.1", - "cookie-signature": "^1.2.1", - "debug": "^4.4.0", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "etag": "^1.8.1", - "finalhandler": "^2.1.0", - "fresh": "^2.0.0", - "http-errors": "^2.0.0", - "merge-descriptors": "^2.0.0", - "mime-types": "^3.0.0", - "on-finished": "^2.4.1", - "once": "^1.4.0", - "parseurl": "^1.3.3", - "proxy-addr": "^2.0.7", - "qs": "^6.14.0", - "range-parser": "^1.2.1", - "router": "^2.2.0", - "send": "^1.1.0", - "serve-static": "^2.2.0", - "statuses": "^2.0.1", - "type-is": "^2.0.1", - "vary": "^1.1.2" - }, - "engines": { - "node": ">= 18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/express-rate-limit": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.0.1.tgz", - "integrity": "sha512-aZVCnybn7TVmxO4BtlmnvX+nuz8qHW124KKJ8dumsBsmv5ZLxE0pYu7S2nwyRBGHHCAzdmnGyrc5U/rksSPO7Q==", - "license": "MIT", - "dependencies": { - "ip-address": "10.0.1" - }, - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://github.com/sponsors/express-rate-limit" - }, - "peerDependencies": { - "express": ">= 4.11" - } - }, - "node_modules/express-rate-limit/node_modules/ip-address": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.0.1.tgz", - "integrity": "sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA==", - "license": "MIT", - "engines": { - "node": ">= 12" - } - }, - "node_modules/express/node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/express/node_modules/mime-types": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", - "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", - "license": "MIT", - "dependencies": { - "mime-db": "^1.54.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "license": "MIT" - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-glob": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", - "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true, - "license": "MIT" - }, - "node_modules/fastq": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", - "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fecha": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", - "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==", - "license": "MIT" - }, - "node_modules/fetch-socks": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fetch-socks/-/fetch-socks-1.3.2.tgz", - "integrity": "sha512-vkH5+Zgj2yEbU57Cei0iyLgTZ4OkEKJj56Xu3ViB5dpsl599JgEooQ3x6NVagIFRHWnWJ+7K0MO0aIV1TMgvnw==", - "license": "MIT", - "dependencies": { - "socks": "^2.8.2", - "undici": ">=6" - } - }, - "node_modules/file-entry-cache": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", - "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "flat-cache": "^4.0.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "license": "MIT" - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/finalhandler": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz", - "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", - "license": "MIT", - "dependencies": { - "debug": "^4.4.0", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "on-finished": "^2.4.1", - "parseurl": "^1.3.3", - "statuses": "^2.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", - "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", - "dev": true, - "license": "MIT", - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.4" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/flatted": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", - "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", - "dev": true, - "license": "ISC" - }, - "node_modules/fn.name": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", - "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==", - "license": "MIT" - }, - "node_modules/for-each": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", - "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-callable": "^1.2.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/foreground-child": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", - "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.6", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/foreground-child/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/form-data": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", - "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.2", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fraction.js": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", - "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - }, - "funding": { - "type": "patreon", - "url": "https://github.com/sponsors/rawify" - } - }, - "node_modules/framer-motion": { - "version": "12.23.12", - "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.23.12.tgz", - "integrity": "sha512-6e78rdVtnBvlEVgu6eFEAgG9v3wLnYEboM8I5O5EXvfKC8gxGQB8wXJdhkMy10iVcn05jl6CNw7/HTsTCfwcWg==", - "license": "MIT", - "dependencies": { - "motion-dom": "^12.23.12", - "motion-utils": "^12.23.6", - "tslib": "^2.4.0" - }, - "peerDependencies": { - "@emotion/is-prop-valid": "*", - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "@emotion/is-prop-valid": { - "optional": true - }, - "react": { - "optional": true - }, - "react-dom": { - "optional": true - } - } - }, - "node_modules/fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", - "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "license": "MIT" - }, - "node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "license": "ISC", - "optional": true - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/function-timeout": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/function-timeout/-/function-timeout-1.0.2.tgz", - "integrity": "sha512-939eZS4gJ3htTHAldmyyuzlrD58P03fHG49v2JfFXbV6OhvZKRC9j2yAtdHw/zrp2zXHuv05zMIy40F0ge7spA==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/function.prototype.name": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", - "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "functions-have-names": "^1.2.3", - "hasown": "^2.0.2", - "is-callable": "^1.2.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gauge": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", - "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", - "deprecated": "This package is no longer supported.", - "license": "ISC", - "optional": true, - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^3.0.7", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-nonce": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", - "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/get-symbol-description": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", - "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-tsconfig": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.1.tgz", - "integrity": "sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "resolve-pkg-maps": "^1.0.0" - }, - "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" - } - }, - "node_modules/github-from-package": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", - "license": "MIT" - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "license": "ISC", - "optional": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/globals": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globalthis": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", - "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-properties": "^1.2.1", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "devOptional": true, - "license": "ISC" - }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true, - "license": "MIT" - }, - "node_modules/has-bigints": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", - "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", - "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", - "license": "ISC", - "optional": true - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/hast-util-to-jsx-runtime": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz", - "integrity": "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==", - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "comma-separated-tokens": "^2.0.0", - "devlop": "^1.0.0", - "estree-util-is-identifier-name": "^3.0.0", - "hast-util-whitespace": "^3.0.0", - "mdast-util-mdx-expression": "^2.0.0", - "mdast-util-mdx-jsx": "^3.0.0", - "mdast-util-mdxjs-esm": "^2.0.0", - "property-information": "^7.0.0", - "space-separated-tokens": "^2.0.0", - "style-to-js": "^1.0.0", - "unist-util-position": "^5.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-whitespace": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", - "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/html-url-attributes": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/html-url-attributes/-/html-url-attributes-3.0.1.tgz", - "integrity": "sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/http-cache-semantics": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", - "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", - "license": "BSD-2-Clause", - "optional": true - }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "license": "MIT", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/http-errors/node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", - "license": "MIT", - "optional": true, - "dependencies": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "license": "MIT", - "optional": true, - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/humanize-ms": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "ms": "^2.0.0" - } - }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "BSD-3-Clause" - }, - "node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", - "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "license": "ISC", - "optional": true - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "license": "ISC", - "optional": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "license": "ISC" - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "license": "ISC" - }, - "node_modules/inline-style-parser": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.4.tgz", - "integrity": "sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==", - "license": "MIT" - }, - "node_modules/internal-slot": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", - "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "hasown": "^2.0.2", - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/ip-address": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", - "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", - "license": "MIT", - "dependencies": { - "jsbn": "1.1.0", - "sprintf-js": "^1.1.3" - }, - "engines": { - "node": ">= 12" - } - }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/is-alphabetical": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", - "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-alphanumerical": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", - "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", - "license": "MIT", - "dependencies": { - "is-alphabetical": "^2.0.0", - "is-decimal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-array-buffer": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", - "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", - "license": "MIT" - }, - "node_modules/is-async-function": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", - "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "async-function": "^1.0.0", - "call-bound": "^1.0.3", - "get-proto": "^1.0.1", - "has-tostringtag": "^1.0.2", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-bigint": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", - "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-bigints": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "license": "MIT", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-boolean-object": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", - "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-bun-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-2.0.0.tgz", - "integrity": "sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^7.7.1" - } - }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", - "license": "MIT", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-data-view": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", - "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "get-intrinsic": "^1.2.6", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", - "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-decimal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", - "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-finalizationregistry": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", - "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-generator-function": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", - "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "get-proto": "^1.0.0", - "has-tostringtag": "^1.0.2", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-hexadecimal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", - "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-lambda": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", - "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", - "license": "MIT", - "optional": true - }, - "node_modules/is-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", - "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-negative-zero": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", - "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-number-object": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", - "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-plain-obj": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", - "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-promise": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", - "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", - "license": "MIT" - }, - "node_modules/is-regex": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", - "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-set": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", - "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", - "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-string": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", - "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", - "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "has-symbols": "^1.1.0", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", - "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "which-typed-array": "^1.1.16" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakmap": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", - "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakref": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", - "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakset": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", - "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true, - "license": "MIT" - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "license": "ISC" - }, - "node_modules/iterator.prototype": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", - "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.4", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.6", - "get-proto": "^1.0.0", - "has-symbols": "^1.1.0", - "set-function-name": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/jiti": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.5.1.tgz", - "integrity": "sha512-twQoecYPiVA5K/h6SxtORw/Bs3ar+mLUtoPSc7iMXzQzK8d7eJ/R09wmTwAjiamETn1cXYPGfNnu7DMoHgu12w==", - "dev": true, - "license": "MIT", - "bin": { - "jiti": "lib/jiti-cli.mjs" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsbn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", - "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", - "license": "MIT" - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, - "license": "MIT", - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/jsx-ast-utils": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", - "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flat": "^1.3.1", - "object.assign": "^4.1.4", - "object.values": "^1.1.6" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "license": "MIT", - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/kuler": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", - "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==", - "license": "MIT" - }, - "node_modules/language-subtag-registry": { - "version": "0.3.23", - "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz", - "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==", - "dev": true, - "license": "CC0-1.0" - }, - "node_modules/language-tags": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", - "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", - "dev": true, - "license": "MIT", - "dependencies": { - "language-subtag-registry": "^0.3.20" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lightningcss": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.1.tgz", - "integrity": "sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==", - "dev": true, - "license": "MPL-2.0", - "dependencies": { - "detect-libc": "^2.0.3" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "lightningcss-darwin-arm64": "1.30.1", - "lightningcss-darwin-x64": "1.30.1", - "lightningcss-freebsd-x64": "1.30.1", - "lightningcss-linux-arm-gnueabihf": "1.30.1", - "lightningcss-linux-arm64-gnu": "1.30.1", - "lightningcss-linux-arm64-musl": "1.30.1", - "lightningcss-linux-x64-gnu": "1.30.1", - "lightningcss-linux-x64-musl": "1.30.1", - "lightningcss-win32-arm64-msvc": "1.30.1", - "lightningcss-win32-x64-msvc": "1.30.1" - } - }, - "node_modules/lightningcss-darwin-arm64": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.1.tgz", - "integrity": "sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "peer": true, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-darwin-x64": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.1.tgz", - "integrity": "sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "peer": true, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-freebsd-x64": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.1.tgz", - "integrity": "sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "freebsd" - ], - "peer": true, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.1.tgz", - "integrity": "sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.1.tgz", - "integrity": "sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-musl": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.1.tgz", - "integrity": "sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-gnu": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.1.tgz", - "integrity": "sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-musl": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.1.tgz", - "integrity": "sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-arm64-msvc": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.1.tgz", - "integrity": "sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "peer": true, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-x64-msvc": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.1.tgz", - "integrity": "sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "peer": true, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lilconfig": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", - "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antonk52" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "license": "MIT" - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash.castarray": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.castarray/-/lodash.castarray-4.4.0.tgz", - "integrity": "sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==", - "license": "MIT" - }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", - "license": "MIT" - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "license": "MIT" - }, - "node_modules/logform": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/logform/-/logform-2.7.0.tgz", - "integrity": "sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==", - "license": "MIT", - "dependencies": { - "@colors/colors": "1.6.0", - "@types/triple-beam": "^1.3.2", - "fecha": "^4.2.0", - "ms": "^2.1.1", - "safe-stable-stringify": "^2.3.1", - "triple-beam": "^1.3.0" - }, - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/longest-streak": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", - "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/loupe": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.2.0.tgz", - "integrity": "sha512-2NCfZcT5VGVNX9mSZIxLRkEAegDGBpuQZBy13desuHeVORmBDyAET4TkJr4SjqQy3A8JDofMN6LpkK8Xcm/dlw==", - "dev": true, - "license": "MIT" - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "license": "ISC", - "optional": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/lucide-react": { - "version": "0.511.0", - "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.511.0.tgz", - "integrity": "sha512-VK5a2ydJ7xm8GvBeKLS9mu1pVK6ucef9780JVUjw6bAjJL/QXnd4Y0p7SPeOUMC27YhzNCZvm5d/QX0Tp3rc0w==", - "license": "ISC", - "peerDependencies": { - "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, - "node_modules/magic-string": { - "version": "0.30.17", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", - "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0" - } - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "devOptional": true, - "license": "ISC" - }, - "node_modules/make-fetch-happen": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz", - "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==", - "license": "ISC", - "optional": true, - "dependencies": { - "agentkeepalive": "^4.1.3", - "cacache": "^15.2.0", - "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^6.0.0", - "minipass": "^3.1.3", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^1.3.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.2", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^6.0.0", - "ssri": "^8.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/mdast-util-from-markdown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz", - "integrity": "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "mdast-util-to-string": "^4.0.0", - "micromark": "^4.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-decode-string": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "unist-util-stringify-position": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-mdx-expression": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz", - "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==", - "license": "MIT", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-mdx-jsx": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz", - "integrity": "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==", - "license": "MIT", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "ccount": "^2.0.0", - "devlop": "^1.1.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0", - "parse-entities": "^4.0.0", - "stringify-entities": "^4.0.0", - "unist-util-stringify-position": "^4.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-mdxjs-esm": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", - "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", - "license": "MIT", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-phrasing": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", - "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "unist-util-is": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-hast": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz", - "integrity": "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "@ungap/structured-clone": "^1.0.0", - "devlop": "^1.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "trim-lines": "^3.0.0", - "unist-util-position": "^5.0.0", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-markdown": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", - "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "longest-streak": "^3.0.0", - "mdast-util-phrasing": "^4.0.0", - "mdast-util-to-string": "^4.0.0", - "micromark-util-classify-character": "^2.0.0", - "micromark-util-decode-string": "^2.0.0", - "unist-util-visit": "^5.0.0", - "zwitch": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", - "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/media-typer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", - "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/merge-descriptors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", - "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromark": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", - "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "@types/debug": "^4.0.0", - "debug": "^4.0.0", - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "micromark-core-commonmark": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-combine-extensions": "^2.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-encode": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-subtokenize": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-core-commonmark": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", - "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "micromark-factory-destination": "^2.0.0", - "micromark-factory-label": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-factory-title": "^2.0.0", - "micromark-factory-whitespace": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-classify-character": "^2.0.0", - "micromark-util-html-tag-name": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-subtokenize": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-destination": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", - "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-label": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", - "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-space": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", - "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-title": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", - "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-whitespace": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", - "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-character": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-chunked": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", - "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-classify-character": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", - "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-combine-extensions": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", - "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-chunked": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-decode-numeric-character-reference": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", - "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-decode-string": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", - "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "decode-named-character-reference": "^1.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-encode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", - "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-html-tag-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", - "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-normalize-identifier": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", - "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-resolve-all": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", - "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-sanitize-uri": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", - "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-encode": "^2.0.0", - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-subtokenize": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", - "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-symbol": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", - "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mini-svg-data-uri": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz", - "integrity": "sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==", - "license": "MIT", - "bin": { - "mini-svg-data-uri": "cli.js" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "devOptional": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-collect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", - "license": "ISC", - "optional": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minipass-fetch": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz", - "integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==", - "license": "MIT", - "optional": true, - "dependencies": { - "minipass": "^3.1.0", - "minipass-sized": "^1.0.3", - "minizlib": "^2.0.0" - }, - "engines": { - "node": ">=8" - }, - "optionalDependencies": { - "encoding": "^0.1.12" - } - }, - "node_modules/minipass-flush": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", - "license": "ISC", - "optional": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minipass-pipeline": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", - "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", - "license": "ISC", - "optional": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-sized": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", - "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", - "license": "ISC", - "optional": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "license": "MIT", - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "license": "MIT", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "license": "MIT" - }, - "node_modules/moment": { - "version": "2.30.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", - "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/moment-timezone": { - "version": "0.5.48", - "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.48.tgz", - "integrity": "sha512-f22b8LV1gbTO2ms2j2z13MuPogNoh5UzxL3nzNAYKGraILnbGc9NEE6dyiiiLv46DGRb8A4kg8UKWLjPthxBHw==", - "license": "MIT", - "dependencies": { - "moment": "^2.29.4" - }, - "engines": { - "node": "*" - } - }, - "node_modules/motion": { - "version": "12.23.12", - "resolved": "https://registry.npmjs.org/motion/-/motion-12.23.12.tgz", - "integrity": "sha512-8jCD8uW5GD1csOoqh1WhH1A6j5APHVE15nuBkFeRiMzYBdRwyAHmSP/oXSuW0WJPZRXTFdBoG4hY9TFWNhhwng==", - "license": "MIT", - "dependencies": { - "framer-motion": "^12.23.12", - "tslib": "^2.4.0" - }, - "peerDependencies": { - "@emotion/is-prop-valid": "*", - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "@emotion/is-prop-valid": { - "optional": true - }, - "react": { - "optional": true - }, - "react-dom": { - "optional": true - } - } - }, - "node_modules/motion-dom": { - "version": "12.23.12", - "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.23.12.tgz", - "integrity": "sha512-RcR4fvMCTESQBD/uKQe49D5RUeDOokkGRmz4ceaJKDBgHYtZtntC/s2vLvY38gqGaytinij/yi3hMcWVcEF5Kw==", - "license": "MIT", - "dependencies": { - "motion-utils": "^12.23.6" - } - }, - "node_modules/motion-utils": { - "version": "12.23.6", - "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-12.23.6.tgz", - "integrity": "sha512-eAWoPgr4eFEOFfg2WjIsMoqJTW6Z8MTUCgn/GZ3VRpClWBdnbjryiA3ZSNLyxCTmCQx4RmYX6jX1iWHbenUPNQ==", - "license": "MIT" - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "license": "MIT", - "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, - "node_modules/nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/napi-build-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz", - "integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==", - "license": "MIT" - }, - "node_modules/napi-postinstall": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.2.tgz", - "integrity": "sha512-tWVJxJHmBWLy69PvO96TZMZDrzmw5KeiZBz3RHmiM2XZ9grBJ2WgMAFVVg25nqp3ZjTFUs2Ftw1JhscL3Teliw==", - "dev": true, - "license": "MIT", - "bin": { - "napi-postinstall": "lib/cli.js" - }, - "engines": { - "node": "^12.20.0 || ^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/napi-postinstall" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true, - "license": "MIT" - }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/next": { - "version": "15.3.2", - "resolved": "https://registry.npmjs.org/next/-/next-15.3.2.tgz", - "integrity": "sha512-CA3BatMyHkxZ48sgOCLdVHjFU36N7TF1HhqAHLFOkV6buwZnvMI84Cug8xD56B9mCuKrqXnLn94417GrZ/jjCQ==", - "license": "MIT", - "dependencies": { - "@next/env": "15.3.2", - "@swc/counter": "0.1.3", - "@swc/helpers": "0.5.15", - "busboy": "1.6.0", - "caniuse-lite": "^1.0.30001579", - "postcss": "8.4.31", - "styled-jsx": "5.1.6" - }, - "bin": { - "next": "dist/bin/next" - }, - "engines": { - "node": "^18.18.0 || ^19.8.0 || >= 20.0.0" - }, - "optionalDependencies": { - "@next/swc-darwin-arm64": "15.3.2", - "@next/swc-darwin-x64": "15.3.2", - "@next/swc-linux-arm64-gnu": "15.3.2", - "@next/swc-linux-arm64-musl": "15.3.2", - "@next/swc-linux-x64-gnu": "15.3.2", - "@next/swc-linux-x64-musl": "15.3.2", - "@next/swc-win32-arm64-msvc": "15.3.2", - "@next/swc-win32-x64-msvc": "15.3.2", - "sharp": "^0.34.1" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.1.0", - "@playwright/test": "^1.41.2", - "babel-plugin-react-compiler": "*", - "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", - "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", - "sass": "^1.3.0" - }, - "peerDependenciesMeta": { - "@opentelemetry/api": { - "optional": true - }, - "@playwright/test": { - "optional": true - }, - "babel-plugin-react-compiler": { - "optional": true - }, - "sass": { - "optional": true - } - } - }, - "node_modules/next-themes": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/next-themes/-/next-themes-0.4.6.tgz", - "integrity": "sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA==", - "license": "MIT", - "peerDependencies": { - "react": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc" - } - }, - "node_modules/next/node_modules/@swc/helpers": { - "version": "0.5.15", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", - "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.8.0" - } - }, - "node_modules/next/node_modules/postcss": { - "version": "8.4.31", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", - "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/node-abi": { - "version": "3.75.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.75.0.tgz", - "integrity": "sha512-OhYaY5sDsIka7H7AtijtI9jwGYLyl29eQn/W623DiN/MIv5sUqc4g7BIDThX+gb7di9f6xK02nkp8sdfFWZLTg==", - "license": "MIT", - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-addon-api": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.5.0.tgz", - "integrity": "sha512-/bRZty2mXUIFY/xU5HLvveNHlswNJej+RnxBjOMkidWfwZzgTbPG1E3K5TOxRLOR+5hX7bSofy8yf1hZevMS8A==", - "license": "MIT", - "engines": { - "node": "^18 || ^20 || >= 21" - } - }, - "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "license": "MIT", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/node-gyp": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-8.4.1.tgz", - "integrity": "sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==", - "license": "MIT", - "optional": true, - "dependencies": { - "env-paths": "^2.2.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^9.1.0", - "nopt": "^5.0.0", - "npmlog": "^6.0.0", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.2", - "which": "^2.0.2" - }, - "bin": { - "node-gyp": "bin/node-gyp.js" - }, - "engines": { - "node": ">= 10.12.0" - } - }, - "node_modules/node-gyp-build": { - "version": "4.8.4", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", - "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", - "license": "MIT", - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" - } - }, - "node_modules/node-gyp/node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "license": "ISC", - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/node-gyp/node_modules/tar": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", - "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", - "license": "ISC", - "optional": true, - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-releases": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", - "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", - "dev": true, - "license": "MIT" - }, - "node_modules/nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "license": "ISC", - "optional": true, - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npmlog": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", - "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", - "deprecated": "This package is no longer supported.", - "license": "ISC", - "optional": true, - "dependencies": { - "are-we-there-yet": "^3.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^4.0.3", - "set-blocking": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/object-inspect": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", - "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0", - "has-symbols": "^1.1.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.entries": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", - "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.fromentries": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", - "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.groupby": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", - "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.values": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", - "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/one-time": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", - "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", - "license": "MIT", - "dependencies": { - "fn.name": "1.x.x" - } - }, - "node_modules/optionator": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", - "dev": true, - "license": "MIT", - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.5" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/own-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", - "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", - "dev": true, - "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.2.6", - "object-keys": "^1.1.1", - "safe-push-apply": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/package-json-from-dist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", - "license": "BlueOak-1.0.0" - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "license": "MIT", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-entities": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", - "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", - "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.0", - "character-entities-legacy": "^3.0.0", - "character-reference-invalid": "^2.0.0", - "decode-named-character-reference": "^1.0.0", - "is-alphanumerical": "^2.0.0", - "is-decimal": "^2.0.0", - "is-hexadecimal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/parse-entities/node_modules/@types/unist": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", - "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", - "license": "MIT" - }, - "node_modules/parse-torrent-title": { - "version": "1.3.0", - "resolved": "git+ssh://git@github.com/TheBeastLT/parse-torrent-title.git#1169487e316a4eed898dcfd900957f89a253604c", - "license": "MIT", - "dependencies": { - "moment": "^2.24.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "license": "MIT" - }, - "node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "license": "ISC" - }, - "node_modules/path-scurry/node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/path-to-regexp": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz", - "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==", - "license": "MIT", - "engines": { - "node": ">=16" - } - }, - "node_modules/pathe": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", - "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/pathval": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.1.tgz", - "integrity": "sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14.16" - } - }, - "node_modules/pg": { - "version": "8.16.3", - "resolved": "https://registry.npmjs.org/pg/-/pg-8.16.3.tgz", - "integrity": "sha512-enxc1h0jA/aq5oSDMvqyW3q89ra6XIIDZgCX9vkMrnz5DFTw/Ny3Li2lFQ+pt3L6MCgm/5o2o8HW9hiJji+xvw==", - "license": "MIT", - "dependencies": { - "pg-connection-string": "^2.9.1", - "pg-pool": "^3.10.1", - "pg-protocol": "^1.10.3", - "pg-types": "2.2.0", - "pgpass": "1.0.5" - }, - "engines": { - "node": ">= 16.0.0" - }, - "optionalDependencies": { - "pg-cloudflare": "^1.2.7" - }, - "peerDependencies": { - "pg-native": ">=3.0.1" - }, - "peerDependenciesMeta": { - "pg-native": { - "optional": true - } - } - }, - "node_modules/pg-cloudflare": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.2.7.tgz", - "integrity": "sha512-YgCtzMH0ptvZJslLM1ffsY4EuGaU0cx4XSdXLRFae8bPP4dS5xL1tNB3k2o/N64cHJpwU7dxKli/nZ2lUa5fLg==", - "license": "MIT", - "optional": true - }, - "node_modules/pg-connection-string": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.9.1.tgz", - "integrity": "sha512-nkc6NpDcvPVpZXxrreI/FOtX3XemeLl8E0qFr6F2Lrm/I8WOnaWNhIPK2Z7OHpw7gh5XJThi6j6ppgNoaT1w4w==", - "license": "MIT" - }, - "node_modules/pg-int8": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", - "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", - "license": "ISC", - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/pg-pool": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.10.1.tgz", - "integrity": "sha512-Tu8jMlcX+9d8+QVzKIvM/uJtp07PKr82IUOYEphaWcoBhIYkoHpLXN3qO59nAI11ripznDsEzEv8nUxBVWajGg==", - "license": "MIT", - "peerDependencies": { - "pg": ">=8.0" - } - }, - "node_modules/pg-protocol": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.10.3.tgz", - "integrity": "sha512-6DIBgBQaTKDJyxnXaLiLR8wBpQQcGWuAESkRBX/t6OwA8YsqP+iVSiond2EDy6Y/dsGk8rh/jtax3js5NeV7JQ==", - "license": "MIT" - }, - "node_modules/pg-types": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", - "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", - "license": "MIT", - "dependencies": { - "pg-int8": "1.0.1", - "postgres-array": "~2.0.0", - "postgres-bytea": "~1.0.0", - "postgres-date": "~1.0.4", - "postgres-interval": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pgpass": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", - "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", - "license": "MIT", - "dependencies": { - "split2": "^4.1.0" - } - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pirates": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", - "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/possible-typed-array-names": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", - "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/postcss": { - "version": "8.5.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", - "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.11", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-import": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", - "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-js": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", - "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", - "license": "MIT", - "dependencies": { - "camelcase-css": "^2.0.1" - }, - "engines": { - "node": "^12 || ^14 || >= 16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.4.21" - } - }, - "node_modules/postcss-load-config": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", - "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "lilconfig": "^3.0.0", - "yaml": "^2.3.4" - }, - "engines": { - "node": ">= 14" - }, - "peerDependencies": { - "postcss": ">=8.0.9", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "postcss": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/postcss-nested": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", - "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "postcss-selector-parser": "^6.1.1" - }, - "engines": { - "node": ">=12.0" - }, - "peerDependencies": { - "postcss": "^8.2.14" - } - }, - "node_modules/postcss-nested/node_modules/postcss-selector-parser": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", - "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-nesting": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-13.0.2.tgz", - "integrity": "sha512-1YCI290TX+VP0U/K/aFxzHzQWHWURL+CtHMSbex1lCdpXD1SoR2sYuxDu5aNI9lPoXpKTCggFZiDJbwylU0LEQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/selector-resolve-nested": "^3.1.0", - "@csstools/selector-specificity": "^5.0.0", - "postcss-selector-parser": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-nesting/node_modules/@csstools/selector-resolve-nested": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@csstools/selector-resolve-nested/-/selector-resolve-nested-3.1.0.tgz", - "integrity": "sha512-mf1LEW0tJLKfWyvn5KdDrhpxHyuxpbNwTIwOYLIvsTffeyOf85j5oIzfG0yosxDgx/sswlqBnESYUcQH0vgZ0g==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss-selector-parser": "^7.0.0" - } - }, - "node_modules/postcss-nesting/node_modules/@csstools/selector-specificity": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", - "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss-selector-parser": "^7.0.0" - } - }, - "node_modules/postcss-nesting/node_modules/postcss-selector-parser": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", - "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.0.10", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", - "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "license": "MIT" - }, - "node_modules/postgres-array": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", - "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/postgres-bytea": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", - "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postgres-date": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", - "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postgres-interval": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", - "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", - "license": "MIT", - "dependencies": { - "xtend": "^4.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/prebuild-install": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz", - "integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==", - "license": "MIT", - "dependencies": { - "detect-libc": "^2.0.0", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.3", - "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^2.0.0", - "node-abi": "^3.3.0", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^4.0.0", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0" - }, - "bin": { - "prebuild-install": "bin.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prettier": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz", - "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==", - "dev": true, - "license": "MIT", - "bin": { - "prettier": "bin/prettier.cjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", - "license": "ISC", - "optional": true - }, - "node_modules/promise-retry": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", - "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", - "license": "MIT", - "optional": true, - "dependencies": { - "err-code": "^2.0.2", - "retry": "^0.12.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dev": true, - "license": "MIT", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/property-information": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", - "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "license": "MIT", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/proxy-compare": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/proxy-compare/-/proxy-compare-3.0.1.tgz", - "integrity": "sha512-V9plBAt3qjMlS1+nC8771KNf6oJ12gExvaxnNzN/9yVRLdTv/lc+oJlnSzrdYDAvBfTStPCoiaCOTmTs0adv7Q==", - "license": "MIT" - }, - "node_modules/pump": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", - "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", - "license": "MIT", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/qs": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/rate-limit-redis": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/rate-limit-redis/-/rate-limit-redis-4.2.2.tgz", - "integrity": "sha512-0SGzpSCZQgkJuUK5AqGaUkgwTMaujWIek0PwlZBDsdNIcasrJae8AC47tP5UHayqDcocJxtogL6DnZFTLoruUw==", - "license": "MIT", - "engines": { - "node": ">= 16" - }, - "peerDependencies": { - "express-rate-limit": ">= 6" - } - }, - "node_modules/raw-body": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.0.tgz", - "integrity": "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==", - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.6.3", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/rc/node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react": { - "version": "19.1.1", - "resolved": "https://registry.npmjs.org/react/-/react-19.1.1.tgz", - "integrity": "sha512-w8nqGImo45dmMIfljjMwOGtbmC/mk4CMYhWIicdSflH91J9TyCyczcPFXJzrZ/ZXcgGRFeP6BU0BEJTw6tZdfQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-dom": { - "version": "19.1.1", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.1.tgz", - "integrity": "sha512-Dlq/5LAZgF0Gaz6yiqZCf6VCcZs1ghAJyrsu84Q/GT0gV+mCxbfmKNoGRKBYMJ8IEdGPqu49YWXD02GCknEDkw==", - "license": "MIT", - "dependencies": { - "scheduler": "^0.26.0" - }, - "peerDependencies": { - "react": "^19.1.1" - } - }, - "node_modules/react-icons": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.5.0.tgz", - "integrity": "sha512-MEFcXdkP3dLo8uumGI5xN3lDFNsRtrjbOEKDLD7yv76v4wpnEq2Lt2qeHaQOr34I/wPN3s3+N08WkQ+CW37Xiw==", - "license": "MIT", - "peerDependencies": { - "react": "*" - } - }, - "node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/react-markdown": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-10.1.0.tgz", - "integrity": "sha512-qKxVopLT/TyA6BX3Ue5NwabOsAzm0Q7kAPwq6L+wWDwisYs7R8vZ0nRXqq6rkueboxpkjvLGU9fWifiX/ZZFxQ==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "hast-util-to-jsx-runtime": "^2.0.0", - "html-url-attributes": "^3.0.0", - "mdast-util-to-hast": "^13.0.0", - "remark-parse": "^11.0.0", - "remark-rehype": "^11.0.0", - "unified": "^11.0.0", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - }, - "peerDependencies": { - "@types/react": ">=18", - "react": ">=18" - } - }, - "node_modules/react-remove-scroll": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.1.tgz", - "integrity": "sha512-HpMh8+oahmIdOuS5aFKKY6Pyog+FNaZV/XyJOq7b4YFwsFHe5yYfdbIalI4k3vU2nSDql7YskmUseHsRrJqIPA==", - "license": "MIT", - "dependencies": { - "react-remove-scroll-bar": "^2.3.7", - "react-style-singleton": "^2.2.3", - "tslib": "^2.1.0", - "use-callback-ref": "^1.3.3", - "use-sidecar": "^1.1.3" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/react-remove-scroll-bar": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz", - "integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==", - "license": "MIT", - "dependencies": { - "react-style-singleton": "^2.2.2", - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/react-style-singleton": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz", - "integrity": "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==", - "license": "MIT", - "dependencies": { - "get-nonce": "^1.0.0", - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "license": "MIT", - "dependencies": { - "pify": "^2.3.0" - } - }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/redis": { - "version": "5.8.2", - "resolved": "https://registry.npmjs.org/redis/-/redis-5.8.2.tgz", - "integrity": "sha512-31vunZj07++Y1vcFGcnNWEf5jPoTkGARgfWI4+Tk55vdwHxhAvug8VEtW7Cx+/h47NuJTEg/JL77zAwC6E0OeA==", - "license": "MIT", - "dependencies": { - "@redis/bloom": "5.8.2", - "@redis/client": "5.8.2", - "@redis/json": "5.8.2", - "@redis/search": "5.8.2", - "@redis/time-series": "5.8.2" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/reflect.getprototypeof": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", - "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.9", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.7", - "get-proto": "^1.0.1", - "which-builtin-type": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", - "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-errors": "^1.3.0", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "set-function-name": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/remark-parse": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", - "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-from-markdown": "^2.0.0", - "micromark-util-types": "^2.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-rehype": { - "version": "11.1.2", - "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz", - "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "mdast-util-to-hast": "^13.0.0", - "unified": "^11.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/resolve": { - "version": "1.22.10", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", - "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", - "license": "MIT", - "dependencies": { - "is-core-module": "^2.16.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/resolve-pkg-maps": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" - } - }, - "node_modules/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/reusify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "license": "ISC", - "optional": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rollup": { - "version": "4.46.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.46.2.tgz", - "integrity": "sha512-WMmLFI+Boh6xbop+OAGo9cQ3OgX9MIg7xOQjn+pTCwOkk+FNDAeAemXkJ3HzDJrVXleLOFVa1ipuc1AmEx1Dwg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "1.0.8" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.46.2", - "@rollup/rollup-android-arm64": "4.46.2", - "@rollup/rollup-darwin-arm64": "4.46.2", - "@rollup/rollup-darwin-x64": "4.46.2", - "@rollup/rollup-freebsd-arm64": "4.46.2", - "@rollup/rollup-freebsd-x64": "4.46.2", - "@rollup/rollup-linux-arm-gnueabihf": "4.46.2", - "@rollup/rollup-linux-arm-musleabihf": "4.46.2", - "@rollup/rollup-linux-arm64-gnu": "4.46.2", - "@rollup/rollup-linux-arm64-musl": "4.46.2", - "@rollup/rollup-linux-loongarch64-gnu": "4.46.2", - "@rollup/rollup-linux-ppc64-gnu": "4.46.2", - "@rollup/rollup-linux-riscv64-gnu": "4.46.2", - "@rollup/rollup-linux-riscv64-musl": "4.46.2", - "@rollup/rollup-linux-s390x-gnu": "4.46.2", - "@rollup/rollup-linux-x64-gnu": "4.46.2", - "@rollup/rollup-linux-x64-musl": "4.46.2", - "@rollup/rollup-win32-arm64-msvc": "4.46.2", - "@rollup/rollup-win32-ia32-msvc": "4.46.2", - "@rollup/rollup-win32-x64-msvc": "4.46.2", - "fsevents": "~2.3.2" - } - }, - "node_modules/router": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", - "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", - "license": "MIT", - "dependencies": { - "debug": "^4.4.0", - "depd": "^2.0.0", - "is-promise": "^4.0.0", - "parseurl": "^1.3.3", - "path-to-regexp": "^8.0.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/safe-array-concat": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", - "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "get-intrinsic": "^1.2.6", - "has-symbols": "^1.1.0", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">=0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/safe-push-apply": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", - "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-regex-test": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", - "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "is-regex": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-stable-stringify": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", - "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "license": "MIT" - }, - "node_modules/scheduler": { - "version": "0.26.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", - "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==", - "license": "MIT" - }, - "node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/send": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", - "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", - "license": "MIT", - "dependencies": { - "debug": "^4.3.5", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "etag": "^1.8.1", - "fresh": "^2.0.0", - "http-errors": "^2.0.0", - "mime-types": "^3.0.1", - "ms": "^2.1.3", - "on-finished": "^2.4.1", - "range-parser": "^1.2.1", - "statuses": "^2.0.1" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/send/node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/send/node_modules/mime-types": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", - "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", - "license": "MIT", - "dependencies": { - "mime-db": "^1.54.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-static": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", - "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", - "license": "MIT", - "dependencies": { - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "parseurl": "^1.3.3", - "send": "^1.2.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "license": "ISC", - "optional": true - }, - "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/set-function-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", - "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/set-proto": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", - "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", - "dev": true, - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "license": "ISC" - }, - "node_modules/sharp": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.3.tgz", - "integrity": "sha512-eX2IQ6nFohW4DbvHIOLRB3MHFpYqaqvXd3Tp5e/T/dSH83fxaNJQRvDMhASmkNTsNTVF2/OOopzRCt7xokgPfg==", - "hasInstallScript": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "color": "^4.2.3", - "detect-libc": "^2.0.4", - "semver": "^7.7.2" - }, - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-darwin-arm64": "0.34.3", - "@img/sharp-darwin-x64": "0.34.3", - "@img/sharp-libvips-darwin-arm64": "1.2.0", - "@img/sharp-libvips-darwin-x64": "1.2.0", - "@img/sharp-libvips-linux-arm": "1.2.0", - "@img/sharp-libvips-linux-arm64": "1.2.0", - "@img/sharp-libvips-linux-ppc64": "1.2.0", - "@img/sharp-libvips-linux-s390x": "1.2.0", - "@img/sharp-libvips-linux-x64": "1.2.0", - "@img/sharp-libvips-linuxmusl-arm64": "1.2.0", - "@img/sharp-libvips-linuxmusl-x64": "1.2.0", - "@img/sharp-linux-arm": "0.34.3", - "@img/sharp-linux-arm64": "0.34.3", - "@img/sharp-linux-ppc64": "0.34.3", - "@img/sharp-linux-s390x": "0.34.3", - "@img/sharp-linux-x64": "0.34.3", - "@img/sharp-linuxmusl-arm64": "0.34.3", - "@img/sharp-linuxmusl-x64": "0.34.3", - "@img/sharp-wasm32": "0.34.3", - "@img/sharp-win32-arm64": "0.34.3", - "@img/sharp-win32-ia32": "0.34.3", - "@img/sharp-win32-x64": "0.34.3" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/side-channel": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-weakmap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/siginfo": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", - "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", - "dev": true, - "license": "ISC" - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "license": "ISC", - "optional": true - }, - "node_modules/simple-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/simple-get": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", - "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "decompress-response": "^6.0.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, - "node_modules/simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.3.1" - } - }, - "node_modules/smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "license": "MIT", - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks": { - "version": "2.8.6", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.6.tgz", - "integrity": "sha512-pe4Y2yzru68lXCb38aAqRf5gvN8YdjP1lok5o0J7BOHljkyCGKVz7H3vpVIXKD27rj2giOJ7DwVyk/GWrPHDWA==", - "license": "MIT", - "dependencies": { - "ip-address": "^9.0.5", - "smart-buffer": "^4.2.0" - }, - "engines": { - "node": ">= 10.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks-proxy-agent": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz", - "integrity": "sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.2" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/sonner": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/sonner/-/sonner-2.0.5.tgz", - "integrity": "sha512-YwbHQO6cSso3HBXlbCkgrgzDNIhws14r4MO87Ofy+cV2X7ES4pOoAK3+veSmVTvqNx1BWUxlhPmZzP00Crk2aQ==", - "license": "MIT", - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0 || ^19.0.0-rc", - "react-dom": "^18.0.0 || ^19.0.0 || ^19.0.0-rc" - } - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/space-separated-tokens": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", - "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/split2": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", - "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", - "license": "ISC", - "engines": { - "node": ">= 10.x" - } - }, - "node_modules/sprintf-js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", - "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", - "license": "BSD-3-Clause" - }, - "node_modules/sqlite": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/sqlite/-/sqlite-5.1.1.tgz", - "integrity": "sha512-oBkezXa2hnkfuJwUo44Hl9hS3er+YFtueifoajrgidvqsJRQFpc5fKoAkAor1O5ZnLoa28GBScfHXs8j0K358Q==", - "license": "MIT" - }, - "node_modules/sqlite3": { - "version": "5.1.7", - "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-5.1.7.tgz", - "integrity": "sha512-GGIyOiFaG+TUra3JIfkI/zGP8yZYLPQ0pl1bH+ODjiX57sPhrLU5sQJn1y9bDKZUFYkX1crlrPfSYt0BKKdkog==", - "hasInstallScript": true, - "license": "BSD-3-Clause", - "dependencies": { - "bindings": "^1.5.0", - "node-addon-api": "^7.0.0", - "prebuild-install": "^7.1.1", - "tar": "^6.1.11" - }, - "optionalDependencies": { - "node-gyp": "8.x" - }, - "peerDependencies": { - "node-gyp": "8.x" - }, - "peerDependenciesMeta": { - "node-gyp": { - "optional": true - } - } - }, - "node_modules/sqlite3/node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "license": "ISC", - "engines": { - "node": ">=8" - } - }, - "node_modules/sqlite3/node_modules/node-addon-api": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", - "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", - "license": "MIT" - }, - "node_modules/sqlite3/node_modules/tar": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", - "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", - "license": "ISC", - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/ssri": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", - "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", - "license": "ISC", - "optional": true, - "dependencies": { - "minipass": "^3.1.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/stable-hash": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.5.tgz", - "integrity": "sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==", - "dev": true, - "license": "MIT" - }, - "node_modules/stack-trace": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/stackback": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", - "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", - "dev": true, - "license": "MIT" - }, - "node_modules/statuses": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", - "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/std-env": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.9.0.tgz", - "integrity": "sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==", - "dev": true, - "license": "MIT" - }, - "node_modules/stop-iteration-iterator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", - "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "internal-slot": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/streamsearch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", - "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/stremthru": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/stremthru/-/stremthru-0.8.0.tgz", - "integrity": "sha512-Bv17o2mmj3B7NMaJEPYlMYiSgWChGx5FkjYzlaLqwTv8RFeP2wIWwKCHGjLYhDn1EsTvmnv7vh+rdQT/6MxavQ==", - "license": "MIT", - "dependencies": { - "@types/node-fetch": "^2.6.11", - "node-fetch": "release-2.x" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" - }, - "node_modules/string-width/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" - }, - "node_modules/string.prototype.includes": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz", - "integrity": "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.3" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/string.prototype.matchall": { - "version": "4.0.12", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", - "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.6", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.6", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "internal-slot": "^1.1.0", - "regexp.prototype.flags": "^1.5.3", - "set-function-name": "^2.0.2", - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.repeat": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", - "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - } - }, - "node_modules/string.prototype.trim": { - "version": "1.2.10", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", - "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "define-data-property": "^1.1.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-object-atoms": "^1.0.0", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", - "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", - "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/stringify-entities": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", - "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", - "license": "MIT", - "dependencies": { - "character-entities-html4": "^2.0.0", - "character-entities-legacy": "^3.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/style-to-js": { - "version": "1.1.17", - "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.17.tgz", - "integrity": "sha512-xQcBGDxJb6jjFCTzvQtfiPn6YvvP2O8U1MDIPNfJQlWMYfktPy+iGsHE7cssjs7y84d9fQaK4UF3RIJaAHSoYA==", - "license": "MIT", - "dependencies": { - "style-to-object": "1.0.9" - } - }, - "node_modules/style-to-object": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.9.tgz", - "integrity": "sha512-G4qppLgKu/k6FwRpHiGiKPaPTFcG3g4wNVX/Qsfu+RqQM30E7Tyu/TEgxcL9PNLF5pdRLwQdE3YKKf+KF2Dzlw==", - "license": "MIT", - "dependencies": { - "inline-style-parser": "0.2.4" - } - }, - "node_modules/styled-jsx": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.6.tgz", - "integrity": "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==", - "license": "MIT", - "dependencies": { - "client-only": "0.0.1" - }, - "engines": { - "node": ">= 12.0.0" - }, - "peerDependencies": { - "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" - }, - "peerDependenciesMeta": { - "@babel/core": { - "optional": true - }, - "babel-plugin-macros": { - "optional": true - } - } - }, - "node_modules/sucrase": { - "version": "3.35.0", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", - "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.2", - "commander": "^4.0.0", - "glob": "^10.3.10", - "lines-and-columns": "^1.1.6", - "mz": "^2.7.0", - "pirates": "^4.0.1", - "ts-interface-checker": "^0.1.9" - }, - "bin": { - "sucrase": "bin/sucrase", - "sucrase-node": "bin/sucrase-node" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/sucrase/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/sucrase/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/sucrase/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/sucrase/node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/super-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/super-regex/-/super-regex-1.0.0.tgz", - "integrity": "sha512-CY8u7DtbvucKuquCmOFEKhr9Besln7n9uN8eFbwcoGYWXOMW07u2o8njWaiXt11ylS3qoGF55pILjRmPlbodyg==", - "license": "MIT", - "dependencies": { - "function-timeout": "^1.0.1", - "time-span": "^5.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/tabbable": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz", - "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==", - "license": "MIT" - }, - "node_modules/tailwind-scrollbar-hide": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/tailwind-scrollbar-hide/-/tailwind-scrollbar-hide-1.1.7.tgz", - "integrity": "sha512-X324n9OtpTmOMqEgDUEA/RgLrNfBF/jwJdctaPZDzB3mppxJk7TLIDmOreEDm1Bq4R9LSPu4Epf8VSdovNU+iA==", - "license": "MIT" - }, - "node_modules/tailwindcss": { - "version": "3.4.17", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.17.tgz", - "integrity": "sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==", - "license": "MIT", - "dependencies": { - "@alloc/quick-lru": "^5.2.0", - "arg": "^5.0.2", - "chokidar": "^3.6.0", - "didyoumean": "^1.2.2", - "dlv": "^1.1.3", - "fast-glob": "^3.3.2", - "glob-parent": "^6.0.2", - "is-glob": "^4.0.3", - "jiti": "^1.21.6", - "lilconfig": "^3.1.3", - "micromatch": "^4.0.8", - "normalize-path": "^3.0.0", - "object-hash": "^3.0.0", - "picocolors": "^1.1.1", - "postcss": "^8.4.47", - "postcss-import": "^15.1.0", - "postcss-js": "^4.0.1", - "postcss-load-config": "^4.0.2", - "postcss-nested": "^6.2.0", - "postcss-selector-parser": "^6.1.2", - "resolve": "^1.22.8", - "sucrase": "^3.35.0" - }, - "bin": { - "tailwind": "lib/cli.js", - "tailwindcss": "lib/cli.js" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tailwindcss-animate": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/tailwindcss-animate/-/tailwindcss-animate-1.0.7.tgz", - "integrity": "sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==", - "license": "MIT", - "peerDependencies": { - "tailwindcss": ">=3.0.0 || insiders" - } - }, - "node_modules/tailwindcss/node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/tailwindcss/node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/tailwindcss/node_modules/jiti": { - "version": "1.21.7", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", - "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", - "license": "MIT", - "bin": { - "jiti": "bin/jiti.js" - } - }, - "node_modules/tailwindcss/node_modules/postcss-selector-parser": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", - "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/tapable": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.2.tgz", - "integrity": "sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/tar": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", - "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", - "dev": true, - "license": "ISC", - "dependencies": { - "@isaacs/fs-minipass": "^4.0.0", - "chownr": "^3.0.0", - "minipass": "^7.1.2", - "minizlib": "^3.0.1", - "mkdirp": "^3.0.1", - "yallist": "^5.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/tar-fs": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.3.tgz", - "integrity": "sha512-090nwYJDmlhwFwEW3QQl+vaNnxsO2yVsd45eTKRBzSzu+hlb1w2K9inVq5b0ngXuLVqQ4ApvsUHHnu/zQNkWAg==", - "license": "MIT", - "dependencies": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - } - }, - "node_modules/tar-fs/node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "license": "ISC" - }, - "node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "license": "MIT", - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tar/node_modules/chownr": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", - "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=18" - } - }, - "node_modules/tar/node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/tar/node_modules/minizlib": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.2.tgz", - "integrity": "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==", - "dev": true, - "license": "MIT", - "dependencies": { - "minipass": "^7.1.2" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/tar/node_modules/mkdirp": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", - "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", - "dev": true, - "license": "MIT", - "bin": { - "mkdirp": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/tar/node_modules/yallist": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", - "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=18" - } - }, - "node_modules/text-hex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", - "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==", - "license": "MIT" - }, - "node_modules/thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "license": "MIT", - "dependencies": { - "any-promise": "^1.0.0" - } - }, - "node_modules/thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", - "license": "MIT", - "dependencies": { - "thenify": ">= 3.1.0 < 4" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/time-span": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/time-span/-/time-span-5.1.0.tgz", - "integrity": "sha512-75voc/9G4rDIJleOo4jPvN4/YC4GRZrY8yy1uU4lwrB3XEQbWve8zXoO5No4eFrGcTAMYyoY67p8jRQdtA1HbA==", - "license": "MIT", - "dependencies": { - "convert-hrtime": "^5.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/tinybench": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", - "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", - "dev": true, - "license": "MIT" - }, - "node_modules/tinyexec": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", - "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", - "dev": true, - "license": "MIT" - }, - "node_modules/tinyglobby": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", - "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "fdir": "^6.4.4", - "picomatch": "^4.0.2" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "node_modules/tinyglobby/node_modules/fdir": { - "version": "6.4.6", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz", - "integrity": "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/tinypool": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz", - "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.0.0 || >=20.0.0" - } - }, - "node_modules/tinyrainbow": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-1.2.0.tgz", - "integrity": "sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tinyspy": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz", - "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "license": "MIT", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "license": "MIT" - }, - "node_modules/trim-lines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", - "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/triple-beam": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz", - "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==", - "license": "MIT", - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/trough": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", - "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/ts-api-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", - "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18.12" - }, - "peerDependencies": { - "typescript": ">=4.8.4" - } - }, - "node_modules/ts-interface-checker": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", - "license": "Apache-2.0" - }, - "node_modules/ts-node": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", - "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } - } - }, - "node_modules/ts-node/node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/tsconfig-paths": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", - "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - } - }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" - }, - "node_modules/tsx": { - "version": "4.20.3", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.20.3.tgz", - "integrity": "sha512-qjbnuR9Tr+FJOMBqJCW5ehvIo/buZq7vH7qD7JziU98h6l3qGy0a/yPFjwO+y0/T7GFpNgNAvEcPPVfyT8rrPQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "~0.25.0", - "get-tsconfig": "^4.7.5" - }, - "bin": { - "tsx": "dist/cli.mjs" - }, - "engines": { - "node": ">=18.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - } - }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "license": "Apache-2.0", - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-is": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", - "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", - "license": "MIT", - "dependencies": { - "content-type": "^1.0.5", - "media-typer": "^1.1.0", - "mime-types": "^3.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/type-is/node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/type-is/node_modules/mime-types": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", - "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", - "license": "MIT", - "dependencies": { - "mime-db": "^1.54.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/typed-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", - "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/typed-array-byte-length": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", - "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "for-each": "^0.3.3", - "gopd": "^1.2.0", - "has-proto": "^1.2.0", - "is-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-byte-offset": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", - "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "for-each": "^0.3.3", - "gopd": "^1.2.0", - "has-proto": "^1.2.0", - "is-typed-array": "^1.1.15", - "reflect.getprototypeof": "^1.0.9" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-length": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", - "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0", - "reflect.getprototypeof": "^1.0.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typescript": { - "version": "5.9.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz", - "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==", - "devOptional": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/unbox-primitive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", - "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "has-bigints": "^1.0.2", - "has-symbols": "^1.1.0", - "which-boxed-primitive": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/undici": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.13.0.tgz", - "integrity": "sha512-l+zSMssRqrzDcb3fjMkjjLGmuiiK2pMIcV++mJaAc9vhjSGpvM7h43QgP+OAMb1GImHmbPyG2tBXeuyG5iY4gA==", - "license": "MIT", - "engines": { - "node": ">=20.18.1" - } - }, - "node_modules/undici-types": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.10.0.tgz", - "integrity": "sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==", - "license": "MIT" - }, - "node_modules/unified": { - "version": "11.0.5", - "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", - "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "bail": "^2.0.0", - "devlop": "^1.0.0", - "extend": "^3.0.0", - "is-plain-obj": "^4.0.0", - "trough": "^2.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", - "license": "ISC", - "optional": true, - "dependencies": { - "unique-slug": "^2.0.0" - } - }, - "node_modules/unique-slug": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", - "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", - "license": "ISC", - "optional": true, - "dependencies": { - "imurmurhash": "^0.1.4" - } - }, - "node_modules/unist-util-is": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", - "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-position": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", - "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-stringify-position": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", - "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", - "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0", - "unist-util-visit-parents": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit-parents": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", - "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/unrs-resolver": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.11.1.tgz", - "integrity": "sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "napi-postinstall": "^0.3.0" - }, - "funding": { - "url": "https://opencollective.com/unrs-resolver" - }, - "optionalDependencies": { - "@unrs/resolver-binding-android-arm-eabi": "1.11.1", - "@unrs/resolver-binding-android-arm64": "1.11.1", - "@unrs/resolver-binding-darwin-arm64": "1.11.1", - "@unrs/resolver-binding-darwin-x64": "1.11.1", - "@unrs/resolver-binding-freebsd-x64": "1.11.1", - "@unrs/resolver-binding-linux-arm-gnueabihf": "1.11.1", - "@unrs/resolver-binding-linux-arm-musleabihf": "1.11.1", - "@unrs/resolver-binding-linux-arm64-gnu": "1.11.1", - "@unrs/resolver-binding-linux-arm64-musl": "1.11.1", - "@unrs/resolver-binding-linux-ppc64-gnu": "1.11.1", - "@unrs/resolver-binding-linux-riscv64-gnu": "1.11.1", - "@unrs/resolver-binding-linux-riscv64-musl": "1.11.1", - "@unrs/resolver-binding-linux-s390x-gnu": "1.11.1", - "@unrs/resolver-binding-linux-x64-gnu": "1.11.1", - "@unrs/resolver-binding-linux-x64-musl": "1.11.1", - "@unrs/resolver-binding-wasm32-wasi": "1.11.1", - "@unrs/resolver-binding-win32-arm64-msvc": "1.11.1", - "@unrs/resolver-binding-win32-ia32-msvc": "1.11.1", - "@unrs/resolver-binding-win32-x64-msvc": "1.11.1" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", - "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/use-callback-ref": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz", - "integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==", - "license": "MIT", - "dependencies": { - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/use-sidecar": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz", - "integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==", - "license": "MIT", - "dependencies": { - "detect-node-es": "^1.1.0", - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/use-sync-external-store": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.5.0.tgz", - "integrity": "sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==", - "license": "MIT", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "license": "MIT" - }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/vfile": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", - "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vfile-message": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", - "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-stringify-position": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vite": { - "version": "5.4.19", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.19.tgz", - "integrity": "sha512-qO3aKv3HoQC8QKiNSTuUM1l9o/XX3+c+VTgLHbJWHZGeTPVAg2XwazI9UWzoxjIJCGCV2zU60uqMzjeLZuULqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "^0.21.3", - "postcss": "^8.4.43", - "rollup": "^4.20.0" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } - } - }, - "node_modules/vite-node": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.1.9.tgz", - "integrity": "sha512-AM9aQ/IPrW/6ENLQg3AGY4K1N2TGZdR5e4gu/MmmR2xR3Ll1+dib+nook92g4TV3PXVyeyxdWwtaCAiUL0hMxA==", - "dev": true, - "license": "MIT", - "dependencies": { - "cac": "^6.7.14", - "debug": "^4.3.7", - "es-module-lexer": "^1.5.4", - "pathe": "^1.1.2", - "vite": "^5.0.0" - }, - "bin": { - "vite-node": "vite-node.mjs" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/vite/node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/esbuild": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" - } - }, - "node_modules/vitest": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.1.9.tgz", - "integrity": "sha512-MSmPM9REYqDGBI8439mA4mWhV5sKmDlBKWIYbA3lRb2PTHACE0mgKwA8yQ2xq9vxDTuk4iPrECBAEW2aoFXY0Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/expect": "2.1.9", - "@vitest/mocker": "2.1.9", - "@vitest/pretty-format": "^2.1.9", - "@vitest/runner": "2.1.9", - "@vitest/snapshot": "2.1.9", - "@vitest/spy": "2.1.9", - "@vitest/utils": "2.1.9", - "chai": "^5.1.2", - "debug": "^4.3.7", - "expect-type": "^1.1.0", - "magic-string": "^0.30.12", - "pathe": "^1.1.2", - "std-env": "^3.8.0", - "tinybench": "^2.9.0", - "tinyexec": "^0.3.1", - "tinypool": "^1.0.1", - "tinyrainbow": "^1.2.0", - "vite": "^5.0.0", - "vite-node": "2.1.9", - "why-is-node-running": "^2.3.0" - }, - "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@types/node": "^18.0.0 || >=20.0.0", - "@vitest/browser": "2.1.9", - "@vitest/ui": "2.1.9", - "happy-dom": "*", - "jsdom": "*" - }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@vitest/browser": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - } - } - }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "license": "BSD-2-Clause" - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "license": "MIT", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-boxed-primitive": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", - "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-bigint": "^1.1.0", - "is-boolean-object": "^1.2.1", - "is-number-object": "^1.1.1", - "is-string": "^1.1.1", - "is-symbol": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-builtin-type": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", - "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "function.prototype.name": "^1.1.6", - "has-tostringtag": "^1.0.2", - "is-async-function": "^2.0.0", - "is-date-object": "^1.1.0", - "is-finalizationregistry": "^1.1.0", - "is-generator-function": "^1.0.10", - "is-regex": "^1.2.1", - "is-weakref": "^1.0.2", - "isarray": "^2.0.5", - "which-boxed-primitive": "^1.1.0", - "which-collection": "^1.0.2", - "which-typed-array": "^1.1.16" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-collection": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", - "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-map": "^2.0.3", - "is-set": "^2.0.3", - "is-weakmap": "^2.0.2", - "is-weakset": "^2.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-typed-array": { - "version": "1.1.19", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", - "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", - "dev": true, - "license": "MIT", - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "for-each": "^0.3.5", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/why-is-node-running": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", - "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", - "dev": true, - "license": "MIT", - "dependencies": { - "siginfo": "^2.0.0", - "stackback": "0.0.2" - }, - "bin": { - "why-is-node-running": "cli.js" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wide-align": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "license": "ISC", - "optional": true, - "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, - "node_modules/winston": { - "version": "3.17.0", - "resolved": "https://registry.npmjs.org/winston/-/winston-3.17.0.tgz", - "integrity": "sha512-DLiFIXYC5fMPxaRg832S6F5mJYvePtmO5G9v9IgUFPhXm9/GkXarH/TUrBAVzhTCzAj9anE/+GjrgXp/54nOgw==", - "license": "MIT", - "dependencies": { - "@colors/colors": "^1.6.0", - "@dabh/diagnostics": "^2.0.2", - "async": "^3.2.3", - "is-stream": "^2.0.0", - "logform": "^2.7.0", - "one-time": "^1.0.0", - "readable-stream": "^3.4.0", - "safe-stable-stringify": "^2.3.1", - "stack-trace": "0.0.x", - "triple-beam": "^1.3.0", - "winston-transport": "^4.9.0" - }, - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/winston-transport": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.9.0.tgz", - "integrity": "sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==", - "license": "MIT", - "dependencies": { - "logform": "^2.7.0", - "readable-stream": "^3.6.2", - "triple-beam": "^1.3.0" - }, - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "license": "ISC" - }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "license": "MIT", - "engines": { - "node": ">=0.4" - } - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "license": "ISC" - }, - "node_modules/yaml": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz", - "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==", - "license": "ISC", - "bin": { - "yaml": "bin.mjs" - }, - "engines": { - "node": ">= 14.6" - } - }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/zod": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.5.tgz", - "integrity": "sha512-rcUUZqlLJgBC33IT3PNMgsCq6TzLQEG/Ei/KTCU0PedSWRMAXoOUN+4t/0H+Q8bdnLPdqUYnvboJT0bn/229qg==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - }, - "node_modules/zwitch": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", - "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "packages/core": { - "name": "@aiostreams/core", - "version": "0.0.0", - "dependencies": { - "@torbox/torbox-api": "github:viren070/torbox-sdk-js#dist", - "bcrypt": "^6.0.0", - "bytes": "^3.1.2", - "dotenv": "^16.4.7", - "envalid": "^8.0.0", - "expr-eval": "^2.0.2", - "fetch-socks": "^1.3.2", - "moment-timezone": "^0.5.48", - "parse-torrent-title": "github:TheBeastLT/parse-torrent-title", - "pg": "^8.16.0", - "redis": "^5.8.2", - "sqlite": "^5.1.1", - "sqlite3": "^5.1.7", - "stremthru": "^0.8.0", - "super-regex": "^1.0.0", - "undici": "^7.2.3", - "winston": "^3.17.0", - "zod": "^4.1.5" - }, - "devDependencies": { - "@types/bcrypt": "^5.0.2", - "@types/bytes": "^3.1.5", - "@types/node": "^20.14.10", - "@types/pg": "^8.15.2" - } - }, - "packages/core/node_modules/@types/node": { - "version": "20.19.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.10.tgz", - "integrity": "sha512-iAFpG6DokED3roLSP0K+ybeDdIX6Bc0Vd3mLW5uDqThPWtNos3E+EqOM11mPQHKzfWHqEBuLjIlsBQQ8CsISmQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~6.21.0" - } - }, - "packages/core/node_modules/undici-types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", - "dev": true, - "license": "MIT" - }, - "packages/frontend": { - "name": "@aiostreams/frontend", - "version": "0.0.0", - "dependencies": { - "@aiostreams/core": "^0.0.0", - "@dnd-kit/core": "^6.3.1", - "@dnd-kit/modifiers": "^9.0.0", - "@dnd-kit/sortable": "^10.0.0", - "@headlessui/react": "^2.2.4", - "@headlessui/tailwindcss": "^0.2.2", - "@radix-ui/react-accordion": "^1.2.11", - "@radix-ui/react-dialog": "^1.1.14", - "@radix-ui/react-dropdown-menu": "^2.1.15", - "@radix-ui/react-password-toggle-field": "^0.1.2", - "@radix-ui/react-popover": "^1.1.14", - "@radix-ui/react-select": "^2.2.5", - "@radix-ui/react-separator": "^1.1.7", - "@radix-ui/react-slider": "^1.3.5", - "@radix-ui/react-switch": "^1.2.5", - "@radix-ui/react-tabs": "^1.1.12", - "@radix-ui/react-tooltip": "^1.2.7", - "@tailwindcss/forms": "^0.5.10", - "@tailwindcss/typography": "^0.5.16", - "@zag-js/number-input": "^1.13.1", - "@zag-js/react": "^1.13.1", - "class-variance-authority": "^0.7.1", - "clsx": "^2.1.1", - "cmdk": "^1.1.1", - "lucide-react": "^0.511.0", - "motion": "^12.23.9", - "next": "15.3.2", - "next-themes": "^0.4.6", - "react": "^19.0.0", - "react-dom": "^19.0.0", - "react-icons": "^5.5.0", - "react-markdown": "^10.1.0", - "sonner": "2.0.5", - "tailwind-merge": "~2.6.0", - "tailwind-scrollbar-hide": "~1.1.7", - "tailwindcss-animate": "~1.0.7" - }, - "devDependencies": { - "@eslint/eslintrc": "^3", - "@tailwindcss/postcss": "^4", - "@types/node": "^20", - "@types/react": "^19", - "@types/react-dom": "^19", - "autoprefixer": "^10.4.21", - "eslint": "^9", - "eslint-config-next": "15.3.2", - "postcss": "^8.5.3", - "postcss-import": "^16.1.0", - "postcss-nesting": "^13.0.1", - "tailwindcss": "^3.4.17", - "typescript": "^5" - } - }, - "packages/frontend/node_modules/@types/node": { - "version": "20.19.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.10.tgz", - "integrity": "sha512-iAFpG6DokED3roLSP0K+ybeDdIX6Bc0Vd3mLW5uDqThPWtNos3E+EqOM11mPQHKzfWHqEBuLjIlsBQQ8CsISmQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~6.21.0" - } - }, - "packages/frontend/node_modules/postcss-import": { - "version": "16.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - }, - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "packages/frontend/node_modules/tailwind-merge": { - "version": "2.6.0", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/dcastil" - } - }, - "packages/frontend/node_modules/undici-types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", - "dev": true, - "license": "MIT" - }, - "packages/server": { - "name": "@aiostreams/server", - "version": "0.0.0", - "dependencies": { - "@aiostreams/core": "^0.0.0", - "express": "^5.1.0", - "express-rate-limit": "^8.0.1", - "rate-limit-redis": "^4.2.2" - }, - "devDependencies": { - "@types/express": "^5.0.1", - "@types/express-rate-limit": "^5.1.3", - "@types/node": "^20.14.10" - } - }, - "packages/server/node_modules/@types/node": { - "version": "20.19.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.10.tgz", - "integrity": "sha512-iAFpG6DokED3roLSP0K+ybeDdIX6Bc0Vd3mLW5uDqThPWtNos3E+EqOM11mPQHKzfWHqEBuLjIlsBQQ8CsISmQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~6.21.0" - } - }, - "packages/server/node_modules/undici-types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", - "dev": true, - "license": "MIT" - } - } -} diff --git a/package.json b/package.json index ec7ba4a1..0888ac17 100644 --- a/package.json +++ b/package.json @@ -3,18 +3,19 @@ "version": "2.12.2", "description": "AIOStreams consolidates multiple Stremio addons and debrid services into a single, easily configurable addon. It allows highly customisable filtering, sorting, and formatting of results and supports proxying all your streams through MediaFlow Proxy or StremThru for improved compatibility and IP restriction bypassing.", "main": "dist/index.js", + "type": "module", "scripts": { - "test": "npm run test --workspaces", + "test": "pnpm run test --workspaces", "release": "commit-and-tag-version", "format": "prettier --write .", "metadata": "node scripts/generateMetadata.js", - "build": "npm -w packages/core run build && npm -w packages/server run build && npm -w packages/frontend run build", + "build": "pnpm -F core run build && pnpm -F server run build && pnpm -F frontend run build", "build:watch": "tsc --build --watch", "start": "node packages/server/dist/server", - "start:addon": "npm run start", + "start:addon": "pnpm run start", "start:dev": "cross-env NODE_ENV=development tsx watch packages/server/src/server.ts", - "start:addon:dev": "npm run start:dev", - "start:frontend:dev": "npm -w packages/frontend run dev" + "start:addon:dev": "pnpm run start:dev", + "start:frontend:dev": "pnpm -F frontend run dev" }, "author": "Viren070", "license": "MIT", diff --git a/packages/core/package.json b/packages/core/package.json index 91964d37..3867d18b 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -16,6 +16,8 @@ "envalid": "^8.0.0", "expr-eval": "^2.0.2", "fetch-socks": "^1.3.2", + "fuzzball": "^2.2.3", + "go-ptt": "^0.4.0", "moment-timezone": "^0.5.48", "parse-torrent-title": "github:TheBeastLT/parse-torrent-title", "pg": "^8.16.0", @@ -26,12 +28,14 @@ "super-regex": "^1.0.0", "undici": "^7.2.3", "winston": "^3.17.0", + "xml2js": "^0.6.2", "zod": "^4.1.5" }, "devDependencies": { "@types/bcrypt": "^5.0.2", "@types/bytes": "^3.1.5", "@types/node": "^20.14.10", - "@types/pg": "^8.15.2" + "@types/pg": "^8.15.2", + "@types/xml2js": "^0.4.14" } } diff --git a/packages/core/src/builtins/base/debrid.ts b/packages/core/src/builtins/base/debrid.ts new file mode 100644 index 00000000..7b076874 --- /dev/null +++ b/packages/core/src/builtins/base/debrid.ts @@ -0,0 +1,385 @@ +import { Manifest, Meta, Stream } from '../../db/schemas'; +import { z, ZodError } from 'zod'; +import { IdParser, IdType, ParsedId } from '../../utils/id-parser'; +import { + AnimeDatabase, + constants, + Env, + formatZodError, + getTimeTakenSincePoint, + SERVICE_DETAILS, +} from '../../utils'; +import { TorrentClient } from '../../utils/torrent'; +import { + BuiltinDebridServices, + PlaybackInfo, + Torrent, + NZB, + TorrentWithSelectedFile, + NZBWithSelectedFile, + UnprocessedTorrent, + ServiceAuth, +} from '../../debrid'; +import { processTorrents, processNZBs } from '../utils/debrid'; +import { calculateAbsoluteEpisode } from '../utils/general'; +import { TitleMetadata } from '../torbox-search/source-handlers'; +import { MetadataService } from '../../metadata/service'; +import { Logger } from 'winston'; + +export interface SearchMetadata extends TitleMetadata { + primaryTitle?: string; + year?: number; + imdbId?: string | null; + tmdbId?: string | null; + tvdbId?: string | null; +} + +export const BaseDebridConfigSchema = z.object({ + services: BuiltinDebridServices, + tmdbApiKey: z.string().optional(), + tmdbReadAccessToken: z.string().optional(), +}); +export type BaseDebridConfig = z.infer; + +export abstract class BaseDebridAddon { + abstract readonly id: string; + abstract readonly name: string; + abstract readonly version: string; + + get addonId(): string { + return `com.${this.name.toLowerCase().replace(/\s/g, '')}.viren070`; + } + + abstract readonly logger: Logger; + + protected readonly userData: T; + protected readonly clientIp?: string; + + private static readonly supportedIdTypes: IdType[] = [ + 'imdbId', + 'kitsuId', + 'malId', + 'themoviedbId', + 'thetvdbId', + ]; + + constructor(userData: T, configSchema: z.ZodType, clientIp?: string) { + try { + this.userData = configSchema.parse(userData); + } catch (error) { + throw new Error( + `Invalid user data: ${formatZodError(error as ZodError)}` + ); + } + + this.clientIp = clientIp; + } + + public getManifest(): Manifest { + return { + id: this.addonId, + name: this.name, + version: this.version, + types: ['movie', 'series', 'anime'], + catalogs: [], + description: `${this.name} addon`, + resources: [ + { + name: 'stream', + types: ['movie', 'series', 'anime'], + idPrefixes: IdParser.getPrefixes(BaseDebridAddon.supportedIdTypes), + }, + ], + }; + } + + public async getStreams(type: string, id: string): Promise { + const parsedId = IdParser.parse(id, type); + if ( + !parsedId || + !BaseDebridAddon.supportedIdTypes.includes(parsedId.type) + ) { + throw new Error(`Unsupported ID: ${id}`); + } + + this.logger.info(`Handling stream request for ${this.name}`, { + requestType: type, + requestId: id, + }); + const searchMetadata = await this._getSearchMetadata(parsedId, type); + + const searchPromises = await Promise.allSettled([ + this._searchTorrents(parsedId, searchMetadata), + this._searchNzbs(parsedId, searchMetadata), + ]); + + let torrentResults = + searchPromises[0].status === 'fulfilled' ? searchPromises[0].value : []; + const nzbResults = + searchPromises[1].status === 'fulfilled' ? searchPromises[1].value : []; + + const searchErrors: Stream[] = []; + if (searchPromises[0].status === 'rejected') { + searchErrors.push( + this._createErrorStream({ + title: `${this.name}`, + description: searchPromises[0].reason.message, + }) + ); + } + if (searchPromises[1].status === 'rejected') { + searchErrors.push( + this._createErrorStream({ + title: `${this.name}`, + description: searchPromises[1].reason.message, + }) + ); + } + + if (torrentResults.some((t) => !t.hash && t.downloadUrl)) { + // Process torrents in batches of 5 to avoid overwhelming the system + const BATCH_SIZE = 15; + const enrichedResults: Torrent[] = []; + const torrentsToProcess = [...torrentResults]; + + while (torrentsToProcess.length > 0) { + const batch = torrentsToProcess.splice(0, BATCH_SIZE); + const metadataPromises = batch.map(async (torrent) => { + try { + const metadata = await TorrentClient.getMetadata(torrent); + if (!metadata) { + return torrent.hash ? (torrent as Torrent) : null; + } + return { + ...torrent, + hash: metadata.hash, + sources: metadata.sources, + files: metadata.files, + } as Torrent; + } catch (error) { + this.logger.error(`Failed to fetch metadata for torrent: ${error}`); + return torrent.hash ? (torrent as Torrent) : null; + } + }); + + const batchResults = await Promise.all(metadataPromises); + enrichedResults.push( + ...batchResults.filter((r): r is Torrent => r !== null) + ); + } + torrentResults = enrichedResults; + } + + const [processedTorrents, processedNzbs] = await Promise.all([ + processTorrents( + torrentResults as Torrent[], + this.userData.services, + id, + searchMetadata, + this.clientIp + ), + processNZBs( + nzbResults, + this.userData.services, + id, + searchMetadata, + this.clientIp + ), + ]); + + const resultStreams = [ + ...processedTorrents.results, + ...processedNzbs.results, + ].map((result) => + this._createStream(result, this.userData, searchMetadata) + ); + + const processingErrors = [ + ...processedTorrents.errors, + ...processedNzbs.errors, + ].map((error) => + this._createErrorStream({ + title: `${this.name} ${constants.SERVICE_DETAILS[error.serviceId].shortName}`, + description: error.error.message, + }) + ); + + return [...resultStreams, ...searchErrors, ...processingErrors]; + } + + protected abstract _searchTorrents( + parsedId: ParsedId, + metadata: SearchMetadata + ): Promise; + protected abstract _searchNzbs( + parsedId: ParsedId, + metadata: SearchMetadata + ): Promise; + + protected async _getSearchMetadata( + parsedId: ParsedId, + type: string + ): Promise { + const start = Date.now(); + + const animeEntry = AnimeDatabase.getInstance().getEntryById( + parsedId.type, + parsedId.value + ); + + // Update season from anime entry if available + if (animeEntry && !parsedId.season) { + parsedId.season = + animeEntry.imdb?.fromImdbSeason?.toString() ?? + animeEntry.trakt?.season?.toString(); + } + + const metadata = await new MetadataService({ + tmdbAccessToken: this.userData.tmdbReadAccessToken, + tmdbApiKey: this.userData.tmdbApiKey, + }).getMetadata(parsedId, type === 'movie' ? 'movie' : 'series'); + + // Calculate absolute episode if needed + let absoluteEpisode: number | undefined; + if (animeEntry && parsedId.season && parsedId.episode && metadata.seasons) { + const seasons = metadata.seasons.map( + ({ season_number, episode_count }) => ({ + number: season_number.toString(), + episodes: episode_count, + }) + ); + this.logger.debug( + `Calculating absolute episode with current season and episode: ${parsedId.season}, ${parsedId.episode} and seasons: ${JSON.stringify(seasons)}` + ); + absoluteEpisode = Number( + calculateAbsoluteEpisode(parsedId.season, parsedId.episode, seasons) + ); + } + + // Map IDs + const imdbId = + parsedId.type === 'imdbId' + ? parsedId.value.toString() + : (animeEntry?.mappings?.imdbId?.toString() ?? null); + const tmdbId = + parsedId.type === 'themoviedbId' + ? parsedId.value.toString() + : (animeEntry?.mappings?.themoviedbId?.toString() ?? null); + const tvdbId = + parsedId.type === 'thetvdbId' + ? parsedId.value.toString() + : (animeEntry?.mappings?.thetvdbId?.toString() ?? null); + + const searchMetadata: SearchMetadata = { + primaryTitle: metadata.title, + titles: metadata.titles ?? [], + season: parsedId.season ? Number(parsedId.season) : undefined, + episode: parsedId.episode ? Number(parsedId.episode) : undefined, + absoluteEpisode, + year: metadata.year, + imdbId, + tmdbId, + tvdbId, + }; + + this.logger.debug( + `Got search metadata for ${parsedId.type}:${parsedId.value} in ${getTimeTakenSincePoint(start)}`, + { + ...searchMetadata, + titles: searchMetadata.titles.length, + } + ); + + return searchMetadata; + } + + protected _createStream( + torrentOrNzb: TorrentWithSelectedFile | NZBWithSelectedFile, + userData: T, + titleMetadata?: TitleMetadata + ): Stream { + // Handle debrid streaming + const storeAuth: ServiceAuth | undefined = torrentOrNzb.service + ? { + id: torrentOrNzb.service!.id, + credential: + userData.services.find( + (service) => service.id === torrentOrNzb.service!.id + )?.credential ?? '', + } + : undefined; + + const playbackInfo: PlaybackInfo | undefined = torrentOrNzb.service + ? torrentOrNzb.type === 'torrent' + ? { + type: 'torrent', + hash: torrentOrNzb.hash, + sources: torrentOrNzb.sources, + title: torrentOrNzb.title, + file: torrentOrNzb.file, + metadata: titleMetadata, + } + : { + type: 'usenet', + nzb: torrentOrNzb.nzb, + title: torrentOrNzb.title, + hash: torrentOrNzb.hash, + file: torrentOrNzb.file, + metadata: titleMetadata, + } + : undefined; + + const svcMeta = torrentOrNzb.service + ? SERVICE_DETAILS[torrentOrNzb.service.id] + : undefined; + // const svcMeta = SERVICE_DETAILS[torrentOrNzb.service.id]; + const shortCode = svcMeta?.shortName || 'P2P'; + const cacheIndicator = torrentOrNzb.service + ? torrentOrNzb.service.cached + ? '⚡' + : '⏳' + : ''; + + const name = `[${shortCode} ${cacheIndicator}${torrentOrNzb.service?.owned ? ' ☁️' : ''}] ${this.name}`; + const description = `${torrentOrNzb.title}\n${torrentOrNzb.file.name}\n${ + torrentOrNzb.indexer ? `🔍 ${torrentOrNzb.indexer}` : '' + } ${'seeders' in torrentOrNzb && torrentOrNzb.seeders ? `👤 ${torrentOrNzb.seeders}` : ''} ${ + torrentOrNzb.age && torrentOrNzb.age !== '0d' + ? `🕒 ${torrentOrNzb.age}` + : '' + }`; + + return { + url: torrentOrNzb.service + ? `${Env.BASE_URL}/api/v1/debrid/playback/${encodeURIComponent( + Buffer.from(JSON.stringify(storeAuth)).toString('base64') + )}/${encodeURIComponent( + Buffer.from(JSON.stringify(playbackInfo)).toString('base64') + )}/${encodeURIComponent(torrentOrNzb.file.name || torrentOrNzb.title || 'unknown')}` + : undefined, + name, + description, + type: torrentOrNzb.type, + infoHash: torrentOrNzb.hash, + fileIdx: torrentOrNzb.file.index, + behaviorHints: { + videoSize: torrentOrNzb.file.size, + filename: torrentOrNzb.file.name, + }, + }; + } + + protected _createErrorStream({ + title, + description, + }: { + title: string; + description: string; + }): Stream { + return { + name: `[❌] ${title}`, + description: description, + externalUrl: 'stremio:///', + }; + } +} diff --git a/packages/core/src/builtins/base/nab/addon.ts b/packages/core/src/builtins/base/nab/addon.ts new file mode 100644 index 00000000..2c8f5a07 --- /dev/null +++ b/packages/core/src/builtins/base/nab/addon.ts @@ -0,0 +1,181 @@ +import { z } from 'zod'; +import { ParsedId } from '../../../utils/id-parser'; +import { getTimeTakenSincePoint } from '../../../utils'; +import { Logger } from 'winston'; +import { + BaseDebridAddon, + BaseDebridConfigSchema, + SearchMetadata, +} from '../debrid'; +import { BaseNabApi, Capabilities, SearchResultItem } from './api'; + +export const NabAddonConfigSchema = BaseDebridConfigSchema.extend({ + url: z.string(), + apiKey: z.string().optional(), + apiPath: z.string().optional(), + forceQuerySearch: z.boolean().default(false), +}); +export type NabAddonConfig = z.infer; + +export abstract class BaseNabAddon< + C extends NabAddonConfig, + A extends BaseNabApi<'torznab' | 'newznab'>, +> extends BaseDebridAddon { + abstract api: A; + + protected async performSearch( + parsedId: ParsedId, + metadata: SearchMetadata + ): Promise[]> { + const start = Date.now(); + const queryParams: Record = {}; + let capabilities: Capabilities; + try { + capabilities = await this.api.getCapabilities(); + } catch (error) { + throw new Error( + `Could not get capabilities: ${error instanceof Error ? error.message : String(error)}` + ); + } + + this.logger.debug(`Capabilities: ${JSON.stringify(capabilities)}`); + + const chosenFunction = this.getSearchFunction( + parsedId.mediaType, + capabilities.searching + ); + if (!chosenFunction) + throw new Error( + `Could not find a search function for ${capabilities.server.title}` + ); + + const { capabilities: searchCapabilities, function: searchFunction } = + chosenFunction; + this.logger.debug(`Using search function: ${searchFunction}`, { + searchCapabilities, + }); + + queryParams.limit = capabilities.limits?.max?.toString() ?? '10000'; + + if (this.userData.forceQuerySearch) { + } else if ( + searchCapabilities.supportedParams.includes('imdbid') && + metadata.imdbId + ) + queryParams.imdbid = metadata.imdbId.replace('tt', ''); + else if ( + searchCapabilities.supportedParams.includes('tmdbid') && + metadata.tmdbId + ) + queryParams.tmdbid = metadata.tmdbId; + else if ( + searchCapabilities.supportedParams.includes('tvdbid') && + metadata.tvdbId + ) + queryParams.tvdbid = metadata.tvdbId; + + if ( + !this.userData.forceQuerySearch && + searchCapabilities.supportedParams.includes('season') && + parsedId.season + ) + queryParams.season = parsedId.season.toString(); + if ( + !this.userData.forceQuerySearch && + searchCapabilities.supportedParams.includes('ep') && + parsedId.episode + ) + queryParams.ep = parsedId.episode.toString(); + if ( + !this.userData.forceQuerySearch && + searchCapabilities.supportedParams.includes('year') && + metadata.year && + parsedId.mediaType === 'movie' + ) + queryParams.year = metadata.year.toString(); + + let queries: string[] = []; + if ( + !queryParams.imdbid && + !queryParams.tmdbid && + !queryParams.tvdbid && + searchCapabilities.supportedParams.includes('q') && + metadata.primaryTitle + ) { + queries.push(metadata.primaryTitle); + if ( + parsedId.season && + parsedId.episode && + !queryParams.season && + !queryParams.ep + ) { + queries = [ + `${metadata.primaryTitle} S${parsedId.season.toString().padStart(2, '0')}`, + `${metadata.primaryTitle} S${parsedId.season.toString().padStart(2, '0')}E${parsedId.episode.toString().padStart(2, '0')}`, + ]; + if (metadata.absoluteEpisode) + queries.push( + `${metadata.primaryTitle} ${metadata.absoluteEpisode.toString().padStart(2, '0')}` + ); + } + if ( + metadata.year && + parsedId.mediaType === 'movie' && + !queryParams.year + ) { + queries = queries.map((q) => `${q} ${metadata.year}`); + } + } + let results: SearchResultItem[] = []; + if (queries.length > 0) { + this.logger.debug('Performing queries', { queries }); + const searchPromises = queries.map((q) => + this.api.search(searchFunction, { ...queryParams, q }) + ); + const allResults = await Promise.all(searchPromises); + results = allResults.flat() as SearchResultItem[]; + } else { + results = (await this.api.search( + searchFunction, + queryParams + )) as unknown as SearchResultItem[]; + } + this.logger.info( + `Completed search for ${capabilities.server.title} in ${getTimeTakenSincePoint(start)}`, + { + results: results.length, + } + ); + return results; + } + + private getSearchFunction( + type: string, + searching: Capabilities['searching'] + ) { + const available = Object.keys(searching); + this.logger.debug( + `Available search functions: ${JSON.stringify(available)}` + ); + if (type === 'movie') { + const movieSearch = available.find((s) => + s.toLowerCase().includes('movie') + ); + if (movieSearch && (searching as any)[movieSearch].available) + return { + capabilities: (searching as any)[movieSearch], + function: 'movie', + }; + } else { + const tvSearch = available.find((s) => s.toLowerCase().includes('tv')); + if (tvSearch && (searching as any)[tvSearch].available) + return { + capabilities: (searching as any)[tvSearch], + function: 'tvsearch', + }; + } + if ((searching as any).search.available) + return { capabilities: (searching as any).search, function: 'search' }; + return undefined; + } +} diff --git a/packages/core/src/builtins/base/nab/api.ts b/packages/core/src/builtins/base/nab/api.ts new file mode 100644 index 00000000..17ee1676 --- /dev/null +++ b/packages/core/src/builtins/base/nab/api.ts @@ -0,0 +1,322 @@ +import { z } from 'zod'; +import { fetch } from 'undici'; +import { + Cache, + DistributedLock, + Env, + formatZodError, + getTimeTakenSincePoint, + createLogger, +} from '../../../utils'; +import { Parser } from 'xml2js'; +import { Logger } from 'winston'; + +// --- Generic Custom Error --- +export class NabApiError extends Error { + constructor( + public readonly code: number, + public readonly description: string + ) { + super(`${description} (Error Code: ${code})`); + this.name = 'NabApiError'; + } +} + +// --- Zod Schemas --- +const convertString = z + .string() + .optional() + .transform((val) => { + if (val === 'yes') return true; + if (val === 'no') return false; + if (val && !Number.isNaN(Number(val))) return Number(val); + return val; + }); + +const NabSearchFunctionSchema = z + .array( + z.object({ + $: z.object({ + available: convertString, + supportedParams: z + .string() + .transform((val) => val.split(',')) + .default([]), + }), + }) + ) + .transform((arr) => arr[0].$); +const NabCapsSearchingSchema = z + .object({ + search: NabSearchFunctionSchema, + }) + .catchall(NabSearchFunctionSchema); + +const CapabilitiesSchema = z + .object({ + caps: z.object({ + server: z.array(z.object({ $: z.object({ title: z.string() }) })), + limits: z + .array( + z.object({ + $: z.object({ default: convertString, max: convertString }), + }) + ) + .optional(), + searching: z.array(NabCapsSearchingSchema), + }), + }) + .transform((obj) => ({ + server: obj.caps.server[0].$, + limits: obj.caps.limits?.[0].$, + searching: obj.caps.searching[0], + })); +export type Capabilities = z.infer; + +const AttributeSchema = z + .object({ $: z.object({ name: z.string(), value: convertString }) }) + .transform((attr) => ({ [attr.$.name]: attr.$.value })); + +// Create specific schemas for each namespace +const createTorznabItemSchema = () => + z + .object({ + title: z.array(z.string()).transform((arr) => arr[0]), + link: z.array(z.string()).transform((arr) => arr[0]), + guid: z + .array(z.union([z.string(), z.object({ _: z.string() })])) + .transform((arr) => (typeof arr[0] === 'string' ? arr[0] : arr[0]._)), + pubDate: z.array(z.string()).transform((arr) => arr[0]), + size: z + .array(z.string()) + .optional() + .transform((arr) => (arr?.[0] ? Number(arr[0]) : undefined)), + enclosure: z.array( + z + .object({ + $: z.object({ + url: z.string(), + length: convertString, + type: z.string(), + }), + }) + .transform((obj) => obj.$) + ), + 'torznab:attr': z + .array(AttributeSchema) + .optional() + .transform( + (arr) => arr?.reduce((acc, attr) => ({ ...acc, ...attr }), {}) ?? {} + ), + }) + .transform((item) => ({ + title: item.title, + link: item.link, + guid: item.guid, + pubDate: item.pubDate, + size: item.size, + enclosure: item.enclosure, + torznab: item['torznab:attr'], + })); + +const createNewznabItemSchema = () => + z + .object({ + title: z.array(z.string()).transform((arr) => arr[0]), + link: z.array(z.string()).transform((arr) => arr[0]), + guid: z + .array(z.union([z.string(), z.object({ _: z.string() })])) + .transform((arr) => (typeof arr[0] === 'string' ? arr[0] : arr[0]._)), + pubDate: z.array(z.string()).transform((arr) => arr[0]), + size: z + .array(z.string()) + .optional() + .transform((arr) => (arr?.[0] ? Number(arr[0]) : undefined)), + enclosure: z.array( + z + .object({ + $: z.object({ + url: z.string(), + length: convertString, + type: z.string(), + }), + }) + .transform((obj) => obj.$) + ), + 'newznab:attr': z + .array(AttributeSchema) + .optional() + .transform( + (arr) => arr?.reduce((acc, attr) => ({ ...acc, ...attr }), {}) ?? {} + ), + }) + .transform((item) => ({ + title: item.title, + link: item.link, + guid: item.guid, + pubDate: item.pubDate, + size: item.size, + enclosure: item.enclosure, + newznab: item['newznab:attr'], + })); + +// Type definitions for search result items +export type TorznabSearchResultItem = z.infer< + ReturnType +>; +export type NewznabSearchResultItem = z.infer< + ReturnType +>; + +// Union type for all possible search result items +export type SearchResultItem = + T extends 'torznab' ? TorznabSearchResultItem : NewznabSearchResultItem; + +// --- API Client Class --- +export class BaseNabApi { + private readonly xmlParser: Parser; + private readonly capabilitiesCache: Cache; + private readonly searchCache: Cache[]>; + private readonly SearchResultSchema: z.ZodType; + private readonly logger: Logger; + + constructor( + public readonly namespace: N, + logger: Logger, + private readonly baseUrl: string, + private readonly apiKey?: string, + private readonly apiPath: string = '/api' + ) { + this.logger = logger; + this.baseUrl = this.removeTrailingSlash(baseUrl); + this.apiPath = this.removeTrailingSlash(apiPath); + this.xmlParser = new Parser(); + this.capabilitiesCache = Cache.getInstance(`${namespace}:api:caps`); + this.searchCache = Cache.getInstance(`${namespace}:api:search`); + + // Create the appropriate schema based on namespace + if (namespace === 'torznab') { + this.SearchResultSchema = z + .object({ + rss: z.object({ + channel: z.array( + z.object({ + item: z.array(createTorznabItemSchema()).optional().default([]), + }) + ), + }), + }) + .transform((data) => data.rss.channel[0].item); + } else { + this.SearchResultSchema = z + .object({ + rss: z.object({ + channel: z.array( + z.object({ + item: z.array(createNewznabItemSchema()).optional().default([]), + }) + ), + }), + }) + .transform((data) => data.rss.channel[0].item); + } + } + + public async getCapabilities(): Promise { + const cacheKey = `${this.baseUrl}${this.apiPath}?t=caps`; + return this.capabilitiesCache.wrap( + () => this.request('caps', CapabilitiesSchema), + cacheKey, + Env.BUILTIN_TORZNAB_CAPABILITIES_CACHE_TTL + ); + } + + public async search( + searchFunction: string = 'search', + params: Record = {} + ): Promise[]> { + const cacheKey = `${this.baseUrl}${this.apiPath}?t=${searchFunction}&${JSON.stringify(params)}&apikey=${this.apiKey}`; + return this.searchCache.wrap( + () => this.request(searchFunction, this.SearchResultSchema, params), + cacheKey, + Env.BUILTIN_TORZNAB_SEARCH_CACHE_TTL + ); + } + + private removeTrailingSlash = (path: string) => + path.endsWith('/') ? path.slice(0, -1) : path; + private getHeaders = () => ({ + 'Content-Type': 'application/xml', + 'User-Agent': Env.DEFAULT_USER_AGENT, + }); + + private async request( + func: string, + schema: z.ZodSchema, + params: Record = {} + ): Promise { + const lockKey = `${this.baseUrl}${this.apiPath}?t=${func}&${JSON.stringify(params)}&apikey=${this.apiKey}`; + const { result } = await DistributedLock.getInstance().withLock( + lockKey, + () => this._request(func, schema, params), + { timeout: 30000, ttl: 32000 } + ); + return result; + } + + private async _request( + func: string, + schema: z.ZodSchema, + params: Record = {} + ): Promise { + const start = Date.now(); + const url = new URL(`${this.baseUrl}${this.apiPath}`); + const searchParams = new URLSearchParams({ + t: func, + ...Object.fromEntries( + Object.entries(params).map(([k, v]) => [k, String(v)]) + ), + }); + if (this.apiKey) searchParams.set('apikey', this.apiKey); + url.search = searchParams.toString(); + const urlString = url.toString(); + + this.logger.info(`Making ${this.namespace} request to: ${urlString}`); + + try { + const response = await fetch(urlString, { + method: 'GET', + headers: this.getHeaders(), + }); + const data = await response.text(); + const result = await this.xmlParser.parseStringPromise(data); + this.xmlParser.reset(); + + if (result.error) { + const code = parseInt(result.error.$.code, 10); + const description = result.error.$.description; + throw new NabApiError(code, description); + } + + if (!response.ok) { + throw new Error( + `${response.status} - ${response.statusText}${data ? `: ${data}` : ''}` + ); + } + + const parsedResult = schema.parse(result); + this.logger.debug( + `Completed ${this.namespace} request for ${urlString} in ${getTimeTakenSincePoint(start)}` + ); + return parsedResult; + } catch (error) { + if (error instanceof z.ZodError) { + const message = `Response validation failed: ${formatZodError(error)}`; + this.logger.error(`${this.namespace} ${message}`); + throw new Error(message); + } + this.logger.error(`${this.namespace} request error: ${error}`); + throw error; + } + } +} diff --git a/packages/core/src/builtins/gdrive/addon.ts b/packages/core/src/builtins/gdrive/addon.ts index 0a4b52f8..1201c4b3 100644 --- a/packages/core/src/builtins/gdrive/addon.ts +++ b/packages/core/src/builtins/gdrive/addon.ts @@ -1,5 +1,5 @@ import { Manifest, Meta, MetaPreview, Stream, Subtitle } from '../../db'; -import { Env, ExtrasParser, createLogger } from '../../utils'; +import { AnimeDatabase, Env, ExtrasParser, createLogger } from '../../utils'; import { GDriveAPI, GoogleOAuth, @@ -9,10 +9,10 @@ import { import { GDriveFile, UserData } from './schemas'; import { IMDBMetadata } from '../../metadata/imdb'; import { TMDBMetadata } from '../../metadata/tmdb'; -import { KitsuMetadata } from '../../metadata/kitsu'; import { formatBytes, formatDuration } from '../../formatters'; -import { IdParser, ParsedId } from '../utils/id-parser'; -import { TorboxSearchApiIdType } from '../torbox-search/search-api'; +import { IdParser, ParsedId } from '../../utils/id-parser'; +import { IdType } from '../../utils/id-parser'; +import { getTraktAliases } from '../../metadata/trakt'; const logger = createLogger('gdrive'); @@ -21,15 +21,13 @@ export class GDriveAddon { private api: GDriveAPI; private oauth: GoogleOAuth; private manifest: Manifest; - private static supportedIdTypes: TorboxSearchApiIdType[] = [ - 'imdb_id', - 'tmdb', - 'thetvdb_id', - 'kitsu_id', + private static readonly supportedIdTypes: IdType[] = [ + 'imdbId', + 'themoviedbId', + 'thetvdbId', + 'kitsuId', + 'malId', ]; - private static readonly idParser: IdParser = new IdParser( - GDriveAddon.supportedIdTypes - ); constructor(userData: UserData) { this.userData = UserData.parse(userData); @@ -88,7 +86,7 @@ export class GDriveAddon { { name: 'stream', types: ['movie', 'series', 'anime'], - idPrefixes: GDriveAddon.idParser.supportedPrefixes, + idPrefixes: IdParser.getPrefixes(GDriveAddon.supportedIdTypes), }, { name: 'catalog', @@ -116,12 +114,12 @@ export class GDriveAddon { } public async getStreams(type: string, id: string): Promise { - const parsedId = GDriveAddon.idParser.parse(id); - if (!parsedId) { + const parsedId = IdParser.parse(id, type); + if (!parsedId || !GDriveAddon.supportedIdTypes.includes(parsedId.type)) { throw new Error(`Requested ID ${id} is not a valid or supported ID`); } logger.debug(`Parsed ID: ${id}`, parsedId); - const { id: titleId, season, episode } = parsedId; + const { value: idValue, type: idType, season, episode } = parsedId; let searchQuery: string; try { const { titles, year } = await this.getMetadata(parsedId, type); @@ -129,7 +127,7 @@ export class GDriveAddon { logger.debug(`Search query: ${searchQuery}`); } catch (error) { logger.error( - `Failed to get metadata for ${titleId}: ${error instanceof Error ? error.message : error}` + `Failed to get metadata for ${idType}:${idValue}: ${error instanceof Error ? error.message : error}` ); throw new Error('Failed to get metadata'); } @@ -179,17 +177,38 @@ export class GDriveAddon { let year: number; switch (true) { - case parsedId.type === 'kitsu_id': { - const kitsuMetadata = new KitsuMetadata(); - const metadata = await kitsuMetadata.getMetadata(parsedId, type); - titles = metadata.titles ?? [metadata.title]; - year = metadata.year; + case parsedId.type === 'malId': + case parsedId.type === 'kitsuId': { + const animeEntry = AnimeDatabase.getInstance().getEntryById( + parsedId.type, + parsedId.value + ); + if (!animeEntry || !animeEntry.animeSeason?.year) { + throw new Error('Anime entry not found'); + } + titles = []; + if (animeEntry.synonyms) { + titles.push(...animeEntry.synonyms); + } + if (animeEntry.title) { + titles.push(animeEntry.title); + } + titles = [...new Set(titles)]; + year = animeEntry.animeSeason?.year; break; } case this.userData.metadataSource === 'imdb': { const imdbMetadata = new IMDBMetadata(); - const metadata = await imdbMetadata.getTitleAndYear(parsedId.id, type); + const metadata = await imdbMetadata.getTitleAndYear( + parsedId.value.toString(), + type + ); titles = metadata.titles ?? [metadata.title]; + const traktAliases = await getTraktAliases(parsedId); + if (traktAliases) { + titles.push(...traktAliases); + } + titles = [...new Set(titles)]; year = metadata.year; break; } @@ -201,11 +220,18 @@ export class GDriveAddon { accessToken: this.userData.tmdbReadAccessToken, }); const metadata = await tmdbMetadata.getMetadata( - parsedId.id, + parsedId.value.toString(), type as any ); - titles = metadata.titles; + titles = metadata.titles ?? [metadata.title]; year = Number(metadata.year); + if (parsedId.type === 'imdbId') { + const traktAliases = await getTraktAliases(parsedId); + if (traktAliases) { + titles.push(...traktAliases); + } + titles = [...new Set(titles)]; + } break; } default: diff --git a/packages/core/src/builtins/index.ts b/packages/core/src/builtins/index.ts index 75da6de3..b0508549 100644 --- a/packages/core/src/builtins/index.ts +++ b/packages/core/src/builtins/index.ts @@ -1,2 +1,5 @@ export * from './gdrive'; export * from './torbox-search'; +export * from './torznab'; +export * from './newznab'; +export * from './prowlarr'; diff --git a/packages/core/src/builtins/newznab/addon.ts b/packages/core/src/builtins/newznab/addon.ts new file mode 100644 index 00000000..d35f0517 --- /dev/null +++ b/packages/core/src/builtins/newznab/addon.ts @@ -0,0 +1,91 @@ +import { z } from 'zod'; +import { ParsedId } from '../../utils/id-parser'; +import { constants, createLogger } from '../../utils'; +import { Torrent, NZB } from '../../debrid'; +import { SearchMetadata } from '../base/debrid'; +import { createHash } from 'crypto'; +import { BaseNabApi, SearchResultItem } from '../base/nab/api'; +import { + BaseNabAddon, + NabAddonConfigSchema, + NabAddonConfig, +} from '../base/nab/addon'; + +const logger = createLogger('newznab'); + +class NewznabApi extends BaseNabApi<'newznab'> { + constructor(baseUrl: string, apiKey?: string, apiPath?: string) { + super('newznab', logger, baseUrl, apiKey, apiPath); + } +} + +// Addon class +export class NewznabAddon extends BaseNabAddon { + readonly name = 'Newznab'; + readonly version = '1.0.0'; + readonly id = 'newznab'; + readonly logger = logger; + readonly api: NewznabApi; + constructor(userData: NabAddonConfig, clientIp?: string) { + super(userData, NabAddonConfigSchema, clientIp); + if ( + !userData.services.find((s) => s.id === constants.TORBOX_SERVICE) || + userData.services.length > 1 + ) { + throw new Error('The Newznab addon only supports TorBox'); + } + this.api = new NewznabApi( + this.userData.url, + this.userData.apiKey, + this.userData.apiPath + ); + } + + protected async _searchNzbs( + parsedId: ParsedId, + metadata: SearchMetadata + ): Promise { + const results = await this.performSearch(parsedId, metadata); + const seenNzbs = new Set(); + + const nzbs: NZB[] = []; + for (const result of results) { + const nzbUrl = this.getNzbUrl(result); + if (!nzbUrl) continue; + if (seenNzbs.has(nzbUrl)) continue; + seenNzbs.add(nzbUrl); + + const md5 = + result.newznab?.infohash?.toString() || + createHash('md5').update(nzbUrl).digest('hex'); + const age = Math.ceil( + Math.abs(new Date().getTime() - new Date(result.pubDate).getTime()) / + (1000 * 60 * 60 * 24) + ); + + nzbs.push({ + hash: md5, + nzb: nzbUrl, + age: `${age}d`, + title: result.title, + size: + result.size ?? + (result.newznab?.size ? Number(result.newznab.size) : 0), + type: 'usenet', + }); + } + return nzbs; + } + + protected async _searchTorrents( + parsedId: ParsedId, + metadata: SearchMetadata + ): Promise { + return []; + } + + private getNzbUrl(result: any): string | undefined { + return result.enclosure.find((e: any) => e.type === 'application/x-nzb') + ?.url; + } +} diff --git a/packages/core/src/builtins/newznab/index.ts b/packages/core/src/builtins/newznab/index.ts new file mode 100644 index 00000000..9762837e --- /dev/null +++ b/packages/core/src/builtins/newznab/index.ts @@ -0,0 +1 @@ +export * from './addon'; diff --git a/packages/core/src/builtins/prowlarr/addon.ts b/packages/core/src/builtins/prowlarr/addon.ts new file mode 100644 index 00000000..1a41305d --- /dev/null +++ b/packages/core/src/builtins/prowlarr/addon.ts @@ -0,0 +1,151 @@ +import { BaseDebridAddon, BaseDebridConfigSchema } from '../base/debrid'; +import { z } from 'zod'; +import { createLogger, Env, getTimeTakenSincePoint } from '../../utils'; +import ProwlarrApi, { + ProwlarrApiIndexer, + ProwlarrApiSearchItem, + ProwlarrApiError, +} from './api'; +import { ParsedId } from '../../utils/id-parser'; +import { SearchMetadata } from '../base/debrid'; +import { Torrent, NZB, UnprocessedTorrent } from '../../debrid'; +import { + extractInfoHashFromMagnet, + extractTrackersFromMagnet, +} from '../utils/debrid'; + +export const ProwlarrAddonConfigSchema = BaseDebridConfigSchema.extend({ + url: z.string(), + apiKey: z.string(), + indexers: z.array(z.string()), +}); + +export type ProwlarrAddonConfig = z.infer; + +const logger = createLogger('prowlarr'); + +export class ProwlarrAddon extends BaseDebridAddon { + readonly id = 'prowlarr'; + readonly name = 'Prowlarr'; + readonly version = '1.0.0'; + readonly logger = logger; + readonly api: ProwlarrApi; + + private readonly indexers: string[] = []; + + constructor(config: ProwlarrAddonConfig, clientIp?: string) { + super(config, ProwlarrAddonConfigSchema, clientIp); + this.indexers = config.indexers.map((x) => x.toLowerCase()); + this.api = new ProwlarrApi({ + baseUrl: config.url, + apiKey: config.apiKey, + timeout: Env.BUILTIN_PROWLARR_SEARCH_TIMEOUT, + }); + } + + protected async _searchTorrents( + parsedId: ParsedId, + metadata: SearchMetadata + ): Promise { + let availableIndexers: ProwlarrApiIndexer[] = []; + try { + const { data } = await this.api.indexers(); + availableIndexers = data; + } catch (error) { + if (error instanceof ProwlarrApiError) { + throw new Error( + `Failed to get Prowlarr indexers: ${error.message}: ${error.status} - ${error.statusText}` + ); + } + throw new Error(`Failed to get Prowlarr indexers: ${error}`); + } + const chosenIndexerIds = availableIndexers + .filter( + (indexer) => + indexer.enable && + (!this.indexers.length || + this.indexers.includes(indexer.name.toLowerCase()) || + this.indexers.includes(indexer.definitionName.toLowerCase()) || + this.indexers.includes(indexer.sortName.toLowerCase())) + ) + .map((indexer) => indexer.id); + + let queries: string[] = []; + + if (metadata.primaryTitle) { + queries.push(metadata.primaryTitle); + if (parsedId.season && parsedId.episode) { + queries = [ + `${metadata.primaryTitle} S${parsedId.season.toString().padStart(2, '0')}E${parsedId.episode.toString().padStart(2, '0')}`, + `${metadata.primaryTitle} S${parsedId.season.toString().padStart(2, '0')}`, + ]; + if (metadata.absoluteEpisode) + queries.push( + `${metadata.primaryTitle} ${metadata.absoluteEpisode.toString().padStart(2, '0')}` + ); + } + if (metadata.year && parsedId.mediaType === 'movie') { + queries = queries.map((q) => `${q} ${metadata.year}`); + } + } + + if (queries.length === 0) { + return []; + } + + const searchPromises = queries.map(async (q) => { + const start = Date.now(); + const { data } = await this.api.search({ + query: q, + indexerIds: chosenIndexerIds, + type: 'search', + }); + this.logger.info( + `Prowlarr search for ${q} took ${getTimeTakenSincePoint(start)}`, + { + results: data.length, + } + ); + return data; + }); + const allResults = await Promise.all(searchPromises); + const results = allResults.flat(); + + const seenTorrents = new Set(); + const torrents: UnprocessedTorrent[] = []; + + for (const result of results) { + const magnetUrl = result.guid.includes('magnet:') + ? result.guid + : result.magnetUrl; + const downloadUrl = result.magnetUrl?.startsWith('http') + ? result.magnetUrl + : result.downloadUrl; + const infoHash = + result.infoHash || + (magnetUrl ? extractInfoHashFromMagnet(magnetUrl) : undefined); + if (!infoHash) continue; + if (seenTorrents.has(infoHash)) continue; + seenTorrents.add(infoHash); + + torrents.push({ + hash: infoHash, + downloadUrl: downloadUrl, + sources: magnetUrl ? extractTrackersFromMagnet(magnetUrl) : [], + seeders: result.seeders, + title: result.title, + size: result.size, + indexer: result.indexer, + type: 'torrent', + }); + } + return torrents; + } + + protected async _searchNzbs( + parsedId: ParsedId, + metadata: SearchMetadata + ): Promise { + return []; + } +} diff --git a/packages/core/src/builtins/prowlarr/api.ts b/packages/core/src/builtins/prowlarr/api.ts new file mode 100644 index 00000000..9320a05e --- /dev/null +++ b/packages/core/src/builtins/prowlarr/api.ts @@ -0,0 +1,248 @@ +import { fetch } from 'undici'; +import { + Cache, + DistributedLock, + Env, + formatZodError, + makeRequest, +} from '../../utils'; +import z from 'zod'; + +interface ResponseMeta { + headers: Record; + status: number; + statusText: string; +} + +interface ProwlarrApiResponse { + data: T; + meta: ResponseMeta; +} + +interface ProwlarrConfig { + baseUrl: string; + apiKey: string; + timeout: number; +} + +export class ProwlarrApiError extends Error { + constructor( + message: string, + public readonly status: number, + public readonly statusText: string + ) { + super(message); + } +} + +const ProwlarrErrorSchema = z.object({ + message: z.string(), + description: z.string(), +}); + +// minimise schema to only include the fields we need +const ProwlarrApiIndexerSchema = z.object({ + id: z.number(), + name: z.string(), + sortName: z.string(), + definitionName: z.string(), + enable: z.boolean(), +}); + +export type ProwlarrApiIndexer = z.infer; + +const ProwlarrApiIndexersListSchema = z.array(ProwlarrApiIndexerSchema); + +const ProwlarrApiSearchItemSchema = z.object({ + guid: z.string(), // can sometimes be the raw magnet url + age: z.number(), // in days + size: z.number(), + indexerId: z.number(), + indexer: z.string(), + title: z.string(), + downloadUrl: z.url().optional(), + indexerFlags: z.array( + z.enum(['freeleech', 'public', 'private', 'semi-private']) + ), + magnetUrl: z.url().optional(), + infoHash: z + .string() + .optional() + .transform((val) => val?.toLowerCase()), + seeders: z.number().optional(), +}); + +const ProwlarrApiSearchSchema = z.array(ProwlarrApiSearchItemSchema); + +export type ProwlarrApiSearchItem = z.infer; + +class ProwlarrApi { + private readonly baseUrl: string; + private readonly apiKey: string; + + private readonly baseApiPath = '/api/v1'; + + private readonly searchCache = Cache.getInstance< + string, + ProwlarrApiSearchItem[] + >('prowlarr-api:search'); + + private readonly indexersCache = Cache.getInstance< + string, + ProwlarrApiIndexer[] + >('prowlarr-api:indexers'); + + #headers: Record; + #timeout: number; + + constructor(config: ProwlarrConfig) { + this.baseUrl = config.baseUrl; + this.apiKey = config.apiKey; + this.#headers = { + 'Content-Type': 'application/json', + 'X-Api-Key': this.apiKey, + 'User-Agent': Env.DEFAULT_USER_AGENT, + }; + this.#timeout = config.timeout; + } + + async indexers(): Promise> { + return this.indexersCache.wrap( + () => + this.request( + 'indexer', + {}, + ProwlarrApiIndexersListSchema, + 1000 + ), + `${this.baseUrl}:indexer`, + Env.BUILTIN_PROWLARR_INDEXERS_CACHE_TTL + ); + } + + async search({ + query, + indexerIds, + type, + limit, + offset, + }: { + query: string; + indexerIds: number[]; + type: 'search'; + limit?: number; + offset?: number; + }): Promise> { + return this.searchCache.wrap( + () => + this.request( + 'search', + { + query, + type, + indexerIds, + ...(limit !== undefined && { limit }), + ...(offset !== undefined && { offset }), + }, + ProwlarrApiSearchSchema + ), + `${this.baseUrl}:search:${query}`, + Env.BUILTIN_PROWLARR_SEARCH_CACHE_TTL + ); + } + + private getPath(endpoint: string) { + return `${this.baseUrl}${this.baseApiPath}/${endpoint}`; + } + + private async request( + endpoint: string, + params: Record< + string, + string | number | boolean | (string | number)[] + > = {}, + schema: z.ZodType, + timeout?: number + ): Promise> { + const { result } = await DistributedLock.getInstance().withLock( + `${this.getPath(endpoint)}:${JSON.stringify(params)}`, + () => this._request(endpoint, params, schema, timeout), + { + timeout: timeout ?? this.#timeout, + ttl: (timeout ?? this.#timeout) * 2, + } + ); + return result; + } + + private async _request( + endpoint: string, + params: Record< + string, + string | number | boolean | (string | number)[] + > = {}, + schema: z.ZodType, + timeout?: number + ): Promise> { + const url = new URL(this.getPath(endpoint)); + const headers = this.#headers; + + // Create URLSearchParams and handle array parameters + const searchParams = new URLSearchParams(); + for (const [key, value] of Object.entries(params)) { + if (Array.isArray(value)) { + // Handle array parameters by adding multiple entries with the same key + value.forEach((item) => searchParams.append(key, String(item))); + } else { + // Handle non-array parameters + searchParams.append(key, String(value)); + } + } + + url.search = searchParams.toString(); + const response = await makeRequest(url.toString(), { + method: 'GET', + headers, + timeout: timeout ?? this.#timeout, + }); + + const meta: ResponseMeta = { + headers: Object.fromEntries(response.headers.entries()), + status: response.status, + statusText: response.statusText, + }; + + if (!response.ok) { + try { + throw new ProwlarrApiError( + ProwlarrErrorSchema.parse(await response.json()).message, + response.status, + response.statusText + ); + } catch (error) { + throw new ProwlarrApiError( + `Generic HTTP error: ${response.status} - ${response.statusText}`, + response.status, + response.statusText + ); + } + } + + const { success, data, error } = schema.safeParse(await response.json()); + + if (!success) { + throw new ProwlarrApiError( + `Prowlarr API error: ${formatZodError(error)}`, + response.status, + response.statusText + ); + } + + return { + data, + meta, + }; + } +} + +export default ProwlarrApi; diff --git a/packages/core/src/builtins/prowlarr/index.ts b/packages/core/src/builtins/prowlarr/index.ts new file mode 100644 index 00000000..9762837e --- /dev/null +++ b/packages/core/src/builtins/prowlarr/index.ts @@ -0,0 +1 @@ +export * from './addon'; diff --git a/packages/core/src/builtins/torbox-search/addon.ts b/packages/core/src/builtins/torbox-search/addon.ts index fdfa1af7..c787a7e1 100644 --- a/packages/core/src/builtins/torbox-search/addon.ts +++ b/packages/core/src/builtins/torbox-search/addon.ts @@ -1,6 +1,7 @@ import { z } from 'zod'; import { Manifest, Stream } from '../../db'; import { + AnimeDatabase, createLogger, formatZodError, getTimeTakenSincePoint, @@ -8,11 +9,10 @@ import { import { TorBoxSearchAddonUserDataSchema } from './schemas'; import { TorboxApi } from '@torbox/torbox-api'; import TorboxSearchApi from './search-api'; -import { IdParser } from '../utils/id-parser'; +import { IdParser } from '../../utils/id-parser'; import { TorrentSourceHandler, UsenetSourceHandler } from './source-handlers'; import { TorBoxSearchAddonError } from './errors'; import { supportedIdTypes } from './search-api'; -import { KitsuMetadata } from '../../metadata/kitsu'; const logger = createLogger('torbox-search'); @@ -20,7 +20,6 @@ export class TorBoxSearchAddon { private readonly userData: z.infer; private readonly searchApi: TorboxSearchApi; private readonly torboxApi: TorboxApi; - private static readonly idParser: IdParser = new IdParser(supportedIdTypes); private readonly sourceHandlers: ( | TorrentSourceHandler | UsenetSourceHandler @@ -71,7 +70,7 @@ export class TorBoxSearchAddon { { name: 'stream', types: ['movie', 'series', 'anime'], - idPrefixes: TorBoxSearchAddon.idParser.supportedPrefixes, + idPrefixes: IdParser.getPrefixes(supportedIdTypes), }, ], catalogs: [], @@ -98,7 +97,9 @@ export class TorBoxSearchAddon { new UsenetSourceHandler( this.searchApi, this.torboxApi, - this.userData.searchUserEngines + this.userData.searchUserEngines, + this.userData.services, + this.clientIp ) ); } @@ -110,39 +111,29 @@ export class TorBoxSearchAddon { } public async getStreams(type: string, id: string): Promise { - const parsedId = TorBoxSearchAddon.idParser.parse(id); - if (!parsedId) { + const parsedId = IdParser.parse(id, type); + if (!parsedId || !supportedIdTypes.includes(parsedId.type)) { throw new TorBoxSearchAddonError(`Unsupported ID: ${id}`, 400); } - const metadataStart = Date.now(); - if ( - ['mal_id', 'kitsu_id', 'anilist_id', 'anidb_id'].includes(parsedId.type) - ) { - try { - const kitsuMetadata = new KitsuMetadata(); - const metadata = await kitsuMetadata.getMetadata(parsedId, type); - parsedId.season = metadata.seasons?.[0]?.season_number - ? metadata.seasons[0].season_number.toString() - : undefined; - logger.debug( - `Fetched season metadata for ${id} in ${getTimeTakenSincePoint(metadataStart)}:`, - { - season: parsedId.season, - } - ); - } catch (error) { - logger.error(`Error fetching anime metadata for ${id}:`, error); - } + const animeEntry = AnimeDatabase.getInstance().getEntryById( + parsedId.type, + parsedId.value + ); + if (animeEntry && !parsedId.season) { + parsedId.season = + animeEntry.imdb?.fromImdbSeason?.toString() ?? + animeEntry.trakt?.season?.toString(); + logger.debug(`Updated season for ${id} to ${parsedId.season}`); } - logger.info(`Getting streams for ${id}`, { + logger.info(`Handling stream request`, { type, id, idType: parsedId.type, + idValue: parsedId.value, season: parsedId.season, episode: parsedId.episode, - titleId: parsedId.id, sources: this.userData.sources, }); diff --git a/packages/core/src/builtins/torbox-search/debrid-service.ts b/packages/core/src/builtins/torbox-search/debrid-service.ts deleted file mode 100644 index 7ff69fb6..00000000 --- a/packages/core/src/builtins/torbox-search/debrid-service.ts +++ /dev/null @@ -1,200 +0,0 @@ -import { - Cache, - constants, - createLogger, - Env, - getSimpleTextHash, - getTimeTakenSincePoint, -} from '../../utils'; -import { DebridInterface } from '../../debrid/interface'; -import { FileParser } from '../../parser'; -import { ParsedId } from '../utils/id-parser'; -import { Torrent } from './torrent'; -import { ServiceId } from '../../utils'; -import { z } from 'zod'; -import { TorBoxSearchAddonUserDataSchema } from './schemas'; -import { findMatchingFileInTorrent, isVideoFile } from '../../debrid/utils'; -import { StremThruError } from 'stremthru'; -import { TitleMetadata } from './source-handlers'; -import { calculateAbsoluteEpisode } from '../utils/general'; - -const logger = createLogger('torbox-search'); - -export interface DebridFile { - hash: string; - filename: string; - size: number; - index?: number; - service: { - id: ServiceId; - cached: boolean; - owned: boolean; - }; -} - -export class DebridService { - private readonly debridCache = Cache.getInstance( - 'torbox-search-debrid' - ); - - private readonly debridInterface: DebridInterface; - private readonly serviceConfig: z.infer< - typeof TorBoxSearchAddonUserDataSchema - >['services'][0]; - - constructor( - serviceConfig: z.infer< - typeof TorBoxSearchAddonUserDataSchema - >['services'][0], - private readonly clientIp?: string - ) { - this.serviceConfig = serviceConfig; - this.debridInterface = new DebridInterface( - { - storeName: serviceConfig.id, - storeCredential: serviceConfig.credential, - }, - this.clientIp - ); - } - - public async getAvailableFiles( - torrents: Torrent[], - parsedId: ParsedId, - titleMetadata?: TitleMetadata - ): Promise { - const { id, season, episode } = parsedId; - const absoluteEpisode = - season && episode && titleMetadata?.seasons - ? calculateAbsoluteEpisode(season, episode, titleMetadata.seasons) - : undefined; - - const cachedResults: DebridFile[] = []; - const torrentsToCheck: Torrent[] = []; - - for (const torrent of torrents) { - const cacheKey = getSimpleTextHash( - `${this.serviceConfig.id}:${torrent.hash}` - ); - const cached = await this.debridCache.get(cacheKey); - - if (cached && cached.length > 0) { - cachedResults.push(...cached); - } else { - torrentsToCheck.push(torrent); - } - } - - let newResults: DebridFile[] = []; - - const start = Date.now(); - if (torrentsToCheck.length > 0) { - try { - const instantAvailability = await this.debridInterface.checkMagnets( - torrentsToCheck.map((t) => t.hash), - id - ); - - for (const torrent of torrentsToCheck) { - const item = instantAvailability.data.items.find( - (avail) => avail.hash === torrent.hash - ); - - let file; - - if (!item) { - logger.debug( - `[${this.serviceConfig.id}] Hash ${torrent.hash} (${torrent.title}) not found in instant availability response` - ); - - file = { name: torrent.title, size: torrent.size, index: -1 }; - } else { - file = - item.files && item.files.length > 0 - ? findMatchingFileInTorrent( - item.files.map((file) => ({ - ...file, - parsed: FileParser.parse(file.name), - isVideo: isVideoFile(file.name), - })), - torrent.fileIdx, - undefined, - titleMetadata?.titles, - season, - episode, - absoluteEpisode, - false - ) - : { name: torrent.title, size: torrent.size, index: -1 }; // Fallback for torrents with no file list - } - - if (file) { - const result: DebridFile = { - hash: torrent.hash, - filename: file.name, - size: file.size, - index: file.index !== -1 ? file.index : undefined, - service: { - id: this.serviceConfig.id, - cached: item?.status === 'cached', - owned: - this.serviceConfig.id === 'torbox' - ? (torrent.owned ?? false) - : false, - }, - }; - newResults.push(result); - - const cacheKey = getSimpleTextHash( - `${this.serviceConfig.id}:${torrent.hash}` - ); - - this.debridCache.set( - cacheKey, - [result], - Env.BUILTIN_TORBOX_SEARCH_INSTANT_AVAILABILITY_CACHE_TTL - ); - } - } - } catch (error) { - if (error instanceof StremThruError) { - logger.error( - `Got StremThru error during debrid check: ${error.code}: ${error.message}` - ); - const serviceName = - constants.SERVICE_DETAILS[this.serviceConfig.id].shortName; - switch (error.code) { - case 'FORBIDDEN': - case 'UNAUTHORIZED': - return { - error: { - title: serviceName, - description: 'Invalid/expired credentials', - }, - }; - default: - return { - error: { - title: serviceName, - description: 'Internal Server Error', - }, - }; - } - } - logger.error(`Unexpected error during debrid check:`, error); - return []; - } - } - - // count number of cached results - const cachedCount = [...cachedResults, ...newResults].filter( - (result) => result.service.cached - ).length; - - logger.debug( - `[${this.serviceConfig.id}] Checked ${torrents.length} magnets in ${getTimeTakenSincePoint(start)}. ${cachedCount} / ${torrents.length} cached` - ); - - return [...cachedResults, ...newResults]; - } -} diff --git a/packages/core/src/builtins/torbox-search/schemas.ts b/packages/core/src/builtins/torbox-search/schemas.ts index cb561055..c7f4f58e 100644 --- a/packages/core/src/builtins/torbox-search/schemas.ts +++ b/packages/core/src/builtins/torbox-search/schemas.ts @@ -1,6 +1,5 @@ import { z } from 'zod'; -import { StremThruPreset } from '../../presets/stremthru'; -import { ServiceId } from '../../utils'; +import { BuiltinDebridServices } from '../../debrid/utils'; const TorBoxApiErrorResponseSchema = z.object({ success: z.literal(false), @@ -32,7 +31,7 @@ const TorBoxSearchApiMetadataSchema = z.object({ tmdb_id: z.number().nullable(), }); -const TorBoxSearchApiTorrentSchema = z.object({ +const TorBoxSearchApiResultSchema = z.object({ hash: z.string(), raw_title: z.string(), title: z.string(), @@ -67,11 +66,9 @@ const TorBoxSearchApiTorrentSchema = z.object({ }); export const TorBoxSearchApiDataSchema = z.object({ - metadata: z.union([TorBoxSearchApiMetadataSchema, z.null()]).optional(), - torrents: z - .union([z.array(TorBoxSearchApiTorrentSchema), z.null()]) - .optional(), - nzbs: z.union([z.array(TorBoxSearchApiTorrentSchema), z.null()]).optional(), + metadata: TorBoxSearchApiMetadataSchema.nullable().optional(), + torrents: z.array(TorBoxSearchApiResultSchema).nullable().optional(), + nzbs: z.array(TorBoxSearchApiResultSchema).nullable().optional(), }); export const TorBoxApiUsenetDownloadSchema = z.object({ @@ -90,14 +87,8 @@ export const TorBoxSearchAddonUserDataSchema = z.object({ sources: z .array(z.enum(['torrent', 'usenet'])) .min(1, 'At least one source must be configured'), - services: z - .array( - z.object({ - id: z.enum( - StremThruPreset.supportedServices as [ServiceId, ...ServiceId[]] - ), - credential: z.string(), - }) - ) - .min(1, 'At least one service must be configured'), + services: BuiltinDebridServices.min( + 1, + 'At least one service must be configured' + ), }); diff --git a/packages/core/src/builtins/torbox-search/search-api.ts b/packages/core/src/builtins/torbox-search/search-api.ts index 3a326213..dd115def 100644 --- a/packages/core/src/builtins/torbox-search/search-api.ts +++ b/packages/core/src/builtins/torbox-search/search-api.ts @@ -2,12 +2,13 @@ import { fetch, RequestInit, Response } from 'undici'; import { z } from 'zod'; import { TorBoxApiResponseSchema, TorBoxSearchApiDataSchema } from './schemas'; import { - Cache, createLogger, + DistributedLock, Env, formatZodError, maskSensitiveInfo, } from '../../utils'; +import { IdType } from '../../utils/id-parser'; type TorboxSuccessResponse = { success: true; @@ -25,20 +26,20 @@ type TorboxErrorResponse = { type TorboxResponse = TorboxSuccessResponse | TorboxErrorResponse; -export const supportedIdTypes: TorboxSearchApiIdType[] = [ - 'anime-planet_id', - 'anidb_id', - 'anilist_id', - 'anisearch_id', - 'imdb_id', - 'kitsu_id', - 'livechart_id', - 'mal_id', - 'notify.moe_id', - 'thetvdb_id', - 'themoviedb_id', - 'tmdb', +export const supportedIdTypes: IdType[] = [ + 'animePlanetId', + 'anidbId', + 'anilistId', + 'anisearchId', + 'imdbId', + 'kitsuId', + 'livechartId', + 'malId', + 'notifyMoeId', + 'thetvdbId', + 'themoviedbId', ]; + export type TorboxSearchApiIdType = | 'anime-planet_id' | 'anidb_id' @@ -50,8 +51,7 @@ export type TorboxSearchApiIdType = | 'mal_id' | 'notify.moe_id' | 'thetvdb_id' - | 'themoviedb_id' - | 'tmdb'; + | 'themoviedb_id'; const logger = createLogger('torbox-search'); @@ -61,14 +61,14 @@ function isErrorResponse( return !response.success; } -export class TorboxApiError extends Error { +export class TorboxSearchApiError extends Error { constructor( message: string, public readonly statusCode: number, public readonly errorCode?: string ) { super(message); - this.name = 'TorboxApiError'; + this.name = 'TorboxSearchApiError'; } } @@ -82,23 +82,26 @@ class TorboxSearchApi { constructor(public readonly apiKey: string) {} - private createRequestLock( + private async createRequestLock( key: string, executor: () => Promise ): Promise { - if (TorboxSearchApi.ongoingRequests.has(key)) { + const { result, cached } = await DistributedLock.getInstance().withLock( + `tb-search-api:${key}`, + executor, + { + timeout: TorboxSearchApi.timeout, + ttl: TorboxSearchApi.timeout * 2, + } + ); + + if (cached) { logger.debug( - `Found ongoing request for ${key.replace(this.apiKey, maskSensitiveInfo(this.apiKey))}. Waiting for it to complete.` + `Found cached result for ${key.replace(this.apiKey, maskSensitiveInfo(this.apiKey))}` ); - return TorboxSearchApi.ongoingRequests.get(key)!; } - const requestPromise = executor().finally(() => { - TorboxSearchApi.ongoingRequests.delete(key); - }); - - TorboxSearchApi.ongoingRequests.set(key, requestPromise); - return requestPromise; + return result; } async request( @@ -137,7 +140,7 @@ class TorboxSearchApi { }); } catch (error) { if (error instanceof Error && error.name === 'TimeoutError') { - throw new TorboxApiError('Request timed out', 408, 'TIMEOUT'); + throw new TorboxSearchApiError('Request timed out', 408, 'TIMEOUT'); } throw error; } @@ -147,7 +150,7 @@ class TorboxSearchApi { const parsedResponse = TorBoxApiResponseSchema(schema).safeParse(data); if (!parsedResponse.success) { - throw new TorboxApiError( + throw new TorboxSearchApiError( `Failed to parse API response: ${formatZodError(parsedResponse.error)}`, response.status, 'PARSE_ERROR' @@ -157,7 +160,7 @@ class TorboxSearchApi { const result = parsedResponse.data as TorboxResponse; if (isErrorResponse(result)) { - throw new TorboxApiError( + throw new TorboxSearchApiError( result.detail || result.message || 'Unknown', response.status, result.error diff --git a/packages/core/src/builtins/torbox-search/source-handlers.ts b/packages/core/src/builtins/torbox-search/source-handlers.ts index a4153287..159ab129 100644 --- a/packages/core/src/builtins/torbox-search/source-handlers.ts +++ b/packages/core/src/builtins/torbox-search/source-handlers.ts @@ -1,43 +1,47 @@ import { number, z } from 'zod'; import { Stream } from '../../db'; import { + AnimeDatabase, Cache, Env, SERVICE_DETAILS, createLogger, getTimeTakenSincePoint, } from '../../utils'; -import { DebridService, DebridFile } from './debrid-service'; -import { ParsedId } from '../utils/id-parser'; +// import { DebridService, DebridFile } from './debrid-service'; +import { ParsedId } from '../../utils/id-parser'; import { TorBoxSearchAddonUserDataSchema } from './schemas'; import TorboxSearchApi, { - TorboxApiError, + TorboxSearchApiError, TorboxSearchApiIdType, } from './search-api'; import { Torrent, convertDataToTorrents } from './torrent'; import { TMDBMetadata } from '../../metadata/tmdb'; import { calculateAbsoluteEpisode } from '../utils/general'; import { TorboxApi } from '@torbox/torbox-api'; +import { processNZBs, processTorrents } from '../utils/debrid'; +import { + NZBWithSelectedFile, + TorrentWithSelectedFile, +} from '../../debrid/utils'; +import { DebridFile, PlaybackInfo } from '../../debrid'; +import { getTraktAliases } from '../../metadata/trakt'; const logger = createLogger('torbox-search'); export interface TitleMetadata { titles: string[]; - seasons?: { - number: string; - episodes: number; - }[]; + season?: number; + episode?: number; + absoluteEpisode?: number; } abstract class SourceHandler { protected searchCache = Cache.getInstance( - 'torbox-search-torrents' + 'tb-search:torrents' ); protected metadataCache = Cache.getInstance( - 'torbox-search-metadata' - ); - protected instantAvailabilityCache = Cache.getInstance( - 'tb-search-usenet-instant' + 'tb-search:metadata' ); protected errorStreams: Stream[] = []; @@ -61,7 +65,7 @@ abstract class SourceHandler { parsedId: ParsedId, type: 'torrent' | 'usenet' ): string { - let cacheKey = `${type}:${parsedId.type}:${parsedId.id}:${parsedId.season}:${parsedId.episode}`; + let cacheKey = `${type}:${parsedId.type}:${parsedId.value}:${parsedId.season}:${parsedId.episode}`; if (this.searchUserEngines) { cacheKey += `:${this.searchApi.apiKey}`; } @@ -70,54 +74,62 @@ abstract class SourceHandler { protected createStream( id: ParsedId, - torrent: Torrent, - file: DebridFile, + torrentOrNZB: TorrentWithSelectedFile | NZBWithSelectedFile, userData: z.infer, - season?: string, - episode?: string, - absoluteEpisode?: string + titleMetadata?: TitleMetadata ): Stream & { type: 'torrent' | 'usenet' } { + if (!torrentOrNZB.service) { + throw new Error('Torrent or NZB has no service'); + } const storeAuth = { - storeName: file.service.id, - storeCredential: userData.services.find( - (service) => service.id === file.service.id + id: torrentOrNZB.service.id, + credential: userData.services.find( + (service) => service.id === torrentOrNZB.service!.id )?.credential, }; - const playbackInfo = - torrent.type === 'torrent' + // const playbackInfo: PlaybackInfo = { + // type: 'usenet', + // hash: torrent.hash, + // magnet: torrent.type === 'torrent' ? torrent.magnet : undefined, + // title: torrent.title, + // nzb: torrent.type === 'usenet' ? torrent.nzb : undefined, + // file: torrent.file, + // metadata: titleMetadata, + // }; + const playbackInfo: PlaybackInfo = + torrentOrNZB.type === 'torrent' ? { - parsedId: { - id: id.id, - type: id.type, - season: season || undefined, - episode: episode || undefined, - absoluteEpisode: absoluteEpisode || undefined, - }, type: 'torrent', - hash: torrent.hash, - index: file.index, - title: torrent.title, + hash: torrentOrNZB.hash, + sources: torrentOrNZB.sources, + // magnet: torrentOrNZB.magnet, + title: torrentOrNZB.title, + file: torrentOrNZB.file, + metadata: titleMetadata, } : { type: 'usenet', - nzb: torrent.nzb, - title: torrent.title, + nzb: torrentOrNZB.nzb, + title: torrentOrNZB.title, + hash: torrentOrNZB.hash, + file: torrentOrNZB.file, + metadata: titleMetadata, }; - const svcMeta = SERVICE_DETAILS[file.service.id]; - const name = `[${svcMeta.shortName} ${file.service.cached ? '⚡' : '⏳'}${file.service.owned ? ' ☁️' : ''}] TorBox Search`; - const description = `${torrent.title}\n${file.filename}\n${torrent.indexer ? `🔍 ${torrent.indexer}` : ''} ${torrent.seeders ? `👤 ${torrent.seeders}` : ''} ${torrent.age && torrent.age !== '0d' ? `🕒 ${torrent.age}` : ''}`; + const svcMeta = SERVICE_DETAILS[torrentOrNZB.service.id]; + const name = `[${svcMeta.shortName} ${torrentOrNZB.service.cached ? '⚡' : '⏳'}${torrentOrNZB.service.owned ? ' ☁️' : ''}] TorBox Search`; + const description = `${torrentOrNZB.title}\n${torrentOrNZB.file.name}\n${torrentOrNZB.indexer ? `🔍 ${torrentOrNZB.indexer}` : ''} ${torrentOrNZB.seeders ? `👤 ${torrentOrNZB.seeders}` : ''} ${torrentOrNZB.age && torrentOrNZB.age !== '0d' ? `🕒 ${torrentOrNZB.age}` : ''}`; return { - url: `${Env.BASE_URL}/api/v1/debrid/resolve/${encodeURIComponent(Buffer.from(JSON.stringify(storeAuth)).toString('base64'))}/${encodeURIComponent(Buffer.from(JSON.stringify(playbackInfo)).toString('base64'))}/${encodeURIComponent(file.filename || torrent.title)}`, + url: `${Env.BASE_URL}/api/v1/debrid/playback/${encodeURIComponent(Buffer.from(JSON.stringify(storeAuth)).toString('base64'))}/${encodeURIComponent(Buffer.from(JSON.stringify(playbackInfo)).toString('base64'))}/${encodeURIComponent(torrentOrNZB.file.name || torrentOrNZB.title || 'unknown')}`, name, description, - type: torrent.type, - infoHash: torrent.hash, + type: torrentOrNZB.type, + infoHash: torrentOrNZB.hash, behaviorHints: { - videoSize: file.size, - filename: file.filename, + videoSize: torrentOrNZB.file.size, + filename: torrentOrNZB.file.name, }, }; } @@ -132,10 +144,88 @@ abstract class SourceHandler { externalUrl: 'stremio:///', }; } + + protected async processMetadata( + parsedId: ParsedId, + metadata?: { + tmdb_id?: string | number | null; + titles: string[]; + globalID?: string; + title?: string; + imdb_id?: string | null; + }, + tmdbAccessToken?: string + ): Promise { + if (!metadata) return undefined; + + const { tmdb_id, titles } = metadata; + let absoluteEpisode; + + const animeEntry = AnimeDatabase.getInstance().getEntryById( + parsedId.type, + parsedId.value + ); + const tmdbId = animeEntry?.mappings?.themoviedbId ?? tmdb_id; + + const traktAliases = await getTraktAliases(parsedId); + + // For anime sources, fetch additional season info from TMDB + if (animeEntry && parsedId.season && parsedId.episode) { + const seasonFetchStart = Date.now(); + try { + const tmdbMetadata = await new TMDBMetadata({ + accessToken: tmdbAccessToken, + }).getMetadata(`tmdb:${tmdbId}`, 'series'); + + const seasons = tmdbMetadata?.seasons?.map( + ({ season_number, episode_count }) => ({ + number: season_number.toString(), + episodes: episode_count, + }) + ); + + if (seasons) { + absoluteEpisode = calculateAbsoluteEpisode( + parsedId.season.toString(), + parsedId.episode.toString(), + seasons + ); + } + + logger.debug( + `Fetched additional season info for ${parsedId.type}:${parsedId.value} in ${getTimeTakenSincePoint(seasonFetchStart)}` + ); + } catch (error) { + logger.error( + `Failed to fetch TMDB metadata for ${parsedId.type}:${parsedId.value} - ${error}` + ); + } + } + + const titleMetadata: TitleMetadata = { + titles: [...new Set([...(traktAliases ?? []), ...titles])], + season: parsedId.season ? Number(parsedId.season) : undefined, + episode: parsedId.episode ? Number(parsedId.episode) : undefined, + absoluteEpisode: absoluteEpisode ? Number(absoluteEpisode) : undefined, + }; + + // Store metadata in cache + await this.metadataCache.set( + `metadata:${parsedId.type}:${parsedId.value}`, + titleMetadata, + Env.BUILTIN_TORBOX_SEARCH_METADATA_CACHE_TTL + ); + + return titleMetadata; + } } export class TorrentSourceHandler extends SourceHandler { - private readonly debridServices: DebridService[]; + // private readonly debridServices: DebridService[]; + private readonly services: z.infer< + typeof TorBoxSearchAddonUserDataSchema + >['services']; + private readonly clientIp?: string; constructor( searchApi: TorboxSearchApi, @@ -144,27 +234,23 @@ export class TorrentSourceHandler extends SourceHandler { clientIp?: string ) { super(searchApi, searchUserEngines); - this.debridServices = services.map( - (service) => new DebridService(service, clientIp) - ); + this.services = services; + this.clientIp = clientIp; } async getStreams( parsedId: ParsedId, userData: z.infer ): Promise { - const { type, id, season, episode } = parsedId; - let torrents: Torrent[] = []; + const { type, value, season, episode } = parsedId; + let fetchResult: { torrents: Torrent[]; metadata?: TitleMetadata }; try { - torrents = await this.fetchTorrents( - type, - id, - season, - episode, + fetchResult = await this.fetchTorrents( + parsedId, userData.tmdbAccessToken ); } catch (error) { - if (error instanceof TorboxApiError) { + if (error instanceof TorboxSearchApiError) { switch (error.errorCode) { case 'BAD_TOKEN': return [ @@ -174,145 +260,108 @@ export class TorrentSourceHandler extends SourceHandler { }), ]; default: - logger.error(`Error fetching torrents for ${type}:${id}: ${error}`); + logger.error( + `Error fetching torrents for ${type}:${value}: ${error}` + ); throw error; } } logger.error( - `Unexpected error fetching torrents for ${type}:${id}: ${error}` + `Unexpected error fetching torrents for ${type}:${value}: ${error}` ); throw error; } - if (torrents.length === 0) return []; + if (fetchResult.torrents.length === 0) return []; if (userData.onlyShowUserSearchResults) { - const userSearchResults = torrents.filter( + const userSearchResults = fetchResult.torrents.filter( (torrent) => torrent.userSearch ); logger.info( - `Filtered out ${torrents.length - userSearchResults.length} torrents that were not user search results` + `Filtered out ${fetchResult.torrents.length - userSearchResults.length} torrents that were not user search results` ); if (userSearchResults.length > 0) { - torrents = userSearchResults; + fetchResult.torrents = userSearchResults; } else { return []; } } - const titleMetadata = await this.metadataCache.get( - `metadata:${type}:${id}` + const { results, errors } = await processTorrents( + fetchResult.torrents.map((torrent) => ({ + ...torrent, + type: 'torrent', + })), + this.services, + parsedId.fullId, + fetchResult.metadata, + this.clientIp ); - const filesByHash = await this.getAvailableFilesFromDebrid( - torrents, - parsedId, - titleMetadata + + results.forEach((result) => { + result.service!.owned = + fetchResult.torrents.find((torrent) => torrent.hash === result.hash) + ?.owned ?? false; + }); + + return results.map((result) => + this.createStream(parsedId, result, userData, fetchResult.metadata) ); - const absoluteEpisode = - season && episode && titleMetadata?.seasons - ? calculateAbsoluteEpisode(season, episode, titleMetadata.seasons) - : undefined; - - const streams: Stream[] = []; - for (const torrent of torrents) { - const availableFiles = filesByHash.get(torrent.hash); - if (availableFiles) { - for (const file of availableFiles) { - streams.push( - this.createStream( - parsedId, - torrent, - file, - userData, - season, - episode, - absoluteEpisode - ) - ); - } - } - } - - streams.push(...this.errorStreams); - - return streams; } private async fetchTorrents( - idType: TorboxSearchApiIdType, - id: string, - season?: string, - episode?: string, + parsedId: ParsedId, tmdbAccessToken?: string - ): Promise { - const cacheKey = this.getCacheKey( - { type: idType, id, season, episode }, - 'torrent' - ); + ): Promise<{ torrents: Torrent[]; metadata?: TitleMetadata }> { + const { type, value, season, episode, externalType } = parsedId; + const cacheKey = this.getCacheKey(parsedId, 'torrent'); const cachedTorrents = await this.searchCache.get(cacheKey); + const cachedMetadata = await this.metadataCache.get( + `metadata:${type}:${value}` + ); if ( cachedTorrents && (!this.searchUserEngines || Env.BUILTIN_TORBOX_SEARCH_CACHE_PER_USER_SEARCH_ENGINE) ) { - logger.info(`Found ${cachedTorrents.length} (cached) torrents for ${id}`); - return cachedTorrents; + logger.info( + `Found ${cachedTorrents.length} (cached) torrents for ${type}:${value}` + ); + return { torrents: cachedTorrents, metadata: cachedMetadata }; } const start = Date.now(); - const data = await this.searchApi.getTorrentsById(idType, id, { - search_user_engines: this.searchUserEngines ? 'true' : 'false', - season, - episode, - metadata: 'true', - check_owned: 'true', - }); + const data = await this.searchApi.getTorrentsById( + externalType as TorboxSearchApiIdType, + value.toString(), + { + search_user_engines: this.searchUserEngines ? 'true' : 'false', + season, + episode, + metadata: 'true', + check_owned: 'true', + } + ); const torrents = convertDataToTorrents(data.torrents); logger.info( - `Found ${torrents.length} torrents for ${id} in ${getTimeTakenSincePoint(start)}` + `Found ${torrents.length} torrents for ${type}:${value} in ${getTimeTakenSincePoint(start)}` ); + let titleMetadata: TitleMetadata | undefined; if (data.metadata) { - const { tmdb_id, titles } = data.metadata; - let seasons; - - if ( - ['kitsu_id', 'mal_id', 'anilist_id', 'anidb_id'].includes(idType) && - tmdb_id - ) { - const seasonFetchStart = Date.now(); - try { - const tmdbMetadata = await new TMDBMetadata({ - accessToken: tmdbAccessToken, - }).getMetadata(`tmdb:${tmdb_id}`, 'series'); - seasons = tmdbMetadata?.seasons?.map( - ({ season_number, episode_count }) => ({ - number: season_number.toString(), - episodes: episode_count, - }) - ); - logger.debug( - `Fetched additional season info for ${id} in ${getTimeTakenSincePoint(seasonFetchStart)}` - ); - } catch (error) { - logger.error( - `Failed to fetch TMDB metadata for ${idType}:${id} - ${error}` - ); - } - } - - this.metadataCache.set( - `metadata:${idType}:${id}`, - { titles: [...new Set(titles)], seasons }, - Env.BUILTIN_TORBOX_SEARCH_METADATA_CACHE_TTL + titleMetadata = await this.processMetadata( + parsedId, + data.metadata, + tmdbAccessToken ); } if (torrents.length === 0) { - return []; + return { torrents: [], metadata: titleMetadata }; } if (this.useCache) { @@ -328,79 +377,68 @@ export class TorrentSourceHandler extends SourceHandler { ); } - return torrents; - } - - private async getAvailableFilesFromDebrid( - torrents: Torrent[], - parsedId: ParsedId, - titleMetadata?: TitleMetadata - ): Promise> { - const allFiles = new Map(); - const servicePromises = this.debridServices.map((service) => - service.getAvailableFiles(torrents, parsedId, titleMetadata) - ); - - const results = await Promise.allSettled(servicePromises); - - for (const result of results) { - if (result.status === 'fulfilled') { - if (result.value instanceof Array) { - for (const file of result.value) { - const existing = allFiles.get(file.hash) || []; - allFiles.set(file.hash, [...existing, file]); - } - } else { - this.errorStreams.push( - this.createErrorStream({ - title: result.value.error.title, - description: result.value.error.description, - }) - ); - } - } - } - return allFiles; + return { torrents, metadata: titleMetadata }; } } export class UsenetSourceHandler extends SourceHandler { private readonly torboxApi: TorboxApi; + private readonly services: z.infer< + typeof TorBoxSearchAddonUserDataSchema + >['services']; private readonly clientIp?: string; constructor( searchApi: TorboxSearchApi, torboxApi: TorboxApi, - searchUserEngines: boolean + searchUserEngines: boolean, + services: z.infer['services'], + clientIp?: string ) { super(searchApi, searchUserEngines); this.torboxApi = torboxApi; + this.services = services.filter((service) => service.id === 'torbox'); + this.clientIp = clientIp; } async getStreams( parsedId: ParsedId, userData: z.infer ): Promise { - const { type, id, season, episode } = parsedId; + const { type, value, season, episode, externalType } = parsedId; const cacheKey = this.getCacheKey(parsedId, 'usenet'); - let usingCachedSearch = false; + let titleMetadata: TitleMetadata | undefined; let torrents = await this.searchCache.get(cacheKey); if (!torrents) { const start = Date.now(); try { - const data = await this.searchApi.getUsenetById(type, id, { - season, - episode, - check_cache: 'true', - check_owned: 'true', - search_user_engines: this.searchUserEngines ? 'true' : 'false', - }); + const data = await this.searchApi.getUsenetById( + externalType as TorboxSearchApiIdType, + value.toString(), + { + season, + episode, + check_cache: 'true', + check_owned: 'true', + search_user_engines: this.searchUserEngines ? 'true' : 'false', + metadata: 'true', + } + ); torrents = convertDataToTorrents(data.nzbs); logger.info( - `Found ${torrents.length} NZBs for ${id} in ${getTimeTakenSincePoint(start)}` + `Found ${torrents.length} NZBs for ${parsedId.type}:${parsedId.value} in ${getTimeTakenSincePoint(start)}` ); + + if (data.metadata) { + titleMetadata = await this.processMetadata( + parsedId, + data.metadata, + userData.tmdbAccessToken + ); + } + if (torrents.length === 0) { return []; } @@ -412,7 +450,7 @@ export class UsenetSourceHandler extends SourceHandler { ); } } catch (error) { - if (error instanceof TorboxApiError) { + if (error instanceof TorboxSearchApiError) { switch (error.errorCode) { case 'BAD_TOKEN': return [ @@ -422,16 +460,21 @@ export class UsenetSourceHandler extends SourceHandler { }), ]; default: - logger.error(`Error fetching NZBs for ${id}: ${error.message}`); + logger.error( + `Error fetching NZBs for ${type}:${value}: ${error.message}` + ); throw error; } } - logger.error(`Unexpected error fetching NZBs for ${id}: ${error}`); + logger.error( + `Unexpected error fetching NZBs for ${type}:${value}: ${error}` + ); throw error; } } else { - usingCachedSearch = true; - logger.info(`Found ${torrents.length} (cached) NZBs for ${id}`); + logger.info( + `Found ${torrents.length} (cached) NZBs for ${type}:${value}` + ); } if (userData.onlyShowUserSearchResults) { @@ -448,90 +491,29 @@ export class UsenetSourceHandler extends SourceHandler { } } - let instantAvailability: Map | undefined; - // when using a cached search, we need to check instant availability separately - if (usingCachedSearch) { - instantAvailability = await this.getInstantAvailability(torrents); - } + const nzbs = torrents + .filter((torrent) => torrent.nzb) + .map((torrent) => ({ + ...torrent, + type: 'usenet' as const, + nzb: torrent.nzb!, + })); - return torrents.map((torrent) => { - const file: DebridFile = { - hash: torrent.hash, - filename: torrent.title, - size: torrent.size, - index: -1, - service: { - id: 'torbox', - cached: - instantAvailability?.get(torrent.hash) ?? torrent.cached ?? false, - owned: torrent.owned ?? false, - }, - }; - return this.createStream( - parsedId, - torrent, - file, - userData, - season, - episode - ); + const { results, errors } = await processNZBs( + nzbs, + this.services, + parsedId.fullId, + titleMetadata, + this.clientIp + ); + + results.forEach((result) => { + result.service!.owned = + nzbs.find((nzb) => nzb.hash === result.hash)?.owned ?? false; }); - } - private async getInstantAvailability( - torrents: Torrent[] - ): Promise | undefined> { - const start = Date.now(); - const instantAvailability = new Map(); - - const torrentsToCheck: Torrent[] = []; - for (const torrent of torrents) { - const cachedStatus = await this.instantAvailabilityCache.get( - torrent.hash - ); - if (cachedStatus !== undefined) { - instantAvailability.set(torrent.hash, cachedStatus); - } else { - torrentsToCheck.push(torrent); - } - } - if (torrentsToCheck.length > 0) { - logger.debug( - `Checking instant availability for ${torrentsToCheck.length} NZBs` - ); - const data = await this.torboxApi.usenet.getUsenetCachedAvailability( - 'v1', - { - hash: torrentsToCheck.map((torrent) => torrent.hash).join(','), - format: 'list', - } - ); - if (!data.data?.success) { - throw new Error( - `Failed to check instant availability: ${data.data?.detail} - ${data.data?.error}` - ); - } - if (!Array.isArray(data.data.data)) { - throw new Error('Invalid response from Torbox API'); - } - for (const torrent of torrentsToCheck) { - const item = data.data.data.find((item) => item.hash === torrent.hash); - instantAvailability.set(torrent.hash, Boolean(item)); - this.instantAvailabilityCache.set( - torrent.hash, - Boolean(item), - Env.BUILTIN_TORBOX_SEARCH_INSTANT_AVAILABILITY_CACHE_TTL - ); - } - } - const cachedTorrents = torrents.filter( - (torrent) => instantAvailability.get(torrent.hash) ?? torrent.cached + return results.map((result) => + this.createStream(parsedId, result, userData, titleMetadata) ); - logger.info( - `Checked instant availability for ${torrents.length} NZBs in ${getTimeTakenSincePoint(start)}: ${cachedTorrents.length} / ${torrents.length} cached (with ${ - torrents.length - torrentsToCheck.length - } cached statuses)` - ); - return instantAvailability; } } diff --git a/packages/core/src/builtins/torbox-search/torrent.ts b/packages/core/src/builtins/torbox-search/torrent.ts index d11d094f..d25c2f2c 100644 --- a/packages/core/src/builtins/torbox-search/torrent.ts +++ b/packages/core/src/builtins/torbox-search/torrent.ts @@ -1,11 +1,13 @@ import { z } from 'zod'; import { TorBoxSearchApiDataSchema } from './schemas'; -import { ServiceId } from '../../utils'; -import { DebridFile } from './debrid-service'; +import { + extractInfoHashFromMagnet, + extractTrackersFromMagnet, +} from '../utils/debrid'; export interface Torrent { hash: string; - magnet?: string; + // magnet?: string; title: string; fileIdx?: number; size: number; @@ -13,19 +15,22 @@ export interface Torrent { age?: string; seeders?: number; type: 'torrent' | 'usenet'; + sources: string[]; nzb?: string; userSearch?: boolean; cached?: boolean; owned?: boolean; - availableFiles?: DebridFile[]; } export function convertDataToTorrents( data: z.infer['torrents'] ): Torrent[] { return (data || []).map((file) => ({ - hash: file.hash, - magnet: file.magnet ?? undefined, + hash: + file.hash ?? + (file.magnet ? extractInfoHashFromMagnet(file.magnet) : undefined), + // magnet: file.magnet ?? undefined, + sources: file.magnet ? extractTrackersFromMagnet(file.magnet) : [], title: file.raw_title, size: file.size, indexer: file.tracker, diff --git a/packages/core/src/builtins/torznab/addon.ts b/packages/core/src/builtins/torznab/addon.ts new file mode 100644 index 00000000..28ff661e --- /dev/null +++ b/packages/core/src/builtins/torznab/addon.ts @@ -0,0 +1,97 @@ +import { z } from 'zod'; +import { ParsedId } from '../../utils/id-parser'; +import { createLogger } from '../../utils'; +import { Torrent, NZB, UnprocessedTorrent } from '../../debrid'; +import { SearchMetadata } from '../base/debrid'; +import { extractTrackersFromMagnet } from '../utils/debrid'; +import { BaseNabApi, Capabilities } from '../base/nab/api'; +import { + BaseNabAddon, + NabAddonConfigSchema, + NabAddonConfig, +} from '../base/nab/addon'; + +const logger = createLogger('torznab'); + +// API client is now just a thin wrapper +class TorznabApi extends BaseNabApi<'torznab'> { + constructor(baseUrl: string, apiKey?: string, apiPath?: string) { + super('torznab', logger, baseUrl, apiKey, apiPath); + } +} + +// Addon class +export class TorznabAddon extends BaseNabAddon { + readonly name = 'Torznab'; + readonly version = '1.0.0'; + readonly id = 'torznab'; + readonly logger = logger; + readonly api: TorznabApi; + + constructor(userData: NabAddonConfig, clientIp?: string) { + super(userData, NabAddonConfigSchema, clientIp); + this.api = new TorznabApi( + this.userData.url, + this.userData.apiKey, + this.userData.apiPath + ); + } + + protected async _searchTorrents( + parsedId: ParsedId, + metadata: SearchMetadata + ): Promise { + const results = await this.performSearch(parsedId, metadata); + const seenTorrents = new Set(); + + const torrents: UnprocessedTorrent[] = []; + + for (const result of results) { + const infoHash = this.extractInfoHash(result); + const downloadUrl = result.enclosure.find( + (e: any) => + e.type === 'application/x-bittorrent' && e.url.includes('.torrent') + )?.url; + + if (!infoHash && !downloadUrl) continue; + if (seenTorrents.has(infoHash ?? downloadUrl!)) continue; + seenTorrents.add(infoHash ?? downloadUrl!); + + torrents.push({ + hash: infoHash, + downloadUrl, + sources: result.torznab?.magneturl?.toString() + ? extractTrackersFromMagnet(result.torznab.magneturl.toString()) + : [], + seeders: + typeof result.torznab?.seeders === 'number' && + ![-1, 999].includes(result.torznab.seeders) + ? result.torznab.seeders + : undefined, + title: result.title, + size: result.size ?? 0, + type: 'torrent', + }); + } + + return torrents; + } + + protected async _searchNzbs( + parsedId: ParsedId, + metadata: SearchMetadata + ): Promise { + // This addon does not support NZBs, so we return an empty array. + return []; + } + + private extractInfoHash(result: any): string | undefined { + return ( + result.torznab?.infohash?.toString() || + result.torznab?.magneturl + ?.toString() + ?.match(/(?:urn(?::|%3A)btih(?::|%3A))([a-f0-9]{40})/i)?.[1] + ?.toLowerCase() + ); + } +} diff --git a/packages/core/src/builtins/torznab/index.ts b/packages/core/src/builtins/torznab/index.ts new file mode 100644 index 00000000..9762837e --- /dev/null +++ b/packages/core/src/builtins/torznab/index.ts @@ -0,0 +1 @@ +export * from './addon'; diff --git a/packages/core/src/builtins/utils/debrid.ts b/packages/core/src/builtins/utils/debrid.ts new file mode 100644 index 00000000..24b6c928 --- /dev/null +++ b/packages/core/src/builtins/utils/debrid.ts @@ -0,0 +1,391 @@ +// utility function for debrid-based builtins + +import z from 'zod'; +import { + BuiltinServiceId, + constants, + createLogger, + getTimeTakenSincePoint, +} from '../../utils'; +import { + BuiltinDebridServices, + DebridDownload, + DebridError, + DebridFile, + getDebridService, + selectFileInTorrentOrNZB, + Torrent, + TorrentWithSelectedFile, + NZBWithSelectedFile, + NZB, + isSeasonWrong, + isEpisodeWrong, +} from '../../debrid'; +import { PTT } from '../../parser'; +import { ParseResult } from 'go-ptt'; + +// we have a list of torrents which need to be +// - 1. checked for instant availability for each configured debrid service +// - 2. pick a file from file list if available +// - 3. return list of torrents but with service info too. + +const logger = createLogger('debrid'); + +// export function + +interface Metadata { + titles: string[]; + season?: number; + episode?: number; + absoluteEpisode?: number; +} + +export function extractTrackersFromMagnet(magnet: string): string[] { + return new URL(magnet.replace('&', '&')).searchParams.getAll('tr'); +} + +export function extractInfoHashFromMagnet(magnet: string): string | undefined { + return magnet + .match(/(?:urn(?::|%3A)btih(?::|%3A))([a-f0-9]{40})/i)?.[1] + ?.toLowerCase(); +} + +export async function processTorrents( + torrents: Torrent[], + debridServices: BuiltinDebridServices, + stremioId: string, + metadata?: Metadata, + clientIp?: string +): Promise<{ + results: TorrentWithSelectedFile[]; + errors: { serviceId: BuiltinServiceId; error: Error }[]; +}> { + if (torrents.length === 0) { + return { results: [], errors: [] }; + } + const results: TorrentWithSelectedFile[] = []; + const errors: { serviceId: BuiltinServiceId; error: Error }[] = []; + + // Run all service checks in parallel and collect both results and errors + const servicePromises = debridServices.map(async (service) => { + try { + const serviceResults = await processTorrentsForDebridService( + torrents, + service, + stremioId, + metadata, + clientIp + ); + return { serviceId: service.id, results: serviceResults, error: null }; + } catch (error) { + logger.error( + `Error processing torrents for ${service.id}: ${error}`, + error + ); + return { serviceId: service.id, results: [], error }; + } + }); + + const settledResults = await Promise.all(servicePromises); + + for (const { results: serviceResults, error, serviceId } of settledResults) { + if (serviceResults && serviceResults.length > 0) { + results.push(...serviceResults); + } + if (error instanceof Error) { + errors.push({ serviceId, error }); + } + } + + return { results, errors }; +} + +async function processTorrentsForDebridService( + torrents: Torrent[], + service: BuiltinDebridServices[number], + stremioId: string, + metadata?: Metadata, + clientIp?: string +): Promise { + const startTime = Date.now(); + const debridService = getDebridService( + service.id, + service.credential, + clientIp + ); + + const results: TorrentWithSelectedFile[] = []; + + const magnetCheckResults = await debridService.checkMagnets( + torrents.map((torrent) => torrent.hash), + stremioId + ); + + const allStrings: string[] = []; + + // First add all torrent titles + for (const torrent of torrents) { + allStrings.push(torrent.title ?? ''); + } + + // Then add all filenames from all torrents + for (const torrent of magnetCheckResults) { + if (torrent.files && Array.isArray(torrent.files)) { + for (const file of torrent.files) { + allStrings.push(file.name ?? ''); + } + } + } + + // Parse all strings in one call + const allParsedResults = await PTT.parse(allStrings); + + // Split the results into parsed titles and files + const parsedFiles = new Map(); + for (const [index, result] of allParsedResults.entries()) { + if (result) { + parsedFiles.set(allStrings[index], result); + } + } + + for (const [index, torrent] of torrents.entries()) { + let file: DebridFile | undefined; + + const magnetCheckResult = magnetCheckResults.find( + (result) => result.hash === torrent.hash + ); + + const parsedTorrent = parsedFiles.get(torrent.title ?? ''); + if (metadata && parsedTorrent) { + if (isSeasonWrong(parsedTorrent, metadata)) { + continue; + } + if (isEpisodeWrong(parsedTorrent, metadata)) { + continue; + } + } + file = magnetCheckResult + ? await selectFileInTorrentOrNZB( + torrent, + magnetCheckResult, + parsedFiles, + metadata + ) + : { name: torrent.title, size: torrent.size, index: -1 }; + + if (file) { + results.push({ + ...torrent, + file, + service: { + id: service.id, + cached: magnetCheckResult?.status === 'cached', + owned: false, + }, + }); + } + } + + logger.debug( + `Processed ${torrents.length} torrents for ${service.id} in ${getTimeTakenSincePoint(startTime)}` + ); + + return results; +} + +export async function processTorrentsForP2P( + torrents: Torrent[], + metadata?: Metadata +): Promise { + const results: TorrentWithSelectedFile[] = []; + + const allStrings: string[] = []; + for (const torrent of torrents) { + allStrings.push(torrent.title ?? ''); + if (torrent.files && Array.isArray(torrent.files)) { + for (const file of torrent.files) { + allStrings.push(file.name ?? ''); + } + } + } + + const allParsedResults = await PTT.parse(allStrings); + const parsedFiles = new Map(); + for (const [index, result] of allParsedResults.entries()) { + if (result) { + parsedFiles.set(allStrings[index], result); + } + } + + for (const [index, torrent] of torrents.entries()) { + let file: DebridFile | undefined; + + const parsedTorrent = parsedFiles.get(torrent.title ?? ''); + if (metadata && parsedTorrent) { + if (isSeasonWrong(parsedTorrent, metadata)) { + continue; + } + if (isEpisodeWrong(parsedTorrent, metadata)) { + continue; + } + } + file = torrent.files + ? await selectFileInTorrentOrNZB( + torrent, + { + id: 'p2p', + name: torrent.title, + size: torrent.size, + status: 'downloaded', + files: torrent.files, + }, + parsedFiles, + metadata + ) + : undefined; + + if (file) { + results.push({ + ...torrent, + file, + }); + } + } + + return results; +} + +export async function processNZBs( + nzbs: NZB[], + debridServices: BuiltinDebridServices, + stremioId: string, + metadata?: Metadata, + clientIp?: string +): Promise<{ + results: NZBWithSelectedFile[]; + errors: { serviceId: BuiltinServiceId; error: Error }[]; +}> { + if (nzbs.length === 0) { + return { results: [], errors: [] }; + } + const results: NZBWithSelectedFile[] = []; + const errors: { serviceId: BuiltinServiceId; error: Error }[] = []; + + const servicePromises = debridServices.map(async (service) => { + try { + const serviceResults = await processNZBsForDebridService( + nzbs, + service, + stremioId, + metadata, + clientIp + ); + return { serviceId: service.id, results: serviceResults, error: null }; + } catch (error) { + logger.error(`Error processing NZBs for ${service.id}: ${error}`, error); + return { serviceId: service.id, results: [], error }; + } + }); + + const settledResults = await Promise.all(servicePromises); + + for (const { results: serviceResults, error, serviceId } of settledResults) { + if (serviceResults && serviceResults.length > 0) { + results.push(...serviceResults); + } + if (error instanceof Error) { + errors.push({ serviceId, error }); + } + } + + return { results, errors }; +} + +async function processNZBsForDebridService( + nzbs: NZB[], + service: BuiltinDebridServices[number], + stremioId: string, + metadata?: Metadata, + clientIp?: string +): Promise { + const startTime = Date.now(); + const debridService = getDebridService( + service.id, + service.credential, + clientIp + ); + + if (!debridService.supportsUsenet || !debridService.checkNzbs) { + throw new Error(`Service ${service.id} does not support usenet`); + } + + const results: NZBWithSelectedFile[] = []; + + const nzbCheckResults = await debridService.checkNzbs( + nzbs.map((nzb) => nzb.hash) + ); + + // parse all files from all nzbs in one call + + const allStrings: string[] = []; + + for (const nzb of nzbCheckResults) { + allStrings.push(nzb.name ?? ''); + if (nzb.files && Array.isArray(nzb.files)) { + for (const file of nzb.files) { + allStrings.push(file.name ?? ''); + } + } + } + + const allParsedResults = await PTT.parse(allStrings); + const parsedFiles = new Map(); + for (const [index, result] of allParsedResults.entries()) { + if (result) { + parsedFiles.set(allStrings[index], result); + } + } + + for (const [index, nzb] of nzbs.entries()) { + let file: DebridFile | undefined; + + const nzbCheckResult = nzbCheckResults.find( + (result) => result.hash === nzb.hash + ); + const parsedNzb = parsedFiles.get(nzb.title ?? ''); + if (metadata && parsedNzb) { + if (isSeasonWrong(parsedNzb, metadata)) { + continue; + } + if (isEpisodeWrong(parsedNzb, metadata)) { + continue; + } + } + file = nzbCheckResult + ? await selectFileInTorrentOrNZB( + nzb, + nzbCheckResult, + parsedFiles, + metadata + ) + : { name: nzb.title, size: nzb.size, index: -1 }; + + if (file) { + results.push({ + ...nzb, + file, + service: { + id: service.id, + cached: nzbCheckResult?.status === 'cached', + owned: false, + }, + }); + } + } + + logger.debug( + `Processed ${nzbs.length} NZBs for ${service.id} in ${getTimeTakenSincePoint(startTime)}` + ); + + return results; +} diff --git a/packages/core/src/builtins/utils/id-parser.ts b/packages/core/src/builtins/utils/id-parser.ts deleted file mode 100644 index a00bccdb..00000000 --- a/packages/core/src/builtins/utils/id-parser.ts +++ /dev/null @@ -1,92 +0,0 @@ -import { TorboxSearchApiIdType } from '../torbox-search/search-api'; - -export interface ParsedId { - type: TorboxSearchApiIdType; - id: string; - season?: string; - episode?: string; -} - -interface IdParserDefinition { - type: TorboxSearchApiIdType; - prefixes: string[]; - // Regex should have named capture groups: - // - id: the base ID (required) - // - season: the season number (optional) - // - episode: the episode number (optional) - regex: RegExp; - format: (id: string) => string; -} - -export class IdParser { - private readonly ID_PARSERS: IdParserDefinition[] = [ - { - type: 'imdb_id', - prefixes: ['tt', 'imdb'], - regex: /^(?:tt|imdb)[:-]?(?\d+)(?::(?\d+):(?\d+))?$/, - format: (id) => `tt${id}`, - }, - { - type: 'mal_id', - prefixes: ['mal'], - regex: /^mal[:-]?(?\d+)(?::(?\d+))?$/, - format: (id) => id, - }, - { - type: 'thetvdb_id', - prefixes: ['tvdb'], - regex: /^tvdb[:-]?(?\d+)(?::(?\d+):(?\d+))?$/, - format: (id) => id, - }, - { - type: 'tmdb', - prefixes: ['tmdb'], - regex: /^tmdb[:-]?(?\d+)(?::(?\d+):(?\d+))?$/, - format: (id) => id, - }, - { - type: 'kitsu_id', - prefixes: ['kitsu'], - regex: /^kitsu[:-]?(?\d+)(?::(?\d+))?$/, - format: (id) => id, - }, - { - type: 'anilist_id', - prefixes: ['anilist'], - regex: /^anilist[:-]?(?\d+)(?::(?\d+))?$/, - format: (id) => id, - }, - { - type: 'anidb_id', - prefixes: ['anidb', 'anidb_id', 'anidbid'], - regex: /^(?:anidb|anidb_id|anidbid)[:-]?(?\d+)(?::(?\d+))?$/, - format: (id) => id, - }, - ]; - - constructor(private readonly supportedIdTypes: TorboxSearchApiIdType[]) {} - - public readonly supportedPrefixes = this.ID_PARSERS.filter((p) => - this.supportedIdTypes.includes(p.type) - ).flatMap((p) => p.prefixes); - - public parse(stremioId: string): ParsedId | null { - for (const parser of this.ID_PARSERS) { - const match = stremioId.match(parser.regex); - if (match?.groups) { - const { id, season, episode } = match.groups; - const parsedId: ParsedId = { - type: parser.type, - id: parser.format(id), - }; - - if (season) parsedId.season = season; - if (episode) parsedId.episode = episode; - - return parsedId; - } - } - - return null; - } -} diff --git a/packages/core/src/db/db.ts b/packages/core/src/db/db.ts index 8f250008..041d2294 100644 --- a/packages/core/src/db/db.ts +++ b/packages/core/src/db/db.ts @@ -53,6 +53,17 @@ export class DB { return DB.dialect; } + isSQLite(): boolean { + return this.getDialect() === 'sqlite'; + } + + getRowsAffected(result: any): number { + if (this.isSQLite()) { + return result.changes || 0; + } + return result.rowCount || 0; + } + async initialise( uri: string, dsnModifiers: DSNModifier[] = [] @@ -77,7 +88,6 @@ export class DB { await this.execute('PRAGMA foreign_keys = ON'); await this.execute('PRAGMA synchronous = OFF'); await this.execute('PRAGMA journal_mode = WAL'); - await this.execute('PRAGMA locking_mode = IMMEDIATE'); } DB.initialised = true; @@ -204,25 +214,52 @@ export class DB { }, }; } else if (this.uri.dialect === 'sqlite') { - const db = this.db as Database; - await db.run('BEGIN'); + // For sqlite, we manually manage the transaction state. + await (this.db as Database).exec('BEGIN'); + let isFinalised = false; + return { commit: async () => { - await db.run('COMMIT'); + if (isFinalised) return; + await (this.db as Database).exec('COMMIT'); + isFinalised = true; }, rollback: async () => { - await db.run('ROLLBACK'); + if (isFinalised) return; + await (this.db as Database).exec('ROLLBACK'); + isFinalised = true; }, execute: async ( query: string, params?: any[] ): Promise => { - const result = await db.all(adaptQuery(query, 'sqlite'), params); - return { - rows: result, - rowCount: result.length || 0, - command: 'SELECT', - }; + if (isFinalised) { + throw new Error('Transaction has already been finalised.'); + } + const adaptedQuery = adaptQuery(query, 'sqlite'); + const command = adaptedQuery.trim().split(' ')[0].toUpperCase(); + + if (['INSERT', 'UPDATE', 'DELETE'].includes(command)) { + const result = await (this.db as Database).run( + adaptedQuery, + params + ); + return { + rows: [], + rowCount: result.changes || 0, + command: command, + }; + } else { + const rows = await (this.db as Database).all( + adaptedQuery, + params + ); + return { + rows: rows, + rowCount: rows.length, + command: command, + }; + } }, }; } diff --git a/packages/core/src/db/queue.ts b/packages/core/src/db/queue.ts index f7b9cbfa..e0def3b5 100644 --- a/packages/core/src/db/queue.ts +++ b/packages/core/src/db/queue.ts @@ -1,12 +1,17 @@ import { createLogger } from '../utils'; import { DB } from './db'; + const logger = createLogger('db'); const db = DB.getInstance(); -// Queue for SQLite transactions +interface QueuedOperation { + operation: () => Promise; + resolve: (value: T | PromiseLike) => void; + reject: (reason?: any) => void; +} export class TransactionQueue { - private queue: Array<() => Promise> = []; + private queue: Array> = []; private processing = false; private static instance: TransactionQueue; @@ -21,38 +26,34 @@ export class TransactionQueue { async enqueue(operation: () => Promise): Promise { // If using PostgreSQL, execute directly without queuing - if (db['uri']?.dialect === 'postgres') { + if (db.getDialect() === 'postgres') { return operation(); } - return new Promise((resolve, reject) => { - this.queue.push(async () => { - try { - const result = await operation(); - resolve(result); - } catch (error) { - reject(error); - } - }); + return new Promise((resolve, reject) => { + this.queue.push({ operation, resolve, reject }); this.processQueue(); }); } private async processQueue() { - if (this.processing || this.queue.length === 0) return; + if (this.processing || this.queue.length === 0) { + return; + } this.processing = true; - while (this.queue.length > 0) { - const operation = this.queue.shift(); - if (operation) { - try { - await operation(); - } catch (error) { - logger.error('Error processing queued operation:', error); - } - } - } + const { operation, resolve, reject } = this.queue.shift()!; - this.processing = false; + try { + const result = await operation(); + resolve(result); + } catch (error) { + logger.error('Error processing queued operation:', error); + reject(error); + } finally { + this.processing = false; + // After finishing one operation, check if there are more in the queue + this.processQueue(); + } } } diff --git a/packages/core/src/db/schemas.ts b/packages/core/src/db/schemas.ts index 92e15f79..3e7c282b 100644 --- a/packages/core/src/db/schemas.ts +++ b/packages/core/src/db/schemas.ts @@ -453,6 +453,12 @@ export const TABLES = { updated_at TIMESTAMP DEFAULT (CURRENT_TIMESTAMP), accessed_at TIMESTAMP DEFAULT (CURRENT_TIMESTAMP) `, + distributed_locks: ` + key TEXT PRIMARY KEY, + owner TEXT NOT NULL, + expires_at BIGINT NOT NULL, + result TEXT + `, }; const strictManifestResourceSchema = z.object({ diff --git a/packages/core/src/debrid/base.ts b/packages/core/src/debrid/base.ts new file mode 100644 index 00000000..d75b4e42 --- /dev/null +++ b/packages/core/src/debrid/base.ts @@ -0,0 +1,178 @@ +import { z } from 'zod'; +import { constants, ServiceId } from '../utils'; +import { ErrorType, StremThruError } from 'stremthru'; +// type ErrorCode = "BAD_GATEWAY" | "BAD_REQUEST" | "CONFLICT" | "FORBIDDEN" | "GONE" | "INTERNAL_SERVER_ERROR" | "METHOD_NOT_ALLOWED" | "NOT_FOUND" | "NOT_IMPLEMENTED" | "PAYMENT_REQUIRED" | "PROXY_AUTHENTICATION_REQUIRED" | "SERVICE_UNAVAILABLE" | "STORE_LIMIT_EXCEEDED" | "STORE_MAGNET_INVALID" | "TOO_MANY_REQUESTS" | "UNAUTHORIZED" | "UNAVAILABLE_FOR_LEGAL_REASONS" | "UNKNOWN" | "UNPROCESSABLE_ENTITY" | "UNSUPPORTED_MEDIA_TYPE"; + +StremThruError; + +type DebridErrorCode = + | 'BAD_GATEWAY' + | 'BAD_REQUEST' + | 'CONFLICT' + | 'FORBIDDEN' + | 'GONE' + | 'INTERNAL_SERVER_ERROR' + | 'METHOD_NOT_ALLOWED' + | 'NOT_FOUND' + | 'NOT_IMPLEMENTED' + | 'PAYMENT_REQUIRED' + | 'PROXY_AUTHENTICATION_REQUIRED' + | 'SERVICE_UNAVAILABLE' + | 'STORE_LIMIT_EXCEEDED' + | 'STORE_MAGNET_INVALID' + | 'TOO_MANY_REQUESTS' + | 'UNAUTHORIZED' + | 'UNAVAILABLE_FOR_LEGAL_REASONS' + | 'UNKNOWN' + | 'UNPROCESSABLE_ENTITY' + | 'UNSUPPORTED_MEDIA_TYPE' + | 'NO_MATCHING_FILE'; +type DebridErrorType = + | 'api_error' + | 'store_error' + | 'unknown_error' + | 'upstream_error'; + +export class DebridError extends Error { + body?: unknown; + code?: DebridErrorCode = 'UNKNOWN'; + headers: Record; + statusCode: number; + statusText: string; + cause?: unknown; + type?: DebridErrorType = 'unknown_error'; + constructor( + message: string, + options: Pick< + DebridError, + 'body' | 'code' | 'headers' | 'statusCode' | 'statusText' | 'type' + > & { cause?: unknown } + ) { + super(message); + + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + + if (options?.cause) { + this.cause = options.cause; + delete options.cause; + } + + if (options.body) { + this.body = options.body; + } + + this.headers = options.headers; + this.statusCode = options.statusCode; + this.statusText = options.statusText; + + if (options.type) { + this.type = options.type; + } + if (options.code) { + this.code = options.code; + } + } +} + +const DebridFileSchema = z.object({ + id: z.number().optional(), + name: z.string().optional(), + size: z.number(), + mimeType: z.string().optional(), + link: z.string().optional(), + path: z.string().optional(), + index: z.number().optional(), +}); + +export type DebridFile = z.infer; + +export interface DebridDownload { + id: string | number; + hash?: string; + name?: string; + size?: number; + status: + | 'cached' + | 'downloaded' + | 'downloading' + | 'failed' + | 'invalid' + | 'processing' + | 'queued' + | 'unknown' + | 'uploading'; + files?: DebridFile[]; +} + +const BasePlaybackInfoSchema = z.object({ + // hash: z.string(), + title: z.string().optional(), + metadata: z + .object({ + titles: z.array(z.string()), + season: z.number().optional(), + episode: z.number().optional(), + absoluteEpisode: z.number().optional(), + }) + .optional(), + file: DebridFileSchema.optional(), +}); + +const TorrentPlaybackInfoSchema = BasePlaybackInfoSchema.extend({ + hash: z.string(), + sources: z.array(z.string()), + // magnet: z.string().optional(), + type: z.literal('torrent'), +}); + +const UsenetPlaybackInfoSchema = BasePlaybackInfoSchema.extend({ + hash: z.string(), + nzb: z.string(), + type: z.literal('usenet'), +}); + +export const PlaybackInfoSchema = z.discriminatedUnion('type', [ + TorrentPlaybackInfoSchema, + UsenetPlaybackInfoSchema, +]); + +export const ServiceAuthSchema = z.object({ + id: z.enum(constants.BUILTIN_SUPPORTED_SERVICES), + credential: z.string(), +}); +export type ServiceAuth = z.infer; + +export type PlaybackInfo = z.infer; + +export interface DebridService { + // Common methods + resolve( + playbackInfo: PlaybackInfo, + filename: string + ): Promise; + + // Torrent specific methods + checkMagnets(magnets: string[], sid?: string): Promise; + addMagnet(magnet: string): Promise; + generateTorrentLink(link: string, clientIp?: string): Promise; + + // Usenet specific methods + checkNzbs?(nzbs: string[]): Promise; + addNzb?(nzb: string, name: string): Promise; + generateUsenetLink?( + downloadId: string, + fileId?: string, + clientIp?: string + ): Promise; + + // Service info + readonly serviceName: ServiceId; + readonly supportsUsenet: boolean; +} + +export type DebridServiceConfig = { + token: string; + clientIp?: string; +}; diff --git a/packages/core/src/debrid/index.ts b/packages/core/src/debrid/index.ts index fc141f79..574dce2a 100644 --- a/packages/core/src/debrid/index.ts +++ b/packages/core/src/debrid/index.ts @@ -1 +1,31 @@ -export * from './interface'; +export * from './base'; +export * from './utils'; +export * from './stremthru'; +export * from './torbox'; + +import { ServiceId } from '../utils'; +import { DebridService, DebridServiceConfig } from './base'; +import { StremThruInterface } from './stremthru'; +import { TorboxDebridService } from './torbox'; +import { StremThruPreset } from '../presets/stremthru'; + +export function getDebridService( + serviceName: ServiceId, + token: string, + clientIp?: string +): DebridService { + const config: DebridServiceConfig = { + token, + clientIp, + }; + + switch (serviceName) { + case 'torbox': + return new TorboxDebridService(config); + default: + if (StremThruPreset.supportedServices.includes(serviceName)) { + return new StremThruInterface({ ...config, serviceName }); + } + throw new Error(`Unknown debrid service: ${serviceName}`); + } +} diff --git a/packages/core/src/debrid/interface.ts b/packages/core/src/debrid/interface.ts deleted file mode 100644 index 433cbe76..00000000 --- a/packages/core/src/debrid/interface.ts +++ /dev/null @@ -1,355 +0,0 @@ -import { StremThru, StremThruError } from 'stremthru'; -import { constants, Env, ServiceId, createLogger, Cache } from '../utils'; -import { TorboxApi } from '@torbox/torbox-api'; -import { z } from 'zod'; -import { FileParser } from '../parser'; -import { findMatchingFileInTorrent, isVideoFile } from './utils'; -import { title } from 'process'; - -const logger = createLogger('debrid'); - -export type DebridErrorCode = 'NO_MATCHING_FILE'; -export class DebridError extends Error { - constructor( - message: string, - public readonly code: DebridErrorCode - ) { - super(message); - } -} - -interface UsenetDownload { - usenetDownloadId: number; - authId?: string; - hash?: string; - name?: string; - status: 'downloaded' | 'downloading' | 'queued'; - files: { - id?: number; - size?: number; - mimeType?: string; - name?: string; - }[]; -} - -export const getProvider = ( - storeName: ServiceId, - storeCredential: string, - clientIp?: string -): StremThru => { - return new StremThru({ - baseUrl: Env.BUILTIN_STREMTHRU_URL, - userAgent: Env.DEFAULT_USER_AGENT, - auth: { - store: storeName, - token: storeCredential, - }, - clientIp, - timeout: 20000, - }); -}; - -type StoreAuth = { - storeName: ServiceId; - storeCredential: string; -}; - -export const StoreAuthSchema = z.object({ - storeName: z.enum(constants.SERVICES), - storeCredential: z.string(), -}); - -const TorrentPlaybackInfoSchema = z.object({ - parsedId: z.object({ - id: z.string(), - type: z.string(), - season: z.string().optional(), - episode: z.string().optional(), - absoluteEpisode: z.string().optional(), - }), - type: z.literal('torrent'), - hash: z.string(), - title: z.string().optional(), - magnet: z.string().optional(), - index: z.number().optional(), -}); - -const UsenetPlaybackInfoSchema = z.object({ - type: z.literal('usenet'), - title: z.string().optional(), - nzb: z.string(), -}); - -export const PlaybackInfoSchema = z.discriminatedUnion('type', [ - TorrentPlaybackInfoSchema, - UsenetPlaybackInfoSchema, -]); - -type PlaybackInfo = z.infer; - -export class DebridInterface { - private readonly stremthru: StremThru; - private readonly torboxApi: TorboxApi | undefined; - private static playbackLinkCache = Cache.getInstance( - 'debrid-link' - ); - - constructor( - private readonly storeAuth: StoreAuth, - private readonly clientIp?: string - ) { - const { storeName, storeCredential } = storeAuth; - this.stremthru = getProvider(storeName, storeCredential, clientIp); - if (storeName === 'torbox') { - this.torboxApi = new TorboxApi({ - token: storeCredential, - }); - } - } - - public async checkMagnets(magnets: string[], sid?: string) { - return await this.stremthru.store.checkMagnet({ - magnet: magnets, - sid, - }); - } - - public async resolve( - playbackInfo: PlaybackInfo, - filename: string - ): Promise { - if (playbackInfo.type === 'torrent') { - logger.debug(`Resolving torrent ${playbackInfo.hash}`); - return await this.resolveTorrent(playbackInfo, filename); - } else { - logger.debug(`Resolving usenet ${playbackInfo.nzb}`); - return await this.resolveUsenet(playbackInfo, filename); - } - } - - private async resolveTorrent( - playbackInfo: PlaybackInfo & { type: 'torrent' }, - filename: string - ): Promise { - let { hash, index, parsedId } = playbackInfo; - const cacheKey = `${this.storeAuth.storeName}:${hash}:${index ?? 'undefined'}:${this.storeAuth.storeCredential}:${this.clientIp}`; - const cachedLink = await DebridInterface.playbackLinkCache.get(cacheKey); - if (cachedLink) { - logger.debug(`Using cached link for ${hash}`); - return cachedLink; - } - if (index === -1) { - index = undefined; - } - - logger.debug( - `Adding magnet to ${this.storeAuth.storeName} for ${playbackInfo.magnet || `magnet:?xt=urn:btih:${hash}`}` - ); - const magnet = await this.stremthru.store.addMagnet({ - magnet: playbackInfo.magnet || `magnet:?xt=urn:btih:${hash}`, - }); - - if (magnet.data.status !== 'downloaded') { - return undefined; - } - - // parse files first - const files = magnet.data.files.map((file) => { - return { - parsed: FileParser.parse(file.name), - isVideo: isVideoFile(file.name), - index: file.index, - name: file.name, - size: file.size, - link: file.link, - path: file.path, - }; - }); - - const file = findMatchingFileInTorrent( - files, - index, - filename, - undefined, - parsedId.season, - parsedId.episode, - parsedId.absoluteEpisode, - true - ); - - if (!file || !file.link) { - throw new DebridError('No matching file found', 'NO_MATCHING_FILE'); - } - - logger.debug(`Found matching file`, { - season: parsedId.season, - episode: parsedId.episode, - absoluteEpisode: parsedId.absoluteEpisode, - chosenFile: file.name, - availableFiles: `[${files.map((file) => file.name).join(', ')}]`, - }); - - const link = await this.stremthru.store.generateLink({ - link: file.link, - clientIp: this.clientIp, - }); - - const playbackLink = link.data.link; - await DebridInterface.playbackLinkCache.set( - cacheKey, - playbackLink, - 60 * 30 - ); - return playbackLink; - } - - private async resolveUsenet( - playbackInfo: PlaybackInfo & { type: 'usenet' }, - filename: string - ): Promise { - const { nzb } = playbackInfo; - const cacheKey = `${this.storeAuth.storeName}:${this.storeAuth.storeCredential}:${nzb}:${this.clientIp}`; - const cachedLink = await DebridInterface.playbackLinkCache.get(cacheKey); - if (cachedLink) { - logger.debug(`Using cached link for ${nzb}`); - return cachedLink; - } - - if (!this.torboxApi) { - throw new Error('Torbox API not available'); - } - - const usenetDownload = await this.addUsenetDownload({ - link: nzb, - name: filename, - }); - - if (!usenetDownload || usenetDownload.status !== 'downloaded') { - return undefined; - } - - if (!usenetDownload.files.length) { - throw new Error('No files found for usenet download'); - } - let fileId: number | undefined; - if (usenetDownload.files.length > 1) { - const files = usenetDownload.files.map((file) => { - return { - parsed: FileParser.parse(file.name ?? ''), - isVideo: - file.mimeType?.includes('video') || isVideoFile(file.name ?? ''), - index: file.id ?? 0, - name: file.name ?? '', - size: file.size ?? 0, - }; - }); - - const file = findMatchingFileInTorrent(files); - - if (!file) { - throw new Error('No matching file found'); - } - - logger.debug(`Found matching file`, { - chosenFile: file.name, - chosenIndex: file.index, - availableFiles: `[${files.map((file) => file.name).join(', ')}]`, - }); - fileId = file.index; - } - - const link = await this.torboxApi.usenet.requestDownloadLink('v1', { - usenetId: usenetDownload.usenetDownloadId.toString(), - fileId: fileId ? fileId.toString() : undefined, - userIp: this.clientIp, - redirect: 'false', - token: this.storeAuth.storeCredential, - }); - - logger.debug( - `Requested usenet download link for ${nzb}: ${link.data?.data} ${link.metadata.status}` - ); - - const playbackLink = link.data?.data; - if (playbackLink) { - await DebridInterface.playbackLinkCache.set( - cacheKey, - playbackLink, - 60 * 30 - ); - } - return playbackLink; - } - - private async addUsenetDownload(params: { - link: string; - name: string; - }): Promise { - if (!this.torboxApi) { - throw new Error('Torbox API not available'); - } - - const { link, name } = params; - const res = await this.torboxApi.usenet.createUsenetDownload('v1', { - link, - name, - }); - - if (!res.data?.data?.usenetdownloadId) { - throw new Error(`Usenet download failed: ${res.data?.detail}`); - } - logger.debug(`Created usenet download for ${link}: ${res.data?.detail}`); - if ( - res.data?.detail && - !res.data.detail.includes('Using cached download.') - ) { - logger.debug( - `Usenet download detected to not be cached, returning undefined` - ); - return undefined; - } - let state: UsenetDownload['status'] = 'queued'; - - const nzb = await this.torboxApi?.usenet.getUsenetList('v1', { - id: res.data?.data?.usenetdownloadId?.toString(), - }); - if (!nzb?.data?.data || nzb?.data?.error || nzb.data.success === false) { - throw new Error( - `Failed to get usenet list: ${nzb?.data?.error || 'Unknown error'}${nzb?.data?.detail ? '- ' + nzb.data.detail : ''}` - ); - } else if (Array.isArray(nzb.data.data)) { - throw new Error(`Unexpected response format for usenet download`); - } - - const usenetDownload = nzb.data.data; - - if (usenetDownload.downloadFinished && usenetDownload.downloadPresent) { - state = 'downloaded'; - } else if (usenetDownload.progress && usenetDownload.progress > 0) { - state = 'downloading'; - } - const files: UsenetDownload['files'] = []; - for (const file of usenetDownload.files ?? []) { - files.push({ - id: file.id, - mimeType: file.mimetype, - name: file.shortName ?? file.name, - size: file.size, - }); - } - logger.debug(`Found matching usenet download`, { - usenetDownloadId: usenetDownload.id, - status: usenetDownload.downloadState, - state: state, - }); - - return { - usenetDownloadId: usenetDownload.id ?? res.data.data.usenetdownloadId, - authId: usenetDownload.authId ?? res.data.data.authId, - hash: usenetDownload.hash ?? res.data.data.hash, - name: usenetDownload.name ?? undefined, - status: state, - files, - }; - } -} diff --git a/packages/core/src/debrid/stremthru.ts b/packages/core/src/debrid/stremthru.ts new file mode 100644 index 00000000..d63e3979 --- /dev/null +++ b/packages/core/src/debrid/stremthru.ts @@ -0,0 +1,283 @@ +import { StremThru, StremThruError } from 'stremthru'; +import { Env, ServiceId, createLogger, getSimpleTextHash } from '../utils'; +import { selectFileInTorrentOrNZB, Torrent } from './utils'; +import { + DebridService, + DebridServiceConfig, + DebridDownload, + PlaybackInfo, + DebridError, +} from './base'; +import { Cache } from '../utils'; +import { StremThruServiceId } from '../presets/stremthru'; +import { PTT } from '../parser'; +import { ParseResult } from 'go-ptt'; + +const logger = createLogger('debrid:stremthru'); + +function convertStremThruError(error: StremThruError): DebridError { + return new DebridError(error.message, { + statusCode: error.statusCode, + statusText: error.statusText, + code: error.code, + headers: error.headers, + body: error.body, + cause: 'cause' in error ? error.cause : undefined, + }); +} + +export class StremThruInterface implements DebridService { + private readonly stremthru: StremThru; + private static playbackLinkCache = Cache.getInstance( + 'st:link' + ); + private static checkCache = Cache.getInstance( + 'st:instant-check' + ); + + readonly supportsUsenet = false; + readonly serviceName: ServiceId; + + constructor( + private readonly config: DebridServiceConfig & { + serviceName: StremThruServiceId; + } + ) { + this.serviceName = config.serviceName; + this.stremthru = new StremThru({ + baseUrl: Env.BUILTIN_STREMTHRU_URL, + userAgent: Env.DEFAULT_USER_AGENT, + auth: { + store: config.serviceName, + token: config.token, + }, + clientIp: config.clientIp, + timeout: 20000, + }); + } + + public async checkMagnets( + magnets: string[], + sid?: string + ): Promise { + const cachedResults: DebridDownload[] = []; + const magnetsToCheck: string[] = []; + for (const magnet of magnets) { + const cacheKey = getSimpleTextHash(magnet); + const cached = await StremThruInterface.checkCache.get(cacheKey); + if (cached) { + cachedResults.push(cached); + } else { + magnetsToCheck.push(magnet); + } + } + + if (magnetsToCheck.length > 0) { + let newResults: DebridDownload[] = []; + const BATCH_SIZE = 500; + // Split magnetsToCheck into batches of 500 + const batches: string[][] = []; + for (let i = 0; i < magnetsToCheck.length; i += BATCH_SIZE) { + batches.push(magnetsToCheck.slice(i, i + BATCH_SIZE)); + } + + try { + // Perform all batch requests in parallel + const batchResults = await Promise.all( + batches.map(async (batch) => { + const result = await this.stremthru.store.checkMagnet({ + magnet: batch, + sid, + }); + return result.data.items; + }) + ); + + // Flatten all items from all batches + const allItems = batchResults.flat(); + + for (const item of allItems) { + const download: DebridDownload = { + id: -1, + hash: item.hash, + status: item.status, + size: item.files.reduce((acc, file) => acc + file.size, 0), + files: item.files.map((file) => ({ + name: file.name, + size: file.size, + index: file.index, + })), + }; + newResults.push(download); + StremThruInterface.checkCache.set( + getSimpleTextHash(item.hash), + download, + Env.BUILTIN_DEBRID_INSTANT_AVAILABILITY_CACHE_TTL + ); + } + } catch (error) { + if (error instanceof StremThruError) { + throw convertStremThruError(error); + } + throw error; + } + return [...cachedResults, ...newResults]; + } + return cachedResults; + } + + public async addMagnet(magnet: string): Promise { + try { + const result = await this.stremthru.store.addMagnet({ + magnet, + }); + + return { + id: result.data.id, + status: result.data.status, + hash: result.data.hash, + size: result.data.files.reduce((acc, file) => acc + file.size, 0), + files: result.data.files.map((file) => ({ + name: file.name, + size: file.size, + link: file.link, + path: file.path, + index: file.index, + })), + }; + } catch (error) { + throw error instanceof StremThruError + ? convertStremThruError(error) + : error; + } + } + + public async generateTorrentLink( + link: string, + clientIp?: string + ): Promise { + try { + const result = await this.stremthru.store.generateLink({ + link, + clientIp, + }); + return result.data.link; + } catch (error) { + throw error instanceof StremThruError + ? convertStremThruError(error) + : error; + } + } + + public async resolve( + playbackInfo: PlaybackInfo, + filename: string + ): Promise { + if (playbackInfo.type === 'usenet') { + throw new DebridError('StremThru does not support usenet operations', { + statusCode: 400, + statusText: 'StremThru does not support usenet operations', + code: 'NOT_IMPLEMENTED', + headers: {}, + body: playbackInfo, + }); + } + + const { hash, file: chosenFile, metadata } = playbackInfo; + const cacheKey = `${this.serviceName}:${this.config.token}:${this.config.clientIp}:${JSON.stringify(playbackInfo)}`; + const cachedLink = await StremThruInterface.playbackLinkCache.get(cacheKey); + + let magnet = `magnet:?xt=urn:btih:${hash}`; + if (playbackInfo.sources.length > 0) { + magnet += `&tr=${playbackInfo.sources.join('&tr=')}`; + } + + if (cachedLink) { + logger.debug(`Using cached link for ${hash}`); + return cachedLink; + } + + logger.debug(`Adding magnet to ${this.serviceName} for ${magnet}`); + + const magnetDownload = await this.addMagnet(magnet); + + logger.debug(`Magnet download added for ${magnet}`, { + status: magnetDownload.status, + id: magnetDownload.id, + }); + + if (magnetDownload.status !== 'downloaded') { + return undefined; + } + + if (!magnetDownload.files?.length) { + throw new DebridError('No files found for magnet download', { + statusCode: 400, + statusText: 'No files found for magnet download', + code: 'NO_MATCHING_FILE', + headers: {}, + body: magnetDownload, + }); + } + + const torrent: Torrent = { + title: magnetDownload.name || playbackInfo.title || '', + hash: hash, + size: magnetDownload.size || 0, + type: 'torrent', + sources: playbackInfo.sources, + }; + + const allStrings: string[] = []; + allStrings.push(magnetDownload.name ?? ''); + allStrings.push(...magnetDownload.files.map((file) => file.name ?? '')); + const parseResults = await PTT.parse(allStrings); + const parsedFiles = new Map(); + for (const [index, result] of parseResults.entries()) { + if (result) { + parsedFiles.set(allStrings[index], result); + } + } + + const file = await selectFileInTorrentOrNZB( + torrent, + magnetDownload, + parsedFiles, + metadata, + { + chosenFilename: chosenFile?.name, + chosenIndex: chosenFile?.index, + } + ); + + if (!file?.link) { + throw new DebridError('No matching file found', { + statusCode: 400, + statusText: 'No matching file found', + code: 'NO_MATCHING_FILE', + headers: {}, + body: file, + }); + } + + logger.debug(`Found matching file`, { + season: metadata?.season, + episode: metadata?.episode, + absoluteEpisode: metadata?.absoluteEpisode, + chosenFile: file.name, + availableFiles: `[${magnetDownload.files.map((file) => file.name).join(', ')}]`, + }); + + const playbackLink = await this.generateTorrentLink( + file.link, + this.config.clientIp + ); + await StremThruInterface.playbackLinkCache.set( + cacheKey, + playbackLink, + Env.BUILTIN_DEBRID_PLAYBACK_LINK_CACHE_TTL + ); + + return playbackLink; + } +} diff --git a/packages/core/src/debrid/torbox.ts b/packages/core/src/debrid/torbox.ts new file mode 100644 index 00000000..f99cef5c --- /dev/null +++ b/packages/core/src/debrid/torbox.ts @@ -0,0 +1,448 @@ +import { TorboxApi } from '@torbox/torbox-api'; +import { Env, ServiceId, createLogger, getSimpleTextHash } from '../utils'; +import { PTT } from '../parser'; +import { selectFileInTorrentOrNZB } from './utils'; +import { + DebridService, + DebridServiceConfig, + DebridDownload, + PlaybackInfo, + DebridError, +} from './base'; +import { Cache } from '../utils'; +import { StremThruInterface } from './stremthru'; +import { StremThruError } from 'stremthru'; +import { ParseResult } from 'go-ptt'; + +const logger = createLogger('debrid:torbox'); + +export class TorboxDebridService implements DebridService { + private readonly apiVersion = 'v1'; + private readonly torboxApi: TorboxApi; + private readonly stremthru: StremThruInterface; + private static playbackLinkCache = Cache.getInstance( + 'tb:link' + ); + private static instantAvailabilityCache = Cache.getInstance< + string, + DebridDownload + >('tb:instant-availability'); + readonly supportsUsenet = true; + readonly serviceName: ServiceId = 'torbox'; + + constructor(private readonly config: DebridServiceConfig) { + this.torboxApi = new TorboxApi({ + token: config.token, + }); + + this.stremthru = new StremThruInterface({ + ...config, + serviceName: this.serviceName, + }); + } + + public async checkMagnets(magnets: string[], sid?: string) { + try { + return this.stremthru.checkMagnets(magnets, sid); + } catch (error) { + if (error instanceof StremThruError) { + throw new DebridError(error.message, { + statusCode: error.statusCode, + statusText: error.statusText, + code: error.code, + headers: error.headers, + body: error.body, + cause: 'cause' in error ? error.cause : undefined, + }); + } + throw error; + } + } + + public async addMagnet(magnet: string): Promise { + try { + return this.stremthru.addMagnet(magnet); + } catch (error) { + if (error instanceof StremThruError) { + throw new DebridError(error.message, { + statusCode: error.statusCode, + statusText: error.statusText, + code: error.code, + headers: error.headers, + body: error.body, + cause: 'cause' in error ? error.cause : undefined, + }); + } + throw error; + } + } + + public async generateTorrentLink( + link: string, + clientIp?: string + ): Promise { + try { + return this.stremthru.generateTorrentLink(link, clientIp); + } catch (error) { + if (error instanceof StremThruError) { + throw new DebridError(error.message, { + statusCode: error.statusCode, + statusText: error.statusText, + code: error.code, + headers: error.headers, + body: error.body, + cause: 'cause' in error ? error.cause : undefined, + }); + } + throw error; + } + } + + public async checkNzbs(hashes: string[]): Promise { + const cachedResults: DebridDownload[] = []; + const hashesToCheck: string[] = []; + for (const hash of hashes) { + const cacheKey = getSimpleTextHash(hash); + const cached = + await TorboxDebridService.instantAvailabilityCache.get(cacheKey); + if (cached) { + cachedResults.push(cached); + } else { + hashesToCheck.push(hash); + } + } + + if (hashesToCheck.length > 0) { + let newResults: DebridDownload[] = []; + const BATCH_SIZE = 100; + + const batches: string[][] = []; + for (let i = 0; i < hashesToCheck.length; i += BATCH_SIZE) { + batches.push(hashesToCheck.slice(i, i + BATCH_SIZE)); + } + + const batchResults = await Promise.all( + batches.map(async (batch) => { + const result = + await this.torboxApi.usenet.getUsenetCachedAvailability( + this.apiVersion, + { + hash: batch.join(','), + format: 'list', + } + ); + if (!result.data?.success) { + throw new DebridError(`Failed to check instant availability`, { + statusCode: result.metadata.status, + statusText: result.metadata.statusText, + code: 'UNKNOWN', + headers: result.metadata.headers, + body: result.data, + }); + } + + if (!Array.isArray(result.data.data)) { + throw new DebridError( + 'Invalid response from Torbox API. Expected array, got object', + { + statusCode: result.metadata.status, + statusText: result.metadata.statusText, + code: 'UNKNOWN', + headers: result.metadata.headers, + body: result.data, + } + ); + } + return result.data.data; + }) + ); + + const allItems = batchResults.flat(); + + for (const item of allItems) { + const download: DebridDownload = { + id: -1, + hash: item.hash, + status: 'cached', + size: item.size, + }; + + // cachedResults.push(download); + newResults.push(download); + + if (item.hash) { + TorboxDebridService.instantAvailabilityCache.set( + getSimpleTextHash(item.hash), + download, + Env.BUILTIN_DEBRID_INSTANT_AVAILABILITY_CACHE_TTL + ); + } + } + + return [...cachedResults, ...newResults]; + } + + return cachedResults; + // const data = await this.torboxApi.usenet.getUsenetCachedAvailability( + // this.apiVersion, + // { + // hash: hashes.join(','), + // format: 'list', + // } + // ); + // if (!data.data?.success) { + // throw new DebridError(`Failed to check instant availability`, { + // statusCode: data.metadata.status, + // statusText: data.metadata.statusText, + // code: 'UNKNOWN', + // headers: data.metadata.headers, + // body: data.data, + // cause: data.data, + // type: 'api_error', + // }); + // } + // if (!Array.isArray(data.data.data)) { + // throw new DebridError( + // 'Invalid response from Torbox API. Expected array, got object', + // { + // statusCode: data.metadata.status, + // statusText: data.metadata.statusText, + // code: 'UNKNOWN', + // headers: data.metadata.headers, + // body: data.data, + // cause: data.data, + // type: 'api_error', + // } + // ); + // } + // return data.data.data.map((item) => ({ + // id: -1, + // status: 'cached', + // name: item.name, + // size: item.size, + // })); + } + + public async addNzb(nzb: string, name: string): Promise { + const res = await this.torboxApi.usenet.createUsenetDownload( + this.apiVersion, + { + link: nzb, + name, + } + ); + + if (!res.data?.data?.usenetdownloadId) { + throw new DebridError(`Usenet download failed: ${res.data?.detail}`, { + statusCode: res.metadata.status, + statusText: res.metadata.statusText, + code: 'UNKNOWN', + headers: res.metadata.headers, + body: res.data, + cause: res.data, + type: 'api_error', + }); + } + + const nzbInfo = await this.torboxApi.usenet.getUsenetList(this.apiVersion, { + id: res.data.data.usenetdownloadId.toString(), + }); + + if ( + !nzbInfo?.data?.data || + nzbInfo?.data?.error || + nzbInfo.data.success === false + ) { + throw new DebridError( + `Failed to get usenet list: ${nzbInfo?.data?.error || 'Unknown error'}${nzbInfo?.data?.detail ? '- ' + nzbInfo.data.detail : ''}`, + { + statusCode: nzbInfo.metadata.status, + statusText: nzbInfo.metadata.statusText, + code: 'UNKNOWN', + headers: nzbInfo.metadata.headers, + body: nzbInfo.data, + cause: nzbInfo.data, + type: 'api_error', + } + ); + } + + if (Array.isArray(nzbInfo.data.data)) { + throw new DebridError('Unexpected response format for usenet download', { + statusCode: nzbInfo.metadata.status, + statusText: nzbInfo.metadata.statusText, + code: 'UNKNOWN', + headers: nzbInfo.metadata.headers, + body: nzbInfo.data, + cause: nzbInfo.data, + type: 'api_error', + }); + } + + const usenetDownload = nzbInfo.data.data; + let status: DebridDownload['status'] = 'queued'; + + if (usenetDownload.downloadFinished && usenetDownload.downloadPresent) { + status = 'downloaded'; + } else if (usenetDownload.progress && usenetDownload.progress > 0) { + status = 'downloading'; + } + + return { + id: usenetDownload.id ?? res.data.data.usenetdownloadId, + hash: usenetDownload.hash ?? res.data.data.hash, + name: usenetDownload.name ?? undefined, + status, + files: (usenetDownload.files ?? []).map((file) => ({ + id: file.id, + mimeType: file.mimetype, + name: file.shortName ?? file.name ?? '', + size: file.size ?? 0, + })), + }; + } + + public async generateUsenetLink( + downloadId: string, + fileId?: string, + clientIp?: string + ): Promise { + const link = await this.torboxApi.usenet.requestDownloadLink( + this.apiVersion, + { + usenetId: downloadId, + fileId: fileId, + userIp: clientIp, + redirect: 'false', + token: this.config.token, + } + ); + + if (!link.data?.data) { + throw new DebridError('Failed to generate usenet download link', { + statusCode: link.metadata.status, + statusText: link.metadata.statusText, + code: 'UNKNOWN', + headers: link.metadata.headers, + body: link.data, + cause: link.data, + type: 'api_error', + }); + } + + return link.data.data; + } + + public async resolve( + playbackInfo: PlaybackInfo, + filename: string + ): Promise { + if (playbackInfo.type === 'torrent') { + return this.stremthru.resolve(playbackInfo, filename); + } + + const { nzb, file: chosenFile, metadata, title, hash } = playbackInfo; + const cacheKey = `${this.serviceName}:${this.config.token}:${this.config.clientIp}:${JSON.stringify(playbackInfo)}`; + const cachedLink = + await TorboxDebridService.playbackLinkCache.get(cacheKey); + + if (cachedLink) { + logger.debug(`Using cached link for ${nzb}`); + return cachedLink; + } + + logger.debug(`Adding usenet download for ${nzb}`, { + hash, + }); + + const usenetDownload = await this.addNzb(nzb, filename); + + logger.debug(`Usenet download added for ${nzb}`, { + status: usenetDownload.status, + id: usenetDownload.id, + }); + + if (usenetDownload.status !== 'downloaded') { + return undefined; + } + + if (!usenetDownload.files?.length) { + throw new DebridError('No files found for usenet download', { + statusCode: 400, + statusText: 'No files found for usenet download', + code: 'NO_MATCHING_FILE', + headers: {}, + body: usenetDownload, + type: 'api_error', + }); + } + + let fileId: number | undefined; + if (usenetDownload.files.length > 1) { + const nzbInfo = { + type: 'usenet' as const, + nzb: nzb, + hash: hash, + title: title || usenetDownload.name, + file: chosenFile, + metadata: metadata, + size: usenetDownload.size || 0, + }; + const allStrings: string[] = []; + allStrings.push(usenetDownload.name ?? ''); + allStrings.push(...usenetDownload.files.map((file) => file.name ?? '')); + + const parseResults = await PTT.parse(allStrings); + const parsedFiles = new Map(); + for (const [index, result] of parseResults.entries()) { + if (result) { + parsedFiles.set(allStrings[index], result); + } + } + + const file = await selectFileInTorrentOrNZB( + nzbInfo, + usenetDownload, + parsedFiles, + metadata, + { + chosenFilename: chosenFile?.name, + chosenIndex: chosenFile?.index, + } + ); + + if (!file) { + throw new DebridError('No matching file found', { + statusCode: 400, + statusText: 'No matching file found', + code: 'NO_MATCHING_FILE', + headers: {}, + body: file, + type: 'api_error', + }); + } + + logger.debug(`Found matching file`, { + chosenFile: file.name, + chosenIndex: file.id, + availableFiles: `[${usenetDownload.files.map((file) => file.name).join(', ')}]`, + }); + + fileId = file.id; + } + + const playbackLink = await this.generateUsenetLink( + usenetDownload.id.toString(), + fileId?.toString(), + this.config.clientIp + ); + + await TorboxDebridService.playbackLinkCache.set( + cacheKey, + playbackLink, + Env.BUILTIN_DEBRID_INSTANT_AVAILABILITY_CACHE_TTL + ); + + return playbackLink; + } +} diff --git a/packages/core/src/debrid/utils.ts b/packages/core/src/debrid/utils.ts index ebcaa329..fda7d5be 100644 --- a/packages/core/src/debrid/utils.ts +++ b/packages/core/src/debrid/utils.ts @@ -1,100 +1,247 @@ -import { ParsedFile } from '../db/schemas'; -import { createLogger } from '../utils'; +import { z } from 'zod'; +import { constants, createLogger } from '../utils'; + +import { BuiltinServiceId } from '../utils'; +import { DebridFile, DebridDownload } from './base'; +import { PTT } from '../parser'; +import { normaliseTitle, titleMatch } from '../parser/utils'; const logger = createLogger('debrid'); -interface FileWithParsedInfo { - name: string; +export const BuiltinDebridServices = z.array( + z.object({ + id: z.enum(constants.BUILTIN_SUPPORTED_SERVICES), + credential: z.string(), + }) +); + +export type BuiltinDebridServices = z.infer; + +interface BaseFile { + title?: string; size: number; - index: number; - parsed: ParsedFile; - isVideo: boolean; - path?: string; - link?: string; + index?: number; + indexer?: string; + seeders?: number; + age?: string; } -export function findMatchingFileInTorrent( - files: FileWithParsedInfo[], - chosenIndex?: number, - requestedFilename?: string, - requestedTitles?: string[], - season?: string, - episode?: string, - absoluteEpisode?: string, - expectLinks?: boolean -): FileWithParsedInfo | null { - let chosenFile = null; +export interface Torrent extends BaseFile { + type: 'torrent'; + downloadUrl?: string; + sources: string[]; + hash: string; + files?: DebridFile[]; + // magnet?: string; +} - for (const file of files) { - if (!file.isVideo || file.name?.includes('sample')) { - continue; +export interface UnprocessedTorrent extends BaseFile { + type: 'torrent'; + hash?: string; + downloadUrl?: string; + sources: string[]; +} + +export interface NZB extends BaseFile { + type: 'usenet'; + hash: string; + nzb: string; +} + +export interface TorrentWithSelectedFile extends Torrent { + file: DebridFile; + service?: { + id: BuiltinServiceId; + cached: boolean; + owned: boolean; + }; +} + +export interface NZBWithSelectedFile extends NZB { + file: DebridFile; + service?: { + id: BuiltinServiceId; + cached: boolean; + owned: boolean; + }; +} + +// helpers +export const isSeasonWrong = ( + parsed: { seasons?: number[] }, + metadata?: { season?: number } +) => { + if ( + parsed.seasons?.length && + metadata?.season && + !parsed.seasons.includes(metadata.season) + ) { + return true; + } + return false; +}; +export const isEpisodeWrong = ( + parsed: { episodes?: number[] }, + metadata?: { episode?: number; absoluteEpisode?: number } +) => { + if ( + parsed.episodes?.length && + metadata?.episode && + !( + parsed.episodes.includes(metadata.episode) || + (metadata.absoluteEpisode && + parsed.episodes.includes(metadata.absoluteEpisode)) + ) + ) { + return true; + } + return false; +}; +export const isTitleWrong = ( + parsed: { title?: string }, + metadata?: { titles?: string[] } +) => { + if ( + parsed.title && + metadata?.titles && + !titleMatch( + normaliseTitle(parsed.title), + metadata.titles.map(normaliseTitle), + { threshold: 0.8 } + ) + ) { + return true; + } + return false; +}; + +export async function selectFileInTorrentOrNZB( + torrentOrNZB: Torrent | NZB, + debridDownload: DebridDownload, + parsedFiles: Map< + string, + { + title?: string; + seasons?: number[]; + episodes?: number[]; + } + >, + + metadata?: { + titles: string[]; + season?: number; + episode?: number; + absoluteEpisode?: number; + }, + options?: { + chosenFilename?: string; + chosenIndex?: number; + } +): Promise { + if (!debridDownload.files?.length) { + return { + name: torrentOrNZB.title, + size: torrentOrNZB.size, + index: -1, + }; + } + + const isVideo = debridDownload.files.map((file) => isVideoFile(file)); + + // Create a scoring system for each file + const fileScores = debridDownload.files.map((file, index) => { + let score = 0; + const parsed = parsedFiles.get(file.name ?? ''); + + if (!parsed) { + logger.warn(`Parsed file not found for ${file.name}`); } - if (season || episode || absoluteEpisode) { - if ( - (requestedTitles && file.parsed.title - ? requestedTitles.some( - (title) => - file.parsed.title!.toLowerCase() === title.toLowerCase() - ) - : true) && - ((absoluteEpisode && - !file.parsed.season && - file.parsed.episode === Number(absoluteEpisode)) || - (season && !episode && file.parsed.season === Number(season)) || - (episode && !season && file.parsed.episode === Number(episode)) || - (season && - episode && - file.parsed.season === Number(season) && - file.parsed.episode === Number(episode))) - ) { - chosenFile = file; - break; - } - } else { - if (requestedTitles) { - if ( - requestedTitles.some( - (title) => file.parsed.title?.toLowerCase() === title.toLowerCase() - ) - ) { - chosenFile = file; - break; - } - } + // Base score from video file status (highest priority) + if (isVideo[index]) { + score += 1000; } - } - if (chosenFile) { - return chosenFile; - } - - if (requestedFilename) { - const requestedFile = files.find( - (file) => file.name.toLowerCase() === requestedFilename.toLowerCase() - ); - if (requestedFile) { - return requestedFile; + // Season/Episode matching (second highest priority) + if (parsed && !isSeasonWrong(parsed, metadata)) { + score += 500; + } + if (parsed && !isEpisodeWrong(parsed, metadata)) { + score += 500; } - } - if (chosenIndex) { - const fileIdx = files.find((file) => file.index === chosenIndex); - if (fileIdx) return fileIdx; - } + // Title matching (third priority) + if (parsed && !isTitleWrong(parsed, metadata)) { + score += 100; + } - if (files.length > 0 && (!expectLinks || files.some((file) => file.link))) { - return files - .filter((file) => !expectLinks || file.link) - .reduce((largest, current) => - current.size > largest.size ? current : largest + // Size based score (lowest priority but still relevant) + // We normalize the size to be between 0 and 50 points + const files = debridDownload.files || []; + const maxSize = + torrentOrNZB.size || files.reduce((max, f) => Math.max(max, f.size), 0); + score += maxSize > 0 ? (file.size / maxSize) * 50 : 0; + + // Small boost for chosen index/filename if provided + if (options?.chosenIndex === index) { + score += 25; + } + if ( + options?.chosenFilename && + torrentOrNZB.title?.includes(options.chosenFilename) + ) { + score += 25; + } + return { + file, + score, + index, + }; + }); + + // Sort by score descending + fileScores.sort((a, b) => b.score - a.score); + + // Select the best matching file + const bestMatch = fileScores[0]; + // return bestMatch.file; + const parsedFile = parsedFiles.get(bestMatch.file.name ?? ''); + const parsedTitle = parsedFiles.get(torrentOrNZB.title ?? ''); + + if (metadata && parsedFile && parsedTitle) { + // if ( + // !isSeasonWrong(parsed, metadata) && + // !isSeasonWrong(parsedTorrentOrNZB, metadata) + // ) { + // logger.debug( + // `Season ${metadata.season} not found in ${torrentOrNZB.title} and ${bestMatch.file.name}, skipping...` + // ); + // return undefined; + // } + if ( + isEpisodeWrong(parsedFile, metadata) || + isEpisodeWrong(parsedTitle, metadata) + ) { + logger.debug( + `Episode ${metadata.episode} or ${metadata.absoluteEpisode} not found in ${torrentOrNZB.title} and ${bestMatch.file.name}, skipping...` ); + return undefined; + } + // if ( + // !titleMatchHelper(parsed, metadata) && + // !titleMatchHelper(parsedTorrentOrNZB, metadata) + // ) { + // logger.debug( + // `Title ${torrentOrNZB.title} and ${bestMatch.file.name} does not match ${metadata.titles.join(', ')}, skipping...` + // ); + // return undefined; + // } } - return null; + return bestMatch.file; } -export function isVideoFile(filename: string): boolean { +export function isVideoFile(file: DebridFile): boolean { const videoExtensions = [ '.3g2', '.3gp', @@ -136,5 +283,9 @@ export function isVideoFile(filename: string): boolean { '.m3u8', '.m2ts', ]; - return videoExtensions.some((ext) => filename.endsWith(ext)); + + return ( + file.mimeType?.includes('video') || + videoExtensions.some((ext) => file.name?.endsWith(ext) ?? false) + ); } diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 2c37085f..a47a52b1 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -11,5 +11,8 @@ export { GoogleOAuth, GDriveAPI, TorBoxSearchAddonError, + TorznabAddon, + NewznabAddon, + ProwlarrAddon, } from './builtins'; export { PresetManager } from './presets'; diff --git a/packages/core/src/main.ts b/packages/core/src/main.ts index fdc694e8..f9bdbc17 100644 --- a/packages/core/src/main.ts +++ b/packages/core/src/main.ts @@ -15,6 +15,7 @@ import { Cache, ExtrasParser, makeUrlLogSafe, + AnimeDatabase, } from './utils'; import { Wrapper } from './wrapper'; import { PresetManager } from './presets'; @@ -40,7 +41,8 @@ import { StreamUtils, } from './streams'; import { getAddonName } from './utils/general'; -import { TMDBMetadata, TMDBMetadataResponse } from './metadata/tmdb'; +import { TMDBMetadata } from './metadata/tmdb'; +import { Metadata } from './metadata/utils'; const logger = createLogger('core'); const shuffleCache = Cache.getInstance('shuffle'); @@ -1163,9 +1165,7 @@ export class AIOStreams { }); } - private async getMetadata( - id: string - ): Promise { + private async getMetadata(id: string): Promise { try { const metadata = await new TMDBMetadata({ accessToken: this.userData.tmdbAccessToken, @@ -1186,7 +1186,7 @@ export class AIOStreams { private _getNextEpisode( currentSeason: number, currentEpisode: number, - metadata?: TMDBMetadataResponse + metadata?: Metadata ): { season: number; episode: number; @@ -1194,7 +1194,7 @@ export class AIOStreams { let season = currentSeason; let episode = currentEpisode + 1; const episodeCount = metadata?.seasons?.find( - (s) => s.season_number === Number(season) + (s) => s.season_number === season )?.episode_count; // If we are at the last episode of the season, try to move to the next season @@ -1237,7 +1237,7 @@ export class AIOStreams { await this.limiter.limit( await this.sorter.sort( processedStreams, - id.startsWith('kitsu') ? 'anime' : type + AnimeDatabase.getInstance().isAnime(id) ? 'anime' : type ) ) ) diff --git a/packages/core/src/metadata/imdb.ts b/packages/core/src/metadata/imdb.ts index 520526d1..935f16a1 100644 --- a/packages/core/src/metadata/imdb.ts +++ b/packages/core/src/metadata/imdb.ts @@ -2,6 +2,7 @@ import { z } from 'zod'; import { Cache, makeRequest, Env, TYPES } from '../utils'; import { Wrapper } from '../wrapper'; import { Metadata } from './utils'; +import { Meta, MetaSchema } from '../db'; const IMDBSuggestionSchema = z.object({ d: z.array( @@ -27,12 +28,15 @@ const IMDBSuggestionSchema = z.object({ export class IMDBMetadata { private readonly titleCache: Cache; + private readonly cinemetaCache: Cache; private readonly titleCacheTTL = 7 * 24 * 60 * 60; + private readonly cinemetaCacheTTL = 7 * 24 * 60 * 60; private readonly IMDB_SUGGESTION_API = 'https://v3.sg.media-imdb.com/suggestion/a/'; - private readonly CINEMETA_URL = 'https://v3-cinemeta.strem.io/manifest.json'; + private readonly CINEMETA_URL = 'https://v3-cinemeta.strem.io'; public constructor() { this.titleCache = Cache.getInstance('imdb-title'); + this.cinemetaCache = Cache.getInstance('cinemeta'); } public async getTitleAndYear(id: string, type: string): Promise { @@ -47,9 +51,18 @@ export class IMDBMetadata { if (!cinemetaData.name || !cinemetaData.year) { throw new Error('Cinemeta data is missing title or year'); } + let year = Number(cinemetaData.releaseInfo?.toString().split('-')[0]); + let yearEnd = Number(cinemetaData.releaseInfo?.toString().split('-')[1]); + if (isNaN(yearEnd)) { + yearEnd = new Date().getFullYear(); + } + if (isNaN(year) && Number.isInteger(Number(cinemetaData.year))) { + year = Number(cinemetaData.year); + } return { title: cinemetaData.name, - year: Number(cinemetaData.releaseInfo?.toString().split('-')[0]), + year, + yearEnd, }; } } @@ -78,29 +91,26 @@ export class IMDBMetadata { } const title = item.l; const year = item.y; - this.titleCache.set(key, { title, year }, this.titleCacheTTL); - return { title, year }; + let yearEnd: number | undefined = undefined; + const yearString = item.yr; + if (yearString && yearString.includes('-')) { + yearEnd = Number(yearString.split('-')[1]); + } + this.titleCache.set(key, { title, year, yearEnd }, this.titleCacheTTL); + return { title, year, yearEnd }; } - private async getCinemetaData(id: string, type: string) { - const cinemeta = new Wrapper({ - instanceId: 'cinemeta', - preset: { - id: 'custom', - type: 'custom', - options: { - id: id, - }, - }, - manifestUrl: this.CINEMETA_URL, - name: 'Cinemeta', + public async getCinemetaData(id: string, type: string) { + const url = `${this.CINEMETA_URL}/meta/${type}/${id}.json`; + const cached = await this.cinemetaCache.get(url); + if (cached) { + return cached; + } + const response = await makeRequest(url, { timeout: 1000, - enabled: true, - headers: { - 'Content-Type': 'application/json', - }, }); - const meta = await cinemeta.getMeta(type, id); + const meta = MetaSchema.parse(((await response.json()) as any).meta); + this.cinemetaCache.set(url, meta, this.cinemetaCacheTTL); return meta; } } diff --git a/packages/core/src/metadata/kitsu.ts b/packages/core/src/metadata/kitsu.ts deleted file mode 100644 index f526161b..00000000 --- a/packages/core/src/metadata/kitsu.ts +++ /dev/null @@ -1,79 +0,0 @@ -import { AnimeKitsuPreset } from '../presets/animeKitsu'; -import { Cache } from '../utils'; -import { Wrapper } from '../wrapper'; -import { Metadata } from './utils'; -import { IdParser, ParsedId } from '../builtins/utils/id-parser'; -import z from 'zod'; - -// kitsu, mal, anilist, anidb - -export class KitsuMetadata { - public constructor() {} - - public async getMetadata(id: ParsedId, type: string): Promise { - const [kitsuAddon] = await AnimeKitsuPreset.generateAddons( - { - sortCriteria: { global: [] }, - formatter: { id: 'gdrive' }, - presets: [], - }, - {} - ); - - if (!['kitsu_id', 'mal_id', 'anilist_id', 'anidb_id'].includes(id.type)) { - throw new Error('Invalid ID type'); - } - const meta = await new Wrapper(kitsuAddon).getMeta( - type, - `${id.type.replace('_id', '')}:${id.id}` - ); - if (!meta.name || !meta.releaseInfo) { - throw new Error('Kitsu metadata is missing title or year'); - } - - let season: number | undefined = undefined; - - if (meta.videos?.[0]?.imdbSeason) { - season = Number(meta.videos[0].imdbSeason); - } - - if (season === undefined) { - const aliasesParse = z.array(z.string()).safeParse((meta as any).aliases); - if (aliasesParse.success) { - const found = aliasesParse.data - .map((alias) => alias.match(/Season (\d+)/i)) - .filter((match) => match !== null) - .map((match) => match![1]) - .map(Number) - .find((s) => !isNaN(s)); - if (found !== undefined) { - season = found; - } - } - } - - if (season === undefined && z.string().safeParse(meta.slug).success) { - const seasonMatch = z - .string() - .parse(meta.slug) - .match(/-(\d+)$/); - if (seasonMatch) { - season = Number(seasonMatch[1]); - } - } - - return { - title: meta.name, - titles: [meta.name, ...(meta.aliases ? (meta.aliases as string[]) : [])], - year: Number(meta.releaseInfo?.toString().split('-')[0]), - seasons: season - ? [ - { - season_number: season, - episode_count: meta.videos?.length || 0, - }, - ] - : undefined, - }; - } -} diff --git a/packages/core/src/metadata/service.ts b/packages/core/src/metadata/service.ts new file mode 100644 index 00000000..5e04fe52 --- /dev/null +++ b/packages/core/src/metadata/service.ts @@ -0,0 +1,214 @@ +import { DistributedLock } from '../utils/distributed-lock'; +import { Metadata } from './utils'; +import { TMDBMetadata } from './tmdb'; +import { getTraktAliases } from './trakt'; +import { IMDBMetadata } from './imdb'; +import { createLogger, getTimeTakenSincePoint } from '../utils/logger'; +import { TYPES } from '../utils/constants'; +import { AnimeDatabase, ParsedId } from '../utils'; +import { Meta } from '../db/schemas'; + +const logger = createLogger('metadata-service'); + +export interface MetadataServiceConfig { + tmdbAccessToken?: string; + tmdbApiKey?: string; +} + +export class MetadataService { + private readonly tmdbMetadata: TMDBMetadata; + private readonly lock: DistributedLock; + + public constructor(config: MetadataServiceConfig) { + this.tmdbMetadata = new TMDBMetadata({ + accessToken: config.tmdbAccessToken, + apiKey: config.tmdbApiKey, + }); + this.lock = DistributedLock.getInstance(); + } + + public async getMetadata( + id: ParsedId, + type: (typeof TYPES)[number] + ): Promise { + const { result } = await this.lock.withLock( + `metadata:${id.mediaType}:${id.type}:${id.value}`, + async () => { + const start = Date.now(); + const titles: string[] = []; + let year: number | undefined; + let yearEnd: number | undefined; + let seasons: + | { + season_number: number; + episode_count: number; + }[] + | undefined; + + // Check anime database first + const animeEntry = AnimeDatabase.getInstance().getEntryById( + id.type, + id.value + ); + + const tmdbId = + id.type === 'themoviedbId' + ? id.value.toString() + : (animeEntry?.mappings?.themoviedbId?.toString() ?? null); + const imdbId = + id.type === 'imdbId' + ? id.value.toString() + : (animeEntry?.mappings?.imdbId?.toString() ?? null); + const tvdbId = + id.type === 'thetvdbId' + ? id.value.toString() + : (animeEntry?.mappings?.thetvdbId?.toString() ?? null); + + if (animeEntry) { + if (animeEntry.imdb?.title) titles.push(animeEntry.imdb.title); + if (animeEntry.trakt?.title) titles.push(animeEntry.trakt.title); + if (animeEntry.title) titles.push(animeEntry.title); + if (animeEntry.synonyms) titles.push(...animeEntry.synonyms); + year = animeEntry.animeSeason?.year ?? undefined; + } + + // Setup parallel API requests + const promises = []; + + // TMDB metadata + + if (tmdbId || imdbId || tvdbId) { + let id = tmdbId + ? `tmdb:${tmdbId}` + : (imdbId ?? (tvdbId ? `tvdb:${tvdbId}` : null)); + promises.push(this.tmdbMetadata.getMetadata(id!, type)); + } else { + promises.push(Promise.resolve(undefined)); + } + + // Trakt aliases + if (imdbId) { + promises.push(getTraktAliases(id)); + } else { + promises.push(Promise.resolve(undefined)); + } + + // IMDb metadata + if (imdbId) { + promises.push(new IMDBMetadata().getCinemetaData(imdbId, type)); + } else { + promises.push(Promise.resolve(undefined)); + } + + // Execute all promises in parallel + const [tmdbResult, traktResult, imdbResult] = (await Promise.allSettled( + promises + )) as [ + PromiseSettledResult, + PromiseSettledResult, + PromiseSettledResult, + ]; + + // Process TMDB results + if (tmdbResult.status === 'fulfilled' && tmdbResult.value) { + const tmdbMetadata = tmdbResult.value; + if (tmdbMetadata.title) titles.unshift(tmdbMetadata.title); + if (tmdbMetadata.titles) titles.push(...tmdbMetadata.titles); + if (!year && tmdbMetadata.year) year = tmdbMetadata.year; + if (tmdbMetadata.yearEnd) yearEnd = tmdbMetadata.yearEnd; + if (tmdbMetadata.seasons) + seasons = tmdbMetadata.seasons.sort( + (a, b) => a.season_number - b.season_number + ); + } else if (tmdbResult.status === 'rejected') { + logger.warn( + `Failed to fetch TMDB metadata for ${id.fullId}: ${tmdbResult.reason}` + ); + } + + // Process Trakt results + if (traktResult.status === 'fulfilled' && traktResult.value) { + titles.push(...traktResult.value); + } else if (traktResult.status === 'rejected') { + logger.warn( + `Failed to fetch Trakt aliases for ${id.fullId}: ${traktResult.reason}` + ); + } + + // Process IMDb results + if (imdbResult.status === 'fulfilled' && imdbResult.value) { + const cinemetaData = imdbResult.value; + if (cinemetaData.name) titles.unshift(cinemetaData.name); + if (cinemetaData.releaseInfo && !year) { + const releaseYear = Number( + cinemetaData.releaseInfo.toString().split('-')[0] + ); + if (!isNaN(releaseYear)) year = releaseYear; + } + if (cinemetaData.videos) { + const seasonMap = new Map>(); + for (const video of cinemetaData.videos) { + if ( + typeof video.season === 'number' && + typeof video.episode === 'number' + ) { + if (!seasonMap.has(video.season)) { + seasonMap.set(video.season, new Set()); + } + seasonMap.get(video.season)!.add(video.episode); + } + } + const imdbSeasons = Array.from(seasonMap.entries()).map( + ([season_number, episodes]) => ({ + season_number, + episode_count: episodes.size, + }) + ); + if (imdbSeasons.length) { + seasons = imdbSeasons.sort( + (a, b) => a.season_number - b.season_number + ); + } + } + } else if (imdbResult.status === 'rejected') { + logger.warn( + `Failed to fetch IMDb metadata for ${imdbId}: ${imdbResult.reason}` + ); + } + + // Deduplicate titles, lowercase all before deduplication + const uniqueTitles = [ + ...new Set(titles.map((title) => title.toLowerCase())), + ]; + + if (!uniqueTitles.length || !year) { + throw new Error(`Could not find metadata for ${id.fullId}`); + } + logger.debug( + `Found metadata for ${id.fullId} in ${getTimeTakenSincePoint(start)}`, + { + title: uniqueTitles[0], + aliases: uniqueTitles.slice(1).length, + year, + yearEnd, + seasons: seasons?.length, + } + ); + return { + title: uniqueTitles[0], + titles: uniqueTitles, + year, + yearEnd, + seasons, + }; + }, + { + timeout: 2500, // metadata does not take long to fetch so keep it low + ttl: 5000, + retryInterval: 100, + } + ); + + return result; + } +} diff --git a/packages/core/src/metadata/tmdb.ts b/packages/core/src/metadata/tmdb.ts index d654ea73..bbfbb69d 100644 --- a/packages/core/src/metadata/tmdb.ts +++ b/packages/core/src/metadata/tmdb.ts @@ -1,5 +1,8 @@ import { Headers } from 'undici'; import { Env, Cache, TYPES, makeRequest } from '../utils'; +import { Metadata } from './utils'; +import { z } from 'zod'; + export type ExternalIdType = 'imdb' | 'tmdb' | 'tvdb'; interface ExternalId { @@ -18,14 +21,56 @@ const ID_CACHE_TTL = 30 * 24 * 60 * 60; // 30 days const TITLE_CACHE_TTL = 7 * 24 * 60 * 60; // 7 days const AUTHORISATION_CACHE_TTL = 2 * 24 * 60 * 60; // 2 days -export interface TMDBMetadataResponse { - titles: string[]; - year: string; - seasons?: { - season_number: number; - episode_count: number; - }[]; -} +// Zod schemas for API responses +const MovieDetailsSchema = z.object({ + id: z.number(), + title: z.string(), + release_date: z.string().optional(), + status: z.string(), +}); + +const TVDetailsSchema = z.object({ + id: z.number(), + name: z.string(), + first_air_date: z.string().optional(), + last_air_date: z.string().optional(), + status: z.string(), + seasons: z.array( + z.object({ + season_number: z.number(), + episode_count: z.number(), + }) + ), +}); + +const MovieAlternativeTitlesSchema = z.object({ + titles: z.array( + z.object({ + title: z.string(), + }) + ), +}); + +const TVAlternativeTitlesSchema = z.object({ + results: z.array( + z.object({ + title: z.string(), + }) + ), +}); + +const FindResultsSchema = z.object({ + movie_results: z.array( + z.object({ + id: z.number(), + }) + ), + tv_results: z.array( + z.object({ + id: z.number(), + }) + ), +}); export class TMDBMetadata { private readonly TMDB_ID_REGEX = /^(?:tmdb)[-:](\d+)(?::\d+:\d+)?$/; @@ -35,8 +80,8 @@ export class TMDBMetadata { string, string >('tmdb_id_conversion'); - private static readonly metadataCache: Cache = - Cache.getInstance('tmdb_metadata'); + private static readonly metadataCache: Cache = + Cache.getInstance('tmdb_metadata'); private readonly accessToken: string | undefined; private readonly apiKey: string | undefined; private static readonly validationCache: Cache = @@ -109,9 +154,9 @@ export class TMDBMetadata { throw new Error(`${response.status} - ${response.statusText}`); } - const data: any = await response.json(); + const data = FindResultsSchema.parse(await response.json()); const results = type === 'movie' ? data.movie_results : data.tv_results; - const meta = results?.[0]; + const meta = results[0]; if (!meta) { throw new Error(`No ${type} metadata found for ID: ${id.value}`); @@ -123,7 +168,8 @@ export class TMDBMetadata { return tmdbId; } - private parseReleaseDate(releaseDate: string): string { + private parseReleaseDate(releaseDate: string | undefined): string { + if (!releaseDate) return '0'; const date = new Date(releaseDate); return date.getFullYear().toString(); } @@ -131,7 +177,7 @@ export class TMDBMetadata { public async getMetadata( id: string, type: (typeof TYPES)[number] - ): Promise { + ): Promise { if (!['movie', 'series', 'anime'].includes(type)) { throw new Error(`Invalid type: ${type}`); } @@ -168,18 +214,32 @@ export class TMDBMetadata { throw new Error(`Failed to fetch details: ${detailsResponse.statusText}`); } - const detailsData: any = await detailsResponse.json(); + const detailsJson = await detailsResponse.json(); + const detailsData = + type === 'movie' + ? MovieDetailsSchema.parse(detailsJson) + : TVDetailsSchema.parse(detailsJson); + const primaryTitle = - type === 'movie' ? detailsData.title : detailsData.name; + type === 'movie' + ? (detailsData as z.infer).title + : (detailsData as z.infer).name; const year = this.parseReleaseDate( - type === 'movie' ? detailsData.release_date : detailsData.first_air_date + type === 'movie' + ? (detailsData as z.infer).release_date + : (detailsData as z.infer).first_air_date ); + const yearEnd = + type === 'series' + ? (detailsData as z.infer).last_air_date + ? this.parseReleaseDate( + (detailsData as z.infer).last_air_date + ) + : undefined + : undefined; const seasons = type === 'series' - ? detailsData.seasons.map((season: any) => ({ - season_number: season.season_number, - episode_count: season.episode_count, - })) + ? (detailsData as z.infer).seasons : undefined; // Fetch alternative titles @@ -201,18 +261,28 @@ export class TMDBMetadata { ); } - const altTitlesData: any = await altTitlesResponse.json(); + const altTitlesJson = await altTitlesResponse.json(); + const altTitlesData = + type === 'movie' + ? MovieAlternativeTitlesSchema.parse(altTitlesJson) + : TVAlternativeTitlesSchema.parse(altTitlesJson); const alternativeTitles = type === 'movie' - ? altTitlesData.titles.map((title: any) => title.title) - : altTitlesData.results.map((title: any) => title.title); + ? ( + altTitlesData as z.infer + ).titles.map((title) => title.title) + : ( + altTitlesData as z.infer + ).results.map((title) => title.title); // Combine primary title with alternative titles, ensuring no duplicates const allTitles = [primaryTitle, ...alternativeTitles]; const uniqueTitles = [...new Set(allTitles)]; - const metadata: TMDBMetadataResponse = { + const metadata: Metadata = { + title: primaryTitle, titles: uniqueTitles, - year, + year: Number(year), + yearEnd: yearEnd ? Number(yearEnd) : undefined, seasons, }; // Cache the result diff --git a/packages/core/src/metadata/trakt.ts b/packages/core/src/metadata/trakt.ts new file mode 100644 index 00000000..ec49d601 --- /dev/null +++ b/packages/core/src/metadata/trakt.ts @@ -0,0 +1,80 @@ +import { z } from 'zod'; +import { + AnimeDatabase, + Cache, + createLogger, + makeRequest, + ParsedId, + formatZodError, + Env, +} from '../utils'; + +const traktAliasCache = Cache.getInstance('trakt-aliases'); +const TRAKT_ALIAS_CACHE_TTL = 7 * 24 * 60 * 60; // 7 days + +const TraktAliasSchema = z.array( + z.object({ + title: z.string(), + country: z.string(), + }) +); +const TRAKT_API_BASE_URL = 'https://api.trakt.tv'; + +const logger = createLogger('trakt'); + +export async function getTraktAliases( + parsedId: ParsedId +): Promise { + const cacheKey = `${parsedId.type}:${parsedId.value}`; + const cachedAliases = await traktAliasCache.get(cacheKey); + if (cachedAliases) { + logger.debug( + `Retrieved ${cachedAliases.length} (cached) Trakt aliases for ${parsedId.value}` + ); + return cachedAliases; + } + // need imdb id, trakt id requires authentication. + let imdbId = parsedId.type === 'imdbId' ? parsedId.value : null; + // try to get imdb ID from anime database + const animeEntry = AnimeDatabase.getInstance().getEntryById( + parsedId.type, + parsedId.value + ); + imdbId = imdbId ?? animeEntry?.mappings?.imdbId?.toString() ?? null; + if (!imdbId) { + return null; + } + + try { + const data = await makeRequest( + `${TRAKT_API_BASE_URL}/${parsedId.mediaType === 'movie' ? 'movies' : 'shows'}/${imdbId}/aliases`, + { + timeout: 1000, + headers: { + 'Content-Type': 'application/json', + 'trakt-api-version': '1', + 'trakt-api-key': Env.TRAKT_CLIENT_ID, + }, + } + ); + + const parsedData = TraktAliasSchema.safeParse(await data.json()); + + if (!parsedData.success) { + logger.error( + `Failed to parse Trakt aliases: ${formatZodError(parsedData.error)}` + ); + return null; + } + + const aliases = parsedData.data.map((alias) => alias.title); + traktAliasCache.set(cacheKey, aliases, TRAKT_ALIAS_CACHE_TTL); + logger.debug( + `Retrieved ${aliases.length} Trakt aliases for ${parsedId.value}` + ); + return aliases; + } catch (error) { + logger.error(`Failed to retrieve Trakt aliases: ${error}`); + return null; + } +} diff --git a/packages/core/src/metadata/utils.ts b/packages/core/src/metadata/utils.ts index 80e9ef35..53444538 100644 --- a/packages/core/src/metadata/utils.ts +++ b/packages/core/src/metadata/utils.ts @@ -2,6 +2,7 @@ export interface Metadata { title: string; titles?: string[]; year: number; + yearEnd?: number; seasons?: { season_number: number; episode_count: number; diff --git a/packages/core/src/parser/file.ts b/packages/core/src/parser/file.ts index e40bdccc..cd9d5666 100644 --- a/packages/core/src/parser/file.ts +++ b/packages/core/src/parser/file.ts @@ -1,5 +1,5 @@ import { PARSE_REGEX } from './regex'; -import { ParsedFile } from '../db'; +import { ParsedFile } from '../db/schemas'; import ptt from './ptt'; function matchPattern( diff --git a/packages/core/src/parser/go-ptt.ts b/packages/core/src/parser/go-ptt.ts new file mode 100644 index 00000000..5c08ae1f --- /dev/null +++ b/packages/core/src/parser/go-ptt.ts @@ -0,0 +1,94 @@ +import { ParseResult, PTTServer } from 'go-ptt'; +import os from 'os'; +import { + Cache, + createLogger, + Env, + getSimpleTextHash, + getTimeTakenSincePoint, +} from '../utils'; + +const logger = createLogger('parser'); + +const parseCache = Cache.getInstance( + 'parseCache', + undefined, + true +); + +class PTT { + private static _pttServer: PTTServer | null = null; + private static _pttConfig: { + network: 'tcp' | 'unix'; + address: string; + } = + os.platform() === 'win32' + ? { + network: 'tcp', + address: `:${Env.PORT + 1}`, + } + : { + network: 'unix', + address: 'ptt.sock', + }; + + private constructor() {} + + public static async initialise(): Promise { + if (PTT._pttServer) { + return PTT._pttServer; + } + PTT._pttServer = new PTTServer(PTT._pttConfig); + await PTT._pttServer.start(); + logger.debug('PTT server started'); + return PTT._pttServer; + } + + public static async cleanup(): Promise { + await PTT._pttServer?.stop(); + PTT._pttServer = null; + } + + public static async parse(titles: string[]): Promise<(ParseResult | null)[]> { + const cacheKey = getSimpleTextHash(titles.join('|')); + const cached = await parseCache.get(cacheKey); + if (cached) { + return cached; + } + if (!PTT._pttServer) { + throw new Error('PTT server not running'); + } + if (titles.length === 0) { + return []; + } + const parsedTitles: (ParseResult | null)[] = []; + const startTime = Date.now(); + let results: ParseResult[] = []; + try { + results = await PTT._pttServer.parse({ + torrent_titles: titles, + normalize: true, + }); + } catch (error) { + logger.error( + `Error calling PTT server: ${error}, ${JSON.stringify((error as any).metadata)}`, + error + ); + } + logger.debug( + `PTT server parsed ${titles.length} titles in ${getTimeTakenSincePoint(startTime)}` + ); + titles.forEach((title, idx) => { + const result = results[idx]; + if (result.err) { + logger.error(`Error parsing title ${title} (${idx}): ${result.err}`); + parsedTitles.push(null); + } + parsedTitles.push(result); + }); + await parseCache.set(cacheKey, parsedTitles, 60 * 60 * 24); + return parsedTitles; + } +} + +export default PTT; diff --git a/packages/core/src/parser/index.ts b/packages/core/src/parser/index.ts index 0a07f956..4f30b2a5 100644 --- a/packages/core/src/parser/index.ts +++ b/packages/core/src/parser/index.ts @@ -1,2 +1,3 @@ export { default as FileParser } from './file'; export { default as StreamParser } from './streams'; +export { default as PTT } from './go-ptt'; diff --git a/packages/core/src/parser/regex.ts b/packages/core/src/parser/regex.ts index 7ef37f01..3fef647c 100644 --- a/packages/core/src/parser/regex.ts +++ b/packages/core/src/parser/regex.ts @@ -55,7 +55,7 @@ export const PARSE_REGEX: PARSE_REGEX = { WEBRip: createRegex('web[ .\\-_]?rip'), HDRip: createRegex('hd[ .\\-_]?rip|web[ .\\-_]?dl[ .\\-_]?rip'), 'HC HD-Rip': createRegex('hc|hd[ .\\-_]?rip'), - DVDRip: createRegex('dvd[ .\\-_]?(rip|mux|r|full|5|9)'), + DVDRip: createRegex('dvd[ .\\-_]?(rip|mux|r|full|5|9)?'), HDTV: createRegex( '(hd|pd)tv|tv[ .\\-_]?rip|hdtv[ .\\-_]?rip|dsr(ip)?|sat[ .\\-_]?rip' ), @@ -81,7 +81,7 @@ export const PARSE_REGEX: PARSE_REGEX = { '(d(olby)?[ .\\-_]?d(igital)?[ .\\-_]?(p(lus)?|\\+)(?:[ .\\-_]?(5[ .\\-_]?1|7[ .\\-_]?1))?)|e[ .\\-_]?ac[ .\\-_]?3' ), DD: createRegex( - '(d(olby)?[ .\\-_]?d(igital)?(?:[ .\\-_]?(5[ .\\-_]?1|7[ .\\-_]?1))?)|(? +) { + const { threshold, ...extractOptions } = options; + + const results = extract(parsedTitle, titles, { + ...extractOptions, + returnObjects: true, + }); + + const highestScore = + results.reduce( + (max: number, result: { choice: string; score: number; key: number }) => { + return Math.max(max, result.score); + }, + 0 + ) / 100; + + return highestScore >= threshold; +} + +export function normaliseTitle(title: string) { + return title + .normalize('NFD') + .replace(/[\u0300-\u036f]/g, '') + .replace(/[^\p{L}\p{N}+]/gu, '') + .toLowerCase(); +} diff --git a/packages/core/src/presets/aiCompanion.ts b/packages/core/src/presets/aiCompanion.ts index 9f3c5799..41628854 100644 --- a/packages/core/src/presets/aiCompanion.ts +++ b/packages/core/src/presets/aiCompanion.ts @@ -325,7 +325,7 @@ export class AICompanionPreset extends Preset { return result.manifest_url; } catch (error) { throw new Error( - `Failed to generate manifest URL for AI Search: ${error}` + `Failed to generate manifest URL for AI Companion: ${error}` ); } } diff --git a/packages/core/src/presets/animetosho.ts b/packages/core/src/presets/animetosho.ts new file mode 100644 index 00000000..7e1e12ef --- /dev/null +++ b/packages/core/src/presets/animetosho.ts @@ -0,0 +1,70 @@ +import { Option, UserData } from '../db'; +import { Env, constants } from '../utils'; +import { baseOptions } from './preset'; +import { StremThruPreset } from './stremthru'; +import { TorznabPreset } from './torznab'; + +export class AnimeToshoPreset extends TorznabPreset { + static override get METADATA() { + const supportedResources = [constants.STREAM_RESOURCE]; + const options: Option[] = [ + ...baseOptions( + 'AnimeTosho', + supportedResources, + Env.BUILTIN_ANIMETOSHO_TIMEOUT || Env.DEFAULT_TIMEOUT + ).filter((option) => option.id !== 'url' && option.id !== 'resources'), + { + id: 'services', + name: 'Services', + description: + 'Optionally override the services that are used. If not specified, then the services that are enabled and supported will be used.', + type: 'multi-select', + required: false, + showInNoobMode: false, + options: StremThruPreset.supportedServices.map((service) => ({ + value: service, + label: constants.SERVICE_DETAILS[service].name, + })), + default: undefined, + emptyIsUndefined: true, + }, + ]; + + return { + ID: 'animetosho', + NAME: 'AnimeTosho', + LOGO: '/assets/animetosho_logo.png', + URL: Env.BUILTIN_ANIMETOSHO_URL, + TIMEOUT: Env.BUILTIN_ANIMETOSHO_TIMEOUT || Env.DEFAULT_TIMEOUT, + USER_AGENT: Env.DEFAULT_USER_AGENT, + SUPPORTED_SERVICES: StremThruPreset.supportedServices, + DESCRIPTION: 'Directly search AnimeTosho.', + OPTIONS: options, + SUPPORTED_STREAM_TYPES: [constants.DEBRID_STREAM_TYPE], + SUPPORTED_RESOURCES: supportedResources, + BUILTIN: true, + }; + } + + protected static override generateManifestUrl( + userData: UserData, + services: constants.ServiceId[], + options: Record + ): string { + const animetoshoUrl = this.METADATA.URL; + + const config = { + url: animetoshoUrl, + apiPath: '/api', + tmdbAccessToken: userData.tmdbAccessToken, + tmdbApiKey: userData.tmdbApiKey, + services: services.map((service) => ({ + id: service, + credential: this.getServiceCredential(service, userData), + })), + }; + + const configString = this.base64EncodeJSON(config); + return `${Env.INTERNAL_URL}/builtins/torznab/${configString}/manifest.json`; + } +} diff --git a/packages/core/src/presets/builtin.ts b/packages/core/src/presets/builtin.ts new file mode 100644 index 00000000..e99e4b90 --- /dev/null +++ b/packages/core/src/presets/builtin.ts @@ -0,0 +1,70 @@ +import { ParsedStream, Stream, UserData } from '../db'; +import { StreamParser } from '../parser'; +import { ServiceId } from '../utils/constants'; +import { Preset } from './preset'; +import { stremthruSpecialCases } from './stremthru'; + +export class BuiltinStreamParser extends StreamParser { + override getFolder(stream: Stream): string | undefined { + if (!stream.description) { + return undefined; + } + const folderName = stream.description.split('\n')[0]; + return folderName.trim() || undefined; + } + + protected getError( + stream: Stream, + currentParsedStream: ParsedStream + ): ParsedStream['error'] | undefined { + if (stream.name?.startsWith('[❌]')) { + return { + // title: stream.name.replace('[❌]', ''), + title: this.addon.name, + description: stream.description || 'Unknown error', + }; + } + return undefined; + } + protected parseServiceData( + string: string + ): ParsedStream['service'] | undefined { + return super.parseServiceData(string.replace('TorBox', '')); + } + + protected getInLibrary( + stream: Stream, + currentParsedStream: ParsedStream + ): boolean { + return stream.name?.includes('☁️') ?? false; + } + + protected get ageRegex(): RegExp | undefined { + return this.getRegexForTextAfterEmojis(['🕒']); + } + + protected getStreamType( + stream: Stream, + service: ParsedStream['service'], + currentParsedStream: ParsedStream + ): ParsedStream['type'] { + return (stream as any).type === 'usenet' ? 'usenet' : 'debrid'; + } +} + +export class BuiltinAddonPreset extends Preset { + static override getParser(): typeof StreamParser { + return BuiltinStreamParser; + } + + protected static getServiceCredential( + serviceId: ServiceId, + userData: UserData, + specialCases?: Partial any>> + ) { + return super.getServiceCredential(serviceId, userData, { + ...stremthruSpecialCases, + ...specialCases, + }); + } +} diff --git a/packages/core/src/presets/moreLikeThis.ts b/packages/core/src/presets/moreLikeThis.ts index 3921e2f5..e606fd78 100644 --- a/packages/core/src/presets/moreLikeThis.ts +++ b/packages/core/src/presets/moreLikeThis.ts @@ -309,17 +309,18 @@ export class MoreLikeThisPreset extends Preset { default: 'en', }, { - id: 'streamButtonPlatform', + id: 'streamButtons', name: 'Stream Button Platform', description: - 'The type of buttons to show as streams on movie/series pages.', - type: 'select', + "This addon provides a set of streams in Stremio that act as buttons for easier access. Disable any you don't need.", + type: 'multi-select', options: [ - { label: 'Both', value: 'both' }, - { label: 'Web', value: 'web' }, + { label: 'Go to detail page', value: 'details' }, + { label: 'Show recommendations', value: 'recs' }, { label: 'App', value: 'app' }, + { label: 'Web', value: 'web' }, ], - default: 'both', + default: ['details', 'recs', 'app', 'web'], }, { id: 'includeTmdbCollection', @@ -363,7 +364,7 @@ export class MoreLikeThisPreset extends Preset { return { ID: 'more-like-this', NAME: 'More Like This', - LOGO: `https://raw.githubusercontent.com/rama1997/More-Like-This/refs/heads/main/assets/logo.jpg`, + LOGO: `https://raw.githubusercontent.com/rama1997/More-Like-This/refs/heads/main/assets/images/logo.jpg`, URL: Env.MORE_LIKE_THIS_URL, TIMEOUT: Env.DEFAULT_MORE_LIKE_THIS_TIMEOUT || Env.DEFAULT_TIMEOUT, USER_AGENT: @@ -421,8 +422,10 @@ export class MoreLikeThisPreset extends Preset { const isKeyValid = (key: string): string => typeof key === 'string' && key.length > 0 ? 'true' : ''; - - const config = { + const streamButtons = options.streamButtons + ? options.streamButtons.join(',') + : ['details', 'recs', 'app', 'web']; + const config: Record = { tmdbApiKey: tmdbApiKey ?? '', validatedTmdbApiKey: isKeyValid(tmdbApiKey ?? ''), includeTmdbCollection: options.includeTmdbCollection ? 'on' : '', @@ -436,8 +439,13 @@ export class MoreLikeThisPreset extends Preset { catalogOrder: 'TMDB,Trakt,Simkl,Gemini+AI,TasteDive,Watchmode', metadataSource: options.metadataSource, language: options.language, - streamButtonPlatform: options.streamButtonPlatform, enableTitleSearching: options.enableTitleSearching ? 'on' : '', + streamDetailEnabled: streamButtons.includes('details') ? 'on' : '', + streamRecEnabled: streamButtons.includes('recs') ? 'on' : '', + streamAppEnabled: streamButtons.includes('app') ? 'on' : '', + streamWebEnabled: streamButtons.includes('web') ? 'on' : '', + combineCatalogs: options.combineCatalogs ? 'on' : '', + streamOrder: streamButtons, rpdbApiKey: '', validatedRpdbApiKey: 'true', forCopy: 'true', @@ -471,7 +479,9 @@ export class MoreLikeThisPreset extends Preset { let manifestUrl = response.headers.get('Location'); if (response.status < 300 || response.status >= 400) { - throw new Error(`${response.status} - ${response.statusText}`); + throw new Error( + `${response.status} - ${response.statusText}: ${await response.text()}` + ); } if (!manifestUrl) { throw new Error('Manifest URL not present in redirect'); diff --git a/packages/core/src/presets/newznab.ts b/packages/core/src/presets/newznab.ts new file mode 100644 index 00000000..37960c53 --- /dev/null +++ b/packages/core/src/presets/newznab.ts @@ -0,0 +1,148 @@ +import { Addon, Option, Stream, UserData } from '../db'; +import { Preset, baseOptions } from './preset'; +import { Env, RESOURCES, ServiceId, constants } from '../utils'; +import { BuiltinAddonPreset } from './builtin'; + +export class NewznabPreset extends BuiltinAddonPreset { + static override get METADATA() { + const supportedResources = [constants.STREAM_RESOURCE]; + const options: Option[] = [ + { + id: 'name', + name: 'Name', + description: 'What to call this addon', + type: 'string', + required: true, + default: 'Newznab', + }, + { + id: 'newznabUrl', + name: 'Newznab URL', + description: 'Provide the URL to the Newznab endpoint ', + type: 'url', + required: true, + }, + { + id: 'apiKey', + name: 'API Key', + description: + 'The password for the Newznab API. This is used to authenticate with the Newznab endpoint.', + type: 'password', + required: false, + }, + { + id: 'apiPath', + name: 'API Path', + description: 'The path to the Newznab API. Usually /api.', + type: 'string', + required: false, + default: '/api', + }, + { + id: 'timeout', + name: 'Timeout', + description: 'The timeout for this addon', + type: 'number', + default: Env.DEFAULT_TIMEOUT, + constraints: { + min: Env.MIN_TIMEOUT, + max: Env.MAX_TIMEOUT, + }, + }, + { + id: 'forceQuerySearch', + name: 'Force Query Search', + description: 'Force the addon to use the query search parameter', + type: 'boolean', + required: false, + default: false, + }, + ]; + + return { + ID: 'newznab', + NAME: 'Newznab', + LOGO: '', + URL: `${Env.INTERNAL_URL}/builtins/newznab`, + TIMEOUT: Env.DEFAULT_TIMEOUT, + USER_AGENT: Env.DEFAULT_USER_AGENT, + SUPPORTED_SERVICES: [constants.TORBOX_SERVICE], + DESCRIPTION: + 'Directly search a Newznab instance for results with your services.', + OPTIONS: options, + SUPPORTED_STREAM_TYPES: [constants.USENET_STREAM_TYPE], + SUPPORTED_RESOURCES: supportedResources, + BUILTIN: true, + }; + } + + static async generateAddons( + userData: UserData, + options: Record + ): Promise { + const usableServices = this.getUsableServices(userData, options.services); + if (!usableServices || usableServices.length === 0) { + throw new Error( + `${this.METADATA.NAME} requires at least one usable service, but none were found. Please enable at least one of the following services: ${this.METADATA.SUPPORTED_SERVICES.join( + ', ' + )}` + ); + } + return [ + this.generateAddon( + userData, + options, + usableServices.map((service) => service.id) + ), + ]; + } + + private static generateAddon( + userData: UserData, + options: Record, + services: ServiceId[] + ): Addon { + return { + name: options.name || this.METADATA.NAME, + manifestUrl: this.generateManifestUrl(userData, services, options), + enabled: true, + library: options.libraryAddon ?? false, + resources: options.resources || undefined, + timeout: options.timeout || this.METADATA.TIMEOUT, + preset: { + id: '', + type: this.METADATA.ID, + options: options, + }, + formatPassthrough: + options.formatPassthrough ?? options.streamPassthrough ?? false, + resultPassthrough: options.resultPassthrough ?? false, + forceToTop: options.forceToTop ?? false, + headers: { + 'User-Agent': this.METADATA.USER_AGENT, + }, + }; + } + + protected static generateManifestUrl( + userData: UserData, + services: ServiceId[], + options: Record + ) { + const config = { + url: options.newznabUrl, + apiPath: options.apiPath, + apiKey: options.apiKey, + tmdbAccessToken: userData.tmdbAccessToken, + tmdbApiKey: userData.tmdbApiKey, + forceQuerySearch: options.forceQuerySearch ?? false, + services: services.map((service) => ({ + id: service, + credential: this.getServiceCredential(service, userData), + })), + }; + + const configString = this.base64EncodeJSON(config); + return `${this.METADATA.URL}/${configString}/manifest.json`; + } +} diff --git a/packages/core/src/presets/presetManager.ts b/packages/core/src/presets/presetManager.ts index 87377101..22d4e269 100644 --- a/packages/core/src/presets/presetManager.ts +++ b/packages/core/src/presets/presetManager.ts @@ -52,16 +52,27 @@ import { ContentDeepDivePreset } from './contentDeepDive'; import { AICompanionPreset } from './aiCompanion'; import { GoogleOAuth } from '../builtins/gdrive/api'; import { TorBoxSearchPreset } from './torboxSearch'; +import { TorznabPreset } from './torznab'; import { AStreamPreset } from './aStream'; import { Env } from '../utils/env'; +import { ZileanPreset } from './zilean'; +import { AnimeToshoPreset } from './animetosho'; +import { NewznabPreset } from './newznab'; +import { ProwlarrPreset } from './prowlarr'; let PRESET_LIST: string[] = [ 'custom', + 'torznab', + 'newznab', + 'aiostreams', 'torrentio', 'comet', 'mediafusion', 'stremthruTorz', 'stremthruStore', + 'animetosho', + 'zilean', + Env.BUILTIN_PROWLARR_URL && Env.BUILTIN_PROWLARR_API_KEY ? 'prowlarr' : '', 'jackettio', 'peerflix', 'orion', @@ -109,7 +120,6 @@ let PRESET_LIST: string[] = [ 'ai-search', 'more-like-this', 'content-deep-dive', - 'aiostreams', ].filter(Boolean); export class PresetManager { @@ -236,6 +246,16 @@ export class PresetManager { return GDrivePreset; case 'torbox-search': return TorBoxSearchPreset; + case 'torznab': + return TorznabPreset; + case 'newznab': + return NewznabPreset; + case 'zilean': + return ZileanPreset; + case 'animetosho': + return AnimeToshoPreset; + case 'prowlarr': + return ProwlarrPreset; default: throw new Error(`Preset ${id} not found`); } diff --git a/packages/core/src/presets/prowlarr.ts b/packages/core/src/presets/prowlarr.ts new file mode 100644 index 00000000..8c481e09 --- /dev/null +++ b/packages/core/src/presets/prowlarr.ts @@ -0,0 +1,135 @@ +import { Addon, Option, Stream, UserData } from '../db'; +import { Preset, baseOptions } from './preset'; +import { Env, RESOURCES, ServiceId, constants } from '../utils'; +import { StremThruPreset } from './stremthru'; +import { BuiltinAddonPreset } from './builtin'; + +export class ProwlarrPreset extends BuiltinAddonPreset { + static override get METADATA() { + const supportedResources = [constants.STREAM_RESOURCE]; + const options: Option[] = [ + { + id: 'name', + name: 'Name', + description: 'What to call this addon', + type: 'string', + required: true, + default: 'Prowlarr', + }, + { + id: 'timeout', + name: 'Timeout', + description: 'The timeout for this addon', + type: 'number', + default: Env.DEFAULT_TIMEOUT, + constraints: { + min: Env.MIN_TIMEOUT, + max: Env.MAX_TIMEOUT, + }, + }, + { + id: 'services', + name: 'Services', + description: + 'Optionally override the services that are used. If not specified, then the services that are enabled and supported will be used.', + type: 'multi-select', + required: false, + showInNoobMode: false, + options: StremThruPreset.supportedServices.map((service) => ({ + value: service, + label: constants.SERVICE_DETAILS[service].name, + })), + default: undefined, + emptyIsUndefined: true, + }, + ]; + + return { + ID: 'prowlarr', + NAME: 'Prowlarr', + LOGO: 'https://raw.githubusercontent.com/Prowlarr/Prowlarr/refs/heads/develop/Logo/256.png', + URL: `${Env.INTERNAL_URL}/builtins/prowlarr`, + TIMEOUT: Env.DEFAULT_TIMEOUT, + USER_AGENT: Env.DEFAULT_USER_AGENT, + SUPPORTED_SERVICES: StremThruPreset.supportedServices, + DESCRIPTION: + 'Directly search a Prowlarr instance for results with your services.', + OPTIONS: options, + SUPPORTED_STREAM_TYPES: [constants.DEBRID_STREAM_TYPE], + SUPPORTED_RESOURCES: supportedResources, + BUILTIN: true, + }; + } + + static async generateAddons( + userData: UserData, + options: Record + ): Promise { + const usableServices = this.getUsableServices(userData, options.services); + if ( + (!usableServices || usableServices.length === 0) && + !options.enableP2P + ) { + throw new Error( + `${this.METADATA.NAME} requires at least one usable service, but none were found. Please enable at least one of the following services: ${this.METADATA.SUPPORTED_SERVICES.join( + ', ' + )}` + ); + } + return [ + this.generateAddon( + userData, + options, + usableServices?.map((service) => service.id) || [] + ), + ]; + } + + private static generateAddon( + userData: UserData, + options: Record, + services: ServiceId[] + ): Addon { + return { + name: options.name || this.METADATA.NAME, + manifestUrl: this.generateManifestUrl(userData, services, options), + enabled: true, + library: options.libraryAddon ?? false, + resources: options.resources || undefined, + timeout: options.timeout || this.METADATA.TIMEOUT, + preset: { + id: '', + type: this.METADATA.ID, + options: options, + }, + formatPassthrough: + options.formatPassthrough ?? options.streamPassthrough ?? false, + resultPassthrough: options.resultPassthrough ?? false, + forceToTop: options.forceToTop ?? false, + headers: { + 'User-Agent': this.METADATA.USER_AGENT, + }, + }; + } + + protected static generateManifestUrl( + userData: UserData, + services: ServiceId[], + options: Record + ) { + const config = { + url: Env.BUILTIN_PROWLARR_URL, + apiKey: Env.BUILTIN_PROWLARR_API_KEY, + indexers: Env.BUILTIN_PROWLARR_INDEXERS || [], + tmdbAccessToken: userData.tmdbAccessToken, + tmdbApiKey: userData.tmdbApiKey, + services: services.map((service) => ({ + id: service, + credential: this.getServiceCredential(service, userData), + })), + }; + + const configString = this.base64EncodeJSON(config); + return `${this.METADATA.URL}/${configString}/manifest.json`; + } +} diff --git a/packages/core/src/presets/stremthru.ts b/packages/core/src/presets/stremthru.ts index 80c56157..2460deea 100644 --- a/packages/core/src/presets/stremthru.ts +++ b/packages/core/src/presets/stremthru.ts @@ -3,6 +3,15 @@ import { StreamParser } from '../parser'; import { constants, ServiceId } from '../utils'; import { Preset } from './preset'; +export const stremthruSpecialCases: Partial< + Record any> +> = { + [constants.OFFCLOUD_SERVICE]: (credentials: any) => + `${credentials.email}:${credentials.password}`, + [constants.PIKPAK_SERVICE]: (credentials: any) => + `${credentials.email}:${credentials.password}`, +}; + export class StremThruStreamParser extends StreamParser { protected override getIndexer( stream: Stream, @@ -59,11 +68,11 @@ export class StremThruPreset extends Preset { specialCases?: Partial any>> ) { return super.getServiceCredential(serviceId, userData, { - [constants.OFFCLOUD_SERVICE]: (credentials: any) => - `${credentials.email}:${credentials.password}`, - [constants.PIKPAK_SERVICE]: (credentials: any) => - `${credentials.email}:${credentials.password}`, + ...stremthruSpecialCases, ...specialCases, }); } } + +export type StremThruServiceId = + (typeof StremThruPreset.supportedServices)[number]; diff --git a/packages/core/src/presets/torznab.ts b/packages/core/src/presets/torznab.ts new file mode 100644 index 00000000..0c519111 --- /dev/null +++ b/packages/core/src/presets/torznab.ts @@ -0,0 +1,164 @@ +import { Addon, Option, Stream, UserData } from '../db'; +import { Preset, baseOptions } from './preset'; +import { Env, RESOURCES, ServiceId, constants } from '../utils'; +import { StremThruPreset } from './stremthru'; +import { BuiltinAddonPreset } from './builtin'; + +export class TorznabPreset extends BuiltinAddonPreset { + static override get METADATA() { + const supportedResources = [constants.STREAM_RESOURCE]; + const options: Option[] = [ + { + id: 'name', + name: 'Name', + description: 'What to call this addon', + type: 'string', + required: true, + default: 'Torznab', + }, + { + id: 'torznabUrl', + name: 'Torznab URL', + description: 'Provide the URL to the Torznab endpoint ', + type: 'url', + required: true, + }, + { + id: 'apiKey', + name: 'API Key', + description: + 'The password for the Torznab API. This is used to authenticate with the Torznab endpoint.', + type: 'password', + required: false, + }, + { + id: 'apiPath', + name: 'API Path', + description: 'The path to the Torznab API. Usually /api.', + type: 'string', + required: false, + default: '/api', + }, + { + id: 'timeout', + name: 'Timeout', + description: 'The timeout for this addon', + type: 'number', + default: Env.DEFAULT_TIMEOUT, + constraints: { + min: Env.MIN_TIMEOUT, + max: Env.MAX_TIMEOUT, + }, + }, + { + id: 'services', + name: 'Services', + description: + 'Optionally override the services that are used. If not specified, then the services that are enabled and supported will be used.', + type: 'multi-select', + required: false, + showInNoobMode: false, + options: StremThruPreset.supportedServices.map((service) => ({ + value: service, + label: constants.SERVICE_DETAILS[service].name, + })), + default: undefined, + emptyIsUndefined: true, + }, + { + id: 'forceQuerySearch', + name: 'Force Query Search', + description: 'Force the addon to use the query search parameter', + type: 'boolean', + required: false, + default: false, + }, + ]; + + return { + ID: 'torznab', + NAME: 'Torznab', + LOGO: '', + URL: `${Env.INTERNAL_URL}/builtins/torznab`, + TIMEOUT: Env.DEFAULT_TIMEOUT, + USER_AGENT: Env.DEFAULT_USER_AGENT, + SUPPORTED_SERVICES: StremThruPreset.supportedServices, + DESCRIPTION: + 'Directly search a Torznab instance for results with your services.', + OPTIONS: options, + SUPPORTED_STREAM_TYPES: [constants.DEBRID_STREAM_TYPE], + SUPPORTED_RESOURCES: supportedResources, + BUILTIN: true, + }; + } + + static async generateAddons( + userData: UserData, + options: Record + ): Promise { + const usableServices = this.getUsableServices(userData, options.services); + if (!usableServices || usableServices.length === 0) { + throw new Error( + `${this.METADATA.NAME} requires at least one usable service, but none were found. Please enable at least one of the following services: ${this.METADATA.SUPPORTED_SERVICES.join( + ', ' + )}` + ); + } + return [ + this.generateAddon( + userData, + options, + usableServices?.map((service) => service.id) || [] + ), + ]; + } + + private static generateAddon( + userData: UserData, + options: Record, + services: ServiceId[] + ): Addon { + return { + name: options.name || this.METADATA.NAME, + manifestUrl: this.generateManifestUrl(userData, services, options), + enabled: true, + library: options.libraryAddon ?? false, + resources: options.resources || undefined, + timeout: options.timeout || this.METADATA.TIMEOUT, + preset: { + id: '', + type: this.METADATA.ID, + options: options, + }, + formatPassthrough: + options.formatPassthrough ?? options.streamPassthrough ?? false, + resultPassthrough: options.resultPassthrough ?? false, + forceToTop: options.forceToTop ?? false, + headers: { + 'User-Agent': this.METADATA.USER_AGENT, + }, + }; + } + + protected static generateManifestUrl( + userData: UserData, + services: ServiceId[], + options: Record + ) { + const config = { + url: options.torznabUrl, + apiPath: options.apiPath, + apiKey: options.apiKey, + tmdbAccessToken: userData.tmdbAccessToken, + tmdbApiKey: userData.tmdbApiKey, + forceQuerySearch: options.forceQuerySearch ?? false, + services: services.map((service) => ({ + id: service, + credential: this.getServiceCredential(service, userData), + })), + }; + + const configString = this.base64EncodeJSON(config); + return `${this.METADATA.URL}/${configString}/manifest.json`; + } +} diff --git a/packages/core/src/presets/zilean.ts b/packages/core/src/presets/zilean.ts new file mode 100644 index 00000000..872a1d77 --- /dev/null +++ b/packages/core/src/presets/zilean.ts @@ -0,0 +1,77 @@ +import { Option, UserData } from '../db'; +import { Env, constants } from '../utils'; +import { baseOptions } from './preset'; +import { StremThruPreset } from './stremthru'; +import { TorznabPreset } from './torznab'; + +export class ZileanPreset extends TorznabPreset { + static override get METADATA() { + const supportedResources = [constants.STREAM_RESOURCE]; + const options: Option[] = [ + ...baseOptions( + 'Zilean', + supportedResources, + Env.BUILTIN_ZILEAN_TIMEOUT || Env.DEFAULT_TIMEOUT + ).filter((option) => option.id !== 'url' && option.id !== 'resources'), + { + id: 'url', + name: 'URL', + description: 'Optionally override the URL of the Zilean instance', + type: 'url', + required: false, + }, + { + id: 'services', + name: 'Services', + description: + 'Optionally override the services that are used. If not specified, then the services that are enabled and supported will be used.', + type: 'multi-select', + required: false, + showInNoobMode: false, + options: StremThruPreset.supportedServices.map((service) => ({ + value: service, + label: constants.SERVICE_DETAILS[service].name, + })), + default: undefined, + emptyIsUndefined: true, + }, + ]; + + return { + ID: 'zilean', + NAME: 'Zilean', + LOGO: '/assets/zilean_logo.jpg', + URL: Env.BUILTIN_ZILEAN_URL, + TIMEOUT: Env.BUILTIN_ZILEAN_TIMEOUT || Env.DEFAULT_TIMEOUT, + USER_AGENT: Env.DEFAULT_USER_AGENT, + SUPPORTED_SERVICES: StremThruPreset.supportedServices, + DESCRIPTION: 'Directly search a Zilean instance.', + OPTIONS: options, + SUPPORTED_STREAM_TYPES: [constants.DEBRID_STREAM_TYPE], + SUPPORTED_RESOURCES: supportedResources, + BUILTIN: true, + }; + } + + protected static override generateManifestUrl( + userData: UserData, + services: constants.ServiceId[], + options: Record + ): string { + const zileanUrl = (options.url || this.METADATA.URL).replace(/\/$/, ''); + + const config = { + url: `${zileanUrl}/torznab`, + apiPath: '/api', + tmdbAccessToken: userData.tmdbAccessToken, + tmdbApiKey: userData.tmdbApiKey, + services: services.map((service) => ({ + id: service, + credential: this.getServiceCredential(service, userData), + })), + }; + + const configString = this.base64EncodeJSON(config); + return `${Env.INTERNAL_URL}/builtins/torznab/${configString}/manifest.json`; + } +} diff --git a/packages/core/src/streams/fetcher.ts b/packages/core/src/streams/fetcher.ts index 742c415d..f42d0aba 100644 --- a/packages/core/src/streams/fetcher.ts +++ b/packages/core/src/streams/fetcher.ts @@ -1,5 +1,10 @@ import { Addon, ParsedStream, UserData } from '../db/schemas'; -import { constants, createLogger, getTimeTakenSincePoint } from '../utils'; +import { + AnimeDatabase, + constants, + createLogger, + getTimeTakenSincePoint, +} from '../utils'; import { Wrapper } from '../wrapper'; import { GroupConditionEvaluator } from '../parser/streamExpression'; import { getAddonName } from '../utils/general'; @@ -46,6 +51,10 @@ class StreamFetcher { }[] = []; let allStreams: ParsedStream[] = []; const start = Date.now(); + let queryType = type; + if (AnimeDatabase.getInstance().isAnime(id)) { + queryType = 'anime'; + } // Helper function to fetch streams from an addon and log summary const fetchFromAddon = async (addon: Addon) => { @@ -147,7 +156,7 @@ class StreamFetcher { await this.precompute.precompute(filteredStreams); logger.info( - `Group processing finished. Filtered to ${filteredStreams.length} streams in ${getTimeTakenSincePoint(groupStart)}` + `Finished fetching from group in ${getTimeTakenSincePoint(groupStart)}` ); return { totalTime: Date.now() - groupStart, @@ -211,7 +220,7 @@ class StreamFetcher { allStreams, previousGroupTimeTaken, totalTimeTaken, - type + queryType ); const shouldFetchNext = await evaluator.evaluate( nextGroup.condition @@ -233,7 +242,7 @@ class StreamFetcher { allStreams, previousGroupTimeTaken, totalTimeTaken, - type + queryType ); const shouldFetch = await evaluator.evaluate(group.condition); diff --git a/packages/core/src/streams/filterer.ts b/packages/core/src/streams/filterer.ts index d62e662d..cc9d7c4b 100644 --- a/packages/core/src/streams/filterer.ts +++ b/packages/core/src/streams/filterer.ts @@ -4,6 +4,8 @@ import { FeatureControl, getTimeTakenSincePoint, constants, + AnimeDatabase, + IdParser, } from '../utils'; import { TYPES } from '../utils/constants'; import { compileRegex } from '../utils/regex'; @@ -12,7 +14,11 @@ import { safeRegexTest } from '../utils/regex'; import { StreamType } from '../utils/constants'; import { StreamSelector } from '../parser/streamExpression'; import StreamUtils from './utils'; -import { TMDBMetadata, TMDBMetadataResponse } from '../metadata/tmdb'; +import { MetadataService } from '../metadata/service'; +import { Metadata } from '../metadata/utils'; +import { titleMatch } from '../parser/utils'; +import { partial_ratio } from 'fuzzball'; +import { calculateAbsoluteEpisode } from '../builtins/utils/general'; const logger = createLogger('filterer'); @@ -32,7 +38,15 @@ class StreamFilterer { total: number; details: Record; } - const isAnime = id.startsWith('kitsu'); + const parsedId = IdParser.parse(id, type); + let isAnime = id.startsWith('kitsu'); + + if (AnimeDatabase.getInstance().isAnime(id)) { + logger.debug( + `Determined that ${id} is anime based on an existing entry in the anime database` + ); + isAnime = true; + } const skipReasons: Record = { titleMatching: { total: 0, details: {} }, yearMatching: { total: 0, details: {} }, @@ -92,17 +106,51 @@ class StreamFilterer { ...(this.userData.includedRegexPatterns ?? []), ]); - let requestedMetadata: TMDBMetadataResponse | undefined; + let requestedMetadata: + | (Metadata & { absoluteEpisode?: number }) + | undefined; if ( (this.userData.titleMatching?.enabled || - this.userData.yearMatching?.enabled) && + this.userData.yearMatching?.enabled || + this.userData.seasonEpisodeMatching?.enabled) && TYPES.includes(type as any) ) { try { - requestedMetadata = await new TMDBMetadata({ - accessToken: this.userData.tmdbAccessToken, - apiKey: this.userData.tmdbApiKey, - }).getMetadata(id, type as any); + if (!parsedId) { + throw new Error(`Invalid ID: ${id}`); + } + const animeEntry = AnimeDatabase.getInstance().getEntryById( + parsedId.type, + parsedId.value + ); + if (animeEntry && !parsedId.season) { + parsedId.season = + animeEntry.imdb?.fromImdbSeason?.toString() ?? + animeEntry.trakt?.season?.toString(); + } + requestedMetadata = await new MetadataService({ + tmdbAccessToken: this.userData.tmdbAccessToken, + tmdbApiKey: this.userData.tmdbApiKey, + }).getMetadata(parsedId, type as any); + if ( + isAnime && + parsedId.season && + parsedId.episode && + requestedMetadata.seasons + ) { + const seasons = requestedMetadata.seasons.map( + ({ season_number, episode_count }) => ({ + number: season_number.toString(), + episodes: episode_count, + }) + ); + logger.debug( + `Calculating absolute episode with current season and episode: ${parsedId.season}, ${parsedId.episode} and seasons: ${JSON.stringify(seasons)}` + ); + requestedMetadata.absoluteEpisode = Number( + calculateAbsoluteEpisode(parsedId.season, parsedId.episode, seasons) + ); + } logger.info(`Fetched metadata for ${id}`, requestedMetadata); } catch (error) { logger.warn( @@ -127,7 +175,11 @@ class StreamFilterer { if (!titleMatchingOptions || !titleMatchingOptions.enabled) { return true; } - if (!requestedMetadata || requestedMetadata.titles.length === 0) { + if ( + !requestedMetadata || + !requestedMetadata.titles || + requestedMetadata.titles.length === 0 + ) { return true; } @@ -153,12 +205,21 @@ class StreamFilterer { } if (titleMatchingOptions.mode === 'exact') { - return requestedMetadata?.titles.some( - (title) => normaliseTitle(title) === normaliseTitle(streamTitle) + return titleMatch( + normaliseTitle(streamTitle), + requestedMetadata.titles.map(normaliseTitle), + { + threshold: 0.85, + } ); } else { - return requestedMetadata?.titles.some((title) => - normaliseTitle(streamTitle).includes(normaliseTitle(title)) + return titleMatch( + normaliseTitle(streamTitle), + requestedMetadata.titles.map(normaliseTitle), + { + threshold: 0.85, + scorer: partial_ratio, + } ); } }; @@ -193,33 +254,40 @@ class StreamFilterer { } const streamYear = stream.parsedFile?.year; - if (!streamYear && type === 'movie') { - // only filter out movies without a year as series results usually don't include a year - return false; - } if (!streamYear) { - // non-movie results without a year can be kept in - return true; + // if no year is present, filter out if its a movie, keep otherwise + return type === 'movie' ? false : true; } + // streamYear can be a string like "2004" or "2012-2020" - const requestedYear = Number(requestedMetadata.year); - let streamYearRange: [number, number] | undefined; - if (streamYear && streamYear.includes('-')) { + // Calculate the requested year range + let requestedYearRange: [number, number] = [ + requestedMetadata.year, + requestedMetadata.year, + ]; + if (requestedMetadata.yearEnd) { + requestedYearRange[1] = requestedMetadata.yearEnd; + } + + // Calculate the stream year range + let streamYearRange: [number, number]; + if (streamYear.includes('-')) { const [min, max] = streamYear.split('-').map(Number); streamYearRange = [min, max]; } else { - streamYearRange = [Number(streamYear), Number(streamYear)]; + const yearNum = Number(streamYear); + streamYearRange = [yearNum, yearNum]; } - let tolerance = yearMatchingOptions.tolerance ?? 1; - streamYearRange[0] = streamYearRange[0] - tolerance; - streamYearRange[1] = streamYearRange[1] + tolerance; + // Apply tolerance to the stream year range + const tolerance = yearMatchingOptions.tolerance ?? 1; + streamYearRange[0] -= tolerance; + streamYearRange[1] += tolerance; - // requested year should be within the stream year range - return ( - requestedYear >= streamYearRange[0] && - requestedYear <= streamYearRange[1] - ); + // If the requested year range and stream year range overlap, accept the stream + const [requestedStart, requestedEnd] = requestedYearRange; + const [streamStart, streamEnd] = streamYearRange; + return requestedStart <= streamEnd && requestedEnd >= streamStart; }; const performSeasonEpisodeMatch = (stream: ParsedStream) => { @@ -231,17 +299,13 @@ class StreamFilterer { return true; } - // parse the id to get the season and episode - const seasonEpisodeRegex = /:(\d+):(\d+)$/; - const match = id.match(seasonEpisodeRegex); - - if (!match || !match[1] || !match[2]) { - // only if both season and episode are present, we can filter - return true; - } - - const requestedSeason = parseInt(match[1]); - const requestedEpisode = parseInt(match[2]); + if (!parsedId) return true; + const requestedSeason = Number.isInteger(Number(parsedId.season)) + ? Number(parsedId.season) + : undefined; + const requestedEpisode = Number.isInteger(Number(parsedId.episode)) + ? Number(parsedId.episode) + : undefined; if ( seasonEpisodeMatchingOptions.requestTypes?.length && @@ -270,11 +334,14 @@ class StreamFilterer { return false; } - // is requested episode present + // is the present episode incorrect (does not match either the requested episode or absolute episode if present) if ( requestedEpisode && stream.parsedFile?.episode && - stream.parsedFile.episode !== requestedEpisode + stream.parsedFile.episode !== requestedEpisode && + (requestedMetadata?.absoluteEpisode + ? stream.parsedFile.episode !== requestedMetadata.absoluteEpisode + : true) ) { return false; } diff --git a/packages/core/src/utils/anime-database.ts b/packages/core/src/utils/anime-database.ts new file mode 100644 index 00000000..6dafd6c1 --- /dev/null +++ b/packages/core/src/utils/anime-database.ts @@ -0,0 +1,858 @@ +import path from 'path'; +import fs from 'fs/promises'; +import { z, ZodError } from 'zod'; +import { getDataFolder } from './general'; +import { makeRequest } from './http'; +import { createLogger, getTimeTakenSincePoint } from './logger'; +import { IdParser, IdType, ID_TYPES } from './id-parser'; +import { formatZodError } from './config'; +import { DistributedLock, Env } from '.'; +import { createWriteStream } from 'fs'; + +const logger = createLogger('anime-database'); + +// --- Constants for Data Sources --- +const ANIME_DATABASE_PATH = path.join(getDataFolder(), 'anime-database'); + +const DATA_SOURCES = { + fribbMappings: { + name: 'Fribb Mappings', + url: 'https://raw.githubusercontent.com/Fribb/anime-lists/refs/heads/master/anime-list-full.json', + filePath: path.join(ANIME_DATABASE_PATH, 'fribb-mappings.json'), + etagPath: path.join(ANIME_DATABASE_PATH, 'fribb-mappings.etag'), + loader: 'loadFribbMappings', + refreshInterval: Env.ANIME_DB_FRIBB_MAPPINGS_REFRESH_INTERVAL, + dataKey: 'fribbMappingsById', + }, + manami: { + name: 'Manami DB', + url: 'https://github.com/manami-project/anime-offline-database/releases/download/latest/anime-offline-database.json', + filePath: path.join(ANIME_DATABASE_PATH, 'manami-db.json'), + etagPath: path.join(ANIME_DATABASE_PATH, 'manami-db.etag'), + loader: 'loadManamiDb', + refreshInterval: Env.ANIME_DB_MANAMI_DB_REFRESH_INTERVAL, + dataKey: 'manamiById', + }, + kitsuImdb: { + name: 'Kitsu IMDB Mapping', + url: 'https://raw.githubusercontent.com/TheBeastLT/stremio-kitsu-anime/master/static/data/imdb_mapping.json', + filePath: path.join(ANIME_DATABASE_PATH, 'kitsu-imdb-mapping.json'), + etagPath: path.join(ANIME_DATABASE_PATH, 'kitsu-imdb-mapping.etag'), + loader: 'loadKitsuImdbMapping', + refreshInterval: Env.ANIME_DB_KITSU_IMDB_MAPPING_REFRESH_INTERVAL, + dataKey: 'kitsuById', + }, + anitraktMovies: { + name: 'Extended Anitrakt Movies', + url: 'https://github.com/rensetsu/db.trakt.extended-anitrakt/releases/download/latest/movies_ex.json', + filePath: path.join(ANIME_DATABASE_PATH, 'anitrakt-movies-ex.json'), + etagPath: path.join(ANIME_DATABASE_PATH, 'anitrakt-movies-ex.etag'), + loader: 'loadExtendedAnitraktMovies', + refreshInterval: Env.ANIME_DB_EXTENDED_ANITRAKT_MOVIES_REFRESH_INTERVAL, + dataKey: 'extendedAnitraktMoviesById', + }, + anitraktTv: { + name: 'Extended Anitrakt TV', + url: 'https://github.com/rensetsu/db.trakt.extended-anitrakt/releases/download/latest/tv_ex.json', + filePath: path.join(ANIME_DATABASE_PATH, 'anitrakt-tv-ex.json'), + etagPath: path.join(ANIME_DATABASE_PATH, 'anitrakt-tv-ex.etag'), + loader: 'loadExtendedAnitraktTv', + refreshInterval: Env.ANIME_DB_EXTENDED_ANITRAKT_TV_REFRESH_INTERVAL, + dataKey: 'extendedAnitraktTvById', + }, +} as const; + +const extractIdFromUrl: { + [K in + | 'anidbId' + | 'anilistId' + | 'animePlanetId' + | 'animecountdownId' + | 'anisearchId' + | 'imdbId' + | 'kitsuId' + | 'livechartId' + | 'malId' + | 'notifyMoeId' + | 'simklId' + | 'themoviedbId' + | 'thetvdbId']?: (url: string) => string | null; +} = { + anidbId: (url: string) => { + const match = url.match(/anidb\.net\/anime\/(\d+)/); + return match ? match[1] : null; + }, + anilistId: (url: string) => { + const match = url.match(/anilist\.co\/anime\/(\d+)/); + return match ? match[1] : null; + }, + animePlanetId: (url: string) => { + const match = url.match(/anime-planet\.com\/anime\/(\w+)/); + return match ? match[1] : null; + }, + animecountdownId: (url: string) => { + const match = url.match(/animecountdown\.com\/(\d+)/); + return match ? match[1] : null; + }, + anisearchId: (url: string) => { + const match = url.match(/anisearch\.com\/anime\/(\d+)/); + return match ? match[1] : null; + }, + kitsuId: (url: string) => { + const match = url.match(/kitsu\.app\/anime\/(\d+)/); + return match ? match[1] : null; + }, + livechartId: (url: string) => { + const match = url.match(/livechart\.me\/anime\/(\d+)/); + return match ? match[1] : null; + }, + malId: (url: string) => { + const match = url.match(/myanimelist\.net\/anime\/(\d+)/); + return match ? match[1] : null; + }, + notifyMoeId: (url: string) => { + const match = url.match(/notify\.moe\/anime\/(\w+)/); + return match ? match[1] : null; + }, + simklId: (url: string) => { + const match = url.match(/simkl\.com\/anime\/(\d+)/); + return match ? match[1] : null; + }, +}; + +// --- Zod Schemas and Types --- + +const AnimeType = z.enum(['TV', 'SPECIAL', 'OVA', 'MOVIE', 'ONA', 'UNKNOWN']); +const AnimeStatus = z.enum([ + 'CURRENT', + 'FINISHED', + 'UPCOMING', + 'UNKNOWN', + 'ONGOING', +]); +const AnimeSeason = z.enum(['WINTER', 'SPRING', 'SUMMER', 'FALL', 'UNDEFINED']); +// Schema for Fribb's Mappings +const MappingEntrySchema = z + .object({ + 'anime-planet_id': z.union([z.string(), z.number()]).optional(), + animecountdown_id: z.number().optional(), + anidb_id: z.number().optional(), + anilist_id: z.number().optional(), + anisearch_id: z.number().optional(), + imdb_id: z.string().optional().nullable(), + kitsu_id: z.number().optional(), + livechart_id: z.number().optional(), + mal_id: z.number().optional(), + 'notify.moe_id': z.string().optional(), + simkl_id: z.number().optional(), + themoviedb_id: z.coerce.number().optional(), + thetvdb_id: z.number().optional().nullable(), + trakt_id: z.number().optional(), + type: AnimeType, + }) + .transform((data) => ({ + animePlanetId: data['anime-planet_id'], + animecountdownId: data['animecountdown_id'], + anidbId: data['anidb_id'], + anilistId: data['anilist_id'], + anisearchId: data['anisearch_id'], + imdbId: data['imdb_id'], + kitsuId: data['kitsu_id'], + livechartId: data['livechart_id'], + malId: data['mal_id'], + notifyMoeId: data['notify.moe_id'], + simklId: data['simkl_id'], + themoviedbId: data['themoviedb_id'], + thetvdbId: data['thetvdb_id'], + traktId: data['trakt_id'], + type: data['type'], + })); +type MappingEntry = z.infer; + +// Schema for Manami's Database +const ManamiEntrySchema = z.object({ + sources: z.array(z.url()), + title: z.string(), + type: AnimeType, + episodes: z.number(), + status: AnimeStatus, + animeSeason: z.object({ + season: AnimeSeason, + year: z.number().nullable(), + }), + picture: z.url().nullable(), + thumbnail: z.url().nullable(), + duration: z + .object({ + value: z.number(), + unit: z.enum(['SECONDS']), + }) + .nullable(), + score: z + .object({ + arithmeticGeometricMean: z.number(), + arithmeticMean: z.number(), + median: z.number(), + }) + .nullable(), + synonyms: z.array(z.string()), + studios: z.array(z.string()), + producers: z.array(z.string()), + relatedAnime: z.array(z.url()), + tags: z.array(z.string()), +}); +type ManamiEntry = z.infer; + +const KitsuEntrySchema = z + .object({ + fanartLogoId: z.coerce.number().optional(), + tvdb_id: z.coerce.number().optional(), + imdb_id: z.string().optional(), + title: z.string().optional(), + fromSeason: z.number().optional(), + fromEpisode: z.number().optional(), + }) + .transform((data) => ({ + fanartLogoId: data.fanartLogoId, + tvdbId: data.tvdb_id, + imdbId: data.imdb_id, + title: data.title, + fromSeason: data.fromSeason, + fromEpisode: data.fromEpisode, + })); +type KitsuEntry = z.infer; + +const ExtendedAnitraktMovieEntrySchema = z + .object({ + myanimelist: z.object({ + title: z.string(), + id: z.number(), + }), + trakt: z.object({ + title: z.string(), + id: z.number(), + slug: z.string(), + type: z.literal('movies'), + }), + release_year: z.number(), + externals: z.object({ + tmdb: z.number().optional().nullable(), + imdb: z.string().optional().nullable(), + letterboxd: z + .object({ + slug: z.string().nullable(), + lid: z.string().nullable(), + uid: z.number().nullable(), + }) + .nullable(), + }), + }) + .transform((data) => ({ + myanimelist: data.myanimelist, + trakt: data.trakt, + releaseYear: data.release_year, + externals: data.externals, + })); +type ExtendedAnitraktMovieEntry = z.infer< + typeof ExtendedAnitraktMovieEntrySchema +>; + +const ExtendedAnitraktTvEntrySchema = z + .object({ + myanimelist: z.object({ + title: z.string(), + id: z.number(), + }), + trakt: z.object({ + title: z.string(), + id: z.number(), + slug: z.string(), + type: z.literal('shows'), + is_split_cour: z.boolean(), + season: z + .object({ + id: z.number(), + number: z.number(), + externals: z.object({ + tvdb: z.number().nullable(), + tmdb: z.number().nullable(), + imdb: z.string().optional().nullable(), + }), + }) + .nullable(), + }), + release_year: z.number(), + externals: z.object({ + tvdb: z.number().optional().nullable(), + tmdb: z.number().optional().nullable(), + imdb: z.string().optional().nullable(), + }), + }) + .transform((data) => ({ + myanimelist: data.myanimelist, + trakt: { + title: data.trakt.title, + id: data.trakt.id, + slug: data.trakt.slug, + type: data.trakt.type, + isSplitCour: data.trakt.is_split_cour, + season: data.trakt.season, + }, + releaseYear: data.release_year, + externals: data.externals, + })); + +type ExtendedAnitraktTvEntry = z.infer; + +type MappingIdMap = Map>; +type ManamiIdMap = Map>; +type KitsuIdMap = Map; +type ExtendedAnitraktMoviesIdMap = Map; +type ExtendedAnitraktTvIdMap = Map; + +export class AnimeDatabase { + private static instance: AnimeDatabase; + private isInitialised = false; + + // Data storage + // private mappingsById: MappingIdMap = new Map(); + // private manamiById: ManamiIdMap = new Map(); + // private kitsuById: KitsuIdMap = new Map(); + // private extendedAnitraktMoviesById: ExtendedAnitraktMoviesIdMap = new Map(); + // private extendedAnitraktTvById: ExtendedAnitraktTvIdMap = new Map(); + + private dataStore: { + fribbMappingsById: MappingIdMap; + manamiById: ManamiIdMap; + kitsuById: KitsuIdMap; + extendedAnitraktMoviesById: ExtendedAnitraktMoviesIdMap; + extendedAnitraktTvById: ExtendedAnitraktTvIdMap; + } = { + fribbMappingsById: new Map(), + manamiById: new Map(), + kitsuById: new Map(), + extendedAnitraktMoviesById: new Map(), + extendedAnitraktTvById: new Map(), + }; + + // Refresh timers + private refreshTimers: NodeJS.Timeout[] = []; + + private constructor() {} + + public static getInstance(): AnimeDatabase { + if (!this.instance) { + this.instance = new AnimeDatabase(); + } + return this.instance; + } + + public async initialise(): Promise { + if (this.isInitialised) { + logger.warn('AnimeDatabase is already initialised.'); + return; + } + + logger.info('Starting initial refresh of all anime data sources...'); + // Perform initial fetch for all datasets concurrently + const refreshPromises = Object.values(DATA_SOURCES).map((dataSource) => + this.refreshDataSource(dataSource) + ); + await Promise.all(refreshPromises); + + this.setupAllRefreshIntervals(); + this.isInitialised = true; + logger.info('AnimeDatabase initialised successfully.'); + } + + // --- Public Methods for Data Access --- + + public isAnime(id: string): boolean { + const parsedId = IdParser.parse(id, 'unknown'); + if (parsedId && this.getEntryById(parsedId.type, parsedId.value) !== null) { + return true; + } + return false; + } + + public getEntryById(idType: IdType, idValue: string | number) { + const getFromMap = (map: Map | undefined, key: any) => + map?.get(key) || map?.get(key.toString()) || map?.get(Number(key)); + + let mappings = getFromMap( + this.dataStore.fribbMappingsById.get(idType), + idValue + ); + let details = getFromMap(this.dataStore.manamiById.get(idType), idValue); + + // If no direct match for details, try finding via mappings + if (!details && mappings) { + logger.debug('No direct match for details, searching via mappings...'); + for (const [type, id] of Object.entries(mappings)) { + if (id && type !== idType) { + details = getFromMap( + this.dataStore.manamiById.get(type as IdType), + id + ); + if (details) break; + } + } + } + + const malId = + mappings?.malId ?? (idType === 'malId' ? Number(idValue) : null); + const kitsuId = + mappings?.kitsuId ?? (idType === 'kitsuId' ? Number(idValue) : null); + + const kitsuEntry = kitsuId ? this.dataStore.kitsuById.get(kitsuId) : null; + const tvAnitraktEntry = malId + ? this.dataStore.extendedAnitraktTvById.get(malId) + : null; + const movieAnitraktEntry = malId + ? this.dataStore.extendedAnitraktMoviesById.get(malId) + : null; + + if ( + !details && + !mappings && + !kitsuEntry && + !tvAnitraktEntry && + !movieAnitraktEntry + ) { + return null; + } + + // Merge data from all sources + const finalMappings = { + ...mappings, + imdbId: + mappings?.imdbId ?? + kitsuEntry?.imdbId ?? + movieAnitraktEntry?.externals?.imdb ?? + tvAnitraktEntry?.externals?.imdb, + kitsuId: mappings?.kitsuId ?? kitsuId, + malId: mappings?.malId ?? malId, + themoviedbId: + mappings?.themoviedbId ?? + movieAnitraktEntry?.externals?.tmdb ?? + tvAnitraktEntry?.externals?.tmdb, + thetvdbId: + kitsuEntry?.tvdbId ?? + mappings?.thetvdbId ?? + tvAnitraktEntry?.externals?.tvdb, + traktId: + mappings?.traktId ?? + tvAnitraktEntry?.trakt?.id ?? + movieAnitraktEntry?.trakt?.id, + }; + + return { + mappings: finalMappings, + imdb: kitsuEntry + ? { + fromImdbSeason: kitsuEntry.fromSeason, + fromImdbEpisode: kitsuEntry.fromEpisode, + title: kitsuEntry.title, + } + : null, + fanart: kitsuEntry?.fanartLogoId + ? { logoId: kitsuEntry.fanartLogoId } + : null, + trakt: tvAnitraktEntry?.trakt + ? { + title: tvAnitraktEntry.trakt.title, + slug: tvAnitraktEntry.trakt.slug, + isSplitCour: tvAnitraktEntry.trakt.isSplitCour, + season: tvAnitraktEntry.trakt.season ?? null, + } + : movieAnitraktEntry?.trakt + ? { + title: movieAnitraktEntry.trakt.title, + slug: movieAnitraktEntry.trakt.slug, + } + : null, + ...details, + }; + } + + // --- Refresh Interval Configuration --- + + private setupAllRefreshIntervals(): void { + this.refreshTimers.forEach(clearInterval); + this.refreshTimers = []; + + for (const source of Object.values(DATA_SOURCES)) { + const timer = setInterval( + () => + this.refreshDataSource(source).catch((e) => + logger.error(`[${source.name}] Failed to auto-refresh: ${e}`) + ), + source.refreshInterval + ); + this.refreshTimers.push(timer); + logger.info( + `[${source.name}] Set auto-refresh interval to ${source.refreshInterval}ms` + ); + } + } + + // --- Private Refresh and Load Methods --- + + private async refreshDataSource( + source: (typeof DATA_SOURCES)[keyof typeof DATA_SOURCES] + ): Promise { + const lockKey = `anime-datasource-refresh-${source.dataKey}`; + const lockOptions = { timeout: 10000, ttl: 12000 }; + + let lockAcquired = false; + let firstError: any = null; + + for (let attempt = 0; attempt < 2 && !lockAcquired; attempt++) { + try { + await DistributedLock.getInstance().withLock( + lockKey, + async () => { + try { + const remoteEtag = await this.fetchRemoteEtag(source.url); + const localEtag = await this.readLocalFile(source.etagPath); + + const isDbMissing = !(await this.fileExists(source.filePath)); + const isOutOfDate = + !remoteEtag || !localEtag || remoteEtag !== localEtag; + + if (isDbMissing || isOutOfDate) { + logger.info( + `[${source.name}] Source is missing or out of date. Downloading...` + ); + await this.downloadFile( + source.url, + source.filePath, + source.etagPath, + remoteEtag + ); + } else { + logger.info(`[${source.name}] Source is up to date.`); + } + } catch (error) { + logger.error( + `[${source.name}] Failed to refresh: ${error}. Will retry on next cycle.` + ); + } + }, + lockOptions + ); + lockAcquired = true; + // Dynamically call the correct loader + // the lock is only needed to avoid multiple instances trying to download files at the same time. + // since the loader needs to be called per instance as its in memory, it needs to be called outside of the lock. + await this[source.loader](); + } catch (error) { + if (attempt === 0) { + // First attempt failed, wait for ttl before retrying + logger.error(`[${source.name}] Failed to refresh: ${error}`); + firstError = error; + logger.warn( + `[${source.name}] Lock acquisition failed, will retry after ${lockOptions.ttl}ms` + ); + await new Promise((resolve) => setTimeout(resolve, lockOptions.ttl)); + } else { + // Second attempt failed, log and exit + logger.error(`[${source.name}] Will retry on next cycle.`); + } + } + } + } + + private async loadFribbMappings(): Promise { + const start = Date.now(); + const fileContents = await this.readLocalFile( + DATA_SOURCES.fribbMappings.filePath + ); + if (!fileContents) + throw new Error(DATA_SOURCES.fribbMappings.name + ' file not found'); + + const data = JSON.parse(fileContents); + if (!Array.isArray(data)) + throw new Error( + DATA_SOURCES.fribbMappings.name + ' data must be an array' + ); + + const validEntries = this.validateEntries(data, MappingEntrySchema); + + const newMappingsById: MappingIdMap = new Map(); + + for (const idType of ID_TYPES) { + newMappingsById.set(idType, new Map()); + } + + for (const entry of validEntries) { + for (const idType of ID_TYPES) { + const idValue = entry[idType]; + if (idValue !== undefined && idValue !== null) { + const existingEntry = newMappingsById.get(idType)?.get(idValue); + if (!existingEntry) { + newMappingsById.get(idType)?.set(idValue, entry); + } + } + } + } + this.dataStore.fribbMappingsById = newMappingsById; + logger.info( + `[${DATA_SOURCES.fribbMappings.name}] Loaded and indexed ${validEntries.length} valid entries in ${getTimeTakenSincePoint(start)}` + ); + } + + private async loadManamiDb(): Promise { + const start = Date.now(); + const fileContents = await this.readLocalFile(DATA_SOURCES.manami.filePath); + if (!fileContents) + throw new Error(DATA_SOURCES.manami.name + ' file not found'); + + const data = JSON.parse(fileContents); + if (!Array.isArray(data.data)) + throw new Error(DATA_SOURCES.manami.name + ' data must be an array'); + + const validEntries = this.validateEntries(data.data, ManamiEntrySchema); + + const newManamiById: ManamiIdMap = new Map(); + const idTypes = Object.keys(extractIdFromUrl) as Exclude< + IdType, + 'traktId' + >[]; + + for (const idType of idTypes) { + newManamiById.set(idType, new Map()); + } + + for (const entry of validEntries) { + for (const sourceUrl of entry.sources) { + for (const idType of idTypes) { + const idExtractor = extractIdFromUrl[idType]; + if (idExtractor) { + const idValue = idExtractor(sourceUrl); + if (idValue) { + const existingEntry = newManamiById.get(idType)?.get(idValue); + if (!existingEntry) { + newManamiById.get(idType)?.set(idValue, entry); + } + } + } + } + } + } + this.dataStore.manamiById = newManamiById; + logger.info( + `[${DATA_SOURCES.manami.name}] Loaded and indexed ${validEntries.length} valid entries in ${getTimeTakenSincePoint(start)}` + ); + } + + private async loadKitsuImdbMapping(): Promise { + const start = Date.now(); + const fileContents = await this.readLocalFile( + DATA_SOURCES.kitsuImdb.filePath + ); + if (!fileContents) + throw new Error(DATA_SOURCES.kitsuImdb.name + ' file not found'); + + const data = JSON.parse(fileContents); + + // Validate each entry using the schema + this.dataStore.kitsuById = new Map(); + for (const [kitsuId, kitsuEntry] of Object.entries(data)) { + const parsed = KitsuEntrySchema.safeParse(kitsuEntry); + if (parsed.success) { + this.dataStore.kitsuById.set(Number(kitsuId), parsed.data); + } else { + logger.warn( + `[${DATA_SOURCES.kitsuImdb.name}] Skipping invalid entry for kitsuId ${kitsuId}: ${formatZodError(parsed.error)}` + ); + } + } + logger.info( + `[${DATA_SOURCES.kitsuImdb.name}] Loaded and indexed ${this.dataStore.kitsuById.size} valid entries in ${getTimeTakenSincePoint(start)}` + ); + } + + private async loadExtendedAnitraktMovies(): Promise { + const start = Date.now(); + const fileContents = await this.readLocalFile( + DATA_SOURCES.anitraktMovies.filePath + ); + if (!fileContents) + throw new Error(DATA_SOURCES.anitraktMovies.name + ' file not found'); + + const data = JSON.parse(fileContents); + if (!Array.isArray(data)) + throw new Error( + DATA_SOURCES.anitraktMovies.name + ' data must be an array' + ); + + const validEntries = this.validateEntries( + data, + ExtendedAnitraktMovieEntrySchema + ); + + const newExtendedAnitraktMoviesById: ExtendedAnitraktMoviesIdMap = + new Map(); + + for (const entry of validEntries) { + newExtendedAnitraktMoviesById.set(entry.myanimelist.id, entry); + } + this.dataStore.extendedAnitraktMoviesById = newExtendedAnitraktMoviesById; + logger.info( + `[${DATA_SOURCES.anitraktMovies.name}] Loaded and indexed ${validEntries.length} valid entries in ${getTimeTakenSincePoint(start)}` + ); + } + + private async loadExtendedAnitraktTv(): Promise { + const start = Date.now(); + const fileContents = await this.readLocalFile( + DATA_SOURCES.anitraktTv.filePath + ); + if (!fileContents) + throw new Error(DATA_SOURCES.anitraktTv.name + ' file not found'); + + const data = JSON.parse(fileContents); + if (!Array.isArray(data)) + throw new Error(DATA_SOURCES.anitraktTv.name + ' data must be an array'); + + const validEntries = this.validateEntries( + data, + ExtendedAnitraktTvEntrySchema + ); + + const newExtendedAnitraktTvById: ExtendedAnitraktTvIdMap = new Map(); + + for (const entry of validEntries) { + newExtendedAnitraktTvById.set(entry.myanimelist.id, entry); + } + this.dataStore.extendedAnitraktTvById = newExtendedAnitraktTvById; + logger.info( + `[${DATA_SOURCES.anitraktTv.name}] Loaded and indexed ${validEntries.length} valid entries in ${getTimeTakenSincePoint(start)}` + ); + } + + // --- Generic File and Network Helpers --- + + private validateEntries( + entries: unknown[], + schema: T + ): z.infer[] { + const validEntries: z.infer[] = []; + for (const entry of entries) { + const parsed = schema.safeParse(entry); + if (parsed.success) { + validEntries.push(parsed.data); + } else { + logger.warn(`Skipping invalid entry: ${formatZodError(parsed.error)}`); + logger.verbose(`Invalid entry: ${JSON.stringify(entry, null, 2)}`); + } + } + return validEntries; + } + + private async fetchRemoteEtag(url: string): Promise { + try { + const response = await makeRequest(url, { + method: 'HEAD', + timeout: 15000, + }); + return response.headers.get('etag'); + } catch (error) { + logger.warn(`Failed to fetch remote etag for ${url}: ${error}`); + return null; + } + } + + private async readLocalFile(filePath: string): Promise { + try { + return await fs.readFile(filePath, 'utf8'); + } catch (error) { + return null; // Gracefully handle file not existing + } + } + + private async downloadFile( + url: string, + filePath: string, + etagPath: string, + remoteEtag: string | null + ): Promise { + const startTime = Date.now(); + const response = await makeRequest(url, { method: 'GET', timeout: 90000 }); + + if (!response.ok) throw new Error(`Download failed: ${response.status}`); + + // Stream the response directly to file for large files + await fs.mkdir(ANIME_DATABASE_PATH, { recursive: true }); + + // Create a write stream for the file + const fileStream = createWriteStream(filePath); + + // Pipe the response body to the file using Node.js streams + await new Promise((resolve, reject) => { + if (!response.body) { + reject(new Error('No response body to stream')); + return; + } + + const reader = response.body.getReader(); + const stream = new ReadableStream({ + async start(controller) { + try { + while (true) { + const { done, value } = await reader.read(); + if (done) break; + controller.enqueue(value); + } + controller.close(); + } catch (error) { + controller.error(error); + } + }, + }); + + // Pipe the stream to the file + stream + .pipeTo( + new WritableStream({ + write(chunk) { + return new Promise((resolve, reject) => { + fileStream.write(chunk, (error) => { + if (error) reject(error); + else resolve(); + }); + }); + }, + close() { + fileStream.end(); + }, + }) + ) + .then(resolve) + .catch(reject); + + // Handle stream errors + fileStream.on('error', reject); + }); + + // Write the etag if present + const etag = remoteEtag ?? response.headers.get('etag'); + if (etag) { + await fs.writeFile(etagPath, etag); + } + + logger.info( + `Downloaded ${path.basename(filePath)} in ${getTimeTakenSincePoint(startTime)}` + ); + } + + private async fileExists(filePath: string): Promise { + try { + await fs.access(filePath); + return true; + } catch { + return false; + } + } +} diff --git a/packages/core/src/utils/cache.ts b/packages/core/src/utils/cache.ts index 9eb98903..79322ee9 100644 --- a/packages/core/src/utils/cache.ts +++ b/packages/core/src/utils/cache.ts @@ -238,6 +238,10 @@ export class Cache { return cachedValue as ReturnType; } const result = await fn(...args); + // do not cache empty arrays + if (Array.isArray(result) && result.length === 0) { + return result as ReturnType; + } await this.set(key, result, ttl); return result; } @@ -276,4 +280,8 @@ export class Cache { async waitUntilReady(): Promise { return this.backend.waitUntilReady(); } + + getType(): 'memory' | 'redis' { + return this.backend instanceof MemoryCacheBackend ? 'memory' : 'redis'; + } } diff --git a/packages/core/src/utils/config.ts b/packages/core/src/utils/config.ts index 42084c22..826f4f01 100644 --- a/packages/core/src/utils/config.ts +++ b/packages/core/src/utils/config.ts @@ -415,7 +415,7 @@ export async function validateConfig( } } - await validateRegexes(config); + await validateRegexes(config, skipErrorsFromAddonsOrProxies); await new AIOStreams(ensureDecrypted(config), { skipFailedAddons: skipErrorsFromAddonsOrProxies, @@ -490,7 +490,7 @@ export function applyMigrations(config: UserData): UserData { return config; } -async function validateRegexes(config: UserData) { +async function validateRegexes(config: UserData, skipErrors: boolean = false) { const excludedRegexes = config.excludedRegexPatterns; const includedRegexes = config.includedRegexPatterns; const requiredRegexes = config.requiredRegexPatterns; @@ -511,14 +511,20 @@ async function validateRegexes(config: UserData) { allowedPatterns.includes(regex) ); if (allowedRegexes.length === 0) { - throw new Error( - 'You do not have permission to use regex filters, please remove them from your config' - ); + if (!skipErrors) { + throw new Error( + 'You do not have permission to use regex filters, please remove them from your config' + ); + } + return; } if (allowedRegexes.length !== regexes.length) { - throw new Error( - `You are only permitted to use specific regex patterns, you have ${regexes.length - allowedRegexes.length} / ${regexes.length} regexes that are not allowed. Please remove them from your config.` - ); + if (!skipErrors) { + throw new Error( + `You are only permitted to use specific regex patterns, you have ${regexes.length - allowedRegexes.length} / ${regexes.length} regexes that are not allowed. Please remove them from your config.` + ); + } + return; } } diff --git a/packages/core/src/utils/constants.ts b/packages/core/src/utils/constants.ts index e1031db7..44f6fb29 100644 --- a/packages/core/src/utils/constants.ts +++ b/packages/core/src/utils/constants.ts @@ -1,4 +1,4 @@ -import { Option } from '../db'; +import { Option } from '../db/schemas'; export enum ErrorCode { // User API @@ -207,7 +207,20 @@ const SERVICES = [ EASYNEWS_SERVICE, ] as const; +export const BUILTIN_SUPPORTED_SERVICES = [ + REALDEBRID_SERVICE, + DEBRIDLINK_SERVICE, + PREMIUMIZE_SERVICE, + ALLDEBRID_SERVICE, + TORBOX_SERVICE, + EASYDEBRID_SERVICE, + DEBRIDER_SERVICE, + PIKPAK_SERVICE, + OFFCLOUD_SERVICE, +] as const; + export type ServiceId = (typeof SERVICES)[number]; +export type BuiltinServiceId = (typeof BUILTIN_SUPPORTED_SERVICES)[number]; export const MEDIAFLOW_SERVICE = 'mediaflow' as const; export const STREMTHRU_SERVICE = 'stremthru' as const; diff --git a/packages/core/src/utils/distributed-lock.ts b/packages/core/src/utils/distributed-lock.ts new file mode 100644 index 00000000..91a9db99 --- /dev/null +++ b/packages/core/src/utils/distributed-lock.ts @@ -0,0 +1,263 @@ +import { createLogger } from './logger'; +import { DB } from '../db/db'; +import { Cache } from './cache'; +import { RedisClientType } from 'redis'; +import { Env } from './env'; +import { REDIS_PREFIX } from './constants'; +import { TransactionQueue } from '../db/queue'; + +const logger = createLogger('distributed-lock'); +const lockPrefix = `${REDIS_PREFIX}lock:`; + +export interface LockOptions { + timeout?: number; + ttl?: number; + retryInterval?: number; +} + +export interface LockResult { + result: T; + cached: boolean; +} + +interface StoredResult { + value?: T; + error?: string; +} + +export class DistributedLock { + private static instance: DistributedLock; + private redis: RedisClientType | null = null; + private subRedis: RedisClientType | null = null; + private initialised = false; + private initialisePromise: Promise | null = null; + + private constructor() {} + + static getInstance(): DistributedLock { + if (!this.instance) { + this.instance = new DistributedLock(); + } + return this.instance; + } + + async initialise(): Promise { + if (this.initialised) return; + if (this.initialisePromise) { + await this.initialisePromise; + return; + } + this.initialisePromise = (async () => { + if (Env.REDIS_URI) { + this.redis = Cache.getRedisClient(); + this.subRedis = this.redis.duplicate(); + await this.subRedis.connect(); + logger.debug('DistributedLock initialised with Redis backend.'); + } else { + logger.debug('DistributedLock initialised with SQL backend.'); + } + this.initialised = true; + })(); + await this.initialisePromise; + } + + async withLock( + key: string, + fn: () => Promise, + options: LockOptions = {} + ): Promise> { + await this.initialise(); + return this.redis + ? this.withRedisLock(key, fn, options) + : this.withSqlLock(key, fn, options); + } + + private async withRedisLock( + key: string, + fn: () => Promise, + options: LockOptions + ): Promise> { + const { timeout = 30000, ttl = 60000 } = options; + const owner = Math.random().toString(36).substring(2); + const redisKey = `${lockPrefix}${key}`; + const doneChannel = `${redisKey}:done`; + + const acquireLock = async (): Promise => { + const result = await this.redis!.set(redisKey, owner, { + PX: ttl, + NX: true, + }); + return result === 'OK'; + }; + + if (await acquireLock()) { + logger.debug(`Redis lock acquired for key: ${key}`); + let result: T; + try { + result = await fn(); + const storedResult: StoredResult = { value: result }; + await this.redis!.publish(doneChannel, JSON.stringify(storedResult)); + } catch (e: any) { + const errorResult: StoredResult = { error: e.message || 'Error' }; + await this.redis!.publish(doneChannel, JSON.stringify(errorResult)); + throw e; + } finally { + if ((await this.redis!.get(redisKey)) === owner) { + logger.debug(`Releasing redis lock for key: ${key}`); + await this.redis!.del(redisKey); + } + } + return { result, cached: false }; + } + + return new Promise((resolve, reject) => { + let timeoutId: NodeJS.Timeout; + + const subscriber = (message: string) => { + clearTimeout(timeoutId); + this.subRedis!.unsubscribe(doneChannel); + const storedResult: StoredResult = JSON.parse(message); + if (storedResult.error) { + logger.warn( + `Received error result for key: ${key} from lock holder.` + ); + reject(new Error(storedResult.error)); + } else { + logger.debug(`Received cached result for key: ${key} via pub/sub.`); + resolve({ result: storedResult.value!, cached: true }); + } + }; + + this.subRedis!.subscribe(doneChannel, subscriber).catch(reject); + + timeoutId = setTimeout(() => { + this.subRedis!.unsubscribe(doneChannel); + const errorMessage = `Timed out waiting for redis lock on key: ${key}`; + logger.error(errorMessage); + reject(new Error(errorMessage)); + }, timeout); + }); + } + + private async withSqlLock( + key: string, + fn: () => Promise, + options: LockOptions + ): Promise> { + const db = DB.getInstance(); + const { timeout = 30000, ttl = 60000 } = options; + const { retryInterval = db.isSQLite() ? 250 : 100 } = options; + const owner = Math.random().toString(36).substring(2); + const expiresAt = new Date(Date.now() + ttl); + + const tryAcquireLock = async () => { + return TransactionQueue.getInstance().enqueue(async () => { + const tx = await db.begin(); + try { + await tx.execute( + `DELETE FROM distributed_locks WHERE expires_at < ?`, + [new Date()] + ); + const existing = await tx.execute( + `SELECT * FROM distributed_locks WHERE key = ?`, + [key] + ); + if (existing.rows.length === 0) { + await tx.execute( + `INSERT INTO distributed_locks (key, owner, expires_at) VALUES (?, ?, ?)`, + [key, owner, expiresAt] + ); + await tx.commit(); + logger.debug(`SQL lock acquired for key: ${key}`); + return true; + } + await tx.rollback(); + return false; + } catch (e) { + await tx.rollback(); + throw e; + } + }); + }; + + if (await tryAcquireLock()) { + let result: T; + try { + result = await fn(); + + // Atomically update the result using the transaction queue + await TransactionQueue.getInstance().enqueue(async () => { + const tx = await db.begin(); + try { + await tx.execute( + `UPDATE distributed_locks SET result = ? WHERE key = ? AND owner = ?`, + [JSON.stringify({ value: result }), key, owner] + ); + await tx.commit(); + } catch (e) { + await tx.rollback(); + throw e; + } + }); + } catch (e: any) { + // Atomically update the error using the transaction queue + await TransactionQueue.getInstance().enqueue(async () => { + const tx = await db.begin(); + try { + await tx.execute( + `UPDATE distributed_locks SET result = ? WHERE key = ? AND owner = ?`, + [JSON.stringify({ error: e.message || 'Error' }), key, owner] + ); + await tx.commit(); + } catch (err) { + await tx.rollback(); + // We throw the original error, but log the transaction error + logger.error( + `Failed to write error result to lock for key ${key}:`, + err + ); + } + }); + throw e; + } finally { + // This setTimeout is now safe because the update operation is complete. + setTimeout(() => { + logger.debug(`Releasing SQL lock for key: ${key}`); + db.execute( + `DELETE FROM distributed_locks WHERE key = ? AND owner = ?`, + [key, owner] + ); + }, 2000); + } + return { result, cached: false }; + } + + const startTime = Date.now(); + while (Date.now() - startTime < timeout) { + const lock = await db.query( + `SELECT result FROM distributed_locks WHERE key = ?`, + [key] + ); + if (lock.length > 0 && lock[0].result) { + const storedResult: StoredResult = JSON.parse(lock[0].result); + if (storedResult.error) { + logger.warn(`Polled error result for key: ${key} from SQL lock.`); + throw new Error(storedResult.error); + } + return { result: storedResult.value!, cached: true }; + } + await new Promise((res) => setTimeout(res, retryInterval)); + } + const errorMessage = `Timed out waiting for SQL lock on key: ${key}`; + logger.error(errorMessage); + throw new Error(errorMessage); + } + + async close(): Promise { + if (this.subRedis) { + await this.subRedis.quit(); + } + this.initialised = false; + this.initialisePromise = null; + } +} diff --git a/packages/core/src/utils/env.ts b/packages/core/src/utils/env.ts index b1bb2433..374fa1d5 100644 --- a/packages/core/src/utils/env.ts +++ b/packages/core/src/utils/env.ts @@ -92,9 +92,12 @@ const namedRegexes = makeValidator((x) => { const removeTrailingSlash = (x: string) => x.endsWith('/') ? x.slice(0, -1) : x; -const presetUrls = makeExactValidator((x) => { +const urlOrUrlList = makeExactValidator((x) => { + if (!x) { + return []; + } if (typeof x !== 'string') { - throw new EnvError('Preset URLs must be a string or an array of strings'); + throw new EnvError('List of URLs must be a string or an array of strings'); } const validateUrl = (x: string) => { try { @@ -108,7 +111,7 @@ const presetUrls = makeExactValidator((x) => { const urls = JSON.parse(x); if (!Array.isArray(urls) || urls.some((x) => !validateUrl(x))) { throw new EnvError( - 'Preset URLs must be an array of URLs or a single URL' + 'List of URLs must be an array of URLs or a single URL' ); } return Object.freeze(urls.map(removeTrailingSlash)); @@ -329,13 +332,13 @@ export const Env = cleanEnv(process.env, { default: 500, desc: 'Redis timeout for the addon', }), - ADDON_PROXY: url({ + ADDON_PROXY: urlOrUrlList({ default: undefined, desc: 'Proxy URL for the addon', }), ADDON_PROXY_CONFIG: str({ default: undefined, - desc: 'Proxy config for the addon in format of comma separated hostname:boolean', + desc: 'Proxy config for the addon in format of comma separated hostname:(boolean|number). If you have multiple proxies, use a number to specify the index of the proxy. (starts from 0)', }), REQUEST_URL_MAPPINGS: urlMappings({ default: undefined, @@ -357,6 +360,10 @@ export const Env = cleanEnv(process.env, { default: undefined, desc: 'TMDB API Key. Used for fetching metadata for the strict title matching option.', }), + TRAKT_CLIENT_ID: str({ + default: undefined, + desc: 'Trakt Client ID. Used for fetching Trakt aliases.', + }), PROVIDE_STREAM_DATA: boolOrList({ default: undefined, desc: 'Provide stream data to the client in stream responses. Required for users to wrap this addon within another AIOStreams instance.', @@ -369,6 +376,26 @@ export const Env = cleanEnv(process.env, { default: true, desc: 'Enable the search API. If true, the search API will be enabled.', }), + ANIME_DB_FRIBB_MAPPINGS_REFRESH_INTERVAL: num({ + default: 24 * 60 * 60 * 1000, // 24 hours + desc: 'Interval for refreshing the anime mappings in milliseconds', + }), + ANIME_DB_MANAMI_DB_REFRESH_INTERVAL: num({ + default: 7 * 24 * 60 * 60 * 1000, // 7 days + desc: 'Interval for refreshing the Manami anime offline database in milliseconds', + }), + ANIME_DB_KITSU_IMDB_MAPPING_REFRESH_INTERVAL: num({ + default: 24 * 60 * 60 * 1000, // 24 hours + desc: 'Interval for refreshing the Kitsu IMDB mapping in milliseconds', + }), + ANIME_DB_EXTENDED_ANITRAKT_MOVIES_REFRESH_INTERVAL: num({ + default: 24 * 60 * 60 * 1000, // 24 hours + desc: 'Interval for refreshing the Extended Anitrakt Movies in milliseconds', + }), + ANIME_DB_EXTENDED_ANITRAKT_TV_REFRESH_INTERVAL: num({ + default: 24 * 60 * 60 * 1000, // 24 hours + desc: 'Interval for refreshing the Extended Anitrakt TV in milliseconds', + }), // logging settings LOG_SENSITIVE_INFO: bool({ default: false, @@ -805,7 +832,7 @@ export const Env = cleanEnv(process.env, { desc: 'AIOStreams user agent', }), - COMET_URL: presetUrls({ + COMET_URL: urlOrUrlList({ default: ['https://comet.elfhosted.com'], desc: 'Comet URL', }), @@ -832,7 +859,7 @@ export const Env = cleanEnv(process.env, { }), // MediaFusion settings - MEDIAFUSION_URL: presetUrls({ + MEDIAFUSION_URL: urlOrUrlList({ default: ['https://mediafusion.elfhosted.com'], desc: 'MediaFusion URL', }), @@ -858,7 +885,7 @@ export const Env = cleanEnv(process.env, { }), // Jackettio settings - JACKETTIO_URL: presetUrls({ + JACKETTIO_URL: urlOrUrlList({ default: ['https://jackettio.elfhosted.com'], desc: 'Jackettio URL', }), @@ -1061,8 +1088,8 @@ export const Env = cleanEnv(process.env, { }), // StremThru Store settings - STREMTHRU_STORE_URL: presetUrls({ - default: ['https://stremthru.elfhosted.com/stremio/store'], + STREMTHRU_STORE_URL: urlOrUrlList({ + default: ['https://stremthru.13377001.xyz/'], desc: 'StremThru Store URL', }), DEFAULT_STREMTHRU_STORE_TIMEOUT: num({ @@ -1088,8 +1115,8 @@ export const Env = cleanEnv(process.env, { }), // StremThru Torz settings - STREMTHRU_TORZ_URL: presetUrls({ - default: ['https://stremthru.elfhosted.com/stremio/torz'], + STREMTHRU_TORZ_URL: urlOrUrlList({ + default: ['https://stremthru.13377001.xyz/stremio/torz'], desc: 'StremThru Torz URL', }), DEFAULT_STREMTHRU_TORZ_TIMEOUT: num({ @@ -1522,7 +1549,14 @@ export const Env = cleanEnv(process.env, { default: 'https://stremthru.13377001.xyz', desc: 'Builtin StremThru URL', }), - + BUILTIN_DEBRID_INSTANT_AVAILABILITY_CACHE_TTL: num({ + default: 60 * 30, // 30 minutes + desc: 'Builtin Debrid instant availability cache TTL', + }), + BUILTIN_DEBRID_PLAYBACK_LINK_CACHE_TTL: num({ + default: 60 * 60, // 1 hour + desc: 'Builtin Debrid playback link cache TTL', + }), BUILTIN_GDRIVE_CLIENT_ID: str({ default: undefined, desc: 'Builtin GDrive client ID', @@ -1557,22 +1591,87 @@ export const Env = cleanEnv(process.env, { desc: 'Builtin TorBox Search search API timeout', }), BUILTIN_TORBOX_SEARCH_SEARCH_API_CACHE_TTL: num({ - default: 1 * 60 * 60, // 1 hour + default: 7 * 24 * 60 * 60, // 7 days desc: 'Builtin TorBox Search search API cache TTL', }), BUILTIN_TORBOX_SEARCH_METADATA_CACHE_TTL: num({ - default: 7 * 24 * 60 * 60, // 7 days + default: 14 * 24 * 60 * 60, // 14 days desc: 'Builtin TorBox Search metadata cache TTL', }), - BUILTIN_TORBOX_SEARCH_INSTANT_AVAILABILITY_CACHE_TTL: num({ - default: 15 * 60, // 15 minutes - desc: 'Builtin TorBox Search instant availability cache TTL', - }), BUILTIN_TORBOX_SEARCH_CACHE_PER_USER_SEARCH_ENGINE: bool({ default: false, desc: 'Whether to cache results separately for every user that is using their own search engines.', }), + BUILTIN_TORZNAB_SEARCH_TIMEOUT: num({ + default: 30000, // 30 seconds + desc: 'Builtin Torznab Search timeout', + }), + BUILTIN_TORZNAB_SEARCH_CACHE_TTL: num({ + default: 7 * 24 * 60 * 60, // 7 days + desc: 'Builtin Torznab Search cache TTL', + }), + BUILTIN_TORZNAB_CAPABILITIES_CACHE_TTL: num({ + default: 14 * 24 * 60 * 60, // 14 days + desc: 'Builtin Torznab Capabilities cache TTL', + }), + + BUILTIN_NEWZNAB_SEARCH_TIMEOUT: num({ + default: 30000, // 30 seconds + desc: 'Builtin Newznab Search timeout', + }), + BUILTIN_NEWZNAB_SEARCH_CACHE_TTL: num({ + default: 7 * 24 * 60 * 60, // 7 days + desc: 'Builtin Newznab Search cache TTL', + }), + BUILTIN_NEWZNAB_CAPABILITIES_CACHE_TTL: num({ + default: 14 * 24 * 60 * 60, // 14 days + desc: 'Builtin Newznab Capabilities cache TTL', + }), + + BUILTIN_ZILEAN_URL: url({ + default: 'https://zilean.elfhosted.com', + desc: 'Builtin Zilean URL', + }), + BUILTIN_ZILEAN_TIMEOUT: num({ + default: undefined, + desc: 'Builtin Zilean timeout', + }), + + BUILTIN_ANIMETOSHO_URL: url({ + default: 'https://feed.animetosho.org', + desc: 'Builtin AnimeTosho URL', + }), + BUILTIN_ANIMETOSHO_TIMEOUT: num({ + default: undefined, + desc: 'Builtin AnimeTosho timeout', + }), + + BUILTIN_PROWLARR_URL: url({ + default: undefined, + desc: 'Builtin Prowlarr URL', + }), + BUILTIN_PROWLARR_API_KEY: str({ + default: undefined, + desc: 'Builtin Prowlarr API Key', + }), + BUILTIN_PROWLARR_INDEXERS: commaSeparated({ + default: undefined, + desc: 'Comma separated list of prowlarr indexers to use.', + }), + BUILTIN_PROWLARR_SEARCH_TIMEOUT: num({ + default: 30000, // 30 seconds + desc: 'Builtin Prowlarr Search timeout', + }), + BUILTIN_PROWLARR_SEARCH_CACHE_TTL: num({ + default: 7 * 24 * 60 * 60, // 7 days + desc: 'Builtin Prowlarr Search cache TTL', + }), + BUILTIN_PROWLARR_INDEXERS_CACHE_TTL: num({ + default: 14 * 24 * 60 * 60, // 14 days + desc: 'Builtin Prowlarr Indexers cache TTL', + }), + // Rate limiting settings DISABLE_RATE_LIMITS: bool({ default: false, @@ -1615,6 +1714,14 @@ export const Env = cleanEnv(process.env, { CATALOG_API_RATE_LIMIT_MAX_REQUESTS: num({ default: 5, // allow 100 requests per IP per minute }), + ANIME_API_RATE_LIMIT_WINDOW: num({ + default: 60, // 1 minute + desc: 'Time window for mappings API rate limiting in seconds', + }), + ANIME_API_RATE_LIMIT_MAX_REQUESTS: num({ + default: 120, + desc: 'Maximum number of requests allowed per IP within the time window', + }), STREMIO_STREAM_RATE_LIMIT_WINDOW: num({ default: 15, // 1 minute desc: 'Time window for Stremio stream rate limiting in seconds', diff --git a/packages/core/src/utils/general.ts b/packages/core/src/utils/general.ts index c68cd5f1..e451e7e9 100644 --- a/packages/core/src/utils/general.ts +++ b/packages/core/src/utils/general.ts @@ -1,5 +1,16 @@ import { Addon } from '../db/schemas'; +import { parseConnectionURI } from '../db/utils'; +import { Env } from './env'; +import path from 'path'; export function getAddonName(addon: Addon): string { return `${addon.name}${addon.displayIdentifier || addon.identifier ? ` ${addon.displayIdentifier || addon.identifier}` : ''}`; } + +export function getDataFolder(): string { + const databaseURI = parseConnectionURI(Env.DATABASE_URI); + if (databaseURI.dialect === 'sqlite') { + return path.dirname(databaseURI.filename); + } + return path.join(process.cwd(), 'data'); +} diff --git a/packages/core/src/utils/http.ts b/packages/core/src/utils/http.ts index c1ff2061..0236f2d0 100644 --- a/packages/core/src/utils/http.ts +++ b/packages/core/src/utils/http.ts @@ -73,7 +73,7 @@ export async function makeRequest(url: string, options: RequestOptions) { } } - const useProxy = shouldProxy(urlObj); + const { useProxy, proxyIndex } = shouldProxy(urlObj); const headers = new Headers(options.headers); if (options.forwardIp) { for (const header of HEADERS_FOR_IP_FORWARDING) { @@ -114,7 +114,7 @@ export async function makeRequest(url: string, options: RequestOptions) { await urlCount.set(key, 1, Env.RECURSION_THRESHOLD_WINDOW); } logger.debug( - `Making a ${useProxy ? 'proxied' : 'direct'} request to ${makeUrlLogSafe( + `Making a ${useProxy ? 'proxied' : 'direct'}${proxyIndex !== -1 ? ` (proxy ${proxyIndex + 1})` : ''} request to ${makeUrlLogSafe( urlObj.toString() )} with forwarded ip ${maskSensitiveInfo(options.forwardIp ?? 'none')} and headers ${maskSensitiveInfo(JSON.stringify(Object.fromEntries(headers)))}` ); @@ -123,7 +123,9 @@ export async function makeRequest(url: string, options: RequestOptions) { method: options.method, body: options.body, headers: headers, - dispatcher: useProxy ? getProxyAgent(Env.ADDON_PROXY!) : undefined, + dispatcher: useProxy + ? getProxyAgent(Env.ADDON_PROXY![proxyIndex]) + : undefined, signal: AbortSignal.timeout(options.timeout), }); @@ -140,42 +142,79 @@ function getProxyAgent(proxyUrl: string) { type: 5, port: parseInt(proxyUrlObj.port), host: proxyUrlObj.hostname, + userId: proxyUrlObj.username || undefined, + password: proxyUrlObj.password || undefined, }); } else { return new ProxyAgent(proxyUrl); } } -function shouldProxy(url: URL) { - let shouldProxy = false; +function shouldProxy(url: URL): { + useProxy: boolean; + proxyIndex: number; +} { + let useProxy = false; let hostname = url.hostname; + let proxyIndex = -1; - if (!Env.ADDON_PROXY) { - return false; + if (!Env.ADDON_PROXY || Env.ADDON_PROXY.length === 0) { + return { useProxy: false, proxyIndex }; } - shouldProxy = true; + if (hostname === 'localhost') { + return { useProxy: false, proxyIndex }; + } + + useProxy = true; if (Env.ADDON_PROXY_CONFIG) { for (const rule of Env.ADDON_PROXY_CONFIG.split(',')) { - const [ruleHostname, ruleShouldProxy] = rule.split(':'); - if (['true', 'false'].includes(ruleShouldProxy) === false) { + const [ruleHostname, ruleProxyIndexOrBool] = rule.split(':'); + if ( + ['true', 'false'].includes(ruleProxyIndexOrBool) === false && + isNaN(parseInt(ruleProxyIndexOrBool)) + ) { logger.error(`Invalid proxy config: ${rule}`); continue; } if (ruleHostname === '*') { - shouldProxy = !(ruleShouldProxy === 'false'); + useProxy = !(ruleProxyIndexOrBool === 'false'); + proxyIndex = Number.isInteger(parseInt(ruleProxyIndexOrBool)) + ? parseInt(ruleProxyIndexOrBool) + : ruleProxyIndexOrBool === 'true' + ? 0 + : -1; + + if (useProxy) { + return { useProxy, proxyIndex }; + } } else if (ruleHostname.startsWith('*')) { if (hostname.endsWith(ruleHostname.slice(1))) { - shouldProxy = !(ruleShouldProxy === 'false'); + useProxy = !(ruleProxyIndexOrBool === 'false'); + proxyIndex = Number.isInteger(parseInt(ruleProxyIndexOrBool)) + ? parseInt(ruleProxyIndexOrBool) + : ruleProxyIndexOrBool === 'true' + ? 0 + : -1; } } if (hostname === ruleHostname) { - shouldProxy = !(ruleShouldProxy === 'false'); + useProxy = !(ruleProxyIndexOrBool === 'false'); + proxyIndex = Number.isInteger(parseInt(ruleProxyIndexOrBool)) + ? parseInt(ruleProxyIndexOrBool) + : ruleProxyIndexOrBool === 'true' + ? 0 + : -1; } } } - return shouldProxy; + if (useProxy && Env.ADDON_PROXY[proxyIndex] === undefined) { + logger.error(`Invalid proxy index: ${proxyIndex}, does not exist`); + return { useProxy: false, proxyIndex: -1 }; + } + + return { useProxy, proxyIndex }; } function domainHasUserAgent(url: URL) { diff --git a/packages/core/src/utils/id-parser.ts b/packages/core/src/utils/id-parser.ts new file mode 100644 index 00000000..42685851 --- /dev/null +++ b/packages/core/src/utils/id-parser.ts @@ -0,0 +1,174 @@ +export const ID_TYPES = [ + 'animePlanetId', + 'animecountdownId', + 'anidbId', + 'anilistId', + 'anisearchId', + 'imdbId', + 'kitsuId', + 'livechartId', + 'malId', + 'notifyMoeId', + 'simklId', + 'themoviedbId', + 'thetvdbId', + 'traktId', +] as const; + +export type IdType = (typeof ID_TYPES)[number]; + +export type ExternalIdType = + | 'anime-planet_id' + | 'animecountdown_id' + | 'anidb_id' + | 'anilist_id' + | 'anisearch_id' + | 'imdb_id' + | 'kitsu_id' + | 'livechart_id' + | 'mal_id' + | 'notify.moe_id' + | 'simkl_id' + | 'themoviedb_id' + | 'thetvdb_id'; +export interface ParsedId { + type: IdType; + value: string | number; + fullId: string; + externalType: ExternalIdType; + mediaType: string; + season?: string; + episode?: string; +} + +interface IdParserDefinition { + type: IdType; + externalType: ExternalIdType; + prefixes: string[]; + // Regex should have named capture groups: + // - id: the base ID (required) + // - season: the season number (optional) + // - episode: the episode number (optional) + regex: RegExp; + format: (id: string) => string | number; +} + +export class IdParser { + private static readonly ID_PARSERS: IdParserDefinition[] = [ + { + type: 'imdbId', + externalType: 'imdb_id', + prefixes: ['tt', 'imdb'], + regex: /^(?:tt|imdb)[:-]?(?\d+)(?::(?\d+):(?\d+))?$/, + format: (id) => `tt${id}`, + }, + { + type: 'malId', + externalType: 'mal_id', + prefixes: ['mal'], + regex: /^mal[:-]?(?\d+)(?::(?\d+))?$/, + format: (id) => Number(id), + }, + { + type: 'thetvdbId', + externalType: 'thetvdb_id', + prefixes: ['tvdb'], + regex: /^tvdb[:-]?(?\d+)(?::(?\d+):(?\d+))?$/, + format: (id) => Number(id), + }, + { + type: 'themoviedbId', + externalType: 'themoviedb_id', + prefixes: ['tmdb'], + regex: /^tmdb[:-]?(?\d+)(?::(?\d+):(?\d+))?$/, + format: (id) => Number(id), + }, + { + type: 'kitsuId', + externalType: 'kitsu_id', + prefixes: ['kitsu'], + regex: /^kitsu[:-]?(?\d+)(?::(?\d+))?$/, + format: (id) => Number(id), + }, + { + type: 'anilistId', + externalType: 'anilist_id', + prefixes: ['anilist'], + regex: /^anilist[:-]?(?\d+)(?::(?\d+))?$/, + format: (id) => Number(id), + }, + { + type: 'anidbId', + externalType: 'anidb_id', + prefixes: ['anidb', 'anidb_id', 'anidbid'], + regex: /^(?:anidb|anidb_id|anidbid)[:-]?(?\d+)(?::(?\d+))?$/, + format: (id) => Number(id), + }, + { + type: 'animePlanetId', + externalType: 'anime-planet_id', + prefixes: ['animeplanet', 'ap'], + regex: /^(?:animeplanet|ap)[:-]?(?\d+)$/, + format: (id) => Number(id), + }, + { + type: 'animecountdownId', + externalType: 'animecountdown_id', + prefixes: ['acd'], + regex: /^acd[:-]?(?\d+)$/, + format: (id) => Number(id), + }, + { + type: 'anisearchId', + externalType: 'anisearch_id', + prefixes: ['anisearch'], + regex: /^anisearch[:-]?(?\d+)$/, + format: (id) => Number(id), + }, + { + type: 'notifyMoeId', + externalType: 'notify.moe_id', + prefixes: ['notifymoe', 'nm'], + regex: /^(?:notifymoe|nm)[:-]?(?[a-zA-Z0-9]+)$/, + format: (id) => id, + }, + { + type: 'simklId', + externalType: 'simkl_id', + prefixes: ['simkl'], + regex: /^simkl[:-]?(?\d+)$/, + format: (id) => Number(id), + }, + ]; + + constructor() {} + + public static getPrefixes(types: IdType[]): string[] { + return IdParser.ID_PARSERS.filter((p) => types.includes(p.type)).flatMap( + (p) => p.prefixes + ); + } + + public static parse(stremioId: string, mediaType: string): ParsedId | null { + for (const parser of IdParser.ID_PARSERS) { + const match = stremioId.match(parser.regex); + if (match?.groups) { + const { id, season, episode } = match.groups; + const parsedId: ParsedId = { + type: parser.type, + value: parser.format(id), + fullId: stremioId, + externalType: parser.externalType, + mediaType, + }; + + if (season) parsedId.season = season; + if (episode) parsedId.episode = episode; + + return parsedId; + } + } + + return null; + } +} diff --git a/packages/core/src/utils/index.ts b/packages/core/src/utils/index.ts index 1c174ec5..ed65c1de 100644 --- a/packages/core/src/utils/index.ts +++ b/packages/core/src/utils/index.ts @@ -13,3 +13,6 @@ export * from './dsu'; export * from './startup'; export * from './extras'; export * from './rpdb'; +export * from './distributed-lock'; +export * from './id-parser'; +export * from './anime-database'; diff --git a/packages/core/src/utils/logger.ts b/packages/core/src/utils/logger.ts index 5483b1f1..2b9791d3 100644 --- a/packages/core/src/utils/logger.ts +++ b/packages/core/src/utils/logger.ts @@ -39,6 +39,12 @@ const moduleMap: { [key: string]: string } = { gdrive: '☁️ GDRIVE', 'torbox-search': '🔍 TORBOX SEARCH', debrid: '🔗 DEBRID', + 'distributed-lock': '🔒 DISTRIBUTED LOCK', + 'anime-database': '🔍 ANIME DATABASE', + torznab: '🔍 TORZNAB', + newznab: '🔍 NEWZNAB', + 'metadata-service': '🔍 METADATA', + torrent: '👤 TORRENT', }; // Define colors for each log level using full names diff --git a/packages/core/src/utils/rpdb.ts b/packages/core/src/utils/rpdb.ts index 278f64c5..56dc3e5a 100644 --- a/packages/core/src/utils/rpdb.ts +++ b/packages/core/src/utils/rpdb.ts @@ -2,21 +2,14 @@ import { Cache } from './cache'; import { makeRequest } from './http'; import { RPDBIsValidResponse } from '../db/schemas'; import { Env } from './env'; -export type IdType = 'imdb' | 'tmdb' | 'tvdb'; - -interface Id { - type: IdType; - value: string; -} +import { IdParser } from './id-parser'; +import { AnimeDatabase } from './anime-database'; const apiKeyValidationCache = Cache.getInstance('rpdbApiKey'); const posterCheckCache = Cache.getInstance('rpdbPosterCheck'); export class RPDB { private readonly apiKey: string; - private readonly TMDB_ID_REGEX = /^(?:tmdb)[-:](\d+)(?::\d+:\d+)?$/; - private readonly TVDB_ID_REGEX = /^(?:tvdb)[-:](\d+)(?::\d+:\d+)?$/; - private readonly IMDB_ID_REGEX = /^(?:tt)(\d+)(?::\d+:\d+)?$/; constructor(apiKey: string) { this.apiKey = apiKey; if (!this.apiKey) { @@ -64,20 +57,59 @@ export class RPDB { id: string, checkExists: boolean = true ): Promise { - const parsedId = this.getParsedId(id, type); + const parsedId = IdParser.parse(id, type); + if (!parsedId) return null; + + let idType: 'tmdb' | 'imdb' | 'tvdb'; + let idValue: string; + + switch (parsedId.type) { + case 'themoviedbId': + idType = 'tmdb'; + idValue = `${type}-${parsedId.value}`; + break; + case 'imdbId': + idType = 'imdb'; + idValue = parsedId.value.toString(); + break; + case 'thetvdbId': + if (type === 'movie') return null; // tvdb not supported for movies + idType = 'tvdb'; + idValue = parsedId.value.toString(); + break; + default: { + // Try to map unsupported id types + const entry = AnimeDatabase.getInstance().getEntryById( + parsedId.type, + parsedId.value + ); + if (!entry) return null; + + if (entry.mappings?.thetvdbId && type === 'series') { + idType = 'tvdb'; + idValue = `${entry.mappings.thetvdbId}`; + } else if (entry.mappings?.themoviedbId) { + idType = 'tmdb'; + idValue = `${type}-${entry.mappings.themoviedbId}`; + } else if (entry.mappings?.imdbId) { + idType = 'imdb'; + idValue = `tt${entry.mappings.imdbId}`; + } else { + return null; + } + break; + } + } const cacheKey = `${type}-${id}-${this.apiKey}`; const cached = await posterCheckCache.get(cacheKey); if (cached) { return cached; } - if (!parsedId) { + if (!idType || !idValue) { return null; } - if (parsedId.type === 'tvdb' && type === 'movie') { - // rpdb doesnt seem to support tvdb for movies - return null; - } - const posterUrl = `https://api.ratingposterdb.com/${this.apiKey}/${parsedId.type}/poster-default/${parsedId.value}.jpg?fallback=true`; + + const posterUrl = `https://api.ratingposterdb.com/${this.apiKey}/${idType}/poster-default/${idValue}.jpg?fallback=true`; if (!checkExists) { return posterUrl; } @@ -97,22 +129,22 @@ export class RPDB { return posterUrl; } - private getParsedId(id: string, type: string): Id | null { - if (this.TMDB_ID_REGEX.test(id)) { - const match = id.match(this.TMDB_ID_REGEX); - if (['movie', 'series'].includes(type)) { - return match ? { type: 'tmdb', value: `${type}-${match[1]}` } : null; - } - return null; - } - if (this.IMDB_ID_REGEX.test(id)) { - const match = id.match(this.IMDB_ID_REGEX); - return match ? { type: 'imdb', value: `tt${match[1]}` } : null; - } - if (this.TVDB_ID_REGEX.test(id)) { - const match = id.match(this.TVDB_ID_REGEX); - return match ? { type: 'tvdb', value: match[1] } : null; - } - return null; - } + // private getParsedId(id: string, type: string): Id | null { + // if (this.TMDB_ID_REGEX.test(id)) { + // const match = id.match(this.TMDB_ID_REGEX); + // if (['movie', 'series'].includes(type)) { + // return match ? { type: 'tmdb', value: `${type}-${match[1]}` } : null; + // } + // return null; + // } + // if (this.IMDB_ID_REGEX.test(id)) { + // const match = id.match(this.IMDB_ID_REGEX); + // return match ? { type: 'imdb', value: `tt${match[1]}` } : null; + // } + // if (this.TVDB_ID_REGEX.test(id)) { + // const match = id.match(this.TVDB_ID_REGEX); + // return match ? { type: 'tvdb', value: match[1] } : null; + // } + // return null; + // } } diff --git a/packages/core/src/utils/startup.ts b/packages/core/src/utils/startup.ts index c8bcb1fa..be1bccdf 100644 --- a/packages/core/src/utils/startup.ts +++ b/packages/core/src/utils/startup.ts @@ -6,10 +6,17 @@ const logger = createLogger('startup'); const formatDuration = (seconds: number): string => { if (seconds < 60) return `${seconds}s`; if (seconds < 3600) return `${Math.floor(seconds / 60)}m ${seconds % 60}s`; - const hours = Math.floor(seconds / 3600); + const days = Math.floor(seconds / 86400); + const hours = Math.floor((seconds % 86400) / 3600); const minutes = Math.floor((seconds % 3600) / 60); const secs = seconds % 60; - return `${hours}h ${minutes}m ${secs}s`; + // return `${days}d ${hours}h ${minutes}m ${secs}s`; + let result = ''; + if (days > 0) result += `${days}d `; + if (hours > 0) result += `${hours}h `; + if (minutes > 0) result += `${minutes}m `; + if (secs > 0) result += `${secs}s`; + return result; }; const formatMilliseconds = (ms: number): string => { @@ -84,7 +91,7 @@ const logStartupInfo = () => { logKeyValue('Port:', Env.PORT.toString()); logKeyValue('Base URL:', Env.BASE_URL || 'Not configured'); if (Env.ADDON_PROXY) { - logKeyValue('Proxy URL:', Env.ADDON_PROXY); + logKeyValue('Proxy URL:', Env.ADDON_PROXY.join(', ')); } if (Env.ADDON_PROXY_CONFIG) { logKeyValue('Proxy Config:', Env.ADDON_PROXY_CONFIG); @@ -233,6 +240,10 @@ const logStartupInfo = () => { 'Catalog API:', `${Env.CATALOG_API_RATE_LIMIT_MAX_REQUESTS}/${formatDuration(Env.CATALOG_API_RATE_LIMIT_WINDOW)}` ); + logKeyValue( + 'Anime API:', + `${Env.ANIME_API_RATE_LIMIT_MAX_REQUESTS}/${formatDuration(Env.ANIME_API_RATE_LIMIT_WINDOW)}` + ); logKeyValue( 'Stremio Stream:', `${Env.STREMIO_STREAM_RATE_LIMIT_MAX_REQUESTS}/${formatDuration(Env.STREMIO_STREAM_RATE_LIMIT_WINDOW)}` @@ -503,22 +514,116 @@ const logStartupInfo = () => { 'TMDB Access Token:', Env.TMDB_ACCESS_TOKEN ? '✅ Configured' : '❌ None' ); + logKeyValue( + 'TMDB API Key:', + Env.TMDB_API_KEY ? '✅ Configured' : '❌ None' + ); + logKeyValue( + 'Trakt Client ID:', + Env.TRAKT_CLIENT_ID ? '✅ Configured' : '❌ None' + ); }); logSection('BUILT-IN ADDONS', '🔧', () => { + // Torznab + logKeyValue('Torznab:', ''); + logKeyValue( + 'Search Timeout:', + formatMilliseconds(Env.BUILTIN_TORZNAB_SEARCH_TIMEOUT), + ' ' + ); + logKeyValue( + 'Search Cache TTL:', + formatDuration(Env.BUILTIN_TORZNAB_SEARCH_CACHE_TTL), + ' ' + ); + logKeyValue( + 'Capabilities Cache TTL:', + formatDuration(Env.BUILTIN_TORZNAB_CAPABILITIES_CACHE_TTL), + ' ' + ); + + // Newznab + logKeyValue('Newznab:', ''); + logKeyValue( + 'Search Timeout:', + formatMilliseconds(Env.BUILTIN_NEWZNAB_SEARCH_TIMEOUT), + ' ' + ); + logKeyValue( + 'Search Cache TTL:', + formatDuration(Env.BUILTIN_NEWZNAB_SEARCH_CACHE_TTL), + ' ' + ); + logKeyValue( + 'Capabilities Cache TTL:', + formatDuration(Env.BUILTIN_NEWZNAB_CAPABILITIES_CACHE_TTL), + ' ' + ); + + // Prowlarr + const prowlarrSearchEnabled = + Env.BUILTIN_PROWLARR_URL && Env.BUILTIN_PROWLARR_API_KEY; + logKeyValue( + 'Prowlarr:', + prowlarrSearchEnabled + ? '✅ Enabled' + : '❌ Disabled (Set PROWLARR_URL, PROWLARR_API_KEY)' + ); + if (prowlarrSearchEnabled) { + logKeyValue(' URL:', Env.BUILTIN_PROWLARR_URL!, ' '); + logKeyValue( + ' API Key:', + Env.BUILTIN_PROWLARR_API_KEY ? '✅ Configured' : '❌ None', + ' ' + ); + logKeyValue( + ' Indexers:', + Env.BUILTIN_PROWLARR_INDEXERS ? '✅ Configured' : '❌ None', + ' ' + ); + logKeyValue( + ' Search Timeout:', + formatMilliseconds(Env.BUILTIN_PROWLARR_SEARCH_TIMEOUT), + ' ' + ); + logKeyValue( + ' Search Cache TTL:', + formatDuration(Env.BUILTIN_PROWLARR_SEARCH_CACHE_TTL), + ' ' + ); + logKeyValue( + ' Indexers Cache TTL:', + formatDuration(Env.BUILTIN_PROWLARR_INDEXERS_CACHE_TTL), + ' ' + ); + } + + // animetosho + logKeyValue('AnimeTosho:', Env.BUILTIN_ANIMETOSHO_URL); + if (Env.BUILTIN_ANIMETOSHO_TIMEOUT) { + logKeyValue( + ' Timeout:', + formatMilliseconds(Env.BUILTIN_ANIMETOSHO_TIMEOUT), + ' ' + ); + } + + logKeyValue('Zilean', Env.BUILTIN_ZILEAN_URL); + if (Env.BUILTIN_ZILEAN_TIMEOUT) { + logKeyValue( + ' Timeout:', + formatMilliseconds(Env.BUILTIN_ZILEAN_TIMEOUT), + ' ' + ); + } + const torboxSearchEnabled = Env.BASE_URL; logKeyValue( 'Torbox Search:', torboxSearchEnabled ? '✅ Enabled' : '❌ Disabled (Set BASE_URL)' ); if (torboxSearchEnabled) { - if (Env.BUILTIN_TORBOX_SEARCH_INSTANT_AVAILABILITY_CACHE_TTL) - logKeyValue( - ' Instant Availability Cache TTL:', - formatDuration( - Env.BUILTIN_TORBOX_SEARCH_INSTANT_AVAILABILITY_CACHE_TTL - ) - ); logKeyValue( ' Metadata Cache TTL:', formatDuration(Env.BUILTIN_TORBOX_SEARCH_METADATA_CACHE_TTL) @@ -1335,7 +1440,6 @@ const logStartupInfo = () => { // Additional Features const features: string[] = []; - if (Env.TMDB_ACCESS_TOKEN) features.push('TMDB Integration'); if (Env.CUSTOM_HTML) features.push('Custom HTML'); if (Env.ENCRYPT_MEDIAFLOW_URLS) features.push('Encrypt MediaFlow URLs'); if (Env.ENCRYPT_STREMTHRU_URLS) features.push('Encrypt StremThru URLs'); @@ -1357,7 +1461,9 @@ const logStartupInfo = () => { logKeyValue('Pruning :', '❌ DISABLED'); } }); +}; +const logStartupFooter = () => { // Footer logger.info( '╔═══════════════════════════════════════════════════════════════╗' @@ -1366,7 +1472,7 @@ const logStartupInfo = () => { '║ 🎬 AIOStreams Ready! ║' ); logger.info( - '║ All systems initialized successfully ║' + '║ All systems initialised successfully ║' ); logger.info( '╚═══════════════════════════════════════════════════════════════╝' @@ -1374,4 +1480,4 @@ const logStartupInfo = () => { logger.info(''); }; -export { logStartupInfo }; +export { logStartupInfo, logStartupFooter }; diff --git a/packages/core/src/utils/torrent.ts b/packages/core/src/utils/torrent.ts new file mode 100644 index 00000000..10d79826 --- /dev/null +++ b/packages/core/src/utils/torrent.ts @@ -0,0 +1,112 @@ +import { Torrent, UnprocessedTorrent, DebridFile } from '../debrid'; +import { + extractInfoHashFromMagnet, + extractTrackersFromMagnet, +} from '../builtins/utils/debrid'; +import { createLogger } from './logger'; +import { Cache } from './cache'; +import { makeRequest } from './http'; + +const logger = createLogger('torrent'); + +interface TorrentMetadata { + hash: string; + files: DebridFile[]; + sources: string[]; +} + +export class TorrentClient { + static readonly #metadataCache = Cache.getInstance( + 'torrent-metadata' + ); + + private constructor() {} + + static async getMetadata( + torrent: UnprocessedTorrent + ): Promise { + // If we have hash and don't need full metadata, return early + if (torrent.hash) { + return { + hash: torrent.hash, + files: [], // Empty files array since we don't need metadata + sources: torrent.sources || [], + }; + } + + // If we don't have a download URL, we can't proceed + if (!torrent.downloadUrl) { + logger.debug( + `No download URL available for torrent with hash ${torrent.hash}` + ); + return undefined; + } + + // Try to get from cache if we have a download URL + if (torrent.downloadUrl) { + const cachedMetadata = await this.#metadataCache.get(torrent.downloadUrl); + if (cachedMetadata) { + return cachedMetadata; + } + } + + try { + const metadata = await this.#fetchMetadata(torrent); + if (metadata && torrent.downloadUrl) { + await this.#metadataCache.set( + torrent.downloadUrl, + metadata, + 5 * 60 * 1000 + ); + } + return metadata; + } catch (error) { + logger.error(`Failed to fetch metadata for torrent: ${error}`); + if (torrent.hash) { + // If we have a hash but metadata fetch failed, return basic info + return { + hash: torrent.hash, + files: [], + sources: torrent.sources || [], + }; + } + return undefined; + } + } + + static async #fetchMetadata( + torrent: UnprocessedTorrent + ): Promise { + if (!torrent.downloadUrl) { + throw new Error('Download URL must be provided'); + } + + const response = await makeRequest(torrent.downloadUrl, { + timeout: 500, + rawOptions: { + redirect: 'manual', + }, + }); + + // Handle redirects + if (response.status === 302 || response.status === 301) { + const redirectUrl = response.headers.get('Location'); + if (!redirectUrl) { + throw new Error('Redirect location not found'); + } + + if (redirectUrl.startsWith('magnet:')) { + const hash = extractInfoHashFromMagnet(redirectUrl); + const sources = extractTrackersFromMagnet(redirectUrl); + if (!hash) throw new Error('Invalid magnet URL'); + return { + hash, + files: [], + sources, + }; + } + } + + throw new Error('Unsupported torrent'); + } +} diff --git a/packages/frontend/package.json b/packages/frontend/package.json index 1f29923d..ed39f0f1 100644 --- a/packages/frontend/package.json +++ b/packages/frontend/package.json @@ -9,9 +9,10 @@ "lint": "next lint" }, "dependencies": { - "@aiostreams/core": "^0.0.0", + "@aiostreams/core": "workspace:*", "@dnd-kit/core": "^6.3.1", "@dnd-kit/modifiers": "^9.0.0", + "@dnd-kit/utilities": "^3.2.2", "@dnd-kit/sortable": "^10.0.0", "@headlessui/react": "^2.2.4", "@headlessui/tailwindcss": "^0.2.2", @@ -26,6 +27,7 @@ "@radix-ui/react-switch": "^1.2.5", "@radix-ui/react-tabs": "^1.1.12", "@radix-ui/react-tooltip": "^1.2.7", + "@radix-ui/react-visually-hidden": "^1.2.1", "@tailwindcss/forms": "^0.5.10", "@tailwindcss/typography": "^0.5.16", "@zag-js/number-input": "^1.13.1", @@ -35,6 +37,8 @@ "cmdk": "^1.1.1", "lucide-react": "^0.511.0", "motion": "^12.23.9", + "framer-motion": "^12.1.4", + "fast-deep-equal": "^3.0.0", "next": "15.3.2", "next-themes": "^0.4.6", "react": "^19.0.0", diff --git a/packages/frontend/public/assets/animetosho_logo.png b/packages/frontend/public/assets/animetosho_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..d94364c9e937e55b7776d232f09668ef6388fd71 GIT binary patch literal 88133 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 tSlxybv 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

n!4u3RxQ)0kza-Ood^YmhL7{;?N#Vj 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

GS6lVC`yS}x1C;E%R-9Y7d?Auh6 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¨xIt@SB$5%Y3U&ZCTce7HK^GUcuav+Ihz7# zzDE$O7a>=1KMO^+$0qy_*4)J9;U?dK)Z$d2YW0!k1mH2Ov8R>BQ(lh<*_@wBIZ-I* zeHEB@^J5G0NOq8WmGOvGm)OLEmk^4NA;802fsSxueIpQe;T7Q4a2a4HK$HE*hK-sfIlfO1 zcDV|JQ~lH$aA_4Hp%hHYZ`5a<*RNv})Kgy_;5czH!uzC1Z2@jKiuR;fmfPQvpFn!?={na|$q(6jgaM`+I6t zjWRnVD12fy8Ehl2^5%%?1fj3C7Q}gH8Y`N;{HD1!BZeYH#dfD9qWXycaz`{t@wz$K z(=8yxTS&(S>}~Q1U{Bnt!K}*5Vn?lkz&DXM)M3@a$^m;+gaJwt92${X;ly-|S1bjR z0Zk3+u^)*BjexrHXrV~vFqyjw1d9*>qaA{z)RF2^oKsE0JWXBFI5CPm48;`=pZ*zv z{^RF=k`5G?1GZ{1O9Mr|?X+s93E$AMmma_x??bWN=tTtf3IO2(RXI1>$qU#D zf_QXw76M84ySOA^M7@Y?%?8jU=B_+b;lM&gnF{6RUjYY}7}S7tLTzZID(@m40PGwK z6T_WY$d6b8EL1`OT66yioDEC|Z3^I(bPR15n*|@-lon9TnMyG&3xm&tt4GyQ{;q6M z4=kd?mlNtN+mo5hcmf8JuYh3(EP4X4CIh0kwMz-$KYMVe*!p{cCLCcj(OM9rf+--% zlFG&Fz{D6^naXS$y;xu-WH(eBKVmsU3XAanntW~4Gvp8qCPLx?7+5fZ*6P+hB9clI z51Iur06bO$>>jXrLS(knc9VA*&s7zvWasL`r^4g|2Gd@!;5f@B z$E6a}!cc+ig5mzP1g`*2@w6IATZpDg1l7U9qcw*Ry-0{O)JpjBZ?MSOd`)k_VK%B0 z5Wyh$Glj@1=1hW3BI`Rdveh(kiA6a^6P2%VDIp;YXY}wAVaV<5kckzL2SbGn^!JiT zqv&{hs-WoKzrq_d3vnj%xJ39LkZ%j=2&|0GQ-#em0N(~d=0o(^F$JD)SruXSkP^|o zj5V~AG}y=^NP=(<4n0f-KR&~uCkA=WP{9OXNx6}9mG-97#D(EGuJ8O2u{aH)96ExD z$W;unsl){;FqCGe2`%s{kgE;2rYz9^`u8gEuWInG?<8Ju`E*jFrg&kL8gJ32Cdgth7%n9aUKH)yhGPb~}fCZXH<$ou=AEhuB z?cm+XHmHTl4bm=}THrG#E?b4KW(|20b+?HM6txxod+4FZwgHPsCm)p39khvi&3tGo zd~UF(1C&hxENG|V;LI5r>?<Ldr_!gQSA{yPc4qF0$BN1U?0>*|M@_1 z#ezbJrR*tru#cm`zPt0J93>R45rNz`U1eUPrt29t3+B8SsFPU2Suo4!%%d4-;sK+D zw|nA_0eskQ=8rjqxv--{sl+%BQ~8}t;QM0mM64kK1rX5rrlHgPBf2A9H)r9TK|N0G zz6F690s#pqk-1FfY7{7q+5}PEoS}wG_m9WK!fxPDDWXo84ythz21b_ywm_)yXY2m} D6T%Hq literal 0 HcmV?d00001 diff --git a/packages/frontend/src/app/page.tsx b/packages/frontend/src/app/page.tsx index ffd1a1d2..fd3d91a1 100644 --- a/packages/frontend/src/app/page.tsx +++ b/packages/frontend/src/app/page.tsx @@ -27,7 +27,10 @@ import { ModeProvider } from '@/context/mode'; function ErrorOverlay({ error }: { error: string | null }) { return ( - + window.location.reload()} + >

{error}

diff --git a/packages/frontend/src/components/menu/formatter.tsx b/packages/frontend/src/components/menu/formatter.tsx index b9b48bdc..05912792 100644 --- a/packages/frontend/src/components/menu/formatter.tsx +++ b/packages/frontend/src/components/menu/formatter.tsx @@ -10,7 +10,7 @@ import { Textarea } from '../ui/textarea'; import { Select } from '../ui/select'; import { Switch } from '../ui/switch'; import { TextInput } from '../ui/text-input'; -import FileParser from '@aiostreams/core/src/parser/file'; +import FileParser from '../../../../core/src/parser/file'; import { UserConfigAPI } from '@/services/api'; import { SNIPPETS } from '../../../../core/src/utils/constants'; import { Modal } from '@/components/ui/modal'; diff --git a/packages/frontend/src/context/status.tsx b/packages/frontend/src/context/status.tsx index 045851ed..f9c8fcbb 100644 --- a/packages/frontend/src/context/status.tsx +++ b/packages/frontend/src/context/status.tsx @@ -31,9 +31,11 @@ export function StatusProvider({ children }: { children: ReactNode }) { useEffect(() => { fetch(`${baseUrl}/status`) - .then((res) => { - if (!res.ok) throw new Error('Failed to fetch status'); - return res.json(); + .then(async (res) => { + const data = await res.json(); + if (!res.ok) + throw new Error(data.error?.message || 'Failed to fetch status'); + return data; }) .then((data) => setStatus(data.data)) .catch((err) => setError(err.message)) diff --git a/packages/frontend/tsconfig.json b/packages/frontend/tsconfig.json index d78eee63..989a2d03 100644 --- a/packages/frontend/tsconfig.json +++ b/packages/frontend/tsconfig.json @@ -1,12 +1,8 @@ { "extends": "../../tsconfig.base.json", "compilerOptions": { - "target": "ES2021", - "lib": [ - "dom", - "dom.iterable", - "esnext" - ], + "target": "ES2022", + "lib": ["dom", "dom.iterable", "esnext"], "allowJs": true, "skipLibCheck": true, "strict": true, @@ -19,9 +15,7 @@ "jsx": "preserve", "incremental": true, "paths": { - "@/*": [ - "./src/*" - ] + "@/*": ["./src/*"] }, "plugins": [ { @@ -34,13 +28,6 @@ "path": "../server" } ], - "include": [ - "**/*.ts", - "**/*.tsx", - "next-env.d.ts", - ".next/types/**/*.ts" - ], - "exclude": [ - "node_modules" - ] + "include": ["**/*.ts", "**/*.tsx", "next-env.d.ts", ".next/types/**/*.ts"], + "exclude": ["node_modules"] } diff --git a/packages/server/package.json b/packages/server/package.json index cb7a3d14..bd36ae7e 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -10,10 +10,11 @@ }, "description": "Combine all your streams into one addon and display them with consistent formatting, sorting, and filtering.", "dependencies": { - "@aiostreams/core": "^0.0.0", + "@aiostreams/core": "workspace:*", "express": "^5.1.0", "express-rate-limit": "^8.0.1", - "rate-limit-redis": "^4.2.2" + "rate-limit-redis": "^4.2.2", + "zod": "^4.1.5" }, "devDependencies": { "@types/express": "^5.0.1", diff --git a/packages/server/src/app.ts b/packages/server/src/app.ts index 6c6fe23b..8e849abd 100644 --- a/packages/server/src/app.ts +++ b/packages/server/src/app.ts @@ -1,5 +1,4 @@ -import express, { Request, Response } from 'express'; - +import express, { Request, Response, Express } from 'express'; import { userApi, healthApi, @@ -10,6 +9,7 @@ import { gdriveApi, debridApi, searchApi, + animeApi, } from './routes/api'; import { configure, @@ -21,7 +21,13 @@ import { addonCatalog, alias, } from './routes/stremio'; -import { gdrive, torboxSearch } from './routes/builtins'; +import { + gdrive, + torboxSearch, + torznab, + newznab, + prowlarr, +} from './routes/builtins'; import { ipMiddleware, loggerMiddleware, @@ -38,7 +44,7 @@ import { StremioTransformer } from '@aiostreams/core'; import { createResponse } from './utils/responses'; import path from 'path'; import fs from 'fs'; -const app = express(); +const app: Express = express(); const logger = createLogger('server'); export const frontendRoot = path.join(__dirname, '../../frontend/out'); @@ -78,6 +84,7 @@ apiRouter.use('/debrid', debridApi); if (Env.ENABLE_SEARCH_API) { apiRouter.use('/search', searchApi); } +apiRouter.use('/anime', animeApi); app.use(`/api/v${constants.API_VERSION}`, apiRouter); // Stremio Routes @@ -115,6 +122,9 @@ const builtinsRouter = express.Router(); builtinsRouter.use(internalMiddleware); builtinsRouter.use('/gdrive', gdrive); builtinsRouter.use('/torbox-search', torboxSearch); +builtinsRouter.use('/torznab', torznab); +builtinsRouter.use('/newznab', newznab); +builtinsRouter.use('/prowlarr', prowlarr); app.use('/builtins', builtinsRouter); app.get( diff --git a/packages/server/src/middlewares/ip.ts b/packages/server/src/middlewares/ip.ts index 508657f0..9b6a2c34 100644 --- a/packages/server/src/middlewares/ip.ts +++ b/packages/server/src/middlewares/ip.ts @@ -24,6 +24,15 @@ const isIpInRange = (ip: string, range: string) => { return ip === range; }; +const isPrivateIp = (ip?: string) => { + if (!ip) { + return false; + } + return /^(10\.|(::ffff)?127\.|172\.(1[6-9]|2[0-9]|3[01])\.|192\.168\.|::1)/.test( + ip + ); +}; + export const ipMiddleware = ( req: Request, res: Response, @@ -52,7 +61,7 @@ export const ipMiddleware = ( req.get('CF-Connecting-IP') || ip : ip; - req.userIp = userIp; + req.userIp = isPrivateIp(userIp) ? undefined : userIp; req.requestIp = requestIp; next(); }; diff --git a/packages/server/src/middlewares/ratelimit.ts b/packages/server/src/middlewares/ratelimit.ts index b4c5132c..1df2a72e 100644 --- a/packages/server/src/middlewares/ratelimit.ts +++ b/packages/server/src/middlewares/ratelimit.ts @@ -81,6 +81,12 @@ const catalogApiRateLimiter = createRateLimiter( 'catalog-api' ); +const animeApiRateLimiter = createRateLimiter( + Env.ANIME_API_RATE_LIMIT_WINDOW * 1000, + Env.ANIME_API_RATE_LIMIT_MAX_REQUESTS, + 'anime-api' +); + const stremioStreamRateLimiter = createRateLimiter( Env.STREMIO_STREAM_RATE_LIMIT_WINDOW * 1000, Env.STREMIO_STREAM_RATE_LIMIT_MAX_REQUESTS, @@ -122,6 +128,7 @@ export { streamApiRateLimiter, formatApiRateLimiter, catalogApiRateLimiter, + animeApiRateLimiter, stremioStreamRateLimiter, stremioCatalogRateLimiter, stremioManifestRateLimiter, diff --git a/packages/server/src/routes/api/anime.ts b/packages/server/src/routes/api/anime.ts new file mode 100644 index 00000000..2829817b --- /dev/null +++ b/packages/server/src/routes/api/anime.ts @@ -0,0 +1,63 @@ +import { Router, Request, Response, NextFunction } from 'express'; +import { createResponse } from '../../utils/responses'; +import { + APIError, + constants, + createLogger, + formatZodError, + AnimeDatabase, + IdType, + ID_TYPES, +} from '@aiostreams/core'; +import { z, ZodError } from 'zod'; +import { animeApiRateLimiter } from '../../middlewares/ratelimit'; +const router: Router = Router(); +const logger = createLogger('server'); + +router.use(animeApiRateLimiter); + +router.get('/', async (req: Request, res: Response, next: NextFunction) => { + let idType: IdType; + let idValue: string | number; + try { + const { idType: idTypeParam, idValue: idValueParam } = z + .object({ + idType: z.enum(ID_TYPES), + idValue: z.union([z.string(), z.number()]), + }) + .parse(req.query); + idType = idTypeParam; + idValue = idValueParam; + } catch (error: any) { + if (error instanceof ZodError) { + next( + new APIError( + constants.ErrorCode.BAD_REQUEST, + 400, + formatZodError(error) + ) + ); + return; + } + next(new APIError(constants.ErrorCode.BAD_REQUEST, error.message)); + return; + } + try { + const mappingEntry = AnimeDatabase.getInstance().getEntryById( + idType, + idValue + ); + res + .status(200) + .json( + createResponse({ success: true, detail: 'OK', data: mappingEntry }) + ); + } catch (error: any) { + logger.error(`Mapping check failed: ${error.message}`); + next( + new APIError(constants.ErrorCode.INTERNAL_SERVER_ERROR, error.message) + ); + } +}); + +export default router; diff --git a/packages/server/src/routes/api/catalog.ts b/packages/server/src/routes/api/catalog.ts index 01475119..ca3286b7 100644 --- a/packages/server/src/routes/api/catalog.ts +++ b/packages/server/src/routes/api/catalog.ts @@ -10,7 +10,7 @@ import { constants, } from '@aiostreams/core'; import { catalogApiRateLimiter } from '../../middlewares/ratelimit'; -const router = Router(); +const router: Router = Router(); const logger = createLogger('server'); router.use(catalogApiRateLimiter); diff --git a/packages/server/src/routes/api/debrid.ts b/packages/server/src/routes/api/debrid.ts index cbe57102..8ecf30ac 100644 --- a/packages/server/src/routes/api/debrid.ts +++ b/packages/server/src/routes/api/debrid.ts @@ -6,13 +6,12 @@ import { formatZodError, } from '@aiostreams/core'; import { - DebridInterface, DebridError, PlaybackInfoSchema, - StoreAuthSchema, + getDebridService, + ServiceAuthSchema, } from '@aiostreams/core'; import { ZodError } from 'zod'; -import { StremThruError } from 'stremthru'; import { STATIC_DOWNLOAD_FAILED, STATIC_DOWNLOADING, @@ -23,7 +22,7 @@ import { STATIC_UNAUTHORIZED, STATIC_NO_MATCHING_FILE, } from '../../app'; -const router = Router(); +const router: Router = Router(); const logger = createLogger('server'); // block HEAD requests @@ -36,7 +35,7 @@ router.use((req: Request, res: Response, next: NextFunction) => { }); router.get( - '/resolve/:encodedStoreAuth/:encodedPlaybackInfo/:filename', + '/playback/:encodedStoreAuth/:encodedPlaybackInfo/:filename', async (req: Request, res: Response, next: NextFunction) => { try { const { encodedStoreAuth, encodedPlaybackInfo, filename } = req.params; @@ -51,22 +50,25 @@ router.get( JSON.parse(Buffer.from(encodedPlaybackInfo, 'base64').toString('utf-8')) ); - const storeAuth = StoreAuthSchema.parse( + const storeAuth = ServiceAuthSchema.parse( JSON.parse(Buffer.from(encodedStoreAuth, 'base64').toString('utf-8')) ); - const debridInterface = new DebridInterface(storeAuth, req.userIp); + const debridInterface = getDebridService( + storeAuth.id, + storeAuth.credential, + req.userIp + ); let streamUrl: string | undefined; try { streamUrl = await debridInterface.resolve(playbackInfo, filename); } catch (error: any) { let staticFile: string = STATIC_INTERNAL_SERVER_ERROR; - if (error instanceof StremThruError) { + if (error instanceof DebridError) { logger.error( - `Got StremThru error during debrid resolve: ${error.code}: ${error.message}` + `Got Debrid error during debrid resolve: ${error.code}: ${error.message}` ); - switch (error.code) { case 'UNAVAILABLE_FOR_LEGAL_REASONS': staticFile = STATIC_UNAVAILABLE_FOR_LEGAL_REASONS; @@ -85,14 +87,6 @@ router.get( case 'STORE_MAGNET_INVALID': staticFile = STATIC_DOWNLOAD_FAILED; break; - default: - break; - } - } else if (error instanceof DebridError) { - logger.error( - `Got Debrid error during debrid resolve: ${error.code}: ${error.message}` - ); - switch (error.code) { case 'NO_MATCHING_FILE': staticFile = STATIC_NO_MATCHING_FILE; break; @@ -116,9 +110,6 @@ router.get( res.status(307).redirect(streamUrl); } catch (error: any) { - logger.error( - `Got unexpected error during debrid resolve: ${error.message}` - ); if (error instanceof APIError) { next(error); } else if (error instanceof ZodError) { @@ -130,6 +121,9 @@ router.get( ) ); } else { + logger.error( + `Got unexpected error during debrid resolve: ${error.message}` + ); next( new APIError( constants.ErrorCode.INTERNAL_SERVER_ERROR, diff --git a/packages/server/src/routes/api/format.ts b/packages/server/src/routes/api/format.ts index c2bbe5cb..2ce4fb59 100644 --- a/packages/server/src/routes/api/format.ts +++ b/packages/server/src/routes/api/format.ts @@ -1,6 +1,11 @@ import { Router, Request, Response, NextFunction } from 'express'; import { createResponse } from '../../utils/responses'; -import { createLogger, UserData, UserDataSchema } from '@aiostreams/core'; +import { + createLogger, + UserData, + UserDataSchema, + formatZodError, +} from '@aiostreams/core'; import { createFormatter, ParsedStreamSchema, @@ -8,7 +13,8 @@ import { } from '@aiostreams/core'; import * as constants from '@aiostreams/core'; import { formatApiRateLimiter } from '../../middlewares/ratelimit'; -const router = Router(); + +const router: Router = Router(); router.use(formatApiRateLimiter); @@ -23,7 +29,11 @@ router.post('/', (req: Request, res: Response) => { } = ParsedStreamSchema.safeParse(stream); if (!streamSuccess) { logger.error('Invalid stream', { error: streamError }); - throw new APIError(constants.ErrorCode.FORMAT_INVALID_STREAM); + throw new APIError( + constants.ErrorCode.FORMAT_INVALID_STREAM, + 400, + formatZodError(streamError) + ); } const { success: userDataSuccess, @@ -32,7 +42,11 @@ router.post('/', (req: Request, res: Response) => { } = UserDataSchema.safeParse(userData); if (!userDataSuccess) { logger.error('Invalid user data', { error: userDataError }); - throw new APIError(constants.ErrorCode.FORMAT_INVALID_FORMATTER); + throw new APIError( + constants.ErrorCode.FORMAT_INVALID_FORMATTER, + 400, + formatZodError(userDataError) + ); } const formattedStream = createFormatter(userDataData).format(streamData); res diff --git a/packages/server/src/routes/api/gdrive.ts b/packages/server/src/routes/api/gdrive.ts index c1530aa7..9868b522 100644 --- a/packages/server/src/routes/api/gdrive.ts +++ b/packages/server/src/routes/api/gdrive.ts @@ -2,7 +2,7 @@ import { Router, Request, Response, NextFunction } from 'express'; import { createResponse } from '../../utils/responses'; import { APIError, constants, createLogger, GDriveAPI } from '@aiostreams/core'; import { GoogleOAuth } from '@aiostreams/core'; -const router = Router(); +const router: Router = Router(); const logger = createLogger('server'); router.post('/', async (req: Request, res: Response, next: NextFunction) => { diff --git a/packages/server/src/routes/api/health.ts b/packages/server/src/routes/api/health.ts index 85e2b9c2..9f2e7963 100644 --- a/packages/server/src/routes/api/health.ts +++ b/packages/server/src/routes/api/health.ts @@ -6,7 +6,7 @@ import { createLogger, UserRepository, } from '@aiostreams/core'; -const router = Router(); +const router: Router = Router(); const logger = createLogger('server'); router.get('/', async (req: Request, res: Response, next: NextFunction) => { diff --git a/packages/server/src/routes/api/index.ts b/packages/server/src/routes/api/index.ts index f865d50e..3f4c9fc1 100644 --- a/packages/server/src/routes/api/index.ts +++ b/packages/server/src/routes/api/index.ts @@ -7,3 +7,4 @@ export { default as rpdbApi } from './rpdb'; export { default as gdriveApi } from './gdrive'; export { default as debridApi } from './debrid'; export { default as searchApi } from './search'; +export { default as animeApi } from './anime'; diff --git a/packages/server/src/routes/api/rpdb.ts b/packages/server/src/routes/api/rpdb.ts index c21ab05b..f10d3451 100644 --- a/packages/server/src/routes/api/rpdb.ts +++ b/packages/server/src/routes/api/rpdb.ts @@ -9,7 +9,7 @@ import { RPDB } from '@aiostreams/core'; import { createResponse } from '../../utils/responses'; import { z } from 'zod'; -const router = Router(); +const router: Router = Router(); const logger = createLogger('server'); const searchParams = z.object({ @@ -38,13 +38,14 @@ router.get('/', async (req: Request, res: Response, next: NextFunction) => { const { id, type, fallback, apiKey } = data; const rpdb = new RPDB(apiKey); const posterUrl = (await rpdb.getPosterUrl(type, id)) || fallback; - if (!(posterUrl && fallback)) { + if (!posterUrl) { res.status(404).json( createResponse({ success: false, detail: 'Not found', }) ); + return; } res.redirect(301, posterUrl!); } catch (error: any) { diff --git a/packages/server/src/routes/api/search.ts b/packages/server/src/routes/api/search.ts index 684f5a9c..2b5aa1f5 100644 --- a/packages/server/src/routes/api/search.ts +++ b/packages/server/src/routes/api/search.ts @@ -15,7 +15,7 @@ import { createLogger } from '@aiostreams/core'; import { ApiTransformer, ApiSearchResponseData } from '@aiostreams/core'; import { ApiResponse, createResponse } from '../../utils/responses'; import { z, ZodError } from 'zod'; -const router = Router(); +const router: Router = Router(); const logger = createLogger('server'); diff --git a/packages/server/src/routes/api/status.ts b/packages/server/src/routes/api/status.ts index 13c32661..1e6d033f 100644 --- a/packages/server/src/routes/api/status.ts +++ b/packages/server/src/routes/api/status.ts @@ -10,7 +10,7 @@ import { encryptString } from '@aiostreams/core'; import { FeatureControl } from '@aiostreams/core'; import { createResponse } from '../../utils/responses'; -const router = Router(); +const router: Router = Router(); const statusInfo = async (): Promise => { const userCount = await UserRepository.getUserCount(); diff --git a/packages/server/src/routes/api/user.ts b/packages/server/src/routes/api/user.ts index 06604fb2..64a39335 100644 --- a/packages/server/src/routes/api/user.ts +++ b/packages/server/src/routes/api/user.ts @@ -8,7 +8,7 @@ import { } from '@aiostreams/core'; import { userApiRateLimiter } from '../../middlewares/ratelimit'; import { createResponse } from '../../utils/responses'; -const router = Router(); +const router: Router = Router(); const logger = createLogger('server'); diff --git a/packages/server/src/routes/builtins/gdrive.ts b/packages/server/src/routes/builtins/gdrive.ts index 55bf9ffa..f87aa400 100644 --- a/packages/server/src/routes/builtins/gdrive.ts +++ b/packages/server/src/routes/builtins/gdrive.ts @@ -2,12 +2,10 @@ import { Router, Request, Response, NextFunction } from 'express'; import { AIOStreams, AIOStreamResponse, GDriveAddon } from '@aiostreams/core'; import { stremioStreamRateLimiter } from '../../middlewares/ratelimit'; import { createLogger } from '@aiostreams/core'; -const router = Router(); +const router: Router = Router(); const logger = createLogger('server'); -router.use(stremioStreamRateLimiter); - router.get( '{/:encodedConfig}/manifest.json', async (req: Request, res: Response, next: NextFunction) => { diff --git a/packages/server/src/routes/builtins/index.ts b/packages/server/src/routes/builtins/index.ts index a52f8683..6e4b91a2 100644 --- a/packages/server/src/routes/builtins/index.ts +++ b/packages/server/src/routes/builtins/index.ts @@ -1,2 +1,5 @@ export { default as gdrive } from './gdrive'; export { default as torboxSearch } from './torbox-search'; +export { default as torznab } from './torznab'; +export { default as newznab } from './newznab'; +export { default as prowlarr } from './prowlarr'; diff --git a/packages/server/src/routes/builtins/newznab.ts b/packages/server/src/routes/builtins/newznab.ts new file mode 100644 index 00000000..40603035 --- /dev/null +++ b/packages/server/src/routes/builtins/newznab.ts @@ -0,0 +1,45 @@ +import { Router, Request, Response, NextFunction } from 'express'; +import { NewznabAddon } from '@aiostreams/core'; +import { createLogger } from '@aiostreams/core'; +const router: Router = Router(); + +const logger = createLogger('server'); + +router.get( + '/:encodedConfig/manifest.json', + async (req: Request, res: Response, next: NextFunction) => { + const { encodedConfig } = req.params; + const config = encodedConfig + ? JSON.parse(Buffer.from(encodedConfig, 'base64').toString('utf-8')) + : undefined; + + try { + const manifest = new NewznabAddon(config, req.userIp).getManifest(); + res.json(manifest); + } catch (error) { + next(error); + } + } +); + +router.get( + '/:encodedConfig/stream/:type/:id.json', + async (req: Request, res: Response, next: NextFunction) => { + const { encodedConfig, type, id } = req.params; + const config = JSON.parse( + Buffer.from(encodedConfig, 'base64').toString('utf-8') + ); + + try { + const addon = new NewznabAddon(config, req.userIp); + const streams = await addon.getStreams(type, id); + res.json({ + streams: streams, + }); + } catch (error) { + next(error); + } + } +); + +export default router; diff --git a/packages/server/src/routes/builtins/prowlarr.ts b/packages/server/src/routes/builtins/prowlarr.ts new file mode 100644 index 00000000..6545199c --- /dev/null +++ b/packages/server/src/routes/builtins/prowlarr.ts @@ -0,0 +1,46 @@ +import { Router, Request, Response, NextFunction } from 'express'; +import { AIOStreams, AIOStreamResponse, ProwlarrAddon } from '@aiostreams/core'; +import { stremioStreamRateLimiter } from '../../middlewares/ratelimit'; +import { createLogger } from '@aiostreams/core'; +const router: Router = Router(); + +const logger = createLogger('server'); + +router.get( + '/:encodedConfig/manifest.json', + async (req: Request, res: Response, next: NextFunction) => { + const { encodedConfig } = req.params; + const config = encodedConfig + ? JSON.parse(Buffer.from(encodedConfig, 'base64').toString('utf-8')) + : undefined; + + try { + const manifest = new ProwlarrAddon(config, req.userIp).getManifest(); + res.json(manifest); + } catch (error) { + next(error); + } + } +); + +router.get( + '/:encodedConfig/stream/:type/:id.json', + async (req: Request, res: Response, next: NextFunction) => { + const { encodedConfig, type, id } = req.params; + const config = JSON.parse( + Buffer.from(encodedConfig, 'base64').toString('utf-8') + ); + + try { + const addon = new ProwlarrAddon(config, req.userIp); + const streams = await addon.getStreams(type, id); + res.json({ + streams: streams, + }); + } catch (error) { + next(error); + } + } +); + +export default router; diff --git a/packages/server/src/routes/builtins/torbox-search.ts b/packages/server/src/routes/builtins/torbox-search.ts index fc3ade3d..421b0b18 100644 --- a/packages/server/src/routes/builtins/torbox-search.ts +++ b/packages/server/src/routes/builtins/torbox-search.ts @@ -6,7 +6,7 @@ import { TorBoxSearchAddonError, } from '@aiostreams/core'; import { createResponse } from '../../utils/responses'; -const router = Router(); +const router: Router = Router(); const logger = createLogger('builtins:torbox-search'); diff --git a/packages/server/src/routes/builtins/torznab.ts b/packages/server/src/routes/builtins/torznab.ts new file mode 100644 index 00000000..77132646 --- /dev/null +++ b/packages/server/src/routes/builtins/torznab.ts @@ -0,0 +1,46 @@ +import { Router, Request, Response, NextFunction } from 'express'; +import { AIOStreams, AIOStreamResponse, TorznabAddon } from '@aiostreams/core'; +import { stremioStreamRateLimiter } from '../../middlewares/ratelimit'; +import { createLogger } from '@aiostreams/core'; +const router: Router = Router(); + +const logger = createLogger('server'); + +router.get( + '/:encodedConfig/manifest.json', + async (req: Request, res: Response, next: NextFunction) => { + const { encodedConfig } = req.params; + const config = encodedConfig + ? JSON.parse(Buffer.from(encodedConfig, 'base64').toString('utf-8')) + : undefined; + + try { + const manifest = new TorznabAddon(config, req.userIp).getManifest(); + res.json(manifest); + } catch (error) { + next(error); + } + } +); + +router.get( + '/:encodedConfig/stream/:type/:id.json', + async (req: Request, res: Response, next: NextFunction) => { + const { encodedConfig, type, id } = req.params; + const config = JSON.parse( + Buffer.from(encodedConfig, 'base64').toString('utf-8') + ); + + try { + const addon = new TorznabAddon(config, req.userIp); + const streams = await addon.getStreams(type, id); + res.json({ + streams: streams, + }); + } catch (error) { + next(error); + } + } +); + +export default router; diff --git a/packages/server/src/routes/stremio/addonCatalog.ts b/packages/server/src/routes/stremio/addonCatalog.ts index 83c86f0b..36d15232 100644 --- a/packages/server/src/routes/stremio/addonCatalog.ts +++ b/packages/server/src/routes/stremio/addonCatalog.ts @@ -5,7 +5,7 @@ import { createResponse } from '../../utils/responses'; import { StremioTransformer } from '@aiostreams/core'; const logger = createLogger('server'); -const router = Router(); +const router: Router = Router(); router.get( '/:type/:id.json', diff --git a/packages/server/src/routes/stremio/alias.ts b/packages/server/src/routes/stremio/alias.ts index 313600be..c5d87a72 100644 --- a/packages/server/src/routes/stremio/alias.ts +++ b/packages/server/src/routes/stremio/alias.ts @@ -1,33 +1,36 @@ // looks at Env.ALIASED_CONFIGURATIONS and then redirects to /stremio/{uuid}/{encryptedPassword} after parsing the alias value import { APIError, constants, createLogger, Env } from '@aiostreams/core'; -import { Router, Request } from 'express'; +import { Router, Request, Response } from 'express'; import { createResponse } from '../../utils/responses'; const logger = createLogger('server'); -const router = Router(); +const router: Router = Router(); interface AliasParams { alias: string; [key: string]: string; } -router.get('/:alias/*wildcardPath', (req: Request, res) => { - const { alias } = req.params; - let { wildcardPath } = req.params; - if (Array.isArray(wildcardPath)) { - wildcardPath = wildcardPath.join('/'); +router.get( + '/:alias/*wildcardPath', + (req: Request, res: Response) => { + const { alias } = req.params; + let { wildcardPath } = req.params; + if (Array.isArray(wildcardPath)) { + wildcardPath = wildcardPath.join('/'); + } + + const configuration = Env.ALIASED_CONFIGURATIONS[alias]; + if (!configuration || !configuration.uuid || !configuration.password) { + throw new APIError(constants.ErrorCode.USER_INVALID_DETAILS); + } + + const redirectPath = `/stremio/${configuration.uuid}/${configuration.password}${wildcardPath ? `/${wildcardPath}` : ''}`; + logger.debug(`Redirecting alias ${alias} to ${redirectPath}`); + + res.redirect(redirectPath); } - - const configuration = Env.ALIASED_CONFIGURATIONS[alias]; - if (!configuration || !configuration.uuid || !configuration.password) { - throw new APIError(constants.ErrorCode.USER_INVALID_DETAILS); - } - - const redirectPath = `/stremio/${configuration.uuid}/${configuration.password}${wildcardPath ? `/${wildcardPath}` : ''}`; - logger.debug(`Redirecting alias ${alias} to ${redirectPath}`); - - res.redirect(redirectPath); -}); +); export default router; diff --git a/packages/server/src/routes/stremio/catalog.ts b/packages/server/src/routes/stremio/catalog.ts index 4e6004cb..86873863 100644 --- a/packages/server/src/routes/stremio/catalog.ts +++ b/packages/server/src/routes/stremio/catalog.ts @@ -6,7 +6,7 @@ import { StremioTransformer } from '@aiostreams/core'; import { createLogger } from '@aiostreams/core'; const logger = createLogger('server'); -const router = Router(); +const router: Router = Router(); router.use(stremioCatalogRateLimiter); diff --git a/packages/server/src/routes/stremio/configure.ts b/packages/server/src/routes/stremio/configure.ts index 996425ff..5cad1ea9 100644 --- a/packages/server/src/routes/stremio/configure.ts +++ b/packages/server/src/routes/stremio/configure.ts @@ -1,11 +1,11 @@ -import { Router } from 'express'; +import { Router, Request, Response } from 'express'; import path from 'path'; -const router = Router(); +const router: Router = Router(); import { staticRateLimiter } from '../../middlewares/ratelimit'; import { frontendRoot } from '../../app'; export default router; -router.get('/', staticRateLimiter, (req, res) => { +router.get('/', staticRateLimiter, (req: Request, res: Response) => { res.sendFile(path.join(frontendRoot, 'index.html')); }); diff --git a/packages/server/src/routes/stremio/manifest.ts b/packages/server/src/routes/stremio/manifest.ts index 17fdbe15..8f321959 100644 --- a/packages/server/src/routes/stremio/manifest.ts +++ b/packages/server/src/routes/stremio/manifest.ts @@ -12,7 +12,7 @@ import { createLogger } from '@aiostreams/core'; import { stremioManifestRateLimiter } from '../../middlewares/ratelimit'; const logger = createLogger('server'); -const router = Router(); +const router: Router = Router(); export default router; diff --git a/packages/server/src/routes/stremio/meta.ts b/packages/server/src/routes/stremio/meta.ts index e1a32e88..4628b169 100644 --- a/packages/server/src/routes/stremio/meta.ts +++ b/packages/server/src/routes/stremio/meta.ts @@ -6,7 +6,7 @@ import { StremioTransformer } from '@aiostreams/core'; import { stremioMetaRateLimiter } from '../../middlewares/ratelimit'; const logger = createLogger('server'); -const router = Router(); +const router: Router = Router(); router.use(stremioMetaRateLimiter); diff --git a/packages/server/src/routes/stremio/stream.ts b/packages/server/src/routes/stremio/stream.ts index a947c7c2..22e75b98 100644 --- a/packages/server/src/routes/stremio/stream.ts +++ b/packages/server/src/routes/stremio/stream.ts @@ -3,7 +3,7 @@ import { AIOStreams, AIOStreamResponse, Env } from '@aiostreams/core'; import { stremioStreamRateLimiter } from '../../middlewares/ratelimit'; import { createLogger } from '@aiostreams/core'; import { StremioTransformer } from '@aiostreams/core'; -const router = Router(); +const router: Router = Router(); const logger = createLogger('server'); diff --git a/packages/server/src/routes/stremio/subtitle.ts b/packages/server/src/routes/stremio/subtitle.ts index 5e2a7148..888ed7e4 100644 --- a/packages/server/src/routes/stremio/subtitle.ts +++ b/packages/server/src/routes/stremio/subtitle.ts @@ -5,7 +5,7 @@ import { StremioTransformer } from '@aiostreams/core'; import { stremioSubtitleRateLimiter } from '../../middlewares/ratelimit'; const logger = createLogger('server'); -const router = Router(); +const router: Router = Router(); router.use(stremioSubtitleRateLimiter); diff --git a/packages/server/src/server.ts b/packages/server/src/server.ts index 120a165e..59a581a5 100644 --- a/packages/server/src/server.ts +++ b/packages/server/src/server.ts @@ -6,8 +6,11 @@ import { DB, UserRepository, logStartupInfo, + logStartupFooter, Cache, FeatureControl, + PTT, + AnimeDatabase, } from '@aiostreams/core'; const logger = createLogger('server'); @@ -21,6 +24,15 @@ async function initialiseDatabase() { } } +async function initialisePTT() { + try { + await PTT.initialise(); + } catch (error) { + logger.error('Failed to initialise PTT Server:', error); + throw error; + } +} + async function startAutoPrune() { try { if (Env.PRUNE_MAX_DAYS < 0) { @@ -37,15 +49,25 @@ async function initialiseRedis() { } } +async function initialiseAnimeDatabase() { + try { + await AnimeDatabase.getInstance().initialise(); + } catch (error) { + logger.error('Failed to initialise AnimeDatabase:', error); + } +} + async function start() { try { + logStartupInfo(); await initialiseDatabase(); await initialiseRedis(); + await initialisePTT(); + initialiseAnimeDatabase(); FeatureControl.initialise(); if (Env.PRUNE_MAX_DAYS >= 0) { startAutoPrune(); } - logStartupInfo(); const server = app.listen(Env.PORT, (error) => { if (error) { logger.error('Failed to start server:', error); @@ -54,6 +76,7 @@ async function start() { logger.info( `Server running on port ${Env.PORT}: ${JSON.stringify(server.address())}` ); + logStartupFooter(); }); } catch (error) { logger.error('Failed to start server:', error); @@ -63,6 +86,7 @@ async function start() { async function shutdown() { await Cache.close(); + await PTT.cleanup(); FeatureControl.cleanup(); await DB.getInstance().close(); } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 00000000..da99218c --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,10211 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + devDependencies: + cross-env: + specifier: ^7.0.3 + version: 7.0.3 + prettier: + specifier: ^3.3.2 + version: 3.6.2 + ts-node: + specifier: ^10.9.2 + version: 10.9.2(@types/node@24.2.1)(typescript@5.9.2) + tsx: + specifier: ^4.16.2 + version: 4.20.3 + typescript: + specifier: ^5.5.3 + version: 5.9.2 + vitest: + specifier: ^2.1.5 + version: 2.1.9(@types/node@24.2.1)(lightningcss@1.30.1) + + packages/core: + dependencies: + '@torbox/torbox-api': + specifier: github:viren070/torbox-sdk-js#dist + version: https://codeload.github.com/viren070/torbox-sdk-js/tar.gz/dc1d0bc148dd35fa5e5d39f699f070aadeccad5c + bcrypt: + specifier: ^6.0.0 + version: 6.0.0 + bytes: + specifier: ^3.1.2 + version: 3.1.2 + dotenv: + specifier: ^16.4.7 + version: 16.6.1 + envalid: + specifier: ^8.0.0 + version: 8.1.0 + expr-eval: + specifier: ^2.0.2 + version: 2.0.2 + fetch-socks: + specifier: ^1.3.2 + version: 1.3.2 + fuzzball: + specifier: ^2.2.3 + version: 2.2.3 + go-ptt: + specifier: ^0.4.0 + version: 0.4.0 + moment-timezone: + specifier: ^0.5.48 + version: 0.5.48 + parse-torrent-title: + specifier: github:TheBeastLT/parse-torrent-title + version: https://codeload.github.com/TheBeastLT/parse-torrent-title/tar.gz/1169487e316a4eed898dcfd900957f89a253604c + pg: + specifier: ^8.16.0 + version: 8.16.3 + redis: + specifier: ^5.8.2 + version: 5.8.2 + sqlite: + specifier: ^5.1.1 + version: 5.1.1 + sqlite3: + specifier: ^5.1.7 + version: 5.1.7 + stremthru: + specifier: ^0.8.0 + version: 0.8.0(encoding@0.1.13) + super-regex: + specifier: ^1.0.0 + version: 1.0.0 + undici: + specifier: ^7.2.3 + version: 7.13.0 + winston: + specifier: ^3.17.0 + version: 3.17.0 + xml2js: + specifier: ^0.6.2 + version: 0.6.2 + zod: + specifier: ^4.1.5 + version: 4.1.5 + devDependencies: + '@types/bcrypt': + specifier: ^5.0.2 + version: 5.0.2 + '@types/bytes': + specifier: ^3.1.5 + version: 3.1.5 + '@types/node': + specifier: ^20.14.10 + version: 20.19.10 + '@types/pg': + specifier: ^8.15.2 + version: 8.15.5 + '@types/xml2js': + specifier: ^0.4.14 + version: 0.4.14 + + packages/frontend: + dependencies: + '@aiostreams/core': + specifier: workspace:* + version: link:../core + '@dnd-kit/core': + specifier: ^6.3.1 + version: 6.3.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@dnd-kit/modifiers': + specifier: ^9.0.0 + version: 9.0.0(@dnd-kit/core@6.3.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react@19.1.1) + '@dnd-kit/sortable': + specifier: ^10.0.0 + version: 10.0.0(@dnd-kit/core@6.3.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react@19.1.1) + '@dnd-kit/utilities': + specifier: ^3.2.2 + version: 3.2.2(react@19.1.1) + '@headlessui/react': + specifier: ^2.2.4 + version: 2.2.7(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@headlessui/tailwindcss': + specifier: ^0.2.2 + version: 0.2.2(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@20.19.10)(typescript@5.9.2))) + '@radix-ui/react-accordion': + specifier: ^1.2.11 + version: 1.2.11(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-dialog': + specifier: ^1.1.14 + version: 1.1.14(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-dropdown-menu': + specifier: ^2.1.15 + version: 2.1.15(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-password-toggle-field': + specifier: ^0.1.2 + version: 0.1.2(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-popover': + specifier: ^1.1.14 + version: 1.1.14(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-select': + specifier: ^2.2.5 + version: 2.2.5(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-separator': + specifier: ^1.1.7 + version: 1.1.7(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-slider': + specifier: ^1.3.5 + version: 1.3.5(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-switch': + specifier: ^1.2.5 + version: 1.2.5(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-tabs': + specifier: ^1.1.12 + version: 1.1.12(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-tooltip': + specifier: ^1.2.7 + version: 1.2.7(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-visually-hidden': + specifier: ^1.2.1 + version: 1.2.3(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@tailwindcss/forms': + specifier: ^0.5.10 + version: 0.5.10(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@20.19.10)(typescript@5.9.2))) + '@tailwindcss/typography': + specifier: ^0.5.16 + version: 0.5.16(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@20.19.10)(typescript@5.9.2))) + '@zag-js/number-input': + specifier: ^1.13.1 + version: 1.21.1 + '@zag-js/react': + specifier: ^1.13.1 + version: 1.21.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + class-variance-authority: + specifier: ^0.7.1 + version: 0.7.1 + clsx: + specifier: ^2.1.1 + version: 2.1.1 + cmdk: + specifier: ^1.1.1 + version: 1.1.1(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + fast-deep-equal: + specifier: ^3.0.0 + version: 3.1.3 + framer-motion: + specifier: ^12.1.4 + version: 12.23.12(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + lucide-react: + specifier: ^0.511.0 + version: 0.511.0(react@19.1.1) + motion: + specifier: ^12.23.9 + version: 12.23.12(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + next: + specifier: 15.3.2 + version: 15.3.2(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + next-themes: + specifier: ^0.4.6 + version: 0.4.6(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + react: + specifier: ^19.0.0 + version: 19.1.1 + react-dom: + specifier: ^19.0.0 + version: 19.1.1(react@19.1.1) + react-icons: + specifier: ^5.5.0 + version: 5.5.0(react@19.1.1) + react-markdown: + specifier: ^10.1.0 + version: 10.1.0(@types/react@19.1.9)(react@19.1.1) + sonner: + specifier: 2.0.5 + version: 2.0.5(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + tailwind-merge: + specifier: ~2.6.0 + version: 2.6.0 + tailwind-scrollbar-hide: + specifier: ~1.1.7 + version: 1.1.7 + tailwindcss-animate: + specifier: ~1.0.7 + version: 1.0.7(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@20.19.10)(typescript@5.9.2))) + devDependencies: + '@eslint/eslintrc': + specifier: ^3 + version: 3.3.1 + '@tailwindcss/postcss': + specifier: ^4 + version: 4.1.11 + '@types/node': + specifier: ^20 + version: 20.19.10 + '@types/react': + specifier: ^19 + version: 19.1.9 + '@types/react-dom': + specifier: ^19 + version: 19.1.7(@types/react@19.1.9) + autoprefixer: + specifier: ^10.4.21 + version: 10.4.21(postcss@8.5.6) + eslint: + specifier: ^9 + version: 9.32.0(jiti@2.5.1) + eslint-config-next: + specifier: 15.3.2 + version: 15.3.2(eslint@9.32.0(jiti@2.5.1))(typescript@5.9.2) + postcss: + specifier: ^8.5.3 + version: 8.5.6 + postcss-import: + specifier: ^16.1.0 + version: 16.1.0(postcss@8.5.6) + postcss-nesting: + specifier: ^13.0.1 + version: 13.0.2(postcss@8.5.6) + tailwindcss: + specifier: ^3.4.17 + version: 3.4.17(ts-node@10.9.2(@types/node@20.19.10)(typescript@5.9.2)) + typescript: + specifier: ^5 + version: 5.9.2 + + packages/server: + dependencies: + '@aiostreams/core': + specifier: workspace:* + version: link:../core + express: + specifier: ^5.1.0 + version: 5.1.0 + express-rate-limit: + specifier: ^8.0.1 + version: 8.0.1(express@5.1.0) + rate-limit-redis: + specifier: ^4.2.2 + version: 4.2.2(express-rate-limit@8.0.1(express@5.1.0)) + zod: + specifier: ^4.1.5 + version: 4.1.5 + devDependencies: + '@types/express': + specifier: ^5.0.1 + version: 5.0.3 + '@types/express-rate-limit': + specifier: ^5.1.3 + version: 5.1.3 + '@types/node': + specifier: ^20.14.10 + version: 20.19.10 + +packages: + + '@alloc/quick-lru@5.2.0': + resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} + engines: {node: '>=10'} + + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + + '@bufbuild/protobuf@2.7.0': + resolution: {integrity: sha512-qn6tAIZEw5i/wiESBF4nQxZkl86aY4KoO0IkUa2Lh+rya64oTOdJQFlZuMwI1Qz9VBJQrQC4QlSA2DNek5gCOA==} + + '@colors/colors@1.6.0': + resolution: {integrity: sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==} + engines: {node: '>=0.1.90'} + + '@cspotcode/source-map-support@0.8.1': + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} + + '@csstools/selector-resolve-nested@3.1.0': + resolution: {integrity: sha512-mf1LEW0tJLKfWyvn5KdDrhpxHyuxpbNwTIwOYLIvsTffeyOf85j5oIzfG0yosxDgx/sswlqBnESYUcQH0vgZ0g==} + engines: {node: '>=18'} + peerDependencies: + postcss-selector-parser: ^7.0.0 + + '@csstools/selector-specificity@5.0.0': + resolution: {integrity: sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==} + engines: {node: '>=18'} + peerDependencies: + postcss-selector-parser: ^7.0.0 + + '@dabh/diagnostics@2.0.3': + resolution: {integrity: sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==} + + '@dnd-kit/accessibility@3.1.1': + resolution: {integrity: sha512-2P+YgaXF+gRsIihwwY1gCsQSYnu9Zyj2py8kY5fFvUM1qm2WA2u639R6YNVfU4GWr+ZM5mqEsfHZZLoRONbemw==} + peerDependencies: + react: '>=16.8.0' + + '@dnd-kit/core@6.3.1': + resolution: {integrity: sha512-xkGBRQQab4RLwgXxoqETICr6S5JlogafbhNsidmrkVv2YRs5MLwpjoF2qpiGjQt8S9AoxtIV603s0GIUpY5eYQ==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@dnd-kit/modifiers@9.0.0': + resolution: {integrity: sha512-ybiLc66qRGuZoC20wdSSG6pDXFikui/dCNGthxv4Ndy8ylErY0N3KVxY2bgo7AWwIbxDmXDg3ylAFmnrjcbVvw==} + peerDependencies: + '@dnd-kit/core': ^6.3.0 + react: '>=16.8.0' + + '@dnd-kit/sortable@10.0.0': + resolution: {integrity: sha512-+xqhmIIzvAYMGfBYYnbKuNicfSsk4RksY2XdmJhT+HAC01nix6fHCztU68jooFiMUB01Ky3F0FyOvhG/BZrWkg==} + peerDependencies: + '@dnd-kit/core': ^6.3.0 + react: '>=16.8.0' + + '@dnd-kit/utilities@3.2.2': + resolution: {integrity: sha512-+MKAJEOfaBe5SmV6t34p80MMKhjvUz0vRrvVJbPT0WElzaOJ/1xs+D+KDv+tD/NE5ujfrChEcshd4fLn0wpiqg==} + peerDependencies: + react: '>=16.8.0' + + '@emnapi/core@1.5.0': + resolution: {integrity: sha512-sbP8GzB1WDzacS8fgNPpHlp6C9VZe+SJP3F90W9rLemaQj2PzIuTEl1qDOYQf58YIpyjViI24y9aPWCjEzY2cg==} + + '@emnapi/runtime@1.5.0': + resolution: {integrity: sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==} + + '@emnapi/wasi-threads@1.1.0': + resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} + + '@esbuild/aix-ppc64@0.21.5': + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + + '@esbuild/aix-ppc64@0.25.8': + resolution: {integrity: sha512-urAvrUedIqEiFR3FYSLTWQgLu5tb+m0qZw0NBEasUeo6wuqatkMDaRT+1uABiGXEu5vqgPd7FGE1BhsAIy9QVA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.21.5': + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm64@0.25.8': + resolution: {integrity: sha512-OD3p7LYzWpLhZEyATcTSJ67qB5D+20vbtr6vHlHWSQYhKtzUYrETuWThmzFpZtFsBIxRvhO07+UgVA9m0i/O1w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.21.5': + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.25.8': + resolution: {integrity: sha512-RONsAvGCz5oWyePVnLdZY/HHwA++nxYWIX1atInlaW6SEkwq6XkP3+cb825EUcRs5Vss/lGh/2YxAb5xqc07Uw==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.21.5': + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/android-x64@0.25.8': + resolution: {integrity: sha512-yJAVPklM5+4+9dTeKwHOaA+LQkmrKFX96BM0A/2zQrbS6ENCmxc4OVoBs5dPkCCak2roAD+jKCdnmOqKszPkjA==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.21.5': + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-arm64@0.25.8': + resolution: {integrity: sha512-Jw0mxgIaYX6R8ODrdkLLPwBqHTtYHJSmzzd+QeytSugzQ0Vg4c5rDky5VgkoowbZQahCbsv1rT1KW72MPIkevw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.21.5': + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/darwin-x64@0.25.8': + resolution: {integrity: sha512-Vh2gLxxHnuoQ+GjPNvDSDRpoBCUzY4Pu0kBqMBDlK4fuWbKgGtmDIeEC081xi26PPjn+1tct+Bh8FjyLlw1Zlg==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.21.5': + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-arm64@0.25.8': + resolution: {integrity: sha512-YPJ7hDQ9DnNe5vxOm6jaie9QsTwcKedPvizTVlqWG9GBSq+BuyWEDazlGaDTC5NGU4QJd666V0yqCBL2oWKPfA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.21.5': + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.25.8': + resolution: {integrity: sha512-MmaEXxQRdXNFsRN/KcIimLnSJrk2r5H8v+WVafRWz5xdSVmWLoITZQXcgehI2ZE6gioE6HirAEToM/RvFBeuhw==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.21.5': + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm64@0.25.8': + resolution: {integrity: sha512-WIgg00ARWv/uYLU7lsuDK00d/hHSfES5BzdWAdAig1ioV5kaFNrtK8EqGcUBJhYqotlUByUKz5Qo6u8tt7iD/w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.21.5': + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-arm@0.25.8': + resolution: {integrity: sha512-FuzEP9BixzZohl1kLf76KEVOsxtIBFwCaLupVuk4eFVnOZfU+Wsn+x5Ryam7nILV2pkq2TqQM9EZPsOBuMC+kg==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.21.5': + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-ia32@0.25.8': + resolution: {integrity: sha512-A1D9YzRX1i+1AJZuFFUMP1E9fMaYY+GnSQil9Tlw05utlE86EKTUA7RjwHDkEitmLYiFsRd9HwKBPEftNdBfjg==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.21.5': + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-loong64@0.25.8': + resolution: {integrity: sha512-O7k1J/dwHkY1RMVvglFHl1HzutGEFFZ3kNiDMSOyUrB7WcoHGf96Sh+64nTRT26l3GMbCW01Ekh/ThKM5iI7hQ==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.21.5': + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-mips64el@0.25.8': + resolution: {integrity: sha512-uv+dqfRazte3BzfMp8PAQXmdGHQt2oC/y2ovwpTteqrMx2lwaksiFZ/bdkXJC19ttTvNXBuWH53zy/aTj1FgGw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.21.5': + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-ppc64@0.25.8': + resolution: {integrity: sha512-GyG0KcMi1GBavP5JgAkkstMGyMholMDybAf8wF5A70CALlDM2p/f7YFE7H92eDeH/VBtFJA5MT4nRPDGg4JuzQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.21.5': + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-riscv64@0.25.8': + resolution: {integrity: sha512-rAqDYFv3yzMrq7GIcen3XP7TUEG/4LK86LUPMIz6RT8A6pRIDn0sDcvjudVZBiiTcZCY9y2SgYX2lgK3AF+1eg==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.21.5': + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-s390x@0.25.8': + resolution: {integrity: sha512-Xutvh6VjlbcHpsIIbwY8GVRbwoviWT19tFhgdA7DlenLGC/mbc3lBoVb7jxj9Z+eyGqvcnSyIltYUrkKzWqSvg==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.21.5': + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/linux-x64@0.25.8': + resolution: {integrity: sha512-ASFQhgY4ElXh3nDcOMTkQero4b1lgubskNlhIfJrsH5OKZXDpUAKBlNS0Kx81jwOBp+HCeZqmoJuihTv57/jvQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.25.8': + resolution: {integrity: sha512-d1KfruIeohqAi6SA+gENMuObDbEjn22olAR7egqnkCD9DGBG0wsEARotkLgXDu6c4ncgWTZJtN5vcgxzWRMzcw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.21.5': + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.25.8': + resolution: {integrity: sha512-nVDCkrvx2ua+XQNyfrujIG38+YGyuy2Ru9kKVNyh5jAys6n+l44tTtToqHjino2My8VAY6Lw9H7RI73XFi66Cg==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.25.8': + resolution: {integrity: sha512-j8HgrDuSJFAujkivSMSfPQSAa5Fxbvk4rgNAS5i3K+r8s1X0p1uOO2Hl2xNsGFppOeHOLAVgYwDVlmxhq5h+SQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.21.5': + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.25.8': + resolution: {integrity: sha512-1h8MUAwa0VhNCDp6Af0HToI2TJFAn1uqT9Al6DJVzdIBAd21m/G0Yfc77KDM3uF3T/YaOgQq3qTJHPbTOInaIQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.25.8': + resolution: {integrity: sha512-r2nVa5SIK9tSWd0kJd9HCffnDHKchTGikb//9c7HX+r+wHYCpQrSgxhlY6KWV1nFo1l4KFbsMlHk+L6fekLsUg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.21.5': + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.25.8': + resolution: {integrity: sha512-zUlaP2S12YhQ2UzUfcCuMDHQFJyKABkAjvO5YSndMiIkMimPmxA+BYSBikWgsRpvyxuRnow4nS5NPnf9fpv41w==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.21.5': + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-arm64@0.25.8': + resolution: {integrity: sha512-YEGFFWESlPva8hGL+zvj2z/SaK+pH0SwOM0Nc/d+rVnW7GSTFlLBGzZkuSU9kFIGIo8q9X3ucpZhu8PDN5A2sQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.21.5': + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.25.8': + resolution: {integrity: sha512-hiGgGC6KZ5LZz58OL/+qVVoZiuZlUYlYHNAmczOm7bs2oE1XriPFi5ZHHrS8ACpV5EjySrnoCKmcbQMN+ojnHg==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.21.5': + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.25.8': + resolution: {integrity: sha512-cn3Yr7+OaaZq1c+2pe+8yxC8E144SReCQjN6/2ynubzYjvyqZjTXfQJpAcQpsdJq3My7XADANiYGHoFC69pLQw==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@eslint-community/eslint-utils@4.7.0': + resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.12.1': + resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/config-array@0.21.0': + resolution: {integrity: sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/config-helpers@0.3.1': + resolution: {integrity: sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/core@0.15.2': + resolution: {integrity: sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/eslintrc@3.3.1': + resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/js@9.32.0': + resolution: {integrity: sha512-BBpRFZK3eX6uMLKz8WxFOBIFFcGFJ/g8XuwjTHCqHROSIsopI+ddn/d5Cfh36+7+e5edVS8dbSHnBNhrLEX0zg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/object-schema@2.1.6': + resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/plugin-kit@0.3.5': + resolution: {integrity: sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@floating-ui/core@1.7.3': + resolution: {integrity: sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==} + + '@floating-ui/dom@1.7.3': + resolution: {integrity: sha512-uZA413QEpNuhtb3/iIKoYMSK07keHPYeXF02Zhd6e213j+d1NamLix/mCLxBUDW/Gx52sPH2m+chlUsyaBs/Ag==} + + '@floating-ui/react-dom@2.1.5': + resolution: {integrity: sha512-HDO/1/1oH9fjj4eLgegrlH3dklZpHtUYYFiVwMUwfGvk9jWDRWqkklA2/NFScknrcNSspbV868WjXORvreDX+Q==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@floating-ui/react@0.26.28': + resolution: {integrity: sha512-yORQuuAtVpiRjpMhdc0wJj06b9JFjrYF4qp96j++v2NBpbi6SEGF7donUJ3TMieerQ6qVkAv1tgr7L4r5roTqw==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@floating-ui/utils@0.2.10': + resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==} + + '@gar/promisify@1.1.3': + resolution: {integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==} + + '@grpc/grpc-js@1.13.4': + resolution: {integrity: sha512-GsFaMXCkMqkKIvwCQjCrwH+GHbPKBjhwo/8ZuUkWHqbI73Kky9I+pQltrlT0+MWpedCoosda53lgjYfyEPgxBg==} + engines: {node: '>=12.10.0'} + + '@grpc/proto-loader@0.7.15': + resolution: {integrity: sha512-tMXdRCfYVixjuFK+Hk0Q1s38gV9zDiDJfWL3h1rv4Qc39oILCu1TRTDt7+fGUI8K4G1Fj125Hx/ru3azECWTyQ==} + engines: {node: '>=6'} + hasBin: true + + '@headlessui/react@2.2.7': + resolution: {integrity: sha512-WKdTymY8Y49H8/gUc/lIyYK1M+/6dq0Iywh4zTZVAaiTDprRfioxSgD0wnXTQTBpjpGJuTL1NO/mqEvc//5SSg==} + engines: {node: '>=10'} + peerDependencies: + react: ^18 || ^19 || ^19.0.0-rc + react-dom: ^18 || ^19 || ^19.0.0-rc + + '@headlessui/tailwindcss@0.2.2': + resolution: {integrity: sha512-xNe42KjdyA4kfUKLLPGzME9zkH7Q3rOZ5huFihWNWOQFxnItxPB3/67yBI8/qBfY8nwBRx5GHn4VprsoluVMGw==} + engines: {node: '>=10'} + peerDependencies: + tailwindcss: ^3.0 || ^4.0 + + '@humanfs/core@0.19.1': + resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.6': + resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} + engines: {node: '>=18.18.0'} + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/retry@0.3.1': + resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} + engines: {node: '>=18.18'} + + '@humanwhocodes/retry@0.4.3': + resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} + engines: {node: '>=18.18'} + + '@img/sharp-darwin-arm64@0.34.3': + resolution: {integrity: sha512-ryFMfvxxpQRsgZJqBd4wsttYQbCxsJksrv9Lw/v798JcQ8+w84mBWuXwl+TT0WJ/WrYOLaYpwQXi3sA9nTIaIg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [darwin] + + '@img/sharp-darwin-x64@0.34.3': + resolution: {integrity: sha512-yHpJYynROAj12TA6qil58hmPmAwxKKC7reUqtGLzsOHfP7/rniNGTL8tjWX6L3CTV4+5P4ypcS7Pp+7OB+8ihA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-darwin-arm64@1.2.0': + resolution: {integrity: sha512-sBZmpwmxqwlqG9ueWFXtockhsxefaV6O84BMOrhtg/YqbTaRdqDE7hxraVE3y6gVM4eExmfzW4a8el9ArLeEiQ==} + cpu: [arm64] + os: [darwin] + + '@img/sharp-libvips-darwin-x64@1.2.0': + resolution: {integrity: sha512-M64XVuL94OgiNHa5/m2YvEQI5q2cl9d/wk0qFTDVXcYzi43lxuiFTftMR1tOnFQovVXNZJ5TURSDK2pNe9Yzqg==} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-linux-arm64@1.2.0': + resolution: {integrity: sha512-RXwd0CgG+uPRX5YYrkzKyalt2OJYRiJQ8ED/fi1tq9WQW2jsQIn0tqrlR5l5dr/rjqq6AHAxURhj2DVjyQWSOA==} + cpu: [arm64] + os: [linux] + + '@img/sharp-libvips-linux-arm@1.2.0': + resolution: {integrity: sha512-mWd2uWvDtL/nvIzThLq3fr2nnGfyr/XMXlq8ZJ9WMR6PXijHlC3ksp0IpuhK6bougvQrchUAfzRLnbsen0Cqvw==} + cpu: [arm] + os: [linux] + + '@img/sharp-libvips-linux-ppc64@1.2.0': + resolution: {integrity: sha512-Xod/7KaDDHkYu2phxxfeEPXfVXFKx70EAFZ0qyUdOjCcxbjqyJOEUpDe6RIyaunGxT34Anf9ue/wuWOqBW2WcQ==} + cpu: [ppc64] + os: [linux] + + '@img/sharp-libvips-linux-s390x@1.2.0': + resolution: {integrity: sha512-eMKfzDxLGT8mnmPJTNMcjfO33fLiTDsrMlUVcp6b96ETbnJmd4uvZxVJSKPQfS+odwfVaGifhsB07J1LynFehw==} + cpu: [s390x] + os: [linux] + + '@img/sharp-libvips-linux-x64@1.2.0': + resolution: {integrity: sha512-ZW3FPWIc7K1sH9E3nxIGB3y3dZkpJlMnkk7z5tu1nSkBoCgw2nSRTFHI5pB/3CQaJM0pdzMF3paf9ckKMSE9Tg==} + cpu: [x64] + os: [linux] + + '@img/sharp-libvips-linuxmusl-arm64@1.2.0': + resolution: {integrity: sha512-UG+LqQJbf5VJ8NWJ5Z3tdIe/HXjuIdo4JeVNADXBFuG7z9zjoegpzzGIyV5zQKi4zaJjnAd2+g2nna8TZvuW9Q==} + cpu: [arm64] + os: [linux] + + '@img/sharp-libvips-linuxmusl-x64@1.2.0': + resolution: {integrity: sha512-SRYOLR7CXPgNze8akZwjoGBoN1ThNZoqpOgfnOxmWsklTGVfJiGJoC/Lod7aNMGA1jSsKWM1+HRX43OP6p9+6Q==} + cpu: [x64] + os: [linux] + + '@img/sharp-linux-arm64@0.34.3': + resolution: {integrity: sha512-QdrKe3EvQrqwkDrtuTIjI0bu6YEJHTgEeqdzI3uWJOH6G1O8Nl1iEeVYRGdj1h5I21CqxSvQp1Yv7xeU3ZewbA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + + '@img/sharp-linux-arm@0.34.3': + resolution: {integrity: sha512-oBK9l+h6KBN0i3dC8rYntLiVfW8D8wH+NPNT3O/WBHeW0OQWCjfWksLUaPidsrDKpJgXp3G3/hkmhptAW0I3+A==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm] + os: [linux] + + '@img/sharp-linux-ppc64@0.34.3': + resolution: {integrity: sha512-GLtbLQMCNC5nxuImPR2+RgrviwKwVql28FWZIW1zWruy6zLgA5/x2ZXk3mxj58X/tszVF69KK0Is83V8YgWhLA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ppc64] + os: [linux] + + '@img/sharp-linux-s390x@0.34.3': + resolution: {integrity: sha512-3gahT+A6c4cdc2edhsLHmIOXMb17ltffJlxR0aC2VPZfwKoTGZec6u5GrFgdR7ciJSsHT27BD3TIuGcuRT0KmQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [s390x] + os: [linux] + + '@img/sharp-linux-x64@0.34.3': + resolution: {integrity: sha512-8kYso8d806ypnSq3/Ly0QEw90V5ZoHh10yH0HnrzOCr6DKAPI6QVHvwleqMkVQ0m+fc7EH8ah0BB0QPuWY6zJQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + + '@img/sharp-linuxmusl-arm64@0.34.3': + resolution: {integrity: sha512-vAjbHDlr4izEiXM1OTggpCcPg9tn4YriK5vAjowJsHwdBIdx0fYRsURkxLG2RLm9gyBq66gwtWI8Gx0/ov+JKQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + + '@img/sharp-linuxmusl-x64@0.34.3': + resolution: {integrity: sha512-gCWUn9547K5bwvOn9l5XGAEjVTTRji4aPTqLzGXHvIr6bIDZKNTA34seMPgM0WmSf+RYBH411VavCejp3PkOeQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + + '@img/sharp-wasm32@0.34.3': + resolution: {integrity: sha512-+CyRcpagHMGteySaWos8IbnXcHgfDn7pO2fiC2slJxvNq9gDipYBN42/RagzctVRKgxATmfqOSulgZv5e1RdMg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [wasm32] + + '@img/sharp-win32-arm64@0.34.3': + resolution: {integrity: sha512-MjnHPnbqMXNC2UgeLJtX4XqoVHHlZNd+nPt1kRPmj63wURegwBhZlApELdtxM2OIZDRv/DFtLcNhVbd1z8GYXQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [win32] + + '@img/sharp-win32-ia32@0.34.3': + resolution: {integrity: sha512-xuCdhH44WxuXgOM714hn4amodJMZl3OEvf0GVTm0BEyMeA2to+8HEdRPShH0SLYptJY1uBw+SCFP9WVQi1Q/cw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ia32] + os: [win32] + + '@img/sharp-win32-x64@0.34.3': + resolution: {integrity: sha512-OWwz05d++TxzLEv4VnsTz5CmZ6mI6S05sfQGEMrNrQcOEERbX46332IvE7pO/EUiw7jUrrS40z/M7kPyjfl04g==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [win32] + + '@internationalized/number@3.6.3': + resolution: {integrity: sha512-p+Zh1sb6EfrfVaS86jlHGQ9HA66fJhV9x5LiE5vCbZtXEHAuhcmUZUdZ4WrFpUBfNalr2OkAJI5AcKEQF+Lebw==} + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@isaacs/fs-minipass@4.0.1': + resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} + engines: {node: '>=18.0.0'} + + '@jridgewell/gen-mapping@0.3.12': + resolution: {integrity: sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.4': + resolution: {integrity: sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==} + + '@jridgewell/trace-mapping@0.3.29': + resolution: {integrity: sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==} + + '@jridgewell/trace-mapping@0.3.9': + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + + '@js-sdsl/ordered-map@4.4.2': + resolution: {integrity: sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==} + + '@napi-rs/wasm-runtime@0.2.12': + resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==} + + '@next/env@15.3.2': + resolution: {integrity: sha512-xURk++7P7qR9JG1jJtLzPzf0qEvqCN0A/T3DXf8IPMKo9/6FfjxtEffRJIIew/bIL4T3C2jLLqBor8B/zVlx6g==} + + '@next/eslint-plugin-next@15.3.2': + resolution: {integrity: sha512-ijVRTXBgnHT33aWnDtmlG+LJD+5vhc9AKTJPquGG5NKXjpKNjc62woIhFtrAcWdBobt8kqjCoaJ0q6sDQoX7aQ==} + + '@next/swc-darwin-arm64@15.3.2': + resolution: {integrity: sha512-2DR6kY/OGcokbnCsjHpNeQblqCZ85/1j6njYSkzRdpLn5At7OkSdmk7WyAmB9G0k25+VgqVZ/u356OSoQZ3z0g==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@next/swc-darwin-x64@15.3.2': + resolution: {integrity: sha512-ro/fdqaZWL6k1S/5CLv1I0DaZfDVJkWNaUU3un8Lg6m0YENWlDulmIWzV96Iou2wEYyEsZq51mwV8+XQXqMp3w==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@next/swc-linux-arm64-gnu@15.3.2': + resolution: {integrity: sha512-covwwtZYhlbRWK2HlYX9835qXum4xYZ3E2Mra1mdQ+0ICGoMiw1+nVAn4d9Bo7R3JqSmK1grMq/va+0cdh7bJA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@next/swc-linux-arm64-musl@15.3.2': + resolution: {integrity: sha512-KQkMEillvlW5Qk5mtGA/3Yz0/tzpNlSw6/3/ttsV1lNtMuOHcGii3zVeXZyi4EJmmLDKYcTcByV2wVsOhDt/zg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@next/swc-linux-x64-gnu@15.3.2': + resolution: {integrity: sha512-uRBo6THWei0chz+Y5j37qzx+BtoDRFIkDzZjlpCItBRXyMPIg079eIkOCl3aqr2tkxL4HFyJ4GHDes7W8HuAUg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@next/swc-linux-x64-musl@15.3.2': + resolution: {integrity: sha512-+uxFlPuCNx/T9PdMClOqeE8USKzj8tVz37KflT3Kdbx/LOlZBRI2yxuIcmx1mPNK8DwSOMNCr4ureSet7eyC0w==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@next/swc-win32-arm64-msvc@15.3.2': + resolution: {integrity: sha512-LLTKmaI5cfD8dVzh5Vt7+OMo+AIOClEdIU/TSKbXXT2iScUTSxOGoBhfuv+FU8R9MLmrkIL1e2fBMkEEjYAtPQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@next/swc-win32-x64-msvc@15.3.2': + resolution: {integrity: sha512-aW5B8wOPioJ4mBdMDXkt5f3j8pUr9W8AnlX0Df35uRWNT1Y6RIybxjnSUe+PhM+M1bwgyY8PHLmXZC6zT1o5tA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@nolyfill/is-core-module@1.0.39': + resolution: {integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==} + engines: {node: '>=12.4.0'} + + '@npmcli/fs@1.1.1': + resolution: {integrity: sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==} + + '@npmcli/move-file@1.1.2': + resolution: {integrity: sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==} + engines: {node: '>=10'} + deprecated: This functionality has been moved to @npmcli/fs + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@protobufjs/aspromise@1.1.2': + resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} + + '@protobufjs/base64@1.1.2': + resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} + + '@protobufjs/codegen@2.0.4': + resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} + + '@protobufjs/eventemitter@1.1.0': + resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} + + '@protobufjs/fetch@1.1.0': + resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} + + '@protobufjs/float@1.0.2': + resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} + + '@protobufjs/inquire@1.1.0': + resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} + + '@protobufjs/path@1.1.2': + resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} + + '@protobufjs/pool@1.1.0': + resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} + + '@protobufjs/utf8@1.1.0': + resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} + + '@radix-ui/number@1.1.1': + resolution: {integrity: sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==} + + '@radix-ui/primitive@1.1.2': + resolution: {integrity: sha512-XnbHrrprsNqZKQhStrSwgRUQzoCI1glLzdw79xiZPoofhGICeZRSQ3dIxAKH1gb3OHfNf4d6f+vAv3kil2eggA==} + + '@radix-ui/react-accordion@1.2.11': + resolution: {integrity: sha512-l3W5D54emV2ues7jjeG1xcyN7S3jnK3zE2zHqgn0CmMsy9lNJwmgcrmaxS+7ipw15FAivzKNzH3d5EcGoFKw0A==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-arrow@1.1.7': + resolution: {integrity: sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-collapsible@1.1.11': + resolution: {integrity: sha512-2qrRsVGSCYasSz1RFOorXwl0H7g7J1frQtgpQgYrt+MOidtPAINHn9CPovQXb83r8ahapdx3Tu0fa/pdFFSdPg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-collection@1.1.7': + resolution: {integrity: sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-compose-refs@1.1.2': + resolution: {integrity: sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-context@1.1.2': + resolution: {integrity: sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-dialog@1.1.14': + resolution: {integrity: sha512-+CpweKjqpzTmwRwcYECQcNYbI8V9VSQt0SNFKeEBLgfucbsLssU6Ppq7wUdNXEGb573bMjFhVjKVll8rmV6zMw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-direction@1.1.1': + resolution: {integrity: sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-dismissable-layer@1.1.10': + resolution: {integrity: sha512-IM1zzRV4W3HtVgftdQiiOmA0AdJlCtMLe00FXaHwgt3rAnNsIyDqshvkIW3hj/iu5hu8ERP7KIYki6NkqDxAwQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-dropdown-menu@2.1.15': + resolution: {integrity: sha512-mIBnOjgwo9AH3FyKaSWoSu/dYj6VdhJ7frEPiGTeXCdUFHjl9h3mFh2wwhEtINOmYXWhdpf1rY2minFsmaNgVQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-focus-guards@1.1.2': + resolution: {integrity: sha512-fyjAACV62oPV925xFCrH8DR5xWhg9KYtJT4s3u54jxp+L/hbpTY2kIeEFFbFe+a/HCE94zGQMZLIpVTPVZDhaA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-focus-scope@1.1.7': + resolution: {integrity: sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-id@1.1.1': + resolution: {integrity: sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-menu@2.1.15': + resolution: {integrity: sha512-tVlmA3Vb9n8SZSd+YSbuFR66l87Wiy4du+YE+0hzKQEANA+7cWKH1WgqcEX4pXqxUFQKrWQGHdvEfw00TjFiew==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-password-toggle-field@0.1.2': + resolution: {integrity: sha512-F90uYnlBsLPU1UbSLciLsWQmk8+hdWa6SFw4GXaIdNWxFxI5ITKVdAG64f+Twaa9ic6xE7pqxPyUmodrGjT4pQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-popover@1.1.14': + resolution: {integrity: sha512-ODz16+1iIbGUfFEfKx2HTPKizg2MN39uIOV8MXeHnmdd3i/N9Wt7vU46wbHsqA0xoaQyXVcs0KIlBdOA2Y95bw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-popper@1.2.7': + resolution: {integrity: sha512-IUFAccz1JyKcf/RjB552PlWwxjeCJB8/4KxT7EhBHOJM+mN7LdW+B3kacJXILm32xawcMMjb2i0cIZpo+f9kiQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-portal@1.1.9': + resolution: {integrity: sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-presence@1.1.4': + resolution: {integrity: sha512-ueDqRbdc4/bkaQT3GIpLQssRlFgWaL/U2z/S31qRwwLWoxHLgry3SIfCwhxeQNbirEUXFa+lq3RL3oBYXtcmIA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-primitive@2.1.3': + resolution: {integrity: sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-roving-focus@1.1.10': + resolution: {integrity: sha512-dT9aOXUen9JSsxnMPv/0VqySQf5eDQ6LCk5Sw28kamz8wSOW2bJdlX2Bg5VUIIcV+6XlHpWTIuTPCf/UNIyq8Q==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-select@2.2.5': + resolution: {integrity: sha512-HnMTdXEVuuyzx63ME0ut4+sEMYW6oouHWNGUZc7ddvUWIcfCva/AMoqEW/3wnEllriMWBa0RHspCYnfCWJQYmA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-separator@1.1.7': + resolution: {integrity: sha512-0HEb8R9E8A+jZjvmFCy/J4xhbXy3TV+9XSnGJ3KvTtjlIUy/YQ/p6UYZvi7YbeoeXdyU9+Y3scizK6hkY37baA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-slider@1.3.5': + resolution: {integrity: sha512-rkfe2pU2NBAYfGaxa3Mqosi7VZEWX5CxKaanRv0vZd4Zhl9fvQrg0VM93dv3xGLGfrHuoTRF3JXH8nb9g+B3fw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-slot@1.2.3': + resolution: {integrity: sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-switch@1.2.5': + resolution: {integrity: sha512-5ijLkak6ZMylXsaImpZ8u4Rlf5grRmoc0p0QeX9VJtlrM4f5m3nCTX8tWga/zOA8PZYIR/t0p2Mnvd7InrJ6yQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-tabs@1.1.12': + resolution: {integrity: sha512-GTVAlRVrQrSw3cEARM0nAx73ixrWDPNZAruETn3oHCNP6SbZ/hNxdxp+u7VkIEv3/sFoLq1PfcHrl7Pnp0CDpw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-tooltip@1.2.7': + resolution: {integrity: sha512-Ap+fNYwKTYJ9pzqW+Xe2HtMRbQ/EeWkj2qykZ6SuEV4iS/o1bZI5ssJbk4D2r8XuDuOBVz/tIx2JObtuqU+5Zw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-use-callback-ref@1.1.1': + resolution: {integrity: sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-controllable-state@1.2.2': + resolution: {integrity: sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-effect-event@0.0.2': + resolution: {integrity: sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-escape-keydown@1.1.1': + resolution: {integrity: sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-is-hydrated@0.1.0': + resolution: {integrity: sha512-U+UORVEq+cTnRIaostJv9AGdV3G6Y+zbVd+12e18jQ5A3c0xL03IhnHuiU4UV69wolOQp5GfR58NW/EgdQhwOA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-layout-effect@1.1.1': + resolution: {integrity: sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-previous@1.1.1': + resolution: {integrity: sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-rect@1.1.1': + resolution: {integrity: sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-size@1.1.1': + resolution: {integrity: sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-visually-hidden@1.2.3': + resolution: {integrity: sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/rect@1.1.1': + resolution: {integrity: sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==} + + '@react-aria/focus@3.21.0': + resolution: {integrity: sha512-7NEGtTPsBy52EZ/ToVKCu0HSelE3kq9qeis+2eEq90XSuJOMaDHUQrA7RC2Y89tlEwQB31bud/kKRi9Qme1dkA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + + '@react-aria/interactions@3.25.4': + resolution: {integrity: sha512-HBQMxgUPHrW8V63u9uGgBymkMfj6vdWbB0GgUJY49K9mBKMsypcHeWkWM6+bF7kxRO728/IK8bWDV6whDbqjHg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + + '@react-aria/ssr@3.9.10': + resolution: {integrity: sha512-hvTm77Pf+pMBhuBm760Li0BVIO38jv1IBws1xFm1NoL26PU+fe+FMW5+VZWyANR6nYL65joaJKZqOdTQMkO9IQ==} + engines: {node: '>= 12'} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + + '@react-aria/utils@3.30.0': + resolution: {integrity: sha512-ydA6y5G1+gbem3Va2nczj/0G0W7/jUVo/cbN10WA5IizzWIwMP5qhFr7macgbKfHMkZ+YZC3oXnt2NNre5odKw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + + '@react-stately/flags@3.1.2': + resolution: {integrity: sha512-2HjFcZx1MyQXoPqcBGALwWWmgFVUk2TuKVIQxCbRq7fPyWXIl6VHcakCLurdtYC2Iks7zizvz0Idv48MQ38DWg==} + + '@react-stately/utils@3.10.8': + resolution: {integrity: sha512-SN3/h7SzRsusVQjQ4v10LaVsDc81jyyR0DD5HnsQitm/I5WDpaSr2nRHtyloPFU48jlql1XX/S04T2DLQM7Y3g==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + + '@react-types/shared@3.31.0': + resolution: {integrity: sha512-ua5U6V66gDcbLZe4P2QeyNgPp4YWD1ymGA6j3n+s8CGExtrCPe64v+g4mvpT8Bnb985R96e4zFT61+m0YCwqMg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + + '@redis/bloom@5.8.2': + resolution: {integrity: sha512-855DR0ChetZLarblio5eM0yLwxA9Dqq50t8StXKp5bAtLT0G+rZ+eRzzqxl37sPqQKjUudSYypz55o6nNhbz0A==} + engines: {node: '>= 18'} + peerDependencies: + '@redis/client': ^5.8.2 + + '@redis/client@5.8.2': + resolution: {integrity: sha512-WtMScno3+eBpTac1Uav2zugXEoXqaU23YznwvFgkPwBQVwEHTDgOG7uEAObtZ/Nyn8SmAMbqkEubJaMOvnqdsQ==} + engines: {node: '>= 18'} + + '@redis/json@5.8.2': + resolution: {integrity: sha512-uxpVfas3I0LccBX9rIfDgJ0dBrUa3+0Gc8sEwmQQH0vHi7C1Rx1Qn8Nv1QWz5bohoeIXMICFZRcyDONvum2l/w==} + engines: {node: '>= 18'} + peerDependencies: + '@redis/client': ^5.8.2 + + '@redis/search@5.8.2': + resolution: {integrity: sha512-cNv7HlgayavCBXqPXgaS97DRPVWFznuzsAmmuemi2TMCx5scwLiP50TeZvUS06h/MG96YNPe6A0Zt57yayfxwA==} + engines: {node: '>= 18'} + peerDependencies: + '@redis/client': ^5.8.2 + + '@redis/time-series@5.8.2': + resolution: {integrity: sha512-g2NlHM07fK8H4k+613NBsk3y70R2JIM2dPMSkhIjl2Z17SYvaYKdusz85d7VYOrZBWtDrHV/WD2E3vGu+zni8A==} + engines: {node: '>= 18'} + peerDependencies: + '@redis/client': ^5.8.2 + + '@rollup/rollup-android-arm-eabi@4.46.2': + resolution: {integrity: sha512-Zj3Hl6sN34xJtMv7Anwb5Gu01yujyE/cLBDB2gnHTAHaWS1Z38L7kuSG+oAh0giZMqG060f/YBStXtMH6FvPMA==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.46.2': + resolution: {integrity: sha512-nTeCWY83kN64oQ5MGz3CgtPx8NSOhC5lWtsjTs+8JAJNLcP3QbLCtDDgUKQc/Ro/frpMq4SHUaHN6AMltcEoLQ==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.46.2': + resolution: {integrity: sha512-HV7bW2Fb/F5KPdM/9bApunQh68YVDU8sO8BvcW9OngQVN3HHHkw99wFupuUJfGR9pYLLAjcAOA6iO+evsbBaPQ==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.46.2': + resolution: {integrity: sha512-SSj8TlYV5nJixSsm/y3QXfhspSiLYP11zpfwp6G/YDXctf3Xkdnk4woJIF5VQe0of2OjzTt8EsxnJDCdHd2xMA==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.46.2': + resolution: {integrity: sha512-ZyrsG4TIT9xnOlLsSSi9w/X29tCbK1yegE49RYm3tu3wF1L/B6LVMqnEWyDB26d9Ecx9zrmXCiPmIabVuLmNSg==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.46.2': + resolution: {integrity: sha512-pCgHFoOECwVCJ5GFq8+gR8SBKnMO+xe5UEqbemxBpCKYQddRQMgomv1104RnLSg7nNvgKy05sLsY51+OVRyiVw==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.46.2': + resolution: {integrity: sha512-EtP8aquZ0xQg0ETFcxUbU71MZlHaw9MChwrQzatiE8U/bvi5uv/oChExXC4mWhjiqK7azGJBqU0tt5H123SzVA==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.46.2': + resolution: {integrity: sha512-qO7F7U3u1nfxYRPM8HqFtLd+raev2K137dsV08q/LRKRLEc7RsiDWihUnrINdsWQxPR9jqZ8DIIZ1zJJAm5PjQ==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.46.2': + resolution: {integrity: sha512-3dRaqLfcOXYsfvw5xMrxAk9Lb1f395gkoBYzSFcc/scgRFptRXL9DOaDpMiehf9CO8ZDRJW2z45b6fpU5nwjng==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.46.2': + resolution: {integrity: sha512-fhHFTutA7SM+IrR6lIfiHskxmpmPTJUXpWIsBXpeEwNgZzZZSg/q4i6FU4J8qOGyJ0TR+wXBwx/L7Ho9z0+uDg==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loongarch64-gnu@4.46.2': + resolution: {integrity: sha512-i7wfGFXu8x4+FRqPymzjD+Hyav8l95UIZ773j7J7zRYc3Xsxy2wIn4x+llpunexXe6laaO72iEjeeGyUFmjKeA==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-ppc64-gnu@4.46.2': + resolution: {integrity: sha512-B/l0dFcHVUnqcGZWKcWBSV2PF01YUt0Rvlurci5P+neqY/yMKchGU8ullZvIv5e8Y1C6wOn+U03mrDylP5q9Yw==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.46.2': + resolution: {integrity: sha512-32k4ENb5ygtkMwPMucAb8MtV8olkPT03oiTxJbgkJa7lJ7dZMr0GCFJlyvy+K8iq7F/iuOr41ZdUHaOiqyR3iQ==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-riscv64-musl@4.46.2': + resolution: {integrity: sha512-t5B2loThlFEauloaQkZg9gxV05BYeITLvLkWOkRXogP4qHXLkWSbSHKM9S6H1schf/0YGP/qNKtiISlxvfmmZw==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.46.2': + resolution: {integrity: sha512-YKjekwTEKgbB7n17gmODSmJVUIvj8CX7q5442/CK80L8nqOUbMtf8b01QkG3jOqyr1rotrAnW6B/qiHwfcuWQA==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.46.2': + resolution: {integrity: sha512-Jj5a9RUoe5ra+MEyERkDKLwTXVu6s3aACP51nkfnK9wJTraCC8IMe3snOfALkrjTYd2G1ViE1hICj0fZ7ALBPA==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.46.2': + resolution: {integrity: sha512-7kX69DIrBeD7yNp4A5b81izs8BqoZkCIaxQaOpumcJ1S/kmqNFjPhDu1LHeVXv0SexfHQv5cqHsxLOjETuqDuA==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-win32-arm64-msvc@4.46.2': + resolution: {integrity: sha512-wiJWMIpeaak/jsbaq2HMh/rzZxHVW1rU6coyeNNpMwk5isiPjSTx0a4YLSlYDwBH/WBvLz+EtsNqQScZTLJy3g==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.46.2': + resolution: {integrity: sha512-gBgaUDESVzMgWZhcyjfs9QFK16D8K6QZpwAaVNJxYDLHWayOta4ZMjGm/vsAEy3hvlS2GosVFlBlP9/Wb85DqQ==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.46.2': + resolution: {integrity: sha512-CvUo2ixeIQGtF6WvuB87XWqPQkoFAFqW+HUo/WzHwuHDvIwZCtjdWXoYCcr06iKGydiqTclC4jU/TNObC/xKZg==} + cpu: [x64] + os: [win32] + + '@rtsao/scc@1.1.0': + resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} + + '@rushstack/eslint-patch@1.12.0': + resolution: {integrity: sha512-5EwMtOqvJMMa3HbmxLlF74e+3/HhwBTMcvt3nqVJgGCozO6hzIPOBlwm8mGVNR9SN2IJpxSnlxczyDjcn7qIyw==} + + '@swc/counter@0.1.3': + resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} + + '@swc/helpers@0.5.15': + resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} + + '@swc/helpers@0.5.17': + resolution: {integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==} + + '@tailwindcss/forms@0.5.10': + resolution: {integrity: sha512-utI1ONF6uf/pPNO68kmN1b8rEwNXv3czukalo8VtJH8ksIkZXr3Q3VYudZLkCsDd4Wku120uF02hYK25XGPorw==} + peerDependencies: + tailwindcss: '>=3.0.0 || >= 3.0.0-alpha.1 || >= 4.0.0-alpha.20 || >= 4.0.0-beta.1' + + '@tailwindcss/node@4.1.11': + resolution: {integrity: sha512-yzhzuGRmv5QyU9qLNg4GTlYI6STedBWRE7NjxP45CsFYYq9taI0zJXZBMqIC/c8fViNLhmrbpSFS57EoxUmD6Q==} + + '@tailwindcss/oxide-android-arm64@4.1.11': + resolution: {integrity: sha512-3IfFuATVRUMZZprEIx9OGDjG3Ou3jG4xQzNTvjDoKmU9JdmoCohQJ83MYd0GPnQIu89YoJqvMM0G3uqLRFtetg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + + '@tailwindcss/oxide-darwin-arm64@4.1.11': + resolution: {integrity: sha512-ESgStEOEsyg8J5YcMb1xl8WFOXfeBmrhAwGsFxxB2CxY9evy63+AtpbDLAyRkJnxLy2WsD1qF13E97uQyP1lfQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@tailwindcss/oxide-darwin-x64@4.1.11': + resolution: {integrity: sha512-EgnK8kRchgmgzG6jE10UQNaH9Mwi2n+yw1jWmof9Vyg2lpKNX2ioe7CJdf9M5f8V9uaQxInenZkOxnTVL3fhAw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@tailwindcss/oxide-freebsd-x64@4.1.11': + resolution: {integrity: sha512-xdqKtbpHs7pQhIKmqVpxStnY1skuNh4CtbcyOHeX1YBE0hArj2romsFGb6yUmzkq/6M24nkxDqU8GYrKrz+UcA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.11': + resolution: {integrity: sha512-ryHQK2eyDYYMwB5wZL46uoxz2zzDZsFBwfjssgB7pzytAeCCa6glsiJGjhTEddq/4OsIjsLNMAiMlHNYnkEEeg==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-gnu@4.1.11': + resolution: {integrity: sha512-mYwqheq4BXF83j/w75ewkPJmPZIqqP1nhoghS9D57CLjsh3Nfq0m4ftTotRYtGnZd3eCztgbSPJ9QhfC91gDZQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-musl@4.1.11': + resolution: {integrity: sha512-m/NVRFNGlEHJrNVk3O6I9ggVuNjXHIPoD6bqay/pubtYC9QIdAMpS+cswZQPBLvVvEF6GtSNONbDkZrjWZXYNQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@tailwindcss/oxide-linux-x64-gnu@4.1.11': + resolution: {integrity: sha512-YW6sblI7xukSD2TdbbaeQVDysIm/UPJtObHJHKxDEcW2exAtY47j52f8jZXkqE1krdnkhCMGqP3dbniu1Te2Fg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@tailwindcss/oxide-linux-x64-musl@4.1.11': + resolution: {integrity: sha512-e3C/RRhGunWYNC3aSF7exsQkdXzQ/M+aYuZHKnw4U7KQwTJotnWsGOIVih0s2qQzmEzOFIJ3+xt7iq67K/p56Q==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@tailwindcss/oxide-wasm32-wasi@4.1.11': + resolution: {integrity: sha512-Xo1+/GU0JEN/C/dvcammKHzeM6NqKovG+6921MR6oadee5XPBaKOumrJCXvopJ/Qb5TH7LX/UAywbqrP4lax0g==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + bundledDependencies: + - '@napi-rs/wasm-runtime' + - '@emnapi/core' + - '@emnapi/runtime' + - '@tybys/wasm-util' + - '@emnapi/wasi-threads' + - tslib + + '@tailwindcss/oxide-win32-arm64-msvc@4.1.11': + resolution: {integrity: sha512-UgKYx5PwEKrac3GPNPf6HVMNhUIGuUh4wlDFR2jYYdkX6pL/rn73zTq/4pzUm8fOjAn5L8zDeHp9iXmUGOXZ+w==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@tailwindcss/oxide-win32-x64-msvc@4.1.11': + resolution: {integrity: sha512-YfHoggn1j0LK7wR82TOucWc5LDCguHnoS879idHekmmiR7g9HUtMw9MI0NHatS28u/Xlkfi9w5RJWgz2Dl+5Qg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@tailwindcss/oxide@4.1.11': + resolution: {integrity: sha512-Q69XzrtAhuyfHo+5/HMgr1lAiPP/G40OMFAnws7xcFEYqcypZmdW8eGXaOUIeOl1dzPJBPENXgbjsOyhg2nkrg==} + engines: {node: '>= 10'} + + '@tailwindcss/postcss@4.1.11': + resolution: {integrity: sha512-q/EAIIpF6WpLhKEuQSEVMZNMIY8KhWoAemZ9eylNAih9jxMGAYPPWBn3I9QL/2jZ+e7OEz/tZkX5HwbBR4HohA==} + + '@tailwindcss/typography@0.5.16': + resolution: {integrity: sha512-0wDLwCVF5V3x3b1SGXPCDcdsbDHMBe+lkFzBRaHeLvNi+nrrnZ1lA18u+OTWO8iSWU2GxUOCvlXtDuqftc1oiA==} + peerDependencies: + tailwindcss: '>=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1' + + '@tanstack/react-virtual@3.13.12': + resolution: {integrity: sha512-Gd13QdxPSukP8ZrkbgS2RwoZseTTbQPLnQEn7HY/rqtM+8Zt95f7xKC7N0EsKs7aoz0WzZ+fditZux+F8EzYxA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + '@tanstack/virtual-core@3.13.12': + resolution: {integrity: sha512-1YBOJfRHV4sXUmWsFSf5rQor4Ss82G8dQWLRbnk3GA4jeP8hQt1hxXh0tmflpC0dz3VgEv/1+qwPyLeWkQuPFA==} + + '@tootallnate/once@1.1.2': + resolution: {integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==} + engines: {node: '>= 6'} + + '@torbox/torbox-api@https://codeload.github.com/viren070/torbox-sdk-js/tar.gz/dc1d0bc148dd35fa5e5d39f699f070aadeccad5c': + resolution: {tarball: https://codeload.github.com/viren070/torbox-sdk-js/tar.gz/dc1d0bc148dd35fa5e5d39f699f070aadeccad5c} + version: 1.0.9 + + '@tsconfig/node10@1.0.11': + resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} + + '@tsconfig/node12@1.0.11': + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + + '@tsconfig/node14@1.0.3': + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + + '@tsconfig/node16@1.0.4': + resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + + '@tybys/wasm-util@0.10.0': + resolution: {integrity: sha512-VyyPYFlOMNylG45GoAe0xDoLwWuowvf92F9kySqzYh8vmYm7D2u4iUJKa1tOUpS70Ku13ASrOkS4ScXFsTaCNQ==} + + '@types/bcrypt@5.0.2': + resolution: {integrity: sha512-6atioO8Y75fNcbmj0G7UjI9lXN2pQ/IGJ2FWT4a/btd0Lk9lQalHLKhkgKVZ3r+spnmWUKfbMi1GEe9wyHQfNQ==} + + '@types/body-parser@1.19.6': + resolution: {integrity: sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==} + + '@types/bytes@3.1.5': + resolution: {integrity: sha512-VgZkrJckypj85YxEsEavcMmmSOIzkUHqWmM4CCyia5dc54YwsXzJ5uT4fYxBQNEXx+oF1krlhgCbvfubXqZYsQ==} + + '@types/connect@3.4.38': + resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + + '@types/debug@4.1.12': + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + + '@types/estree-jsx@1.0.5': + resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} + + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + + '@types/express-rate-limit@5.1.3': + resolution: {integrity: sha512-H+TYy3K53uPU2TqPGFYaiWc2xJV6+bIFkDd/Ma2/h67Pa6ARk9kWE0p/K9OH1Okm0et9Sfm66fmXoAxsH2PHXg==} + + '@types/express-serve-static-core@5.0.7': + resolution: {integrity: sha512-R+33OsgWw7rOhD1emjU7dzCDHucJrgJXMA5PYCzJxVil0dsyx5iBEPHqpPfiKNJQb7lZ1vxwoLR4Z87bBUpeGQ==} + + '@types/express@5.0.3': + resolution: {integrity: sha512-wGA0NX93b19/dZC1J18tKWVIYWyyF2ZjT9vin/NRu0qzzvfVzWjs04iq2rQ3H65vCTQYlRqs3YHfY7zjdV+9Kw==} + + '@types/hast@3.0.4': + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + + '@types/http-errors@2.0.5': + resolution: {integrity: sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/json5@0.0.29': + resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + + '@types/mdast@4.0.4': + resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + + '@types/mime@1.3.5': + resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} + + '@types/ms@2.1.0': + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + + '@types/node-fetch@2.6.13': + resolution: {integrity: sha512-QGpRVpzSaUs30JBSGPjOg4Uveu384erbHBoT1zeONvyCfwQxIkUshLAOqN/k9EjGviPRmWTTe6aH2qySWKTVSw==} + + '@types/node@20.19.10': + resolution: {integrity: sha512-iAFpG6DokED3roLSP0K+ybeDdIX6Bc0Vd3mLW5uDqThPWtNos3E+EqOM11mPQHKzfWHqEBuLjIlsBQQ8CsISmQ==} + + '@types/node@24.2.1': + resolution: {integrity: sha512-DRh5K+ka5eJic8CjH7td8QpYEV6Zo10gfRkjHCO3weqZHWDtAaSTFtl4+VMqOJ4N5jcuhZ9/l+yy8rVgw7BQeQ==} + + '@types/pg@8.15.5': + resolution: {integrity: sha512-LF7lF6zWEKxuT3/OR8wAZGzkg4ENGXFNyiV/JeOt9z5B+0ZVwbql9McqX5c/WStFq1GaGso7H1AzP/qSzmlCKQ==} + + '@types/qs@6.14.0': + resolution: {integrity: sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==} + + '@types/range-parser@1.2.7': + resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} + + '@types/react-dom@19.1.7': + resolution: {integrity: sha512-i5ZzwYpqjmrKenzkoLM2Ibzt6mAsM7pxB6BCIouEVVmgiqaMj1TjaK7hnA36hbW5aZv20kx7Lw6hWzPWg0Rurw==} + peerDependencies: + '@types/react': ^19.0.0 + + '@types/react@19.1.9': + resolution: {integrity: sha512-WmdoynAX8Stew/36uTSVMcLJJ1KRh6L3IZRx1PZ7qJtBqT3dYTgyDTx8H1qoRghErydW7xw9mSJ3wS//tCRpFA==} + + '@types/send@0.17.5': + resolution: {integrity: sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==} + + '@types/serve-static@1.15.8': + resolution: {integrity: sha512-roei0UY3LhpOJvjbIP6ZZFngyLKl5dskOtDhxY5THRSpO+ZI+nzJ+m5yUMzGrp89YRa7lvknKkMYjqQFGwA7Sg==} + + '@types/triple-beam@1.3.5': + resolution: {integrity: sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==} + + '@types/unist@2.0.11': + resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} + + '@types/unist@3.0.3': + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + + '@types/xml2js@0.4.14': + resolution: {integrity: sha512-4YnrRemBShWRO2QjvUin8ESA41rH+9nQGLUGZV/1IDhi3SL9OhdpNC/MrulTWuptXKwhx/aDxE7toV0f/ypIXQ==} + + '@typescript-eslint/eslint-plugin@8.39.0': + resolution: {integrity: sha512-bhEz6OZeUR+O/6yx9Jk6ohX6H9JSFTaiY0v9/PuKT3oGK0rn0jNplLmyFUGV+a9gfYnVNwGDwS/UkLIuXNb2Rw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.39.0 + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/parser@8.39.0': + resolution: {integrity: sha512-g3WpVQHngx0aLXn6kfIYCZxM6rRJlWzEkVpqEFLT3SgEDsp9cpCbxxgwnE504q4H+ruSDh/VGS6nqZIDynP+vg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/project-service@8.39.0': + resolution: {integrity: sha512-CTzJqaSq30V/Z2Og9jogzZt8lJRR5TKlAdXmWgdu4hgcC9Kww5flQ+xFvMxIBWVNdxJO7OifgdOK4PokMIWPew==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/scope-manager@8.39.0': + resolution: {integrity: sha512-8QOzff9UKxOh6npZQ/4FQu4mjdOCGSdO3p44ww0hk8Vu+IGbg0tB/H1LcTARRDzGCC8pDGbh2rissBuuoPgH8A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/tsconfig-utils@8.39.0': + resolution: {integrity: sha512-Fd3/QjmFV2sKmvv3Mrj8r6N8CryYiCS8Wdb/6/rgOXAWGcFuc+VkQuG28uk/4kVNVZBQuuDHEDUpo/pQ32zsIQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/type-utils@8.39.0': + resolution: {integrity: sha512-6B3z0c1DXVT2vYA9+z9axjtc09rqKUPRmijD5m9iv8iQpHBRYRMBcgxSiKTZKm6FwWw1/cI4v6em35OsKCiN5Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/types@8.39.0': + resolution: {integrity: sha512-ArDdaOllnCj3yn/lzKn9s0pBQYmmyme/v1HbGIGB0GB/knFI3fWMHloC+oYTJW46tVbYnGKTMDK4ah1sC2v0Kg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/typescript-estree@8.39.0': + resolution: {integrity: sha512-ndWdiflRMvfIgQRpckQQLiB5qAKQ7w++V4LlCHwp62eym1HLB/kw7D9f2e8ytONls/jt89TEasgvb+VwnRprsw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/utils@8.39.0': + resolution: {integrity: sha512-4GVSvNA0Vx1Ktwvf4sFE+exxJ3QGUorQG1/A5mRfRNZtkBT2xrA/BCO2H0eALx/PnvCS6/vmYwRdDA41EoffkQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/visitor-keys@8.39.0': + resolution: {integrity: sha512-ldgiJ+VAhQCfIjeOgu8Kj5nSxds0ktPOSO9p4+0VDH2R2pLvQraaM5Oen2d7NxzMCm+Sn/vJT+mv2H5u6b/3fA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@ungap/structured-clone@1.3.0': + resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + + '@unrs/resolver-binding-android-arm-eabi@1.11.1': + resolution: {integrity: sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==} + cpu: [arm] + os: [android] + + '@unrs/resolver-binding-android-arm64@1.11.1': + resolution: {integrity: sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==} + cpu: [arm64] + os: [android] + + '@unrs/resolver-binding-darwin-arm64@1.11.1': + resolution: {integrity: sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==} + cpu: [arm64] + os: [darwin] + + '@unrs/resolver-binding-darwin-x64@1.11.1': + resolution: {integrity: sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==} + cpu: [x64] + os: [darwin] + + '@unrs/resolver-binding-freebsd-x64@1.11.1': + resolution: {integrity: sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==} + cpu: [x64] + os: [freebsd] + + '@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1': + resolution: {integrity: sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==} + cpu: [arm] + os: [linux] + + '@unrs/resolver-binding-linux-arm-musleabihf@1.11.1': + resolution: {integrity: sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==} + cpu: [arm] + os: [linux] + + '@unrs/resolver-binding-linux-arm64-gnu@1.11.1': + resolution: {integrity: sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==} + cpu: [arm64] + os: [linux] + + '@unrs/resolver-binding-linux-arm64-musl@1.11.1': + resolution: {integrity: sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==} + cpu: [arm64] + os: [linux] + + '@unrs/resolver-binding-linux-ppc64-gnu@1.11.1': + resolution: {integrity: sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==} + cpu: [ppc64] + os: [linux] + + '@unrs/resolver-binding-linux-riscv64-gnu@1.11.1': + resolution: {integrity: sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==} + cpu: [riscv64] + os: [linux] + + '@unrs/resolver-binding-linux-riscv64-musl@1.11.1': + resolution: {integrity: sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==} + cpu: [riscv64] + os: [linux] + + '@unrs/resolver-binding-linux-s390x-gnu@1.11.1': + resolution: {integrity: sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==} + cpu: [s390x] + os: [linux] + + '@unrs/resolver-binding-linux-x64-gnu@1.11.1': + resolution: {integrity: sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==} + cpu: [x64] + os: [linux] + + '@unrs/resolver-binding-linux-x64-musl@1.11.1': + resolution: {integrity: sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==} + cpu: [x64] + os: [linux] + + '@unrs/resolver-binding-wasm32-wasi@1.11.1': + resolution: {integrity: sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@unrs/resolver-binding-win32-arm64-msvc@1.11.1': + resolution: {integrity: sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==} + cpu: [arm64] + os: [win32] + + '@unrs/resolver-binding-win32-ia32-msvc@1.11.1': + resolution: {integrity: sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==} + cpu: [ia32] + os: [win32] + + '@unrs/resolver-binding-win32-x64-msvc@1.11.1': + resolution: {integrity: sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==} + cpu: [x64] + os: [win32] + + '@vitest/expect@2.1.9': + resolution: {integrity: sha512-UJCIkTBenHeKT1TTlKMJWy1laZewsRIzYighyYiJKZreqtdxSos/S1t+ktRMQWu2CKqaarrkeszJx1cgC5tGZw==} + + '@vitest/mocker@2.1.9': + resolution: {integrity: sha512-tVL6uJgoUdi6icpxmdrn5YNo3g3Dxv+IHJBr0GXHaEdTcw3F+cPKnsXFhli6nO+f/6SDKPHEK1UN+k+TQv0Ehg==} + peerDependencies: + msw: ^2.4.9 + vite: ^5.0.0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + + '@vitest/pretty-format@2.1.9': + resolution: {integrity: sha512-KhRIdGV2U9HOUzxfiHmY8IFHTdqtOhIzCpd8WRdJiE7D/HUcZVD0EgQCVjm+Q9gkUXWgBvMmTtZgIG48wq7sOQ==} + + '@vitest/runner@2.1.9': + resolution: {integrity: sha512-ZXSSqTFIrzduD63btIfEyOmNcBmQvgOVsPNPe0jYtESiXkhd8u2erDLnMxmGrDCwHCCHE7hxwRDCT3pt0esT4g==} + + '@vitest/snapshot@2.1.9': + resolution: {integrity: sha512-oBO82rEjsxLNJincVhLhaxxZdEtV0EFHMK5Kmx5sJ6H9L183dHECjiefOAdnqpIgT5eZwT04PoggUnW88vOBNQ==} + + '@vitest/spy@2.1.9': + resolution: {integrity: sha512-E1B35FwzXXTs9FHNK6bDszs7mtydNi5MIfUWpceJ8Xbfb1gBMscAnwLbEu+B44ed6W3XjL9/ehLPHR1fkf1KLQ==} + + '@vitest/utils@2.1.9': + resolution: {integrity: sha512-v0psaMSkNJ3A2NMrUEHFRzJtDPFn+/VWZ5WxImB21T9fjucJRmS7xCS3ppEnARb9y11OAzaD+P2Ps+b+BGX5iQ==} + + '@zag-js/anatomy@1.21.1': + resolution: {integrity: sha512-KFDf1kMLJblsuzAPpfqt2Ti1B0jVtC3ZAQUYLixgUIzI+bnyq7T3IlPK38wpczqvruUijFSKtjS+tXBfR/P4fg==} + + '@zag-js/core@1.21.1': + resolution: {integrity: sha512-bxkrKpT2F6oyy4NovQDRvFhFEf13Owyr100aty+xiYxvrWz0rNAOaid+hmjIP4f+QDvxGF1XiYFmXgqls3sUTw==} + + '@zag-js/dom-query@1.21.1': + resolution: {integrity: sha512-O4db9iYvKeHPjBOtE92p01WXKHngzRRsR7Y5p1cNZ4cbBq15PH2lICcWwUyIxx5zjADZHx6HIv3E+Mg/KCauKA==} + + '@zag-js/number-input@1.21.1': + resolution: {integrity: sha512-FLCb1DcxqfKDcsS4CwIRsjjHdTh5jhgdlik089U+ybIltdBUPuz8JBymXIKgKNEY5uaY7wcxZSesa2N5iRG4nw==} + + '@zag-js/react@1.21.1': + resolution: {integrity: sha512-v2sOqTi2uQ67lz3n5AfUqASla5vHB3zAzSeTZvO479krmcYw44VatVHtxMmr+gx12p7XFGONkFau+MxURXp9Dw==} + peerDependencies: + react: '>=18.0.0' + react-dom: '>=18.0.0' + + '@zag-js/store@1.21.1': + resolution: {integrity: sha512-nuRIWUmL6I80Uxvap54ubuC6wTUBdGrY/LF7snnuK+/bZmcuif/202Oeepo+mlaaiyJ+z3abj2LNosPLKJT4eg==} + + '@zag-js/types@1.21.1': + resolution: {integrity: sha512-KbKMwJnrj6wmi4FOcaIMwqBVPz4KZRAn0D7Il8QjvAaJc5SdqkK18lcxQz4/v02EmQ4uOrHgKchcnB+ZHcBFCw==} + + '@zag-js/utils@1.21.1': + resolution: {integrity: sha512-YXkmKoQilMaCQolPnfyyF1xIDOkvSGUQ3RfNlGCxcfnXZeuLWhV/9kalXql5OhtDMChaSeI5IgoV6zH2KEeN0A==} + + abbrev@1.1.1: + resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} + + accepts@2.0.0: + resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} + engines: {node: '>= 0.6'} + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn-walk@8.3.4: + resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} + engines: {node: '>=0.4.0'} + + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + engines: {node: '>=0.4.0'} + hasBin: true + + agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + + agentkeepalive@4.6.0: + resolution: {integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==} + engines: {node: '>= 8.0.0'} + + aggregate-error@3.1.0: + resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} + engines: {node: '>=8'} + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.1.0: + resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} + engines: {node: '>=12'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + aproba@2.1.0: + resolution: {integrity: sha512-tLIEcj5GuR2RSTnxNKdkK0dJ/GrC7P38sUkiDmDuHfsHmbagTFAxDVIBltoklXEVIQ/f14IL8IMJ5pn9Hez1Ew==} + + are-we-there-yet@3.0.1: + resolution: {integrity: sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + deprecated: This package is no longer supported. + + arg@4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + + arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + aria-hidden@1.2.6: + resolution: {integrity: sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==} + engines: {node: '>=10'} + + aria-query@5.3.2: + resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} + engines: {node: '>= 0.4'} + + array-buffer-byte-length@1.0.2: + resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} + engines: {node: '>= 0.4'} + + array-includes@3.1.9: + resolution: {integrity: sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==} + engines: {node: '>= 0.4'} + + array.prototype.findlast@1.2.5: + resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} + engines: {node: '>= 0.4'} + + array.prototype.findlastindex@1.2.6: + resolution: {integrity: sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==} + engines: {node: '>= 0.4'} + + array.prototype.flat@1.3.3: + resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==} + engines: {node: '>= 0.4'} + + array.prototype.flatmap@1.3.3: + resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==} + engines: {node: '>= 0.4'} + + array.prototype.tosorted@1.1.4: + resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==} + engines: {node: '>= 0.4'} + + arraybuffer.prototype.slice@1.0.4: + resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} + engines: {node: '>= 0.4'} + + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} + + ast-types-flow@0.0.8: + resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} + + async-function@1.0.0: + resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} + engines: {node: '>= 0.4'} + + async@3.2.6: + resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + autoprefixer@10.4.21: + resolution: {integrity: sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + + axe-core@4.10.3: + resolution: {integrity: sha512-Xm7bpRXnDSX2YE2YFfBk2FnF0ep6tmG7xPh8iHee8MIcrgq762Nkce856dYtJYLkuIoYZvGfTs/PbZhideTcEg==} + engines: {node: '>=4'} + + axobject-query@4.1.0: + resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} + engines: {node: '>= 0.4'} + + bail@2.0.2: + resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + bcrypt@6.0.0: + resolution: {integrity: sha512-cU8v/EGSrnH+HnxV2z0J7/blxH8gq7Xh2JFT6Aroax7UohdmiJJlxApMxtKfuI7z68NvvVcmR78k2LbT6efhRg==} + engines: {node: '>= 18'} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + bindings@1.5.0: + resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} + + bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + + body-parser@2.2.0: + resolution: {integrity: sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==} + engines: {node: '>=18'} + + brace-expansion@1.1.12: + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} + + brace-expansion@2.0.2: + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browserslist@4.25.1: + resolution: {integrity: sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + + busboy@1.6.0: + resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} + engines: {node: '>=10.16.0'} + + bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + + cacache@15.3.0: + resolution: {integrity: sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==} + engines: {node: '>= 10'} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + call-bind@1.0.8: + resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} + engines: {node: '>= 0.4'} + + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + camelcase-css@2.0.1: + resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} + engines: {node: '>= 6'} + + caniuse-lite@1.0.30001733: + resolution: {integrity: sha512-e4QKw/O2Kavj2VQTKZWrwzkt3IxOmIlU6ajRb6LP64LHpBo1J67k2Hi4Vu/TgJWsNtynurfS0uK3MaUTCPfu5Q==} + + ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + + chai@5.2.1: + resolution: {integrity: sha512-5nFxhUrX0PqtyogoYOA8IPswy5sZFTOsBFl/9bNsmDLgsxYTzSZQJDPppDnZPTQbzSEm0hqGjWPzRemQCYbD6A==} + engines: {node: '>=18'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + + character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + + character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + + character-reference-invalid@2.0.1: + resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + + check-error@2.1.1: + resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} + engines: {node: '>= 16'} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + chownr@1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + + chownr@2.0.0: + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} + + chownr@3.0.0: + resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} + engines: {node: '>=18'} + + class-variance-authority@0.7.1: + resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==} + + clean-stack@2.2.0: + resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} + engines: {node: '>=6'} + + client-only@0.0.1: + resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + + cluster-key-slot@1.1.2: + resolution: {integrity: sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==} + engines: {node: '>=0.10.0'} + + cmdk@1.1.1: + resolution: {integrity: sha512-Vsv7kFaXm+ptHDMZ7izaRsP70GgrW9NBNGswt9OZaVBLlE0SNpDq8eu/VGXyF9r7M0azK3Wy7OlYXsuyYLFzHg==} + peerDependencies: + react: ^18 || ^19 || ^19.0.0-rc + react-dom: ^18 || ^19 || ^19.0.0-rc + + color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + color-string@1.9.1: + resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + + color-support@1.1.3: + resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} + hasBin: true + + color@3.2.1: + resolution: {integrity: sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==} + + color@4.2.3: + resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} + engines: {node: '>=12.5.0'} + + colorspace@1.1.4: + resolution: {integrity: sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + + commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + console-control-strings@1.1.0: + resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} + + content-disposition@1.0.0: + resolution: {integrity: sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==} + engines: {node: '>= 0.6'} + + content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + + convert-hrtime@5.0.0: + resolution: {integrity: sha512-lOETlkIeYSJWcbbcvjRKGxVMXJR+8+OQb/mTPbA4ObPMytYIsUbuOE0Jzy60hjARYszq1id0j8KgVhC+WGZVTg==} + engines: {node: '>=12'} + + cookie-signature@1.2.2: + resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} + engines: {node: '>=6.6.0'} + + cookie@0.7.1: + resolution: {integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==} + engines: {node: '>= 0.6'} + + create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + + cross-env@7.0.3: + resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==} + engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'} + hasBin: true + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + damerau-levenshtein@1.0.8: + resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} + + data-uri-to-buffer@4.0.1: + resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} + engines: {node: '>= 12'} + + data-view-buffer@1.0.2: + resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} + engines: {node: '>= 0.4'} + + data-view-byte-length@1.0.2: + resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} + engines: {node: '>= 0.4'} + + data-view-byte-offset@1.0.1: + resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} + engines: {node: '>= 0.4'} + + debug@3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.4.1: + resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decode-named-character-reference@1.2.0: + resolution: {integrity: sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==} + + decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + + deep-eql@5.0.2: + resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} + engines: {node: '>=6'} + + deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + delegates@1.0.0: + resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} + + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + detect-libc@2.0.4: + resolution: {integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==} + engines: {node: '>=8'} + + detect-node-es@1.1.0: + resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} + + devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + + didyoumean@1.2.2: + resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + + diff@4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + + dlv@1.1.3: + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + + doctrine@2.1.0: + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} + + dotenv@16.6.1: + resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} + engines: {node: '>=12'} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + + electron-to-chromium@1.5.199: + resolution: {integrity: sha512-3gl0S7zQd88kCAZRO/DnxtBKuhMO4h0EaQIN3YgZfV6+pW+5+bf2AdQeHNESCoaQqo/gjGVYEf2YM4O5HJQqpQ==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + enabled@2.0.0: + resolution: {integrity: sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==} + + encodeurl@2.0.0: + resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} + engines: {node: '>= 0.8'} + + encoding@0.1.13: + resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} + + end-of-stream@1.4.5: + resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} + + enhanced-resolve@5.18.3: + resolution: {integrity: sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==} + engines: {node: '>=10.13.0'} + + env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + + envalid@8.1.0: + resolution: {integrity: sha512-OT6+qVhKVyCidaGoXflb2iK1tC8pd0OV2Q+v9n33wNhUJ+lus+rJobUj4vJaQBPxPZ0vYrPGuxdrenyCAIJcow==} + engines: {node: '>=18'} + + err-code@2.0.3: + resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} + + es-abstract@1.24.0: + resolution: {integrity: sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==} + engines: {node: '>= 0.4'} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-iterator-helpers@1.2.1: + resolution: {integrity: sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==} + engines: {node: '>= 0.4'} + + es-module-lexer@1.7.0: + resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + es-shim-unscopables@1.1.0: + resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==} + engines: {node: '>= 0.4'} + + es-to-primitive@1.3.0: + resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} + engines: {node: '>= 0.4'} + + esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} + engines: {node: '>=12'} + hasBin: true + + esbuild@0.25.8: + resolution: {integrity: sha512-vVC0USHGtMi8+R4Kz8rt6JhEWLxsv9Rnu/lGYbPR8u47B+DCBksq9JarW0zOO7bs37hyOK1l2/oqtbciutL5+Q==} + engines: {node: '>=18'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + eslint-config-next@15.3.2: + resolution: {integrity: sha512-FerU4DYccO4FgeYFFglz0SnaKRe1ejXQrDb8kWUkTAg036YWi+jUsgg4sIGNCDhAsDITsZaL4MzBWKB6f4G1Dg==} + peerDependencies: + eslint: ^7.23.0 || ^8.0.0 || ^9.0.0 + typescript: '>=3.3.1' + peerDependenciesMeta: + typescript: + optional: true + + eslint-import-resolver-node@0.3.9: + resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} + + eslint-import-resolver-typescript@3.10.1: + resolution: {integrity: sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + eslint: '*' + eslint-plugin-import: '*' + eslint-plugin-import-x: '*' + peerDependenciesMeta: + eslint-plugin-import: + optional: true + eslint-plugin-import-x: + optional: true + + eslint-module-utils@2.12.1: + resolution: {integrity: sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + + eslint-plugin-import@2.32.0: + resolution: {integrity: sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + + eslint-plugin-jsx-a11y@6.10.2: + resolution: {integrity: sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==} + engines: {node: '>=4.0'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9 + + eslint-plugin-react-hooks@5.2.0: + resolution: {integrity: sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==} + engines: {node: '>=10'} + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 + + eslint-plugin-react@7.37.5: + resolution: {integrity: sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==} + engines: {node: '>=4'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 + + eslint-scope@8.4.0: + resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@4.2.1: + resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint@9.32.0: + resolution: {integrity: sha512-LSehfdpgMeWcTZkWZVIJl+tkZ2nuSkyyB9C27MZqFWXuph7DvaowgcTvKqxvpLW1JZIk8PN7hFY3Rj9LQ7m7lg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true + + espree@10.4.0: + resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + estree-util-is-identifier-name@3.0.0: + resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + + expand-template@2.0.3: + resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} + engines: {node: '>=6'} + + expect-type@1.2.2: + resolution: {integrity: sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==} + engines: {node: '>=12.0.0'} + + expr-eval@2.0.2: + resolution: {integrity: sha512-4EMSHGOPSwAfBiibw3ndnP0AvjDWLsMvGOvWEZ2F96IGk0bIVdjQisOHxReSkE13mHcfbuCiXw+G4y0zv6N8Eg==} + + express-rate-limit@8.0.1: + resolution: {integrity: sha512-aZVCnybn7TVmxO4BtlmnvX+nuz8qHW124KKJ8dumsBsmv5ZLxE0pYu7S2nwyRBGHHCAzdmnGyrc5U/rksSPO7Q==} + engines: {node: '>= 16'} + peerDependencies: + express: '>= 4.11' + + express@5.1.0: + resolution: {integrity: sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==} + engines: {node: '>= 18'} + + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-glob@3.3.1: + resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} + engines: {node: '>=8.6.0'} + + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fastq@1.19.1: + resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} + + fdir@6.4.6: + resolution: {integrity: sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + fecha@4.2.3: + resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==} + + fetch-blob@3.2.0: + resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} + engines: {node: ^12.20 || >= 14.13} + + fetch-socks@1.3.2: + resolution: {integrity: sha512-vkH5+Zgj2yEbU57Cei0iyLgTZ4OkEKJj56Xu3ViB5dpsl599JgEooQ3x6NVagIFRHWnWJ+7K0MO0aIV1TMgvnw==} + + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} + + file-uri-to-path@1.0.0: + resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + finalhandler@2.1.0: + resolution: {integrity: sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==} + engines: {node: '>= 0.8'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} + + flatted@3.3.3: + resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + + fn.name@1.1.0: + resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==} + + for-each@0.3.5: + resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} + engines: {node: '>= 0.4'} + + foreground-child@3.3.1: + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} + engines: {node: '>=14'} + + form-data@4.0.4: + resolution: {integrity: sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==} + engines: {node: '>= 6'} + + formdata-polyfill@4.0.10: + resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} + engines: {node: '>=12.20.0'} + + forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + + fraction.js@4.3.7: + resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} + + framer-motion@12.23.12: + resolution: {integrity: sha512-6e78rdVtnBvlEVgu6eFEAgG9v3wLnYEboM8I5O5EXvfKC8gxGQB8wXJdhkMy10iVcn05jl6CNw7/HTsTCfwcWg==} + peerDependencies: + '@emotion/is-prop-valid': '*' + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@emotion/is-prop-valid': + optional: true + react: + optional: true + react-dom: + optional: true + + fresh@2.0.0: + resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} + engines: {node: '>= 0.8'} + + fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + + fs-minipass@2.1.0: + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} + engines: {node: '>= 8'} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + function-timeout@1.0.2: + resolution: {integrity: sha512-939eZS4gJ3htTHAldmyyuzlrD58P03fHG49v2JfFXbV6OhvZKRC9j2yAtdHw/zrp2zXHuv05zMIy40F0ge7spA==} + engines: {node: '>=18'} + + function.prototype.name@1.1.8: + resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} + engines: {node: '>= 0.4'} + + functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + + fuzzball@2.2.3: + resolution: {integrity: sha512-sQDb3kjI7auA4YyE1YgEW85MTparcSgRgcCweUK06Cn0niY5lN+uhFiRUZKN4MQVGGiHxlbrYCA4nL1QjOXBLQ==} + + gauge@4.0.4: + resolution: {integrity: sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + deprecated: This package is no longer supported. + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-nonce@1.0.1: + resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} + engines: {node: '>=6'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + get-symbol-description@1.1.0: + resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} + engines: {node: '>= 0.4'} + + get-tsconfig@4.10.1: + resolution: {integrity: sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==} + + github-from-package@0.0.0: + resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + + globals@14.0.0: + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} + + globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} + + go-ptt@0.4.0: + resolution: {integrity: sha512-W1lFnOeBxBA+jXsxogj/k9qlDd804VFy8FbFBxVRoaP5WBRRT66S93uJmq8R4UAtVbN43FsilMawWZE7Hjr3SQ==} + hasBin: true + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + has-bigints@1.1.0: + resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} + engines: {node: '>= 0.4'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-proto@1.2.0: + resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} + engines: {node: '>= 0.4'} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + has-unicode@2.0.1: + resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + hast-util-to-jsx-runtime@2.3.6: + resolution: {integrity: sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==} + + hast-util-whitespace@3.0.0: + resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + + heap@0.2.7: + resolution: {integrity: sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==} + + html-url-attributes@3.0.1: + resolution: {integrity: sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==} + + http-cache-semantics@4.2.0: + resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} + + http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + + http-proxy-agent@4.0.1: + resolution: {integrity: sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==} + engines: {node: '>= 6'} + + https-proxy-agent@5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + + humanize-ms@1.2.1: + resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} + + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + ignore@7.0.5: + resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} + engines: {node: '>= 4'} + + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + + infer-owner@1.0.4: + resolution: {integrity: sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + + inline-style-parser@0.2.4: + resolution: {integrity: sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==} + + internal-slot@1.1.0: + resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} + engines: {node: '>= 0.4'} + + ip-address@10.0.1: + resolution: {integrity: sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA==} + engines: {node: '>= 12'} + + ip-address@9.0.5: + resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==} + engines: {node: '>= 12'} + + ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + + is-alphabetical@2.0.1: + resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} + + is-alphanumerical@2.0.1: + resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} + + is-array-buffer@3.0.5: + resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} + engines: {node: '>= 0.4'} + + is-arrayish@0.3.2: + resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + + is-async-function@2.1.1: + resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} + engines: {node: '>= 0.4'} + + is-bigint@1.1.0: + resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} + engines: {node: '>= 0.4'} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-boolean-object@1.2.2: + resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} + engines: {node: '>= 0.4'} + + is-bun-module@2.0.0: + resolution: {integrity: sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==} + + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} + + is-data-view@1.0.2: + resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} + engines: {node: '>= 0.4'} + + is-date-object@1.1.0: + resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} + engines: {node: '>= 0.4'} + + is-decimal@2.0.1: + resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-finalizationregistry@1.1.1: + resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} + engines: {node: '>= 0.4'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-generator-function@1.1.0: + resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} + engines: {node: '>= 0.4'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-hexadecimal@2.0.1: + resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + + is-lambda@1.0.1: + resolution: {integrity: sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==} + + is-map@2.0.3: + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} + engines: {node: '>= 0.4'} + + is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} + + is-number-object@1.1.1: + resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} + engines: {node: '>= 0.4'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + + is-promise@4.0.0: + resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} + + is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} + engines: {node: '>= 0.4'} + + is-set@2.0.3: + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} + engines: {node: '>= 0.4'} + + is-shared-array-buffer@1.0.4: + resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} + engines: {node: '>= 0.4'} + + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + is-string@1.1.1: + resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} + engines: {node: '>= 0.4'} + + is-symbol@1.1.1: + resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} + engines: {node: '>= 0.4'} + + is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} + engines: {node: '>= 0.4'} + + is-weakmap@2.0.2: + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + engines: {node: '>= 0.4'} + + is-weakref@1.1.1: + resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} + engines: {node: '>= 0.4'} + + is-weakset@2.0.4: + resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} + engines: {node: '>= 0.4'} + + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + iterator.prototype@1.1.5: + resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==} + engines: {node: '>= 0.4'} + + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + jiti@1.21.7: + resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==} + hasBin: true + + jiti@2.5.1: + resolution: {integrity: sha512-twQoecYPiVA5K/h6SxtORw/Bs3ar+mLUtoPSc7iMXzQzK8d7eJ/R09wmTwAjiamETn1cXYPGfNnu7DMoHgu12w==} + hasBin: true + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + jsbn@1.1.0: + resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + json5@1.0.2: + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + hasBin: true + + jsx-ast-utils@3.3.5: + resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} + engines: {node: '>=4.0'} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + kuler@2.0.0: + resolution: {integrity: sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==} + + language-subtag-registry@0.3.23: + resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==} + + language-tags@1.0.9: + resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==} + engines: {node: '>=0.10'} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + lightningcss-darwin-arm64@1.30.1: + resolution: {integrity: sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.30.1: + resolution: {integrity: sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.30.1: + resolution: {integrity: sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.30.1: + resolution: {integrity: sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.30.1: + resolution: {integrity: sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-arm64-musl@1.30.1: + resolution: {integrity: sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-x64-gnu@1.30.1: + resolution: {integrity: sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-linux-x64-musl@1.30.1: + resolution: {integrity: sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-win32-arm64-msvc@1.30.1: + resolution: {integrity: sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.30.1: + resolution: {integrity: sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.30.1: + resolution: {integrity: sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==} + engines: {node: '>= 12.0.0'} + + lilconfig@3.1.3: + resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} + engines: {node: '>=14'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + + lodash.castarray@4.4.0: + resolution: {integrity: sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==} + + lodash.isplainobject@4.0.6: + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + logform@2.7.0: + resolution: {integrity: sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==} + engines: {node: '>= 12.0.0'} + + long@5.3.2: + resolution: {integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==} + + longest-streak@3.1.0: + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + + loupe@3.2.0: + resolution: {integrity: sha512-2NCfZcT5VGVNX9mSZIxLRkEAegDGBpuQZBy13desuHeVORmBDyAET4TkJr4SjqQy3A8JDofMN6LpkK8Xcm/dlw==} + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + + lucide-react@0.511.0: + resolution: {integrity: sha512-VK5a2ydJ7xm8GvBeKLS9mu1pVK6ucef9780JVUjw6bAjJL/QXnd4Y0p7SPeOUMC27YhzNCZvm5d/QX0Tp3rc0w==} + peerDependencies: + react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + magic-string@0.30.17: + resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} + + make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + + make-fetch-happen@9.1.0: + resolution: {integrity: sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==} + engines: {node: '>= 10'} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + mdast-util-from-markdown@2.0.2: + resolution: {integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==} + + mdast-util-mdx-expression@2.0.1: + resolution: {integrity: sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==} + + mdast-util-mdx-jsx@3.2.0: + resolution: {integrity: sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==} + + mdast-util-mdxjs-esm@2.0.1: + resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==} + + mdast-util-phrasing@4.1.0: + resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} + + mdast-util-to-hast@13.2.0: + resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==} + + mdast-util-to-markdown@2.1.2: + resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==} + + mdast-util-to-string@4.0.0: + resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + + media-typer@1.1.0: + resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} + engines: {node: '>= 0.8'} + + merge-descriptors@2.0.0: + resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} + engines: {node: '>=18'} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromark-core-commonmark@2.0.3: + resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} + + micromark-factory-destination@2.0.1: + resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} + + micromark-factory-label@2.0.1: + resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==} + + micromark-factory-space@2.0.1: + resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==} + + micromark-factory-title@2.0.1: + resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==} + + micromark-factory-whitespace@2.0.1: + resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==} + + micromark-util-character@2.1.1: + resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} + + micromark-util-chunked@2.0.1: + resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==} + + micromark-util-classify-character@2.0.1: + resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==} + + micromark-util-combine-extensions@2.0.1: + resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==} + + micromark-util-decode-numeric-character-reference@2.0.2: + resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==} + + micromark-util-decode-string@2.0.1: + resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==} + + micromark-util-encode@2.0.1: + resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} + + micromark-util-html-tag-name@2.0.1: + resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==} + + micromark-util-normalize-identifier@2.0.1: + resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==} + + micromark-util-resolve-all@2.0.1: + resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==} + + micromark-util-sanitize-uri@2.0.1: + resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} + + micromark-util-subtokenize@2.1.0: + resolution: {integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==} + + micromark-util-symbol@2.0.1: + resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} + + micromark-util-types@2.0.2: + resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} + + micromark@4.0.2: + resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-db@1.54.0: + resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mime-types@3.0.1: + resolution: {integrity: sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==} + engines: {node: '>= 0.6'} + + mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + + mini-svg-data-uri@1.4.4: + resolution: {integrity: sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==} + hasBin: true + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass-collect@1.0.2: + resolution: {integrity: sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==} + engines: {node: '>= 8'} + + minipass-fetch@1.4.1: + resolution: {integrity: sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==} + engines: {node: '>=8'} + + minipass-flush@1.0.5: + resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==} + engines: {node: '>= 8'} + + minipass-pipeline@1.2.4: + resolution: {integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==} + engines: {node: '>=8'} + + minipass-sized@1.0.3: + resolution: {integrity: sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==} + engines: {node: '>=8'} + + minipass@3.3.6: + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} + + minipass@5.0.0: + resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} + engines: {node: '>=8'} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + minizlib@2.1.2: + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} + + minizlib@3.0.2: + resolution: {integrity: sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==} + engines: {node: '>= 18'} + + mkdirp-classic@0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + + mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + + mkdirp@3.0.1: + resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} + engines: {node: '>=10'} + hasBin: true + + moment-timezone@0.5.48: + resolution: {integrity: sha512-f22b8LV1gbTO2ms2j2z13MuPogNoh5UzxL3nzNAYKGraILnbGc9NEE6dyiiiLv46DGRb8A4kg8UKWLjPthxBHw==} + + moment@2.30.1: + resolution: {integrity: sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==} + + motion-dom@12.23.12: + resolution: {integrity: sha512-RcR4fvMCTESQBD/uKQe49D5RUeDOokkGRmz4ceaJKDBgHYtZtntC/s2vLvY38gqGaytinij/yi3hMcWVcEF5Kw==} + + motion-utils@12.23.6: + resolution: {integrity: sha512-eAWoPgr4eFEOFfg2WjIsMoqJTW6Z8MTUCgn/GZ3VRpClWBdnbjryiA3ZSNLyxCTmCQx4RmYX6jX1iWHbenUPNQ==} + + motion@12.23.12: + resolution: {integrity: sha512-8jCD8uW5GD1csOoqh1WhH1A6j5APHVE15nuBkFeRiMzYBdRwyAHmSP/oXSuW0WJPZRXTFdBoG4hY9TFWNhhwng==} + peerDependencies: + '@emotion/is-prop-valid': '*' + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@emotion/is-prop-valid': + optional: true + react: + optional: true + react-dom: + optional: true + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + napi-build-utils@2.0.0: + resolution: {integrity: sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==} + + napi-postinstall@0.3.2: + resolution: {integrity: sha512-tWVJxJHmBWLy69PvO96TZMZDrzmw5KeiZBz3RHmiM2XZ9grBJ2WgMAFVVg25nqp3ZjTFUs2Ftw1JhscL3Teliw==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + hasBin: true + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + + negotiator@1.0.0: + resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} + engines: {node: '>= 0.6'} + + next-themes@0.4.6: + resolution: {integrity: sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA==} + peerDependencies: + react: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc + react-dom: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc + + next@15.3.2: + resolution: {integrity: sha512-CA3BatMyHkxZ48sgOCLdVHjFU36N7TF1HhqAHLFOkV6buwZnvMI84Cug8xD56B9mCuKrqXnLn94417GrZ/jjCQ==} + engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} + hasBin: true + peerDependencies: + '@opentelemetry/api': ^1.1.0 + '@playwright/test': ^1.41.2 + babel-plugin-react-compiler: '*' + react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 + react-dom: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 + sass: ^1.3.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + '@playwright/test': + optional: true + babel-plugin-react-compiler: + optional: true + sass: + optional: true + + node-abi@3.75.0: + resolution: {integrity: sha512-OhYaY5sDsIka7H7AtijtI9jwGYLyl29eQn/W623DiN/MIv5sUqc4g7BIDThX+gb7di9f6xK02nkp8sdfFWZLTg==} + engines: {node: '>=10'} + + node-addon-api@7.1.1: + resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} + + node-addon-api@8.5.0: + resolution: {integrity: sha512-/bRZty2mXUIFY/xU5HLvveNHlswNJej+RnxBjOMkidWfwZzgTbPG1E3K5TOxRLOR+5hX7bSofy8yf1hZevMS8A==} + engines: {node: ^18 || ^20 || >= 21} + + node-domexception@1.0.0: + resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} + engines: {node: '>=10.5.0'} + deprecated: Use your platform's native DOMException instead + + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + node-fetch@3.3.2: + resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + node-gyp-build@4.8.4: + resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} + hasBin: true + + node-gyp@8.4.1: + resolution: {integrity: sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==} + engines: {node: '>= 10.12.0'} + hasBin: true + + node-releases@2.0.19: + resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + + nopt@5.0.0: + resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} + engines: {node: '>=6'} + hasBin: true + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + normalize-range@0.1.2: + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} + engines: {node: '>=0.10.0'} + + npmlog@6.0.2: + resolution: {integrity: sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + deprecated: This package is no longer supported. + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-hash@3.0.0: + resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} + engines: {node: '>= 6'} + + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object.assign@4.1.7: + resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} + engines: {node: '>= 0.4'} + + object.entries@1.1.9: + resolution: {integrity: sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==} + engines: {node: '>= 0.4'} + + object.fromentries@2.0.8: + resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} + engines: {node: '>= 0.4'} + + object.groupby@1.0.3: + resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} + engines: {node: '>= 0.4'} + + object.values@1.2.1: + resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} + engines: {node: '>= 0.4'} + + on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + one-time@1.0.0: + resolution: {integrity: sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==} + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + own-keys@1.0.1: + resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} + engines: {node: '>= 0.4'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + p-map@4.0.0: + resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} + engines: {node: '>=10'} + + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-entities@4.0.2: + resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==} + + parse-torrent-title@https://codeload.github.com/TheBeastLT/parse-torrent-title/tar.gz/1169487e316a4eed898dcfd900957f89a253604c: + resolution: {tarball: https://codeload.github.com/TheBeastLT/parse-torrent-title/tar.gz/1169487e316a4eed898dcfd900957f89a253604c} + version: 1.3.0 + engines: {node: '>=12'} + + parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + + path-to-regexp@8.2.0: + resolution: {integrity: sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==} + engines: {node: '>=16'} + + pathe@1.1.2: + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + + pathval@2.0.1: + resolution: {integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==} + engines: {node: '>= 14.16'} + + pg-cloudflare@1.2.7: + resolution: {integrity: sha512-YgCtzMH0ptvZJslLM1ffsY4EuGaU0cx4XSdXLRFae8bPP4dS5xL1tNB3k2o/N64cHJpwU7dxKli/nZ2lUa5fLg==} + + pg-connection-string@2.9.1: + resolution: {integrity: sha512-nkc6NpDcvPVpZXxrreI/FOtX3XemeLl8E0qFr6F2Lrm/I8WOnaWNhIPK2Z7OHpw7gh5XJThi6j6ppgNoaT1w4w==} + + pg-int8@1.0.1: + resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==} + engines: {node: '>=4.0.0'} + + pg-pool@3.10.1: + resolution: {integrity: sha512-Tu8jMlcX+9d8+QVzKIvM/uJtp07PKr82IUOYEphaWcoBhIYkoHpLXN3qO59nAI11ripznDsEzEv8nUxBVWajGg==} + peerDependencies: + pg: '>=8.0' + + pg-protocol@1.10.3: + resolution: {integrity: sha512-6DIBgBQaTKDJyxnXaLiLR8wBpQQcGWuAESkRBX/t6OwA8YsqP+iVSiond2EDy6Y/dsGk8rh/jtax3js5NeV7JQ==} + + pg-types@2.2.0: + resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==} + engines: {node: '>=4'} + + pg@8.16.3: + resolution: {integrity: sha512-enxc1h0jA/aq5oSDMvqyW3q89ra6XIIDZgCX9vkMrnz5DFTw/Ny3Li2lFQ+pt3L6MCgm/5o2o8HW9hiJji+xvw==} + engines: {node: '>= 16.0.0'} + peerDependencies: + pg-native: '>=3.0.1' + peerDependenciesMeta: + pg-native: + optional: true + + pgpass@1.0.5: + resolution: {integrity: sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} + + pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + + pirates@4.0.7: + resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} + engines: {node: '>= 6'} + + possible-typed-array-names@1.1.0: + resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} + engines: {node: '>= 0.4'} + + postcss-import@15.1.0: + resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} + engines: {node: '>=14.0.0'} + peerDependencies: + postcss: ^8.0.0 + + postcss-import@16.1.0: + resolution: {integrity: sha512-7hsAZ4xGXl4MW+OKEWCnF6T5jqBw80/EE9aXg1r2yyn1RsVEU8EtKXbijEODa+rg7iih4bKf7vlvTGYR4CnPNg==} + engines: {node: '>=18.0.0'} + peerDependencies: + postcss: ^8.0.0 + + postcss-js@4.0.1: + resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} + engines: {node: ^12 || ^14 || >= 16} + peerDependencies: + postcss: ^8.4.21 + + postcss-load-config@4.0.2: + resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} + engines: {node: '>= 14'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + + postcss-nested@6.2.0: + resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.2.14 + + postcss-nesting@13.0.2: + resolution: {integrity: sha512-1YCI290TX+VP0U/K/aFxzHzQWHWURL+CtHMSbex1lCdpXD1SoR2sYuxDu5aNI9lPoXpKTCggFZiDJbwylU0LEQ==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + postcss-selector-parser@6.0.10: + resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==} + engines: {node: '>=4'} + + postcss-selector-parser@6.1.2: + resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} + engines: {node: '>=4'} + + postcss-selector-parser@7.1.0: + resolution: {integrity: sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==} + engines: {node: '>=4'} + + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + postcss@8.4.31: + resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} + engines: {node: ^10 || ^12 || >=14} + + postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + engines: {node: ^10 || ^12 || >=14} + + postgres-array@2.0.0: + resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==} + engines: {node: '>=4'} + + postgres-bytea@1.0.0: + resolution: {integrity: sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==} + engines: {node: '>=0.10.0'} + + postgres-date@1.0.7: + resolution: {integrity: sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==} + engines: {node: '>=0.10.0'} + + postgres-interval@1.2.0: + resolution: {integrity: sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==} + engines: {node: '>=0.10.0'} + + prebuild-install@7.1.3: + resolution: {integrity: sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==} + engines: {node: '>=10'} + hasBin: true + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prettier@3.6.2: + resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==} + engines: {node: '>=14'} + hasBin: true + + promise-inflight@1.0.1: + resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} + peerDependencies: + bluebird: '*' + peerDependenciesMeta: + bluebird: + optional: true + + promise-retry@2.0.1: + resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} + engines: {node: '>=10'} + + prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + + property-information@7.1.0: + resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} + + protobufjs@7.5.4: + resolution: {integrity: sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==} + engines: {node: '>=12.0.0'} + + proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + + proxy-compare@3.0.1: + resolution: {integrity: sha512-V9plBAt3qjMlS1+nC8771KNf6oJ12gExvaxnNzN/9yVRLdTv/lc+oJlnSzrdYDAvBfTStPCoiaCOTmTs0adv7Q==} + + pump@3.0.3: + resolution: {integrity: sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + qs@6.14.0: + resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} + engines: {node: '>=0.6'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + + rate-limit-redis@4.2.2: + resolution: {integrity: sha512-0SGzpSCZQgkJuUK5AqGaUkgwTMaujWIek0PwlZBDsdNIcasrJae8AC47tP5UHayqDcocJxtogL6DnZFTLoruUw==} + engines: {node: '>= 16'} + peerDependencies: + express-rate-limit: '>= 6' + + raw-body@3.0.0: + resolution: {integrity: sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==} + engines: {node: '>= 0.8'} + + rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + + react-dom@19.1.1: + resolution: {integrity: sha512-Dlq/5LAZgF0Gaz6yiqZCf6VCcZs1ghAJyrsu84Q/GT0gV+mCxbfmKNoGRKBYMJ8IEdGPqu49YWXD02GCknEDkw==} + peerDependencies: + react: ^19.1.1 + + react-icons@5.5.0: + resolution: {integrity: sha512-MEFcXdkP3dLo8uumGI5xN3lDFNsRtrjbOEKDLD7yv76v4wpnEq2Lt2qeHaQOr34I/wPN3s3+N08WkQ+CW37Xiw==} + peerDependencies: + react: '*' + + react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + + react-markdown@10.1.0: + resolution: {integrity: sha512-qKxVopLT/TyA6BX3Ue5NwabOsAzm0Q7kAPwq6L+wWDwisYs7R8vZ0nRXqq6rkueboxpkjvLGU9fWifiX/ZZFxQ==} + peerDependencies: + '@types/react': '>=18' + react: '>=18' + + react-remove-scroll-bar@2.3.8: + resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + react-remove-scroll@2.7.1: + resolution: {integrity: sha512-HpMh8+oahmIdOuS5aFKKY6Pyog+FNaZV/XyJOq7b4YFwsFHe5yYfdbIalI4k3vU2nSDql7YskmUseHsRrJqIPA==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + react-style-singleton@2.2.3: + resolution: {integrity: sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + react@19.1.1: + resolution: {integrity: sha512-w8nqGImo45dmMIfljjMwOGtbmC/mk4CMYhWIicdSflH91J9TyCyczcPFXJzrZ/ZXcgGRFeP6BU0BEJTw6tZdfQ==} + engines: {node: '>=0.10.0'} + + read-cache@1.0.0: + resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + redis@5.8.2: + resolution: {integrity: sha512-31vunZj07++Y1vcFGcnNWEf5jPoTkGARgfWI4+Tk55vdwHxhAvug8VEtW7Cx+/h47NuJTEg/JL77zAwC6E0OeA==} + engines: {node: '>= 18'} + + reflect.getprototypeof@1.0.10: + resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} + engines: {node: '>= 0.4'} + + regexp.prototype.flags@1.5.4: + resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} + engines: {node: '>= 0.4'} + + remark-parse@11.0.0: + resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} + + remark-rehype@11.1.2: + resolution: {integrity: sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + + resolve@1.22.10: + resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} + engines: {node: '>= 0.4'} + hasBin: true + + resolve@2.0.0-next.5: + resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} + hasBin: true + + retry@0.12.0: + resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} + engines: {node: '>= 4'} + + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + rollup@4.46.2: + resolution: {integrity: sha512-WMmLFI+Boh6xbop+OAGo9cQ3OgX9MIg7xOQjn+pTCwOkk+FNDAeAemXkJ3HzDJrVXleLOFVa1ipuc1AmEx1Dwg==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + router@2.2.0: + resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} + engines: {node: '>= 18'} + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + safe-array-concat@1.1.3: + resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} + engines: {node: '>=0.4'} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safe-push-apply@1.0.0: + resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} + engines: {node: '>= 0.4'} + + safe-regex-test@1.1.0: + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} + engines: {node: '>= 0.4'} + + safe-stable-stringify@2.5.0: + resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==} + engines: {node: '>=10'} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + sax@1.4.1: + resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} + + scheduler@0.26.0: + resolution: {integrity: sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.7.2: + resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} + engines: {node: '>=10'} + hasBin: true + + send@1.2.0: + resolution: {integrity: sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==} + engines: {node: '>= 18'} + + serve-static@2.2.0: + resolution: {integrity: sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==} + engines: {node: '>= 18'} + + set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + + set-proto@1.0.0: + resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} + engines: {node: '>= 0.4'} + + setimmediate@1.0.5: + resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + sharp@0.34.3: + resolution: {integrity: sha512-eX2IQ6nFohW4DbvHIOLRB3MHFpYqaqvXd3Tp5e/T/dSH83fxaNJQRvDMhASmkNTsNTVF2/OOopzRCt7xokgPfg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} + + siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + simple-concat@1.0.1: + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + + simple-get@4.0.1: + resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} + + simple-swizzle@0.2.2: + resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} + + smart-buffer@4.2.0: + resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} + engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + + socks-proxy-agent@6.2.1: + resolution: {integrity: sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==} + engines: {node: '>= 10'} + + socks@2.8.6: + resolution: {integrity: sha512-pe4Y2yzru68lXCb38aAqRf5gvN8YdjP1lok5o0J7BOHljkyCGKVz7H3vpVIXKD27rj2giOJ7DwVyk/GWrPHDWA==} + engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} + + sonner@2.0.5: + resolution: {integrity: sha512-YwbHQO6cSso3HBXlbCkgrgzDNIhws14r4MO87Ofy+cV2X7ES4pOoAK3+veSmVTvqNx1BWUxlhPmZzP00Crk2aQ==} + peerDependencies: + react: ^18.0.0 || ^19.0.0 || ^19.0.0-rc + react-dom: ^18.0.0 || ^19.0.0 || ^19.0.0-rc + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + + split2@4.2.0: + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + engines: {node: '>= 10.x'} + + sprintf-js@1.1.3: + resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} + + sqlite3@5.1.7: + resolution: {integrity: sha512-GGIyOiFaG+TUra3JIfkI/zGP8yZYLPQ0pl1bH+ODjiX57sPhrLU5sQJn1y9bDKZUFYkX1crlrPfSYt0BKKdkog==} + + sqlite@5.1.1: + resolution: {integrity: sha512-oBkezXa2hnkfuJwUo44Hl9hS3er+YFtueifoajrgidvqsJRQFpc5fKoAkAor1O5ZnLoa28GBScfHXs8j0K358Q==} + + ssri@8.0.1: + resolution: {integrity: sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==} + engines: {node: '>= 8'} + + stable-hash@0.0.5: + resolution: {integrity: sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==} + + stack-trace@0.0.10: + resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==} + + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + + statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + + statuses@2.0.2: + resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} + engines: {node: '>= 0.8'} + + std-env@3.9.0: + resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} + + stop-iteration-iterator@1.1.0: + resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} + engines: {node: '>= 0.4'} + + streamsearch@1.1.0: + resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} + engines: {node: '>=10.0.0'} + + stremthru@0.8.0: + resolution: {integrity: sha512-Bv17o2mmj3B7NMaJEPYlMYiSgWChGx5FkjYzlaLqwTv8RFeP2wIWwKCHGjLYhDn1EsTvmnv7vh+rdQT/6MxavQ==} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + string.prototype.includes@2.0.1: + resolution: {integrity: sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==} + engines: {node: '>= 0.4'} + + string.prototype.matchall@4.0.12: + resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==} + engines: {node: '>= 0.4'} + + string.prototype.repeat@1.0.0: + resolution: {integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==} + + string.prototype.trim@1.2.10: + resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} + engines: {node: '>= 0.4'} + + string.prototype.trimend@1.0.9: + resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} + engines: {node: '>= 0.4'} + + string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + stringify-entities@4.0.4: + resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + + strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + + strip-json-comments@2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + style-to-js@1.1.17: + resolution: {integrity: sha512-xQcBGDxJb6jjFCTzvQtfiPn6YvvP2O8U1MDIPNfJQlWMYfktPy+iGsHE7cssjs7y84d9fQaK4UF3RIJaAHSoYA==} + + style-to-object@1.0.9: + resolution: {integrity: sha512-G4qppLgKu/k6FwRpHiGiKPaPTFcG3g4wNVX/Qsfu+RqQM30E7Tyu/TEgxcL9PNLF5pdRLwQdE3YKKf+KF2Dzlw==} + + styled-jsx@5.1.6: + resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==} + engines: {node: '>= 12.0.0'} + peerDependencies: + '@babel/core': '*' + babel-plugin-macros: '*' + react: '>= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0' + peerDependenciesMeta: + '@babel/core': + optional: true + babel-plugin-macros: + optional: true + + sucrase@3.35.0: + resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + + super-regex@1.0.0: + resolution: {integrity: sha512-CY8u7DtbvucKuquCmOFEKhr9Besln7n9uN8eFbwcoGYWXOMW07u2o8njWaiXt11ylS3qoGF55pILjRmPlbodyg==} + engines: {node: '>=18'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + tabbable@6.2.0: + resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} + + tailwind-merge@2.6.0: + resolution: {integrity: sha512-P+Vu1qXfzediirmHOC3xKGAYeZtPcV9g76X+xg2FD4tYgR71ewMA35Y3sCz3zhiN/dwefRpJX0yBcgwi1fXNQA==} + + tailwind-scrollbar-hide@1.1.7: + resolution: {integrity: sha512-X324n9OtpTmOMqEgDUEA/RgLrNfBF/jwJdctaPZDzB3mppxJk7TLIDmOreEDm1Bq4R9LSPu4Epf8VSdovNU+iA==} + + tailwindcss-animate@1.0.7: + resolution: {integrity: sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==} + peerDependencies: + tailwindcss: '>=3.0.0 || insiders' + + tailwindcss@3.4.17: + resolution: {integrity: sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==} + engines: {node: '>=14.0.0'} + hasBin: true + + tailwindcss@4.1.11: + resolution: {integrity: sha512-2E9TBm6MDD/xKYe+dvJZAmg3yxIEDNRc0jwlNyDg/4Fil2QcSLjFKGVff0lAf1jjeaArlG/M75Ey/EYr/OJtBA==} + + tapable@2.2.2: + resolution: {integrity: sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==} + engines: {node: '>=6'} + + tar-fs@2.1.3: + resolution: {integrity: sha512-090nwYJDmlhwFwEW3QQl+vaNnxsO2yVsd45eTKRBzSzu+hlb1w2K9inVq5b0ngXuLVqQ4ApvsUHHnu/zQNkWAg==} + + tar-stream@2.2.0: + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} + + tar@6.2.1: + resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} + engines: {node: '>=10'} + + tar@7.4.3: + resolution: {integrity: sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==} + engines: {node: '>=18'} + + text-hex@1.0.0: + resolution: {integrity: sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==} + + thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + + thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + + time-span@5.1.0: + resolution: {integrity: sha512-75voc/9G4rDIJleOo4jPvN4/YC4GRZrY8yy1uU4lwrB3XEQbWve8zXoO5No4eFrGcTAMYyoY67p8jRQdtA1HbA==} + engines: {node: '>=12'} + + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + + tinyexec@0.3.2: + resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + + tinyglobby@0.2.14: + resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} + engines: {node: '>=12.0.0'} + + tinypool@1.1.1: + resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} + engines: {node: ^18.0.0 || >=20.0.0} + + tinyrainbow@1.2.0: + resolution: {integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==} + engines: {node: '>=14.0.0'} + + tinyspy@3.0.2: + resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} + engines: {node: '>=14.0.0'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + + trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + + triple-beam@1.4.1: + resolution: {integrity: sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==} + engines: {node: '>= 14.0.0'} + + trough@2.2.0: + resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} + + ts-api-utils@2.1.0: + resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} + engines: {node: '>=18.12'} + peerDependencies: + typescript: '>=4.8.4' + + ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + + ts-node@10.9.2: + resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + + tsconfig-paths@3.15.0: + resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + tsx@4.20.3: + resolution: {integrity: sha512-qjbnuR9Tr+FJOMBqJCW5ehvIo/buZq7vH7qD7JziU98h6l3qGy0a/yPFjwO+y0/T7GFpNgNAvEcPPVfyT8rrPQ==} + engines: {node: '>=18.0.0'} + hasBin: true + + tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-is@2.0.1: + resolution: {integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==} + engines: {node: '>= 0.6'} + + typed-array-buffer@1.0.3: + resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} + engines: {node: '>= 0.4'} + + typed-array-byte-length@1.0.3: + resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} + engines: {node: '>= 0.4'} + + typed-array-byte-offset@1.0.4: + resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} + engines: {node: '>= 0.4'} + + typed-array-length@1.0.7: + resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} + engines: {node: '>= 0.4'} + + typescript@5.9.2: + resolution: {integrity: sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==} + engines: {node: '>=14.17'} + hasBin: true + + unbox-primitive@1.1.0: + resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} + engines: {node: '>= 0.4'} + + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + + undici-types@7.10.0: + resolution: {integrity: sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==} + + undici@7.13.0: + resolution: {integrity: sha512-l+zSMssRqrzDcb3fjMkjjLGmuiiK2pMIcV++mJaAc9vhjSGpvM7h43QgP+OAMb1GImHmbPyG2tBXeuyG5iY4gA==} + engines: {node: '>=20.18.1'} + + unified@11.0.5: + resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} + + unique-filename@1.1.1: + resolution: {integrity: sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==} + + unique-slug@2.0.2: + resolution: {integrity: sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==} + + unist-util-is@6.0.0: + resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} + + unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + + unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + + unist-util-visit-parents@6.0.1: + resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} + + unist-util-visit@5.0.0: + resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + + unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + + unrs-resolver@1.11.1: + resolution: {integrity: sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==} + + update-browserslist-db@1.1.3: + resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + use-callback-ref@1.3.3: + resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + use-sidecar@1.1.3: + resolution: {integrity: sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + use-sync-external-store@1.5.0: + resolution: {integrity: sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + v8-compile-cache-lib@3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + + vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + + vfile-message@4.0.3: + resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==} + + vfile@6.0.3: + resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + + vite-node@2.1.9: + resolution: {integrity: sha512-AM9aQ/IPrW/6ENLQg3AGY4K1N2TGZdR5e4gu/MmmR2xR3Ll1+dib+nook92g4TV3PXVyeyxdWwtaCAiUL0hMxA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + + vite@5.4.19: + resolution: {integrity: sha512-qO3aKv3HoQC8QKiNSTuUM1l9o/XX3+c+VTgLHbJWHZGeTPVAg2XwazI9UWzoxjIJCGCV2zU60uqMzjeLZuULqA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + + vitest@2.1.9: + resolution: {integrity: sha512-MSmPM9REYqDGBI8439mA4mWhV5sKmDlBKWIYbA3lRb2PTHACE0mgKwA8yQ2xq9vxDTuk4iPrECBAEW2aoFXY0Q==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/node': ^18.0.0 || >=20.0.0 + '@vitest/browser': 2.1.9 + '@vitest/ui': 2.1.9 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + + web-streams-polyfill@3.3.3: + resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} + engines: {node: '>= 8'} + + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + + which-boxed-primitive@1.1.1: + resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} + engines: {node: '>= 0.4'} + + which-builtin-type@1.2.1: + resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} + engines: {node: '>= 0.4'} + + which-collection@1.0.2: + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} + + which-typed-array@1.1.19: + resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==} + engines: {node: '>= 0.4'} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} + engines: {node: '>=8'} + hasBin: true + + wide-align@1.1.5: + resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} + + winston-transport@4.9.0: + resolution: {integrity: sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==} + engines: {node: '>= 12.0.0'} + + winston@3.17.0: + resolution: {integrity: sha512-DLiFIXYC5fMPxaRg832S6F5mJYvePtmO5G9v9IgUFPhXm9/GkXarH/TUrBAVzhTCzAj9anE/+GjrgXp/54nOgw==} + engines: {node: '>= 12.0.0'} + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + xml2js@0.6.2: + resolution: {integrity: sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==} + engines: {node: '>=4.0.0'} + + xmlbuilder@11.0.1: + resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==} + engines: {node: '>=4.0'} + + xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + yallist@5.0.0: + resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} + engines: {node: '>=18'} + + yaml@2.8.1: + resolution: {integrity: sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==} + engines: {node: '>= 14.6'} + hasBin: true + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yn@3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + zod@3.22.0: + resolution: {integrity: sha512-y5KZY/ssf5n7hCGDGGtcJO/EBJEm5Pa+QQvFBeyMOtnFYOSflalxIFFvdaYevPhePcmcKC4aTbFkCcXN7D0O8Q==} + + zod@4.1.5: + resolution: {integrity: sha512-rcUUZqlLJgBC33IT3PNMgsCq6TzLQEG/Ei/KTCU0PedSWRMAXoOUN+4t/0H+Q8bdnLPdqUYnvboJT0bn/229qg==} + + zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + +snapshots: + + '@alloc/quick-lru@5.2.0': {} + + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.12 + '@jridgewell/trace-mapping': 0.3.29 + + '@bufbuild/protobuf@2.7.0': {} + + '@colors/colors@1.6.0': {} + + '@cspotcode/source-map-support@0.8.1': + dependencies: + '@jridgewell/trace-mapping': 0.3.9 + + '@csstools/selector-resolve-nested@3.1.0(postcss-selector-parser@7.1.0)': + dependencies: + postcss-selector-parser: 7.1.0 + + '@csstools/selector-specificity@5.0.0(postcss-selector-parser@7.1.0)': + dependencies: + postcss-selector-parser: 7.1.0 + + '@dabh/diagnostics@2.0.3': + dependencies: + colorspace: 1.1.4 + enabled: 2.0.0 + kuler: 2.0.0 + + '@dnd-kit/accessibility@3.1.1(react@19.1.1)': + dependencies: + react: 19.1.1 + tslib: 2.8.1 + + '@dnd-kit/core@6.3.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + dependencies: + '@dnd-kit/accessibility': 3.1.1(react@19.1.1) + '@dnd-kit/utilities': 3.2.2(react@19.1.1) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + tslib: 2.8.1 + + '@dnd-kit/modifiers@9.0.0(@dnd-kit/core@6.3.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react@19.1.1)': + dependencies: + '@dnd-kit/core': 6.3.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@dnd-kit/utilities': 3.2.2(react@19.1.1) + react: 19.1.1 + tslib: 2.8.1 + + '@dnd-kit/sortable@10.0.0(@dnd-kit/core@6.3.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react@19.1.1)': + dependencies: + '@dnd-kit/core': 6.3.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@dnd-kit/utilities': 3.2.2(react@19.1.1) + react: 19.1.1 + tslib: 2.8.1 + + '@dnd-kit/utilities@3.2.2(react@19.1.1)': + dependencies: + react: 19.1.1 + tslib: 2.8.1 + + '@emnapi/core@1.5.0': + dependencies: + '@emnapi/wasi-threads': 1.1.0 + tslib: 2.8.1 + optional: true + + '@emnapi/runtime@1.5.0': + dependencies: + tslib: 2.8.1 + optional: true + + '@emnapi/wasi-threads@1.1.0': + dependencies: + tslib: 2.8.1 + optional: true + + '@esbuild/aix-ppc64@0.21.5': + optional: true + + '@esbuild/aix-ppc64@0.25.8': + optional: true + + '@esbuild/android-arm64@0.21.5': + optional: true + + '@esbuild/android-arm64@0.25.8': + optional: true + + '@esbuild/android-arm@0.21.5': + optional: true + + '@esbuild/android-arm@0.25.8': + optional: true + + '@esbuild/android-x64@0.21.5': + optional: true + + '@esbuild/android-x64@0.25.8': + optional: true + + '@esbuild/darwin-arm64@0.21.5': + optional: true + + '@esbuild/darwin-arm64@0.25.8': + optional: true + + '@esbuild/darwin-x64@0.21.5': + optional: true + + '@esbuild/darwin-x64@0.25.8': + optional: true + + '@esbuild/freebsd-arm64@0.21.5': + optional: true + + '@esbuild/freebsd-arm64@0.25.8': + optional: true + + '@esbuild/freebsd-x64@0.21.5': + optional: true + + '@esbuild/freebsd-x64@0.25.8': + optional: true + + '@esbuild/linux-arm64@0.21.5': + optional: true + + '@esbuild/linux-arm64@0.25.8': + optional: true + + '@esbuild/linux-arm@0.21.5': + optional: true + + '@esbuild/linux-arm@0.25.8': + optional: true + + '@esbuild/linux-ia32@0.21.5': + optional: true + + '@esbuild/linux-ia32@0.25.8': + optional: true + + '@esbuild/linux-loong64@0.21.5': + optional: true + + '@esbuild/linux-loong64@0.25.8': + optional: true + + '@esbuild/linux-mips64el@0.21.5': + optional: true + + '@esbuild/linux-mips64el@0.25.8': + optional: true + + '@esbuild/linux-ppc64@0.21.5': + optional: true + + '@esbuild/linux-ppc64@0.25.8': + optional: true + + '@esbuild/linux-riscv64@0.21.5': + optional: true + + '@esbuild/linux-riscv64@0.25.8': + optional: true + + '@esbuild/linux-s390x@0.21.5': + optional: true + + '@esbuild/linux-s390x@0.25.8': + optional: true + + '@esbuild/linux-x64@0.21.5': + optional: true + + '@esbuild/linux-x64@0.25.8': + optional: true + + '@esbuild/netbsd-arm64@0.25.8': + optional: true + + '@esbuild/netbsd-x64@0.21.5': + optional: true + + '@esbuild/netbsd-x64@0.25.8': + optional: true + + '@esbuild/openbsd-arm64@0.25.8': + optional: true + + '@esbuild/openbsd-x64@0.21.5': + optional: true + + '@esbuild/openbsd-x64@0.25.8': + optional: true + + '@esbuild/openharmony-arm64@0.25.8': + optional: true + + '@esbuild/sunos-x64@0.21.5': + optional: true + + '@esbuild/sunos-x64@0.25.8': + optional: true + + '@esbuild/win32-arm64@0.21.5': + optional: true + + '@esbuild/win32-arm64@0.25.8': + optional: true + + '@esbuild/win32-ia32@0.21.5': + optional: true + + '@esbuild/win32-ia32@0.25.8': + optional: true + + '@esbuild/win32-x64@0.21.5': + optional: true + + '@esbuild/win32-x64@0.25.8': + optional: true + + '@eslint-community/eslint-utils@4.7.0(eslint@9.32.0(jiti@2.5.1))': + dependencies: + eslint: 9.32.0(jiti@2.5.1) + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.12.1': {} + + '@eslint/config-array@0.21.0': + dependencies: + '@eslint/object-schema': 2.1.6 + debug: 4.4.1 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@eslint/config-helpers@0.3.1': {} + + '@eslint/core@0.15.2': + dependencies: + '@types/json-schema': 7.0.15 + + '@eslint/eslintrc@3.3.1': + dependencies: + ajv: 6.12.6 + debug: 4.4.1 + espree: 10.4.0 + globals: 14.0.0 + ignore: 5.3.2 + import-fresh: 3.3.1 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@9.32.0': {} + + '@eslint/object-schema@2.1.6': {} + + '@eslint/plugin-kit@0.3.5': + dependencies: + '@eslint/core': 0.15.2 + levn: 0.4.1 + + '@floating-ui/core@1.7.3': + dependencies: + '@floating-ui/utils': 0.2.10 + + '@floating-ui/dom@1.7.3': + dependencies: + '@floating-ui/core': 1.7.3 + '@floating-ui/utils': 0.2.10 + + '@floating-ui/react-dom@2.1.5(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + dependencies: + '@floating-ui/dom': 1.7.3 + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + + '@floating-ui/react@0.26.28(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + dependencies: + '@floating-ui/react-dom': 2.1.5(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@floating-ui/utils': 0.2.10 + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + tabbable: 6.2.0 + + '@floating-ui/utils@0.2.10': {} + + '@gar/promisify@1.1.3': + optional: true + + '@grpc/grpc-js@1.13.4': + dependencies: + '@grpc/proto-loader': 0.7.15 + '@js-sdsl/ordered-map': 4.4.2 + + '@grpc/proto-loader@0.7.15': + dependencies: + lodash.camelcase: 4.3.0 + long: 5.3.2 + protobufjs: 7.5.4 + yargs: 17.7.2 + + '@headlessui/react@2.2.7(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + dependencies: + '@floating-ui/react': 0.26.28(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@react-aria/focus': 3.21.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@react-aria/interactions': 3.25.4(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@tanstack/react-virtual': 3.13.12(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + use-sync-external-store: 1.5.0(react@19.1.1) + + '@headlessui/tailwindcss@0.2.2(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@20.19.10)(typescript@5.9.2)))': + dependencies: + tailwindcss: 3.4.17(ts-node@10.9.2(@types/node@20.19.10)(typescript@5.9.2)) + + '@humanfs/core@0.19.1': {} + + '@humanfs/node@0.16.6': + dependencies: + '@humanfs/core': 0.19.1 + '@humanwhocodes/retry': 0.3.1 + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/retry@0.3.1': {} + + '@humanwhocodes/retry@0.4.3': {} + + '@img/sharp-darwin-arm64@0.34.3': + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.2.0 + optional: true + + '@img/sharp-darwin-x64@0.34.3': + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.2.0 + optional: true + + '@img/sharp-libvips-darwin-arm64@1.2.0': + optional: true + + '@img/sharp-libvips-darwin-x64@1.2.0': + optional: true + + '@img/sharp-libvips-linux-arm64@1.2.0': + optional: true + + '@img/sharp-libvips-linux-arm@1.2.0': + optional: true + + '@img/sharp-libvips-linux-ppc64@1.2.0': + optional: true + + '@img/sharp-libvips-linux-s390x@1.2.0': + optional: true + + '@img/sharp-libvips-linux-x64@1.2.0': + optional: true + + '@img/sharp-libvips-linuxmusl-arm64@1.2.0': + optional: true + + '@img/sharp-libvips-linuxmusl-x64@1.2.0': + optional: true + + '@img/sharp-linux-arm64@0.34.3': + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.2.0 + optional: true + + '@img/sharp-linux-arm@0.34.3': + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.2.0 + optional: true + + '@img/sharp-linux-ppc64@0.34.3': + optionalDependencies: + '@img/sharp-libvips-linux-ppc64': 1.2.0 + optional: true + + '@img/sharp-linux-s390x@0.34.3': + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.2.0 + optional: true + + '@img/sharp-linux-x64@0.34.3': + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.2.0 + optional: true + + '@img/sharp-linuxmusl-arm64@0.34.3': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.2.0 + optional: true + + '@img/sharp-linuxmusl-x64@0.34.3': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.2.0 + optional: true + + '@img/sharp-wasm32@0.34.3': + dependencies: + '@emnapi/runtime': 1.5.0 + optional: true + + '@img/sharp-win32-arm64@0.34.3': + optional: true + + '@img/sharp-win32-ia32@0.34.3': + optional: true + + '@img/sharp-win32-x64@0.34.3': + optional: true + + '@internationalized/number@3.6.3': + dependencies: + '@swc/helpers': 0.5.17 + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@isaacs/fs-minipass@4.0.1': + dependencies: + minipass: 7.1.2 + + '@jridgewell/gen-mapping@0.3.12': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.4 + '@jridgewell/trace-mapping': 0.3.29 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/sourcemap-codec@1.5.4': {} + + '@jridgewell/trace-mapping@0.3.29': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.4 + + '@jridgewell/trace-mapping@0.3.9': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.4 + + '@js-sdsl/ordered-map@4.4.2': {} + + '@napi-rs/wasm-runtime@0.2.12': + dependencies: + '@emnapi/core': 1.5.0 + '@emnapi/runtime': 1.5.0 + '@tybys/wasm-util': 0.10.0 + optional: true + + '@next/env@15.3.2': {} + + '@next/eslint-plugin-next@15.3.2': + dependencies: + fast-glob: 3.3.1 + + '@next/swc-darwin-arm64@15.3.2': + optional: true + + '@next/swc-darwin-x64@15.3.2': + optional: true + + '@next/swc-linux-arm64-gnu@15.3.2': + optional: true + + '@next/swc-linux-arm64-musl@15.3.2': + optional: true + + '@next/swc-linux-x64-gnu@15.3.2': + optional: true + + '@next/swc-linux-x64-musl@15.3.2': + optional: true + + '@next/swc-win32-arm64-msvc@15.3.2': + optional: true + + '@next/swc-win32-x64-msvc@15.3.2': + optional: true + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.19.1 + + '@nolyfill/is-core-module@1.0.39': {} + + '@npmcli/fs@1.1.1': + dependencies: + '@gar/promisify': 1.1.3 + semver: 7.7.2 + optional: true + + '@npmcli/move-file@1.1.2': + dependencies: + mkdirp: 1.0.4 + rimraf: 3.0.2 + optional: true + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@protobufjs/aspromise@1.1.2': {} + + '@protobufjs/base64@1.1.2': {} + + '@protobufjs/codegen@2.0.4': {} + + '@protobufjs/eventemitter@1.1.0': {} + + '@protobufjs/fetch@1.1.0': + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/inquire': 1.1.0 + + '@protobufjs/float@1.0.2': {} + + '@protobufjs/inquire@1.1.0': {} + + '@protobufjs/path@1.1.2': {} + + '@protobufjs/pool@1.1.0': {} + + '@protobufjs/utf8@1.1.0': {} + + '@radix-ui/number@1.1.1': {} + + '@radix-ui/primitive@1.1.2': {} + + '@radix-ui/react-accordion@1.2.11(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + dependencies: + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-collapsible': 1.1.11(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-direction': 1.1.1(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.9)(react@19.1.1) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + optionalDependencies: + '@types/react': 19.1.9 + '@types/react-dom': 19.1.7(@types/react@19.1.9) + + '@radix-ui/react-arrow@1.1.7(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + dependencies: + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + optionalDependencies: + '@types/react': 19.1.9 + '@types/react-dom': 19.1.7(@types/react@19.1.9) + + '@radix-ui/react-collapsible@1.1.11(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + dependencies: + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-presence': 1.1.4(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.9)(react@19.1.1) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + optionalDependencies: + '@types/react': 19.1.9 + '@types/react-dom': 19.1.7(@types/react@19.1.9) + + '@radix-ui/react-collection@1.1.7(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-slot': 1.2.3(@types/react@19.1.9)(react@19.1.1) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + optionalDependencies: + '@types/react': 19.1.9 + '@types/react-dom': 19.1.7(@types/react@19.1.9) + + '@radix-ui/react-compose-refs@1.1.2(@types/react@19.1.9)(react@19.1.1)': + dependencies: + react: 19.1.1 + optionalDependencies: + '@types/react': 19.1.9 + + '@radix-ui/react-context@1.1.2(@types/react@19.1.9)(react@19.1.1)': + dependencies: + react: 19.1.1 + optionalDependencies: + '@types/react': 19.1.9 + + '@radix-ui/react-dialog@1.1.14(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + dependencies: + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-dismissable-layer': 1.1.10(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-focus-guards': 1.1.2(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-presence': 1.1.4(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-slot': 1.2.3(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.9)(react@19.1.1) + aria-hidden: 1.2.6 + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + react-remove-scroll: 2.7.1(@types/react@19.1.9)(react@19.1.1) + optionalDependencies: + '@types/react': 19.1.9 + '@types/react-dom': 19.1.7(@types/react@19.1.9) + + '@radix-ui/react-direction@1.1.1(@types/react@19.1.9)(react@19.1.1)': + dependencies: + react: 19.1.1 + optionalDependencies: + '@types/react': 19.1.9 + + '@radix-ui/react-dismissable-layer@1.1.10(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + dependencies: + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.1.9)(react@19.1.1) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + optionalDependencies: + '@types/react': 19.1.9 + '@types/react-dom': 19.1.7(@types/react@19.1.9) + + '@radix-ui/react-dropdown-menu@2.1.15(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + dependencies: + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-menu': 2.1.15(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.9)(react@19.1.1) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + optionalDependencies: + '@types/react': 19.1.9 + '@types/react-dom': 19.1.7(@types/react@19.1.9) + + '@radix-ui/react-focus-guards@1.1.2(@types/react@19.1.9)(react@19.1.1)': + dependencies: + react: 19.1.1 + optionalDependencies: + '@types/react': 19.1.9 + + '@radix-ui/react-focus-scope@1.1.7(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.9)(react@19.1.1) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + optionalDependencies: + '@types/react': 19.1.9 + '@types/react-dom': 19.1.7(@types/react@19.1.9) + + '@radix-ui/react-id@1.1.1(@types/react@19.1.9)(react@19.1.1)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.9)(react@19.1.1) + react: 19.1.1 + optionalDependencies: + '@types/react': 19.1.9 + + '@radix-ui/react-menu@2.1.15(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + dependencies: + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-direction': 1.1.1(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-dismissable-layer': 1.1.10(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-focus-guards': 1.1.2(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-popper': 1.2.7(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-presence': 1.1.4(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-roving-focus': 1.1.10(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-slot': 1.2.3(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.9)(react@19.1.1) + aria-hidden: 1.2.6 + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + react-remove-scroll: 2.7.1(@types/react@19.1.9)(react@19.1.1) + optionalDependencies: + '@types/react': 19.1.9 + '@types/react-dom': 19.1.7(@types/react@19.1.9) + + '@radix-ui/react-password-toggle-field@0.1.2(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + dependencies: + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-use-is-hydrated': 0.1.0(@types/react@19.1.9)(react@19.1.1) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + optionalDependencies: + '@types/react': 19.1.9 + '@types/react-dom': 19.1.7(@types/react@19.1.9) + + '@radix-ui/react-popover@1.1.14(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + dependencies: + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-dismissable-layer': 1.1.10(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-focus-guards': 1.1.2(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-popper': 1.2.7(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-presence': 1.1.4(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-slot': 1.2.3(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.9)(react@19.1.1) + aria-hidden: 1.2.6 + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + react-remove-scroll: 2.7.1(@types/react@19.1.9)(react@19.1.1) + optionalDependencies: + '@types/react': 19.1.9 + '@types/react-dom': 19.1.7(@types/react@19.1.9) + + '@radix-ui/react-popper@1.2.7(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + dependencies: + '@floating-ui/react-dom': 2.1.5(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-arrow': 1.1.7(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-use-rect': 1.1.1(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/rect': 1.1.1 + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + optionalDependencies: + '@types/react': 19.1.9 + '@types/react-dom': 19.1.7(@types/react@19.1.9) + + '@radix-ui/react-portal@1.1.9(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + dependencies: + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.9)(react@19.1.1) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + optionalDependencies: + '@types/react': 19.1.9 + '@types/react-dom': 19.1.7(@types/react@19.1.9) + + '@radix-ui/react-presence@1.1.4(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.9)(react@19.1.1) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + optionalDependencies: + '@types/react': 19.1.9 + '@types/react-dom': 19.1.7(@types/react@19.1.9) + + '@radix-ui/react-primitive@2.1.3(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + dependencies: + '@radix-ui/react-slot': 1.2.3(@types/react@19.1.9)(react@19.1.1) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + optionalDependencies: + '@types/react': 19.1.9 + '@types/react-dom': 19.1.7(@types/react@19.1.9) + + '@radix-ui/react-roving-focus@1.1.10(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + dependencies: + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-direction': 1.1.1(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.9)(react@19.1.1) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + optionalDependencies: + '@types/react': 19.1.9 + '@types/react-dom': 19.1.7(@types/react@19.1.9) + + '@radix-ui/react-select@2.2.5(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + dependencies: + '@radix-ui/number': 1.1.1 + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-direction': 1.1.1(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-dismissable-layer': 1.1.10(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-focus-guards': 1.1.2(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-popper': 1.2.7(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-slot': 1.2.3(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + aria-hidden: 1.2.6 + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + react-remove-scroll: 2.7.1(@types/react@19.1.9)(react@19.1.1) + optionalDependencies: + '@types/react': 19.1.9 + '@types/react-dom': 19.1.7(@types/react@19.1.9) + + '@radix-ui/react-separator@1.1.7(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + dependencies: + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + optionalDependencies: + '@types/react': 19.1.9 + '@types/react-dom': 19.1.7(@types/react@19.1.9) + + '@radix-ui/react-slider@1.3.5(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + dependencies: + '@radix-ui/number': 1.1.1 + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-direction': 1.1.1(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.1.9)(react@19.1.1) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + optionalDependencies: + '@types/react': 19.1.9 + '@types/react-dom': 19.1.7(@types/react@19.1.9) + + '@radix-ui/react-slot@1.2.3(@types/react@19.1.9)(react@19.1.1)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.9)(react@19.1.1) + react: 19.1.1 + optionalDependencies: + '@types/react': 19.1.9 + + '@radix-ui/react-switch@1.2.5(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + dependencies: + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.1.9)(react@19.1.1) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + optionalDependencies: + '@types/react': 19.1.9 + '@types/react-dom': 19.1.7(@types/react@19.1.9) + + '@radix-ui/react-tabs@1.1.12(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + dependencies: + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-context': 1.1.2(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-direction': 1.1.1(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-presence': 1.1.4(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-roving-focus': 1.1.10(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.9)(react@19.1.1) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + optionalDependencies: + '@types/react': 19.1.9 + '@types/react-dom': 19.1.7(@types/react@19.1.9) + + '@radix-ui/react-tooltip@1.2.7(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + dependencies: + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-dismissable-layer': 1.1.10(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-popper': 1.2.7(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-presence': 1.1.4(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-slot': 1.2.3(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + optionalDependencies: + '@types/react': 19.1.9 + '@types/react-dom': 19.1.7(@types/react@19.1.9) + + '@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.1.9)(react@19.1.1)': + dependencies: + react: 19.1.1 + optionalDependencies: + '@types/react': 19.1.9 + + '@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.1.9)(react@19.1.1)': + dependencies: + '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.9)(react@19.1.1) + react: 19.1.1 + optionalDependencies: + '@types/react': 19.1.9 + + '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.1.9)(react@19.1.1)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.9)(react@19.1.1) + react: 19.1.1 + optionalDependencies: + '@types/react': 19.1.9 + + '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@19.1.9)(react@19.1.1)': + dependencies: + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.9)(react@19.1.1) + react: 19.1.1 + optionalDependencies: + '@types/react': 19.1.9 + + '@radix-ui/react-use-is-hydrated@0.1.0(@types/react@19.1.9)(react@19.1.1)': + dependencies: + react: 19.1.1 + use-sync-external-store: 1.5.0(react@19.1.1) + optionalDependencies: + '@types/react': 19.1.9 + + '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.1.9)(react@19.1.1)': + dependencies: + react: 19.1.1 + optionalDependencies: + '@types/react': 19.1.9 + + '@radix-ui/react-use-previous@1.1.1(@types/react@19.1.9)(react@19.1.1)': + dependencies: + react: 19.1.1 + optionalDependencies: + '@types/react': 19.1.9 + + '@radix-ui/react-use-rect@1.1.1(@types/react@19.1.9)(react@19.1.1)': + dependencies: + '@radix-ui/rect': 1.1.1 + react: 19.1.1 + optionalDependencies: + '@types/react': 19.1.9 + + '@radix-ui/react-use-size@1.1.1(@types/react@19.1.9)(react@19.1.1)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.9)(react@19.1.1) + react: 19.1.1 + optionalDependencies: + '@types/react': 19.1.9 + + '@radix-ui/react-visually-hidden@1.2.3(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + dependencies: + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + optionalDependencies: + '@types/react': 19.1.9 + '@types/react-dom': 19.1.7(@types/react@19.1.9) + + '@radix-ui/rect@1.1.1': {} + + '@react-aria/focus@3.21.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + dependencies: + '@react-aria/interactions': 3.25.4(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@react-aria/utils': 3.30.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@react-types/shared': 3.31.0(react@19.1.1) + '@swc/helpers': 0.5.17 + clsx: 2.1.1 + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + + '@react-aria/interactions@3.25.4(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + dependencies: + '@react-aria/ssr': 3.9.10(react@19.1.1) + '@react-aria/utils': 3.30.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@react-stately/flags': 3.1.2 + '@react-types/shared': 3.31.0(react@19.1.1) + '@swc/helpers': 0.5.17 + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + + '@react-aria/ssr@3.9.10(react@19.1.1)': + dependencies: + '@swc/helpers': 0.5.17 + react: 19.1.1 + + '@react-aria/utils@3.30.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + dependencies: + '@react-aria/ssr': 3.9.10(react@19.1.1) + '@react-stately/flags': 3.1.2 + '@react-stately/utils': 3.10.8(react@19.1.1) + '@react-types/shared': 3.31.0(react@19.1.1) + '@swc/helpers': 0.5.17 + clsx: 2.1.1 + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + + '@react-stately/flags@3.1.2': + dependencies: + '@swc/helpers': 0.5.17 + + '@react-stately/utils@3.10.8(react@19.1.1)': + dependencies: + '@swc/helpers': 0.5.17 + react: 19.1.1 + + '@react-types/shared@3.31.0(react@19.1.1)': + dependencies: + react: 19.1.1 + + '@redis/bloom@5.8.2(@redis/client@5.8.2)': + dependencies: + '@redis/client': 5.8.2 + + '@redis/client@5.8.2': + dependencies: + cluster-key-slot: 1.1.2 + + '@redis/json@5.8.2(@redis/client@5.8.2)': + dependencies: + '@redis/client': 5.8.2 + + '@redis/search@5.8.2(@redis/client@5.8.2)': + dependencies: + '@redis/client': 5.8.2 + + '@redis/time-series@5.8.2(@redis/client@5.8.2)': + dependencies: + '@redis/client': 5.8.2 + + '@rollup/rollup-android-arm-eabi@4.46.2': + optional: true + + '@rollup/rollup-android-arm64@4.46.2': + optional: true + + '@rollup/rollup-darwin-arm64@4.46.2': + optional: true + + '@rollup/rollup-darwin-x64@4.46.2': + optional: true + + '@rollup/rollup-freebsd-arm64@4.46.2': + optional: true + + '@rollup/rollup-freebsd-x64@4.46.2': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.46.2': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.46.2': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.46.2': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.46.2': + optional: true + + '@rollup/rollup-linux-loongarch64-gnu@4.46.2': + optional: true + + '@rollup/rollup-linux-ppc64-gnu@4.46.2': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.46.2': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.46.2': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.46.2': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.46.2': + optional: true + + '@rollup/rollup-linux-x64-musl@4.46.2': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.46.2': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.46.2': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.46.2': + optional: true + + '@rtsao/scc@1.1.0': {} + + '@rushstack/eslint-patch@1.12.0': {} + + '@swc/counter@0.1.3': {} + + '@swc/helpers@0.5.15': + dependencies: + tslib: 2.8.1 + + '@swc/helpers@0.5.17': + dependencies: + tslib: 2.8.1 + + '@tailwindcss/forms@0.5.10(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@20.19.10)(typescript@5.9.2)))': + dependencies: + mini-svg-data-uri: 1.4.4 + tailwindcss: 3.4.17(ts-node@10.9.2(@types/node@20.19.10)(typescript@5.9.2)) + + '@tailwindcss/node@4.1.11': + dependencies: + '@ampproject/remapping': 2.3.0 + enhanced-resolve: 5.18.3 + jiti: 2.5.1 + lightningcss: 1.30.1 + magic-string: 0.30.17 + source-map-js: 1.2.1 + tailwindcss: 4.1.11 + + '@tailwindcss/oxide-android-arm64@4.1.11': + optional: true + + '@tailwindcss/oxide-darwin-arm64@4.1.11': + optional: true + + '@tailwindcss/oxide-darwin-x64@4.1.11': + optional: true + + '@tailwindcss/oxide-freebsd-x64@4.1.11': + optional: true + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.11': + optional: true + + '@tailwindcss/oxide-linux-arm64-gnu@4.1.11': + optional: true + + '@tailwindcss/oxide-linux-arm64-musl@4.1.11': + optional: true + + '@tailwindcss/oxide-linux-x64-gnu@4.1.11': + optional: true + + '@tailwindcss/oxide-linux-x64-musl@4.1.11': + optional: true + + '@tailwindcss/oxide-wasm32-wasi@4.1.11': + optional: true + + '@tailwindcss/oxide-win32-arm64-msvc@4.1.11': + optional: true + + '@tailwindcss/oxide-win32-x64-msvc@4.1.11': + optional: true + + '@tailwindcss/oxide@4.1.11': + dependencies: + detect-libc: 2.0.4 + tar: 7.4.3 + optionalDependencies: + '@tailwindcss/oxide-android-arm64': 4.1.11 + '@tailwindcss/oxide-darwin-arm64': 4.1.11 + '@tailwindcss/oxide-darwin-x64': 4.1.11 + '@tailwindcss/oxide-freebsd-x64': 4.1.11 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.11 + '@tailwindcss/oxide-linux-arm64-gnu': 4.1.11 + '@tailwindcss/oxide-linux-arm64-musl': 4.1.11 + '@tailwindcss/oxide-linux-x64-gnu': 4.1.11 + '@tailwindcss/oxide-linux-x64-musl': 4.1.11 + '@tailwindcss/oxide-wasm32-wasi': 4.1.11 + '@tailwindcss/oxide-win32-arm64-msvc': 4.1.11 + '@tailwindcss/oxide-win32-x64-msvc': 4.1.11 + + '@tailwindcss/postcss@4.1.11': + dependencies: + '@alloc/quick-lru': 5.2.0 + '@tailwindcss/node': 4.1.11 + '@tailwindcss/oxide': 4.1.11 + postcss: 8.5.6 + tailwindcss: 4.1.11 + + '@tailwindcss/typography@0.5.16(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@20.19.10)(typescript@5.9.2)))': + dependencies: + lodash.castarray: 4.4.0 + lodash.isplainobject: 4.0.6 + lodash.merge: 4.6.2 + postcss-selector-parser: 6.0.10 + tailwindcss: 3.4.17(ts-node@10.9.2(@types/node@20.19.10)(typescript@5.9.2)) + + '@tanstack/react-virtual@3.13.12(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + dependencies: + '@tanstack/virtual-core': 3.13.12 + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + + '@tanstack/virtual-core@3.13.12': {} + + '@tootallnate/once@1.1.2': + optional: true + + '@torbox/torbox-api@https://codeload.github.com/viren070/torbox-sdk-js/tar.gz/dc1d0bc148dd35fa5e5d39f699f070aadeccad5c': + dependencies: + zod: 3.22.0 + + '@tsconfig/node10@1.0.11': {} + + '@tsconfig/node12@1.0.11': {} + + '@tsconfig/node14@1.0.3': {} + + '@tsconfig/node16@1.0.4': {} + + '@tybys/wasm-util@0.10.0': + dependencies: + tslib: 2.8.1 + optional: true + + '@types/bcrypt@5.0.2': + dependencies: + '@types/node': 24.2.1 + + '@types/body-parser@1.19.6': + dependencies: + '@types/connect': 3.4.38 + '@types/node': 20.19.10 + + '@types/bytes@3.1.5': {} + + '@types/connect@3.4.38': + dependencies: + '@types/node': 20.19.10 + + '@types/debug@4.1.12': + dependencies: + '@types/ms': 2.1.0 + + '@types/estree-jsx@1.0.5': + dependencies: + '@types/estree': 1.0.8 + + '@types/estree@1.0.8': {} + + '@types/express-rate-limit@5.1.3': + dependencies: + '@types/express': 5.0.3 + + '@types/express-serve-static-core@5.0.7': + dependencies: + '@types/node': 20.19.10 + '@types/qs': 6.14.0 + '@types/range-parser': 1.2.7 + '@types/send': 0.17.5 + + '@types/express@5.0.3': + dependencies: + '@types/body-parser': 1.19.6 + '@types/express-serve-static-core': 5.0.7 + '@types/serve-static': 1.15.8 + + '@types/hast@3.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/http-errors@2.0.5': {} + + '@types/json-schema@7.0.15': {} + + '@types/json5@0.0.29': {} + + '@types/mdast@4.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/mime@1.3.5': {} + + '@types/ms@2.1.0': {} + + '@types/node-fetch@2.6.13': + dependencies: + '@types/node': 20.19.10 + form-data: 4.0.4 + + '@types/node@20.19.10': + dependencies: + undici-types: 6.21.0 + + '@types/node@24.2.1': + dependencies: + undici-types: 7.10.0 + + '@types/pg@8.15.5': + dependencies: + '@types/node': 24.2.1 + pg-protocol: 1.10.3 + pg-types: 2.2.0 + + '@types/qs@6.14.0': {} + + '@types/range-parser@1.2.7': {} + + '@types/react-dom@19.1.7(@types/react@19.1.9)': + dependencies: + '@types/react': 19.1.9 + + '@types/react@19.1.9': + dependencies: + csstype: 3.1.3 + + '@types/send@0.17.5': + dependencies: + '@types/mime': 1.3.5 + '@types/node': 20.19.10 + + '@types/serve-static@1.15.8': + dependencies: + '@types/http-errors': 2.0.5 + '@types/node': 20.19.10 + '@types/send': 0.17.5 + + '@types/triple-beam@1.3.5': {} + + '@types/unist@2.0.11': {} + + '@types/unist@3.0.3': {} + + '@types/xml2js@0.4.14': + dependencies: + '@types/node': 20.19.10 + + '@typescript-eslint/eslint-plugin@8.39.0(@typescript-eslint/parser@8.39.0(eslint@9.32.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.32.0(jiti@2.5.1))(typescript@5.9.2)': + dependencies: + '@eslint-community/regexpp': 4.12.1 + '@typescript-eslint/parser': 8.39.0(eslint@9.32.0(jiti@2.5.1))(typescript@5.9.2) + '@typescript-eslint/scope-manager': 8.39.0 + '@typescript-eslint/type-utils': 8.39.0(eslint@9.32.0(jiti@2.5.1))(typescript@5.9.2) + '@typescript-eslint/utils': 8.39.0(eslint@9.32.0(jiti@2.5.1))(typescript@5.9.2) + '@typescript-eslint/visitor-keys': 8.39.0 + eslint: 9.32.0(jiti@2.5.1) + graphemer: 1.4.0 + ignore: 7.0.5 + natural-compare: 1.4.0 + ts-api-utils: 2.1.0(typescript@5.9.2) + typescript: 5.9.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@8.39.0(eslint@9.32.0(jiti@2.5.1))(typescript@5.9.2)': + dependencies: + '@typescript-eslint/scope-manager': 8.39.0 + '@typescript-eslint/types': 8.39.0 + '@typescript-eslint/typescript-estree': 8.39.0(typescript@5.9.2) + '@typescript-eslint/visitor-keys': 8.39.0 + debug: 4.4.1 + eslint: 9.32.0(jiti@2.5.1) + typescript: 5.9.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/project-service@8.39.0(typescript@5.9.2)': + dependencies: + '@typescript-eslint/tsconfig-utils': 8.39.0(typescript@5.9.2) + '@typescript-eslint/types': 8.39.0 + debug: 4.4.1 + typescript: 5.9.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@8.39.0': + dependencies: + '@typescript-eslint/types': 8.39.0 + '@typescript-eslint/visitor-keys': 8.39.0 + + '@typescript-eslint/tsconfig-utils@8.39.0(typescript@5.9.2)': + dependencies: + typescript: 5.9.2 + + '@typescript-eslint/type-utils@8.39.0(eslint@9.32.0(jiti@2.5.1))(typescript@5.9.2)': + dependencies: + '@typescript-eslint/types': 8.39.0 + '@typescript-eslint/typescript-estree': 8.39.0(typescript@5.9.2) + '@typescript-eslint/utils': 8.39.0(eslint@9.32.0(jiti@2.5.1))(typescript@5.9.2) + debug: 4.4.1 + eslint: 9.32.0(jiti@2.5.1) + ts-api-utils: 2.1.0(typescript@5.9.2) + typescript: 5.9.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@8.39.0': {} + + '@typescript-eslint/typescript-estree@8.39.0(typescript@5.9.2)': + dependencies: + '@typescript-eslint/project-service': 8.39.0(typescript@5.9.2) + '@typescript-eslint/tsconfig-utils': 8.39.0(typescript@5.9.2) + '@typescript-eslint/types': 8.39.0 + '@typescript-eslint/visitor-keys': 8.39.0 + debug: 4.4.1 + fast-glob: 3.3.3 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.7.2 + ts-api-utils: 2.1.0(typescript@5.9.2) + typescript: 5.9.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@8.39.0(eslint@9.32.0(jiti@2.5.1))(typescript@5.9.2)': + dependencies: + '@eslint-community/eslint-utils': 4.7.0(eslint@9.32.0(jiti@2.5.1)) + '@typescript-eslint/scope-manager': 8.39.0 + '@typescript-eslint/types': 8.39.0 + '@typescript-eslint/typescript-estree': 8.39.0(typescript@5.9.2) + eslint: 9.32.0(jiti@2.5.1) + typescript: 5.9.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/visitor-keys@8.39.0': + dependencies: + '@typescript-eslint/types': 8.39.0 + eslint-visitor-keys: 4.2.1 + + '@ungap/structured-clone@1.3.0': {} + + '@unrs/resolver-binding-android-arm-eabi@1.11.1': + optional: true + + '@unrs/resolver-binding-android-arm64@1.11.1': + optional: true + + '@unrs/resolver-binding-darwin-arm64@1.11.1': + optional: true + + '@unrs/resolver-binding-darwin-x64@1.11.1': + optional: true + + '@unrs/resolver-binding-freebsd-x64@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-arm-musleabihf@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-arm64-gnu@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-arm64-musl@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-ppc64-gnu@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-riscv64-gnu@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-riscv64-musl@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-s390x-gnu@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-x64-gnu@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-x64-musl@1.11.1': + optional: true + + '@unrs/resolver-binding-wasm32-wasi@1.11.1': + dependencies: + '@napi-rs/wasm-runtime': 0.2.12 + optional: true + + '@unrs/resolver-binding-win32-arm64-msvc@1.11.1': + optional: true + + '@unrs/resolver-binding-win32-ia32-msvc@1.11.1': + optional: true + + '@unrs/resolver-binding-win32-x64-msvc@1.11.1': + optional: true + + '@vitest/expect@2.1.9': + dependencies: + '@vitest/spy': 2.1.9 + '@vitest/utils': 2.1.9 + chai: 5.2.1 + tinyrainbow: 1.2.0 + + '@vitest/mocker@2.1.9(vite@5.4.19(@types/node@24.2.1)(lightningcss@1.30.1))': + dependencies: + '@vitest/spy': 2.1.9 + estree-walker: 3.0.3 + magic-string: 0.30.17 + optionalDependencies: + vite: 5.4.19(@types/node@24.2.1)(lightningcss@1.30.1) + + '@vitest/pretty-format@2.1.9': + dependencies: + tinyrainbow: 1.2.0 + + '@vitest/runner@2.1.9': + dependencies: + '@vitest/utils': 2.1.9 + pathe: 1.1.2 + + '@vitest/snapshot@2.1.9': + dependencies: + '@vitest/pretty-format': 2.1.9 + magic-string: 0.30.17 + pathe: 1.1.2 + + '@vitest/spy@2.1.9': + dependencies: + tinyspy: 3.0.2 + + '@vitest/utils@2.1.9': + dependencies: + '@vitest/pretty-format': 2.1.9 + loupe: 3.2.0 + tinyrainbow: 1.2.0 + + '@zag-js/anatomy@1.21.1': {} + + '@zag-js/core@1.21.1': + dependencies: + '@zag-js/dom-query': 1.21.1 + '@zag-js/utils': 1.21.1 + + '@zag-js/dom-query@1.21.1': + dependencies: + '@zag-js/types': 1.21.1 + + '@zag-js/number-input@1.21.1': + dependencies: + '@internationalized/number': 3.6.3 + '@zag-js/anatomy': 1.21.1 + '@zag-js/core': 1.21.1 + '@zag-js/dom-query': 1.21.1 + '@zag-js/types': 1.21.1 + '@zag-js/utils': 1.21.1 + + '@zag-js/react@1.21.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + dependencies: + '@zag-js/core': 1.21.1 + '@zag-js/store': 1.21.1 + '@zag-js/types': 1.21.1 + '@zag-js/utils': 1.21.1 + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + + '@zag-js/store@1.21.1': + dependencies: + proxy-compare: 3.0.1 + + '@zag-js/types@1.21.1': + dependencies: + csstype: 3.1.3 + + '@zag-js/utils@1.21.1': {} + + abbrev@1.1.1: + optional: true + + accepts@2.0.0: + dependencies: + mime-types: 3.0.1 + negotiator: 1.0.0 + + acorn-jsx@5.3.2(acorn@8.15.0): + dependencies: + acorn: 8.15.0 + + acorn-walk@8.3.4: + dependencies: + acorn: 8.15.0 + + acorn@8.15.0: {} + + agent-base@6.0.2: + dependencies: + debug: 4.4.1 + transitivePeerDependencies: + - supports-color + optional: true + + agentkeepalive@4.6.0: + dependencies: + humanize-ms: 1.2.1 + optional: true + + aggregate-error@3.1.0: + dependencies: + clean-stack: 2.2.0 + indent-string: 4.0.0 + optional: true + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ansi-regex@5.0.1: {} + + ansi-regex@6.1.0: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@6.2.1: {} + + any-promise@1.3.0: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + aproba@2.1.0: + optional: true + + are-we-there-yet@3.0.1: + dependencies: + delegates: 1.0.0 + readable-stream: 3.6.2 + optional: true + + arg@4.1.3: {} + + arg@5.0.2: {} + + argparse@2.0.1: {} + + aria-hidden@1.2.6: + dependencies: + tslib: 2.8.1 + + aria-query@5.3.2: {} + + array-buffer-byte-length@1.0.2: + dependencies: + call-bound: 1.0.4 + is-array-buffer: 3.0.5 + + array-includes@3.1.9: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + is-string: 1.1.1 + math-intrinsics: 1.1.0 + + array.prototype.findlast@1.2.5: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + es-shim-unscopables: 1.1.0 + + array.prototype.findlastindex@1.2.6: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + es-shim-unscopables: 1.1.0 + + array.prototype.flat@1.3.3: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-shim-unscopables: 1.1.0 + + array.prototype.flatmap@1.3.3: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-shim-unscopables: 1.1.0 + + array.prototype.tosorted@1.1.4: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-errors: 1.3.0 + es-shim-unscopables: 1.1.0 + + arraybuffer.prototype.slice@1.0.4: + dependencies: + array-buffer-byte-length: 1.0.2 + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + is-array-buffer: 3.0.5 + + assertion-error@2.0.1: {} + + ast-types-flow@0.0.8: {} + + async-function@1.0.0: {} + + async@3.2.6: {} + + asynckit@0.4.0: {} + + autoprefixer@10.4.21(postcss@8.5.6): + dependencies: + browserslist: 4.25.1 + caniuse-lite: 1.0.30001733 + fraction.js: 4.3.7 + normalize-range: 0.1.2 + picocolors: 1.1.1 + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + available-typed-arrays@1.0.7: + dependencies: + possible-typed-array-names: 1.1.0 + + axe-core@4.10.3: {} + + axobject-query@4.1.0: {} + + bail@2.0.2: {} + + balanced-match@1.0.2: {} + + base64-js@1.5.1: {} + + bcrypt@6.0.0: + dependencies: + node-addon-api: 8.5.0 + node-gyp-build: 4.8.4 + + binary-extensions@2.3.0: {} + + bindings@1.5.0: + dependencies: + file-uri-to-path: 1.0.0 + + bl@4.1.0: + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + + body-parser@2.2.0: + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 4.4.1 + http-errors: 2.0.0 + iconv-lite: 0.6.3 + on-finished: 2.4.1 + qs: 6.14.0 + raw-body: 3.0.0 + type-is: 2.0.1 + transitivePeerDependencies: + - supports-color + + brace-expansion@1.1.12: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.2: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + browserslist@4.25.1: + dependencies: + caniuse-lite: 1.0.30001733 + electron-to-chromium: 1.5.199 + node-releases: 2.0.19 + update-browserslist-db: 1.1.3(browserslist@4.25.1) + + buffer@5.7.1: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + busboy@1.6.0: + dependencies: + streamsearch: 1.1.0 + + bytes@3.1.2: {} + + cac@6.7.14: {} + + cacache@15.3.0: + dependencies: + '@npmcli/fs': 1.1.1 + '@npmcli/move-file': 1.1.2 + chownr: 2.0.0 + fs-minipass: 2.1.0 + glob: 7.2.3 + infer-owner: 1.0.4 + lru-cache: 6.0.0 + minipass: 3.3.6 + minipass-collect: 1.0.2 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + mkdirp: 1.0.4 + p-map: 4.0.0 + promise-inflight: 1.0.1 + rimraf: 3.0.2 + ssri: 8.0.1 + tar: 6.2.1 + unique-filename: 1.1.1 + transitivePeerDependencies: + - bluebird + optional: true + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bind@1.0.8: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + get-intrinsic: 1.3.0 + set-function-length: 1.2.2 + + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + + callsites@3.1.0: {} + + camelcase-css@2.0.1: {} + + caniuse-lite@1.0.30001733: {} + + ccount@2.0.1: {} + + chai@5.2.1: + dependencies: + assertion-error: 2.0.1 + check-error: 2.1.1 + deep-eql: 5.0.2 + loupe: 3.2.0 + pathval: 2.0.1 + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + character-entities-html4@2.1.0: {} + + character-entities-legacy@3.0.0: {} + + character-entities@2.0.2: {} + + character-reference-invalid@2.0.1: {} + + check-error@2.1.1: {} + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + chownr@1.1.4: {} + + chownr@2.0.0: {} + + chownr@3.0.0: {} + + class-variance-authority@0.7.1: + dependencies: + clsx: 2.1.1 + + clean-stack@2.2.0: + optional: true + + client-only@0.0.1: {} + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + clsx@2.1.1: {} + + cluster-key-slot@1.1.2: {} + + cmdk@1.1.1(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1): + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-dialog': 1.1.14(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + + color-convert@1.9.3: + dependencies: + color-name: 1.1.3 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.3: {} + + color-name@1.1.4: {} + + color-string@1.9.1: + dependencies: + color-name: 1.1.4 + simple-swizzle: 0.2.2 + + color-support@1.1.3: + optional: true + + color@3.2.1: + dependencies: + color-convert: 1.9.3 + color-string: 1.9.1 + + color@4.2.3: + dependencies: + color-convert: 2.0.1 + color-string: 1.9.1 + optional: true + + colorspace@1.1.4: + dependencies: + color: 3.2.1 + text-hex: 1.0.0 + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + comma-separated-tokens@2.0.3: {} + + commander@4.1.1: {} + + concat-map@0.0.1: {} + + console-control-strings@1.1.0: + optional: true + + content-disposition@1.0.0: + dependencies: + safe-buffer: 5.2.1 + + content-type@1.0.5: {} + + convert-hrtime@5.0.0: {} + + cookie-signature@1.2.2: {} + + cookie@0.7.1: {} + + create-require@1.1.1: {} + + cross-env@7.0.3: + dependencies: + cross-spawn: 7.0.6 + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + cssesc@3.0.0: {} + + csstype@3.1.3: {} + + damerau-levenshtein@1.0.8: {} + + data-uri-to-buffer@4.0.1: {} + + data-view-buffer@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-length@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-offset@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + debug@3.2.7: + dependencies: + ms: 2.1.3 + + debug@4.4.1: + dependencies: + ms: 2.1.3 + + decode-named-character-reference@1.2.0: + dependencies: + character-entities: 2.0.2 + + decompress-response@6.0.0: + dependencies: + mimic-response: 3.1.0 + + deep-eql@5.0.2: {} + + deep-extend@0.6.0: {} + + deep-is@0.1.4: {} + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + + define-properties@1.2.1: + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + + delayed-stream@1.0.0: {} + + delegates@1.0.0: + optional: true + + depd@2.0.0: {} + + dequal@2.0.3: {} + + detect-libc@2.0.4: {} + + detect-node-es@1.1.0: {} + + devlop@1.1.0: + dependencies: + dequal: 2.0.3 + + didyoumean@1.2.2: {} + + diff@4.0.2: {} + + dlv@1.1.3: {} + + doctrine@2.1.0: + dependencies: + esutils: 2.0.3 + + dotenv@16.6.1: {} + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + eastasianwidth@0.2.0: {} + + ee-first@1.1.1: {} + + electron-to-chromium@1.5.199: {} + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + enabled@2.0.0: {} + + encodeurl@2.0.0: {} + + encoding@0.1.13: + dependencies: + iconv-lite: 0.6.3 + optional: true + + end-of-stream@1.4.5: + dependencies: + once: 1.4.0 + + enhanced-resolve@5.18.3: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.2 + + env-paths@2.2.1: + optional: true + + envalid@8.1.0: + dependencies: + tslib: 2.8.1 + + err-code@2.0.3: + optional: true + + es-abstract@1.24.0: + dependencies: + array-buffer-byte-length: 1.0.2 + arraybuffer.prototype.slice: 1.0.4 + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 + data-view-buffer: 1.0.2 + data-view-byte-length: 1.0.2 + data-view-byte-offset: 1.0.1 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + es-set-tostringtag: 2.1.0 + es-to-primitive: 1.3.0 + function.prototype.name: 1.1.8 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + get-symbol-description: 1.1.0 + globalthis: 1.0.4 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + has-proto: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + internal-slot: 1.1.0 + is-array-buffer: 3.0.5 + is-callable: 1.2.7 + is-data-view: 1.0.2 + is-negative-zero: 2.0.3 + is-regex: 1.2.1 + is-set: 2.0.3 + is-shared-array-buffer: 1.0.4 + is-string: 1.1.1 + is-typed-array: 1.1.15 + is-weakref: 1.1.1 + math-intrinsics: 1.1.0 + object-inspect: 1.13.4 + object-keys: 1.1.1 + object.assign: 4.1.7 + own-keys: 1.0.1 + regexp.prototype.flags: 1.5.4 + safe-array-concat: 1.1.3 + safe-push-apply: 1.0.0 + safe-regex-test: 1.1.0 + set-proto: 1.0.0 + stop-iteration-iterator: 1.1.0 + string.prototype.trim: 1.2.10 + string.prototype.trimend: 1.0.9 + string.prototype.trimstart: 1.0.8 + typed-array-buffer: 1.0.3 + typed-array-byte-length: 1.0.3 + typed-array-byte-offset: 1.0.4 + typed-array-length: 1.0.7 + unbox-primitive: 1.1.0 + which-typed-array: 1.1.19 + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-iterator-helpers@1.2.1: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-errors: 1.3.0 + es-set-tostringtag: 2.1.0 + function-bind: 1.1.2 + get-intrinsic: 1.3.0 + globalthis: 1.0.4 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + has-proto: 1.2.0 + has-symbols: 1.1.0 + internal-slot: 1.1.0 + iterator.prototype: 1.1.5 + safe-array-concat: 1.1.3 + + es-module-lexer@1.7.0: {} + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + es-shim-unscopables@1.1.0: + dependencies: + hasown: 2.0.2 + + es-to-primitive@1.3.0: + dependencies: + is-callable: 1.2.7 + is-date-object: 1.1.0 + is-symbol: 1.1.1 + + esbuild@0.21.5: + optionalDependencies: + '@esbuild/aix-ppc64': 0.21.5 + '@esbuild/android-arm': 0.21.5 + '@esbuild/android-arm64': 0.21.5 + '@esbuild/android-x64': 0.21.5 + '@esbuild/darwin-arm64': 0.21.5 + '@esbuild/darwin-x64': 0.21.5 + '@esbuild/freebsd-arm64': 0.21.5 + '@esbuild/freebsd-x64': 0.21.5 + '@esbuild/linux-arm': 0.21.5 + '@esbuild/linux-arm64': 0.21.5 + '@esbuild/linux-ia32': 0.21.5 + '@esbuild/linux-loong64': 0.21.5 + '@esbuild/linux-mips64el': 0.21.5 + '@esbuild/linux-ppc64': 0.21.5 + '@esbuild/linux-riscv64': 0.21.5 + '@esbuild/linux-s390x': 0.21.5 + '@esbuild/linux-x64': 0.21.5 + '@esbuild/netbsd-x64': 0.21.5 + '@esbuild/openbsd-x64': 0.21.5 + '@esbuild/sunos-x64': 0.21.5 + '@esbuild/win32-arm64': 0.21.5 + '@esbuild/win32-ia32': 0.21.5 + '@esbuild/win32-x64': 0.21.5 + + esbuild@0.25.8: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.8 + '@esbuild/android-arm': 0.25.8 + '@esbuild/android-arm64': 0.25.8 + '@esbuild/android-x64': 0.25.8 + '@esbuild/darwin-arm64': 0.25.8 + '@esbuild/darwin-x64': 0.25.8 + '@esbuild/freebsd-arm64': 0.25.8 + '@esbuild/freebsd-x64': 0.25.8 + '@esbuild/linux-arm': 0.25.8 + '@esbuild/linux-arm64': 0.25.8 + '@esbuild/linux-ia32': 0.25.8 + '@esbuild/linux-loong64': 0.25.8 + '@esbuild/linux-mips64el': 0.25.8 + '@esbuild/linux-ppc64': 0.25.8 + '@esbuild/linux-riscv64': 0.25.8 + '@esbuild/linux-s390x': 0.25.8 + '@esbuild/linux-x64': 0.25.8 + '@esbuild/netbsd-arm64': 0.25.8 + '@esbuild/netbsd-x64': 0.25.8 + '@esbuild/openbsd-arm64': 0.25.8 + '@esbuild/openbsd-x64': 0.25.8 + '@esbuild/openharmony-arm64': 0.25.8 + '@esbuild/sunos-x64': 0.25.8 + '@esbuild/win32-arm64': 0.25.8 + '@esbuild/win32-ia32': 0.25.8 + '@esbuild/win32-x64': 0.25.8 + + escalade@3.2.0: {} + + escape-html@1.0.3: {} + + escape-string-regexp@4.0.0: {} + + eslint-config-next@15.3.2(eslint@9.32.0(jiti@2.5.1))(typescript@5.9.2): + dependencies: + '@next/eslint-plugin-next': 15.3.2 + '@rushstack/eslint-patch': 1.12.0 + '@typescript-eslint/eslint-plugin': 8.39.0(@typescript-eslint/parser@8.39.0(eslint@9.32.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.32.0(jiti@2.5.1))(typescript@5.9.2) + '@typescript-eslint/parser': 8.39.0(eslint@9.32.0(jiti@2.5.1))(typescript@5.9.2) + eslint: 9.32.0(jiti@2.5.1) + eslint-import-resolver-node: 0.3.9 + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.32.0(jiti@2.5.1)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.39.0(eslint@9.32.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-typescript@3.10.1)(eslint@9.32.0(jiti@2.5.1)) + eslint-plugin-jsx-a11y: 6.10.2(eslint@9.32.0(jiti@2.5.1)) + eslint-plugin-react: 7.37.5(eslint@9.32.0(jiti@2.5.1)) + eslint-plugin-react-hooks: 5.2.0(eslint@9.32.0(jiti@2.5.1)) + optionalDependencies: + typescript: 5.9.2 + transitivePeerDependencies: + - eslint-import-resolver-webpack + - eslint-plugin-import-x + - supports-color + + eslint-import-resolver-node@0.3.9: + dependencies: + debug: 3.2.7 + is-core-module: 2.16.1 + resolve: 1.22.10 + transitivePeerDependencies: + - supports-color + + eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@9.32.0(jiti@2.5.1)): + dependencies: + '@nolyfill/is-core-module': 1.0.39 + debug: 4.4.1 + eslint: 9.32.0(jiti@2.5.1) + get-tsconfig: 4.10.1 + is-bun-module: 2.0.0 + stable-hash: 0.0.5 + tinyglobby: 0.2.14 + unrs-resolver: 1.11.1 + optionalDependencies: + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.39.0(eslint@9.32.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-typescript@3.10.1)(eslint@9.32.0(jiti@2.5.1)) + transitivePeerDependencies: + - supports-color + + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.39.0(eslint@9.32.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.32.0(jiti@2.5.1)): + dependencies: + debug: 3.2.7 + optionalDependencies: + '@typescript-eslint/parser': 8.39.0(eslint@9.32.0(jiti@2.5.1))(typescript@5.9.2) + eslint: 9.32.0(jiti@2.5.1) + eslint-import-resolver-node: 0.3.9 + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.32.0(jiti@2.5.1)) + transitivePeerDependencies: + - supports-color + + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.39.0(eslint@9.32.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-typescript@3.10.1)(eslint@9.32.0(jiti@2.5.1)): + dependencies: + '@rtsao/scc': 1.1.0 + array-includes: 3.1.9 + array.prototype.findlastindex: 1.2.6 + array.prototype.flat: 1.3.3 + array.prototype.flatmap: 1.3.3 + debug: 3.2.7 + doctrine: 2.1.0 + eslint: 9.32.0(jiti@2.5.1) + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.39.0(eslint@9.32.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.32.0(jiti@2.5.1)) + hasown: 2.0.2 + is-core-module: 2.16.1 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.fromentries: 2.0.8 + object.groupby: 1.0.3 + object.values: 1.2.1 + semver: 6.3.1 + string.prototype.trimend: 1.0.9 + tsconfig-paths: 3.15.0 + optionalDependencies: + '@typescript-eslint/parser': 8.39.0(eslint@9.32.0(jiti@2.5.1))(typescript@5.9.2) + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + + eslint-plugin-jsx-a11y@6.10.2(eslint@9.32.0(jiti@2.5.1)): + dependencies: + aria-query: 5.3.2 + array-includes: 3.1.9 + array.prototype.flatmap: 1.3.3 + ast-types-flow: 0.0.8 + axe-core: 4.10.3 + axobject-query: 4.1.0 + damerau-levenshtein: 1.0.8 + emoji-regex: 9.2.2 + eslint: 9.32.0(jiti@2.5.1) + hasown: 2.0.2 + jsx-ast-utils: 3.3.5 + language-tags: 1.0.9 + minimatch: 3.1.2 + object.fromentries: 2.0.8 + safe-regex-test: 1.1.0 + string.prototype.includes: 2.0.1 + + eslint-plugin-react-hooks@5.2.0(eslint@9.32.0(jiti@2.5.1)): + dependencies: + eslint: 9.32.0(jiti@2.5.1) + + eslint-plugin-react@7.37.5(eslint@9.32.0(jiti@2.5.1)): + dependencies: + array-includes: 3.1.9 + array.prototype.findlast: 1.2.5 + array.prototype.flatmap: 1.3.3 + array.prototype.tosorted: 1.1.4 + doctrine: 2.1.0 + es-iterator-helpers: 1.2.1 + eslint: 9.32.0(jiti@2.5.1) + estraverse: 5.3.0 + hasown: 2.0.2 + jsx-ast-utils: 3.3.5 + minimatch: 3.1.2 + object.entries: 1.1.9 + object.fromentries: 2.0.8 + object.values: 1.2.1 + prop-types: 15.8.1 + resolve: 2.0.0-next.5 + semver: 6.3.1 + string.prototype.matchall: 4.0.12 + string.prototype.repeat: 1.0.0 + + eslint-scope@8.4.0: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@3.4.3: {} + + eslint-visitor-keys@4.2.1: {} + + eslint@9.32.0(jiti@2.5.1): + dependencies: + '@eslint-community/eslint-utils': 4.7.0(eslint@9.32.0(jiti@2.5.1)) + '@eslint-community/regexpp': 4.12.1 + '@eslint/config-array': 0.21.0 + '@eslint/config-helpers': 0.3.1 + '@eslint/core': 0.15.2 + '@eslint/eslintrc': 3.3.1 + '@eslint/js': 9.32.0 + '@eslint/plugin-kit': 0.3.5 + '@humanfs/node': 0.16.6 + '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.4.3 + '@types/estree': 1.0.8 + '@types/json-schema': 7.0.15 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.1 + escape-string-regexp: 4.0.0 + eslint-scope: 8.4.0 + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 + esquery: 1.6.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 8.0.0 + find-up: 5.0.0 + glob-parent: 6.0.2 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + json-stable-stringify-without-jsonify: 1.0.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + optionalDependencies: + jiti: 2.5.1 + transitivePeerDependencies: + - supports-color + + espree@10.4.0: + dependencies: + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) + eslint-visitor-keys: 4.2.1 + + esquery@1.6.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@5.3.0: {} + + estree-util-is-identifier-name@3.0.0: {} + + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.8 + + esutils@2.0.3: {} + + etag@1.8.1: {} + + expand-template@2.0.3: {} + + expect-type@1.2.2: {} + + expr-eval@2.0.2: {} + + express-rate-limit@8.0.1(express@5.1.0): + dependencies: + express: 5.1.0 + ip-address: 10.0.1 + + express@5.1.0: + dependencies: + accepts: 2.0.0 + body-parser: 2.2.0 + content-disposition: 1.0.0 + content-type: 1.0.5 + cookie: 0.7.1 + cookie-signature: 1.2.2 + debug: 4.4.1 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 2.1.0 + fresh: 2.0.0 + http-errors: 2.0.0 + merge-descriptors: 2.0.0 + mime-types: 3.0.1 + on-finished: 2.4.1 + once: 1.4.0 + parseurl: 1.3.3 + proxy-addr: 2.0.7 + qs: 6.14.0 + range-parser: 1.2.1 + router: 2.2.0 + send: 1.2.0 + serve-static: 2.2.0 + statuses: 2.0.2 + type-is: 2.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + + extend@3.0.2: {} + + fast-deep-equal@3.1.3: {} + + fast-glob@3.3.1: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + fast-glob@3.3.3: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fastq@1.19.1: + dependencies: + reusify: 1.1.0 + + fdir@6.4.6(picomatch@4.0.3): + optionalDependencies: + picomatch: 4.0.3 + + fecha@4.2.3: {} + + fetch-blob@3.2.0: + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 3.3.3 + + fetch-socks@1.3.2: + dependencies: + socks: 2.8.6 + undici: 7.13.0 + + file-entry-cache@8.0.0: + dependencies: + flat-cache: 4.0.1 + + file-uri-to-path@1.0.0: {} + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + finalhandler@2.1.0: + dependencies: + debug: 4.4.1 + encodeurl: 2.0.0 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.2 + transitivePeerDependencies: + - supports-color + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + flat-cache@4.0.1: + dependencies: + flatted: 3.3.3 + keyv: 4.5.4 + + flatted@3.3.3: {} + + fn.name@1.1.0: {} + + for-each@0.3.5: + dependencies: + is-callable: 1.2.7 + + foreground-child@3.3.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + form-data@4.0.4: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + hasown: 2.0.2 + mime-types: 2.1.35 + + formdata-polyfill@4.0.10: + dependencies: + fetch-blob: 3.2.0 + + forwarded@0.2.0: {} + + fraction.js@4.3.7: {} + + framer-motion@12.23.12(react-dom@19.1.1(react@19.1.1))(react@19.1.1): + dependencies: + motion-dom: 12.23.12 + motion-utils: 12.23.6 + tslib: 2.8.1 + optionalDependencies: + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + + fresh@2.0.0: {} + + fs-constants@1.0.0: {} + + fs-minipass@2.1.0: + dependencies: + minipass: 3.3.6 + + fs.realpath@1.0.0: + optional: true + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + function-timeout@1.0.2: {} + + function.prototype.name@1.1.8: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + functions-have-names: 1.2.3 + hasown: 2.0.2 + is-callable: 1.2.7 + + functions-have-names@1.2.3: {} + + fuzzball@2.2.3: + dependencies: + heap: 0.2.7 + lodash: 4.17.21 + setimmediate: 1.0.5 + + gauge@4.0.4: + dependencies: + aproba: 2.1.0 + color-support: 1.1.3 + console-control-strings: 1.1.0 + has-unicode: 2.0.1 + signal-exit: 3.0.7 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wide-align: 1.1.5 + optional: true + + get-caller-file@2.0.5: {} + + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + + get-nonce@1.0.1: {} + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + get-symbol-description@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + + get-tsconfig@4.10.1: + dependencies: + resolve-pkg-maps: 1.0.0 + + github-from-package@0.0.0: {} + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob@10.4.5: + dependencies: + foreground-child: 3.3.1 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + optional: true + + globals@14.0.0: {} + + globalthis@1.0.4: + dependencies: + define-properties: 1.2.1 + gopd: 1.2.0 + + go-ptt@0.4.0: + dependencies: + '@bufbuild/protobuf': 2.7.0 + '@grpc/grpc-js': 1.13.4 + node-fetch: 3.3.2 + tar: 7.4.3 + + gopd@1.2.0: {} + + graceful-fs@4.2.11: {} + + graphemer@1.4.0: {} + + has-bigints@1.1.0: {} + + has-flag@4.0.0: {} + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.1 + + has-proto@1.2.0: + dependencies: + dunder-proto: 1.0.1 + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + has-unicode@2.0.1: + optional: true + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + hast-util-to-jsx-runtime@2.3.6: + dependencies: + '@types/estree': 1.0.8 + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + hast-util-whitespace: 3.0.0 + mdast-util-mdx-expression: 2.0.1 + mdast-util-mdx-jsx: 3.2.0 + mdast-util-mdxjs-esm: 2.0.1 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + style-to-js: 1.1.17 + unist-util-position: 5.0.0 + vfile-message: 4.0.3 + transitivePeerDependencies: + - supports-color + + hast-util-whitespace@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + heap@0.2.7: {} + + html-url-attributes@3.0.1: {} + + http-cache-semantics@4.2.0: + optional: true + + http-errors@2.0.0: + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + + http-proxy-agent@4.0.1: + dependencies: + '@tootallnate/once': 1.1.2 + agent-base: 6.0.2 + debug: 4.4.1 + transitivePeerDependencies: + - supports-color + optional: true + + https-proxy-agent@5.0.1: + dependencies: + agent-base: 6.0.2 + debug: 4.4.1 + transitivePeerDependencies: + - supports-color + optional: true + + humanize-ms@1.2.1: + dependencies: + ms: 2.1.3 + optional: true + + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 + + ieee754@1.2.1: {} + + ignore@5.3.2: {} + + ignore@7.0.5: {} + + import-fresh@3.3.1: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + imurmurhash@0.1.4: {} + + indent-string@4.0.0: + optional: true + + infer-owner@1.0.4: + optional: true + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + optional: true + + inherits@2.0.4: {} + + ini@1.3.8: {} + + inline-style-parser@0.2.4: {} + + internal-slot@1.1.0: + dependencies: + es-errors: 1.3.0 + hasown: 2.0.2 + side-channel: 1.1.0 + + ip-address@10.0.1: {} + + ip-address@9.0.5: + dependencies: + jsbn: 1.1.0 + sprintf-js: 1.1.3 + + ipaddr.js@1.9.1: {} + + is-alphabetical@2.0.1: {} + + is-alphanumerical@2.0.1: + dependencies: + is-alphabetical: 2.0.1 + is-decimal: 2.0.1 + + is-array-buffer@3.0.5: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + + is-arrayish@0.3.2: {} + + is-async-function@2.1.1: + dependencies: + async-function: 1.0.0 + call-bound: 1.0.4 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + is-bigint@1.1.0: + dependencies: + has-bigints: 1.1.0 + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + + is-boolean-object@1.2.2: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-bun-module@2.0.0: + dependencies: + semver: 7.7.2 + + is-callable@1.2.7: {} + + is-core-module@2.16.1: + dependencies: + hasown: 2.0.2 + + is-data-view@1.0.2: + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + is-typed-array: 1.1.15 + + is-date-object@1.1.0: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-decimal@2.0.1: {} + + is-extglob@2.1.1: {} + + is-finalizationregistry@1.1.1: + dependencies: + call-bound: 1.0.4 + + is-fullwidth-code-point@3.0.0: {} + + is-generator-function@1.1.0: + dependencies: + call-bound: 1.0.4 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-hexadecimal@2.0.1: {} + + is-lambda@1.0.1: + optional: true + + is-map@2.0.3: {} + + is-negative-zero@2.0.3: {} + + is-number-object@1.1.1: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-number@7.0.0: {} + + is-plain-obj@4.1.0: {} + + is-promise@4.0.0: {} + + is-regex@1.2.1: + dependencies: + call-bound: 1.0.4 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + is-set@2.0.3: {} + + is-shared-array-buffer@1.0.4: + dependencies: + call-bound: 1.0.4 + + is-stream@2.0.1: {} + + is-string@1.1.1: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-symbol@1.1.1: + dependencies: + call-bound: 1.0.4 + has-symbols: 1.1.0 + safe-regex-test: 1.1.0 + + is-typed-array@1.1.15: + dependencies: + which-typed-array: 1.1.19 + + is-weakmap@2.0.2: {} + + is-weakref@1.1.1: + dependencies: + call-bound: 1.0.4 + + is-weakset@2.0.4: + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + + isarray@2.0.5: {} + + isexe@2.0.0: {} + + iterator.prototype@1.1.5: + dependencies: + define-data-property: 1.1.4 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + has-symbols: 1.1.0 + set-function-name: 2.0.2 + + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + jiti@1.21.7: {} + + jiti@2.5.1: {} + + js-tokens@4.0.0: {} + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + jsbn@1.1.0: {} + + json-buffer@3.0.1: {} + + json-schema-traverse@0.4.1: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + json5@1.0.2: + dependencies: + minimist: 1.2.8 + + jsx-ast-utils@3.3.5: + dependencies: + array-includes: 3.1.9 + array.prototype.flat: 1.3.3 + object.assign: 4.1.7 + object.values: 1.2.1 + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + kuler@2.0.0: {} + + language-subtag-registry@0.3.23: {} + + language-tags@1.0.9: + dependencies: + language-subtag-registry: 0.3.23 + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + lightningcss-darwin-arm64@1.30.1: + optional: true + + lightningcss-darwin-x64@1.30.1: + optional: true + + lightningcss-freebsd-x64@1.30.1: + optional: true + + lightningcss-linux-arm-gnueabihf@1.30.1: + optional: true + + lightningcss-linux-arm64-gnu@1.30.1: + optional: true + + lightningcss-linux-arm64-musl@1.30.1: + optional: true + + lightningcss-linux-x64-gnu@1.30.1: + optional: true + + lightningcss-linux-x64-musl@1.30.1: + optional: true + + lightningcss-win32-arm64-msvc@1.30.1: + optional: true + + lightningcss-win32-x64-msvc@1.30.1: + optional: true + + lightningcss@1.30.1: + dependencies: + detect-libc: 2.0.4 + optionalDependencies: + lightningcss-darwin-arm64: 1.30.1 + lightningcss-darwin-x64: 1.30.1 + lightningcss-freebsd-x64: 1.30.1 + lightningcss-linux-arm-gnueabihf: 1.30.1 + lightningcss-linux-arm64-gnu: 1.30.1 + lightningcss-linux-arm64-musl: 1.30.1 + lightningcss-linux-x64-gnu: 1.30.1 + lightningcss-linux-x64-musl: 1.30.1 + lightningcss-win32-arm64-msvc: 1.30.1 + lightningcss-win32-x64-msvc: 1.30.1 + + lilconfig@3.1.3: {} + + lines-and-columns@1.2.4: {} + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lodash.camelcase@4.3.0: {} + + lodash.castarray@4.4.0: {} + + lodash.isplainobject@4.0.6: {} + + lodash.merge@4.6.2: {} + + lodash@4.17.21: {} + + logform@2.7.0: + dependencies: + '@colors/colors': 1.6.0 + '@types/triple-beam': 1.3.5 + fecha: 4.2.3 + ms: 2.1.3 + safe-stable-stringify: 2.5.0 + triple-beam: 1.4.1 + + long@5.3.2: {} + + longest-streak@3.1.0: {} + + loose-envify@1.4.0: + dependencies: + js-tokens: 4.0.0 + + loupe@3.2.0: {} + + lru-cache@10.4.3: {} + + lru-cache@6.0.0: + dependencies: + yallist: 4.0.0 + optional: true + + lucide-react@0.511.0(react@19.1.1): + dependencies: + react: 19.1.1 + + magic-string@0.30.17: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.4 + + make-error@1.3.6: {} + + make-fetch-happen@9.1.0: + dependencies: + agentkeepalive: 4.6.0 + cacache: 15.3.0 + http-cache-semantics: 4.2.0 + http-proxy-agent: 4.0.1 + https-proxy-agent: 5.0.1 + is-lambda: 1.0.1 + lru-cache: 6.0.0 + minipass: 3.3.6 + minipass-collect: 1.0.2 + minipass-fetch: 1.4.1 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + negotiator: 0.6.3 + promise-retry: 2.0.1 + socks-proxy-agent: 6.2.1 + ssri: 8.0.1 + transitivePeerDependencies: + - bluebird + - supports-color + optional: true + + math-intrinsics@1.1.0: {} + + mdast-util-from-markdown@2.0.2: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + decode-named-character-reference: 1.2.0 + devlop: 1.1.0 + mdast-util-to-string: 4.0.0 + micromark: 4.0.2 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-decode-string: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + unist-util-stringify-position: 4.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx-expression@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx-jsx@3.2.0: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + parse-entities: 4.0.2 + stringify-entities: 4.0.4 + unist-util-stringify-position: 4.0.0 + vfile-message: 4.0.3 + transitivePeerDependencies: + - supports-color + + mdast-util-mdxjs-esm@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-phrasing@4.1.0: + dependencies: + '@types/mdast': 4.0.4 + unist-util-is: 6.0.0 + + mdast-util-to-hast@13.2.0: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@ungap/structured-clone': 1.3.0 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.1 + trim-lines: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + + mdast-util-to-markdown@2.1.2: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + longest-streak: 3.1.0 + mdast-util-phrasing: 4.1.0 + mdast-util-to-string: 4.0.0 + micromark-util-classify-character: 2.0.1 + micromark-util-decode-string: 2.0.1 + unist-util-visit: 5.0.0 + zwitch: 2.0.4 + + mdast-util-to-string@4.0.0: + dependencies: + '@types/mdast': 4.0.4 + + media-typer@1.1.0: {} + + merge-descriptors@2.0.0: {} + + merge2@1.4.1: {} + + micromark-core-commonmark@2.0.3: + dependencies: + decode-named-character-reference: 1.2.0 + devlop: 1.1.0 + micromark-factory-destination: 2.0.1 + micromark-factory-label: 2.0.1 + micromark-factory-space: 2.0.1 + micromark-factory-title: 2.0.1 + micromark-factory-whitespace: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-html-tag-name: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-destination@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-label@2.0.1: + dependencies: + devlop: 1.1.0 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-space@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-types: 2.0.2 + + micromark-factory-title@2.0.1: + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-whitespace@2.0.1: + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-character@2.1.1: + dependencies: + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-chunked@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-classify-character@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-combine-extensions@2.0.1: + dependencies: + micromark-util-chunked: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-decode-numeric-character-reference@2.0.2: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-decode-string@2.0.1: + dependencies: + decode-named-character-reference: 1.2.0 + micromark-util-character: 2.1.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-symbol: 2.0.1 + + micromark-util-encode@2.0.1: {} + + micromark-util-html-tag-name@2.0.1: {} + + micromark-util-normalize-identifier@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-resolve-all@2.0.1: + dependencies: + micromark-util-types: 2.0.2 + + micromark-util-sanitize-uri@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-encode: 2.0.1 + micromark-util-symbol: 2.0.1 + + micromark-util-subtokenize@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-symbol@2.0.1: {} + + micromark-util-types@2.0.2: {} + + micromark@4.0.2: + dependencies: + '@types/debug': 4.1.12 + debug: 4.4.1 + decode-named-character-reference: 1.2.0 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-combine-extensions: 2.0.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-encode: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + transitivePeerDependencies: + - supports-color + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + mime-db@1.52.0: {} + + mime-db@1.54.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + mime-types@3.0.1: + dependencies: + mime-db: 1.54.0 + + mimic-response@3.1.0: {} + + mini-svg-data-uri@1.4.4: {} + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.12 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.2 + + minimist@1.2.8: {} + + minipass-collect@1.0.2: + dependencies: + minipass: 3.3.6 + optional: true + + minipass-fetch@1.4.1: + dependencies: + minipass: 3.3.6 + minipass-sized: 1.0.3 + minizlib: 2.1.2 + optionalDependencies: + encoding: 0.1.13 + optional: true + + minipass-flush@1.0.5: + dependencies: + minipass: 3.3.6 + optional: true + + minipass-pipeline@1.2.4: + dependencies: + minipass: 3.3.6 + optional: true + + minipass-sized@1.0.3: + dependencies: + minipass: 3.3.6 + optional: true + + minipass@3.3.6: + dependencies: + yallist: 4.0.0 + + minipass@5.0.0: {} + + minipass@7.1.2: {} + + minizlib@2.1.2: + dependencies: + minipass: 3.3.6 + yallist: 4.0.0 + + minizlib@3.0.2: + dependencies: + minipass: 7.1.2 + + mkdirp-classic@0.5.3: {} + + mkdirp@1.0.4: {} + + mkdirp@3.0.1: {} + + moment-timezone@0.5.48: + dependencies: + moment: 2.30.1 + + moment@2.30.1: {} + + motion-dom@12.23.12: + dependencies: + motion-utils: 12.23.6 + + motion-utils@12.23.6: {} + + motion@12.23.12(react-dom@19.1.1(react@19.1.1))(react@19.1.1): + dependencies: + framer-motion: 12.23.12(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + tslib: 2.8.1 + optionalDependencies: + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + + ms@2.1.3: {} + + mz@2.7.0: + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + + nanoid@3.3.11: {} + + napi-build-utils@2.0.0: {} + + napi-postinstall@0.3.2: {} + + natural-compare@1.4.0: {} + + negotiator@0.6.3: + optional: true + + negotiator@1.0.0: {} + + next-themes@0.4.6(react-dom@19.1.1(react@19.1.1))(react@19.1.1): + dependencies: + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + + next@15.3.2(react-dom@19.1.1(react@19.1.1))(react@19.1.1): + dependencies: + '@next/env': 15.3.2 + '@swc/counter': 0.1.3 + '@swc/helpers': 0.5.15 + busboy: 1.6.0 + caniuse-lite: 1.0.30001733 + postcss: 8.4.31 + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + styled-jsx: 5.1.6(react@19.1.1) + optionalDependencies: + '@next/swc-darwin-arm64': 15.3.2 + '@next/swc-darwin-x64': 15.3.2 + '@next/swc-linux-arm64-gnu': 15.3.2 + '@next/swc-linux-arm64-musl': 15.3.2 + '@next/swc-linux-x64-gnu': 15.3.2 + '@next/swc-linux-x64-musl': 15.3.2 + '@next/swc-win32-arm64-msvc': 15.3.2 + '@next/swc-win32-x64-msvc': 15.3.2 + sharp: 0.34.3 + transitivePeerDependencies: + - '@babel/core' + - babel-plugin-macros + + node-abi@3.75.0: + dependencies: + semver: 7.7.2 + + node-addon-api@7.1.1: {} + + node-addon-api@8.5.0: {} + + node-domexception@1.0.0: {} + + node-fetch@2.7.0(encoding@0.1.13): + dependencies: + whatwg-url: 5.0.0 + optionalDependencies: + encoding: 0.1.13 + + node-fetch@3.3.2: + dependencies: + data-uri-to-buffer: 4.0.1 + fetch-blob: 3.2.0 + formdata-polyfill: 4.0.10 + + node-gyp-build@4.8.4: {} + + node-gyp@8.4.1: + dependencies: + env-paths: 2.2.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + make-fetch-happen: 9.1.0 + nopt: 5.0.0 + npmlog: 6.0.2 + rimraf: 3.0.2 + semver: 7.7.2 + tar: 6.2.1 + which: 2.0.2 + transitivePeerDependencies: + - bluebird + - supports-color + optional: true + + node-releases@2.0.19: {} + + nopt@5.0.0: + dependencies: + abbrev: 1.1.1 + optional: true + + normalize-path@3.0.0: {} + + normalize-range@0.1.2: {} + + npmlog@6.0.2: + dependencies: + are-we-there-yet: 3.0.1 + console-control-strings: 1.1.0 + gauge: 4.0.4 + set-blocking: 2.0.0 + optional: true + + object-assign@4.1.1: {} + + object-hash@3.0.0: {} + + object-inspect@1.13.4: {} + + object-keys@1.1.1: {} + + object.assign@4.1.7: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + has-symbols: 1.1.0 + object-keys: 1.1.1 + + object.entries@1.1.9: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + object.fromentries@2.0.8: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-object-atoms: 1.1.1 + + object.groupby@1.0.3: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + + object.values@1.2.1: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + on-finished@2.4.1: + dependencies: + ee-first: 1.1.1 + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + one-time@1.0.0: + dependencies: + fn.name: 1.1.0 + + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + + own-keys@1.0.1: + dependencies: + get-intrinsic: 1.3.0 + object-keys: 1.1.1 + safe-push-apply: 1.0.0 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + p-map@4.0.0: + dependencies: + aggregate-error: 3.1.0 + optional: true + + package-json-from-dist@1.0.1: {} + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + parse-entities@4.0.2: + dependencies: + '@types/unist': 2.0.11 + character-entities-legacy: 3.0.0 + character-reference-invalid: 2.0.1 + decode-named-character-reference: 1.2.0 + is-alphanumerical: 2.0.1 + is-decimal: 2.0.1 + is-hexadecimal: 2.0.1 + + parse-torrent-title@https://codeload.github.com/TheBeastLT/parse-torrent-title/tar.gz/1169487e316a4eed898dcfd900957f89a253604c: + dependencies: + moment: 2.30.1 + + parseurl@1.3.3: {} + + path-exists@4.0.0: {} + + path-is-absolute@1.0.1: + optional: true + + path-key@3.1.1: {} + + path-parse@1.0.7: {} + + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + + path-to-regexp@8.2.0: {} + + pathe@1.1.2: {} + + pathval@2.0.1: {} + + pg-cloudflare@1.2.7: + optional: true + + pg-connection-string@2.9.1: {} + + pg-int8@1.0.1: {} + + pg-pool@3.10.1(pg@8.16.3): + dependencies: + pg: 8.16.3 + + pg-protocol@1.10.3: {} + + pg-types@2.2.0: + dependencies: + pg-int8: 1.0.1 + postgres-array: 2.0.0 + postgres-bytea: 1.0.0 + postgres-date: 1.0.7 + postgres-interval: 1.2.0 + + pg@8.16.3: + dependencies: + pg-connection-string: 2.9.1 + pg-pool: 3.10.1(pg@8.16.3) + pg-protocol: 1.10.3 + pg-types: 2.2.0 + pgpass: 1.0.5 + optionalDependencies: + pg-cloudflare: 1.2.7 + + pgpass@1.0.5: + dependencies: + split2: 4.2.0 + + picocolors@1.1.1: {} + + picomatch@2.3.1: {} + + picomatch@4.0.3: {} + + pify@2.3.0: {} + + pirates@4.0.7: {} + + possible-typed-array-names@1.1.0: {} + + postcss-import@15.1.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + read-cache: 1.0.0 + resolve: 1.22.10 + + postcss-import@16.1.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + read-cache: 1.0.0 + resolve: 1.22.10 + + postcss-js@4.0.1(postcss@8.5.6): + dependencies: + camelcase-css: 2.0.1 + postcss: 8.5.6 + + postcss-load-config@4.0.2(postcss@8.5.6)(ts-node@10.9.2(@types/node@20.19.10)(typescript@5.9.2)): + dependencies: + lilconfig: 3.1.3 + yaml: 2.8.1 + optionalDependencies: + postcss: 8.5.6 + ts-node: 10.9.2(@types/node@20.19.10)(typescript@5.9.2) + + postcss-nested@6.2.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-selector-parser: 6.1.2 + + postcss-nesting@13.0.2(postcss@8.5.6): + dependencies: + '@csstools/selector-resolve-nested': 3.1.0(postcss-selector-parser@7.1.0) + '@csstools/selector-specificity': 5.0.0(postcss-selector-parser@7.1.0) + postcss: 8.5.6 + postcss-selector-parser: 7.1.0 + + postcss-selector-parser@6.0.10: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-selector-parser@6.1.2: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-selector-parser@7.1.0: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-value-parser@4.2.0: {} + + postcss@8.4.31: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + postcss@8.5.6: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + postgres-array@2.0.0: {} + + postgres-bytea@1.0.0: {} + + postgres-date@1.0.7: {} + + postgres-interval@1.2.0: + dependencies: + xtend: 4.0.2 + + prebuild-install@7.1.3: + dependencies: + detect-libc: 2.0.4 + expand-template: 2.0.3 + github-from-package: 0.0.0 + minimist: 1.2.8 + mkdirp-classic: 0.5.3 + napi-build-utils: 2.0.0 + node-abi: 3.75.0 + pump: 3.0.3 + rc: 1.2.8 + simple-get: 4.0.1 + tar-fs: 2.1.3 + tunnel-agent: 0.6.0 + + prelude-ls@1.2.1: {} + + prettier@3.6.2: {} + + promise-inflight@1.0.1: + optional: true + + promise-retry@2.0.1: + dependencies: + err-code: 2.0.3 + retry: 0.12.0 + optional: true + + prop-types@15.8.1: + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + + property-information@7.1.0: {} + + protobufjs@7.5.4: + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/base64': 1.1.2 + '@protobufjs/codegen': 2.0.4 + '@protobufjs/eventemitter': 1.1.0 + '@protobufjs/fetch': 1.1.0 + '@protobufjs/float': 1.0.2 + '@protobufjs/inquire': 1.1.0 + '@protobufjs/path': 1.1.2 + '@protobufjs/pool': 1.1.0 + '@protobufjs/utf8': 1.1.0 + '@types/node': 20.19.10 + long: 5.3.2 + + proxy-addr@2.0.7: + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + + proxy-compare@3.0.1: {} + + pump@3.0.3: + dependencies: + end-of-stream: 1.4.5 + once: 1.4.0 + + punycode@2.3.1: {} + + qs@6.14.0: + dependencies: + side-channel: 1.1.0 + + queue-microtask@1.2.3: {} + + range-parser@1.2.1: {} + + rate-limit-redis@4.2.2(express-rate-limit@8.0.1(express@5.1.0)): + dependencies: + express-rate-limit: 8.0.1(express@5.1.0) + + raw-body@3.0.0: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.6.3 + unpipe: 1.0.0 + + rc@1.2.8: + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + + react-dom@19.1.1(react@19.1.1): + dependencies: + react: 19.1.1 + scheduler: 0.26.0 + + react-icons@5.5.0(react@19.1.1): + dependencies: + react: 19.1.1 + + react-is@16.13.1: {} + + react-markdown@10.1.0(@types/react@19.1.9)(react@19.1.1): + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@types/react': 19.1.9 + devlop: 1.1.0 + hast-util-to-jsx-runtime: 2.3.6 + html-url-attributes: 3.0.1 + mdast-util-to-hast: 13.2.0 + react: 19.1.1 + remark-parse: 11.0.0 + remark-rehype: 11.1.2 + unified: 11.0.5 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + transitivePeerDependencies: + - supports-color + + react-remove-scroll-bar@2.3.8(@types/react@19.1.9)(react@19.1.1): + dependencies: + react: 19.1.1 + react-style-singleton: 2.2.3(@types/react@19.1.9)(react@19.1.1) + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.1.9 + + react-remove-scroll@2.7.1(@types/react@19.1.9)(react@19.1.1): + dependencies: + react: 19.1.1 + react-remove-scroll-bar: 2.3.8(@types/react@19.1.9)(react@19.1.1) + react-style-singleton: 2.2.3(@types/react@19.1.9)(react@19.1.1) + tslib: 2.8.1 + use-callback-ref: 1.3.3(@types/react@19.1.9)(react@19.1.1) + use-sidecar: 1.1.3(@types/react@19.1.9)(react@19.1.1) + optionalDependencies: + '@types/react': 19.1.9 + + react-style-singleton@2.2.3(@types/react@19.1.9)(react@19.1.1): + dependencies: + get-nonce: 1.0.1 + react: 19.1.1 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.1.9 + + react@19.1.1: {} + + read-cache@1.0.0: + dependencies: + pify: 2.3.0 + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + + redis@5.8.2: + dependencies: + '@redis/bloom': 5.8.2(@redis/client@5.8.2) + '@redis/client': 5.8.2 + '@redis/json': 5.8.2(@redis/client@5.8.2) + '@redis/search': 5.8.2(@redis/client@5.8.2) + '@redis/time-series': 5.8.2(@redis/client@5.8.2) + + reflect.getprototypeof@1.0.10: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + which-builtin-type: 1.2.1 + + regexp.prototype.flags@1.5.4: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-errors: 1.3.0 + get-proto: 1.0.1 + gopd: 1.2.0 + set-function-name: 2.0.2 + + remark-parse@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.2 + micromark-util-types: 2.0.2 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-rehype@11.1.2: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + mdast-util-to-hast: 13.2.0 + unified: 11.0.5 + vfile: 6.0.3 + + require-directory@2.1.1: {} + + resolve-from@4.0.0: {} + + resolve-pkg-maps@1.0.0: {} + + resolve@1.22.10: + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + resolve@2.0.0-next.5: + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + retry@0.12.0: + optional: true + + reusify@1.1.0: {} + + rimraf@3.0.2: + dependencies: + glob: 7.2.3 + optional: true + + rollup@4.46.2: + dependencies: + '@types/estree': 1.0.8 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.46.2 + '@rollup/rollup-android-arm64': 4.46.2 + '@rollup/rollup-darwin-arm64': 4.46.2 + '@rollup/rollup-darwin-x64': 4.46.2 + '@rollup/rollup-freebsd-arm64': 4.46.2 + '@rollup/rollup-freebsd-x64': 4.46.2 + '@rollup/rollup-linux-arm-gnueabihf': 4.46.2 + '@rollup/rollup-linux-arm-musleabihf': 4.46.2 + '@rollup/rollup-linux-arm64-gnu': 4.46.2 + '@rollup/rollup-linux-arm64-musl': 4.46.2 + '@rollup/rollup-linux-loongarch64-gnu': 4.46.2 + '@rollup/rollup-linux-ppc64-gnu': 4.46.2 + '@rollup/rollup-linux-riscv64-gnu': 4.46.2 + '@rollup/rollup-linux-riscv64-musl': 4.46.2 + '@rollup/rollup-linux-s390x-gnu': 4.46.2 + '@rollup/rollup-linux-x64-gnu': 4.46.2 + '@rollup/rollup-linux-x64-musl': 4.46.2 + '@rollup/rollup-win32-arm64-msvc': 4.46.2 + '@rollup/rollup-win32-ia32-msvc': 4.46.2 + '@rollup/rollup-win32-x64-msvc': 4.46.2 + fsevents: 2.3.3 + + router@2.2.0: + dependencies: + debug: 4.4.1 + depd: 2.0.0 + is-promise: 4.0.0 + parseurl: 1.3.3 + path-to-regexp: 8.2.0 + transitivePeerDependencies: + - supports-color + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + safe-array-concat@1.1.3: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + has-symbols: 1.1.0 + isarray: 2.0.5 + + safe-buffer@5.2.1: {} + + safe-push-apply@1.0.0: + dependencies: + es-errors: 1.3.0 + isarray: 2.0.5 + + safe-regex-test@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-regex: 1.2.1 + + safe-stable-stringify@2.5.0: {} + + safer-buffer@2.1.2: {} + + sax@1.4.1: {} + + scheduler@0.26.0: {} + + semver@6.3.1: {} + + semver@7.7.2: {} + + send@1.2.0: + dependencies: + debug: 4.4.1 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 2.0.0 + http-errors: 2.0.0 + mime-types: 3.0.1 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.2 + transitivePeerDependencies: + - supports-color + + serve-static@2.2.0: + dependencies: + encodeurl: 2.0.0 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 1.2.0 + transitivePeerDependencies: + - supports-color + + set-blocking@2.0.0: + optional: true + + set-function-length@1.2.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + + set-function-name@2.0.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + + set-proto@1.0.0: + dependencies: + dunder-proto: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + + setimmediate@1.0.5: {} + + setprototypeof@1.2.0: {} + + sharp@0.34.3: + dependencies: + color: 4.2.3 + detect-libc: 2.0.4 + semver: 7.7.2 + optionalDependencies: + '@img/sharp-darwin-arm64': 0.34.3 + '@img/sharp-darwin-x64': 0.34.3 + '@img/sharp-libvips-darwin-arm64': 1.2.0 + '@img/sharp-libvips-darwin-x64': 1.2.0 + '@img/sharp-libvips-linux-arm': 1.2.0 + '@img/sharp-libvips-linux-arm64': 1.2.0 + '@img/sharp-libvips-linux-ppc64': 1.2.0 + '@img/sharp-libvips-linux-s390x': 1.2.0 + '@img/sharp-libvips-linux-x64': 1.2.0 + '@img/sharp-libvips-linuxmusl-arm64': 1.2.0 + '@img/sharp-libvips-linuxmusl-x64': 1.2.0 + '@img/sharp-linux-arm': 0.34.3 + '@img/sharp-linux-arm64': 0.34.3 + '@img/sharp-linux-ppc64': 0.34.3 + '@img/sharp-linux-s390x': 0.34.3 + '@img/sharp-linux-x64': 0.34.3 + '@img/sharp-linuxmusl-arm64': 0.34.3 + '@img/sharp-linuxmusl-x64': 0.34.3 + '@img/sharp-wasm32': 0.34.3 + '@img/sharp-win32-arm64': 0.34.3 + '@img/sharp-win32-ia32': 0.34.3 + '@img/sharp-win32-x64': 0.34.3 + optional: true + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + side-channel-list@1.0.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + + side-channel@1.1.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + + siginfo@2.0.0: {} + + signal-exit@3.0.7: + optional: true + + signal-exit@4.1.0: {} + + simple-concat@1.0.1: {} + + simple-get@4.0.1: + dependencies: + decompress-response: 6.0.0 + once: 1.4.0 + simple-concat: 1.0.1 + + simple-swizzle@0.2.2: + dependencies: + is-arrayish: 0.3.2 + + smart-buffer@4.2.0: {} + + socks-proxy-agent@6.2.1: + dependencies: + agent-base: 6.0.2 + debug: 4.4.1 + socks: 2.8.6 + transitivePeerDependencies: + - supports-color + optional: true + + socks@2.8.6: + dependencies: + ip-address: 9.0.5 + smart-buffer: 4.2.0 + + sonner@2.0.5(react-dom@19.1.1(react@19.1.1))(react@19.1.1): + dependencies: + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + + source-map-js@1.2.1: {} + + space-separated-tokens@2.0.2: {} + + split2@4.2.0: {} + + sprintf-js@1.1.3: {} + + sqlite3@5.1.7: + dependencies: + bindings: 1.5.0 + node-addon-api: 7.1.1 + prebuild-install: 7.1.3 + tar: 6.2.1 + optionalDependencies: + node-gyp: 8.4.1 + transitivePeerDependencies: + - bluebird + - supports-color + + sqlite@5.1.1: {} + + ssri@8.0.1: + dependencies: + minipass: 3.3.6 + optional: true + + stable-hash@0.0.5: {} + + stack-trace@0.0.10: {} + + stackback@0.0.2: {} + + statuses@2.0.1: {} + + statuses@2.0.2: {} + + std-env@3.9.0: {} + + stop-iteration-iterator@1.1.0: + dependencies: + es-errors: 1.3.0 + internal-slot: 1.1.0 + + streamsearch@1.1.0: {} + + stremthru@0.8.0(encoding@0.1.13): + dependencies: + '@types/node-fetch': 2.6.13 + node-fetch: 2.7.0(encoding@0.1.13) + transitivePeerDependencies: + - encoding + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + + string.prototype.includes@2.0.1: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + + string.prototype.matchall@4.0.12: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-symbols: 1.1.0 + internal-slot: 1.1.0 + regexp.prototype.flags: 1.5.4 + set-function-name: 2.0.2 + side-channel: 1.1.0 + + string.prototype.repeat@1.0.0: + dependencies: + define-properties: 1.2.1 + es-abstract: 1.24.0 + + string.prototype.trim@1.2.10: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-data-property: 1.1.4 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-object-atoms: 1.1.1 + has-property-descriptors: 1.0.2 + + string.prototype.trimend@1.0.9: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + string.prototype.trimstart@1.0.8: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + + stringify-entities@4.0.4: + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.0: + dependencies: + ansi-regex: 6.1.0 + + strip-bom@3.0.0: {} + + strip-json-comments@2.0.1: {} + + strip-json-comments@3.1.1: {} + + style-to-js@1.1.17: + dependencies: + style-to-object: 1.0.9 + + style-to-object@1.0.9: + dependencies: + inline-style-parser: 0.2.4 + + styled-jsx@5.1.6(react@19.1.1): + dependencies: + client-only: 0.0.1 + react: 19.1.1 + + sucrase@3.35.0: + dependencies: + '@jridgewell/gen-mapping': 0.3.12 + commander: 4.1.1 + glob: 10.4.5 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.7 + ts-interface-checker: 0.1.13 + + super-regex@1.0.0: + dependencies: + function-timeout: 1.0.2 + time-span: 5.1.0 + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + tabbable@6.2.0: {} + + tailwind-merge@2.6.0: {} + + tailwind-scrollbar-hide@1.1.7: {} + + tailwindcss-animate@1.0.7(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@20.19.10)(typescript@5.9.2))): + dependencies: + tailwindcss: 3.4.17(ts-node@10.9.2(@types/node@20.19.10)(typescript@5.9.2)) + + tailwindcss@3.4.17(ts-node@10.9.2(@types/node@20.19.10)(typescript@5.9.2)): + dependencies: + '@alloc/quick-lru': 5.2.0 + arg: 5.0.2 + chokidar: 3.6.0 + didyoumean: 1.2.2 + dlv: 1.1.3 + fast-glob: 3.3.3 + glob-parent: 6.0.2 + is-glob: 4.0.3 + jiti: 1.21.7 + lilconfig: 3.1.3 + micromatch: 4.0.8 + normalize-path: 3.0.0 + object-hash: 3.0.0 + picocolors: 1.1.1 + postcss: 8.5.6 + postcss-import: 15.1.0(postcss@8.5.6) + postcss-js: 4.0.1(postcss@8.5.6) + postcss-load-config: 4.0.2(postcss@8.5.6)(ts-node@10.9.2(@types/node@20.19.10)(typescript@5.9.2)) + postcss-nested: 6.2.0(postcss@8.5.6) + postcss-selector-parser: 6.1.2 + resolve: 1.22.10 + sucrase: 3.35.0 + transitivePeerDependencies: + - ts-node + + tailwindcss@4.1.11: {} + + tapable@2.2.2: {} + + tar-fs@2.1.3: + dependencies: + chownr: 1.1.4 + mkdirp-classic: 0.5.3 + pump: 3.0.3 + tar-stream: 2.2.0 + + tar-stream@2.2.0: + dependencies: + bl: 4.1.0 + end-of-stream: 1.4.5 + fs-constants: 1.0.0 + inherits: 2.0.4 + readable-stream: 3.6.2 + + tar@6.2.1: + dependencies: + chownr: 2.0.0 + fs-minipass: 2.1.0 + minipass: 5.0.0 + minizlib: 2.1.2 + mkdirp: 1.0.4 + yallist: 4.0.0 + + tar@7.4.3: + dependencies: + '@isaacs/fs-minipass': 4.0.1 + chownr: 3.0.0 + minipass: 7.1.2 + minizlib: 3.0.2 + mkdirp: 3.0.1 + yallist: 5.0.0 + + text-hex@1.0.0: {} + + thenify-all@1.6.0: + dependencies: + thenify: 3.3.1 + + thenify@3.3.1: + dependencies: + any-promise: 1.3.0 + + time-span@5.1.0: + dependencies: + convert-hrtime: 5.0.0 + + tinybench@2.9.0: {} + + tinyexec@0.3.2: {} + + tinyglobby@0.2.14: + dependencies: + fdir: 6.4.6(picomatch@4.0.3) + picomatch: 4.0.3 + + tinypool@1.1.1: {} + + tinyrainbow@1.2.0: {} + + tinyspy@3.0.2: {} + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + toidentifier@1.0.1: {} + + tr46@0.0.3: {} + + trim-lines@3.0.1: {} + + triple-beam@1.4.1: {} + + trough@2.2.0: {} + + ts-api-utils@2.1.0(typescript@5.9.2): + dependencies: + typescript: 5.9.2 + + ts-interface-checker@0.1.13: {} + + ts-node@10.9.2(@types/node@20.19.10)(typescript@5.9.2): + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.11 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 20.19.10 + acorn: 8.15.0 + acorn-walk: 8.3.4 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.9.2 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + optional: true + + ts-node@10.9.2(@types/node@24.2.1)(typescript@5.9.2): + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.11 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 24.2.1 + acorn: 8.15.0 + acorn-walk: 8.3.4 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.9.2 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + + tsconfig-paths@3.15.0: + dependencies: + '@types/json5': 0.0.29 + json5: 1.0.2 + minimist: 1.2.8 + strip-bom: 3.0.0 + + tslib@2.8.1: {} + + tsx@4.20.3: + dependencies: + esbuild: 0.25.8 + get-tsconfig: 4.10.1 + optionalDependencies: + fsevents: 2.3.3 + + tunnel-agent@0.6.0: + dependencies: + safe-buffer: 5.2.1 + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + type-is@2.0.1: + dependencies: + content-type: 1.0.5 + media-typer: 1.1.0 + mime-types: 3.0.1 + + typed-array-buffer@1.0.3: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-typed-array: 1.1.15 + + typed-array-byte-length@1.0.3: + dependencies: + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + + typed-array-byte-offset@1.0.4: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + reflect.getprototypeof: 1.0.10 + + typed-array-length@1.0.7: + dependencies: + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + is-typed-array: 1.1.15 + possible-typed-array-names: 1.1.0 + reflect.getprototypeof: 1.0.10 + + typescript@5.9.2: {} + + unbox-primitive@1.1.0: + dependencies: + call-bound: 1.0.4 + has-bigints: 1.1.0 + has-symbols: 1.1.0 + which-boxed-primitive: 1.1.1 + + undici-types@6.21.0: {} + + undici-types@7.10.0: {} + + undici@7.13.0: {} + + unified@11.0.5: + dependencies: + '@types/unist': 3.0.3 + bail: 2.0.2 + devlop: 1.1.0 + extend: 3.0.2 + is-plain-obj: 4.1.0 + trough: 2.2.0 + vfile: 6.0.3 + + unique-filename@1.1.1: + dependencies: + unique-slug: 2.0.2 + optional: true + + unique-slug@2.0.2: + dependencies: + imurmurhash: 0.1.4 + optional: true + + unist-util-is@6.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-position@5.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-stringify-position@4.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-visit-parents@6.0.1: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.0 + + unist-util-visit@5.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + + unpipe@1.0.0: {} + + unrs-resolver@1.11.1: + dependencies: + napi-postinstall: 0.3.2 + optionalDependencies: + '@unrs/resolver-binding-android-arm-eabi': 1.11.1 + '@unrs/resolver-binding-android-arm64': 1.11.1 + '@unrs/resolver-binding-darwin-arm64': 1.11.1 + '@unrs/resolver-binding-darwin-x64': 1.11.1 + '@unrs/resolver-binding-freebsd-x64': 1.11.1 + '@unrs/resolver-binding-linux-arm-gnueabihf': 1.11.1 + '@unrs/resolver-binding-linux-arm-musleabihf': 1.11.1 + '@unrs/resolver-binding-linux-arm64-gnu': 1.11.1 + '@unrs/resolver-binding-linux-arm64-musl': 1.11.1 + '@unrs/resolver-binding-linux-ppc64-gnu': 1.11.1 + '@unrs/resolver-binding-linux-riscv64-gnu': 1.11.1 + '@unrs/resolver-binding-linux-riscv64-musl': 1.11.1 + '@unrs/resolver-binding-linux-s390x-gnu': 1.11.1 + '@unrs/resolver-binding-linux-x64-gnu': 1.11.1 + '@unrs/resolver-binding-linux-x64-musl': 1.11.1 + '@unrs/resolver-binding-wasm32-wasi': 1.11.1 + '@unrs/resolver-binding-win32-arm64-msvc': 1.11.1 + '@unrs/resolver-binding-win32-ia32-msvc': 1.11.1 + '@unrs/resolver-binding-win32-x64-msvc': 1.11.1 + + update-browserslist-db@1.1.3(browserslist@4.25.1): + dependencies: + browserslist: 4.25.1 + escalade: 3.2.0 + picocolors: 1.1.1 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + use-callback-ref@1.3.3(@types/react@19.1.9)(react@19.1.1): + dependencies: + react: 19.1.1 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.1.9 + + use-sidecar@1.1.3(@types/react@19.1.9)(react@19.1.1): + dependencies: + detect-node-es: 1.1.0 + react: 19.1.1 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.1.9 + + use-sync-external-store@1.5.0(react@19.1.1): + dependencies: + react: 19.1.1 + + util-deprecate@1.0.2: {} + + v8-compile-cache-lib@3.0.1: {} + + vary@1.1.2: {} + + vfile-message@4.0.3: + dependencies: + '@types/unist': 3.0.3 + unist-util-stringify-position: 4.0.0 + + vfile@6.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile-message: 4.0.3 + + vite-node@2.1.9(@types/node@24.2.1)(lightningcss@1.30.1): + dependencies: + cac: 6.7.14 + debug: 4.4.1 + es-module-lexer: 1.7.0 + pathe: 1.1.2 + vite: 5.4.19(@types/node@24.2.1)(lightningcss@1.30.1) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + + vite@5.4.19(@types/node@24.2.1)(lightningcss@1.30.1): + dependencies: + esbuild: 0.21.5 + postcss: 8.5.6 + rollup: 4.46.2 + optionalDependencies: + '@types/node': 24.2.1 + fsevents: 2.3.3 + lightningcss: 1.30.1 + + vitest@2.1.9(@types/node@24.2.1)(lightningcss@1.30.1): + dependencies: + '@vitest/expect': 2.1.9 + '@vitest/mocker': 2.1.9(vite@5.4.19(@types/node@24.2.1)(lightningcss@1.30.1)) + '@vitest/pretty-format': 2.1.9 + '@vitest/runner': 2.1.9 + '@vitest/snapshot': 2.1.9 + '@vitest/spy': 2.1.9 + '@vitest/utils': 2.1.9 + chai: 5.2.1 + debug: 4.4.1 + expect-type: 1.2.2 + magic-string: 0.30.17 + pathe: 1.1.2 + std-env: 3.9.0 + tinybench: 2.9.0 + tinyexec: 0.3.2 + tinypool: 1.1.1 + tinyrainbow: 1.2.0 + vite: 5.4.19(@types/node@24.2.1)(lightningcss@1.30.1) + vite-node: 2.1.9(@types/node@24.2.1)(lightningcss@1.30.1) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 24.2.1 + transitivePeerDependencies: + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + + web-streams-polyfill@3.3.3: {} + + webidl-conversions@3.0.1: {} + + whatwg-url@5.0.0: + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + + which-boxed-primitive@1.1.1: + dependencies: + is-bigint: 1.1.0 + is-boolean-object: 1.2.2 + is-number-object: 1.1.1 + is-string: 1.1.1 + is-symbol: 1.1.1 + + which-builtin-type@1.2.1: + dependencies: + call-bound: 1.0.4 + function.prototype.name: 1.1.8 + has-tostringtag: 1.0.2 + is-async-function: 2.1.1 + is-date-object: 1.1.0 + is-finalizationregistry: 1.1.1 + is-generator-function: 1.1.0 + is-regex: 1.2.1 + is-weakref: 1.1.1 + isarray: 2.0.5 + which-boxed-primitive: 1.1.1 + which-collection: 1.0.2 + which-typed-array: 1.1.19 + + which-collection@1.0.2: + dependencies: + is-map: 2.0.3 + is-set: 2.0.3 + is-weakmap: 2.0.2 + is-weakset: 2.0.4 + + which-typed-array@1.1.19: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 + for-each: 0.3.5 + get-proto: 1.0.1 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + why-is-node-running@2.3.0: + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + + wide-align@1.1.5: + dependencies: + string-width: 4.2.3 + optional: true + + winston-transport@4.9.0: + dependencies: + logform: 2.7.0 + readable-stream: 3.6.2 + triple-beam: 1.4.1 + + winston@3.17.0: + dependencies: + '@colors/colors': 1.6.0 + '@dabh/diagnostics': 2.0.3 + async: 3.2.6 + is-stream: 2.0.1 + logform: 2.7.0 + one-time: 1.0.0 + readable-stream: 3.6.2 + safe-stable-stringify: 2.5.0 + stack-trace: 0.0.10 + triple-beam: 1.4.1 + winston-transport: 4.9.0 + + word-wrap@1.2.5: {} + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + + wrappy@1.0.2: {} + + xml2js@0.6.2: + dependencies: + sax: 1.4.1 + xmlbuilder: 11.0.1 + + xmlbuilder@11.0.1: {} + + xtend@4.0.2: {} + + y18n@5.0.8: {} + + yallist@4.0.0: {} + + yallist@5.0.0: {} + + yaml@2.8.1: {} + + yargs-parser@21.1.1: {} + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + yn@3.1.1: {} + + yocto-queue@0.1.0: {} + + zod@3.22.0: {} + + zod@4.1.5: {} + + zwitch@2.0.4: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml new file mode 100644 index 00000000..5e86f141 --- /dev/null +++ b/pnpm-workspace.yaml @@ -0,0 +1,16 @@ +packages: + - packages/* + +onlyBuiltDependencies: + - '@tailwindcss/oxide' + - bcrypt + - bufferutil + - esbuild + - go-ptt + - node-datachannel + - protobufjs + - sharp + - sqlite3 + - unrs-resolver + - utf-8-validate + - utp-native diff --git a/tsconfig.base.json b/tsconfig.base.json index 043a5b08..f9128f0f 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -1,7 +1,7 @@ { "compilerOptions": { - "target": "es2021", - "module": "commonjs", + "target": "es2022", + "module": "esnext", "moduleResolution": "node", "incremental": true, "composite": true,