diff --git a/.claude/launch.json b/.claude/launch.json new file mode 100644 index 00000000..bec6d9b8 --- /dev/null +++ b/.claude/launch.json @@ -0,0 +1,12 @@ +{ + "version": "0.0.1", + "configurations": [ + { + "name": "slim-dev", + "runtimeExecutable": "pnpm", + "runtimeArgs": ["start"], + "port": 3000, + "autoPort": true + } + ] +} diff --git a/.deepsource.toml b/.deepsource.toml index db512b7e..881e924a 100644 --- a/.deepsource.toml +++ b/.deepsource.toml @@ -1,5 +1,14 @@ version = 1 +# Playwright specs, helpers, and the local e2e static server are test +# infrastructure — not production browser code — so exclude them from the +# JavaScript analyzer (which is configured for the React app). +exclude_patterns = [ + "e2e/**", + "scripts/serve-e2e.mjs", + "playwright.config.ts", +] + [[analyzers]] name = "javascript" enabled = true diff --git a/.github/workflows/e2e-visual.yml b/.github/workflows/e2e-visual.yml new file mode 100644 index 00000000..714fe67a --- /dev/null +++ b/.github/workflows/e2e-visual.yml @@ -0,0 +1,62 @@ +name: slim/e2e-visual-regression + +# Visual-regression tests for the deck.gl bulk-annotation renderer. +# +# Runs inside the pinned Playwright container so the (SwiftShader) browser +# environment is byte-for-byte identical to the committed Linux baselines under +# e2e/__screenshots__/. See e2e/README.md. +# +# The default target study is fetched from the public IDC proxy, so runs depend +# on that external service; retries (configured in playwright.config.ts) absorb +# cold-start slowness. This check is intentionally not required for merge — +# promote it in branch protection once data is hosted locally for hermetic runs. + +on: + pull_request: + branches: [master] + workflow_dispatch: + +permissions: + contents: read + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: ${{ github.event_name == 'pull_request' }} + +jobs: + visual: + name: "Bulk annotation visual regression" + runs-on: ubuntu-latest + timeout-minutes: 45 + container: + # Keep this tag in sync with the @playwright/test version in package.json. + image: mcr.microsoft.com/playwright:v1.62.1-jammy + steps: + - name: Checkout repository + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + + - name: Setup pnpm + uses: pnpm/action-setup@0ebf47130e4866e96fce0953f49152a61190b271 # v6.0.9 + + - name: Install dependencies + # Dependency build scripts are gated by allowBuilds in pnpm-workspace.yaml. + # The git-hosted dicom-microscopy-viewer needs its prepare script to build dist/. + run: pnpm install --frozen-lockfile + + - name: Build (e2e config) + run: pnpm run build:e2e + + - name: Run visual-regression tests + # Playwright starts the static server (serve:e2e) itself via the + # webServer config and compares against the committed baselines. + run: pnpm run test:e2e + + - name: Upload Playwright report + if: ${{ !cancelled() }} + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 + with: + name: playwright-report + path: | + playwright-report/ + test-results/ + retention-days: 14 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 48a08c93..8ed7bc66 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -35,7 +35,9 @@ jobs: cache: pnpm - name: Install dependencies - run: pnpm install --frozen-lockfile --ignore-scripts + # Dependency build scripts are gated by allowBuilds in pnpm-workspace.yaml. + # The git-hosted dicom-microscopy-viewer needs its prepare script to build dist/. + run: pnpm install --frozen-lockfile - name: Build run: pnpm run build diff --git a/.gitignore b/.gitignore index e68e7de5..54ca1ce8 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ /node_modules /.pnp .pnp.js +/.pnpm-store # testing /coverage @@ -18,6 +19,13 @@ public/config/* !public/config/demo.js !public/config/local.js !public/config/preview.js +!public/config/e2e.js + +# Playwright +/test-results +/playwright-report +/blob-report +/playwright/.cache # misc .DS_Store diff --git a/.sonarcloud.properties b/.sonarcloud.properties new file mode 100644 index 00000000..d97df17f --- /dev/null +++ b/.sonarcloud.properties @@ -0,0 +1,13 @@ +# SonarCloud automatic-analysis configuration. +# +# Workflow files are excluded because rule githubactions:S6505 flags +# "pnpm install" without --ignore-scripts. While dicom-microscopy-viewer is +# pinned to a git commit, its prepare script must run at install time to +# build dist/. Lifecycle scripts remain gated per-package by the allowBuilds +# allowlist in pnpm-workspace.yaml, which is stricter than a blanket +# --ignore-scripts. Remove this exclusion once dmv is pinned to a published +# npm release again (npm tarballs ship prebuilt dist/). +# e2e/ and scripts/serve-e2e.mjs are test infrastructure (Playwright + a local +# static server), not production code. Excluding them keeps the quality gate +# focused on the shipped app. +sonar.exclusions=.github/workflows/*.yml,e2e/**,scripts/serve-e2e.mjs,playwright.config.ts diff --git a/e2e/README.md b/e2e/README.md new file mode 100644 index 00000000..d2c3ba00 --- /dev/null +++ b/e2e/README.md @@ -0,0 +1,81 @@ +# End-to-end / visual-regression tests + +Playwright tests that drive the real app in a real (WebGL-capable) browser and +compare the deck.gl bulk-annotation overlay against committed screenshot +baselines, so rendering regressions are caught automatically. + +## What is covered + +- `bulk-annotations.spec.ts` + - A large (~396k-polygon) annotation group loads and paints without + exhausting the JS heap (the OpenLayers Feature pipeline this replaced OOM'd + on groups this size). + - The annotation overlay matches a committed screenshot baseline (clipped to + the map viewport so the memory footer / sidebar never affect the diff). + - Hiding a group frees the overlay. + +## Data source + +By default the app is built with `public/config/e2e.js`, which points at the +**public NCI Imaging Data Commons proxy** — no local DICOM server required. The +default study is `TCGA-02-0001` (a glioblastoma WSI with a large "Nuclei" +POLYGON group). + +Override the target without editing code: + +- `E2E_STUDY_UID` — study to open +- `E2E_SERIES_UID` — SM series to open (pinned so the suite doesn't depend + on slim's default study→series redirect; this study has four slides) +- `E2E_GROUP_NAME` — annotation group name to toggle (default `Nuclei`) +- `E2E_BASE_URL` — point at an already-running server instead of letting + Playwright serve the build (e.g. a local dcm4chee-backed deployment) + +### Fully local / hermetic data (optional) + +For a network-independent run you can host the study yourself (e.g. a local +`dcm4chee` via the +[imaging-data-commons-skill](https://github.com/ImagingDataCommons/imaging-data-commons-skill) +to fetch the study, then upload to your DICOMweb server), copy +`public/config/e2e.js` to point `url` at it, and run the suite normally. This +avoids proxy rate limits but is heavier to set up and is not used in CI. + +## Running locally + +```bash +# 1. Build once with the e2e config and serve it (or use the dev server: +# PORT=3977 REACT_APP_CONFIG=e2e pnpm start). +pnpm run build:e2e && pnpm run serve:e2e # terminal A +# 2. Run the tests (reuses the running server). +pnpm run test:e2e # terminal B +``` + +`serve:e2e` is a tiny dependency-free SPA static server +(`scripts/serve-e2e.mjs`) that listens on port **3977** (chosen so it never +collides with other common `:3000` dev servers). Playwright can also start it +itself via the `webServer` config when nothing is listening on that port. + +## Screenshot baselines + +WebGL output is made deterministic across machines by forcing ANGLE + +SwiftShader (software rendering). SwiftShader still differs between operating +systems, so **baselines are per-OS** and the ones committed here are **Linux**, +matching CI. + +Regenerate them with the pinned Playwright container (browser runs in the +container; the app is served from the host): + +```bash +pnpm run build:e2e && pnpm run serve:e2e # terminal A +pnpm run test:e2e:update:docker # terminal B +# review the diff under e2e/__screenshots__/ and commit +``` + +Generating baselines with a plain `pnpm run test:e2e:update` on macOS/Windows +produces host-OS snapshots that will **not** match CI — always use the Docker +script for committed baselines. + +## CI + +`.github/workflows/e2e-visual.yml` runs this suite inside the same pinned +Playwright container, so the browser environment is byte-for-byte identical to +the local baseline-generation path above. diff --git a/e2e/__screenshots__/bulk-annotations.spec.ts/nuclei-whole-slide-linux.png b/e2e/__screenshots__/bulk-annotations.spec.ts/nuclei-whole-slide-linux.png new file mode 100644 index 00000000..950eef85 Binary files /dev/null and b/e2e/__screenshots__/bulk-annotations.spec.ts/nuclei-whole-slide-linux.png differ diff --git a/e2e/bulk-annotations.spec.ts b/e2e/bulk-annotations.spec.ts new file mode 100644 index 00000000..d6e7522b --- /dev/null +++ b/e2e/bulk-annotations.spec.ts @@ -0,0 +1,83 @@ +import { expect, test } from '@playwright/test' + +import { + GROUP_NAME, + SERIES_UID, + STUDY_UID, + deckDrawnPixelCount, + expandAnnotationGroups, + mapClip, + setGroupVisibility, + prepareAnnotationScreenshot, + usedHeapMB, + waitForAnnotationsCleared, + waitForAnnotationsDrawn, + waitForAnnotationsStable, + waitForSlide, +} from './helpers' + +/** + * Visual-regression + smoke coverage for the deck.gl bulk-annotation renderer. + * + * The default target is a ~396k-polygon "Nuclei" group (see helpers.ts). The + * suite asserts three things that matter for the renderer: + * 1. A large group loads and paints without exhausting the JS heap (the OL + * Feature pipeline this replaced OOM'd on groups this size). + * 2. The annotation overlay matches a committed screenshot baseline. + * 3. Hiding the group frees the overlay. + * + * Screenshots are clipped to the map viewport so the volatile memory footer + * and sidebar text never enter the comparison. + */ +test.describe('bulk annotations (deck.gl overlay)', () => { + test.beforeEach(async ({ page }) => { + await page.goto(`/studies/${STUDY_UID}/series/${SERIES_UID}`) + await waitForSlide(page) + await expandAnnotationGroups(page) + }) + + test('renders a large annotation group without exhausting memory', async ({ + page, + }) => { + const heapBefore = await usedHeapMB(page) + + await setGroupVisibility(page, GROUP_NAME, true) + + const drawnPixels = await waitForAnnotationsDrawn(page) + expect(drawnPixels).toBeGreaterThan(500) + + // Wait for progressive streaming to finish so the whole-slide overlay + // (the deterministic screenshot target) reflects the complete group. + await waitForAnnotationsStable(page) + + const heapAfter = await usedHeapMB(page) + if (heapBefore >= 0 && heapAfter >= 0) { + // Guardrail against a regression to the old multi-GB / OOM behavior. + // ~396k polygons decode to a few hundred MB; 1500 MB leaves headroom + // without letting a runaway leak pass. + expect(heapAfter).toBeLessThan(1500) + } + + // The whole-slide fit is fully deterministic (image dimensions + viewport). + // Hide the WSI tile layers / chrome so the screenshot compares only the + // deck.gl overlay — WSI tile decoding is non-deterministic across runs. + await page + .waitForLoadState('networkidle', { timeout: 60_000 }) + .catch(() => undefined) + await prepareAnnotationScreenshot(page) + await expect(page).toHaveScreenshot('nuclei-whole-slide.png', { + clip: await mapClip(page), + timeout: 120_000, + }) + }) + + test('hides an annotation group on toggle-off', async ({ page }) => { + await setGroupVisibility(page, GROUP_NAME, true) + await waitForAnnotationsDrawn(page) + + await setGroupVisibility(page, GROUP_NAME, false) + + await waitForAnnotationsCleared(page) + expect(await deckDrawnPixelCount(page)).toBeLessThan(500) + }) +}) diff --git a/e2e/helpers.ts b/e2e/helpers.ts new file mode 100644 index 00000000..dc02821a --- /dev/null +++ b/e2e/helpers.ts @@ -0,0 +1,307 @@ +import { type Page, expect } from '@playwright/test' + +/** + * Default target: the TCGA-02-0001 glioblastoma study on the public IDC proxy. + * Slim auto-selects slide DX1, whose referenced SM series is overlaid by a + * single POLYGON "Nuclei" annotation group of ~396k annotations — a good + * stress test for the deck.gl LOD / spatial-tiling path. + */ +export const STUDY_UID = + process.env.E2E_STUDY_UID ?? '2.25.68803095896966276583382138924964839274' + +/** + * SM series for slide DX1. Pinning this (instead of relying on slim's default + * study→series redirect) keeps the visual baseline pointed at one slide — + * this study has four, each with its own ~hundreds-of-thousands Nuclei group. + */ +export const SERIES_UID = + process.env.E2E_SERIES_UID ?? + '1.3.6.1.4.1.5962.99.1.1163866303.1057408148.1637546438847.2.0' + +/** Name of the annotation group to exercise. */ +export const GROUP_NAME = process.env.E2E_GROUP_NAME ?? 'Nuclei' + +/** Non-transparent deck-canvas pixels that count as "annotations drawn". */ +const DRAWN_PIXEL_THRESHOLD = 500 + +/** Ignore network-idle timeouts; WSI tile streaming rarely goes truly idle. */ +function ignoreNetworkIdleTimeout(): undefined { + return undefined +} + +/** + * Read the deck.gl overlay canvas (the large WebGL2 canvas inside the OL map) + * and count non-transparent pixels. Returns -1 when the canvas is not found. + * + * A fresh getContext() returns the existing context, so this reflects the live + * overlay rather than a new blank buffer. + */ +export async function deckDrawnPixelCount(page: Page): Promise { + return await page.evaluate(() => { + const canvases = Array.from(document.querySelectorAll('canvas')) + const deck = canvases.find((canvas) => { + try { + return canvas.getContext('webgl2') != null && canvas.width > 200 + } catch { + return false + } + }) + if (deck == null) { + return -1 + } + const gl = deck.getContext('webgl2') + if (gl == null) { + return -1 + } + const { width, height } = deck + const pixels = new Uint8Array(width * height * 4) + gl.readPixels(0, 0, width, height, gl.RGBA, gl.UNSIGNED_BYTE, pixels) + let nonTransparent = 0 + for (let i = 3; i < pixels.length; i += 4) { + if (pixels[i] !== 0) { + nonTransparent++ + } + } + return nonTransparent + }) +} + +/** Current JS heap usage in MB (Chromium only), or -1 when unavailable. */ +export async function usedHeapMB(page: Page): Promise { + return await page.evaluate(() => { + const mem = ( + performance as unknown as { memory?: { usedJSHeapSize: number } } + ).memory + return mem != null + ? Number((mem.usedJSHeapSize / 1048576).toFixed(1)) + : -1 + }) +} + +/** Bounding box of the largest OpenLayers viewport (the main volume viewer). */ +export async function mapClip(page: Page): Promise<{ + x: number + y: number + width: number + height: number +}> { + const box = await page.evaluate(() => { + const viewports = Array.from(document.querySelectorAll('.ol-viewport')) + let best: DOMRect | null = null + for (const viewport of viewports) { + const rect = viewport.getBoundingClientRect() + if (best == null || rect.width * rect.height > best.width * best.height) { + best = rect + } + } + return best == null + ? null + : { x: best.x, y: best.y, width: best.width, height: best.height } + }) + if (box == null) { + throw new Error('Could not locate the OpenLayers map viewport') + } + return { + x: Math.round(box.x), + y: Math.round(box.y), + width: Math.round(box.width), + height: Math.round(box.height), + } +} + +/** + * Wait until the main slide viewer has mounted and image tiles have settled. + * A whole-slide image streams tiles continuously, so we bound the network-idle + * wait and always add a fixed settle rather than relying on true idle. + */ +export async function waitForSlide(page: Page): Promise { + await page.waitForSelector('.ol-viewport canvas', { timeout: 180_000 }) + // The left metadata panel (which holds the Annotation Groups accordion) + // renders once the slide's instances have been fetched. + await page + .getByRole('menuitem', { name: 'Annotation Groups' }) + .waitFor({ timeout: 180_000 }) + await page + .waitForLoadState('networkidle', { timeout: 30_000 }) + .catch(ignoreNetworkIdleTimeout) + await page.waitForTimeout(2000) +} + +/** Expand the "Annotation Groups" accordion so its switches render. */ +export async function expandAnnotationGroups(page: Page): Promise { + await page.getByRole('menuitem', { name: 'Annotation Groups' }).click() + await page.getByRole('switch').first().waitFor({ timeout: 15_000 }) + await page.waitForTimeout(500) +} + +/** + * Report whether the named group's visibility switch is checked, or null when + * the switch cannot be found. The switch lives in the same list container as + * the group's menuitem, so the in-page lookup walks up from the menuitem until + * it finds one. (The lookup is duplicated in setGroupVisibility because + * functions cannot be shared across the browser boundary.) + */ +async function groupSwitchChecked( + page: Page, + groupName: string, +): Promise { + return await page.evaluate((name) => { + const items = Array.from(document.querySelectorAll('[role="menuitem"]')) + const item = items.find((el) => (el.textContent ?? '').includes(name)) + let container: Element | null | undefined = item + for (let depth = 0; depth < 6 && container != null; depth++) { + const sw = container.querySelector('button[role="switch"]') + if (sw != null) { + return sw.getAttribute('aria-checked') === 'true' + } + container = container.parentElement + } + return null + }, groupName) +} + +/** + * Set the visibility of the annotation group with the given name and wait for + * the switch state to reflect it (aria-checked updates asynchronously after + * React re-renders). + * + * The switch can sit beneath the sticky footer, so it is toggled through the + * DOM (a real user would scroll first; the click still exercises the app's + * handler). + */ +export async function setGroupVisibility( + page: Page, + groupName: string, + visible: boolean, +): Promise { + const result = await page.evaluate( + ({ groupName: name, visible: wantVisible }) => { + const items = Array.from(document.querySelectorAll('[role="menuitem"]')) + const item = items.find((el) => (el.textContent ?? '').includes(name)) + let sw: HTMLButtonElement | null = null + let container: Element | null | undefined = item + for (let depth = 0; depth < 6 && container != null; depth++) { + sw = container.querySelector('button[role="switch"]') + if (sw != null) { + break + } + container = container.parentElement + } + if (sw == null) { + return 'switch-not-found' + } + const checked = sw.getAttribute('aria-checked') === 'true' + if (checked !== wantVisible) { + sw.click() + } + return 'ok' + }, + { groupName, visible }, + ) + if (result !== 'ok') { + throw new Error( + `Visibility switch for annotation group "${groupName}" not found`, + ) + } + await expect + .poll(async () => await groupSwitchChecked(page, groupName), { + timeout: 15_000, + }) + .toBe(visible) +} + +/** Poll until the deck overlay has drawn content (annotations visible). */ +export async function waitForAnnotationsDrawn(page: Page): Promise { + let count = 0 + await expect + .poll( + async () => { + count = await deckDrawnPixelCount(page) + return count + }, + { timeout: 180_000, intervals: [1000, 2000, 3000, 5000] }, + ) + .toBeGreaterThan(DRAWN_PIXEL_THRESHOLD) + return count +} + +/** + * Wait until annotation loading has settled by polling the drawn-pixel count + * until it stops changing across consecutive samples. + * + * This matters for deterministic screenshots: a group streams in progressively + * and the whole-slide overlay only reflects the complete group once streaming + * finishes. Waiting for a stable count first makes the screenshot identical + * every run. + */ +export async function waitForAnnotationsStable(page: Page): Promise { + let previous = -1 + let stableSamples = 0 + const requiredStableSamples = 3 + await expect + .poll( + async () => { + const count = await deckDrawnPixelCount(page) + // Tolerate tiny sampling jitter (< 0.5%) as "unchanged". + const changed = + previous < 0 || Math.abs(count - previous) > previous * 0.005 + 50 + stableSamples = changed ? 0 : stableSamples + 1 + previous = count + return stableSamples + }, + { timeout: 180_000, intervals: [2000] }, + ) + .toBeGreaterThanOrEqual(requiredStableSamples) +} + +/** Poll until the deck overlay is effectively empty (annotations hidden). */ +export async function waitForAnnotationsCleared(page: Page): Promise { + await expect + .poll(async () => await deckDrawnPixelCount(page), { + timeout: 60_000, + intervals: [500, 1000, 2000], + }) + .toBeLessThan(DRAWN_PIXEL_THRESHOLD) +} + +/** + * Hide everything that is not the deck.gl annotation overlay so screenshots + * compare only the annotation rendering (and not flaky WSI tile decoding, + * the overview map, or the scale bar). + * + * Mutates the live page; call immediately before toHaveScreenshot. + */ +export async function prepareAnnotationScreenshot(page: Page): Promise { + await page.evaluate(() => { + for (const canvas of document.querySelectorAll('canvas')) { + try { + if (canvas.getContext('webgl2') == null) { + ;(canvas as HTMLElement).style.visibility = 'hidden' + } + } catch { + ;(canvas as HTMLElement).style.visibility = 'hidden' + } + } + for (const selector of [ + '.ol-overviewmap', + '.ol-scale-line', + '.ol-zoom', + '.ol-attribution', + ]) { + document.querySelectorAll(selector).forEach((el) => { + ;(el as HTMLElement).style.visibility = 'hidden' + }) + } + // Slim's custom scale / overview chrome is not always an OL control. + document.querySelectorAll('body *').forEach((el) => { + const text = (el.textContent ?? '').trim() + if (/^\d+(\.\d+)?\s*(µm|mm|cm)$/.test(text)) { + ;(el as HTMLElement).style.visibility = 'hidden' + const parent = el.parentElement + if (parent != null) { + parent.style.visibility = 'hidden' + } + } + }) + }) +} diff --git a/e2e/update-snapshots-docker.sh b/e2e/update-snapshots-docker.sh new file mode 100755 index 00000000..af1a22db --- /dev/null +++ b/e2e/update-snapshots-docker.sh @@ -0,0 +1,40 @@ +#!/usr/bin/env bash +# +# Regenerate the Linux screenshot baselines that CI compares against, using the +# pinned Playwright container so the browser environment matches CI exactly. +# +# The app itself is served from the host (static output is OS-independent); only +# the browser runs inside the container. Start the server first, e.g.: +# +# pnpm run build:e2e && pnpm run serve:e2e # in another terminal +# # or, for iterating on specs: +# REACT_APP_CONFIG=e2e pnpm start +# +# then run: +# +# pnpm run test:e2e:update:docker +# +set -euo pipefail + +# Keep in sync with the @playwright/test version in package.json. +PLAYWRIGHT_VERSION="$(node -p "require('@playwright/test/package.json').version")" +IMAGE="mcr.microsoft.com/playwright:v${PLAYWRIGHT_VERSION}-jammy" + +# The container reaches the host dev/preview server via host.docker.internal. +BASE_URL="${E2E_BASE_URL:-http://host.docker.internal:3977}" + +REPO_ROOT="$(cd "$(dirname "$0")/.." && pwd)" + +echo "Using ${IMAGE}" +echo "Target app: ${BASE_URL} (must already be served from the host)" + +docker run --rm \ + --add-host=host.docker.internal:host-gateway \ + -e CI=1 \ + -e "E2E_BASE_URL=${BASE_URL}" \ + -v "${REPO_ROOT}:/work" \ + -w /work \ + "${IMAGE}" \ + npx playwright test --update-snapshots + +echo "Baselines updated under e2e/__screenshots__/. Review and commit them." diff --git a/package.json b/package.json index 1dac799f..2571395d 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,11 @@ "fmt": "biome format --write .", "format": "biome format --write .", "test": "craco test --watchAll=false", + "build:e2e": "REACT_APP_CONFIG=e2e PUBLIC_URL=/ ./scripts/set-git-env.sh craco build", + "serve:e2e": "node scripts/serve-e2e.mjs", + "test:e2e": "playwright test", + "test:e2e:update": "playwright test --update-snapshots", + "test:e2e:update:docker": "./e2e/update-snapshots-docker.sh", "predeploy": "REACT_APP_CONFIG=demo PUBLIC_URL='https://imagingdatacommons.github.io/slim/' ./scripts/set-git-env.sh craco build", "deploy": "gh-pages -d build", "clean": "rm -rf ./build ./node_modules", @@ -37,11 +42,16 @@ ] }, "dependencies": { + "@radix-ui/react-popover": "^1.1.23", + "@radix-ui/react-slider": "^1.4.7", + "@radix-ui/react-switch": "^1.3.7", "antd": "^4.22.8", + "class-variance-authority": "^0.7.1", "classnames": "^2.2.6", + "clsx": "^2.1.1", "dcmjs": "^0.35.0", "detect-browser": "^5.2.1", - "dicom-microscopy-viewer": "^0.48.23", + "dicom-microscopy-viewer": "github:ImagingDataCommons/dicom-microscopy-viewer#1b39614eae92e92578d14977f66ced60243e51bc", "dicomweb-client": "0.10.3", "oidc-client": "^1.11.5", "ol": "^10.7.0", @@ -51,6 +61,7 @@ "react-icons": "^3.11.0", "react-router-dom": "^6.3.0", "retry": "^0.13.1", + "tailwind-merge": "^3.6.0", "uuid": "^8.3.2" }, "devDependencies": { @@ -59,6 +70,7 @@ "@babel/preset-typescript": "^7.17.12", "@biomejs/biome": "2.4.16", "@craco/craco": "^6.4.0", + "@playwright/test": "^1.62.1", "@semantic-release/changelog": "^6.0.3", "@semantic-release/commit-analyzer": "^12.0.0", "@semantic-release/git": "^10.0.1", @@ -78,6 +90,7 @@ "@types/retry": "^0.12.1", "@types/uuid": "^8.3.0", "ajv": "6.12.6", + "autoprefixer": "^10.5.4", "copy-webpack-plugin": "9.1.0", "craco-less": "^2.0.0", "eslint": "^8.57.0", @@ -85,10 +98,12 @@ "fraction.js": "^4.3.7", "gh-pages": "^5.0.0", "husky": "^9.1.7", + "postcss": "8.5.25", "react-scripts": "5.0.0", "react-test-renderer": "^18.2.0", "semantic-release": "21.1.2", "sonarqube-scanner": "^4.3.0", + "tailwindcss": "^3.4.19", "typescript": "^4.7.4" } } diff --git a/playwright.config.ts b/playwright.config.ts new file mode 100644 index 00000000..ebdf27cd --- /dev/null +++ b/playwright.config.ts @@ -0,0 +1,107 @@ +import { defineConfig, devices } from '@playwright/test' + +/** + * Playwright config for slim end-to-end / visual-regression tests. + * + * These tests drive the real app in a real browser (WebGL required for the + * deck.gl bulk-annotation overlay) and compare screenshots against committed + * baselines to catch rendering regressions. + * + * Data source: by default the app is configured (public/config/e2e.js) to talk + * to the public NCI Imaging Data Commons proxy, so no local DICOM server is + * needed. Override the target study/series with E2E_* env vars (see the spec). + * + * WebGL determinism: Chromium is launched with ANGLE + SwiftShader (software + * rendering) so the exact same pixels are produced on any machine. Because + * SwiftShader output still differs between operating systems, screenshot + * baselines are stored per-platform and MUST be generated on the same OS as CI + * (Linux). Use `pnpm test:e2e:update:docker` to (re)generate Linux baselines + * locally via the pinned Playwright container. See e2e/README.md. + */ + +const isCI = Boolean(process.env.CI) + +/** + * When E2E_BASE_URL is set we assume the caller manages the server (e.g. a + * Linux container pointed at the host, or CI serving a prebuilt bundle), so + * Playwright should not spawn its own web server. + */ +/** + * A dedicated port avoids clashes with other dev servers commonly bound to + * :3000 (note: another IPv6 listener on the same port can shadow slim when + * "localhost" resolves to ::1). + */ +const externalBaseUrl = process.env.E2E_BASE_URL +const baseURL = externalBaseUrl ?? 'http://127.0.0.1:3977' + +export default defineConfig({ + testDir: './e2e', + /** + * deck.gl rendering plus cold WSI + bulk-annotation loading over the public + * proxy is slow, especially under SwiftShader in CI; be generous. + */ + timeout: 300_000, + expect: { + timeout: 30_000, + toHaveScreenshot: { + /** + * Tolerate minor antialiasing / tile-decode differences in the WSI + * background while still catching annotation rendering regressions. + */ + // Overlay-only screenshots (WSI tiles hidden) are stable; keep this tight. + maxDiffPixelRatio: 0.01, + /** Per-pixel threshold (0-1); higher = more permissive on color. */ + threshold: 0.15, + }, + }, + /** One heavy WebGL app instance at a time keeps runs deterministic. */ + fullyParallel: false, + workers: 1, + forbidOnly: isCI, + retries: isCI ? 1 : 0, + reporter: [['list'], ['html', { open: 'never' }]], + /** Keep baselines organized and per-OS so macOS/Linux never clash. */ + snapshotPathTemplate: + '{testDir}/__screenshots__/{testFilePath}/{arg}-{platform}{ext}', + use: { + baseURL, + viewport: { width: 1600, height: 900 }, + deviceScaleFactor: 1, + trace: 'retain-on-failure', + screenshot: 'only-on-failure', + video: 'retain-on-failure', + }, + projects: [ + { + name: 'chromium', + use: { + ...devices['Desktop Chrome'], + viewport: { width: 1600, height: 900 }, + launchOptions: { + args: [ + // Force deterministic software WebGL2 (ANGLE + SwiftShader) so the + // deck.gl overlay renders identically across machines. + '--use-gl=angle', + '--use-angle=swiftshader', + '--enable-unsafe-swiftshader', + '--ignore-gpu-blocklist', + '--disable-dev-shm-usage', + ], + }, + }, + }, + ], + webServer: externalBaseUrl + ? undefined + : { + /** + * Serve a production build baked with the e2e config. Reuses an + * already-running dev server locally (e.g. `REACT_APP_CONFIG=e2e pnpm + * start`) so iterating on specs is fast. + */ + command: 'pnpm run serve:e2e', + url: baseURL, + reuseExistingServer: !isCI, + timeout: 180_000, + }, +}) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7ef18ebb..881553c3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -33,12 +33,27 @@ importers: .: dependencies: + '@radix-ui/react-popover': + specifier: ^1.1.23 + version: 1.1.23(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slider': + specifier: ^1.4.7 + version: 1.4.7(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-switch': + specifier: ^1.3.7 + version: 1.3.7(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) antd: specifier: ^4.22.8 version: 4.24.16(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + class-variance-authority: + specifier: ^0.7.1 + version: 0.7.1 classnames: specifier: ^2.2.6 version: 2.5.1 + clsx: + specifier: ^2.1.1 + version: 2.1.1 dcmjs: specifier: ^0.35.0 version: 0.35.0 @@ -46,8 +61,8 @@ importers: specifier: ^5.2.1 version: 5.3.0 dicom-microscopy-viewer: - specifier: ^0.48.23 - version: 0.48.23 + specifier: github:ImagingDataCommons/dicom-microscopy-viewer#1b39614eae92e92578d14977f66ced60243e51bc + version: https://codeload.github.com/ImagingDataCommons/dicom-microscopy-viewer/tar.gz/1b39614eae92e92578d14977f66ced60243e51bc(@loaders.gl/core@4.4.4)(@luma.gl/core@9.1.10)(@luma.gl/engine@9.1.10(@luma.gl/core@9.1.10)(@luma.gl/shadertools@9.1.10(@luma.gl/core@9.1.10))) dicomweb-client: specifier: 0.10.3 version: 0.10.3 @@ -56,7 +71,7 @@ importers: version: 1.11.5 ol: specifier: ^10.7.0 - version: 10.9.0 + version: 10.10.0 react: specifier: ^18.2.0 version: 18.3.1 @@ -75,6 +90,9 @@ importers: retry: specifier: ^0.13.1 version: 0.13.1 + tailwind-merge: + specifier: ^3.6.0 + version: 3.6.0 uuid: specifier: ^8.3.2 version: 8.3.2 @@ -94,6 +112,9 @@ importers: '@craco/craco': specifier: ^6.4.0 version: 6.4.5(@types/node@14.18.63)(react-scripts@5.0.0(@babel/plugin-syntax-flow@7.29.7(@babel/core@7.29.7))(@babel/plugin-transform-react-jsx@7.29.7(@babel/core@7.29.7))(@types/babel__core@7.20.5)(eslint@8.57.1)(react@18.3.1)(ts-node@10.9.2(@types/node@14.18.63)(typescript@4.9.5))(type-fest@4.41.0)(typescript@4.9.5))(typescript@4.9.5) + '@playwright/test': + specifier: ^1.62.1 + version: 1.62.1 '@semantic-release/changelog': specifier: ^6.0.3 version: 6.0.3(semantic-release@21.1.2(typescript@4.9.5)) @@ -117,7 +138,7 @@ importers: version: 5.17.0 '@testing-library/react': specifier: ^14.0.0 - version: 14.3.1(@types/react@18.3.30)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 14.3.1(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@testing-library/user-event': specifier: ^7.1.2 version: 7.2.1(@testing-library/dom@9.3.4) @@ -129,16 +150,16 @@ importers: version: 28.1.8 '@types/lodash': specifier: ^4.17.20 - version: 4.17.24 + version: 4.17.25 '@types/node': specifier: ^14.14.9 version: 14.18.63 '@types/react': specifier: ^18.0.14 - version: 18.3.30 + version: 18.3.31 '@types/react-dom': specifier: ^18.0.5 - version: 18.3.7(@types/react@18.3.30) + version: 18.3.7(@types/react@18.3.31) '@types/react-router-dom': specifier: ^5.3.3 version: 5.3.3 @@ -151,12 +172,15 @@ importers: ajv: specifier: 6.12.6 version: 6.12.6 + autoprefixer: + specifier: ^10.5.4 + version: 10.5.4(postcss@8.5.25) copy-webpack-plugin: specifier: 9.1.0 - version: 9.1.0(webpack@5.107.2(postcss@8.5.25)) + version: 9.1.0(webpack@5.109.2(postcss@8.5.25)) craco-less: specifier: ^2.0.0 - version: 2.0.0(@craco/craco@6.4.5(@types/node@14.18.63)(react-scripts@5.0.0(@babel/plugin-syntax-flow@7.29.7(@babel/core@7.29.7))(@babel/plugin-transform-react-jsx@7.29.7(@babel/core@7.29.7))(@types/babel__core@7.20.5)(eslint@8.57.1)(react@18.3.1)(ts-node@10.9.2(@types/node@14.18.63)(typescript@4.9.5))(type-fest@4.41.0)(typescript@4.9.5))(typescript@4.9.5))(react-scripts@5.0.0(@babel/plugin-syntax-flow@7.29.7(@babel/core@7.29.7))(@babel/plugin-transform-react-jsx@7.29.7(@babel/core@7.29.7))(@types/babel__core@7.20.5)(eslint@8.57.1)(react@18.3.1)(ts-node@10.9.2(@types/node@14.18.63)(typescript@4.9.5))(type-fest@4.41.0)(typescript@4.9.5))(webpack@5.107.2(postcss@8.5.25)) + version: 2.0.0(@craco/craco@6.4.5(@types/node@14.18.63)(react-scripts@5.0.0(@babel/plugin-syntax-flow@7.29.7(@babel/core@7.29.7))(@babel/plugin-transform-react-jsx@7.29.7(@babel/core@7.29.7))(@types/babel__core@7.20.5)(eslint@8.57.1)(react@18.3.1)(ts-node@10.9.2(@types/node@14.18.63)(typescript@4.9.5))(type-fest@4.41.0)(typescript@4.9.5))(typescript@4.9.5))(react-scripts@5.0.0(@babel/plugin-syntax-flow@7.29.7(@babel/core@7.29.7))(@babel/plugin-transform-react-jsx@7.29.7(@babel/core@7.29.7))(@types/babel__core@7.20.5)(eslint@8.57.1)(react@18.3.1)(ts-node@10.9.2(@types/node@14.18.63)(typescript@4.9.5))(type-fest@4.41.0)(typescript@4.9.5))(webpack@5.109.2(postcss@8.5.25)) eslint: specifier: ^8.57.0 version: 8.57.1 @@ -172,6 +196,9 @@ importers: husky: specifier: ^9.1.7 version: 9.1.7 + postcss: + specifier: 8.5.25 + version: 8.5.25 react-scripts: specifier: 5.0.0 version: 5.0.0(@babel/plugin-syntax-flow@7.29.7(@babel/core@7.29.7))(@babel/plugin-transform-react-jsx@7.29.7(@babel/core@7.29.7))(@types/babel__core@7.20.5)(eslint@8.57.1)(react@18.3.1)(ts-node@10.9.2(@types/node@14.18.63)(typescript@4.9.5))(type-fest@4.41.0)(typescript@4.9.5) @@ -183,7 +210,10 @@ importers: version: 21.1.2(typescript@4.9.5) sonarqube-scanner: specifier: ^4.3.0 - version: 4.3.6 + version: 4.4.0 + tailwindcss: + specifier: ^3.4.19 + version: 3.4.19 typescript: specifier: ^4.7.4 version: 4.9.5 @@ -200,8 +230,8 @@ packages: '@ant-design/colors@6.0.0': resolution: {integrity: sha512-qAZRvPzfdWHtfameEGP2Qvuf838NhergR35o+EuVyB5XvSA98xod5r4utvi4TJ3ywmevm290g9nsCG5MryrdWQ==} - '@ant-design/icons-svg@4.4.2': - resolution: {integrity: sha512-vHbT+zJEVzllwP+CM+ul7reTEfBR0vgxFe7+lREAsAA7YGsYpboiq2sQNeQeRvh09GfQgs/GyFEvZpJ9cLXpXA==} + '@ant-design/icons-svg@4.5.0': + resolution: {integrity: sha512-1BTUFyKPTBZ53MuTP8s0k5SFEXL7o3VHEOwLgzaoWKwnBeqIcqUtVshc4SKzhI6uACfqhJqBwBUE9FsWR3uULA==} '@ant-design/icons@4.8.3': resolution: {integrity: sha512-HGlIQZzrEbAhpJR6+IGdzfbPym94Owr6JZkJ2QCCnOkPVIWMO2xgIVcOKnl8YcpijIo39V7l2qQL5fmtw56cMw==} @@ -240,8 +270,8 @@ packages: '@babel/core': ^7.11.0 eslint: ^7.5.0 || ^8.0.0 || ^9.0.0 - '@babel/generator@7.29.7': - resolution: {integrity: sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==} + '@babel/generator@7.29.8': + resolution: {integrity: sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==} engines: {node: '>=6.9.0'} '@babel/helper-annotate-as-pure@7.29.7': @@ -331,8 +361,8 @@ packages: resolution: {integrity: sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==} engines: {node: '>=6.9.0'} - '@babel/parser@7.29.7': - resolution: {integrity: sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==} + '@babel/parser@7.29.8': + resolution: {integrity: sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==} engines: {node: '>=6.0.0'} hasBin: true @@ -697,8 +727,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-systemjs@7.29.7': - resolution: {integrity: sha512-TM2ZcQLoG2/y4HODiStCo10DibYhWhGWAwVv+EQKmG/7GFl0N+AAmUiXOMKM+aiJ9XBJ9AHVZBvTzMnJ2sM3cQ==} + '@babel/plugin-transform-modules-systemjs@7.29.8': + resolution: {integrity: sha512-6iSnEK0zlkLKU4heofK/AdmRD4e2SHVpJMtrwnTCzhnaM98ria4rTrOXBBi45BTTYnJtO8txnPsX4fChYXkmeA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -811,8 +841,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-regenerator@7.29.7': - resolution: {integrity: sha512-rNNFV0DBAJp988xW2DOntfDoYn1eR8GGF5AT5vYc+rjyfaQkM242c9tZUHHPe7KYaiJizXPWhQTzzdbXySyhBw==} + '@babel/plugin-transform-regenerator@7.29.8': + resolution: {integrity: sha512-0UpIXPtdDtMXfnV2OJAVMLpj3H/92vmkA6lpSRakmycJvj3VUy6Xs1dM8tXRugupykr5WB+LpiVl0J8LMVg2mg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -841,8 +871,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-spread@7.29.7': - resolution: {integrity: sha512-/u5K1QWada7tbYNqTjMh96718g9NTwh9tfPJMsSmVsQwGT447FskV+KcfeXkXq2GWki4EM/MuTdmBec+hOuVTQ==} + '@babel/plugin-transform-spread@7.29.8': + resolution: {integrity: sha512-4S9ksMGVWUshvgK0mKfvZky7leuG5/uoFVwMpAomJ8bMoDJiNHRVmc1EglwW/CmGVSqqWpEbXm9FmbRit22qoA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -930,12 +960,12 @@ packages: resolution: {integrity: sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.29.7': - resolution: {integrity: sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==} + '@babel/traverse@7.29.8': + resolution: {integrity: sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==} engines: {node: '>=6.9.0'} - '@babel/types@7.29.7': - resolution: {integrity: sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==} + '@babel/types@7.29.8': + resolution: {integrity: sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==} engines: {node: '>=6.9.0'} '@bcoe/v8-coverage@0.2.3': @@ -1126,8 +1156,26 @@ packages: resolution: {integrity: sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==} engines: {node: '>=10'} - '@eslint-community/eslint-utils@4.9.1': - resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} + '@deck.gl/core@9.1.15': + resolution: {integrity: sha512-2Tx2aKNskDS8SZ6EB7V53exo3SVntCJJGjrAnz3KhNj4fA4BVqOH++LSpjCFhuG9m4WOWDSDq9s7w4DQnTiT+Q==} + + '@deck.gl/extensions@9.1.15': + resolution: {integrity: sha512-pH3SArgiEibHwrYwbKTknUurgpUndUFa+O97in+zRVF6KFGNZSLm1AePERh1gQjcpuQ+GwrxJ/ijmVmuH2zOow==} + peerDependencies: + '@deck.gl/core': ^9.1.0 + '@luma.gl/core': ~9.1.9 + '@luma.gl/engine': ~9.1.9 + + '@deck.gl/layers@9.1.15': + resolution: {integrity: sha512-4C8LaCXnd/cHGMGwuLu6YUqcf/4dyz82Im+C0IrY56OgJnVOKf2f75zwAKa1Uekq4XEsyPgqg9k5MWEohBzGYw==} + peerDependencies: + '@deck.gl/core': ^9.1.0 + '@loaders.gl/core': ^4.2.0 + '@luma.gl/core': ~9.1.9 + '@luma.gl/engine': ~9.1.9 + + '@eslint-community/eslint-utils@4.10.1': + resolution: {integrity: sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 @@ -1144,6 +1192,21 @@ packages: resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@floating-ui/core@1.8.0': + resolution: {integrity: sha512-0CIZ5itps/8x7BG8dEIhs53BvCUH2PCoogtakwRTut+Arm58sJooJ0AuZhLw2HJYIR5cMLNPBSS728sPho2khQ==} + + '@floating-ui/dom@1.8.0': + resolution: {integrity: sha512-yXSrzeHZBTZadLOlfyhCkJHNeLJnHRnRInwdZ40L7ZiaAtrBwoYlsDrX3v5zB1Utk7CLfzcOVnVVWoXEky7Ceg==} + + '@floating-ui/react-dom@2.1.9': + resolution: {integrity: sha512-JDjEFGCpImxDCA7JJKviA0M9+RtmJdj0m/NVU5IMgBK+AmZouAQQ7/+2GLH0GXXY0YMw9oXPB8hKdbPYg5QLYg==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@floating-ui/utils@0.2.12': + resolution: {integrity: sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww==} + '@humanwhocodes/config-array@0.13.0': resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} engines: {node: '>=10.10.0'} @@ -1268,6 +1331,70 @@ packages: '@leichtgewicht/ip-codec@2.0.5': resolution: {integrity: sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==} + '@loaders.gl/core@4.4.4': + resolution: {integrity: sha512-uUZLs1N1VQXj3jC81LS7OkrWw1NRQHb0rdGUZI/FOFvirFEIR+TAKcvMO1Zz9WQj2dT9r6HhVjMDJQxU42LsoA==} + + '@loaders.gl/images@4.4.4': + resolution: {integrity: sha512-pqCfWRR7yEHCnAaWDu1aoD7NILts6mvY+B47lQXJ00Ffm4/cfx35dTZ4GUung/iqdVAbxC7fpGKwTPn3T06x4w==} + peerDependencies: + '@loaders.gl/core': ~4.4.0 + + '@loaders.gl/loader-utils@4.4.4': + resolution: {integrity: sha512-+0IizJUB6GvPQjl2xC2V1vpcMPcidZykWy27LFnIIqG1lesxfALnFmRoq9MjbOj2TPcUo7VSBxl8z55qRlX0rQ==} + + '@loaders.gl/schema-utils@4.4.4': + resolution: {integrity: sha512-/ykSrQlfn7Lx+kmQNuGzTaywLVy2RoaAZ5YiEXkP9UJ+4lYY2wP5KgUlQGwODDdzNPLFmYzd+FXeE9GEmlXIUg==} + peerDependencies: + '@loaders.gl/core': ~4.4.0 + + '@loaders.gl/schema@4.4.4': + resolution: {integrity: sha512-3spgUoN505V2OprDDzww5nhWfn8Htupcfdr+/lxswAhCbGjwM3RWzA3Zif3dW6ZxOCeSIRJ4GNON78Eiede2dw==} + + '@loaders.gl/worker-utils@4.4.4': + resolution: {integrity: sha512-UNQCwK7tHd7Qh0K7e6Flvac8qd14SoAgaN8SOjggd5ngYqwytOQiAo5uEuhRN+r7+EqdwU+qwcpRtjYByT+RqA==} + peerDependencies: + '@loaders.gl/core': ~4.4.0 + + '@luma.gl/constants@9.1.10': + resolution: {integrity: sha512-O4Nx8UbWmrHHZ7ihKB8WiscX1cz05l1KvKorYTgq+xeXwz2Beh3MkXBMnA46uuyEtimN945OEdYshZnbh80jyw==} + + '@luma.gl/core@9.1.10': + resolution: {integrity: sha512-izvT0DDjlVpchpTokXMNYJeyhgTdGuf21LHEpVa/3EtGFDAJESb3eH99Q3KfzgbqqIAwrTy+25TSStV/3r2svA==} + + '@luma.gl/engine@9.1.10': + resolution: {integrity: sha512-Og1cFpDGq8IUDI9Oaytnm08sdeitxcStsFrjiE4AejZQgx6OdHo+tE33M3WLAUzp6oQYQwl6r2USOhH4BuEiRg==} + peerDependencies: + '@luma.gl/core': ~9.1.0 + '@luma.gl/shadertools': ~9.1.0 + + '@luma.gl/shadertools@9.1.10': + resolution: {integrity: sha512-ET2Vs9Vws5zkjSC07RWBVEFQ6EDP5yTiEZBnvblkb5y4wgjLHAgM5NBJw51Xb5BRBH0aC4piwP+2SnDA29dOlg==} + peerDependencies: + '@luma.gl/core': ~9.1.0 + + '@luma.gl/webgl@9.1.10': + resolution: {integrity: sha512-mwIsNEzxt6GW/fnCqBgJAorzFPi5c//3ZukKFHso+F1mvtHhTE4NQfA/pEvj4HBg/IdYkMvkoQsMrSn5+jko3A==} + peerDependencies: + '@luma.gl/core': ~9.1.0 + + '@mapbox/tiny-sdf@2.2.0': + resolution: {integrity: sha512-LVL4wgI9YAum5V+LNVQO6QgFBPw7/MIIY4XJPNsPDMrjEwcE+JfKk1LuIl8GnF197ejVdC9QdPaxrx5gfgdGXg==} + + '@math.gl/core@4.1.0': + resolution: {integrity: sha512-FrdHBCVG3QdrworwrUSzXIaK+/9OCRLscxI2OUy6sLOHyHgBMyfnEGs99/m3KNvs+95BsnQLWklVfpKfQzfwKA==} + + '@math.gl/polygon@4.1.0': + resolution: {integrity: sha512-YA/9PzaCRHbIP5/0E9uTYrqe+jsYTQoqoDWhf6/b0Ixz8bPZBaGDEafLg3z7ffBomZLacUty9U3TlPjqMtzPjA==} + + '@math.gl/sun@4.1.0': + resolution: {integrity: sha512-i3q6OCBLSZ5wgZVhXg+X7gsjY/TUtuFW/2KBiq/U1ypLso3S4sEykoU/MGjxUv1xiiGtr+v8TeMbO1OBIh/HmA==} + + '@math.gl/types@4.1.0': + resolution: {integrity: sha512-clYZdHcmRvMzVK5fjeDkQlHUzXQSNdZ7s4xOqC3nJPgz4C/TZkUecTo9YS4PruZqtDda/ag4erndP0MIn40dGA==} + + '@math.gl/web-mercator@4.1.0': + resolution: {integrity: sha512-HZo3vO5GCMkXJThxRJ5/QYUYRr3XumfT8CzNNCwoJfinxy5NtKUd7dusNTXn7yJ40UoB8FMIwkVwNlqaiRZZAw==} + '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1': resolution: {integrity: sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==} @@ -1388,6 +1515,11 @@ packages: '@petamoriken/float16@3.9.3': resolution: {integrity: sha512-8awtpHXCx/bNpFt4mt2xdkgtgVvKqty8VbjHI/WWWQuEw+KLzFot3f4+LkQY9YmOtq7A5GdOnqoIC8Pdygjk2g==} + '@playwright/test@1.62.1': + resolution: {integrity: sha512-DTcUc8qii+cpHvtOwggMtBRMjKZHXYWdw8syRYu2vtzuq4Wxphqq4NfCs5Zt44L6mA8rfDfj+PHnxFc/FeK6mQ==} + engines: {node: '>=20'} + hasBin: true + '@pmmmwh/react-refresh-webpack-plugin@0.5.17': resolution: {integrity: sha512-tXDyE1/jzFsHXjhRZQ3hMl0IVhYe5qula43LDWIhVfjp9G/nT5OQY5AORVOrkEGAUltBJOfOWeETbmhm6kHhuQ==} engines: {node: '>= 10.13'} @@ -1422,10 +1554,288 @@ packages: resolution: {integrity: sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==} engines: {node: '>=12.22.0'} - '@pnpm/npm-conf@3.0.2': - resolution: {integrity: sha512-h104Kh26rR8tm+a3Qkc5S4VLYint3FE48as7+/5oCEcKR2idC/pF1G6AhIXKI+eHPJa/3J9i5z0Al47IeGHPkA==} + '@pnpm/npm-conf@3.0.3': + resolution: {integrity: sha512-//0sR/cow/s4ICQaYoAobOl4aU8cjU6x/V24V7XkKotb9+O+3zySIYp146vpaobYHnxa4pZX8NkV54Z5AwbDKA==} engines: {node: '>=12'} + '@probe.gl/env@4.1.1': + resolution: {integrity: sha512-+68seNDMVsEegRB47pFA/Ws1Fjy8agcFYXxzorKToyPcD6zd+gZ5uhwoLd7TzsSw6Ydns//2KEszWn+EnNHTbA==} + + '@probe.gl/log@4.1.1': + resolution: {integrity: sha512-kcZs9BT44pL7hS1OkRGKYRXI/SN9KejUlPD+BY40DguRLzdC5tLG/28WGMyfKdn/51GT4a0p+0P8xvDn1Ez+Kg==} + + '@probe.gl/stats@4.1.1': + resolution: {integrity: sha512-4VpAyMHOqydSvPlEyHwXaE+AkIdR03nX+Qhlxsk2D/IW4OVmDZgIsvJB1cDzyEEtcfKcnaEbfXeiPgejBceT6g==} + + '@radix-ui/number@1.1.3': + resolution: {integrity: sha512-Road2bidD0uu/1BGDOWNdPI06g0lIRy6IF9GZcIrDK2KGItfor8IQwQa+yM2ERgHM1MmHxaxpTzk0/Jp42lNfA==} + + '@radix-ui/primitive@1.1.7': + resolution: {integrity: sha512-rqWnm76nYT8HoNNqEjpgJ7Pw/DrBj5iBTrmEPo6HTX5+VJyBNOqTdv4g89G63HuR5g0AaENoAcH7Is5fF2kZ8Q==} + + '@radix-ui/react-arrow@1.1.15': + resolution: {integrity: sha512-v4zggRcjadnI+ClKDuijlQEW4tw3NoaeHc/PwpKnLoLLKNUG4InLegkstooLcRIUWCs+8L22dGURCVuFfOKfnA==} + 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.15': + resolution: {integrity: sha512-9W+B9NPF0NaaPh/1NJd3+KqsnlLqU9H7T2rvww+fp+T/evVXdNAyYcnfRQZFOjkR1ajQp3yORlqnI8soawLvNA==} + 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.5': + resolution: {integrity: sha512-+48PbAAbq3didjJxa+OaWY2ZwgAKsNiRGyeHKszblZMQ+kcpd9pAaT11cMkGEie0vsOi3QdeTE6d5Fe3Gn61kA==} + 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.2.2': + resolution: {integrity: sha512-RHCUGwKHDr0hDGg4X7ma4JG4/+12qxw8rkh5QKdDldlCvtja6nUx1Ef/8HVrJze81lEsgLQlqjzjGNHantgnQA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-direction@1.1.4': + resolution: {integrity: sha512-5pzg4FGQNpExhnhT2zlrP1wZFaYCd1K0nYWoFAdcYoYK868IEigqMX3B3f8yIoRlAhAeDWciLI6ZdCKHF9P4Vg==} + 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.19': + resolution: {integrity: sha512-8g4pfOL9HoKKLWGiypT+dphVqjFfmcXO5GBnhsG6zI+lxAx/8feQpr+1LSN8Re3hiZ+XkLNS4O9ztK11/LzQ6w==} + 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.6': + resolution: {integrity: sha512-RNOJjfZMTyBM6xYmV3IVGXkPjIhcBAuv48POevAXwrGJhkWZ9p1rFoIS1JFooPuT193AZmRsCPhpoVJxx6OPoQ==} + 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.16': + resolution: {integrity: sha512-wmRZ2WWLvmt6KHy2rNPOdPUjwq5xOHY02+m+udwJTn0aNIox/rkskAvJTyTLGhPK6KgrUjlJUJpgmx/+wFiFIQ==} + 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.4': + resolution: {integrity: sha512-TMQp2llA+RYn7JcjnrMnz7wN4pcVttPZnRZo52PLQsoLVKzNlVwUeHmfePgTgRluXFvlD3GD5g5MOVVTJCO0qA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-popover@1.1.23': + resolution: {integrity: sha512-mw58MrBlyHWFisTOYignD0vf/3gdcgAR+9of1s9G/38CbFiUwH1nCDkc0AUM9IrXFgN5Ue8n45j9WCgyM1sbiQ==} + 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.3.7': + resolution: {integrity: sha512-UsJrrd7w4wuKKTdvd/DNERVlwSlUcyXzjhyDwBk+3aPOsCjOY6ZSbxuw8E6lZTjjfP8Cpd0J8VVkrYUWyGYXyg==} + 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.17': + resolution: {integrity: sha512-vKQLcWypUnwZVvfV7UkGahH2g6ySe8M8R+zYBwPrv5byZ9QAW6cQVvNKo7GgmD+p8aYb6D9JBuvy8/WhOno2wQ==} + 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.10': + resolution: {integrity: sha512-3wyzCQ6+ubRA+D4uv9m95JYLXxmOHp05qjrkjeA7uKHHtjpPggQzc6DAb0URl7j67oR0K2foO4ip27TiX037Bw==} + 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.10': + resolution: {integrity: sha512-MucOnzh6hR5mid6VpkbglRAMYMjKLqRnGBbjXkzjK52fuQDd1qbkx78a5P40mkcnVXJdEVxm26E9OPAiUq7nBg==} + 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.4.7': + resolution: {integrity: sha512-mTSLf1GC/C0moWjTbvCM6Qn/gBjvlFt1azuWF2v7MN5C3Zq2U2J2lN3ZEYkpujuOU5Ro7A28wkviSxaKnG0BYg==} + 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.3.3': + resolution: {integrity: sha512-qx7oqnYbxnK9kYI9m317qmFmEgo6ywqWvbTogdj7cL9p3/yx4M48p7Rnw5z3H890cL/ow/EeWJsuTykeZVXP5Q==} + 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.3.7': + resolution: {integrity: sha512-48tB/4dn2UVLBCYhTu9AuR63IHl73l/qLbLgxd86noTUor4/K4LFDAcYjK+isP5313qxaFpjPVogE7+Y0/V3Kw==} + 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.4': + resolution: {integrity: sha512-R6OUY2e2fA6Yn6s+VSx5KBV6Nx8LQEhu+cz7LCej18rQ1HLyg9PSC9jP/ZNx0o6FAIK9c0F1kHylzSxKsdlkrQ==} + 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.6': + resolution: {integrity: sha512-uEQJGT97ZA/TgP/Hydw47lHu+/vQj6z/0jA+WeTbK1o9Rx45GImjpD0tc3W5ad3D6XTSR6e1yEO0FvGq6WQfVQ==} + 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.5': + resolution: {integrity: sha512-7cshFL8HGS/7HEiHH+9kL9HBwp2sa9yX18Knwek6KYWmXwM7pegMgta2AXMQKI+rq3JnfSj9x8wYqFMTdG1Jgg==} + 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.4': + resolution: {integrity: sha512-K20DkRkUwDnxEYMBPcg3Y6voLkEy5p5QQmszZgLngKKiC7dzBR/aEuK3w1qlx2JWDUNH6FluahYdgR3BP+QbYw==} + 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.4': + resolution: {integrity: sha512-XoSLhbRbqxFtgJoi2fNHA3C6pDlY34x508vUpUGoFZfvePfHXHbE1lC4FYFMnJWgiCRroSTw6fOsXQoVS9RwZg==} + 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.4': + resolution: {integrity: sha512-cSOCh6JlkmfjLyNcLiu2nB4v+nm+dkZ+Q5KHWk/soo4U7ZLiEQFKHK9/YmtBHjfCEaU43IBKQOc4/uJmCaiCTQ==} + 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.4': + resolution: {integrity: sha512-D3anSY15EJoxrihpsXI6SMrmmonnQtR2ni7arO+Lfdg3O95b9hNXxONk8jA5C8ANdF/h5HMAxejgs8PWJ6rlhw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/rect@1.1.3': + resolution: {integrity: sha512-JtyZR+mqgBibTo8xea3B6ZRmzZiM/YeVBtUkas6zMuXjAlfIFIW2FgqeM9eLyvEaYX66vr6DJMK+4U6LV0KhNw==} + '@rc-component/portal@1.1.2': resolution: {integrity: sha512-6f813C0IsasTZms08kfA8kPAGxbbkYToa8ALaiDIGGECU4i9hj8Plgbx0sNJDrey3EtHO30hmdaxtT0138xZcg==} engines: {node: '>=8.x'} @@ -1542,8 +1952,8 @@ packages: peerDependencies: semantic-release: '>=20.1.0' - '@sinclair/typebox@0.24.51': - resolution: {integrity: sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==} + '@sinclair/typebox@0.24.52': + resolution: {integrity: sha512-DNKwjDaMLKWXvjs/zCkSzA3rBzZVv4tuLCEV8ArRyHAqCtPtbUcQj0XS4h7y/CqL9pI6VpCmcH5A6oPOBAD9+Q==} '@sindresorhus/merge-streams@2.3.0': resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==} @@ -1693,15 +2103,18 @@ packages: '@types/estree@1.0.9': resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} - '@types/express-serve-static-core@4.19.8': - resolution: {integrity: sha512-02S5fmqeoKzVZCHPZid4b8JH2eM5HzQLZWN2FohQEy/0eXTq8VXZfSN6Pcr3F6N9R/vNrj7cpgbhjie6m/1tCA==} + '@types/express-serve-static-core@4.19.9': + resolution: {integrity: sha512-QP2ESEe/ImWY0HDwNAnK9PvEffUyhLTnWkk7KXzHfyeWAnlrDe1fN77bXl6ia8KT3wPlmA7t9/VPRpnf4Ex9sg==} - '@types/express-serve-static-core@5.1.1': - resolution: {integrity: sha512-v4zIMr/cX7/d2BpAEX3KNKL/JrT1s43s96lLvvdTmza1oEvDudCqK9aF/djc/SWgy8Yh0h30TZx5VpzqFCxk5A==} + '@types/express-serve-static-core@5.1.3': + resolution: {integrity: sha512-dPfW8NFiOF4wOHc7+N/QSxlY9cfSsenewGbAz8C8U/MULPd/YZ27LvJUIlzaXie7e6Ove9YunJGgC9tbHD2cKw==} '@types/express@4.17.25': resolution: {integrity: sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw==} + '@types/geojson@7946.0.16': + resolution: {integrity: sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==} + '@types/graceful-fs@4.1.9': resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} @@ -1735,8 +2148,8 @@ packages: '@types/json5@0.0.29': resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - '@types/lodash@4.17.24': - resolution: {integrity: sha512-gIW7lQLZbue7lRSWEFql49QJJWThrTFFeIMJdp3eH4tKoxm1OvEPg02rm4wCCSHS0cL3/Fizimb35b7k8atwsQ==} + '@types/lodash@4.17.25': + resolution: {integrity: sha512-+K1NIO8I+F9/wNulfVvu23QYd0Pe9/OCqRrim4NoYIf1VoEDL90Ve4ClzpyqBLc7NpGGWRvYNCKZ1BE/Jpf8dQ==} '@types/mime@1.3.5': resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} @@ -1750,9 +2163,15 @@ packages: '@types/node@14.18.63': resolution: {integrity: sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ==} + '@types/node@25.9.5': + resolution: {integrity: sha512-OScDchr2fwuUmWdf4kZ9h7PcJiYDVInhJizG/biAq3cAvqwYktuy/TYGGdZNMtNTFUP7rnb0NU4TUdm82kt4Rg==} + '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} + '@types/offscreencanvas@2019.7.3': + resolution: {integrity: sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A==} + '@types/parse-json@4.0.2': resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} @@ -1782,8 +2201,8 @@ packages: '@types/react-router@5.1.20': resolution: {integrity: sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==} - '@types/react@18.3.30': - resolution: {integrity: sha512-3ek6mwJL5/VBewBcY4S66cqlCtK3qi4WIq37Z0m/NHw1hjhI7274Mx1qz/+ggSzyBCOEf7eHjBN6INjPAWYfYw==} + '@types/react@18.3.31': + resolution: {integrity: sha512-vfEqpXTvwT91yhmwdfouStN2hSKwTvyRs8qpLfADyrq/kxDw0hZM7Wk9Ug1FELj8hIby+S/+kQCSRFF32nv2Qw==} '@types/resolve@1.17.1': resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==} @@ -1794,8 +2213,8 @@ packages: '@types/retry@0.12.5': resolution: {integrity: sha512-3xSjTp3v03X/lSQLkczaN9UIEwJMoMCA1+Nb5HfbJEQWogdeQIyVtTvxPXDQjZ5zws8rFQfVfRdz03ARihPJgw==} - '@types/semver@7.7.1': - resolution: {integrity: sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==} + '@types/semver@7.8.0': + resolution: {integrity: sha512-1mAINjtQCXXeLkJ9ehXkwOcBpqtLxiVtKhpUf83DdRNdQKV0iXZpaHYqRr7nj+wvxuJzoAmAwXI+sCNMv1CzLQ==} '@types/send@0.17.6': resolution: {integrity: sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og==} @@ -1900,8 +2319,8 @@ packages: resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@ungap/structured-clone@1.3.1': - resolution: {integrity: sha512-mUFwbeTqrVgDQxFveS+df2yfap6iuP20NAKAsBt5jDEoOTDew+zwLAOilHCeQJOVSvmgCX4ogqIrA0mnyr08yQ==} + '@ungap/structured-clone@1.3.3': + resolution: {integrity: sha512-60YRaenCQcVjYEKOcG824+DRGGIQ3VKErcBoAEDJZz5bKIs2ZG+X/H9Nk+Q6EVkwJk5QNApxbrc5QtBSwtrXAg==} '@webassemblyjs/ast@1.14.1': resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==} @@ -1972,12 +2391,6 @@ packages: acorn-globals@6.0.0: resolution: {integrity: sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==} - acorn-import-phases@1.0.4: - resolution: {integrity: sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==} - engines: {node: '>=10.13.0'} - peerDependencies: - acorn: ^8.14.0 - acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -1996,8 +2409,8 @@ packages: engines: {node: '>=0.4.0'} hasBin: true - acorn@8.16.0: - resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} + acorn@8.18.0: + resolution: {integrity: sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==} engines: {node: '>=0.4.0'} hasBin: true @@ -2107,6 +2520,10 @@ packages: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} + apache-arrow@21.2.0: + resolution: {integrity: sha512-Hxe6Agq26gQOM954qpzYSllJBPJl+e16U5CkfuMUhLrNba+5nKkttIVlflaovN6oaTratqMGAO8H5u/aNhmHWQ==} + hasBin: true + arg@4.1.3: resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} @@ -2122,6 +2539,10 @@ packages: argv-formatter@1.0.0: resolution: {integrity: sha512-F2+Hkm9xFaRg+GkaNnbwXNDV5O6pnCFEmqyhvfC/Ic5LbgOWjJh3L+mN/s91rxVL3znE7DYVpW0GJFT+4YBgWw==} + aria-hidden@1.2.6: + resolution: {integrity: sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==} + engines: {node: '>=10'} + aria-query@5.1.3: resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==} @@ -2209,8 +2630,8 @@ packages: resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} engines: {node: '>= 4.0.0'} - autoprefixer@10.5.0: - resolution: {integrity: sha512-FMhOoZV4+qR6aTUALKX2rEqGG+oyATvwBt9IIzVR5rMa2HRWPkxf+P+PAJLD1I/H5/II+HuZcBJYEFBpq39ong==} + autoprefixer@10.5.4: + resolution: {integrity: sha512-MaU0U/za7N3r6brxD4YB/l4NSrFzLPlANv6wEuQVaIPlD3L4W9rFcQPbL/EilY9BHhHvhfcz3gInDLrEtWT4EA==} engines: {node: ^10 || ^12 || >=14} hasBin: true peerDependencies: @@ -2220,8 +2641,8 @@ packages: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} - axe-core@4.12.0: - resolution: {integrity: sha512-FTavr/7Ba0IptwGOPxnQvdyW2tAsdLBMTBXz7rKH6xJ2skpyxpBxyHkDdBs4lf69yRqYpkqCdfhnwS8YULGOmg==} + axe-core@4.13.0: + resolution: {integrity: sha512-UzGt8zg7Ny8djbYMhxl2zuEevVa7r2gJjYY5Lwr1xM7+XU2nd6CkIWFTVcCIbAP63vSz71NaVyyuSk9lHKcy0A==} engines: {node: '>=4'} axios@1.18.0: @@ -2317,24 +2738,20 @@ packages: bare-abort-controller: optional: true - bare-fs@4.7.2: - resolution: {integrity: sha512-aTvMFUWkBmjzKtEQMDGGDNF8bkfpD5N1b/FCwt7A3wrU4t1o/e/85Wzkluh6JlODCjqVESYCkQCdTXqZ9G7VFg==} - engines: {bare: '>=1.16.0'} + bare-fs@4.8.0: + resolution: {integrity: sha512-fM+MhCvdQhZ7NV6S95a07gPSqjIYKn6mFaXfx266wN3ajZGl/+1AzH+ubkXQ0fFZvOe2nk9VHkzdYkQE5zMV3Q==} + engines: {bare: '>=1.28.0'} peerDependencies: bare-buffer: '*' peerDependenciesMeta: bare-buffer: optional: true - bare-os@3.9.1: - resolution: {integrity: sha512-6M5XjcnsygQNPMCMPXSK379xrJFiZ/AEMNBmFEmQW8d/789VQATvriyi5r0HYTL9TkQ26rn3kgdTG3aisbrXkQ==} - engines: {bare: '>=1.14.0'} - - bare-path@3.0.1: - resolution: {integrity: sha512-ghj2DSK/2e99a1anTVPCV4m4YIYtrbXhfM7V3D7XZLOTsybnYyaJloymGqssQc8l/or0UoDyRtNQkmkEF/ysgQ==} + bare-path@3.1.1: + resolution: {integrity: sha512-JprUlveX3QjApC1cTpsUOiscADftCGVWkzitbHsRqv84hzYwYHw2mbluddsq5TvI8mH/8Ov1f4BiMAdcB0oYnQ==} - bare-stream@2.13.1: - resolution: {integrity: sha512-Vp0cnjYyrEC4whYTymQ+YZi6pBpfiICZO3cfRG8sy67ZNWe951urv1x4eW1BKNngw3U+3fPYb5JQvHbCtxH7Ow==} + bare-stream@2.13.3: + resolution: {integrity: sha512-Kc+brLqvEqGkjyfiwJmImAOqLZL7OsoLKuavx+hJjgVV3nLTOjloJyPMFxjUPerGGHrNH0fLU06jjykMLWrERQ==} peerDependencies: bare-abort-controller: '*' bare-buffer: '*' @@ -2347,14 +2764,14 @@ packages: bare-events: optional: true - bare-url@2.4.5: - resolution: {integrity: sha512-K+y9xF1tN+CdPu4qWwr0QiK1Al07eFPGYK5M2pDXcmHdMdgC/tT/bpmMe1hrmRHaidKLkXrC+cRNYf3XVDUhSQ==} + bare-url@2.4.7: + resolution: {integrity: sha512-o8CRCiJtib+ycO3mE4A5UChtGX4dDP2XxsWVu9P+Zc3H8tcmKwNVEDoDTXmwN+uuMhfKeT7/i7Y26xS8W7ohoA==} base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - baseline-browser-mapping@2.10.33: - resolution: {integrity: sha512-bA6+tcSLpz2tIEdDXZPpPTIuxBcC4+w6SieaYyfigIa4h8GlFxbA17v22Vx3JUtuZQj9SgOsnbK+aTBzyDyEuw==} + baseline-browser-mapping@2.11.12: + resolution: {integrity: sha512-r7WnVImvVCeFpf2DOXfy41aPWzeNg3H/A2X4dKmy1QL0MSyyk/e7z8ihJ3N6Nn2PsdhkVlqnEfnUE4a05P2aTA==} engines: {node: '>=6.0.0'} hasBin: true @@ -2385,8 +2802,8 @@ packages: resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - bonjour-service@1.4.0: - resolution: {integrity: sha512-fGQtj1qdR9vIKjFiWPQd52qIqwjaYqhcI40JEiDuvlZ86E7ZBPBwY9fPgHy9r2rYGIjiRfctNPYz6OQU73ww2w==} + bonjour-service@1.4.4: + resolution: {integrity: sha512-jCZcVv7eoc4QesRscwEZtSROBen+6LpKAmBIsQYQrsAeVHLyMXWX/t6eIV5KiRZYNUBl8eVqImEEMQ8L5+c/Kw==} boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} @@ -2407,8 +2824,8 @@ packages: browser-process-hrtime@1.0.0: resolution: {integrity: sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==} - browserslist@4.28.2: - resolution: {integrity: sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==} + browserslist@4.28.7: + resolution: {integrity: sha512-JxV13hNrFxqjOc8alRbq9dK1MM79NEXYpma2B2J4wAtpWS5zIEIKqWPGCl7N4o7Uc7B7itylh7SuDujATRyyTw==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -2464,8 +2881,8 @@ packages: caniuse-api@3.0.0: resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} - caniuse-lite@1.0.30001793: - resolution: {integrity: sha512-iwSsYWaCOoh26cV8NwNRViHlrfUvYsHDfRVcbtmw0Kg6PJIZZXwMkj1442FYLBGkeUf1juAsU3DTfxW579mrPA==} + caniuse-lite@1.0.30001806: + resolution: {integrity: sha512-72Cuvd95zbSYPKq6Fhg8eDJRlzgWDf7/mtoZv6Qe/DYNCEBdNxoA3+rZAU2ZhGCpZlns3EssFavaZomckT5Uuw==} cardinal@2.1.1: resolution: {integrity: sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw==} @@ -2517,6 +2934,9 @@ packages: cjs-module-lexer@1.4.3: resolution: {integrity: sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==} + class-variance-authority@0.7.1: + resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==} + classnames@2.5.1: resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==} @@ -2543,6 +2963,10 @@ packages: 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'} + co@4.6.0: resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} @@ -2697,14 +3121,15 @@ packages: peerDependencies: webpack: ^5.1.0 - core-js-compat@3.49.0: - resolution: {integrity: sha512-VQXt1jr9cBz03b331DFDCCP90b3fanciLkgiOoy8SBHy06gNf+vQ1A3WFLqG7I8TipYIKeYK9wxd0tUrvHcOZA==} + core-js-compat@3.50.0: + resolution: {integrity: sha512-XGpFGbMLHwSt74YLTKho7Ib242qi6O8MSX+sRokV4oz7iKXvQWGYZthjIhjRGMxjzVkAubBO512dKGYcefmX3Q==} + engines: {node: '>=6.4.0'} - core-js-pure@3.49.0: - resolution: {integrity: sha512-XM4RFka59xATyJv/cS3O3Kml72hQXUeGRuuTmMYFxwzc9/7C8OYTaIR/Ji+Yt8DXzsFLNhat15cE/JP15HrCgw==} + core-js-pure@3.50.0: + resolution: {integrity: sha512-6GP3Pxz4IKyWjAfa747vIu/jilB5z29JWROLqH/b+pXVcpgh6tM06ZIBwSuglgVqzDYURhOK6oEzTrG0bCHitA==} - core-js@3.49.0: - resolution: {integrity: sha512-es1U2+YTtzpwkxVLwAFdSpaIMyQaq0PBgm3YD1W3Qpsn1NAmO3KSgZfu+oGSWVu6NvLHoHCV/aYcsE5wiB7ALg==} + core-js@3.50.0: + resolution: {integrity: sha512-BRWgOLKkFeCgRudR6zrs8p9XJZcE14grzKMMssoYrk6krtuEZ7MTKPIY5RzOnqsEKIR9kst7wNzphttraT+Yqw==} core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} @@ -3005,6 +3430,9 @@ packages: resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} engines: {node: '>=8'} + detect-node-es@1.1.0: + resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} + detect-node@2.1.0: resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} @@ -3013,8 +3441,9 @@ packages: engines: {node: '>= 4.2.1'} hasBin: true - dicom-microscopy-viewer@0.48.23: - resolution: {integrity: sha512-ZC3evLO0EEQyp8E6rT6VVsL5VJLqxyyPUZct2y4MBi2MTkHkR/yWEJn7wu8pTas8uC93ULWDxim5xqRa0s4/eQ==} + dicom-microscopy-viewer@https://codeload.github.com/ImagingDataCommons/dicom-microscopy-viewer/tar.gz/1b39614eae92e92578d14977f66ced60243e51bc: + resolution: {gitHosted: true, tarball: https://codeload.github.com/ImagingDataCommons/dicom-microscopy-viewer/tar.gz/1b39614eae92e92578d14977f66ced60243e51bc} + version: 0.49.0 dicomweb-client@0.10.3: resolution: {integrity: sha512-/fHNEAYiz8j+9TNOrNJ0k+hYqirbOT85B7vM7I4VkY8DeDQb4BDUeL3RX6huDVtn6ZQlR91dI+2tejLc5c99wA==} @@ -3104,8 +3533,11 @@ packages: duplexer@0.1.2: resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} - earcut@3.0.2: - resolution: {integrity: sha512-X7hshQbLyMJ/3RPhyObLARM2sNxxmRALLKx1+NVFFnQ9gKzmCrxm9+uLIAdBcvc8FNLpctqlQ2V6AE92Ol9UDQ==} + earcut@2.2.4: + resolution: {integrity: sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ==} + + earcut@3.2.3: + resolution: {integrity: sha512-vnS4AVwp1KHAF13i1vp1/2D5evWy3k5u/iW/B81QVsUZtV8cv2tU0b2VNFlqvh4kYwrFMDdjPCfAmfyJW9y14Q==} ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} @@ -3115,8 +3547,8 @@ packages: engines: {node: '>=0.10.0'} hasBin: true - electron-to-chromium@1.5.367: - resolution: {integrity: sha512-4Mk/mrynCNQ+atY40D3UpmhLWB6AHMbYMlIrPhHcMF6x0L7O0b052FCAsxw1LlaR++UFuNg3D/A6XCuGDa0guQ==} + electron-to-chromium@1.5.401: + resolution: {integrity: sha512-H6ViHN68nGYlChEvlIU67fn8O2/tpbWQPwck98yaJmh+08LSvHiydzDQ6oXNccLU3kNRVIRS9A4mA7CG+i6fLQ==} email-addresses@5.0.0: resolution: {integrity: sha512-4OIPYlA6JXqtVn8zpHpGiI7vE6EQOAg16aGnDMIAlZVinnoZ8208tW1hAbjWydgN/4PLTT9q+O1K6AH/vALJGw==} @@ -3147,8 +3579,8 @@ packages: resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} engines: {node: '>= 0.8'} - enhanced-resolve@5.22.2: - resolution: {integrity: sha512-0rxICaFZ7NQho/sHely2bvOPRP0Eu2B0NZ9zM54YvRvWMn7jfz3DmnOZDR9LlXDdDcqntAVc6Hfy4gr/tdH/Ag==} + enhanced-resolve@5.24.5: + resolution: {integrity: sha512-L1l8TNvomm6UVW5B253AGxQagSQr+vGwhMlrrfRS2qmhx46AMpMVJKQYLvWYbysTMY8VoicOvzHzoHMbyzB+4A==} engines: {node: '>=10.13.0'} entities@2.2.0: @@ -3168,6 +3600,10 @@ packages: error-stack-parser@2.1.4: resolution: {integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==} + es-abstract-get@1.0.0: + resolution: {integrity: sha512-6PMWXpdhshVvFp+FoWYs1EvG1Nj0tvk0dZM+XcK0xMEM1czRVcP6ohqPWHy6qPagSpC8j4+p89WXlT+xXJs/fg==} + engines: {node: '>= 0.4'} + es-abstract@1.24.2: resolution: {integrity: sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg==} engines: {node: '>= 0.4'} @@ -3183,12 +3619,12 @@ packages: es-get-iterator@1.1.3: resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} - es-iterator-helpers@1.3.2: - resolution: {integrity: sha512-HVLACW1TppGYjJ8H6/jqH/pqOtKRw6wMlrB23xfExmFWxFquAIWCmwoLsOyN96K4a5KbmOf5At9ZUO3GZbetAw==} + es-iterator-helpers@1.4.0: + resolution: {integrity: sha512-c/A0P0oxkACDc+cKWw8evLXK83oBKgn0qPOqCYT4x9uolpCIJAcYvJC9QYKNDRPsTeGyCrQ326jrvgZWdCdK5Q==} engines: {node: '>= 0.4'} - es-module-lexer@2.1.0: - resolution: {integrity: sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==} + es-module-lexer@2.3.1: + resolution: {integrity: sha512-shc1dbU90Yl/xq1QrC7QRtfcwURZuVRfPhZbDoldJ1cn1gzDvBaBWlv0eFolj5+0znnPJz5TXLxsN77X/12KTA==} es-object-atoms@1.1.2: resolution: {integrity: sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==} @@ -3202,8 +3638,8 @@ packages: resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==} engines: {node: '>= 0.4'} - es-to-primitive@1.3.0: - resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} + es-to-primitive@1.3.4: + resolution: {integrity: sha512-yPDz7wqpg1/mmHLmS3tcfTfbw5f1eryXvyghYBffGdERwe+mV7ZcWzTR8LR17Kvqt3qfPurjlonmnq3MKXIOXw==} engines: {node: '>= 0.4'} escalade@3.2.0: @@ -3250,8 +3686,8 @@ packages: eslint-import-resolver-node@0.3.10: resolution: {integrity: sha512-tRrKqFyCaKict5hOd244sL6EQFNycnMQnBe+j8uqGNXYzsImGbGUU4ibtoaBmv5FLwJwcFJNeg1GeVjQfbMrDQ==} - eslint-module-utils@2.13.0: - resolution: {integrity: sha512-bLohSkT6469rRs8czj0tLTD8vaeIS/whvPRJVjDr7IuoTT1k5DYDERlNycjDj/HkOlvQdYurmfZ/g3fG5bgeLQ==} + eslint-module-utils@2.14.0: + resolution: {integrity: sha512-W2WCRZ9Dqntd+2u8jJcVMV2PKulc6RdLgUUoh/yQr3uB6lo/ZOeGx11sv60/8S4QFFKNslAlWhr9u0Ef7ZW6Ig==} engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' @@ -3573,8 +4009,18 @@ packages: resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} engines: {node: ^10.12.0 || >=12.0.0} - flatted@3.4.2: - resolution: {integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==} + flatbuffers@25.9.23: + resolution: {integrity: sha512-MI1qs7Lo4Syw0EOzUl0xjs2lsoeqFku44KpngfIduHBYvzm8h2+7K8YMQh1JtVVVrUvhLpNwqVi4DERegUJhPQ==} + + flatbush@4.4.0: + resolution: {integrity: sha512-cf6G+sfy/+/FLH7Ls1URQ5GCRlXgwgqUZiEsMNrMZqb3Us3EkKmzUlKbnyoBy/4wI4oLJ+8cyCQoKJIVm92Fmg==} + + flatqueue@2.0.3: + resolution: {integrity: sha512-RZCWZNkmxzUOh8jqEcEGZCycb3B8KAfpPwg3H//cURasunYxsg1eIvE+QDSjX+ZPHTIVfINfK1aLTrVKKO0i4g==} + engines: {node: '>= 12.17.0'} + + flatted@3.4.4: + resolution: {integrity: sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==} follow-redirects@1.16.0: resolution: {integrity: sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==} @@ -3635,8 +4081,8 @@ packages: resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} engines: {node: '>=12'} - fs-extra@11.3.5: - resolution: {integrity: sha512-eKpRKAovdpZtR1WopLHxlBWvAgPny3c4gX1G5Jhwmmw4XJj0ifSD5qB5TOo8hmA0wlRKDAOAhEE1yVPgs6Fgcg==} + fs-extra@11.4.0: + resolution: {integrity: sha512-EQsFzMUJkCKGr1ePqlYADkIUmHW1s3ZXr5Yqy6wbGrfUCphpl2maM/kyOIRA2HpP3AaFQTZXD4ldjek+nccddA==} engines: {node: '>=14.14'} fs-extra@8.1.0: @@ -3653,6 +4099,11 @@ packages: fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + fsevents@2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -3661,8 +4112,8 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - function.prototype.name@1.1.8: - resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} + function.prototype.name@1.2.0: + resolution: {integrity: sha512-jObKIik1P2QjPHP5nz5BaOtUlfgS0fWo8IUByNXkM+o+02sJOi94em77GwJKQSJ3gfPHdgzLNrHc1uokV4P/ew==} engines: {node: '>= 0.4'} functions-have-names@1.2.3: @@ -3676,8 +4127,8 @@ packages: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} - geotiff@3.0.5: - resolution: {integrity: sha512-OWcL9S9+yDZ6iAlXMt32T1iwUApJM8UiD47xbm6ZP1h33d10fqkPs14EG/ttT5EnefpZSx3G15iDFC5FxUNUwA==} + geotiff@3.1.0-beta.0: + resolution: {integrity: sha512-wbVwOaQYuN+ywly5NoMXn37nHslwkQg5EFHqMeUTtjDACrSag0EEVlFsc+2DK3Pzmmp6XzJW2RTZOamPsBM6ng==} engines: {node: '>=10.19'} get-caller-file@2.0.5: @@ -3688,6 +4139,10 @@ packages: 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-own-enumerable-property-symbols@3.0.2: resolution: {integrity: sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==} @@ -3738,9 +4193,6 @@ packages: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} - glob-to-regexp@0.4.1: - resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} - glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me @@ -3881,11 +4333,11 @@ packages: engines: {node: '>=12'} hasBin: true - html-webpack-plugin@5.6.7: - resolution: {integrity: sha512-md+vXtdCAe60s1k6AU3dUyMJnDxUyQAwfwPKoLisvgUF1IXjtlLsk2se54+qfL9Mdm26bbwvjJybpNx48NKRLw==} + html-webpack-plugin@5.6.8: + resolution: {integrity: sha512-MZmKQcTnhEh1SPSyMiEytIeDZDUoBZVorNHivQGXMASHf/BSGGOrKa2xQ5bGx3TCe1n109ecCt+cpww7wwWhKA==} engines: {node: '>=10.13.0'} peerDependencies: - '@rspack/core': 0.x || 1.x + '@rspack/core': 0.x || 1.x || 2.x webpack: ^5.20.0 peerDependenciesMeta: '@rspack/core': @@ -3918,8 +4370,8 @@ packages: resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} engines: {node: '>= 14'} - http-proxy-middleware@2.0.9: - resolution: {integrity: sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==} + http-proxy-middleware@2.0.10: + resolution: {integrity: sha512-RKzRWNPxUZqbuk3BC5mGVJbBnWgr+diEnjJexIOytFbBzDy88Fbh/YvBr3DsNrl1jYAfjWfpATEv0NO35FDuPQ==} engines: {node: '>=12.0.0'} peerDependencies: '@types/express': ^4.17.13 @@ -3985,15 +4437,10 @@ packages: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} - ignore@7.0.5: - resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} + ignore@7.0.6: + resolution: {integrity: sha512-BAg6QkE8W+TuQLrrw0Ugr7HegXduRuuj8/ti2kSOc+jz1dmx8/WNcjr6XGnq5YpDWxFwwaavqD0+jIUOKelTsw==} engines: {node: '>= 4'} - image-size@0.5.5: - resolution: {integrity: sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==} - engines: {node: '>=0.10.0'} - hasBin: true - image-type@4.1.0: resolution: {integrity: sha512-CFJMJ8QK8lJvRlTCEgarL4ro6hfDQKif2HjSvYCdQZESaIPV4v9imrf7BQHK+sQeTeNeMpWciR9hyC/g8ybXEg==} engines: {node: '>=6'} @@ -4062,8 +4509,8 @@ packages: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} - ipaddr.js@2.4.0: - resolution: {integrity: sha512-9VGk3HGanVE6JoZXHiCpnGy5X0jYDnN4EA4lntFPj+1vIWlFhIylq2CrrCOJH9EAhc5CYhq18F2Av2tgoAPsYQ==} + ipaddr.js@2.5.0: + resolution: {integrity: sha512-aq+t5NAc+cS6rZQQVWC2x98CPqGtKKTMDd4Gaodv0wShnItdKg/51djkGJ1hqH+Oy0ivDftCbSLCQob8zso01w==} engines: {node: '>= 10'} is-arguments@1.2.0: @@ -4117,6 +4564,10 @@ packages: engines: {node: '>=8'} hasBin: true + is-document.all@1.0.0: + resolution: {integrity: sha512-+XSoyS05OdBbhFuELhgTCpFNHkpBOJqtsZfUFFpe5QTw+9Sjbh8zitxhQkYAo6wV7e1Vb8cAPvpCk9jGam/82g==} + engines: {node: '>= 0.4'} + is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -4553,6 +5004,9 @@ packages: json-stringify-safe@5.0.1: resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + json-with-bigint@3.5.10: + resolution: {integrity: sha512-Vcx+JVNEBts/xfcoCS69sKrOhOk/3TVlvlT+XzUOefVKnnrbYSCKpDCm10pohsJFtsJVYnwa/cXRZ4eElzaM6w==} + json2mq@0.2.0: resolution: {integrity: sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA==} @@ -4624,8 +5078,8 @@ packages: less: ^3.5.0 || ^4.0.0 webpack: ^4.0.0 || ^5.0.0 - less@4.6.4: - resolution: {integrity: sha512-OJmO5+HxZLLw0RLzkqaNHzcgEAQG7C0y3aMbwtCzIUFZsLMNNq/1IdAdHEycQ58CwUO3jPTHmoN+tE5I7FQxNg==} + less@4.8.1: + resolution: {integrity: sha512-jQ3lRIo1aUtiWVYXZ7mk4+V4BjCGswF3IxTLJ+4RUta8ZiHh8lhkig2G8dya2eCcyR1dYUvzuV46EkJN8PSwww==} engines: {node: '>=18'} hasBin: true @@ -4656,10 +5110,6 @@ packages: resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} engines: {node: '>=4'} - loader-runner@4.3.2: - resolution: {integrity: sha512-DFEqQ3ihfS9blba08cLfYf1NRAIEm+dDjic073DRDc3/JspI/8wYmtDsHwd3+4hwvdxSK7PGaElfTmm0awWJ4w==} - engines: {node: '>=6.11.5'} - loader-utils@2.0.4: resolution: {integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==} engines: {node: '>=8.9.0'} @@ -4718,9 +5168,6 @@ packages: lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - lodash.sortby@4.7.0: - resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} - lodash.uniq@4.5.0: resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} @@ -4890,6 +5337,52 @@ packages: minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + minimizer-webpack-plugin@5.6.1: + resolution: {integrity: sha512-DoeAZz8Q1C1znwsUzej1fdoi4jCf7/+Em27ouLqfK/+3m8G+D7yDhUwrc3CNhjSzGUN1kn7Iv4sWmjflQHenpw==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@minify-html/node': '*' + '@swc/core': '*' + '@swc/css': '*' + '@swc/html': '*' + clean-css: '*' + cssnano: '*' + csso: '*' + esbuild: '*' + html-minifier-terser: '*' + lightningcss: '*' + postcss: '*' + uglify-js: '*' + webpack: ^5.1.0 + peerDependenciesMeta: + '@minify-html/node': + optional: true + '@swc/core': + optional: true + '@swc/css': + optional: true + '@swc/html': + optional: true + clean-css: + optional: true + cssnano: + optional: true + csso: + optional: true + esbuild: + optional: true + html-minifier-terser: + optional: true + lightningcss: + optional: true + postcss: + optional: true + uglify-js: + optional: true + + mjolnir.js@3.0.1: + resolution: {integrity: sha512-/RMi8Jm3NKleOkVI8D2ai+1OVwtfRJsSVBVjbTXNm83nfsN4uORYaN3u1/hsg5CqVI+di8enTkvgDNDOywn6cQ==} + modify-values@1.0.1: resolution: {integrity: sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==} engines: {node: '>=0.10.0'} @@ -4910,8 +5403,8 @@ packages: mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} - nanoid@3.3.16: - resolution: {integrity: sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==} + nanoid@3.3.17: + resolution: {integrity: sha512-xQLf0A3HOMlgHq0n247/LRuAOYmB7dXJ/DvAxGvsSBij45XtBSmQycu+F8ODbHwns/XyFZagyL1+J0Offw1E0g==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true @@ -4924,6 +5417,11 @@ packages: ndarray@1.0.19: resolution: {integrity: sha512-B4JHA4vdyZU30ELBw3g7/p9bZupyew5a7tX1Y/gGeF2hafrPaQZhgrGQfsvgfYbgdFZjYwuEcnaobeM/WMW+HQ==} + needle@2.9.1: + resolution: {integrity: sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ==} + engines: {node: '>= 4.4.x'} + hasBin: true + needle@3.5.0: resolution: {integrity: sha512-jaQyPKKk2YokHrEg+vFDYxXIHTCBgiZwSHOoVx/8V3GIBS8/VN6NdVRmg8q1ERtPkMvmOvebsgga4sAj5hls/w==} engines: {node: '>= 4.4.x'} @@ -4949,8 +5447,8 @@ packages: node-emoji@1.11.0: resolution: {integrity: sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==} - node-exports-info@1.6.0: - resolution: {integrity: sha512-pyFS63ptit/P5WqUkt+UUfe+4oevH+bFeIiPPdfb0pFeYEu/1ELnJu5l+5EcTKYL5M7zaAa7S8ddywgXypqKCw==} + node-exports-info@1.6.2: + resolution: {integrity: sha512-kXs9Go0cah0qHVV2v389IXQLdLCeE1xfFtjOAF+iobu0OIoG1pje8At2vMHyaPMiPMnG/LWP50twML21eMcAag==} engines: {node: '>= 0.4'} node-forge@1.4.0: @@ -4960,8 +5458,8 @@ packages: node-int64@0.4.0: resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} - node-releases@2.0.47: - resolution: {integrity: sha512-Uzmd6LXpouKo8EUK68IjH4+E01w/hXyV3R3g/geCJo+rXLNfh1xucB+LOzYEOQPSiUK3h/xZf0cQGcSsmyL2Og==} + node-releases@2.0.52: + resolution: {integrity: sha512-MRlTqhAfoMx/4mhEbPo3Hi02g9LJZaJkka69V6h67Cb1gjrAG0jsTE4CZX1eptNx+VCAwJmfpnDIF4P0Nh1A7A==} engines: {node: '>=18'} normalize-package-data@2.5.0: @@ -4999,8 +5497,8 @@ packages: resolution: {integrity: sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==} engines: {node: '>=18'} - npm@10.9.8: - resolution: {integrity: sha512-fYwb6ODSmHkqrJQQaCxY3M2lPf/mpgC7ik0HSzzIwG5CGtabRp4bNqikatvCoT42b5INQSqudVH0R7yVmC9hVg==} + npm@10.9.9: + resolution: {integrity: sha512-1g+6jLQvaIuB4zwvHL7yrXuXcWZwDsCtBX8bbWDqbvJSSr9nPiDDWTHNgwXR27iIcTTW7v3A57hDW9RYv2W4Yg==} engines: {node: ^18.17.0 || >=20.5.0} hasBin: true bundledDependencies: @@ -5155,8 +5653,8 @@ packages: numcodecs@0.3.2: resolution: {integrity: sha512-6YSPnmZgg0P87jnNhi3s+FVLOcIn3y+1CTIgUulA3IdASzK9fJM87sUFkpyA+be9GibGRaST2wCgkD+6U+fWKw==} - nwsapi@2.2.23: - resolution: {integrity: sha512-7wfH4sLbt4M0gCDzGE6vzQBo0bfTKjU7Sfpqy/7gs1qBfYz2vEJH6vXcBKpO3+6Yu1telwd0t9HpyOoLEQQbIQ==} + nwsapi@2.2.24: + resolution: {integrity: sha512-7YRhZ3jS45LwmSCT4b2sVFHt/WuovaktDU07QrtOBY2PXskss5a9jfmR9jptyumwXST+rFjrmppMY1KT/yn35A==} object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} @@ -5204,8 +5702,8 @@ packages: oidc-client@1.11.5: resolution: {integrity: sha512-LcKrKC8Av0m/KD/4EFmo9Sg8fSQ+WFJWBrmtWd+tZkNn3WT/sQG3REmPANE9tzzhbjW6VkTNy4xhAXCfPApAOg==} - ol@10.9.0: - resolution: {integrity: sha512-svbbgVQUmEHaKpLQ8kRySojs59Brvgl2zYIrqG9eQNXGfsbi55rQasZIDpwpQzDL6OlzrUb0H4hQaiX9wDoGmA==} + ol@10.10.0: + resolution: {integrity: sha512-tLPKn6zl+6uWdPufYlqG/lQzuVUTVmfwahQqVr5+wZNyZecyAtIhMTyOtKpu7ooNDLY2sEjKZNXw9HL+sOjC1A==} on-finished@2.4.1: resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} @@ -5234,8 +5732,8 @@ packages: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} - own-keys@1.0.1: - resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} + own-keys@1.0.2: + resolution: {integrity: sha512-19YVAg7T+WTrxggPukVq7DjTv6+PJ867TmhCvBsYwmbFCsZd344rq2Ld1p0wo8f8Qrrhgp82c6FJRqdXWtSEhg==} engines: {node: '>= 0.4'} p-each-series@3.0.0: @@ -5286,8 +5784,8 @@ packages: resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - p-map@7.0.4: - resolution: {integrity: sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==} + p-map@7.0.6: + resolution: {integrity: sha512-I4Prw6ivkd6p8PiYR1tXASOAOBzIJwu0TB7fqaX0c/8c3QAehNYmX57EijyGGGBt3c/BIowGwV03RVBtXvHEVg==} engines: {node: '>=18'} p-reduce@2.1.0: @@ -5310,8 +5808,8 @@ packages: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} - pako@2.1.0: - resolution: {integrity: sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==} + pako@2.2.0: + resolution: {integrity: sha512-zJq6RP/5q+TO2OpFV3FHzlPnFjmkb7Nc99a5SNjJE+uu/PkpChs+NIZSSzbBoD+6kjiISXjfYdwj1ZRQ81dz/w==} param-case@3.0.4: resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} @@ -5395,8 +5893,8 @@ packages: resolution: {integrity: sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==} engines: {node: '>=18'} - pbf@4.0.1: - resolution: {integrity: sha512-SuLdBvS42z33m8ejRbInMapQe8n0D3vN/Xd5fmWM3tufNgRQFBpaW2YVJxQZV4iPNqb0vEFvssMEo5w9c6BTIA==} + pbf@5.1.2: + resolution: {integrity: sha512-mnvGdvOrIvJOBGUEdGkrVXjN8E/VkIJCkf2eS1DH2yv82ORUlLttmDt0rWY38yYZmVwciZwBUvHM20qxBZf40w==} hasBin: true performance-now@2.1.0: @@ -5409,8 +5907,8 @@ packages: resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} engines: {node: '>=8.6'} - picomatch@4.0.4: - resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} + picomatch@4.0.5: + resolution: {integrity: sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==} engines: {node: '>=12'} pify@2.3.0: @@ -5445,6 +5943,16 @@ packages: resolution: {integrity: sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==} engines: {node: '>=8'} + playwright-core@1.62.1: + resolution: {integrity: sha512-wPYSwEBJY9GHraISXqyqtx0na0LpO3XEX7jNDhntbex7tzUS7kLnZsOlFruFJB4Hi/rhDMjXGqHewDZ68nYZVw==} + engines: {node: '>=20'} + hasBin: true + + playwright@1.62.1: + resolution: {integrity: sha512-0M+L3LAD8/nm554LOla9Ayx0j0tmFZ0FBcoQ7F1VuVHpM/XpiC8RcDzBQB8W5+hA8L22THxELzeF+2WcUzvcLg==} + engines: {node: '>=20'} + hasBin: true + possible-typed-array-names@1.1.0: resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} engines: {node: '>= 0.4'} @@ -5854,12 +6362,12 @@ packages: peerDependencies: postcss: 8.5.25 - postcss-selector-parser@6.1.2: - resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} + postcss-selector-parser@6.1.4: + resolution: {integrity: sha512-bIoJLOmjCO1S9XdY/DcnR5hJxvrDir1PbGChrzXG3vw0/FOliy/fA3dmdhQ441kah4gKv+TwckGzex6wNS5cnQ==} engines: {node: '>=4'} - postcss-selector-parser@7.1.1: - resolution: {integrity: sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==} + postcss-selector-parser@7.1.4: + resolution: {integrity: sha512-HeP7D2wyhkR+XaK6v4W8oRF62Dsz4flyuczALJp61GckGm42u1saSSJ/0auvcBqxs3jMRFEcPK34At/0JBKdOg==} engines: {node: '>=4'} postcss-svgo@5.1.0: @@ -5904,6 +6412,9 @@ packages: resolution: {integrity: sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==} engines: {node: '>=18'} + probe-image-size@7.3.0: + resolution: {integrity: sha512-7CaDeBwiAbh6ohXsvLbAZhO7wzsZAmaevfxe39qvCwRh8LyaZfDlBGGLU1CCTgrTLtCOdwBBhjOrIHaIIimHfQ==} + process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} @@ -5917,8 +6428,9 @@ packages: prop-types@15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} - properties-file@4.0.0: - resolution: {integrity: sha512-VWnuWVVQIeYPdJwWfBVu6/SQExpAliGkY8Bq58pHHPJHgD4THXlJfsc+qC41+62iV4WNwQhmrxbqpEXIvIMOmw==} + properties-file@5.0.5: + resolution: {integrity: sha512-Gfi6UgMENAzww1P4hloKhLIQxqcYmUS5z+Lhm/jmFV+ushbE416NalT42oEfJbF9vd0a02B3AaLHiQGmNSQ9EA==} + engines: {node: '>=0.4.0'} proto-list@1.2.4: resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} @@ -5972,6 +6484,10 @@ packages: resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} engines: {node: '>= 0.6'} + range-parser@1.3.0: + resolution: {integrity: sha512-hek2mFQpPuI4E1BBKrSto+BU3e3x4xuarsbiwr3+lf7p44juvFMV0XFWQAP3xUyqXA4RrXLIoaSUGbSt056ZMw==} + engines: {node: '>= 0.6'} + raw-body@2.5.2: resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} engines: {node: '>= 0.8'} @@ -6257,6 +6773,26 @@ packages: resolution: {integrity: sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A==} engines: {node: '>=0.10.0'} + 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.2: + resolution: {integrity: sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==} + 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-router-dom@6.30.4: resolution: {integrity: sha512-q4HvNl+mmDdkS0g+MqiBZNteQJCuimWoOyHMy4T/RQLAn9Z29+E91QXRaxOujeMl2HTzRSS0KFPd7lxX3PjV0Q==} engines: {node: '>=14.0.0'} @@ -6287,6 +6823,16 @@ packages: peerDependencies: react: ^16.0.0 || ^17.0.0 || ^18.0.0 + 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-test-renderer@18.3.1: resolution: {integrity: sha512-KkAgygexHUkQqtvvx/otwxtuFu5cVjfzTCtjXLH9boS19/Nbtg84zS7wIQn39G8IlrhThBpQsMKkq5ZHZIYFXA==} peerDependencies: @@ -6381,8 +6927,8 @@ packages: regjsgen@0.8.0: resolution: {integrity: sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==} - regjsparser@0.13.1: - resolution: {integrity: sha512-dLsljMd9sqwRkby8zhO1gSg3PnJIBFid8f4CQj/sXx+7cKx+E7u0PKhZ+U4wmhx7EfmtvnA318oVaIkAB1lRJw==} + regjsparser@0.13.2: + resolution: {integrity: sha512-NgRBy2Nx/bE+9F27nVHnqcN5HjyLmecqsqx2PJHu3/IEtADD4WuxuXIVExD5PoSDFVrl78dOonfcOe5O+5nbzQ==} hasBin: true relateurl@0.2.7: @@ -6517,8 +7063,8 @@ packages: sass-embedded: optional: true - sax@1.6.0: - resolution: {integrity: sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==} + sax@1.6.1: + resolution: {integrity: sha512-42tBVwLWnaQvW5zc4HbZrTuWccECCZfBi92FDuwtqxasH+JbPB3/FOKb1m222K42R4WxuxzzMsTswfzgtSu64Q==} engines: {node: '>=11.0.0'} saxes@5.0.1: @@ -6633,8 +7179,8 @@ packages: resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} engines: {node: '>= 0.4'} - side-channel@1.1.0: - resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + side-channel@1.1.1: + resolution: {integrity: sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==} engines: {node: '>= 0.4'} signal-exit@3.0.7: @@ -6670,8 +7216,8 @@ packages: sockjs@0.3.24: resolution: {integrity: sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==} - sonarqube-scanner@4.3.6: - resolution: {integrity: sha512-gRtTf11UXl5SqXrRKzXagdRh06v8n2qXAypEhmlTOFCdAUlR4TboPzYClMFFT7NCZq5jKZSyN2mk5jj01RgVVQ==} + sonarqube-scanner@4.4.0: + resolution: {integrity: sha512-j1hXSmkTCrFQbOL2BurcvLXS92uI+SetwLzwed11H0QJkFMam9nLvZM2hgg/QNelO/D902R+jJ09yLc7HhS/Yw==} engines: {node: '>= 18'} hasBin: true @@ -6699,10 +7245,9 @@ packages: resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} engines: {node: '>= 12'} - source-map@0.8.0-beta.0: - resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} - engines: {node: '>= 8'} - deprecated: The work that was done in this beta branch won't be included in future versions + source-map@0.8.0: + resolution: {integrity: sha512-d8EqvL+k/SOXCreS/SUzg2ciyHqBBLcN/yuRjFsbvVhHTE2pgei7oAhmPM7kWFbkX6OSMQfUq4KbkF3au9lhYQ==} + engines: {node: '>= 12'} sourcemap-codec@1.4.8: resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} @@ -6772,8 +7317,11 @@ packages: stream-combiner2@1.1.1: resolution: {integrity: sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw==} - streamx@2.26.0: - resolution: {integrity: sha512-VvNG1K72Po/xwJzxZFnZ++Tbrv4lwSptsbkFuzXCJAYZvCK5nnxsvXU6ajqkv7chyiI1Y0YXq2Jh8Iy8Y7NF/A==} + stream-parser@0.3.1: + resolution: {integrity: sha512-bJ/HgKq41nlKvlhccD5kaCr/P+Hu0wPNKPJOH7en+YrJu/9EgqUF+88w5Jb6KNcjOFMhfX4B2asfeAtIGuHObQ==} + + streamx@2.28.0: + resolution: {integrity: sha512-1Yowhzjf0ivGMrTIkY9hav5TxobO9qIVqUE41fiCGMGgc3CLlf4MY+9AHmZqBWgDTue0fY9zWjYFVyf6Diuobw==} string-convert@0.2.1: resolution: {integrity: sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A==} @@ -6804,12 +7352,12 @@ packages: 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==} + string.prototype.trim@1.2.11: + resolution: {integrity: sha512-PwvK7BU+CMTJGYQCTZb5RWXIML92lftJLhQz1tBzgKiqGxJaMlBAa48POXaNAC2s4y8jr3EFqrkF9+44neS46w==} engines: {node: '>= 0.4'} - string.prototype.trimend@1.0.9: - resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} + string.prototype.trimend@1.0.10: + resolution: {integrity: sha512-2+3aDAOmPTmuFwjDnmJG2ctEkQKVki7vOSqaxkv42Mowj1V6PnvuwFCRrR5lChUux1TBskPjfkeTOhqczDMxTw==} engines: {node: '>= 0.4'} string.prototype.trimstart@1.0.8: @@ -6922,6 +7470,9 @@ packages: symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + tailwind-merge@3.6.0: + resolution: {integrity: sha512-uxL7qAVQriqRQPAyK3pj66VqskWqoZ37PW94jwOTwNfq/z9oyu1V+eqrZqtR2+fCiXdYOZe/Modt8GtvqNzu+w==} + tailwindcss@3.4.19: resolution: {integrity: sha512-3ofp+LL8E+pK/JuPLPggVAIaEuhvIz4qNcf3nA1Xn2o/7fb7s/TYpHhwGDv1ZU3PkBluUVaF8PyCHcm48cKLWQ==} engines: {node: '>=14.0.0'} @@ -6935,8 +7486,8 @@ packages: resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==} engines: {node: '>=6'} - tar-stream@3.1.8: - resolution: {integrity: sha512-U6QpVRyCGHva435KoNWy9PRoi2IFYCgtEhq9nmrPPpbRacPs9IH4aJ3gbrFC8dPcXvdSZ4XXfXT5Fshbp2MtlQ==} + tar-stream@3.2.0: + resolution: {integrity: sha512-ojzvCvVaNp6aOTFmG7jaRD0meowIAuPc3cMMhSgKiVWws1GyHbGd/xvnyuRKcKlMpt3qvxx6r0hreCNITP9hIg==} teex@1.0.1: resolution: {integrity: sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==} @@ -7004,8 +7555,8 @@ packages: uglify-js: optional: true - terser@5.48.0: - resolution: {integrity: sha512-J/9An6vs9Us6wKRriSFXBWdRZapREHqFzdNUKk0pmu804EMR6dr6winwo7e5JDxN4xahxQsuysyYFwlwj4XN/Q==} + terser@5.49.2: + resolution: {integrity: sha512-rGbJiKeQ4WDe3EXlDAIaQcwftVfv2Q8o1awFNfvXolJYKkb1AuZY1RTOmqx4LJXZENbWZA7eIsYGHuEzHsi1nQ==} engines: {node: '>=10'} hasBin: true @@ -7071,9 +7622,6 @@ packages: resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} engines: {node: '>=6'} - tr46@1.0.1: - resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} - tr46@2.1.0: resolution: {integrity: sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==} engines: {node: '>=8'} @@ -7217,6 +7765,9 @@ packages: underscore@1.13.8: resolution: {integrity: sha512-DXtD3ZtEQzc7M8m4cXotyHR+FAS18C64asBYY5vqZexfYryNNnDc02W4hKg3rdQuqOYas1jkseX0+nZXjTXnvQ==} + undici-types@7.24.6: + resolution: {integrity: sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==} + unicode-canonical-property-names-ecmascript@2.0.1: resolution: {integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==} engines: {node: '>=4'} @@ -7295,6 +7846,26 @@ packages: url-parse@1.5.10: resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + 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 + util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} @@ -7340,8 +7911,8 @@ packages: walker@1.0.8: resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} - watchpack@2.5.1: - resolution: {integrity: sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==} + watchpack@2.5.2: + resolution: {integrity: sha512-6i/00NBjP4yGPs+caKSyRfpTF/8Torsu0MOW3mMzIbhgISFder8i7xbqgHlLMwJrdiN8ndBV3UA1/AfzPSr+jg==} engines: {node: '>=10.13.0'} wbuf@1.7.3: @@ -7350,9 +7921,6 @@ packages: web-worker@1.5.0: resolution: {integrity: sha512-RiMReJrTAiA+mBjGONMnjVDP2u3p9R1vkcGz6gDIrOMT3oGuYwX2WRMYI9ipkphSuE5XKEhydbhNEJh4NY9mlw==} - webidl-conversions@4.0.2: - resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} - webidl-conversions@5.0.0: resolution: {integrity: sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==} engines: {node: '>=8'} @@ -7396,12 +7964,12 @@ packages: resolution: {integrity: sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA==} engines: {node: '>=10.13.0'} - webpack-sources@3.5.0: - resolution: {integrity: sha512-HPuy+uuoTCaaoEoI1LQ3JN9+vrPBvEesnnX1jADHy728cHSMlq4wUc4afYqahq2B1mhQVZxCXOkNTnXltr+2vQ==} + webpack-sources@3.5.1: + resolution: {integrity: sha512-jyuiGJdtvY434z5bUZrjz67v76/ePNvFZTp9Mdz29IlH4+GPsgyGjiv0fKI+M7BdkU6ADjulUcKAd3tUK3WlEw==} engines: {node: '>=10.13.0'} - webpack@5.107.2: - resolution: {integrity: sha512-v7RhXaJbpMlV0D7hC7lb2EbnxkoeUqf9qhKr6lozx3Q48pmFrqqNRmZFUEGmi7pSwm6fCQ2H1IjvCkHqdpVdjQ==} + webpack@5.109.2: + resolution: {integrity: sha512-U9/cvLzxObKNEZ9+TtdqrHM5/9z3lgl2c+c4BzbqGxFQvQvBAq87yql5A8pQ+rrMbS496MZJeF5enVBndIy2hw==} engines: {node: '>=10.13.0'} hasBin: true peerDependencies: @@ -7418,6 +7986,9 @@ packages: resolution: {integrity: sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==} engines: {node: '>=0.8.0'} + wgsl_reflect@1.5.0: + resolution: {integrity: sha512-ntYNHZgzBHs+pzmVCsSiRqyye3Ey1xdKEX0Ls8PiDBKIiGFwUOef0PdBbYvUyGTGFwLKkqTZOGmPAed70mquTw==} + whatwg-encoding@1.0.5: resolution: {integrity: sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==} deprecated: Use @exodus/bytes instead for a more spec-conformant and faster implementation @@ -7428,9 +7999,6 @@ packages: whatwg-mimetype@2.3.0: resolution: {integrity: sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==} - whatwg-url@7.1.0: - resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} - whatwg-url@8.7.0: resolution: {integrity: sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==} engines: {node: '>=10'} @@ -7447,8 +8015,8 @@ packages: resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} engines: {node: '>= 0.4'} - which-typed-array@1.1.21: - resolution: {integrity: sha512-zbRA8cVm6io/d5W8uIe2hblzN76/Wm3v/yiythQvr+dpBWeqhPSWIDNj4zOyHi4zKbMK6DN34Xsr9jPHJERAEw==} + which-typed-array@1.1.22: + resolution: {integrity: sha512-fvO4ExWMFsqyhG3AiPAObMuY1lxaqgYcxbc49CNdWDDECOJNgQyvsOWVwbZc+qf3rzRtxojBK+CMEv0Ld5CYpw==} engines: {node: '>= 0.4'} which@1.3.1: @@ -7534,8 +8102,8 @@ packages: write-file-atomic@3.0.3: resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} - ws@7.5.11: - resolution: {integrity: sha512-zS54Oen9bITtp7kp2XM3AydrCIq1D+HwJOuH+c+e4LfpL/lotP5osijd+UoMnxwAam1GN8R4KtLAyIrIcBNpiA==} + ws@7.5.13: + resolution: {integrity: sha512-rsKI6xDBFVf4r/x8XyChGK04QR/XHroxs/jUcoWvtEZM8TPU/X/uIY9B1CsSzYws9ZJb/6bbBu7dPhFW00CAoA==} engines: {node: '>=8.3.0'} peerDependencies: bufferutil: ^4.0.1 @@ -7546,8 +8114,8 @@ packages: utf-8-validate: optional: true - ws@8.21.0: - resolution: {integrity: sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==} + ws@8.21.2: + resolution: {integrity: sha512-54dMVAo4WIe6SKy3vBgN+9bJZqqQ8IMRevAkOLQALhi49qkkQDQfWdAZ8KQlXiEabw88ARXXdUrlvtbKQX+aKw==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -7593,12 +8161,12 @@ packages: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} - yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} + yargs@16.2.2: + resolution: {integrity: sha512-Nt9ZJjXTv5R8MHbqby/wXQ6Gi0Bb3TcYZkR1bzuL4yB2OxWPkXknz513gEF0GoA6tn00UpbPvERW8rzCuWCA6w==} engines: {node: '>=10'} - yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + yargs@17.7.3: + resolution: {integrity: sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g==} engines: {node: '>=12'} yn@3.1.1: @@ -7613,12 +8181,12 @@ packages: resolution: {integrity: sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==} engines: {node: '>=12.20'} - yoctocolors@2.1.2: - resolution: {integrity: sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==} + yoctocolors@2.2.0: + resolution: {integrity: sha512-xYqdZFUK/VYazNl/oCDYN+3WloWQwMfZxBoiNt6qNyk+xfOdi598muWE42rNZFp1kNOiqW936q5RhUdnpqElSg==} engines: {node: '>=18'} - zarrita@0.7.3: - resolution: {integrity: sha512-wChTQ1Ox75INoQCzKAfLWAfB70JJ4KjdW8Sz5x4ZWrFB4Dw+YZdnxHTL0xSdsrB9EmKSeK7fS1Y+I2ibhfGbkw==} + zarrita@0.7.4: + resolution: {integrity: sha512-NChufj86SceFj45z4CYjndmI98dphaG7hU8Wj0UGpMyT21o0V3HTY6zo87aSobYWts1tNFivSXzH2AR1AkaWjA==} zstddec@0.2.0: resolution: {integrity: sha512-oyPnDa1X5c13+Y7mA/FDMNJrn4S8UNBe0KCqtDmor40Re7ALrPN6npFwyYVRRh+PqozZQdeg23QtbcamZnG5rA==} @@ -7633,12 +8201,12 @@ snapshots: dependencies: '@ctrl/tinycolor': 3.6.1 - '@ant-design/icons-svg@4.4.2': {} + '@ant-design/icons-svg@4.5.0': {} '@ant-design/icons@4.8.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@ant-design/colors': 6.0.0 - '@ant-design/icons-svg': 4.4.2 + '@ant-design/icons-svg': 4.5.0 '@babel/runtime': 7.29.7 classnames: 2.5.1 lodash: 4.18.1 @@ -7672,14 +8240,14 @@ snapshots: '@babel/core@7.29.7': dependencies: '@babel/code-frame': 7.29.7 - '@babel/generator': 7.29.7 + '@babel/generator': 7.29.8 '@babel/helper-compilation-targets': 7.29.7 '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7) '@babel/helpers': 7.29.7 - '@babel/parser': 7.29.7 + '@babel/parser': 7.29.8 '@babel/template': 7.29.7 - '@babel/traverse': 7.29.7 - '@babel/types': 7.29.7 + '@babel/traverse': 7.29.8 + '@babel/types': 7.29.8 '@jridgewell/remapping': 2.3.5 convert-source-map: 2.0.0 debug: 4.4.3 @@ -7697,23 +8265,23 @@ snapshots: eslint-visitor-keys: 2.1.0 semver: 7.5.2 - '@babel/generator@7.29.7': + '@babel/generator@7.29.8': dependencies: - '@babel/parser': 7.29.7 - '@babel/types': 7.29.7 + '@babel/parser': 7.29.8 + '@babel/types': 7.29.8 '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/trace-mapping': 0.3.31 jsesc: 3.1.0 '@babel/helper-annotate-as-pure@7.29.7': dependencies: - '@babel/types': 7.29.7 + '@babel/types': 7.29.8 '@babel/helper-compilation-targets@7.29.7': dependencies: '@babel/compat-data': 7.29.7 '@babel/helper-validator-option': 7.29.7 - browserslist: 4.28.2 + browserslist: 4.28.7 lru-cache: 5.1.1 semver: 7.5.2 @@ -7725,7 +8293,7 @@ snapshots: '@babel/helper-optimise-call-expression': 7.29.7 '@babel/helper-replace-supers': 7.29.7(@babel/core@7.29.7) '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 - '@babel/traverse': 7.29.7 + '@babel/traverse': 7.29.8 semver: 7.5.2 transitivePeerDependencies: - supports-color @@ -7752,15 +8320,15 @@ snapshots: '@babel/helper-member-expression-to-functions@7.29.7': dependencies: - '@babel/traverse': 7.29.7 - '@babel/types': 7.29.7 + '@babel/traverse': 7.29.8 + '@babel/types': 7.29.8 transitivePeerDependencies: - supports-color '@babel/helper-module-imports@7.29.7': dependencies: - '@babel/traverse': 7.29.7 - '@babel/types': 7.29.7 + '@babel/traverse': 7.29.8 + '@babel/types': 7.29.8 transitivePeerDependencies: - supports-color @@ -7769,13 +8337,13 @@ snapshots: '@babel/core': 7.29.7 '@babel/helper-module-imports': 7.29.7 '@babel/helper-validator-identifier': 7.29.7 - '@babel/traverse': 7.29.7 + '@babel/traverse': 7.29.8 transitivePeerDependencies: - supports-color '@babel/helper-optimise-call-expression@7.29.7': dependencies: - '@babel/types': 7.29.7 + '@babel/types': 7.29.8 '@babel/helper-plugin-utils@7.29.7': {} @@ -7784,7 +8352,7 @@ snapshots: '@babel/core': 7.29.7 '@babel/helper-annotate-as-pure': 7.29.7 '@babel/helper-wrap-function': 7.29.7 - '@babel/traverse': 7.29.7 + '@babel/traverse': 7.29.8 transitivePeerDependencies: - supports-color @@ -7793,14 +8361,14 @@ snapshots: '@babel/core': 7.29.7 '@babel/helper-member-expression-to-functions': 7.29.7 '@babel/helper-optimise-call-expression': 7.29.7 - '@babel/traverse': 7.29.7 + '@babel/traverse': 7.29.8 transitivePeerDependencies: - supports-color '@babel/helper-skip-transparent-expression-wrappers@7.29.7': dependencies: - '@babel/traverse': 7.29.7 - '@babel/types': 7.29.7 + '@babel/traverse': 7.29.8 + '@babel/types': 7.29.8 transitivePeerDependencies: - supports-color @@ -7813,25 +8381,25 @@ snapshots: '@babel/helper-wrap-function@7.29.7': dependencies: '@babel/template': 7.29.7 - '@babel/traverse': 7.29.7 - '@babel/types': 7.29.7 + '@babel/traverse': 7.29.8 + '@babel/types': 7.29.8 transitivePeerDependencies: - supports-color '@babel/helpers@7.29.7': dependencies: '@babel/template': 7.29.7 - '@babel/types': 7.29.7 + '@babel/types': 7.29.8 - '@babel/parser@7.29.7': + '@babel/parser@7.29.8': dependencies: - '@babel/types': 7.29.7 + '@babel/types': 7.29.8 '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.29.7(@babel/core@7.29.7)': dependencies: '@babel/core': 7.29.7 '@babel/helper-plugin-utils': 7.29.7 - '@babel/traverse': 7.29.7 + '@babel/traverse': 7.29.8 transitivePeerDependencies: - supports-color @@ -7866,7 +8434,7 @@ snapshots: dependencies: '@babel/core': 7.29.7 '@babel/helper-plugin-utils': 7.29.7 - '@babel/traverse': 7.29.7 + '@babel/traverse': 7.29.8 transitivePeerDependencies: - supports-color @@ -8046,7 +8614,7 @@ snapshots: '@babel/core': 7.29.7 '@babel/helper-plugin-utils': 7.29.7 '@babel/helper-remap-async-to-generator': 7.29.7(@babel/core@7.29.7) - '@babel/traverse': 7.29.7 + '@babel/traverse': 7.29.8 transitivePeerDependencies: - supports-color @@ -8093,7 +8661,7 @@ snapshots: '@babel/helper-globals': 7.29.7 '@babel/helper-plugin-utils': 7.29.7 '@babel/helper-replace-supers': 7.29.7(@babel/core@7.29.7) - '@babel/traverse': 7.29.7 + '@babel/traverse': 7.29.8 transitivePeerDependencies: - supports-color @@ -8107,7 +8675,7 @@ snapshots: dependencies: '@babel/core': 7.29.7 '@babel/helper-plugin-utils': 7.29.7 - '@babel/traverse': 7.29.7 + '@babel/traverse': 7.29.8 transitivePeerDependencies: - supports-color @@ -8170,7 +8738,7 @@ snapshots: '@babel/core': 7.29.7 '@babel/helper-compilation-targets': 7.29.7 '@babel/helper-plugin-utils': 7.29.7 - '@babel/traverse': 7.29.7 + '@babel/traverse': 7.29.8 transitivePeerDependencies: - supports-color @@ -8210,13 +8778,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-systemjs@7.29.7(@babel/core@7.29.7)': + '@babel/plugin-transform-modules-systemjs@7.29.8(@babel/core@7.29.7)': dependencies: '@babel/core': 7.29.7 '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7) '@babel/helper-plugin-utils': 7.29.7 '@babel/helper-validator-identifier': 7.29.7 - '@babel/traverse': 7.29.7 + '@babel/traverse': 7.29.8 transitivePeerDependencies: - supports-color @@ -8256,7 +8824,7 @@ snapshots: '@babel/helper-plugin-utils': 7.29.7 '@babel/plugin-transform-destructuring': 7.29.7(@babel/core@7.29.7) '@babel/plugin-transform-parameters': 7.29.7(@babel/core@7.29.7) - '@babel/traverse': 7.29.7 + '@babel/traverse': 7.29.8 transitivePeerDependencies: - supports-color @@ -8332,7 +8900,7 @@ snapshots: '@babel/helper-module-imports': 7.29.7 '@babel/helper-plugin-utils': 7.29.7 '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.29.7) - '@babel/types': 7.29.7 + '@babel/types': 7.29.8 transitivePeerDependencies: - supports-color @@ -8342,7 +8910,7 @@ snapshots: '@babel/helper-annotate-as-pure': 7.29.7 '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-regenerator@7.29.7(@babel/core@7.29.7)': + '@babel/plugin-transform-regenerator@7.29.8(@babel/core@7.29.7)': dependencies: '@babel/core': 7.29.7 '@babel/helper-plugin-utils': 7.29.7 @@ -8375,7 +8943,7 @@ snapshots: '@babel/core': 7.29.7 '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-spread@7.29.7(@babel/core@7.29.7)': + '@babel/plugin-transform-spread@7.29.8(@babel/core@7.29.7)': dependencies: '@babel/core': 7.29.7 '@babel/helper-plugin-utils': 7.29.7 @@ -8474,7 +9042,7 @@ snapshots: '@babel/plugin-transform-member-expression-literals': 7.29.7(@babel/core@7.29.7) '@babel/plugin-transform-modules-amd': 7.29.7(@babel/core@7.29.7) '@babel/plugin-transform-modules-commonjs': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-modules-systemjs': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-modules-systemjs': 7.29.8(@babel/core@7.29.7) '@babel/plugin-transform-modules-umd': 7.29.7(@babel/core@7.29.7) '@babel/plugin-transform-named-capturing-groups-regex': 7.29.7(@babel/core@7.29.7) '@babel/plugin-transform-new-target': 7.29.7(@babel/core@7.29.7) @@ -8488,11 +9056,11 @@ snapshots: '@babel/plugin-transform-private-methods': 7.29.7(@babel/core@7.29.7) '@babel/plugin-transform-private-property-in-object': 7.29.7(@babel/core@7.29.7) '@babel/plugin-transform-property-literals': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-regenerator': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-regenerator': 7.29.8(@babel/core@7.29.7) '@babel/plugin-transform-regexp-modifiers': 7.29.7(@babel/core@7.29.7) '@babel/plugin-transform-reserved-words': 7.29.7(@babel/core@7.29.7) '@babel/plugin-transform-shorthand-properties': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-spread': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-spread': 7.29.8(@babel/core@7.29.7) '@babel/plugin-transform-sticky-regex': 7.29.7(@babel/core@7.29.7) '@babel/plugin-transform-template-literals': 7.29.7(@babel/core@7.29.7) '@babel/plugin-transform-typeof-symbol': 7.29.7(@babel/core@7.29.7) @@ -8504,7 +9072,7 @@ snapshots: babel-plugin-polyfill-corejs2: 0.4.17(@babel/core@7.29.7) babel-plugin-polyfill-corejs3: 0.14.2(@babel/core@7.29.7) babel-plugin-polyfill-regenerator: 0.6.8(@babel/core@7.29.7) - core-js-compat: 3.49.0 + core-js-compat: 3.50.0 semver: 7.5.2 transitivePeerDependencies: - supports-color @@ -8513,7 +9081,7 @@ snapshots: dependencies: '@babel/core': 7.29.7 '@babel/helper-plugin-utils': 7.29.7 - '@babel/types': 7.29.7 + '@babel/types': 7.29.8 esutils: 2.0.3 '@babel/preset-react@7.29.7(@babel/core@7.29.7)': @@ -8541,29 +9109,29 @@ snapshots: '@babel/runtime-corejs3@7.29.7': dependencies: - core-js-pure: 3.49.0 + core-js-pure: 3.50.0 '@babel/runtime@7.29.7': {} '@babel/template@7.29.7': dependencies: '@babel/code-frame': 7.29.7 - '@babel/parser': 7.29.7 - '@babel/types': 7.29.7 + '@babel/parser': 7.29.8 + '@babel/types': 7.29.8 - '@babel/traverse@7.29.7': + '@babel/traverse@7.29.8': dependencies: '@babel/code-frame': 7.29.7 - '@babel/generator': 7.29.7 + '@babel/generator': 7.29.8 '@babel/helper-globals': 7.29.7 - '@babel/parser': 7.29.7 + '@babel/parser': 7.29.8 '@babel/template': 7.29.7 - '@babel/types': 7.29.7 + '@babel/types': 7.29.8 debug: 4.4.3 transitivePeerDependencies: - supports-color - '@babel/types@7.29.7': + '@babel/types@7.29.8': dependencies: '@babel/helper-string-parser': 7.29.7 '@babel/helper-validator-identifier': 7.29.7 @@ -8639,9 +9207,9 @@ snapshots: '@csstools/postcss-cascade-layers@1.1.1(postcss@8.5.25)': dependencies: - '@csstools/selector-specificity': 2.2.0(postcss-selector-parser@6.1.2) + '@csstools/selector-specificity': 2.2.0(postcss-selector-parser@6.1.4) postcss: 8.5.25 - postcss-selector-parser: 6.1.2 + postcss-selector-parser: 6.1.4 '@csstools/postcss-color-function@1.1.1(postcss@8.5.25)': dependencies: @@ -8667,9 +9235,9 @@ snapshots: '@csstools/postcss-is-pseudo-class@2.0.7(postcss@8.5.25)': dependencies: - '@csstools/selector-specificity': 2.2.0(postcss-selector-parser@6.1.2) + '@csstools/selector-specificity': 2.2.0(postcss-selector-parser@6.1.4) postcss: 8.5.25 - postcss-selector-parser: 6.1.2 + postcss-selector-parser: 6.1.4 '@csstools/postcss-nested-calc@1.0.0(postcss@8.5.25)': dependencies: @@ -8711,13 +9279,57 @@ snapshots: dependencies: postcss: 8.5.25 - '@csstools/selector-specificity@2.2.0(postcss-selector-parser@6.1.2)': + '@csstools/selector-specificity@2.2.0(postcss-selector-parser@6.1.4)': dependencies: - postcss-selector-parser: 6.1.2 + postcss-selector-parser: 6.1.4 '@ctrl/tinycolor@3.6.1': {} - '@eslint-community/eslint-utils@4.9.1(eslint@8.57.1)': + '@deck.gl/core@9.1.15': + dependencies: + '@loaders.gl/core': 4.4.4 + '@loaders.gl/images': 4.4.4(@loaders.gl/core@4.4.4) + '@luma.gl/constants': 9.1.10 + '@luma.gl/core': 9.1.10 + '@luma.gl/engine': 9.1.10(@luma.gl/core@9.1.10)(@luma.gl/shadertools@9.1.10(@luma.gl/core@9.1.10)) + '@luma.gl/shadertools': 9.1.10(@luma.gl/core@9.1.10) + '@luma.gl/webgl': 9.1.10(@luma.gl/core@9.1.10) + '@math.gl/core': 4.1.0 + '@math.gl/sun': 4.1.0 + '@math.gl/types': 4.1.0 + '@math.gl/web-mercator': 4.1.0 + '@probe.gl/env': 4.1.1 + '@probe.gl/log': 4.1.1 + '@probe.gl/stats': 4.1.1 + '@types/offscreencanvas': 2019.7.3 + gl-matrix: 3.4.4 + mjolnir.js: 3.0.1 + + '@deck.gl/extensions@9.1.15(@deck.gl/core@9.1.15)(@luma.gl/core@9.1.10)(@luma.gl/engine@9.1.10(@luma.gl/core@9.1.10)(@luma.gl/shadertools@9.1.10(@luma.gl/core@9.1.10)))': + dependencies: + '@deck.gl/core': 9.1.15 + '@luma.gl/constants': 9.1.10 + '@luma.gl/core': 9.1.10 + '@luma.gl/engine': 9.1.10(@luma.gl/core@9.1.10)(@luma.gl/shadertools@9.1.10(@luma.gl/core@9.1.10)) + '@luma.gl/shadertools': 9.1.10(@luma.gl/core@9.1.10) + '@math.gl/core': 4.1.0 + + '@deck.gl/layers@9.1.15(@deck.gl/core@9.1.15)(@loaders.gl/core@4.4.4)(@luma.gl/core@9.1.10)(@luma.gl/engine@9.1.10(@luma.gl/core@9.1.10)(@luma.gl/shadertools@9.1.10(@luma.gl/core@9.1.10)))': + dependencies: + '@deck.gl/core': 9.1.15 + '@loaders.gl/core': 4.4.4 + '@loaders.gl/images': 4.4.4(@loaders.gl/core@4.4.4) + '@loaders.gl/schema': 4.4.4 + '@luma.gl/core': 9.1.10 + '@luma.gl/engine': 9.1.10(@luma.gl/core@9.1.10)(@luma.gl/shadertools@9.1.10(@luma.gl/core@9.1.10)) + '@luma.gl/shadertools': 9.1.10(@luma.gl/core@9.1.10) + '@mapbox/tiny-sdf': 2.2.0 + '@math.gl/core': 4.1.0 + '@math.gl/polygon': 4.1.0 + '@math.gl/web-mercator': 4.1.0 + earcut: 2.2.4 + + '@eslint-community/eslint-utils@4.10.1(eslint@8.57.1)': dependencies: eslint: 8.57.1 eslint-visitor-keys: 3.4.3 @@ -8740,6 +9352,23 @@ snapshots: '@eslint/js@8.57.1': {} + '@floating-ui/core@1.8.0': + dependencies: + '@floating-ui/utils': 0.2.12 + + '@floating-ui/dom@1.8.0': + dependencies: + '@floating-ui/core': 1.8.0 + '@floating-ui/utils': 0.2.12 + + '@floating-ui/react-dom@2.1.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@floating-ui/dom': 1.8.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@floating-ui/utils@0.2.12': {} + '@humanwhocodes/config-array@0.13.0': dependencies: '@humanwhocodes/object-schema': 2.0.3 @@ -8877,7 +9506,7 @@ snapshots: '@jest/schemas@28.1.3': dependencies: - '@sinclair/typebox': 0.24.51 + '@sinclair/typebox': 0.24.52 '@jest/source-map@27.5.1': dependencies: @@ -8945,36 +9574,126 @@ snapshots: '@types/yargs': 17.0.35 chalk: 4.1.2 - '@jridgewell/gen-mapping@0.3.13': + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/source-map@0.3.11': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@jridgewell/trace-mapping@0.3.9': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@leichtgewicht/ip-codec@2.0.5': {} + + '@loaders.gl/core@4.4.4': + dependencies: + '@loaders.gl/loader-utils': 4.4.4(@loaders.gl/core@4.4.4) + '@loaders.gl/schema': 4.4.4 + '@loaders.gl/schema-utils': 4.4.4(@loaders.gl/core@4.4.4) + '@loaders.gl/worker-utils': 4.4.4(@loaders.gl/core@4.4.4) + '@probe.gl/log': 4.1.1 + + '@loaders.gl/images@4.4.4(@loaders.gl/core@4.4.4)': + dependencies: + '@loaders.gl/core': 4.4.4 + '@loaders.gl/loader-utils': 4.4.4(@loaders.gl/core@4.4.4) + + '@loaders.gl/loader-utils@4.4.4(@loaders.gl/core@4.4.4)': + dependencies: + '@loaders.gl/schema': 4.4.4 + '@loaders.gl/worker-utils': 4.4.4(@loaders.gl/core@4.4.4) + '@probe.gl/log': 4.1.1 + '@probe.gl/stats': 4.1.1 + transitivePeerDependencies: + - '@loaders.gl/core' + + '@loaders.gl/schema-utils@4.4.4(@loaders.gl/core@4.4.4)': + dependencies: + '@loaders.gl/core': 4.4.4 + '@loaders.gl/schema': 4.4.4 + '@math.gl/types': 4.1.0 + '@types/geojson': 7946.0.16 + apache-arrow: 21.2.0 + + '@loaders.gl/schema@4.4.4': + dependencies: + '@types/geojson': 7946.0.16 + apache-arrow: 21.2.0 + + '@loaders.gl/worker-utils@4.4.4(@loaders.gl/core@4.4.4)': + dependencies: + '@loaders.gl/core': 4.4.4 + + '@luma.gl/constants@9.1.10': {} + + '@luma.gl/core@9.1.10': dependencies: - '@jridgewell/sourcemap-codec': 1.5.5 - '@jridgewell/trace-mapping': 0.3.31 + '@math.gl/types': 4.1.0 + '@probe.gl/env': 4.1.1 + '@probe.gl/log': 4.1.1 + '@probe.gl/stats': 4.1.1 + '@types/offscreencanvas': 2019.7.3 - '@jridgewell/remapping@2.3.5': + '@luma.gl/engine@9.1.10(@luma.gl/core@9.1.10)(@luma.gl/shadertools@9.1.10(@luma.gl/core@9.1.10))': dependencies: - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 + '@luma.gl/core': 9.1.10 + '@luma.gl/shadertools': 9.1.10(@luma.gl/core@9.1.10) + '@math.gl/core': 4.1.0 + '@math.gl/types': 4.1.0 + '@probe.gl/log': 4.1.1 + '@probe.gl/stats': 4.1.1 - '@jridgewell/resolve-uri@3.1.2': {} + '@luma.gl/shadertools@9.1.10(@luma.gl/core@9.1.10)': + dependencies: + '@luma.gl/core': 9.1.10 + '@math.gl/core': 4.1.0 + '@math.gl/types': 4.1.0 + wgsl_reflect: 1.5.0 - '@jridgewell/source-map@0.3.11': + '@luma.gl/webgl@9.1.10(@luma.gl/core@9.1.10)': dependencies: - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 + '@luma.gl/constants': 9.1.10 + '@luma.gl/core': 9.1.10 + '@math.gl/types': 4.1.0 + '@probe.gl/env': 4.1.1 - '@jridgewell/sourcemap-codec@1.5.5': {} + '@mapbox/tiny-sdf@2.2.0': {} - '@jridgewell/trace-mapping@0.3.31': + '@math.gl/core@4.1.0': dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.5 + '@math.gl/types': 4.1.0 - '@jridgewell/trace-mapping@0.3.9': + '@math.gl/polygon@4.1.0': dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.5 + '@math.gl/core': 4.1.0 - '@leichtgewicht/ip-codec@2.0.5': {} + '@math.gl/sun@4.1.0': {} + + '@math.gl/types@4.1.0': {} + + '@math.gl/web-mercator@4.1.0': + dependencies: + '@math.gl/core': 4.1.0 '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1': dependencies: @@ -9119,20 +9838,24 @@ snapshots: '@petamoriken/float16@3.9.3': {} - '@pmmmwh/react-refresh-webpack-plugin@0.5.17(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@4.15.2(webpack@5.107.2(postcss@8.5.25)))(webpack@5.107.2(postcss@8.5.25))': + '@playwright/test@1.62.1': + dependencies: + playwright: 1.62.1 + + '@pmmmwh/react-refresh-webpack-plugin@0.5.17(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@4.15.2(webpack@5.109.2(postcss@8.5.25)))(webpack@5.109.2(postcss@8.5.25))': dependencies: ansi-html: 0.0.9 - core-js-pure: 3.49.0 + core-js-pure: 3.50.0 error-stack-parser: 2.1.4 html-entities: 2.6.0 loader-utils: 2.0.4 react-refresh: 0.11.0 schema-utils: 4.3.3 source-map: 0.7.6 - webpack: 5.107.2(postcss@8.5.25) + webpack: 5.109.2(postcss@8.5.25) optionalDependencies: type-fest: 4.41.0 - webpack-dev-server: 4.15.2(webpack@5.107.2(postcss@8.5.25)) + webpack-dev-server: 4.15.2(webpack@5.109.2(postcss@8.5.25)) '@pnpm/config.env-replace@1.1.0': {} @@ -9140,12 +9863,259 @@ snapshots: dependencies: graceful-fs: 4.2.10 - '@pnpm/npm-conf@3.0.2': + '@pnpm/npm-conf@3.0.3': dependencies: '@pnpm/config.env-replace': 1.1.0 '@pnpm/network.ca-file': 1.0.2 config-chain: 1.1.13 + '@probe.gl/env@4.1.1': {} + + '@probe.gl/log@4.1.1': + dependencies: + '@probe.gl/env': 4.1.1 + + '@probe.gl/stats@4.1.1': {} + + '@radix-ui/number@1.1.3': {} + + '@radix-ui/primitive@1.1.7': {} + + '@radix-ui/react-arrow@1.1.15(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.31 + '@types/react-dom': 18.3.7(@types/react@18.3.31) + + '@radix-ui/react-collection@1.1.15(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.5(@types/react@18.3.31)(react@18.3.1) + '@radix-ui/react-context': 1.2.2(@types/react@18.3.31)(react@18.3.1) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.3.3(@types/react@18.3.31)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.31 + '@types/react-dom': 18.3.7(@types/react@18.3.31) + + '@radix-ui/react-compose-refs@1.1.5(@types/react@18.3.31)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.31 + + '@radix-ui/react-context@1.2.2(@types/react@18.3.31)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.31 + + '@radix-ui/react-direction@1.1.4(@types/react@18.3.31)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.31 + + '@radix-ui/react-dismissable-layer@1.1.19(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.7 + '@radix-ui/react-compose-refs': 1.1.5(@types/react@18.3.31)(react@18.3.1) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.4(@types/react@18.3.31)(react@18.3.1) + '@radix-ui/react-use-effect-event': 0.0.5(@types/react@18.3.31)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.31 + '@types/react-dom': 18.3.7(@types/react@18.3.31) + + '@radix-ui/react-focus-guards@1.1.6(@types/react@18.3.31)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.31 + + '@radix-ui/react-focus-scope@1.1.16(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.5(@types/react@18.3.31)(react@18.3.1) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.4(@types/react@18.3.31)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.31 + '@types/react-dom': 18.3.7(@types/react@18.3.31) + + '@radix-ui/react-id@1.1.4(@types/react@18.3.31)(react@18.3.1)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@18.3.31)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.31 + + '@radix-ui/react-popover@1.1.23(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.7 + '@radix-ui/react-compose-refs': 1.1.5(@types/react@18.3.31)(react@18.3.1) + '@radix-ui/react-context': 1.2.2(@types/react@18.3.31)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.19(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-focus-guards': 1.1.6(@types/react@18.3.31)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.1.16(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-id': 1.1.4(@types/react@18.3.31)(react@18.3.1) + '@radix-ui/react-popper': 1.3.7(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-portal': 1.1.17(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.10(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.3.3(@types/react@18.3.31)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@18.3.31)(react@18.3.1) + aria-hidden: 1.2.6 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-remove-scroll: 2.7.2(@types/react@18.3.31)(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.31 + '@types/react-dom': 18.3.7(@types/react@18.3.31) + + '@radix-ui/react-popper@1.3.7(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@floating-ui/react-dom': 2.1.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-arrow': 1.1.15(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.5(@types/react@18.3.31)(react@18.3.1) + '@radix-ui/react-context': 1.2.2(@types/react@18.3.31)(react@18.3.1) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.4(@types/react@18.3.31)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@18.3.31)(react@18.3.1) + '@radix-ui/react-use-rect': 1.1.4(@types/react@18.3.31)(react@18.3.1) + '@radix-ui/react-use-size': 1.1.4(@types/react@18.3.31)(react@18.3.1) + '@radix-ui/rect': 1.1.3 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.31 + '@types/react-dom': 18.3.7(@types/react@18.3.31) + + '@radix-ui/react-portal@1.1.17(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@18.3.31)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.31 + '@types/react-dom': 18.3.7(@types/react@18.3.31) + + '@radix-ui/react-presence@1.1.10(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@18.3.31)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.31 + '@types/react-dom': 18.3.7(@types/react@18.3.31) + + '@radix-ui/react-primitive@2.1.10(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-slot': 1.3.3(@types/react@18.3.31)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.31 + '@types/react-dom': 18.3.7(@types/react@18.3.31) + + '@radix-ui/react-slider@1.4.7(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/number': 1.1.3 + '@radix-ui/primitive': 1.1.7 + '@radix-ui/react-collection': 1.1.15(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.5(@types/react@18.3.31)(react@18.3.1) + '@radix-ui/react-context': 1.2.2(@types/react@18.3.31)(react@18.3.1) + '@radix-ui/react-direction': 1.1.4(@types/react@18.3.31)(react@18.3.1) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@18.3.31)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@18.3.31)(react@18.3.1) + '@radix-ui/react-use-previous': 1.1.4(@types/react@18.3.31)(react@18.3.1) + '@radix-ui/react-use-size': 1.1.4(@types/react@18.3.31)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.31 + '@types/react-dom': 18.3.7(@types/react@18.3.31) + + '@radix-ui/react-slot@1.3.3(@types/react@18.3.31)(react@18.3.1)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.5(@types/react@18.3.31)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.31 + + '@radix-ui/react-switch@1.3.7(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.7 + '@radix-ui/react-compose-refs': 1.1.5(@types/react@18.3.31)(react@18.3.1) + '@radix-ui/react-context': 1.2.2(@types/react@18.3.31)(react@18.3.1) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@18.3.31)(react@18.3.1) + '@radix-ui/react-use-size': 1.1.4(@types/react@18.3.31)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.31 + '@types/react-dom': 18.3.7(@types/react@18.3.31) + + '@radix-ui/react-use-callback-ref@1.1.4(@types/react@18.3.31)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.31 + + '@radix-ui/react-use-controllable-state@1.2.6(@types/react@18.3.31)(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.7 + '@radix-ui/react-use-effect-event': 0.0.5(@types/react@18.3.31)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@18.3.31)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.31 + + '@radix-ui/react-use-effect-event@0.0.5(@types/react@18.3.31)(react@18.3.1)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@18.3.31)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.31 + + '@radix-ui/react-use-layout-effect@1.1.4(@types/react@18.3.31)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.31 + + '@radix-ui/react-use-previous@1.1.4(@types/react@18.3.31)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.31 + + '@radix-ui/react-use-rect@1.1.4(@types/react@18.3.31)(react@18.3.1)': + dependencies: + '@radix-ui/rect': 1.1.3 + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.31 + + '@radix-ui/react-use-size@1.1.4(@types/react@18.3.31)(react@18.3.1)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@18.3.31)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.31 + + '@radix-ui/rect@1.1.3': {} + '@rc-component/portal@1.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.29.7 @@ -9200,7 +10170,7 @@ snapshots: dependencies: '@semantic-release/error': 3.0.0 aggregate-error: 3.1.0 - fs-extra: 11.3.5 + fs-extra: 11.4.0 lodash: 4.18.1 semantic-release: 21.1.2(typescript@4.9.5) @@ -9297,7 +10267,7 @@ snapshots: '@semantic-release/error': 4.0.0 aggregate-error: 5.0.0 execa: 8.0.1 - fs-extra: 11.3.5 + fs-extra: 11.4.0 lodash-es: 4.18.1 nerf-dart: 1.0.0 normalize-url: 8.1.1 @@ -9314,11 +10284,11 @@ snapshots: '@semantic-release/error': 4.0.0 aggregate-error: 5.0.0 execa: 9.6.1 - fs-extra: 11.3.5 + fs-extra: 11.4.0 lodash-es: 4.18.1 nerf-dart: 1.0.0 normalize-url: 8.1.1 - npm: 10.9.8 + npm: 10.9.9 rc: 1.2.8 read-pkg: 9.0.1 registry-auth-token: 5.1.1 @@ -9358,7 +10328,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@sinclair/typebox@0.24.51': {} + '@sinclair/typebox@0.24.52': {} '@sindresorhus/merge-streams@2.3.0': {} @@ -9416,7 +10386,7 @@ snapshots: '@svgr/hast-util-to-babel-ast@5.5.0': dependencies: - '@babel/types': 7.29.7 + '@babel/types': 7.29.8 '@svgr/plugin-jsx@5.5.0': dependencies: @@ -9469,11 +10439,11 @@ snapshots: lodash: 4.18.1 redent: 3.0.0 - '@testing-library/react@14.3.1(@types/react@18.3.30)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@testing-library/react@14.3.1(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.29.7 '@testing-library/dom': 9.3.4 - '@types/react-dom': 18.3.7(@types/react@18.3.30) + '@types/react-dom': 18.3.7(@types/react@18.3.31) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) transitivePeerDependencies: @@ -9497,24 +10467,24 @@ snapshots: '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.29.7 - '@babel/types': 7.29.7 + '@babel/parser': 7.29.8 + '@babel/types': 7.29.8 '@types/babel__generator': 7.27.0 '@types/babel__template': 7.4.4 '@types/babel__traverse': 7.28.0 '@types/babel__generator@7.27.0': dependencies: - '@babel/types': 7.29.7 + '@babel/types': 7.29.8 '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.29.7 - '@babel/types': 7.29.7 + '@babel/parser': 7.29.8 + '@babel/types': 7.29.8 '@types/babel__traverse@7.28.0': dependencies: - '@babel/types': 7.29.7 + '@babel/types': 7.29.8 '@types/body-parser@1.19.6': dependencies: @@ -9527,7 +10497,7 @@ snapshots: '@types/connect-history-api-fallback@1.5.4': dependencies: - '@types/express-serve-static-core': 5.1.1 + '@types/express-serve-static-core': 5.1.3 '@types/node': 14.18.63 '@types/connect@3.4.38': @@ -9545,14 +10515,14 @@ snapshots: '@types/estree@1.0.9': {} - '@types/express-serve-static-core@4.19.8': + '@types/express-serve-static-core@4.19.9': dependencies: '@types/node': 14.18.63 '@types/qs': 6.15.1 '@types/range-parser': 1.2.7 '@types/send': 1.2.1 - '@types/express-serve-static-core@5.1.1': + '@types/express-serve-static-core@5.1.3': dependencies: '@types/node': 14.18.63 '@types/qs': 6.15.1 @@ -9562,10 +10532,12 @@ snapshots: '@types/express@4.17.25': dependencies: '@types/body-parser': 1.19.6 - '@types/express-serve-static-core': 4.19.8 + '@types/express-serve-static-core': 4.19.9 '@types/qs': 6.15.1 '@types/serve-static': 1.15.10 + '@types/geojson@7946.0.16': {} + '@types/graceful-fs@4.1.9': dependencies: '@types/node': 14.18.63 @@ -9599,7 +10571,7 @@ snapshots: '@types/json5@0.0.29': {} - '@types/lodash@4.17.24': {} + '@types/lodash@4.17.25': {} '@types/mime@1.3.5': {} @@ -9611,8 +10583,14 @@ snapshots: '@types/node@14.18.63': {} + '@types/node@25.9.5': + dependencies: + undici-types: 7.24.6 + '@types/normalize-package-data@2.4.4': {} + '@types/offscreencanvas@2019.7.3': {} + '@types/parse-json@4.0.2': {} '@types/prettier@2.7.3': {} @@ -9625,22 +10603,22 @@ snapshots: '@types/rbush@4.0.0': {} - '@types/react-dom@18.3.7(@types/react@18.3.30)': + '@types/react-dom@18.3.7(@types/react@18.3.31)': dependencies: - '@types/react': 18.3.30 + '@types/react': 18.3.31 '@types/react-router-dom@5.3.3': dependencies: '@types/history': 4.7.11 - '@types/react': 18.3.30 + '@types/react': 18.3.31 '@types/react-router': 5.1.20 '@types/react-router@5.1.20': dependencies: '@types/history': 4.7.11 - '@types/react': 18.3.30 + '@types/react': 18.3.31 - '@types/react@18.3.30': + '@types/react@18.3.31': dependencies: '@types/prop-types': 15.7.15 csstype: 3.2.3 @@ -9653,7 +10631,7 @@ snapshots: '@types/retry@0.12.5': {} - '@types/semver@7.7.1': {} + '@types/semver@7.8.0': {} '@types/send@0.17.6': dependencies: @@ -9776,9 +10754,9 @@ snapshots: '@typescript-eslint/utils@5.62.0(eslint@8.57.1)(typescript@4.9.5)': dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@8.57.1) + '@eslint-community/eslint-utils': 4.10.1(eslint@8.57.1) '@types/json-schema': 7.0.15 - '@types/semver': 7.7.1 + '@types/semver': 7.8.0 '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/types': 5.62.0 '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.5) @@ -9794,7 +10772,7 @@ snapshots: '@typescript-eslint/types': 5.62.0 eslint-visitor-keys: 3.4.3 - '@ungap/structured-clone@1.3.1': {} + '@ungap/structured-clone@1.3.3': {} '@webassemblyjs/ast@1.14.1': dependencies: @@ -9898,23 +10876,19 @@ snapshots: acorn: 7.4.1 acorn-walk: 7.2.0 - acorn-import-phases@1.0.4(acorn@8.16.0): - dependencies: - acorn: 8.16.0 - - acorn-jsx@5.3.2(acorn@8.16.0): + acorn-jsx@5.3.2(acorn@8.18.0): dependencies: - acorn: 8.16.0 + acorn: 8.18.0 acorn-walk@7.2.0: {} acorn-walk@8.3.5: dependencies: - acorn: 8.16.0 + acorn: 8.18.0 acorn@7.4.1: {} - acorn@8.16.0: {} + acorn@8.18.0: {} address@1.2.2: {} @@ -10051,6 +11025,13 @@ snapshots: normalize-path: 3.0.0 picomatch: 2.3.2 + apache-arrow@21.2.0: + dependencies: + '@types/node': 25.9.5 + flatbuffers: 25.9.23 + json-with-bigint: 3.5.10 + tslib: 2.8.1 + arg@4.1.3: {} arg@5.0.2: {} @@ -10063,6 +11044,10 @@ snapshots: argv-formatter@1.0.0: {} + aria-hidden@1.2.6: + dependencies: + tslib: 2.8.1 + aria-query@5.1.3: dependencies: deep-equal: 2.2.3 @@ -10166,10 +11151,10 @@ snapshots: at-least-node@1.0.0: {} - autoprefixer@10.5.0(postcss@8.5.25): + autoprefixer@10.5.4(postcss@8.5.25): dependencies: - browserslist: 4.28.2 - caniuse-lite: 1.0.30001793 + browserslist: 4.28.7 + caniuse-lite: 1.0.30001806 fraction.js: 5.3.4 picocolors: 1.1.1 postcss: 8.5.25 @@ -10179,7 +11164,7 @@ snapshots: dependencies: possible-typed-array-names: 1.1.0 - axe-core@4.12.0: {} + axe-core@4.13.0: {} axios@1.18.0: dependencies: @@ -10209,14 +11194,14 @@ snapshots: transitivePeerDependencies: - supports-color - babel-loader@8.4.1(@babel/core@7.29.7)(webpack@5.107.2(postcss@8.5.25)): + babel-loader@8.4.1(@babel/core@7.29.7)(webpack@5.109.2(postcss@8.5.25)): dependencies: '@babel/core': 7.29.7 find-cache-dir: 3.3.2 loader-utils: 2.0.4 make-dir: 3.1.0 schema-utils: 2.7.1 - webpack: 5.107.2(postcss@8.5.25) + webpack: 5.109.2(postcss@8.5.25) babel-plugin-istanbul@6.1.1: dependencies: @@ -10231,7 +11216,7 @@ snapshots: babel-plugin-jest-hoist@27.5.1: dependencies: '@babel/template': 7.29.7 - '@babel/types': 7.29.7 + '@babel/types': 7.29.8 '@types/babel__core': 7.20.5 '@types/babel__traverse': 7.28.0 @@ -10258,7 +11243,7 @@ snapshots: dependencies: '@babel/core': 7.29.7 '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.29.7) - core-js-compat: 3.49.0 + core-js-compat: 3.50.0 transitivePeerDependencies: - supports-color @@ -10266,7 +11251,7 @@ snapshots: dependencies: '@babel/core': 7.29.7 '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.29.7) - core-js-compat: 3.49.0 + core-js-compat: 3.50.0 transitivePeerDependencies: - supports-color @@ -10330,39 +11315,36 @@ snapshots: bare-events@2.9.1: {} - bare-fs@4.7.2: + bare-fs@4.8.0: dependencies: bare-events: 2.9.1 - bare-path: 3.0.1 - bare-stream: 2.13.1(bare-events@2.9.1) - bare-url: 2.4.5 + bare-path: 3.1.1 + bare-stream: 2.13.3(bare-events@2.9.1) + bare-url: 2.4.7 fast-fifo: 1.3.2 transitivePeerDependencies: - bare-abort-controller - react-native-b4a - bare-os@3.9.1: {} - - bare-path@3.0.1: - dependencies: - bare-os: 3.9.1 + bare-path@3.1.1: {} - bare-stream@2.13.1(bare-events@2.9.1): + bare-stream@2.13.3(bare-events@2.9.1): dependencies: - streamx: 2.26.0 + b4a: 1.8.1 + streamx: 2.28.0 teex: 1.0.1 optionalDependencies: bare-events: 2.9.1 transitivePeerDependencies: - react-native-b4a - bare-url@2.4.5: + bare-url@2.4.7: dependencies: - bare-path: 3.0.1 + bare-path: 3.1.1 base64-js@1.5.1: {} - baseline-browser-mapping@2.10.33: {} + baseline-browser-mapping@2.11.12: {} batch@0.6.1: {} @@ -10401,7 +11383,7 @@ snapshots: transitivePeerDependencies: - supports-color - bonjour-service@1.4.0: + bonjour-service@1.4.4: dependencies: fast-deep-equal: 3.1.3 multicast-dns: 7.2.5 @@ -10425,13 +11407,13 @@ snapshots: browser-process-hrtime@1.0.0: {} - browserslist@4.28.2: + browserslist@4.28.7: dependencies: - baseline-browser-mapping: 2.10.33 - caniuse-lite: 1.0.30001793 - electron-to-chromium: 1.5.367 - node-releases: 2.0.47 - update-browserslist-db: 1.2.3(browserslist@4.28.2) + baseline-browser-mapping: 2.11.12 + caniuse-lite: 1.0.30001806 + electron-to-chromium: 1.5.401 + node-releases: 2.0.52 + update-browserslist-db: 1.2.3(browserslist@4.28.7) bser@2.1.1: dependencies: @@ -10481,12 +11463,12 @@ snapshots: caniuse-api@3.0.0: dependencies: - browserslist: 4.28.2 - caniuse-lite: 1.0.30001793 + browserslist: 4.28.7 + caniuse-lite: 1.0.30001806 lodash.memoize: 4.1.2 lodash.uniq: 4.5.0 - caniuse-lite@1.0.30001793: {} + caniuse-lite@1.0.30001806: {} cardinal@2.1.1: dependencies: @@ -10537,6 +11519,10 @@ snapshots: cjs-module-lexer@1.4.3: {} + class-variance-authority@0.7.1: + dependencies: + clsx: 2.1.1 + classnames@2.5.1: {} clean-css@5.3.3: @@ -10567,6 +11553,8 @@ snapshots: strip-ansi: 6.0.1 wrap-ansi: 7.0.0 + clsx@2.1.1: {} + co@4.6.0: {} collect-v8-coverage@1.0.3: {} @@ -10708,7 +11696,7 @@ snapshots: dependencies: toggle-selection: 1.0.6 - copy-webpack-plugin@9.1.0(webpack@5.107.2(postcss@8.5.25)): + copy-webpack-plugin@9.1.0(webpack@5.109.2(postcss@8.5.25)): dependencies: fast-glob: 3.3.3 glob-parent: 6.0.2 @@ -10716,15 +11704,15 @@ snapshots: normalize-path: 3.0.0 schema-utils: 3.3.0 serialize-javascript: 7.0.5 - webpack: 5.107.2(postcss@8.5.25) + webpack: 5.109.2(postcss@8.5.25) - core-js-compat@3.49.0: + core-js-compat@3.50.0: dependencies: - browserslist: 4.28.2 + browserslist: 4.28.7 - core-js-pure@3.49.0: {} + core-js-pure@3.50.0: {} - core-js@3.49.0: {} + core-js@3.50.0: {} core-util-is@1.0.3: {} @@ -10763,13 +11751,14 @@ snapshots: optionalDependencies: typescript: 4.9.5 - craco-less@2.0.0(@craco/craco@6.4.5(@types/node@14.18.63)(react-scripts@5.0.0(@babel/plugin-syntax-flow@7.29.7(@babel/core@7.29.7))(@babel/plugin-transform-react-jsx@7.29.7(@babel/core@7.29.7))(@types/babel__core@7.20.5)(eslint@8.57.1)(react@18.3.1)(ts-node@10.9.2(@types/node@14.18.63)(typescript@4.9.5))(type-fest@4.41.0)(typescript@4.9.5))(typescript@4.9.5))(react-scripts@5.0.0(@babel/plugin-syntax-flow@7.29.7(@babel/core@7.29.7))(@babel/plugin-transform-react-jsx@7.29.7(@babel/core@7.29.7))(@types/babel__core@7.20.5)(eslint@8.57.1)(react@18.3.1)(ts-node@10.9.2(@types/node@14.18.63)(typescript@4.9.5))(type-fest@4.41.0)(typescript@4.9.5))(webpack@5.107.2(postcss@8.5.25)): + craco-less@2.0.0(@craco/craco@6.4.5(@types/node@14.18.63)(react-scripts@5.0.0(@babel/plugin-syntax-flow@7.29.7(@babel/core@7.29.7))(@babel/plugin-transform-react-jsx@7.29.7(@babel/core@7.29.7))(@types/babel__core@7.20.5)(eslint@8.57.1)(react@18.3.1)(ts-node@10.9.2(@types/node@14.18.63)(typescript@4.9.5))(type-fest@4.41.0)(typescript@4.9.5))(typescript@4.9.5))(react-scripts@5.0.0(@babel/plugin-syntax-flow@7.29.7(@babel/core@7.29.7))(@babel/plugin-transform-react-jsx@7.29.7(@babel/core@7.29.7))(@types/babel__core@7.20.5)(eslint@8.57.1)(react@18.3.1)(ts-node@10.9.2(@types/node@14.18.63)(typescript@4.9.5))(type-fest@4.41.0)(typescript@4.9.5))(webpack@5.109.2(postcss@8.5.25)): dependencies: '@craco/craco': 6.4.5(@types/node@14.18.63)(react-scripts@5.0.0(@babel/plugin-syntax-flow@7.29.7(@babel/core@7.29.7))(@babel/plugin-transform-react-jsx@7.29.7(@babel/core@7.29.7))(@types/babel__core@7.20.5)(eslint@8.57.1)(react@18.3.1)(ts-node@10.9.2(@types/node@14.18.63)(typescript@4.9.5))(type-fest@4.41.0)(typescript@4.9.5))(typescript@4.9.5) - less: 4.6.4 - less-loader: 7.3.0(less@4.6.4)(webpack@5.107.2(postcss@8.5.25)) + less: 4.8.1 + less-loader: 7.3.0(less@4.8.1)(webpack@5.109.2(postcss@8.5.25)) react-scripts: 5.0.0(@babel/plugin-syntax-flow@7.29.7(@babel/core@7.29.7))(@babel/plugin-transform-react-jsx@7.29.7(@babel/core@7.29.7))(@types/babel__core@7.20.5)(eslint@8.57.1)(react@18.3.1)(ts-node@10.9.2(@types/node@14.18.63)(typescript@4.9.5))(type-fest@4.41.0)(typescript@4.9.5) transitivePeerDependencies: + - supports-color - webpack create-require@1.1.1: {} @@ -10791,7 +11780,7 @@ snapshots: css-blank-pseudo@3.0.3(postcss@8.5.25): dependencies: postcss: 8.5.25 - postcss-selector-parser: 6.1.2 + postcss-selector-parser: 6.1.4 css-declaration-sorter@6.4.1(postcss@8.5.25): dependencies: @@ -10800,9 +11789,9 @@ snapshots: css-has-pseudo@3.0.4(postcss@8.5.25): dependencies: postcss: 8.5.25 - postcss-selector-parser: 6.1.2 + postcss-selector-parser: 6.1.4 - css-loader@6.11.0(webpack@5.107.2(postcss@8.5.25)): + css-loader@6.11.0(webpack@5.109.2(postcss@8.5.25)): dependencies: icss-utils: 5.1.0(postcss@8.5.25) postcss: 8.5.25 @@ -10813,9 +11802,9 @@ snapshots: postcss-value-parser: 4.2.0 semver: 7.5.2 optionalDependencies: - webpack: 5.107.2(postcss@8.5.25) + webpack: 5.109.2(postcss@8.5.25) - css-minimizer-webpack-plugin@3.4.1(webpack@5.107.2(postcss@8.5.25)): + css-minimizer-webpack-plugin@3.4.1(webpack@5.109.2(postcss@8.5.25)): dependencies: cssnano: 5.1.15(postcss@8.5.25) jest-worker: 27.5.1 @@ -10823,7 +11812,7 @@ snapshots: schema-utils: 4.3.3 serialize-javascript: 7.0.5 source-map: 0.6.1 - webpack: 5.107.2(postcss@8.5.25) + webpack: 5.109.2(postcss@8.5.25) css-prefers-color-scheme@6.0.3(postcss@8.5.25): dependencies: @@ -10950,7 +11939,7 @@ snapshots: lodash.clonedeep: 4.5.0 loglevel: 1.9.2 ndarray: 1.0.19 - pako: 2.1.0 + pako: 2.2.0 dcmjs@0.41.0: dependencies: @@ -10960,7 +11949,7 @@ snapshots: lodash.clonedeep: 4.5.0 loglevel: 1.9.2 ndarray: 1.0.19 - pako: 2.1.0 + pako: 2.2.0 debug@2.6.9: dependencies: @@ -11001,10 +11990,10 @@ snapshots: object-keys: 1.1.1 object.assign: 4.1.7 regexp.prototype.flags: 1.5.4 - side-channel: 1.1.0 + side-channel: 1.1.1 which-boxed-primitive: 1.1.1 which-collection: 1.0.2 - which-typed-array: 1.1.21 + which-typed-array: 1.1.22 deep-extend@0.6.0: {} @@ -11044,6 +12033,8 @@ snapshots: detect-newline@3.1.0: {} + detect-node-es@1.1.0: {} + detect-node@2.1.0: {} detect-port-alt@1.1.6: @@ -11053,20 +12044,28 @@ snapshots: transitivePeerDependencies: - supports-color - dicom-microscopy-viewer@0.48.23: + dicom-microscopy-viewer@https://codeload.github.com/ImagingDataCommons/dicom-microscopy-viewer/tar.gz/1b39614eae92e92578d14977f66ced60243e51bc(@loaders.gl/core@4.4.4)(@luma.gl/core@9.1.10)(@luma.gl/engine@9.1.10(@luma.gl/core@9.1.10)(@luma.gl/shadertools@9.1.10(@luma.gl/core@9.1.10))): dependencies: '@cornerstonejs/codec-charls': 1.2.3 '@cornerstonejs/codec-libjpeg-turbo-8bit': 1.2.2 '@cornerstonejs/codec-openjpeg': 1.3.0 '@cornerstonejs/codec-openjph': 2.4.7 + '@deck.gl/core': 9.1.15 + '@deck.gl/extensions': 9.1.15(@deck.gl/core@9.1.15)(@luma.gl/core@9.1.10)(@luma.gl/engine@9.1.10(@luma.gl/core@9.1.10)(@luma.gl/shadertools@9.1.10(@luma.gl/core@9.1.10))) + '@deck.gl/layers': 9.1.15(@deck.gl/core@9.1.15)(@loaders.gl/core@4.4.4)(@luma.gl/core@9.1.10)(@luma.gl/engine@9.1.10(@luma.gl/core@9.1.10)(@luma.gl/shadertools@9.1.10(@luma.gl/core@9.1.10))) '@imagingdatacommons/dicomicc': 0.2.3 colormap: 2.3.2 dcmjs: 0.41.0 dicomweb-client: 0.10.3 + flatbush: 4.4.0 image-type: 4.1.0 mathjs: 11.12.0 - ol: 10.9.0 + ol: 10.10.0 uuid: 9.0.1 + transitivePeerDependencies: + - '@loaders.gl/core' + - '@luma.gl/core' + - '@luma.gl/engine' dicomweb-client@0.10.3: {} @@ -11151,7 +12150,9 @@ snapshots: duplexer@0.1.2: {} - earcut@3.0.2: {} + earcut@2.2.4: {} + + earcut@3.2.3: {} ee-first@1.1.1: {} @@ -11159,7 +12160,7 @@ snapshots: dependencies: jake: 10.9.4 - electron-to-chromium@1.5.367: {} + electron-to-chromium@1.5.401: {} email-addresses@5.0.0: {} @@ -11177,7 +12178,7 @@ snapshots: encodeurl@2.0.0: {} - enhanced-resolve@5.22.2: + enhanced-resolve@5.24.5: dependencies: graceful-fs: 4.2.11 tapable: 2.3.3 @@ -11202,6 +12203,13 @@ snapshots: dependencies: stackframe: 1.3.4 + es-abstract-get@1.0.0: + dependencies: + es-errors: 1.3.0 + es-object-atoms: 1.1.2 + is-callable: 1.2.7 + object-inspect: 1.13.4 + es-abstract@1.24.2: dependencies: array-buffer-byte-length: 1.0.2 @@ -11216,8 +12224,8 @@ snapshots: es-errors: 1.3.0 es-object-atoms: 1.1.2 es-set-tostringtag: 2.1.0 - es-to-primitive: 1.3.0 - function.prototype.name: 1.1.8 + es-to-primitive: 1.3.4 + function.prototype.name: 1.2.0 get-intrinsic: 1.3.0 get-proto: 1.0.1 get-symbol-description: 1.1.0 @@ -11242,22 +12250,22 @@ snapshots: object-inspect: 1.13.4 object-keys: 1.1.1 object.assign: 4.1.7 - own-keys: 1.0.1 + own-keys: 1.0.2 regexp.prototype.flags: 1.5.4 safe-array-concat: 1.1.4 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.trim: 1.2.11 + string.prototype.trimend: 1.0.10 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.8 unbox-primitive: 1.1.0 - which-typed-array: 1.1.21 + which-typed-array: 1.1.22 es-define-property@1.0.1: {} @@ -11275,7 +12283,7 @@ snapshots: isarray: 2.0.5 stop-iteration-iterator: 1.1.0 - es-iterator-helpers@1.3.2: + es-iterator-helpers@1.4.0: dependencies: call-bind: 1.0.9 call-bound: 1.0.4 @@ -11294,7 +12302,7 @@ snapshots: iterator.prototype: 1.1.5 math-intrinsics: 1.1.0 - es-module-lexer@2.1.0: {} + es-module-lexer@2.3.1: {} es-object-atoms@1.1.2: dependencies: @@ -11311,8 +12319,11 @@ snapshots: dependencies: hasown: 2.0.4 - es-to-primitive@1.3.0: + es-to-primitive@1.3.4: dependencies: + es-abstract-get: 1.0.0 + es-define-property: 1.0.1 + es-errors: 1.3.0 is-callable: 1.2.7 is-date-object: 1.1.0 is-symbol: 1.1.1 @@ -11374,7 +12385,7 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.13.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@4.9.5))(eslint-import-resolver-node@0.3.10)(eslint@8.57.1): + eslint-module-utils@2.14.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@4.9.5))(eslint-import-resolver-node@0.3.10)(eslint@8.57.1): dependencies: debug: 3.2.7 optionalDependencies: @@ -11403,7 +12414,7 @@ snapshots: doctrine: 2.1.0 eslint: 8.57.1 eslint-import-resolver-node: 0.3.10 - eslint-module-utils: 2.13.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@4.9.5))(eslint-import-resolver-node@0.3.10)(eslint@8.57.1) + eslint-module-utils: 2.14.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@4.9.5))(eslint-import-resolver-node@0.3.10)(eslint@8.57.1) hasown: 2.0.4 is-core-module: 2.16.2 is-glob: 4.0.3 @@ -11412,7 +12423,7 @@ snapshots: object.groupby: 1.0.3 object.values: 1.2.1 semver: 7.5.2 - string.prototype.trimend: 1.0.9 + string.prototype.trimend: 1.0.10 tsconfig-paths: 3.15.0 optionalDependencies: '@typescript-eslint/parser': 5.62.0(eslint@8.57.1)(typescript@4.9.5) @@ -11438,7 +12449,7 @@ snapshots: array-includes: 3.1.9 array.prototype.flatmap: 1.3.3 ast-types-flow: 0.0.8 - axe-core: 4.12.0 + axe-core: 4.13.0 axobject-query: 4.1.0 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 @@ -11462,7 +12473,7 @@ snapshots: array.prototype.flatmap: 1.3.3 array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 - es-iterator-helpers: 1.3.2 + es-iterator-helpers: 1.4.0 eslint: 8.57.1 estraverse: 5.3.0 hasown: 2.0.4 @@ -11503,7 +12514,7 @@ snapshots: eslint-visitor-keys@3.4.3: {} - eslint-webpack-plugin@3.2.0(eslint@8.57.1)(webpack@5.107.2(postcss@8.5.25)): + eslint-webpack-plugin@3.2.0(eslint@8.57.1)(webpack@5.109.2(postcss@8.5.25)): dependencies: '@types/eslint': 8.56.12 eslint: 8.57.1 @@ -11511,18 +12522,18 @@ snapshots: micromatch: 4.0.8 normalize-path: 3.0.0 schema-utils: 4.3.3 - webpack: 5.107.2(postcss@8.5.25) + webpack: 5.109.2(postcss@8.5.25) eslint@8.57.1: dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@8.57.1) + '@eslint-community/eslint-utils': 4.10.1(eslint@8.57.1) '@eslint-community/regexpp': 4.12.2 '@eslint/eslintrc': 2.1.4 '@eslint/js': 8.57.1 '@humanwhocodes/config-array': 0.13.0 '@humanwhocodes/module-importer': 1.0.1 '@nodelib/fs.walk': 1.2.8 - '@ungap/structured-clone': 1.3.1 + '@ungap/structured-clone': 1.3.3 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 @@ -11558,8 +12569,8 @@ snapshots: espree@9.6.1: dependencies: - acorn: 8.16.0 - acorn-jsx: 5.3.2(acorn@8.16.0) + acorn: 8.18.0 + acorn-jsx: 5.3.2(acorn@8.18.0) eslint-visitor-keys: 3.4.3 esprima@1.2.5: {} @@ -11643,7 +12654,7 @@ snapshots: pretty-ms: 9.3.0 signal-exit: 4.1.0 strip-final-newline: 4.0.0 - yoctocolors: 2.1.2 + yoctocolors: 2.2.0 exit@0.1.2: {} @@ -11730,9 +12741,9 @@ snapshots: dependencies: bser: 2.1.1 - fdir@6.5.0(picomatch@4.0.4): + fdir@6.5.0(picomatch@4.0.5): optionalDependencies: - picomatch: 4.0.4 + picomatch: 4.0.5 fflate@0.8.3: {} @@ -11753,11 +12764,11 @@ snapshots: dependencies: flat-cache: 3.2.0 - file-loader@6.2.0(webpack@5.107.2(postcss@8.5.25)): + file-loader@6.2.0(webpack@5.109.2(postcss@8.5.25)): dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.107.2(postcss@8.5.25) + webpack: 5.109.2(postcss@8.5.25) file-type@10.11.0: {} @@ -11828,11 +12839,19 @@ snapshots: flat-cache@3.2.0: dependencies: - flatted: 3.4.2 + flatted: 3.4.4 keyv: 4.5.4 rimraf: 3.0.2 - flatted@3.4.2: {} + flatbuffers@25.9.23: {} + + flatbush@4.4.0: + dependencies: + flatqueue: 2.0.3 + + flatqueue@2.0.3: {} + + flatted@3.4.4: {} follow-redirects@1.16.0: {} @@ -11840,7 +12859,7 @@ snapshots: dependencies: is-callable: 1.2.7 - fork-ts-checker-webpack-plugin@6.5.3(eslint@8.57.1)(typescript@4.9.5)(webpack@5.107.2(postcss@8.5.25)): + fork-ts-checker-webpack-plugin@6.5.3(eslint@8.57.1)(typescript@4.9.5)(webpack@5.109.2(postcss@8.5.25)): dependencies: '@babel/code-frame': 7.29.7 '@types/json-schema': 7.0.15 @@ -11856,7 +12875,7 @@ snapshots: semver: 7.5.2 tapable: 1.1.3 typescript: 4.9.5 - webpack: 5.107.2(postcss@8.5.25) + webpack: 5.109.2(postcss@8.5.25) optionalDependencies: eslint: 8.57.1 @@ -11897,7 +12916,7 @@ snapshots: jsonfile: 6.2.1 universalify: 2.0.1 - fs-extra@11.3.5: + fs-extra@11.4.0: dependencies: graceful-fs: 4.2.11 jsonfile: 6.2.1 @@ -11920,19 +12939,25 @@ snapshots: fs.realpath@1.0.0: {} + fsevents@2.3.2: + optional: true + fsevents@2.3.3: optional: true function-bind@1.1.2: {} - function.prototype.name@1.1.8: + function.prototype.name@1.2.0: dependencies: call-bind: 1.0.9 call-bound: 1.0.4 - define-properties: 1.2.1 + es-define-property: 1.0.1 + es-errors: 1.3.0 functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 hasown: 2.0.4 is-callable: 1.2.7 + is-document.all: 1.0.0 functions-have-names@1.2.3: {} @@ -11940,11 +12965,11 @@ snapshots: gensync@1.0.0-beta.2: {} - geotiff@3.0.5: + geotiff@3.1.0-beta.0: dependencies: '@petamoriken/float16': 3.9.3 lerc: 3.0.0 - pako: 2.1.0 + pako: 2.2.0 parse-headers: 2.0.6 quick-lru: 6.1.2 web-worker: 1.5.0 @@ -11966,6 +12991,8 @@ snapshots: hasown: 2.0.4 math-intrinsics: 1.1.0 + get-nonce@1.0.1: {} + get-own-enumerable-property-symbols@3.0.2: {} get-package-type@0.1.0: {} @@ -12021,8 +13048,6 @@ snapshots: dependencies: is-glob: 4.0.3 - glob-to-regexp@0.4.1: {} - glob@7.2.3: dependencies: fs.realpath: 1.0.0 @@ -12064,7 +13089,7 @@ snapshots: dependencies: '@sindresorhus/merge-streams': 2.3.0 fast-glob: 3.3.3 - ignore: 7.0.5 + ignore: 7.0.6 path-type: 6.0.0 slash: 5.1.0 unicorn-magic: 0.3.0 @@ -12169,9 +13194,9 @@ snapshots: he: 1.2.0 param-case: 3.0.4 relateurl: 0.2.7 - terser: 5.48.0 + terser: 5.49.2 - html-webpack-plugin@5.6.7(webpack@5.107.2(postcss@8.5.25)): + html-webpack-plugin@5.6.8(webpack@5.109.2(postcss@8.5.25)): dependencies: '@types/html-minifier-terser': 6.1.0 html-minifier-terser: 6.1.0 @@ -12179,7 +13204,7 @@ snapshots: pretty-error: 4.0.0 tapable: 2.3.3 optionalDependencies: - webpack: 5.107.2(postcss@8.5.25) + webpack: 5.109.2(postcss@8.5.25) htmlparser2@6.1.0: dependencies: @@ -12223,7 +13248,7 @@ snapshots: transitivePeerDependencies: - supports-color - http-proxy-middleware@2.0.9(@types/express@4.17.25): + http-proxy-middleware@2.0.10(@types/express@4.17.25): dependencies: '@types/http-proxy': 1.17.17 http-proxy: 1.18.1 @@ -12287,10 +13312,7 @@ snapshots: ignore@5.3.2: {} - ignore@7.0.5: {} - - image-size@0.5.5: - optional: true + ignore@7.0.6: {} image-type@4.1.0: dependencies: @@ -12340,7 +13362,7 @@ snapshots: dependencies: es-errors: 1.3.0 hasown: 2.0.4 - side-channel: 1.1.0 + side-channel: 1.1.1 into-stream@7.0.0: dependencies: @@ -12351,7 +13373,7 @@ snapshots: ipaddr.js@1.9.1: {} - ipaddr.js@2.4.0: {} + ipaddr.js@2.5.0: {} is-arguments@1.2.0: dependencies: @@ -12408,6 +13430,10 @@ snapshots: is-docker@2.2.1: {} + is-document.all@1.0.0: + dependencies: + call-bound: 1.0.4 + is-extglob@2.1.1: {} is-finalizationregistry@1.1.1: @@ -12497,7 +13523,7 @@ snapshots: is-typed-array@1.1.15: dependencies: - which-typed-array: 1.1.21 + which-typed-array: 1.1.22 is-typedarray@1.0.0: {} @@ -12549,7 +13575,7 @@ snapshots: istanbul-lib-instrument@5.2.1: dependencies: '@babel/core': 7.29.7 - '@babel/parser': 7.29.7 + '@babel/parser': 7.29.8 '@istanbuljs/schema': 0.1.6 istanbul-lib-coverage: 3.2.2 semver: 7.5.2 @@ -12637,7 +13663,7 @@ snapshots: jest-util: 27.5.1 jest-validate: 27.5.1 prompts: 2.4.2 - yargs: 16.2.0 + yargs: 16.2.2 transitivePeerDependencies: - bufferutil - canvas @@ -12913,10 +13939,10 @@ snapshots: jest-snapshot@27.5.1: dependencies: '@babel/core': 7.29.7 - '@babel/generator': 7.29.7 + '@babel/generator': 7.29.8 '@babel/plugin-syntax-typescript': 7.29.7(@babel/core@7.29.7) - '@babel/traverse': 7.29.7 - '@babel/types': 7.29.7 + '@babel/traverse': 7.29.8 + '@babel/types': 7.29.8 '@jest/transform': 27.5.1 '@jest/types': 27.5.1 '@types/babel__traverse': 7.28.0 @@ -13042,7 +14068,7 @@ snapshots: jsdom@16.7.0: dependencies: abab: 2.0.6 - acorn: 8.16.0 + acorn: 8.18.0 acorn-globals: 6.0.0 cssom: 0.4.4 cssstyle: 2.3.0 @@ -13055,7 +14081,7 @@ snapshots: http-proxy-agent: 4.0.1 https-proxy-agent: 5.0.1 is-potential-custom-element-name: 1.0.1 - nwsapi: 2.2.23 + nwsapi: 2.2.24 parse5: 6.0.1 saxes: 5.0.1 symbol-tree: 3.2.4 @@ -13066,7 +14092,7 @@ snapshots: whatwg-encoding: 1.0.5 whatwg-mimetype: 2.3.0 whatwg-url: 8.7.0 - ws: 7.5.11 + ws: 7.5.13 xml-name-validator: 3.0.0 transitivePeerDependencies: - bufferutil @@ -13091,6 +14117,8 @@ snapshots: json-stringify-safe@5.0.1: {} + json-with-bigint@3.5.10: {} + json2mq@0.2.0: dependencies: string-convert: 0.2.1 @@ -13153,26 +14181,28 @@ snapshots: lerp@1.0.3: {} - less-loader@7.3.0(less@4.6.4)(webpack@5.107.2(postcss@8.5.25)): + less-loader@7.3.0(less@4.8.1)(webpack@5.109.2(postcss@8.5.25)): dependencies: klona: 2.0.6 - less: 4.6.4 + less: 4.8.1 loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.107.2(postcss@8.5.25) + webpack: 5.109.2(postcss@8.5.25) - less@4.6.4: + less@4.8.1: dependencies: copy-anything: 3.0.5 parse-node-version: 1.0.1 optionalDependencies: errno: 0.1.8 graceful-fs: 4.2.11 - image-size: 0.5.5 make-dir: 3.1.0 mime: 1.6.0 needle: 3.5.0 + probe-image-size: 7.3.0 source-map: 0.6.1 + transitivePeerDependencies: + - supports-color leven@3.1.0: {} @@ -13196,8 +14226,6 @@ snapshots: pify: 3.0.0 strip-bom: 3.0.0 - loader-runner@4.3.2: {} - loader-utils@2.0.4: dependencies: big.js: 5.2.2 @@ -13248,8 +14276,6 @@ snapshots: lodash.merge@4.6.2: {} - lodash.sortby@4.7.0: {} - lodash.uniq@4.5.0: {} lodash.uniqby@4.7.0: {} @@ -13377,11 +14403,11 @@ snapshots: min-indent@1.0.1: {} - mini-css-extract-plugin@2.10.2(webpack@5.107.2(postcss@8.5.25)): + mini-css-extract-plugin@2.10.2(webpack@5.109.2(postcss@8.5.25)): dependencies: schema-utils: 4.3.3 tapable: 2.3.3 - webpack: 5.107.2(postcss@8.5.25) + webpack: 5.109.2(postcss@8.5.25) minimalistic-assert@1.0.1: {} @@ -13401,6 +14427,18 @@ snapshots: minimist@1.2.8: {} + minimizer-webpack-plugin@5.6.1(postcss@8.5.25)(webpack@5.109.2(postcss@8.5.25)): + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + jest-worker: 27.5.1 + schema-utils: 4.3.3 + terser: 5.49.2 + webpack: 5.109.2(postcss@8.5.25) + optionalDependencies: + postcss: 8.5.25 + + mjolnir.js@3.0.1: {} + modify-values@1.0.1: {} moment@2.30.1: {} @@ -13420,7 +14458,7 @@ snapshots: object-assign: 4.1.1 thenify-all: 1.6.0 - nanoid@3.3.16: {} + nanoid@3.3.17: {} natural-compare-lite@1.4.0: {} @@ -13431,10 +14469,19 @@ snapshots: iota-array: 1.0.0 is-buffer: 1.1.6 + needle@2.9.1: + dependencies: + debug: 3.2.7 + iconv-lite: 0.4.24 + sax: 1.6.1 + transitivePeerDependencies: + - supports-color + optional: true + needle@3.5.0: dependencies: iconv-lite: 0.6.3 - sax: 1.6.0 + sax: 1.6.1 optional: true negotiator@0.6.3: {} @@ -13454,7 +14501,7 @@ snapshots: dependencies: lodash: 4.18.1 - node-exports-info@1.6.0: + node-exports-info@1.6.2: dependencies: array.prototype.flatmap: 1.3.3 es-errors: 1.3.0 @@ -13465,7 +14512,7 @@ snapshots: node-int64@0.4.0: {} - node-releases@2.0.47: {} + node-releases@2.0.52: {} normalize-package-data@2.5.0: dependencies: @@ -13506,7 +14553,7 @@ snapshots: path-key: 4.0.0 unicorn-magic: 0.3.0 - npm@10.9.8: {} + npm@10.9.9: {} npm@9.9.4: {} @@ -13518,7 +14565,7 @@ snapshots: dependencies: fflate: 0.8.3 - nwsapi@2.2.23: {} + nwsapi@2.2.24: {} object-assign@4.1.1: {} @@ -13575,18 +14622,18 @@ snapshots: dependencies: acorn: 7.4.1 base64-js: 1.5.1 - core-js: 3.49.0 + core-js: 3.50.0 crypto-js: 4.2.0 serialize-javascript: 7.0.5 - ol@10.9.0: + ol@10.10.0: dependencies: '@types/rbush': 4.0.0 - earcut: 3.0.2 - geotiff: 3.0.5 - pbf: 4.0.1 + earcut: 3.2.3 + geotiff: 3.1.0-beta.0 + pbf: 5.1.2 rbush: 4.0.1 - zarrita: 0.7.3 + zarrita: 0.7.4 on-finished@2.4.1: dependencies: @@ -13621,8 +14668,9 @@ snapshots: type-check: 0.4.0 word-wrap: 1.2.5 - own-keys@1.0.1: + own-keys@1.0.2: dependencies: + call-bound: 1.0.4 get-intrinsic: 1.3.0 object-keys: 1.1.1 safe-push-apply: 1.0.0 @@ -13631,7 +14679,7 @@ snapshots: p-filter@4.1.0: dependencies: - p-map: 7.0.4 + p-map: 7.0.6 p-is-promise@3.0.0: {} @@ -13671,7 +14719,7 @@ snapshots: dependencies: p-limit: 4.0.0 - p-map@7.0.4: {} + p-map@7.0.6: {} p-reduce@2.1.0: {} @@ -13686,7 +14734,7 @@ snapshots: p-try@2.2.0: {} - pako@2.1.0: {} + pako@2.2.0: {} param-case@3.0.4: dependencies: @@ -13758,7 +14806,7 @@ snapshots: path-type@6.0.0: {} - pbf@4.0.1: + pbf@5.1.2: dependencies: resolve-protobuf-schema: 2.1.0 @@ -13768,7 +14816,7 @@ snapshots: picomatch@2.3.2: {} - picomatch@4.0.4: {} + picomatch@4.0.5: {} pify@2.3.0: {} @@ -13795,22 +14843,30 @@ snapshots: dependencies: find-up: 3.0.0 + playwright-core@1.62.1: {} + + playwright@1.62.1: + dependencies: + playwright-core: 1.62.1 + optionalDependencies: + fsevents: 2.3.2 + possible-typed-array-names@1.1.0: {} postcss-attribute-case-insensitive@5.0.2(postcss@8.5.25): dependencies: postcss: 8.5.25 - postcss-selector-parser: 6.1.2 + postcss-selector-parser: 6.1.4 - postcss-browser-comments@4.0.0(browserslist@4.28.2)(postcss@8.5.25): + postcss-browser-comments@4.0.0(browserslist@4.28.7)(postcss@8.5.25): dependencies: - browserslist: 4.28.2 + browserslist: 4.28.7 postcss: 8.5.25 postcss-calc@8.2.4(postcss@8.5.25): dependencies: postcss: 8.5.25 - postcss-selector-parser: 6.1.2 + postcss-selector-parser: 6.1.4 postcss-value-parser: 4.2.0 postcss-clamp@4.1.0(postcss@8.5.25): @@ -13835,7 +14891,7 @@ snapshots: postcss-colormin@5.3.1(postcss@8.5.25): dependencies: - browserslist: 4.28.2 + browserslist: 4.28.7 caniuse-api: 3.0.0 colord: 2.9.3 postcss: 8.5.25 @@ -13843,7 +14899,7 @@ snapshots: postcss-convert-values@5.1.3(postcss@8.5.25): dependencies: - browserslist: 4.28.2 + browserslist: 4.28.7 postcss: 8.5.25 postcss-value-parser: 4.2.0 @@ -13860,12 +14916,12 @@ snapshots: postcss-custom-selectors@6.0.3(postcss@8.5.25): dependencies: postcss: 8.5.25 - postcss-selector-parser: 6.1.2 + postcss-selector-parser: 6.1.4 postcss-dir-pseudo-class@6.0.5(postcss@8.5.25): dependencies: postcss: 8.5.25 - postcss-selector-parser: 6.1.2 + postcss-selector-parser: 6.1.4 postcss-discard-comments@5.1.2(postcss@8.5.25): dependencies: @@ -13901,12 +14957,12 @@ snapshots: postcss-focus-visible@6.0.4(postcss@8.5.25): dependencies: postcss: 8.5.25 - postcss-selector-parser: 6.1.2 + postcss-selector-parser: 6.1.4 postcss-focus-within@5.0.4(postcss@8.5.25): dependencies: postcss: 8.5.25 - postcss-selector-parser: 6.1.2 + postcss-selector-parser: 6.1.4 postcss-font-variant@5.0.0(postcss@8.5.25): dependencies: @@ -13950,13 +15006,13 @@ snapshots: jiti: 1.21.7 postcss: 8.5.25 - postcss-loader@6.2.1(postcss@8.5.25)(webpack@5.107.2(postcss@8.5.25)): + postcss-loader@6.2.1(postcss@8.5.25)(webpack@5.109.2(postcss@8.5.25)): dependencies: cosmiconfig: 7.1.0 klona: 2.0.6 postcss: 8.5.25 semver: 7.5.2 - webpack: 5.107.2(postcss@8.5.25) + webpack: 5.109.2(postcss@8.5.25) postcss-logical@5.0.4(postcss@8.5.25): dependencies: @@ -13974,11 +15030,11 @@ snapshots: postcss-merge-rules@5.1.4(postcss@8.5.25): dependencies: - browserslist: 4.28.2 + browserslist: 4.28.7 caniuse-api: 3.0.0 cssnano-utils: 3.1.0(postcss@8.5.25) postcss: 8.5.25 - postcss-selector-parser: 6.1.2 + postcss-selector-parser: 6.1.4 postcss-minify-font-values@5.1.0(postcss@8.5.25): dependencies: @@ -13994,7 +15050,7 @@ snapshots: postcss-minify-params@5.1.4(postcss@8.5.25): dependencies: - browserslist: 4.28.2 + browserslist: 4.28.7 cssnano-utils: 3.1.0(postcss@8.5.25) postcss: 8.5.25 postcss-value-parser: 4.2.0 @@ -14002,7 +15058,7 @@ snapshots: postcss-minify-selectors@5.2.1(postcss@8.5.25): dependencies: postcss: 8.5.25 - postcss-selector-parser: 6.1.2 + postcss-selector-parser: 6.1.4 postcss-modules-extract-imports@3.1.0(postcss@8.5.25): dependencies: @@ -14012,13 +15068,13 @@ snapshots: dependencies: icss-utils: 5.1.0(postcss@8.5.25) postcss: 8.5.25 - postcss-selector-parser: 7.1.1 + postcss-selector-parser: 7.1.4 postcss-value-parser: 4.2.0 postcss-modules-scope@3.2.1(postcss@8.5.25): dependencies: postcss: 8.5.25 - postcss-selector-parser: 7.1.1 + postcss-selector-parser: 7.1.4 postcss-modules-values@4.0.0(postcss@8.5.25): dependencies: @@ -14028,13 +15084,13 @@ snapshots: postcss-nested@6.2.0(postcss@8.5.25): dependencies: postcss: 8.5.25 - postcss-selector-parser: 6.1.2 + postcss-selector-parser: 6.1.4 postcss-nesting@10.2.0(postcss@8.5.25): dependencies: - '@csstools/selector-specificity': 2.2.0(postcss-selector-parser@6.1.2) + '@csstools/selector-specificity': 2.2.0(postcss-selector-parser@6.1.4) postcss: 8.5.25 - postcss-selector-parser: 6.1.2 + postcss-selector-parser: 6.1.4 postcss-normalize-charset@5.1.0(postcss@8.5.25): dependencies: @@ -14067,7 +15123,7 @@ snapshots: postcss-normalize-unicode@5.1.1(postcss@8.5.25): dependencies: - browserslist: 4.28.2 + browserslist: 4.28.7 postcss: 8.5.25 postcss-value-parser: 4.2.0 @@ -14082,12 +15138,12 @@ snapshots: postcss: 8.5.25 postcss-value-parser: 4.2.0 - postcss-normalize@10.0.1(browserslist@4.28.2)(postcss@8.5.25): + postcss-normalize@10.0.1(browserslist@4.28.7)(postcss@8.5.25): dependencies: '@csstools/normalize.css': 12.1.1 - browserslist: 4.28.2 + browserslist: 4.28.7 postcss: 8.5.25 - postcss-browser-comments: 4.0.0(browserslist@4.28.2)(postcss@8.5.25) + postcss-browser-comments: 4.0.0(browserslist@4.28.7)(postcss@8.5.25) sanitize.css: 13.0.0 postcss-opacity-percentage@1.1.3(postcss@8.5.25): @@ -14130,8 +15186,8 @@ snapshots: '@csstools/postcss-text-decoration-shorthand': 1.0.0(postcss@8.5.25) '@csstools/postcss-trigonometric-functions': 1.0.2(postcss@8.5.25) '@csstools/postcss-unset-value': 1.0.2(postcss@8.5.25) - autoprefixer: 10.5.0(postcss@8.5.25) - browserslist: 4.28.2 + autoprefixer: 10.5.4(postcss@8.5.25) + browserslist: 4.28.7 css-blank-pseudo: 3.0.3(postcss@8.5.25) css-has-pseudo: 3.0.4(postcss@8.5.25) css-prefers-color-scheme: 6.0.3(postcss@8.5.25) @@ -14170,11 +15226,11 @@ snapshots: postcss-pseudo-class-any-link@7.1.6(postcss@8.5.25): dependencies: postcss: 8.5.25 - postcss-selector-parser: 6.1.2 + postcss-selector-parser: 6.1.4 postcss-reduce-initial@5.1.2(postcss@8.5.25): dependencies: - browserslist: 4.28.2 + browserslist: 4.28.7 caniuse-api: 3.0.0 postcss: 8.5.25 @@ -14190,14 +15246,14 @@ snapshots: postcss-selector-not@6.0.1(postcss@8.5.25): dependencies: postcss: 8.5.25 - postcss-selector-parser: 6.1.2 + postcss-selector-parser: 6.1.4 - postcss-selector-parser@6.1.2: + postcss-selector-parser@6.1.4: dependencies: cssesc: 3.0.0 util-deprecate: 1.0.2 - postcss-selector-parser@7.1.1: + postcss-selector-parser@7.1.4: dependencies: cssesc: 3.0.0 util-deprecate: 1.0.2 @@ -14211,13 +15267,13 @@ snapshots: postcss-unique-selectors@5.1.1(postcss@8.5.25): dependencies: postcss: 8.5.25 - postcss-selector-parser: 6.1.2 + postcss-selector-parser: 6.1.4 postcss-value-parser@4.2.0: {} postcss@8.5.25: dependencies: - nanoid: 3.3.16 + nanoid: 3.3.17 picocolors: 1.1.1 source-map-js: 1.2.1 @@ -14247,6 +15303,15 @@ snapshots: dependencies: parse-ms: 4.0.0 + probe-image-size@7.3.0: + dependencies: + lodash.merge: 4.6.2 + needle: 2.9.1 + stream-parser: 0.3.1 + transitivePeerDependencies: + - supports-color + optional: true + process-nextick-args@2.0.1: {} promise@8.3.0: @@ -14264,7 +15329,7 @@ snapshots: object-assign: 4.1.1 react-is: 16.13.1 - properties-file@4.0.0: {} + properties-file@5.0.5: {} proto-list@1.2.4: {} @@ -14288,7 +15353,7 @@ snapshots: qs@6.13.0: dependencies: - side-channel: 1.1.0 + side-channel: 1.1.1 querystringify@2.2.0: {} @@ -14306,6 +15371,8 @@ snapshots: range-parser@1.2.1: {} + range-parser@1.3.0: {} + raw-body@2.5.2: dependencies: bytes: 3.1.2 @@ -14662,25 +15729,25 @@ snapshots: react-app-polyfill@3.0.0: dependencies: - core-js: 3.49.0 + core-js: 3.50.0 object-assign: 4.1.1 promise: 8.3.0 raf: 3.4.1 regenerator-runtime: 0.13.11 whatwg-fetch: 3.6.20 - react-dev-utils@12.0.1(eslint@8.57.1)(typescript@4.9.5)(webpack@5.107.2(postcss@8.5.25)): + react-dev-utils@12.0.1(eslint@8.57.1)(typescript@4.9.5)(webpack@5.109.2(postcss@8.5.25)): dependencies: '@babel/code-frame': 7.29.7 address: 1.2.2 - browserslist: 4.28.2 + browserslist: 4.28.7 chalk: 4.1.2 cross-spawn: 7.0.6 detect-port-alt: 1.1.6 escape-string-regexp: 4.0.0 filesize: 8.0.7 find-up: 5.0.0 - fork-ts-checker-webpack-plugin: 6.5.3(eslint@8.57.1)(typescript@4.9.5)(webpack@5.107.2(postcss@8.5.25)) + fork-ts-checker-webpack-plugin: 6.5.3(eslint@8.57.1)(typescript@4.9.5)(webpack@5.109.2(postcss@8.5.25)) global-modules: 2.0.0 globby: 11.1.0 gzip-size: 6.0.0 @@ -14695,7 +15762,7 @@ snapshots: shell-quote: 1.9.0 strip-ansi: 6.0.1 text-table: 0.2.0 - webpack: 5.107.2(postcss@8.5.25) + webpack: 5.109.2(postcss@8.5.25) optionalDependencies: typescript: 4.9.5 transitivePeerDependencies: @@ -14729,6 +15796,25 @@ snapshots: react-refresh@0.11.0: {} + react-remove-scroll-bar@2.3.8(@types/react@18.3.31)(react@18.3.1): + dependencies: + react: 18.3.1 + react-style-singleton: 2.2.3(@types/react@18.3.31)(react@18.3.1) + tslib: 2.8.1 + optionalDependencies: + '@types/react': 18.3.31 + + react-remove-scroll@2.7.2(@types/react@18.3.31)(react@18.3.1): + dependencies: + react: 18.3.1 + react-remove-scroll-bar: 2.3.8(@types/react@18.3.31)(react@18.3.1) + react-style-singleton: 2.2.3(@types/react@18.3.31)(react@18.3.1) + tslib: 2.8.1 + use-callback-ref: 1.3.3(@types/react@18.3.31)(react@18.3.1) + use-sidecar: 1.1.3(@types/react@18.3.31)(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.31 + react-router-dom@6.30.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@remix-run/router': 1.23.3 @@ -14744,53 +15830,53 @@ snapshots: react-scripts@5.0.0(@babel/plugin-syntax-flow@7.29.7(@babel/core@7.29.7))(@babel/plugin-transform-react-jsx@7.29.7(@babel/core@7.29.7))(@types/babel__core@7.20.5)(eslint@8.57.1)(react@18.3.1)(ts-node@10.9.2(@types/node@14.18.63)(typescript@4.9.5))(type-fest@4.41.0)(typescript@4.9.5): dependencies: '@babel/core': 7.29.7 - '@pmmmwh/react-refresh-webpack-plugin': 0.5.17(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@4.15.2(webpack@5.107.2(postcss@8.5.25)))(webpack@5.107.2(postcss@8.5.25)) + '@pmmmwh/react-refresh-webpack-plugin': 0.5.17(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@4.15.2(webpack@5.109.2(postcss@8.5.25)))(webpack@5.109.2(postcss@8.5.25)) '@svgr/webpack': 5.5.0 babel-jest: 27.5.1(@babel/core@7.29.7) - babel-loader: 8.4.1(@babel/core@7.29.7)(webpack@5.107.2(postcss@8.5.25)) + babel-loader: 8.4.1(@babel/core@7.29.7)(webpack@5.109.2(postcss@8.5.25)) babel-plugin-named-asset-import: 0.3.8(@babel/core@7.29.7) babel-preset-react-app: 10.1.0 bfj: 7.1.0 - browserslist: 4.28.2 + browserslist: 4.28.7 camelcase: 6.3.0 case-sensitive-paths-webpack-plugin: 2.4.0 - css-loader: 6.11.0(webpack@5.107.2(postcss@8.5.25)) - css-minimizer-webpack-plugin: 3.4.1(webpack@5.107.2(postcss@8.5.25)) + css-loader: 6.11.0(webpack@5.109.2(postcss@8.5.25)) + css-minimizer-webpack-plugin: 3.4.1(webpack@5.109.2(postcss@8.5.25)) dotenv: 10.0.0 dotenv-expand: 5.1.0 eslint: 8.57.1 eslint-config-react-app: 7.0.1(@babel/plugin-syntax-flow@7.29.7(@babel/core@7.29.7))(@babel/plugin-transform-react-jsx@7.29.7(@babel/core@7.29.7))(eslint@8.57.1)(jest@27.5.1(ts-node@10.9.2(@types/node@14.18.63)(typescript@4.9.5)))(typescript@4.9.5) - eslint-webpack-plugin: 3.2.0(eslint@8.57.1)(webpack@5.107.2(postcss@8.5.25)) - file-loader: 6.2.0(webpack@5.107.2(postcss@8.5.25)) + eslint-webpack-plugin: 3.2.0(eslint@8.57.1)(webpack@5.109.2(postcss@8.5.25)) + file-loader: 6.2.0(webpack@5.109.2(postcss@8.5.25)) fs-extra: 10.1.0 - html-webpack-plugin: 5.6.7(webpack@5.107.2(postcss@8.5.25)) + html-webpack-plugin: 5.6.8(webpack@5.109.2(postcss@8.5.25)) identity-obj-proxy: 3.0.0 jest: 27.5.1(ts-node@10.9.2(@types/node@14.18.63)(typescript@4.9.5)) jest-resolve: 27.5.1 jest-watch-typeahead: 1.1.0(jest@27.5.1(ts-node@10.9.2(@types/node@14.18.63)(typescript@4.9.5))) - mini-css-extract-plugin: 2.10.2(webpack@5.107.2(postcss@8.5.25)) + mini-css-extract-plugin: 2.10.2(webpack@5.109.2(postcss@8.5.25)) postcss: 8.5.25 postcss-flexbugs-fixes: 5.0.2(postcss@8.5.25) - postcss-loader: 6.2.1(postcss@8.5.25)(webpack@5.107.2(postcss@8.5.25)) - postcss-normalize: 10.0.1(browserslist@4.28.2)(postcss@8.5.25) + postcss-loader: 6.2.1(postcss@8.5.25)(webpack@5.109.2(postcss@8.5.25)) + postcss-normalize: 10.0.1(browserslist@4.28.7)(postcss@8.5.25) postcss-preset-env: 7.8.3(postcss@8.5.25) prompts: 2.4.2 react: 18.3.1 react-app-polyfill: 3.0.0 - react-dev-utils: 12.0.1(eslint@8.57.1)(typescript@4.9.5)(webpack@5.107.2(postcss@8.5.25)) + react-dev-utils: 12.0.1(eslint@8.57.1)(typescript@4.9.5)(webpack@5.109.2(postcss@8.5.25)) react-refresh: 0.11.0 resolve: 1.22.12 resolve-url-loader: 4.0.0 - sass-loader: 12.6.0(webpack@5.107.2(postcss@8.5.25)) + sass-loader: 12.6.0(webpack@5.109.2(postcss@8.5.25)) semver: 7.5.2 - source-map-loader: 3.0.2(webpack@5.107.2(postcss@8.5.25)) - style-loader: 3.3.4(webpack@5.107.2(postcss@8.5.25)) + source-map-loader: 3.0.2(webpack@5.109.2(postcss@8.5.25)) + style-loader: 3.3.4(webpack@5.109.2(postcss@8.5.25)) tailwindcss: 3.4.19 - terser-webpack-plugin: 5.6.1(postcss@8.5.25)(webpack@5.107.2(postcss@8.5.25)) - webpack: 5.107.2(postcss@8.5.25) - webpack-dev-server: 4.15.2(webpack@5.107.2(postcss@8.5.25)) - webpack-manifest-plugin: 4.1.1(webpack@5.107.2(postcss@8.5.25)) - workbox-webpack-plugin: 6.6.0(@types/babel__core@7.20.5)(webpack@5.107.2(postcss@8.5.25)) + terser-webpack-plugin: 5.6.1(postcss@8.5.25)(webpack@5.109.2(postcss@8.5.25)) + webpack: 5.109.2(postcss@8.5.25) + webpack-dev-server: 4.15.2(webpack@5.109.2(postcss@8.5.25)) + webpack-manifest-plugin: 4.1.1(webpack@5.109.2(postcss@8.5.25)) + workbox-webpack-plugin: 6.6.0(@types/babel__core@7.20.5)(webpack@5.109.2(postcss@8.5.25)) optionalDependencies: fsevents: 2.3.3 typescript: 4.9.5 @@ -14842,6 +15928,14 @@ snapshots: react: 18.3.1 react-is: 18.3.1 + react-style-singleton@2.2.3(@types/react@18.3.31)(react@18.3.1): + dependencies: + get-nonce: 1.0.1 + react: 18.3.1 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 18.3.31 + react-test-renderer@18.3.1(react@18.3.1): dependencies: react: 18.3.1 @@ -14967,17 +16061,17 @@ snapshots: regenerate: 1.4.2 regenerate-unicode-properties: 10.2.2 regjsgen: 0.8.0 - regjsparser: 0.13.1 + regjsparser: 0.13.2 unicode-match-property-ecmascript: 2.0.0 unicode-match-property-value-ecmascript: 2.2.1 registry-auth-token@5.1.1: dependencies: - '@pnpm/npm-conf': 3.0.2 + '@pnpm/npm-conf': 3.0.3 regjsgen@0.8.0: {} - regjsparser@0.13.1: + regjsparser@0.13.2: dependencies: jsesc: 3.1.0 @@ -15032,7 +16126,7 @@ snapshots: dependencies: es-errors: 1.3.0 is-core-module: 2.16.2 - node-exports-info: 1.6.0 + node-exports-info: 1.6.2 object-keys: 1.1.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 @@ -15051,7 +16145,7 @@ snapshots: jest-worker: 26.6.2 rollup: 3.30.0 serialize-javascript: 7.0.5 - terser: 5.48.0 + terser: 5.49.2 rollup@3.30.0: optionalDependencies: @@ -15088,13 +16182,13 @@ snapshots: sanitize.css@13.0.0: {} - sass-loader@12.6.0(webpack@5.107.2(postcss@8.5.25)): + sass-loader@12.6.0(webpack@5.109.2(postcss@8.5.25)): dependencies: klona: 2.0.6 neo-async: 2.6.2 - webpack: 5.107.2(postcss@8.5.25) + webpack: 5.109.2(postcss@8.5.25) - sax@1.6.0: {} + sax@1.6.1: {} saxes@5.0.1: dependencies: @@ -15171,7 +16265,7 @@ snapshots: semver: 7.5.2 semver-diff: 4.0.0 signale: 1.4.0 - yargs: 17.7.2 + yargs: 17.7.3 transitivePeerDependencies: - supports-color - typescript @@ -15281,7 +16375,7 @@ snapshots: object-inspect: 1.13.4 side-channel-map: 1.0.1 - side-channel@1.1.0: + side-channel@1.1.1: dependencies: es-errors: 1.3.0 object-inspect: 1.13.4 @@ -15315,18 +16409,18 @@ snapshots: uuid: 8.3.2 websocket-driver: 0.7.5 - sonarqube-scanner@4.3.6: + sonarqube-scanner@4.4.0: dependencies: adm-zip: 0.6.0 axios: 1.18.0 commander: 14.0.3 hpagent: 1.2.0 node-forge: 1.4.0 - properties-file: 4.0.0 + properties-file: 5.0.5 proxy-from-env: 2.1.0 semver: 7.5.2 slugify: 1.6.9 - tar-stream: 3.1.8 + tar-stream: 3.2.0 transitivePeerDependencies: - bare-abort-controller - bare-buffer @@ -15338,12 +16432,12 @@ snapshots: source-map-js@1.2.1: {} - source-map-loader@3.0.2(webpack@5.107.2(postcss@8.5.25)): + source-map-loader@3.0.2(webpack@5.109.2(postcss@8.5.25)): dependencies: abab: 2.0.6 iconv-lite: 0.6.3 source-map-js: 1.2.1 - webpack: 5.107.2(postcss@8.5.25) + webpack: 5.109.2(postcss@8.5.25) source-map-support@0.5.21: dependencies: @@ -15354,9 +16448,7 @@ snapshots: source-map@0.7.6: {} - source-map@0.8.0-beta.0: - dependencies: - whatwg-url: 7.1.0 + source-map@0.8.0: {} sourcemap-codec@1.4.8: {} @@ -15435,7 +16527,14 @@ snapshots: duplexer2: 0.1.4 readable-stream: 2.3.8 - streamx@2.26.0: + stream-parser@0.3.1: + dependencies: + debug: 2.6.9 + transitivePeerDependencies: + - supports-color + optional: true + + streamx@2.28.0: dependencies: events-universal: 1.0.1 fast-fifo: 1.3.2 @@ -15484,14 +16583,14 @@ snapshots: internal-slot: 1.1.0 regexp.prototype.flags: 1.5.4 set-function-name: 2.0.2 - side-channel: 1.1.0 + side-channel: 1.1.1 string.prototype.repeat@1.0.0: dependencies: define-properties: 1.2.1 es-abstract: 1.24.2 - string.prototype.trim@1.2.10: + string.prototype.trim@1.2.11: dependencies: call-bind: 1.0.9 call-bound: 1.0.4 @@ -15500,8 +16599,9 @@ snapshots: es-abstract: 1.24.2 es-object-atoms: 1.1.2 has-property-descriptors: 1.0.2 + safe-regex-test: 1.1.0 - string.prototype.trimend@1.0.9: + string.prototype.trimend@1.0.10: dependencies: call-bind: 1.0.9 call-bound: 1.0.4 @@ -15560,15 +16660,15 @@ snapshots: dependencies: escape-string-regexp: 1.0.5 - style-loader@3.3.4(webpack@5.107.2(postcss@8.5.25)): + style-loader@3.3.4(webpack@5.109.2(postcss@8.5.25)): dependencies: - webpack: 5.107.2(postcss@8.5.25) + webpack: 5.109.2(postcss@8.5.25) stylehacks@5.1.1(postcss@8.5.25): dependencies: - browserslist: 4.28.2 + browserslist: 4.28.7 postcss: 8.5.25 - postcss-selector-parser: 6.1.2 + postcss-selector-parser: 6.1.4 sucrase@3.35.1: dependencies: @@ -15608,11 +16708,13 @@ snapshots: css-tree: 1.1.3 csso: 4.2.0 picocolors: 1.1.1 - sax: 1.6.0 + sax: 1.6.1 stable: 0.1.8 symbol-tree@3.2.4: {} + tailwind-merge@3.6.0: {} + tailwindcss@3.4.19: dependencies: '@alloc/quick-lru': 5.2.0 @@ -15634,7 +16736,7 @@ snapshots: postcss-js: 4.1.0(postcss@8.5.25) postcss-load-config: 6.0.1(jiti@1.21.7)(postcss@8.5.25) postcss-nested: 6.2.0(postcss@8.5.25) - postcss-selector-parser: 6.1.2 + postcss-selector-parser: 6.1.4 resolve: 1.22.12 sucrase: 3.35.1 transitivePeerDependencies: @@ -15645,12 +16747,12 @@ snapshots: tapable@2.3.3: {} - tar-stream@3.1.8: + tar-stream@3.2.0: dependencies: b4a: 1.8.1 - bare-fs: 4.7.2 + bare-fs: 4.8.0 fast-fifo: 1.3.2 - streamx: 2.26.0 + streamx: 2.28.0 transitivePeerDependencies: - bare-abort-controller - bare-buffer @@ -15658,7 +16760,7 @@ snapshots: teex@1.0.1: dependencies: - streamx: 2.26.0 + streamx: 2.28.0 transitivePeerDependencies: - bare-abort-controller - react-native-b4a @@ -15686,20 +16788,20 @@ snapshots: ansi-escapes: 4.3.2 supports-hyperlinks: 2.3.0 - terser-webpack-plugin@5.6.1(postcss@8.5.25)(webpack@5.107.2(postcss@8.5.25)): + terser-webpack-plugin@5.6.1(postcss@8.5.25)(webpack@5.109.2(postcss@8.5.25)): dependencies: '@jridgewell/trace-mapping': 0.3.31 jest-worker: 27.5.1 schema-utils: 4.3.3 - terser: 5.48.0 - webpack: 5.107.2(postcss@8.5.25) + terser: 5.49.2 + webpack: 5.109.2(postcss@8.5.25) optionalDependencies: postcss: 8.5.25 - terser@5.48.0: + terser@5.49.2: dependencies: '@jridgewell/source-map': 0.3.11 - acorn: 8.16.0 + acorn: 8.18.0 commander: 2.20.3 source-map-support: 0.5.21 @@ -15744,8 +16846,8 @@ snapshots: tinyglobby@0.2.17: dependencies: - fdir: 6.5.0(picomatch@4.0.4) - picomatch: 4.0.4 + fdir: 6.5.0(picomatch@4.0.5) + picomatch: 4.0.5 tmpl@1.0.5: {} @@ -15764,10 +16866,6 @@ snapshots: universalify: 0.2.0 url-parse: 1.5.10 - tr46@1.0.1: - dependencies: - punycode: 2.3.1 - tr46@2.1.0: dependencies: punycode: 2.3.1 @@ -15792,7 +16890,7 @@ snapshots: '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 '@types/node': 14.18.63 - acorn: 8.16.0 + acorn: 8.18.0 acorn-walk: 8.3.5 arg: 4.1.3 create-require: 1.1.1 @@ -15902,6 +17000,8 @@ snapshots: underscore@1.13.8: {} + undici-types@7.24.6: {} + unicode-canonical-property-names-ecmascript@2.0.1: {} unicode-match-property-ecmascript@2.0.0: @@ -15941,9 +17041,9 @@ snapshots: upath@1.2.0: {} - update-browserslist-db@1.2.3(browserslist@4.28.2): + update-browserslist-db@1.2.3(browserslist@4.28.7): dependencies: - browserslist: 4.28.2 + browserslist: 4.28.7 escalade: 3.2.0 picocolors: 1.1.1 @@ -15958,6 +17058,21 @@ snapshots: querystringify: 2.2.0 requires-port: 1.0.0 + use-callback-ref@1.3.3(@types/react@18.3.31)(react@18.3.1): + dependencies: + react: 18.3.1 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 18.3.31 + + use-sidecar@1.1.3(@types/react@18.3.31)(react@18.3.1): + dependencies: + detect-node-es: 1.1.0 + react: 18.3.1 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 18.3.31 + util-deprecate@1.0.2: {} utila@0.4.0: {} @@ -15995,9 +17110,8 @@ snapshots: dependencies: makeerror: 1.0.12 - watchpack@2.5.1: + watchpack@2.5.2: dependencies: - glob-to-regexp: 0.4.1 graceful-fs: 4.2.11 wbuf@1.7.3: @@ -16006,22 +17120,20 @@ snapshots: web-worker@1.5.0: {} - webidl-conversions@4.0.2: {} - webidl-conversions@5.0.0: {} webidl-conversions@6.1.0: {} - webpack-dev-middleware@5.3.4(webpack@5.107.2(postcss@8.5.25)): + webpack-dev-middleware@5.3.4(webpack@5.109.2(postcss@8.5.25)): dependencies: colorette: 2.0.20 memfs: 3.5.3 mime-types: 2.1.35 - range-parser: 1.2.1 + range-parser: 1.3.0 schema-utils: 4.3.3 - webpack: 5.107.2(postcss@8.5.25) + webpack: 5.109.2(postcss@8.5.25) - webpack-dev-server@4.15.2(webpack@5.107.2(postcss@8.5.25)): + webpack-dev-server@4.15.2(webpack@5.109.2(postcss@8.5.25)): dependencies: '@types/bonjour': 3.5.13 '@types/connect-history-api-fallback': 1.5.4 @@ -16031,7 +17143,7 @@ snapshots: '@types/sockjs': 0.3.36 '@types/ws': 8.18.1 ansi-html-community: 0.0.8 - bonjour-service: 1.4.0 + bonjour-service: 1.4.4 chokidar: 3.6.0 colorette: 2.0.20 compression: 1.8.1 @@ -16040,8 +17152,8 @@ snapshots: express: 4.21.0 graceful-fs: 4.2.11 html-entities: 2.6.0 - http-proxy-middleware: 2.0.9(@types/express@4.17.25) - ipaddr.js: 2.4.0 + http-proxy-middleware: 2.0.10(@types/express@4.17.25) + ipaddr.js: 2.5.0 launch-editor: 2.14.1 open: 8.4.2 p-retry: 4.6.2 @@ -16051,20 +17163,20 @@ snapshots: serve-index: 1.9.2 sockjs: 0.3.24 spdy: 4.0.2 - webpack-dev-middleware: 5.3.4(webpack@5.107.2(postcss@8.5.25)) - ws: 8.21.0 + webpack-dev-middleware: 5.3.4(webpack@5.109.2(postcss@8.5.25)) + ws: 8.21.2 optionalDependencies: - webpack: 5.107.2(postcss@8.5.25) + webpack: 5.109.2(postcss@8.5.25) transitivePeerDependencies: - bufferutil - debug - supports-color - utf-8-validate - webpack-manifest-plugin@4.1.1(webpack@5.107.2(postcss@8.5.25)): + webpack-manifest-plugin@4.1.1(webpack@5.109.2(postcss@8.5.25)): dependencies: tapable: 2.3.3 - webpack: 5.107.2(postcss@8.5.25) + webpack: 5.109.2(postcss@8.5.25) webpack-sources: 2.3.1 webpack-merge@4.2.2: @@ -16081,33 +17193,30 @@ snapshots: source-list-map: 2.0.1 source-map: 0.6.1 - webpack-sources@3.5.0: {} + webpack-sources@3.5.1: {} - webpack@5.107.2(postcss@8.5.25): + webpack@5.109.2(postcss@8.5.25): dependencies: '@types/estree': 1.0.9 '@types/json-schema': 7.0.15 '@webassemblyjs/ast': 1.14.1 '@webassemblyjs/wasm-edit': 1.14.1 '@webassemblyjs/wasm-parser': 1.14.1 - acorn: 8.16.0 - acorn-import-phases: 1.0.4(acorn@8.16.0) - browserslist: 4.28.2 + acorn: 8.18.0 + browserslist: 4.28.7 chrome-trace-event: 1.0.4 - enhanced-resolve: 5.22.2 - es-module-lexer: 2.1.0 + enhanced-resolve: 5.24.5 + es-module-lexer: 2.3.1 eslint-scope: 5.1.1 events: 3.3.0 - glob-to-regexp: 0.4.1 graceful-fs: 4.2.11 - loader-runner: 4.3.2 mime-db: 1.54.0 + minimizer-webpack-plugin: 5.6.1(postcss@8.5.25)(webpack@5.109.2(postcss@8.5.25)) neo-async: 2.6.2 schema-utils: 4.3.3 tapable: 2.3.3 - terser-webpack-plugin: 5.6.1(postcss@8.5.25)(webpack@5.107.2(postcss@8.5.25)) - watchpack: 2.5.1 - webpack-sources: 3.5.0 + watchpack: 2.5.2 + webpack-sources: 3.5.1 transitivePeerDependencies: - '@minify-html/node' - '@swc/core' @@ -16130,6 +17239,8 @@ snapshots: websocket-extensions@0.1.4: {} + wgsl_reflect@1.5.0: {} + whatwg-encoding@1.0.5: dependencies: iconv-lite: 0.4.24 @@ -16138,12 +17249,6 @@ snapshots: whatwg-mimetype@2.3.0: {} - whatwg-url@7.1.0: - dependencies: - lodash.sortby: 4.7.0 - tr46: 1.0.1 - webidl-conversions: 4.0.2 - whatwg-url@8.7.0: dependencies: lodash: 4.18.1 @@ -16161,7 +17266,7 @@ snapshots: which-builtin-type@1.2.1: dependencies: call-bound: 1.0.4 - function.prototype.name: 1.1.8 + function.prototype.name: 1.2.0 has-tostringtag: 1.0.2 is-async-function: 2.1.1 is-date-object: 1.1.0 @@ -16172,7 +17277,7 @@ snapshots: isarray: 2.0.5 which-boxed-primitive: 1.1.1 which-collection: 1.0.2 - which-typed-array: 1.1.21 + which-typed-array: 1.1.22 which-collection@1.0.2: dependencies: @@ -16181,7 +17286,7 @@ snapshots: is-weakmap: 2.0.2 is-weakset: 2.0.4 - which-typed-array@1.1.21: + which-typed-array@1.1.22: dependencies: available-typed-arrays: 1.0.7 call-bind: 1.0.9 @@ -16231,7 +17336,7 @@ snapshots: pretty-bytes: 5.6.0 rollup: 3.30.0 rollup-plugin-terser: 7.0.2(rollup@3.30.0) - source-map: 0.8.0-beta.0 + source-map: 0.8.0 stringify-object: 3.3.0 strip-comments: 2.0.1 tempy: 0.6.0 @@ -16311,12 +17416,12 @@ snapshots: workbox-sw@6.6.0: {} - workbox-webpack-plugin@6.6.0(@types/babel__core@7.20.5)(webpack@5.107.2(postcss@8.5.25)): + workbox-webpack-plugin@6.6.0(@types/babel__core@7.20.5)(webpack@5.109.2(postcss@8.5.25)): dependencies: fast-json-stable-stringify: 2.1.0 pretty-bytes: 5.6.0 upath: 1.2.0 - webpack: 5.107.2(postcss@8.5.25) + webpack: 5.109.2(postcss@8.5.25) webpack-sources: 1.4.3 workbox-build: 6.6.0(@types/babel__core@7.20.5) transitivePeerDependencies: @@ -16343,9 +17448,9 @@ snapshots: signal-exit: 3.0.7 typedarray-to-buffer: 3.1.5 - ws@7.5.11: {} + ws@7.5.13: {} - ws@8.21.0: {} + ws@8.21.2: {} xml-name-validator@3.0.0: {} @@ -16367,7 +17472,7 @@ snapshots: yargs-parser@21.1.1: {} - yargs@16.2.0: + yargs@16.2.2: dependencies: cliui: 7.0.4 escalade: 3.2.0 @@ -16377,7 +17482,7 @@ snapshots: y18n: 5.0.8 yargs-parser: 20.2.9 - yargs@17.7.2: + yargs@17.7.3: dependencies: cliui: 8.0.1 escalade: 3.2.0 @@ -16393,9 +17498,9 @@ snapshots: yocto-queue@1.2.2: {} - yoctocolors@2.1.2: {} + yoctocolors@2.2.0: {} - zarrita@0.7.3: + zarrita@0.7.4: dependencies: '@zarrita/storage': 0.2.0 numcodecs: 0.3.2 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 0b235e69..b50567bc 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -4,7 +4,12 @@ strictPeerDependencies: false allowBuilds: core-js: true core-js-pure: true + # Allow the git-hosted dicom-microscopy-viewer to run its prepare script, + # which builds dist/ when installed from a commit tarball. pnpm matches + # git-hosted packages by their exact tarball URL, so this entry must be + # updated whenever the dependency pin in package.json changes. dicom-microscopy-viewer: true + 'dicom-microscopy-viewer@https://codeload.github.com/ImagingDataCommons/dicom-microscopy-viewer/tar.gz/1b39614eae92e92578d14977f66ced60243e51bc': true overrides: '@types/d3-dispatch': 3.0.6 diff --git a/public/config/e2e.js b/public/config/e2e.js new file mode 100644 index 00000000..90028826 --- /dev/null +++ b/public/config/e2e.js @@ -0,0 +1,25 @@ +/** Config for local verification / e2e runs against the public IDC proxy. */ +window.config = { + path: '/', + servers: [ + { + id: 'e2e', + url: 'https://proxy.imaging.datacommons.cancer.gov/current/viewer-only-no-downloads-see-tinyurl-dot-com-slash-3j3d9jyp/dicomWeb', + write: false, + retry: { + retries: 6, + factor: 2, + minTimeout: 1000, + maxTimeout: 30000, + randomize: true, + retryableStatusCodes: [429, 500, 502, 503, 504] + } + } + ], + disableWorklist: false, + disableAnnotationTools: true, + enableServerSelection: false, + mode: 'light', + preload: true, + annotations: [] +} diff --git a/scripts/serve-e2e.mjs b/scripts/serve-e2e.mjs new file mode 100644 index 00000000..75222398 --- /dev/null +++ b/scripts/serve-e2e.mjs @@ -0,0 +1,136 @@ +#!/usr/bin/env node +/** + * Tiny SPA static file server for e2e / visual-regression runs. + * + * Serves the CRA `build/` directory on 127.0.0.1:3977 and falls back to + * index.html for unknown paths (required for deep links like /studies/...). + * + * Kept dependency-free on purpose: the `serve` package currently crashes + * under path-to-regexp v8 (`pathToRegExp.compile is not a function`), and + * pulling in another static-server package just to host a directory is not + * worth the risk of similar peer-dep breakage. + */ +import { createServer } from 'node:http' +import { existsSync } from 'node:fs' +import { open } from 'node:fs/promises' +import { extname, join, relative, resolve } from 'node:path' +import { fileURLToPath } from 'node:url' + +const HOST = process.env.E2E_HOST ?? '127.0.0.1' +const PORT = Number(process.env.E2E_PORT ?? 3977) +const ROOT = resolve( + process.env.E2E_BUILD_DIR ?? + join(fileURLToPath(new URL('.', import.meta.url)), '..', 'build'), +) + +const MIME = { + '.html': 'text/html; charset=utf-8', + '.js': 'application/javascript; charset=utf-8', + '.css': 'text/css; charset=utf-8', + '.json': 'application/json; charset=utf-8', + '.png': 'image/png', + '.jpg': 'image/jpeg', + '.jpeg': 'image/jpeg', + '.gif': 'image/gif', + '.svg': 'image/svg+xml', + '.ico': 'image/x-icon', + '.woff': 'font/woff', + '.woff2': 'font/woff2', + '.map': 'application/json', + '.txt': 'text/plain; charset=utf-8', + '.wasm': 'application/wasm', +} + +/** + * Resolve a request path under ROOT, rejecting anything that escapes it + * (including encoded `..` segments and absolute paths). + */ +function safeJoin(root, urlPath) { + const raw = (urlPath.split('?')[0] ?? '/').replace(/^\/+/, '') + let decoded + try { + decoded = decodeURIComponent(raw) + } catch { + return null + } + if (decoded.includes('\0')) { + return null + } + const candidate = resolve(root, decoded) + const rel = relative(root, candidate) + if (rel.startsWith('..') || rel.includes(`..${'/'}`) || rel.includes('..\\')) { + return null + } + return candidate +} + +/** + * Stream a regular file to the response. Returns true on success, false if the + * path is missing, not a file, or cannot be opened. Uses open()+fstat so we + * never call existsSync/statSync on a user-controlled path (Sonar S6549) and + * so directories are rejected cleanly (createReadStream on a dir can hang). + */ +async function trySendFile(res, filePath) { + let handle + try { + handle = await open(filePath, 'r') + const stats = await handle.stat() + if (!stats.isFile()) { + await handle.close() + handle = undefined + return false + } + const type = + MIME[extname(filePath).toLowerCase()] ?? 'application/octet-stream' + res.writeHead(200, { + 'Content-Type': type, + 'Cache-Control': 'no-store', + }) + // Stream owns the fd (autoClose); clear our handle so we don't double-close. + const stream = handle.createReadStream() + handle = undefined + stream.pipe(res) + return true + } catch { + if (handle != null) { + await handle.close().catch(() => undefined) + } + return false + } +} + +if (!existsSync(ROOT)) { + process.stderr.write(`[serve-e2e] build directory not found: ${ROOT}\n`) + process.stderr.write('Run `pnpm run build:e2e` first.\n') + process.exit(1) +} + +const SPA_INDEX = join(ROOT, 'index.html') + +const server = createServer((req, res) => { + void (async () => { + const urlPath = req.url ?? '/' + const filePath = safeJoin(ROOT, urlPath) + if (filePath == null) { + res.writeHead(400).end('Bad Request') + return + } + + if (await trySendFile(res, filePath)) { + return + } + + // SPA fallback for client-side routes like /studies/... + if (await trySendFile(res, SPA_INDEX)) { + return + } + + res.writeHead(404).end('Not Found') + })() +}) + +server.listen(PORT, HOST, () => { + process.stdout.write( + `[serve-e2e] serving ${ROOT} at http://${HOST}:${PORT}\n`, + ) +}) diff --git a/src/components/AnnotationGroupDisplaySettings.tsx b/src/components/AnnotationGroupDisplaySettings.tsx new file mode 100644 index 00000000..558233fe --- /dev/null +++ b/src/components/AnnotationGroupDisplaySettings.tsx @@ -0,0 +1,255 @@ +import type React from 'react' +import { FiSettings } from 'react-icons/fi' +import { Button } from './ui/button' +import { Input } from './ui/input' +import { Popover, PopoverContent, PopoverTrigger } from './ui/popover' +import { Separator } from './ui/separator' +import { Slider } from './ui/slider' +import { Switch } from './ui/switch' + +export interface MeasurementOption { + key: string + meaning: string + schemeDesignator: string + codeValue: string +} + +interface RowProps { + label: string + value: number + min: number + max: number + step: number + onChange: (value: number) => void +} + +/** Slider + number input pair, label above — one row of the settings form. */ +function SettingRow({ + label, + value, + min, + max, + step, + onChange, +}: RowProps): React.ReactElement { + return ( +
+ {label} +
+ onChange(next)} + /> + { + const next = event.target.valueAsNumber + if (!Number.isNaN(next)) { + onChange(Math.min(max, Math.max(min, next))) + } + }} + /> +
+
+ ) +} + +interface AnnotationGroupDisplaySettingsProps { + color?: number[] + onColorChange: (color: number[]) => void + opacity: number + onOpacityChange: (opacity: number) => void + isClosedGraphicType: boolean + filled: boolean + onFilledChange: (filled: boolean) => void + fillOpacity: number + onFillOpacityChange: (fillOpacity: number) => void + measurementOptions: MeasurementOption[] + selectedMeasurementKey?: string + onMeasurementChange: (option: MeasurementOption | undefined) => void + limitValues?: [number, number] + limitBounds: [number, number] + onLimitValuesChange: (values: [number, number]) => void + disabled?: boolean +} + +const COLOR_LABELS = ['Red', 'Green', 'Blue'] + +/** + * "Display Settings" popover trigger + panel for an annotation group: + * color, opacity, fill, measurement filtering. Built with Radix primitives + * + Tailwind (see components/ui/*) rather than antd — kept as its own + * component so it doesn't touch ColorSlider/OpacitySlider, which are still + * shared by Segments, Optical Paths, and Mappings. + */ +function AnnotationGroupDisplaySettings({ + color, + onColorChange, + opacity, + onOpacityChange, + isClosedGraphicType, + filled, + onFilledChange, + fillOpacity, + onFillOpacityChange, + measurementOptions, + selectedMeasurementKey, + onMeasurementChange, + limitValues, + limitBounds, + onLimitValuesChange, + disabled = false, +}: AnnotationGroupDisplaySettingsProps): React.ReactElement { + const [minBound, maxBound] = limitBounds + + return ( + + + + + +
+ + Display Settings + + + {color != null && color.length === 3 && ( +
+ + {COLOR_LABELS.map((label, index) => ( + { + const nextColor = [...color] + nextColor[index] = next + onColorChange(nextColor) + }} + /> + ))} +
+ )} + +
+ + +
+ + {isClosedGraphicType && ( +
+ +
+ Filled + +
+ {filled && ( + + )} +
+ )} + + {limitValues != null && ( +
+ +
+ { + const next = event.target.valueAsNumber + if (!Number.isNaN(next)) { + onLimitValuesChange([next, limitValues[1]]) + } + }} + /> + + onLimitValuesChange([next[0], next[1]]) + } + /> + { + const next = event.target.valueAsNumber + if (!Number.isNaN(next)) { + onLimitValuesChange([limitValues[0], next]) + } + }} + /> +
+
+ )} + + {measurementOptions.length > 0 && ( +
+ + Measurement + +
+ )} +
+
+
+ ) +} + +export default AnnotationGroupDisplaySettings diff --git a/src/components/AnnotationGroupItem.tsx b/src/components/AnnotationGroupItem.tsx index caec9519..bff0f37e 100644 --- a/src/components/AnnotationGroupItem.tsx +++ b/src/components/AnnotationGroupItem.tsx @@ -1,35 +1,23 @@ -import { SettingOutlined } from '@ant-design/icons' -import type { SelectProps } from 'antd' -import { - Badge, - Button, - Col, - Divider, - InputNumber, - Popover, - Row, - Select, - Slider, - Space, - Switch, -} from 'antd' +import { Badge, Space, Switch } from 'antd' // skipcq: JS-C1003 import * as dcmjs from 'dcmjs' // skipcq: JS-C1003 import type * as dmv from 'dicom-microscopy-viewer' +import throttle from 'lodash/throttle' import React, { useCallback } from 'react' import { FaEye, FaEyeSlash } from 'react-icons/fa' import { rgbToHex } from '../utils/segmentColors' -import ColorSlider from './ColorSlider' +import AnnotationGroupDisplaySettings, { + type MeasurementOption, +} from './AnnotationGroupDisplaySettings' import Description from './Description' -import OpacitySlider from './OpacitySlider' import ValidationWarning from './ValidationWarning' // Helper function components function AnnotationGroupControls({ isVisible, onVisibilityChange, - settings, + displaySettings, color, }: { isVisible: boolean @@ -37,7 +25,7 @@ function AnnotationGroupControls({ checked: boolean, event: React.MouseEvent, ) => void - settings: React.ReactNode + displaySettings: React.ReactNode color: number[] }): React.ReactElement { return ( @@ -49,14 +37,7 @@ function AnnotationGroupControls({ checkedChildren={} unCheckedChildren={} /> - -