From 1de9166d5099e6251f44b9d110f9f1f56609cf67 Mon Sep 17 00:00:00 2001 From: Szymon Szulc Date: Fri, 8 Aug 2025 00:25:37 +0200 Subject: [PATCH 01/64] Histograms --- .../examples/simple/probability/index.html | 55 +++++++++ .../examples/simple/probability/index.ts | 111 ++++++++++++++++++ .../examples/simple/probability/meta.json | 5 + 3 files changed, 171 insertions(+) create mode 100644 apps/typegpu-docs/src/content/examples/simple/probability/index.html create mode 100644 apps/typegpu-docs/src/content/examples/simple/probability/index.ts create mode 100644 apps/typegpu-docs/src/content/examples/simple/probability/meta.json diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/index.html b/apps/typegpu-docs/src/content/examples/simple/probability/index.html new file mode 100644 index 000000000..b615dee90 --- /dev/null +++ b/apps/typegpu-docs/src/content/examples/simple/probability/index.html @@ -0,0 +1,55 @@ + +
+ + diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/index.ts b/apps/typegpu-docs/src/content/examples/simple/probability/index.ts new file mode 100644 index 000000000..c4da46313 --- /dev/null +++ b/apps/typegpu-docs/src/content/examples/simple/probability/index.ts @@ -0,0 +1,111 @@ +const N = 10_000_000; +const values = Array.from({ length: N }, () => { + return Math.random(); +}); + +// 2. Divide [-2, 2] into 50 bins +const binCount = 50; +const min = -2; +const max = 2; +const binWidth = (max - min) / binCount; +const bins = Array(binCount).fill(0); + +for (const val of values) { + let idx = Math.floor((val - min) / binWidth); + if (idx < 0) idx = 0; + if (idx >= binCount) idx = binCount - 1; + bins[idx]++; +} + +const maxBin = Math.max(...bins); + +// 3.1 Draw histogram with raw css +// const container = document.getElementById('bars-container'); + +// for (let i = 0; i < 50; i++) { +// const bar = document.createElement('div'); +// bar.className = 'bar'; +// bar.style.height = '10px'; +// container?.appendChild(bar); +// } + +// const normalized = bins.map((bin) => bin / maxBin); + +// const bars = Array.from(document.querySelectorAll('.bar')) as HTMLDivElement[]; + +// bars.forEach((bar, i) => { +// bar.style.setProperty('--bar-height', `${normalized[i]}`); +// bar.style.setProperty('--highlight-opacity', '1'); +// }); + +// 3.2 Draw histogram with plotly +import Plotly from 'plotly.js-dist-min'; + +// Generate normal distribution data using Box-Muller transform +function generateNormalData( + mean: number, + stdDev: number, + count: number, +): number[] { + const data: number[] = []; + for (let i = 0; i < count; i++) { + const u = 1 - Math.random(); + const v = 1 - Math.random(); + const z = Math.sqrt(-2.0 * Math.log(u)) * Math.cos(2.0 * Math.PI * v); + data.push(z * stdDev + mean); + } + return data; +} + +import tgpu from 'typegpu'; +import * as d from 'typegpu/data'; +import { randf } from '@typegpu/noise'; + +const root = await tgpu.init(); +const b = root.createBuffer(d.arrayOf(d.f32, 1000000)).$usage('storage'); +const bView = b.as('mutable'); + +const f = tgpu['~unstable'].computeFn({ workgroupSize: [1] })(() => { + for (let i = d.i32(0); i < d.i32(1000000); i++) { + bView.$[i] = randf.sample(); + } +}); + +const p = root['~unstable'].withCompute(f).createPipeline(); +p.dispatchWorkgroups(1); +const samples = await b.read(); + +function kde(xs: number[], data: number[], bandwidth: number): number[] { + const norm = 1 / (bandwidth * Math.sqrt(2 * Math.PI)); + return xs.map((x) => + data.reduce( + (sum, xi) => sum + Math.exp(-0.5 * ((x - xi) / bandwidth) ** 2), + 0, + ) * norm / data.length + ); +} + +// const samples = generateNormalData(0, 1, 1000000); + +const trace = { + x: samples, + type: 'histogram' as const, + opacity: 0.5, + nbinsx: 50, + name: 'Bins', +}; + +const xMin = samples.reduce((a, b) => Math.min(a, b), Number.POSITIVE_INFINITY); +const xMax = samples.reduce((a, b) => Math.max(a, b), Number.NEGATIVE_INFINITY); +const xs = Array.from({ length: 100 }, (_, i) => xMin + (xMax - xMin) * i / 99); +const bandwidth = 0.3; +const density = kde(xs, samples, bandwidth); + +const traceKDE = { + x: xs, + y: density, + mode: 'lines' as const, + name: 'KDE', +}; + +Plotly.newPlot('hist', [trace as Partial]); diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/meta.json b/apps/typegpu-docs/src/content/examples/simple/probability/meta.json new file mode 100644 index 000000000..f7fbf8446 --- /dev/null +++ b/apps/typegpu-docs/src/content/examples/simple/probability/meta.json @@ -0,0 +1,5 @@ +{ + "title": "Probability", + "category": "simple", + "tags": ["experimental"] +} From 7462dfa41e5ae5215220cf8841e0e827fdb4a839 Mon Sep 17 00:00:00 2001 From: Szymon Szulc Date: Mon, 11 Aug 2025 16:23:06 +0200 Subject: [PATCH 02/64] Normal, Exp --- .../examples/simple/probability/index.html | 57 +------ .../examples/simple/probability/index.ts | 157 +++++++----------- packages/typegpu-noise/src/index.ts | 6 + packages/typegpu-noise/src/random.ts | 24 ++- pnpm-lock.yaml | 21 ++- 5 files changed, 109 insertions(+), 156 deletions(-) diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/index.html b/apps/typegpu-docs/src/content/examples/simple/probability/index.html index b615dee90..08c3efd70 100644 --- a/apps/typegpu-docs/src/content/examples/simple/probability/index.html +++ b/apps/typegpu-docs/src/content/examples/simple/probability/index.html @@ -1,55 +1,2 @@ - -
- - +
+
diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/index.ts b/apps/typegpu-docs/src/content/examples/simple/probability/index.ts index c4da46313..aa07a8256 100644 --- a/apps/typegpu-docs/src/content/examples/simple/probability/index.ts +++ b/apps/typegpu-docs/src/content/examples/simple/probability/index.ts @@ -1,111 +1,70 @@ -const N = 10_000_000; -const values = Array.from({ length: N }, () => { - return Math.random(); -}); - -// 2. Divide [-2, 2] into 50 bins -const binCount = 50; -const min = -2; -const max = 2; -const binWidth = (max - min) / binCount; -const bins = Array(binCount).fill(0); - -for (const val of values) { - let idx = Math.floor((val - min) / binWidth); - if (idx < 0) idx = 0; - if (idx >= binCount) idx = binCount - 1; - bins[idx]++; -} - -const maxBin = Math.max(...bins); - -// 3.1 Draw histogram with raw css -// const container = document.getElementById('bars-container'); - -// for (let i = 0; i < 50; i++) { -// const bar = document.createElement('div'); -// bar.className = 'bar'; -// bar.style.height = '10px'; -// container?.appendChild(bar); -// } - -// const normalized = bins.map((bin) => bin / maxBin); - -// const bars = Array.from(document.querySelectorAll('.bar')) as HTMLDivElement[]; - -// bars.forEach((bar, i) => { -// bar.style.setProperty('--bar-height', `${normalized[i]}`); -// bar.style.setProperty('--highlight-opacity', '1'); -// }); - -// 3.2 Draw histogram with plotly -import Plotly from 'plotly.js-dist-min'; - -// Generate normal distribution data using Box-Muller transform -function generateNormalData( - mean: number, - stdDev: number, - count: number, -): number[] { - const data: number[] = []; - for (let i = 0; i < count; i++) { - const u = 1 - Math.random(); - const v = 1 - Math.random(); - const z = Math.sqrt(-2.0 * Math.log(u)) * Math.cos(2.0 * Math.PI * v); - data.push(z * stdDev + mean); - } - return data; -} +import * as Plot from '@observablehq/plot'; import tgpu from 'typegpu'; import * as d from 'typegpu/data'; import { randf } from '@typegpu/noise'; +const N = 10000; + const root = await tgpu.init(); -const b = root.createBuffer(d.arrayOf(d.f32, 1000000)).$usage('storage'); +const b = root.createBuffer(d.arrayOf(d.f32, N)).$usage('storage'); const bView = b.as('mutable'); -const f = tgpu['~unstable'].computeFn({ workgroupSize: [1] })(() => { - for (let i = d.i32(0); i < d.i32(1000000); i++) { - bView.$[i] = randf.sample(); +const f1 = tgpu['~unstable'].computeFn({ workgroupSize: [1] })(() => { + for (let i = d.i32(0); i < d.i32(N); i++) { + bView.$[i] = randf.exponential(1); } }); -const p = root['~unstable'].withCompute(f).createPipeline(); -p.dispatchWorkgroups(1); -const samples = await b.read(); - -function kde(xs: number[], data: number[], bandwidth: number): number[] { - const norm = 1 / (bandwidth * Math.sqrt(2 * Math.PI)); - return xs.map((x) => - data.reduce( - (sum, xi) => sum + Math.exp(-0.5 * ((x - xi) / bandwidth) ** 2), - 0, - ) * norm / data.length - ); -} - -// const samples = generateNormalData(0, 1, 1000000); - -const trace = { - x: samples, - type: 'histogram' as const, - opacity: 0.5, - nbinsx: 50, - name: 'Bins', -}; - -const xMin = samples.reduce((a, b) => Math.min(a, b), Number.POSITIVE_INFINITY); -const xMax = samples.reduce((a, b) => Math.max(a, b), Number.NEGATIVE_INFINITY); -const xs = Array.from({ length: 100 }, (_, i) => xMin + (xMax - xMin) * i / 99); -const bandwidth = 0.3; -const density = kde(xs, samples, bandwidth); - -const traceKDE = { - x: xs, - y: density, - mode: 'lines' as const, - name: 'KDE', -}; +const p1 = root['~unstable'].withCompute(f1).createPipeline(); +p1.dispatchWorkgroups(1); +const samples1 = await b.read(); + +const plot1 = Plot.plot({ + title: 'Exp(1): 1 worker samples 10000 values', + y: { grid: true }, + marks: [ + Plot.rectY( + samples1, + Plot.binX( + { y: 'count' }, + { x: (d) => d, fill: 'lightblue' } as Plot.BinXInputs, + ), + ), + Plot.ruleY([0]), + ], +}); +const div1 = document.getElementById('hist1'); +div1?.append(plot1); + +const f2 = tgpu['~unstable'].computeFn({ + in: { gid: d.builtin.globalInvocationId }, + workgroupSize: [1], +})((input) => { + randf.seed2(d.vec2f(input.gid.xy)); + bView.$[input.gid.x * 100 + input.gid.y] = randf.exponential(1.0); +}); -Plotly.newPlot('hist', [trace as Partial]); +const p2 = root['~unstable'].withCompute(f2).createPipeline(); +p2.dispatchWorkgroups(100, 100); +const samples2 = await b.read(); + +console.log(samples1); +console.log(samples2); + +const plot2 = Plot.plot({ + title: 'Exp(1): 10000 workers, each sample 1 value with seed2(xy)', + y: { grid: true }, + marks: [ + Plot.rectY( + samples2, + Plot.binX( + { y: 'count' }, + { x: (d) => d, fill: 'lightblue' } as Plot.BinXInputs, + ), + ), + Plot.ruleY([0]), + ], +}); +const div2 = document.getElementById('hist2'); +div2?.append(plot2); diff --git a/packages/typegpu-noise/src/index.ts b/packages/typegpu-noise/src/index.ts index 101c70bfa..3138432c1 100644 --- a/packages/typegpu-noise/src/index.ts +++ b/packages/typegpu-noise/src/index.ts @@ -1,7 +1,9 @@ import { + randExponential, randFloat01, randInUnitCircle, randInUnitCube, + randNormal, randOnUnitHemisphere, randOnUnitSphere, randSeed, @@ -16,6 +18,8 @@ export const randf: { seed3: typeof randSeed3; seed4: typeof randSeed4; sample: typeof randFloat01; + normal: typeof randNormal; + exponential: typeof randExponential; inUnitCircle: typeof randInUnitCircle; inUnitCube: typeof randInUnitCube; onHemisphere: typeof randOnUnitHemisphere; @@ -26,6 +30,8 @@ export const randf: { seed3: randSeed3, seed4: randSeed4, sample: randFloat01, + normal: randNormal, + exponential: randExponential, inUnitCircle: randInUnitCircle, inUnitCube: randInUnitCube, onHemisphere: randOnUnitHemisphere, diff --git a/packages/typegpu-noise/src/random.ts b/packages/typegpu-noise/src/random.ts index 1564fe730..96f934566 100644 --- a/packages/typegpu-noise/src/random.ts +++ b/packages/typegpu-noise/src/random.ts @@ -1,9 +1,10 @@ import tgpu, { type TgpuFn } from 'typegpu'; import * as d from 'typegpu/data'; -import { cos, dot, mul, sign, sin, sqrt } from 'typegpu/std'; +import { clamp, cos, dot, log, mul, sign, sin, sqrt } from 'typegpu/std'; import { randomGeneratorSlot } from './generator.ts'; const TWO_PI = Math.PI * 2; +const EPS = 1e-6; export const randSeed: TgpuFn<(seed: d.F32) => d.Void> = tgpu .fn([d.f32])((seed) => { @@ -69,3 +70,24 @@ export const randOnUnitHemisphere: TgpuFn<(normal: d.Vec3f) => d.Vec3f> = tgpu return mul(sign(alignment), value); }); + +const randUniformExclusive: TgpuFn<() => d.F32> = tgpu.fn([], d.f32)(() => { + return clamp(randomGeneratorSlot.value.sample(), 0 + EPS, 1 - EPS); +}); + +export const randNormal: TgpuFn<(mu: d.F32, sigma: d.F32) => d.F32> = tgpu.fn( + [d.f32, d.f32], + d.f32, +)((mu, sigma) => { + const theta = TWO_PI * randUniformExclusive(); + const R = sqrt(-2 * log(randUniformExclusive())); + return R * sin(theta) * sigma + mu; +}); + +export const randExponential: TgpuFn<(rate: d.F32) => d.F32> = tgpu.fn( + [d.f32], + d.f32, +)((rate) => { + const u = randUniformExclusive(); + return (-1 / rate) * log(1 - u); +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d44a14dcf..66fd3a2c0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -106,7 +106,7 @@ importers: devDependencies: '@types/bun': specifier: latest - version: 1.2.19(@types/react@19.1.8) + version: 1.2.20(@types/react@19.1.8) apps/infra-benchmarks: devDependencies: @@ -2488,6 +2488,9 @@ packages: '@types/bun@1.2.19': resolution: {integrity: sha512-d9ZCmrH3CJ2uYKXQIUuZ/pUnTqIvLDS0SK7pFmbx8ma+ziH/FRMoAq5bYpRG7y+w1gl+HgyNZbtqgMq4W4e2Lg==} + '@types/bun@1.2.20': + resolution: {integrity: sha512-dX3RGzQ8+KgmMw7CsW4xT5ITBSCrSbfHc36SNT31EOUg/LA9JWq0VDdEXDRSe1InVWpd2yLUM1FUF/kEOyTzYA==} + '@types/chai@5.2.2': resolution: {integrity: sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==} @@ -2871,6 +2874,11 @@ packages: peerDependencies: '@types/react': ^19 + bun-types@1.2.20: + resolution: {integrity: sha512-pxTnQYOrKvdOwyiyd/7sMt9yFOenN004Y6O4lCcCUoKVej48FS5cvTw9geRaEcB9TsDZaJKAxPTVvi8tFsVuXA==} + peerDependencies: + '@types/react': ^19 + bundle-require@5.1.0: resolution: {integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -7837,6 +7845,12 @@ snapshots: transitivePeerDependencies: - '@types/react' + '@types/bun@1.2.20(@types/react@19.1.8)': + dependencies: + bun-types: 1.2.20(@types/react@19.1.8) + transitivePeerDependencies: + - '@types/react' + '@types/chai@5.2.2': dependencies: '@types/deep-eql': 4.0.2 @@ -8387,6 +8401,11 @@ snapshots: '@types/node': 24.1.0 '@types/react': 19.1.8 + bun-types@1.2.20(@types/react@19.1.8): + dependencies: + '@types/node': 24.1.0 + '@types/react': 19.1.8 + bundle-require@5.1.0(esbuild@0.25.6): dependencies: esbuild: 0.25.6 From 2a6994523c171fc6f37df58ad0bb23e9a37aeacd Mon Sep 17 00:00:00 2001 From: Szymon Szulc Date: Mon, 11 Aug 2025 17:20:41 +0200 Subject: [PATCH 03/64] Work on cauchy --- .../content/examples/simple/probability/index.ts | 15 ++++++++++++--- packages/typegpu-noise/src/index.ts | 3 +++ packages/typegpu-noise/src/random.ts | 10 +++++++++- 3 files changed, 24 insertions(+), 4 deletions(-) diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/index.ts b/apps/typegpu-docs/src/content/examples/simple/probability/index.ts index aa07a8256..2216ba27c 100644 --- a/apps/typegpu-docs/src/content/examples/simple/probability/index.ts +++ b/apps/typegpu-docs/src/content/examples/simple/probability/index.ts @@ -4,7 +4,14 @@ import tgpu from 'typegpu'; import * as d from 'typegpu/data'; import { randf } from '@typegpu/noise'; -const N = 10000; +const N = 1000000; + +const range = Array.from( + { length: Math.round((10 - (-10)) / 0.05) + 1 }, + (_, i) => -10 + i * 0.05, +); + +const bins = [Number.NEGATIVE_INFINITY, ...range, Number.POSITIVE_INFINITY]; const root = await tgpu.init(); const b = root.createBuffer(d.arrayOf(d.f32, N)).$usage('storage'); @@ -12,7 +19,7 @@ const bView = b.as('mutable'); const f1 = tgpu['~unstable'].computeFn({ workgroupSize: [1] })(() => { for (let i = d.i32(0); i < d.i32(N); i++) { - bView.$[i] = randf.exponential(1); + bView.$[i] = randf.normal(0, 1); } }); @@ -22,6 +29,7 @@ const samples1 = await b.read(); const plot1 = Plot.plot({ title: 'Exp(1): 1 worker samples 10000 values', + x: { domain: [-5, 5] }, y: { grid: true }, marks: [ Plot.rectY( @@ -42,7 +50,7 @@ const f2 = tgpu['~unstable'].computeFn({ workgroupSize: [1], })((input) => { randf.seed2(d.vec2f(input.gid.xy)); - bView.$[input.gid.x * 100 + input.gid.y] = randf.exponential(1.0); + bView.$[input.gid.x * 100 + input.gid.y] = randf.cauchy(0, 1); }); const p2 = root['~unstable'].withCompute(f2).createPipeline(); @@ -54,6 +62,7 @@ console.log(samples2); const plot2 = Plot.plot({ title: 'Exp(1): 10000 workers, each sample 1 value with seed2(xy)', + x: { domain: [-100, 100] }, y: { grid: true }, marks: [ Plot.rectY( diff --git a/packages/typegpu-noise/src/index.ts b/packages/typegpu-noise/src/index.ts index 3138432c1..1b717f121 100644 --- a/packages/typegpu-noise/src/index.ts +++ b/packages/typegpu-noise/src/index.ts @@ -1,4 +1,5 @@ import { + randCauchy, randExponential, randFloat01, randInUnitCircle, @@ -20,6 +21,7 @@ export const randf: { sample: typeof randFloat01; normal: typeof randNormal; exponential: typeof randExponential; + cauchy: typeof randCauchy; inUnitCircle: typeof randInUnitCircle; inUnitCube: typeof randInUnitCube; onHemisphere: typeof randOnUnitHemisphere; @@ -32,6 +34,7 @@ export const randf: { sample: randFloat01, normal: randNormal, exponential: randExponential, + cauchy: randCauchy, inUnitCircle: randInUnitCircle, inUnitCube: randInUnitCube, onHemisphere: randOnUnitHemisphere, diff --git a/packages/typegpu-noise/src/random.ts b/packages/typegpu-noise/src/random.ts index 96f934566..dfe766503 100644 --- a/packages/typegpu-noise/src/random.ts +++ b/packages/typegpu-noise/src/random.ts @@ -1,6 +1,6 @@ import tgpu, { type TgpuFn } from 'typegpu'; import * as d from 'typegpu/data'; -import { clamp, cos, dot, log, mul, sign, sin, sqrt } from 'typegpu/std'; +import { clamp, cos, dot, log, mul, sign, sin, sqrt, tan } from 'typegpu/std'; import { randomGeneratorSlot } from './generator.ts'; const TWO_PI = Math.PI * 2; @@ -91,3 +91,11 @@ export const randExponential: TgpuFn<(rate: d.F32) => d.F32> = tgpu.fn( const u = randUniformExclusive(); return (-1 / rate) * log(1 - u); }); + +export const randCauchy: TgpuFn<(x0: d.F32, gamma: d.F32) => d.F32> = tgpu.fn( + [d.f32, d.f32], + d.f32, +)((x0, gamma) => { + const u = randNormal(0, 1); + return x0 + gamma * (tan(Math.PI * (u - 0.5))); +}); From 98dfac721583c1f4339e732b249de5af9211a237 Mon Sep 17 00:00:00 2001 From: Szymon Szulc Date: Mon, 11 Aug 2025 18:52:44 +0200 Subject: [PATCH 04/64] All continuous --- .../content/examples/simple/probability/index.ts | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/index.ts b/apps/typegpu-docs/src/content/examples/simple/probability/index.ts index 2216ba27c..e14316a20 100644 --- a/apps/typegpu-docs/src/content/examples/simple/probability/index.ts +++ b/apps/typegpu-docs/src/content/examples/simple/probability/index.ts @@ -4,7 +4,7 @@ import tgpu from 'typegpu'; import * as d from 'typegpu/data'; import { randf } from '@typegpu/noise'; -const N = 1000000; +const N = 10000; const range = Array.from( { length: Math.round((10 - (-10)) / 0.05) + 1 }, @@ -25,11 +25,10 @@ const f1 = tgpu['~unstable'].computeFn({ workgroupSize: [1] })(() => { const p1 = root['~unstable'].withCompute(f1).createPipeline(); p1.dispatchWorkgroups(1); -const samples1 = await b.read(); +const samples1 = (await b.read()).filter((x) => x >= -20 && x <= 20); const plot1 = Plot.plot({ - title: 'Exp(1): 1 worker samples 10000 values', - x: { domain: [-5, 5] }, + title: 'Normal(0, 1): 1 worker samples 10000 values', y: { grid: true }, marks: [ Plot.rectY( @@ -50,19 +49,18 @@ const f2 = tgpu['~unstable'].computeFn({ workgroupSize: [1], })((input) => { randf.seed2(d.vec2f(input.gid.xy)); - bView.$[input.gid.x * 100 + input.gid.y] = randf.cauchy(0, 1); + bView.$[input.gid.x * 100 + input.gid.y] = randf.normal(0, 1); }); const p2 = root['~unstable'].withCompute(f2).createPipeline(); p2.dispatchWorkgroups(100, 100); -const samples2 = await b.read(); +const samples2 = (await b.read()).filter((x) => x >= -20 && x <= 20); console.log(samples1); console.log(samples2); const plot2 = Plot.plot({ - title: 'Exp(1): 10000 workers, each sample 1 value with seed2(xy)', - x: { domain: [-100, 100] }, + title: 'Normal(0, 1): 10000 workers, each sampling 1 value with seed2(xy)', y: { grid: true }, marks: [ Plot.rectY( From 73a6eefce1d9355308c6b95bcddeab580176212c Mon Sep 17 00:00:00 2001 From: Szymon Szulc Date: Tue, 12 Aug 2025 12:24:10 +0200 Subject: [PATCH 05/64] 3d scatter --- apps/typegpu-docs/package.json | 1 + .../examples/simple/probability/index-old.ts | 105 +++++++++++++ .../examples/simple/probability/index.html | 6 +- .../examples/simple/probability/index.ts | 146 ++++++++++-------- packages/typegpu-noise/src/index.ts | 3 + packages/typegpu-noise/src/random.ts | 21 ++- pnpm-lock.yaml | 21 +++ 7 files changed, 234 insertions(+), 69 deletions(-) create mode 100644 apps/typegpu-docs/src/content/examples/simple/probability/index-old.ts diff --git a/apps/typegpu-docs/package.json b/apps/typegpu-docs/package.json index 7a3e4a061..1ba901e96 100644 --- a/apps/typegpu-docs/package.json +++ b/apps/typegpu-docs/package.json @@ -65,6 +65,7 @@ "@webgpu/types": "catalog:types", "astro-vtbot": "^2.1.6", "autoprefixer": "^10.4.21", + "morphcharts": "^1.3.2", "tailwindcss": "^4.1.11", "tailwindcss-motion": "^1.1.1", "vite-imagetools": "catalog:frontend", diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/index-old.ts b/apps/typegpu-docs/src/content/examples/simple/probability/index-old.ts new file mode 100644 index 000000000..05cfa439a --- /dev/null +++ b/apps/typegpu-docs/src/content/examples/simple/probability/index-old.ts @@ -0,0 +1,105 @@ +import * as Plot from '@observablehq/plot'; + +import tgpu from 'typegpu'; +import * as d from 'typegpu/data'; +import { randf } from '@typegpu/noise'; + +const N = 10000; + +const range = Array.from( + { length: Math.round((10 - (-10)) / 0.05) + 1 }, + (_, i) => -10 + i * 0.05, +); + +const bins = [Number.NEGATIVE_INFINITY, ...range, Number.POSITIVE_INFINITY]; + +const root = await tgpu.init(); +const b = root.createBuffer(d.arrayOf(d.f32, N)).$usage('storage'); +const bView = b.as('mutable'); + +const f1 = tgpu['~unstable'].computeFn({ workgroupSize: [1] })(() => { + for (let i = d.i32(0); i < d.i32(N); i++) { + bView.$[i] = randf.bernoulli(0.5); + } +}); + +const p1 = root['~unstable'].withCompute(f1).createPipeline(); +p1.dispatchWorkgroups(1); +const samples1 = (await b.read()).filter((x) => x >= -20 && x <= 20); + +// const plot1 = Plot.plot({ +// title: 'Bern(0.5): 1 worker samples 10000 values', +// y: { grid: true }, +// marks: [ +// Plot.rectY( +// samples1, +// Plot.binX( +// { y: 'count' }, +// { x: (d) => d, fill: 'lightblue' } as Plot.BinXInputs, +// ), +// ), +// Plot.ruleY([0]), +// ], +// }); +const plot1 = Plot.plot({ + title: 'Bern(0.5): 1 worker samples 10000 values', + y: { + grid: true, + percent: true, + }, + marks: [ + Plot.ruleY([0]), + Plot.barY( + samples1, + Plot.groupX({ y: 'proportion' }, { x: (d) => d, fill: 'lightblue' }), + ), + ], +}); +const div1 = document.getElementById('hist1'); +div1?.append(plot1); + +const f2 = tgpu['~unstable'].computeFn({ + in: { gid: d.builtin.globalInvocationId }, + workgroupSize: [1], +})((input) => { + randf.seed2(d.vec2f(input.gid.xy)); + bView.$[input.gid.x * 100 + input.gid.y] = randf.bernoulli(0.5); +}); + +const p2 = root['~unstable'].withCompute(f2).createPipeline(); +p2.dispatchWorkgroups(100, 100); +const samples2 = (await b.read()).filter((x) => x >= -20 && x <= 20); + +console.log(samples1); +console.log(samples2); + +// const plot2 = Plot.plot({ +// title: 'Bern(0.5): 10000 workers, each sampling 1 value with seed2(xy)', +// y: { grid: true }, +// marks: [ +// Plot.rectY( +// samples2, +// Plot.binX( +// { y: 'count' }, +// { x: (d) => d, fill: 'lightblue' } as Plot.BinXInputs, +// ), +// ), +// Plot.ruleY([0]), +// ], +// }); +const plot2 = Plot.plot({ + title: 'Bern(0.5): 10000 workers, each sampling 1 value with seed2(xy)', + y: { + grid: true, + percent: true, + }, + marks: [ + Plot.ruleY([0]), + Plot.barY( + samples2, + Plot.groupX({ y: 'proportion' }, { x: (d) => d, fill: 'lightblue' }), + ), + ], +}); +const div2 = document.getElementById('hist2'); +div2?.append(plot2); diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/index.html b/apps/typegpu-docs/src/content/examples/simple/probability/index.html index 08c3efd70..9773034f5 100644 --- a/apps/typegpu-docs/src/content/examples/simple/probability/index.html +++ b/apps/typegpu-docs/src/content/examples/simple/probability/index.html @@ -1,2 +1,4 @@ -
-
+ + +
+
diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/index.ts b/apps/typegpu-docs/src/content/examples/simple/probability/index.ts index e14316a20..1274e40d6 100644 --- a/apps/typegpu-docs/src/content/examples/simple/probability/index.ts +++ b/apps/typegpu-docs/src/content/examples/simple/probability/index.ts @@ -1,77 +1,91 @@ -import * as Plot from '@observablehq/plot'; +import * as MorphCharts from 'morphcharts'; -import tgpu from 'typegpu'; -import * as d from 'typegpu/data'; -import { randf } from '@typegpu/noise'; - -const N = 10000; +// Core +const core = new MorphCharts.Core({ + container: document.getElementById('scatter') as HTMLElement, +}); -const range = Array.from( - { length: Math.round((10 - (-10)) / 0.05) + 1 }, - (_, i) => -10 + i * 0.05, -); +core.config.logLevel = MorphCharts.LogLevel.trace; +const debug = document.getElementById('debug') as HTMLElement; +core.updateCallback = () => { + debug.innerText = core.debugText.text; +}; -const bins = [Number.NEGATIVE_INFINITY, ...range, Number.POSITIVE_INFINITY]; +// Renderer +const main = new MorphCharts.Renderers.Basic.Main(); +main.depthEnabled = true; +core.renderer = main; -const root = await tgpu.init(); -const b = root.createBuffer(d.arrayOf(d.f32, N)).$usage('storage'); -const bView = b.as('mutable'); +// Data +const count = 10000; +const ids = new Uint32Array(count); +const positionsX = new Float64Array(count); +const positionsY = new Float64Array(count); +const positionsZ = new Float64Array(count); +const sizes = new Float64Array(count); +const dists = new Float64Array(count); +for (let i = 0; i < count; i++) { + ids[i] = i; + positionsX[i] = Math.random(); + positionsY[i] = Math.random(); + positionsZ[i] = Math.random(); + sizes[i] = 0.17; + dists[i] = Math.sqrt( + (positionsX[i] - 0.5) ** 2 + (positionsY[i] - 0.5) ** 2 + + (positionsZ[i] - 0.5) ** 2, + ); +} -const f1 = tgpu['~unstable'].computeFn({ workgroupSize: [1] })(() => { - for (let i = d.i32(0); i < d.i32(N); i++) { - bView.$[i] = randf.normal(0, 1); - } -}); +// Palette +const palette = MorphCharts.Helpers.PaletteHelper.resample( + core.paletteResources.palettes[ + MorphCharts.PaletteName.blues + ].colors, + 16, + false, +); -const p1 = root['~unstable'].withCompute(f1).createPipeline(); -p1.dispatchWorkgroups(1); -const samples1 = (await b.read()).filter((x) => x >= -20 && x <= 20); +// Transition buffer +const transitionBuffer = core.renderer.createTransitionBuffer(ids); +core.renderer.transitionBuffers = [transitionBuffer]; +transitionBuffer.currentBuffer.unitType = MorphCharts.UnitType.sphere; +transitionBuffer.currentPalette.colors = palette; -const plot1 = Plot.plot({ - title: 'Normal(0, 1): 1 worker samples 10000 values', - y: { grid: true }, - marks: [ - Plot.rectY( - samples1, - Plot.binX( - { y: 'count' }, - { x: (d) => d, fill: 'lightblue' } as Plot.BinXInputs, - ), - ), - Plot.ruleY([0]), - ], +// Layout +const scatter = new MorphCharts.Layouts.Scatter(core); +scatter.layout(transitionBuffer.currentBuffer, ids, { + positionsX: positionsX, + positionsY: positionsY, + positionsZ: positionsZ, }); -const div1 = document.getElementById('hist1'); -div1?.append(plot1); - -const f2 = tgpu['~unstable'].computeFn({ - in: { gid: d.builtin.globalInvocationId }, - workgroupSize: [1], -})((input) => { - randf.seed2(d.vec2f(input.gid.xy)); - bView.$[input.gid.x * 100 + input.gid.y] = randf.normal(0, 1); +scatter.update(transitionBuffer.currentBuffer, ids, { + sizes: sizes, + sizeScaling: 0.1, + colors: dists, }); -const p2 = root['~unstable'].withCompute(f2).createPipeline(); -p2.dispatchWorkgroups(100, 100); -const samples2 = (await b.read()).filter((x) => x >= -20 && x <= 20); - -console.log(samples1); -console.log(samples2); +// Axes +const axes = MorphCharts.Axes.Cartesian3dAxesHelper.create( + core, + { + titleX: 'x', + titleY: 'y', + titleZ: 'z', + labelsX: (value) => { + return value.toFixed(1); + }, + labelsY: (value) => { + return value.toFixed(1); + }, + labelsZ: (value) => { + return value.toFixed(1); + }, + }, +); +core.renderer.currentAxes = [ + core.renderer.createCartesian3dAxesVisual(axes), +]; -const plot2 = Plot.plot({ - title: 'Normal(0, 1): 10000 workers, each sampling 1 value with seed2(xy)', - y: { grid: true }, - marks: [ - Plot.rectY( - samples2, - Plot.binX( - { y: 'count' }, - { x: (d) => d, fill: 'lightblue' } as Plot.BinXInputs, - ), - ), - Plot.ruleY([0]), - ], -}); -const div2 = document.getElementById('hist2'); -div2?.append(plot2); +// Alt-azimuth camera +const camera = core.camera; +camera.setPosition([0, 0, 0.2], false); diff --git a/packages/typegpu-noise/src/index.ts b/packages/typegpu-noise/src/index.ts index 1b717f121..daf28eaf6 100644 --- a/packages/typegpu-noise/src/index.ts +++ b/packages/typegpu-noise/src/index.ts @@ -1,4 +1,5 @@ import { + randBernoulli, randCauchy, randExponential, randFloat01, @@ -22,6 +23,7 @@ export const randf: { normal: typeof randNormal; exponential: typeof randExponential; cauchy: typeof randCauchy; + bernoulli: typeof randBernoulli; inUnitCircle: typeof randInUnitCircle; inUnitCube: typeof randInUnitCube; onHemisphere: typeof randOnUnitHemisphere; @@ -35,6 +37,7 @@ export const randf: { normal: randNormal, exponential: randExponential, cauchy: randCauchy, + bernoulli: randBernoulli, inUnitCircle: randInUnitCircle, inUnitCube: randInUnitCube, onHemisphere: randOnUnitHemisphere, diff --git a/packages/typegpu-noise/src/random.ts b/packages/typegpu-noise/src/random.ts index dfe766503..77fd715ff 100644 --- a/packages/typegpu-noise/src/random.ts +++ b/packages/typegpu-noise/src/random.ts @@ -1,6 +1,17 @@ import tgpu, { type TgpuFn } from 'typegpu'; import * as d from 'typegpu/data'; -import { clamp, cos, dot, log, mul, sign, sin, sqrt, tan } from 'typegpu/std'; +import { + clamp, + cos, + dot, + log, + mul, + sign, + sin, + sqrt, + step, + tan, +} from 'typegpu/std'; import { randomGeneratorSlot } from './generator.ts'; const TWO_PI = Math.PI * 2; @@ -99,3 +110,11 @@ export const randCauchy: TgpuFn<(x0: d.F32, gamma: d.F32) => d.F32> = tgpu.fn( const u = randNormal(0, 1); return x0 + gamma * (tan(Math.PI * (u - 0.5))); }); + +export const randBernoulli: TgpuFn<(p: d.F32) => d.F32> = tgpu.fn( + [d.f32], + d.f32, +)((p) => { + const u = randomGeneratorSlot.value.sample(); + return step(p, u); +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 66fd3a2c0..60805fbb2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -279,6 +279,9 @@ importers: autoprefixer: specifier: ^10.4.21 version: 10.4.21(postcss@8.5.3) + morphcharts: + specifier: ^1.3.2 + version: 1.3.2 tailwindcss: specifier: ^4.1.11 version: 4.1.11 @@ -2583,6 +2586,9 @@ packages: '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + '@types/webxr@0.4.0': + resolution: {integrity: sha512-LQvrACV3Pj17GpkwHwXuTd733gfY+D7b9mKdrTmLdO7vo7P/o6209Qqtk63y/FCv/lspdmi0pWz6Qe/ull9kQg==} + '@typescript/analyze-trace@0.10.1': resolution: {integrity: sha512-RnlSOPh14QbopGCApgkSx5UBgGda5MX1cHqp2fsqfiDyCwGL/m1jaeB9fzu7didVS81LQqGZZuxFBcg8YU8EVw==} hasBin: true @@ -3599,6 +3605,9 @@ packages: github-slugger@2.0.0: resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} + gl-matrix@3.4.4: + resolution: {integrity: sha512-latSnyDNt/8zYUB6VIJ6PCh2jBjJX6gnDsoCZ7LyW7GkqrD51EWwa9qCoGixj8YqBtETQK/xY7OmpTF8xz1DdQ==} + glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -4364,6 +4373,9 @@ packages: moo@0.5.2: resolution: {integrity: sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q==} + morphcharts@1.3.2: + resolution: {integrity: sha512-0T34Aryx8a6p0hzOzKu4x/3cK9NBoq4+59fOapEt3Iy8mpQpVg3KiicKroZRfOyaz4gNPvgK9DG/Q37Ecgf2ig==} + motion-dom@12.23.7: resolution: {integrity: sha512-AyJR07/YxObtK3NyGLCfebUe0k9UZGhik+2eIPUoKz76cKRRSkMeifmIxfztIvOaKb/Smu9IfVHkmx+mV+iFmQ==} @@ -7938,6 +7950,8 @@ snapshots: '@types/unist@3.0.3': {} + '@types/webxr@0.4.0': {} + '@typescript/analyze-trace@0.10.1': dependencies: chalk: 4.1.2 @@ -9207,6 +9221,8 @@ snapshots: github-slugger@2.0.0: {} + gl-matrix@3.4.4: {} + glob-parent@5.1.2: dependencies: is-glob: 4.0.3 @@ -10296,6 +10312,11 @@ snapshots: moo@0.5.2: {} + morphcharts@1.3.2: + dependencies: + '@types/webxr': 0.4.0 + gl-matrix: 3.4.4 + motion-dom@12.23.7: dependencies: motion-utils: 12.23.6 From e7ae4eac92f65dae0320b29356c0fea759d3744b Mon Sep 17 00:00:00 2001 From: Szymon Szulc Date: Tue, 12 Aug 2025 16:20:35 +0200 Subject: [PATCH 06/64] on unit sphere --- .../examples/simple/probability/index-old.ts | 2 - .../examples/simple/probability/index.html | 18 ++++++- .../examples/simple/probability/index.ts | 47 +++++++++++++++++-- packages/typegpu-noise/src/index.ts | 6 +++ packages/typegpu-noise/src/random.ts | 18 +++++-- 5 files changed, 78 insertions(+), 13 deletions(-) diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/index-old.ts b/apps/typegpu-docs/src/content/examples/simple/probability/index-old.ts index 05cfa439a..d2e923e47 100644 --- a/apps/typegpu-docs/src/content/examples/simple/probability/index-old.ts +++ b/apps/typegpu-docs/src/content/examples/simple/probability/index-old.ts @@ -11,8 +11,6 @@ const range = Array.from( (_, i) => -10 + i * 0.05, ); -const bins = [Number.NEGATIVE_INFINITY, ...range, Number.POSITIVE_INFINITY]; - const root = await tgpu.init(); const b = root.createBuffer(d.arrayOf(d.f32, N)).$usage('storage'); const bView = b.as('mutable'); diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/index.html b/apps/typegpu-docs/src/content/examples/simple/probability/index.html index 9773034f5..8df6fceb7 100644 --- a/apps/typegpu-docs/src/content/examples/simple/probability/index.html +++ b/apps/typegpu-docs/src/content/examples/simple/probability/index.html @@ -1,4 +1,18 @@ -
-
+
+

InUnitSphere: 1 worker samples 10000 values

+ +
+
+
diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/index.ts b/apps/typegpu-docs/src/content/examples/simple/probability/index.ts index 1274e40d6..5488ee2fe 100644 --- a/apps/typegpu-docs/src/content/examples/simple/probability/index.ts +++ b/apps/typegpu-docs/src/content/examples/simple/probability/index.ts @@ -1,4 +1,8 @@ import * as MorphCharts from 'morphcharts'; +import tgpu from 'typegpu'; +import * as d from 'typegpu/data'; +import { randf } from '@typegpu/noise'; +import { sqrt } from 'typegpu/std'; // Core const core = new MorphCharts.Core({ @@ -24,15 +28,45 @@ const positionsY = new Float64Array(count); const positionsZ = new Float64Array(count); const sizes = new Float64Array(count); const dists = new Float64Array(count); + +const root = await tgpu.init(); +const b = root.createBuffer(d.arrayOf(d.vec3f, count)).$usage('storage'); +const bView = b.as('mutable'); + +const f1 = tgpu['~unstable'].computeFn({ workgroupSize: [1] })(() => { + for (let i = d.i32(0); i < d.i32(count); i++) { + bView.$[i] = d.vec3f(randf.inUnitSphere()); + } +}); + +const p1 = root['~unstable'].withCompute(f1).createPipeline(); +p1.dispatchWorkgroups(1); +const samples1 = await b.read(); + +const f2 = tgpu['~unstable'].computeFn({ + in: { gid: d.builtin.globalInvocationId }, + workgroupSize: [1], +})((input) => { + randf.seed2(d.vec2f(input.gid.xy)); + bView.$[input.gid.x * d.u32(sqrt(count)) + input.gid.y] = d.vec3f( + randf.onUnitSphere(), + ); +}); + +const p2 = root['~unstable'].withCompute(f2).createPipeline(); +p2.dispatchWorkgroups(d.u32(sqrt(count)), d.u32(sqrt(count))); +const samples2 = await b.read(); + +const buffer = samples1; + for (let i = 0; i < count; i++) { ids[i] = i; - positionsX[i] = Math.random(); - positionsY[i] = Math.random(); - positionsZ[i] = Math.random(); + positionsX[i] = buffer[i].x; + positionsY[i] = buffer[i].y; + positionsZ[i] = buffer[i].z; sizes[i] = 0.17; dists[i] = Math.sqrt( - (positionsX[i] - 0.5) ** 2 + (positionsY[i] - 0.5) ** 2 + - (positionsZ[i] - 0.5) ** 2, + (positionsX[i]) ** 2 + (positionsY[i]) ** 2 + (positionsZ[i] ** 2), ); } @@ -74,6 +108,9 @@ const axes = MorphCharts.Axes.Cartesian3dAxesHelper.create( labelsX: (value) => { return value.toFixed(1); }, + minValueX: -1, + minValueY: -1, + // minValueZ: -1, labelsY: (value) => { return value.toFixed(1); }, diff --git a/packages/typegpu-noise/src/index.ts b/packages/typegpu-noise/src/index.ts index daf28eaf6..1a28d3b6a 100644 --- a/packages/typegpu-noise/src/index.ts +++ b/packages/typegpu-noise/src/index.ts @@ -5,7 +5,9 @@ import { randFloat01, randInUnitCircle, randInUnitCube, + randInUnitSphere, randNormal, + randOnUnitCircle, randOnUnitHemisphere, randOnUnitSphere, randSeed, @@ -25,9 +27,11 @@ export const randf: { cauchy: typeof randCauchy; bernoulli: typeof randBernoulli; inUnitCircle: typeof randInUnitCircle; + onUnitCircle: typeof randOnUnitCircle; inUnitCube: typeof randInUnitCube; onHemisphere: typeof randOnUnitHemisphere; onUnitSphere: typeof randOnUnitSphere; + inUnitSphere: typeof randInUnitSphere; } = { seed: randSeed, seed2: randSeed2, @@ -39,9 +43,11 @@ export const randf: { cauchy: randCauchy, bernoulli: randBernoulli, inUnitCircle: randInUnitCircle, + onUnitCircle: randOnUnitCircle, inUnitCube: randInUnitCube, onHemisphere: randOnUnitHemisphere, onUnitSphere: randOnUnitSphere, + inUnitSphere: randInUnitSphere, }; export { diff --git a/packages/typegpu-noise/src/random.ts b/packages/typegpu-noise/src/random.ts index 77fd715ff..8c10f872a 100644 --- a/packages/typegpu-noise/src/random.ts +++ b/packages/typegpu-noise/src/random.ts @@ -6,6 +6,8 @@ import { dot, log, mul, + normalize, + pow, sign, sin, sqrt, @@ -67,13 +69,21 @@ export const randOnUnitSphere: TgpuFn<() => d.Vec3f> = tgpu .fn([], d.vec3f)(() => { const z = 2 * randomGeneratorSlot.value.sample() - 1; const oneMinusZSq = sqrt(1 - z * z); - // TODO: Work out if the -Math.PI offset is necessary - const theta = TWO_PI * randomGeneratorSlot.value.sample() - Math.PI; - const x = sin(theta) * oneMinusZSq; - const y = cos(theta) * oneMinusZSq; + const theta = TWO_PI * randomGeneratorSlot.value.sample(); + const x = cos(theta) * oneMinusZSq; + const y = sin(theta) * oneMinusZSq; return d.vec3f(x, y, z); }); +export const randInUnitSphere: TgpuFn<() => d.Vec3f> = tgpu + .fn([], d.vec3f)(() => { + const u = randomGeneratorSlot.value.sample(); + const v = normalize( + d.vec3f(randNormal(0, 1), randNormal(0, 1), randNormal(0, 1)), + ); + return v.mul(pow(u, 1 / 3)); + }); + export const randOnUnitHemisphere: TgpuFn<(normal: d.Vec3f) => d.Vec3f> = tgpu .fn([d.vec3f], d.vec3f)((normal) => { const value = randOnUnitSphere(); From 86e10ccec1b758d75251f6e24a7795fabe7ee648 Mon Sep 17 00:00:00 2001 From: Szymon Szulc Date: Wed, 13 Aug 2025 10:58:59 +0200 Subject: [PATCH 07/64] onUnitCube --- .../probability/{index-old.ts => index-2d.ts} | 46 +++++------ .../examples/simple/probability/index.html | 10 ++- .../examples/simple/probability/index.ts | 6 +- packages/typegpu-noise/src/index.ts | 7 +- packages/typegpu-noise/src/random.ts | 80 ++++++++++--------- 5 files changed, 78 insertions(+), 71 deletions(-) rename apps/typegpu-docs/src/content/examples/simple/probability/{index-old.ts => index-2d.ts} (79%) diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/index-old.ts b/apps/typegpu-docs/src/content/examples/simple/probability/index-2d.ts similarity index 79% rename from apps/typegpu-docs/src/content/examples/simple/probability/index-old.ts rename to apps/typegpu-docs/src/content/examples/simple/probability/index-2d.ts index d2e923e47..3186e1da1 100644 --- a/apps/typegpu-docs/src/content/examples/simple/probability/index-old.ts +++ b/apps/typegpu-docs/src/content/examples/simple/probability/index-2d.ts @@ -17,7 +17,7 @@ const bView = b.as('mutable'); const f1 = tgpu['~unstable'].computeFn({ workgroupSize: [1] })(() => { for (let i = d.i32(0); i < d.i32(N); i++) { - bView.$[i] = randf.bernoulli(0.5); + bView.$[i] = randf.cauchy(0, 1); } }); @@ -25,34 +25,33 @@ const p1 = root['~unstable'].withCompute(f1).createPipeline(); p1.dispatchWorkgroups(1); const samples1 = (await b.read()).filter((x) => x >= -20 && x <= 20); +const plot1 = Plot.plot({ + title: 'Cauchy(0, 1): 1 worker samples 10000 values', + y: { grid: true }, + marks: [ + Plot.rectY( + samples1, + Plot.binX( + { y: 'count' }, + { x: (d) => d, fill: 'lightblue' } as Plot.BinXInputs, + ), + ), + Plot.ruleY([0]), + ], +}); // const plot1 = Plot.plot({ // title: 'Bern(0.5): 1 worker samples 10000 values', -// y: { grid: true }, +// y: { +// grid: true, +// percent: true, +// }, // marks: [ -// Plot.rectY( +// Plot.barY( // samples1, -// Plot.binX( -// { y: 'count' }, -// { x: (d) => d, fill: 'lightblue' } as Plot.BinXInputs, -// ), +// Plot.groupX({ y: 'proportion' }, { x: (d) => d, fill: 'lightblue' }), // ), -// Plot.ruleY([0]), // ], // }); -const plot1 = Plot.plot({ - title: 'Bern(0.5): 1 worker samples 10000 values', - y: { - grid: true, - percent: true, - }, - marks: [ - Plot.ruleY([0]), - Plot.barY( - samples1, - Plot.groupX({ y: 'proportion' }, { x: (d) => d, fill: 'lightblue' }), - ), - ], -}); const div1 = document.getElementById('hist1'); div1?.append(plot1); @@ -72,7 +71,7 @@ console.log(samples1); console.log(samples2); // const plot2 = Plot.plot({ -// title: 'Bern(0.5): 10000 workers, each sampling 1 value with seed2(xy)', +// title: 'Cauchy(0, 1): 10000 workers, each sampling 1 value with seed2(xy)', // y: { grid: true }, // marks: [ // Plot.rectY( @@ -92,7 +91,6 @@ const plot2 = Plot.plot({ percent: true, }, marks: [ - Plot.ruleY([0]), Plot.barY( samples2, Plot.groupX({ y: 'proportion' }, { x: (d) => d, fill: 'lightblue' }), diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/index.html b/apps/typegpu-docs/src/content/examples/simple/probability/index.html index 8df6fceb7..e4190ee2a 100644 --- a/apps/typegpu-docs/src/content/examples/simple/probability/index.html +++ b/apps/typegpu-docs/src/content/examples/simple/probability/index.html @@ -1,5 +1,7 @@ - - +
-

InUnitSphere: 1 worker samples 10000 values

- +

InUnitCube: 1 worker samples 10000 values

+

InUnitCube: 10000 workers, each sampling 1 value with seed2(xy)

{ for (let i = d.i32(0); i < d.i32(count); i++) { - bView.$[i] = d.vec3f(randf.inUnitSphere()); + bView.$[i] = randf.onUnitCube(); } }); @@ -48,9 +48,7 @@ const f2 = tgpu['~unstable'].computeFn({ workgroupSize: [1], })((input) => { randf.seed2(d.vec2f(input.gid.xy)); - bView.$[input.gid.x * d.u32(sqrt(count)) + input.gid.y] = d.vec3f( - randf.onUnitSphere(), - ); + bView.$[input.gid.x * d.u32(sqrt(count)) + input.gid.y] = randf.onUnitCube(); }); const p2 = root['~unstable'].withCompute(f2).createPipeline(); diff --git a/packages/typegpu-noise/src/index.ts b/packages/typegpu-noise/src/index.ts index 1a28d3b6a..266c9a5a2 100644 --- a/packages/typegpu-noise/src/index.ts +++ b/packages/typegpu-noise/src/index.ts @@ -8,6 +8,7 @@ import { randInUnitSphere, randNormal, randOnUnitCircle, + randOnUnitCube, randOnUnitHemisphere, randOnUnitSphere, randSeed, @@ -29,9 +30,10 @@ export const randf: { inUnitCircle: typeof randInUnitCircle; onUnitCircle: typeof randOnUnitCircle; inUnitCube: typeof randInUnitCube; + onUnitCube: typeof randOnUnitCube; onHemisphere: typeof randOnUnitHemisphere; - onUnitSphere: typeof randOnUnitSphere; inUnitSphere: typeof randInUnitSphere; + onUnitSphere: typeof randOnUnitSphere; } = { seed: randSeed, seed2: randSeed2, @@ -45,9 +47,10 @@ export const randf: { inUnitCircle: randInUnitCircle, onUnitCircle: randOnUnitCircle, inUnitCube: randInUnitCube, + onUnitCube: randOnUnitCube, onHemisphere: randOnUnitHemisphere, - onUnitSphere: randOnUnitSphere, inUnitSphere: randInUnitSphere, + onUnitSphere: randOnUnitSphere, }; export { diff --git a/packages/typegpu-noise/src/random.ts b/packages/typegpu-noise/src/random.ts index 8c10f872a..0f19e20d6 100644 --- a/packages/typegpu-noise/src/random.ts +++ b/packages/typegpu-noise/src/random.ts @@ -8,6 +8,7 @@ import { mul, normalize, pow, + select, sign, sin, sqrt, @@ -51,6 +52,17 @@ export const randInUnitCube: TgpuFn<() => d.Vec3f> = tgpu ) ); +export const randOnUnitCube: TgpuFn<() => d.Vec3f> = tgpu + .fn([], d.vec3f)(() => { + const face = d.u32(randomGeneratorSlot.value.sample() * 6); + const axis = face % 3; + const result = d.vec3f(); + result[axis] = d.f32(select(-1, 1, face > 2)); + result[(axis + 1) % 3] = 2 * randomGeneratorSlot.value.sample() - 1; + result[(axis + 2) % 3] = 2 * randomGeneratorSlot.value.sample() - 1; + return result; + }); + export const randInUnitCircle: TgpuFn<() => d.Vec2f> = tgpu .fn([], d.vec2f)(() => { const radius = sqrt(randomGeneratorSlot.value.sample()); @@ -79,7 +91,7 @@ export const randInUnitSphere: TgpuFn<() => d.Vec3f> = tgpu .fn([], d.vec3f)(() => { const u = randomGeneratorSlot.value.sample(); const v = normalize( - d.vec3f(randNormal(0, 1), randNormal(0, 1), randNormal(0, 1)), + d.vec3f(randNormal(0, 1), randNormal(0, 1), randNormal(0, 1)).add(EPS), ); return v.mul(pow(u, 1 / 3)); }); @@ -92,39 +104,33 @@ export const randOnUnitHemisphere: TgpuFn<(normal: d.Vec3f) => d.Vec3f> = tgpu return mul(sign(alignment), value); }); -const randUniformExclusive: TgpuFn<() => d.F32> = tgpu.fn([], d.f32)(() => { - return clamp(randomGeneratorSlot.value.sample(), 0 + EPS, 1 - EPS); -}); - -export const randNormal: TgpuFn<(mu: d.F32, sigma: d.F32) => d.F32> = tgpu.fn( - [d.f32, d.f32], - d.f32, -)((mu, sigma) => { - const theta = TWO_PI * randUniformExclusive(); - const R = sqrt(-2 * log(randUniformExclusive())); - return R * sin(theta) * sigma + mu; -}); - -export const randExponential: TgpuFn<(rate: d.F32) => d.F32> = tgpu.fn( - [d.f32], - d.f32, -)((rate) => { - const u = randUniformExclusive(); - return (-1 / rate) * log(1 - u); -}); - -export const randCauchy: TgpuFn<(x0: d.F32, gamma: d.F32) => d.F32> = tgpu.fn( - [d.f32, d.f32], - d.f32, -)((x0, gamma) => { - const u = randNormal(0, 1); - return x0 + gamma * (tan(Math.PI * (u - 0.5))); -}); - -export const randBernoulli: TgpuFn<(p: d.F32) => d.F32> = tgpu.fn( - [d.f32], - d.f32, -)((p) => { - const u = randomGeneratorSlot.value.sample(); - return step(p, u); -}); +const randUniformExclusive: TgpuFn<() => d.F32> = tgpu + .fn([], d.f32)(() => { + return clamp(randomGeneratorSlot.value.sample(), 0 + EPS, 1 - EPS); + }); + +export const randNormal: TgpuFn<(mu: d.F32, sigma: d.F32) => d.F32> = tgpu + .fn([d.f32, d.f32], d.f32)((mu, sigma) => { + const theta = TWO_PI * randUniformExclusive(); + const R = sqrt(-2 * log(randUniformExclusive())); + return R * sin(theta) * sigma + mu; + }); + +export const randExponential: TgpuFn<(rate: d.F32) => d.F32> = tgpu + .fn([d.f32], d.f32)((rate) => { + const u = randUniformExclusive(); + // in theory we should take log(1 - u), but u ~ 1 - u speaking of distributions + return (-1 / rate) * log(u); + }); + +export const randCauchy: TgpuFn<(x0: d.F32, gamma: d.F32) => d.F32> = tgpu + .fn([d.f32, d.f32], d.f32)((x0, gamma) => { + const u = randUniformExclusive(); + return x0 + gamma * (tan(Math.PI * (u - 0.5))); + }); + +export const randBernoulli: TgpuFn<(p: d.F32) => d.F32> = tgpu + .fn([d.f32], d.f32)((p) => { + const u = randomGeneratorSlot.value.sample(); + return step(p, u); + }); From d228417af2cbb5ecc3077ba1a4b5f6f6a6cd4e02 Mon Sep 17 00:00:00 2001 From: Szymon Szulc Date: Wed, 13 Aug 2025 12:47:24 +0200 Subject: [PATCH 08/64] Something --- apps/typegpu-docs/package.json | 3 + .../examples/simple/probability/index.html | 4 +- .../examples/simple/probability/index.ts | 10 +- packages/typegpu-noise/src/index.ts | 3 + packages/typegpu-noise/src/random.ts | 40 +++++-- pnpm-lock.yaml | 106 ++++++++++++++++++ 6 files changed, 150 insertions(+), 16 deletions(-) diff --git a/apps/typegpu-docs/package.json b/apps/typegpu-docs/package.json index 1ba901e96..c30e0e300 100644 --- a/apps/typegpu-docs/package.json +++ b/apps/typegpu-docs/package.json @@ -34,6 +34,7 @@ "classnames": "^2.5.1", "expressive-code-twoslash": "^0.5.3", "fuse.js": "catalog:frontend", + "install": "^0.13.0", "jotai": "^2.12.5", "jotai-location": "^0.6.1", "lucide-react": "^0.536.0", @@ -43,6 +44,8 @@ "pathe": "^2.0.3", "react": "^19.1.0", "react-dom": "^19.1.0", + "rehype-katex": "^7.0.1", + "remark-math": "^6.0.0", "remeda": "^2.21.2", "sharp": "^0.34.2", "starlight-blog": "^0.23.2", diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/index.html b/apps/typegpu-docs/src/content/examples/simple/probability/index.html index e4190ee2a..1337fce50 100644 --- a/apps/typegpu-docs/src/content/examples/simple/probability/index.html +++ b/apps/typegpu-docs/src/content/examples/simple/probability/index.html @@ -10,8 +10,8 @@ text-align: center; " > -

InUnitCube: 1 worker samples 10000 values

-

InUnitCube: 10000 workers, each sampling 1 value with seed2(xy)

+

InHemisphere: 1 worker samples 10000 values

+
{ for (let i = d.i32(0); i < d.i32(count); i++) { - bView.$[i] = randf.onUnitCube(); + bView.$[i] = randf.inHemisphere(d.vec3f(sqrt(2), sqrt(2), 0)); } }); @@ -48,7 +48,10 @@ const f2 = tgpu['~unstable'].computeFn({ workgroupSize: [1], })((input) => { randf.seed2(d.vec2f(input.gid.xy)); - bView.$[input.gid.x * d.u32(sqrt(count)) + input.gid.y] = randf.onUnitCube(); + bView.$[input.gid.x * d.u32(sqrt(count)) + input.gid.y] = randf + .inHemisphere( + d.vec3f(sqrt(2), sqrt(2), 0), + ); }); const p2 = root['~unstable'].withCompute(f2).createPipeline(); @@ -64,7 +67,8 @@ for (let i = 0; i < count; i++) { positionsZ[i] = buffer[i].z; sizes[i] = 0.17; dists[i] = Math.sqrt( - (positionsX[i]) ** 2 + (positionsY[i]) ** 2 + (positionsZ[i] ** 2), + (positionsX[i]) ** 2 + (positionsY[i]) ** 2 + + (positionsZ[i]) ** 2, ); } diff --git a/packages/typegpu-noise/src/index.ts b/packages/typegpu-noise/src/index.ts index 266c9a5a2..071a92a92 100644 --- a/packages/typegpu-noise/src/index.ts +++ b/packages/typegpu-noise/src/index.ts @@ -5,6 +5,7 @@ import { randFloat01, randInUnitCircle, randInUnitCube, + randInUnitHemisphere, randInUnitSphere, randNormal, randOnUnitCircle, @@ -31,6 +32,7 @@ export const randf: { onUnitCircle: typeof randOnUnitCircle; inUnitCube: typeof randInUnitCube; onUnitCube: typeof randOnUnitCube; + inHemisphere: typeof randInUnitHemisphere; onHemisphere: typeof randOnUnitHemisphere; inUnitSphere: typeof randInUnitSphere; onUnitSphere: typeof randOnUnitSphere; @@ -48,6 +50,7 @@ export const randf: { onUnitCircle: randOnUnitCircle, inUnitCube: randInUnitCube, onUnitCube: randOnUnitCube, + inHemisphere: randInUnitHemisphere, onHemisphere: randOnUnitHemisphere, inUnitSphere: randInUnitSphere, onUnitSphere: randOnUnitSphere, diff --git a/packages/typegpu-noise/src/random.ts b/packages/typegpu-noise/src/random.ts index 0f19e20d6..0a356d522 100644 --- a/packages/typegpu-noise/src/random.ts +++ b/packages/typegpu-noise/src/random.ts @@ -57,9 +57,10 @@ export const randOnUnitCube: TgpuFn<() => d.Vec3f> = tgpu const face = d.u32(randomGeneratorSlot.value.sample() * 6); const axis = face % 3; const result = d.vec3f(); - result[axis] = d.f32(select(-1, 1, face > 2)); - result[(axis + 1) % 3] = 2 * randomGeneratorSlot.value.sample() - 1; - result[(axis + 2) % 3] = 2 * randomGeneratorSlot.value.sample() - 1; + result[axis] = d.f32(select(0, 1, face > 2)); + result[(axis + 1) % 3] = randomGeneratorSlot.value.sample(); + result[(axis + 2) % 3] = randomGeneratorSlot.value.sample(); + return result; }); @@ -74,9 +75,20 @@ export const randInUnitCircle: TgpuFn<() => d.Vec2f> = tgpu export const randOnUnitCircle: TgpuFn<() => d.Vec2f> = tgpu .fn([], d.vec2f)(() => { const angle = randomGeneratorSlot.value.sample() * TWO_PI; + return d.vec2f(cos(angle), sin(angle)); }); +export const randInUnitSphere: TgpuFn<() => d.Vec3f> = tgpu + .fn([], d.vec3f)(() => { + const u = randomGeneratorSlot.value.sample(); + const v = normalize( + d.vec3f(randNormal(0, 1), randNormal(0, 1), randNormal(0, 1)).add(EPS), + ); + + return v.mul(pow(u, 1 / 3)); + }); + export const randOnUnitSphere: TgpuFn<() => d.Vec3f> = tgpu .fn([], d.vec3f)(() => { const z = 2 * randomGeneratorSlot.value.sample() - 1; @@ -84,16 +96,16 @@ export const randOnUnitSphere: TgpuFn<() => d.Vec3f> = tgpu const theta = TWO_PI * randomGeneratorSlot.value.sample(); const x = cos(theta) * oneMinusZSq; const y = sin(theta) * oneMinusZSq; + return d.vec3f(x, y, z); }); -export const randInUnitSphere: TgpuFn<() => d.Vec3f> = tgpu - .fn([], d.vec3f)(() => { - const u = randomGeneratorSlot.value.sample(); - const v = normalize( - d.vec3f(randNormal(0, 1), randNormal(0, 1), randNormal(0, 1)).add(EPS), - ); - return v.mul(pow(u, 1 / 3)); +export const randInUnitHemisphere: TgpuFn<(normal: d.Vec3f) => d.Vec3f> = tgpu + .fn([d.vec3f], d.vec3f)((normal) => { + const value = randInUnitSphere(); + const alignment = dot(normal, value); + + return mul(sign(alignment), value); }); export const randOnUnitHemisphere: TgpuFn<(normal: d.Vec3f) => d.Vec3f> = tgpu @@ -106,6 +118,9 @@ export const randOnUnitHemisphere: TgpuFn<(normal: d.Vec3f) => d.Vec3f> = tgpu const randUniformExclusive: TgpuFn<() => d.F32> = tgpu .fn([], d.f32)(() => { + // Our generator currently operates on the range [0, 1), + // so clamping with 1 - EPS isn't necessary. + // However, let's keep it, in case we change the generator's domain in the future. return clamp(randomGeneratorSlot.value.sample(), 0 + EPS, 1 - EPS); }); @@ -113,24 +128,27 @@ export const randNormal: TgpuFn<(mu: d.F32, sigma: d.F32) => d.F32> = tgpu .fn([d.f32, d.f32], d.f32)((mu, sigma) => { const theta = TWO_PI * randUniformExclusive(); const R = sqrt(-2 * log(randUniformExclusive())); + return R * sin(theta) * sigma + mu; }); export const randExponential: TgpuFn<(rate: d.F32) => d.F32> = tgpu .fn([d.f32], d.f32)((rate) => { const u = randUniformExclusive(); - // in theory we should take log(1 - u), but u ~ 1 - u speaking of distributions + // In theory we should take log(1 - u), but u ~ (1 - u) speaking of distributions return (-1 / rate) * log(u); }); export const randCauchy: TgpuFn<(x0: d.F32, gamma: d.F32) => d.F32> = tgpu .fn([d.f32, d.f32], d.f32)((x0, gamma) => { const u = randUniformExclusive(); + return x0 + gamma * (tan(Math.PI * (u - 0.5))); }); export const randBernoulli: TgpuFn<(p: d.F32) => d.F32> = tgpu .fn([d.f32], d.f32)((p) => { const u = randomGeneratorSlot.value.sample(); + return step(p, u); }); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 60805fbb2..99579c3e5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -191,6 +191,9 @@ importers: fuse.js: specifier: catalog:frontend version: 7.1.0 + install: + specifier: ^0.13.0 + version: 0.13.0 jotai: specifier: ^2.12.5 version: 2.12.5(@types/react@19.1.8)(react@19.1.0) @@ -218,6 +221,12 @@ importers: react-dom: specifier: ^19.1.0 version: 19.1.0(react@19.1.0) + rehype-katex: + specifier: ^7.0.1 + version: 7.0.1 + remark-math: + specifier: ^6.0.0 + version: 6.0.0 remeda: specifier: ^2.21.2 version: 2.21.2 @@ -2533,6 +2542,9 @@ packages: '@types/js-yaml@4.0.9': resolution: {integrity: sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==} + '@types/katex@0.16.7': + resolution: {integrity: sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ==} + '@types/mdast@4.0.4': resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} @@ -3029,6 +3041,10 @@ packages: resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} engines: {node: '>= 10'} + commander@8.3.0: + resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} + engines: {node: '>= 12'} + common-ancestor-path@1.0.1: resolution: {integrity: sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==} @@ -3649,6 +3665,12 @@ packages: hast-util-format@1.1.0: resolution: {integrity: sha512-yY1UDz6bC9rDvCWHpx12aIBGRG7krurX0p0Fm6pT547LwDIZZiNr8a+IHDogorAdreULSEzP82Nlv5SZkHZcjA==} + hast-util-from-dom@5.0.1: + resolution: {integrity: sha512-N+LqofjR2zuzTjCPzyDUdSshy4Ma6li7p/c3pA78uTwzFgENbgbUrm2ugwsOdcjI1muO+o6Dgzp9p8WHtn/39Q==} + + hast-util-from-html-isomorphic@2.0.0: + resolution: {integrity: sha512-zJfpXq44yff2hmE0XmwEOzdWin5xwH+QIhMLOScpX91e/NSGPsAzNCvLQDIEPyO2TXi+lBmU6hjLIhV8MwP2kw==} + hast-util-from-html@2.0.3: resolution: {integrity: sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==} @@ -3755,6 +3777,10 @@ packages: inline-style-parser@0.2.4: resolution: {integrity: sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==} + install@0.13.0: + resolution: {integrity: sha512-zDml/jzr2PKU9I8J/xyZBQn8rPCAY//UOYNmR01XwNwyfhEWObo2SWfSl1+0tm1u6PhxLwDnfsT/6jB7OUxqFA==} + engines: {node: '>= 0.10'} + internmap@2.0.3: resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} engines: {node: '>=12'} @@ -3946,6 +3972,10 @@ packages: engines: {node: '>=10'} hasBin: true + katex@0.16.22: + resolution: {integrity: sha512-XCHRdUw4lf3SKBaJe4EvgqIuWwkPSo9XoeO8GjQW94Bp7TWv9hNhzZjZ+OH9yf1UmLygb7DIT5GSFQiyt16zYg==} + hasBin: true + kleur@3.0.3: resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} engines: {node: '>=6'} @@ -4166,6 +4196,9 @@ packages: mdast-util-gfm@3.1.0: resolution: {integrity: sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==} + mdast-util-math@3.0.0: + resolution: {integrity: sha512-Tl9GBNeG/AhJnQM221bJR2HPvLOSnLE/T9cJI9tlc6zwQk2nPk/4f0cHkOdEixQPC/j8UtKDdITswvLAy1OZ1w==} + mdast-util-mdx-expression@2.0.1: resolution: {integrity: sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==} @@ -4233,6 +4266,9 @@ packages: micromark-extension-gfm@3.0.0: resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} + micromark-extension-math@3.1.0: + resolution: {integrity: sha512-lvEqd+fHjATVs+2v/8kg9i5Q0AP2k85H0WUOwpIVvUML8BapsMvh1XAogmQjOCsLpoKRCVQqEkQBB3NhVBcsOg==} + micromark-extension-mdx-expression@3.0.0: resolution: {integrity: sha512-sI0nwhUDz97xyzqJAbHQhp5TfaxEvZZZ2JDqUo+7NvyIYG6BZ5CPPqj2ogUoPJlmXHBnyZUzISg9+oUmU6tUjQ==} @@ -4990,6 +5026,9 @@ packages: rehype-format@5.0.1: resolution: {integrity: sha512-zvmVru9uB0josBVpr946OR8ui7nJEdzZobwLOOqHb/OOD88W0Vk2SqLwoVOj0fM6IPCCO6TaV9CvQvJMWwukFQ==} + rehype-katex@7.0.1: + resolution: {integrity: sha512-OiM2wrZ/wuhKkigASodFoo8wimG3H12LWQaH8qSPVJn9apWKFSH3YOCtbKpBorTVw/eI7cuT21XBbvwEswbIOA==} + rehype-parse@9.0.1: resolution: {integrity: sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag==} @@ -5011,6 +5050,9 @@ packages: remark-gfm@4.0.1: resolution: {integrity: sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==} + remark-math@6.0.0: + resolution: {integrity: sha512-MMqgnP74Igy+S3WwnhQ7kqGlEerTETXMvJhrUzDikVZ2/uogJCb+WHUg97hK9/jcfc0dkD73s3LN8zU49cTEtA==} + remark-mdx@3.1.0: resolution: {integrity: sha512-Ngl/H3YXyBV9RcRNdlYsZujAmhsxwzxpDzpDEhFBVAGthS4GDgnctpDjgFl/ULx5UEDzqtW1cyBSNKqYYrqLBA==} @@ -7902,6 +7944,8 @@ snapshots: '@types/js-yaml@4.0.9': {} + '@types/katex@0.16.7': {} + '@types/mdast@4.0.4': dependencies: '@types/unist': 3.0.3 @@ -8540,6 +8584,8 @@ snapshots: commander@7.2.0: {} + commander@8.3.0: {} + common-ancestor-path@1.0.1: {} commondir@1.0.1: {} @@ -9285,6 +9331,19 @@ snapshots: html-whitespace-sensitive-tag-names: 3.0.1 unist-util-visit-parents: 6.0.1 + hast-util-from-dom@5.0.1: + dependencies: + '@types/hast': 3.0.4 + hastscript: 9.0.1 + web-namespaces: 2.0.1 + + hast-util-from-html-isomorphic@2.0.0: + dependencies: + '@types/hast': 3.0.4 + hast-util-from-dom: 5.0.1 + hast-util-from-html: 2.0.3 + unist-util-remove-position: 5.0.0 + hast-util-from-html@2.0.3: dependencies: '@types/hast': 3.0.4 @@ -9496,6 +9555,8 @@ snapshots: inline-style-parser@0.2.4: {} + install@0.13.0: {} + internmap@2.0.3: {} interval-tree-1d@1.0.4: @@ -9643,6 +9704,10 @@ snapshots: jsonparse: 1.3.1 through2: 4.0.2 + katex@0.16.22: + dependencies: + commander: 8.3.0 + kleur@3.0.3: {} kleur@4.1.5: {} @@ -9890,6 +9955,18 @@ snapshots: transitivePeerDependencies: - supports-color + mdast-util-math@3.0.0: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + longest-streak: 3.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + unist-util-remove-position: 5.0.0 + transitivePeerDependencies: + - supports-color + mdast-util-mdx-expression@2.0.1: dependencies: '@types/estree-jsx': 1.0.5 @@ -10069,6 +10146,16 @@ snapshots: micromark-util-combine-extensions: 2.0.1 micromark-util-types: 2.0.2 + micromark-extension-math@3.1.0: + dependencies: + '@types/katex': 0.16.7 + devlop: 1.1.0 + katex: 0.16.22 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + micromark-extension-mdx-expression@3.0.0: dependencies: '@types/estree': 1.0.8 @@ -10928,6 +11015,16 @@ snapshots: '@types/hast': 3.0.4 hast-util-format: 1.1.0 + rehype-katex@7.0.1: + dependencies: + '@types/hast': 3.0.4 + '@types/katex': 0.16.7 + hast-util-from-html-isomorphic: 2.0.0 + hast-util-to-text: 4.0.2 + katex: 0.16.22 + unist-util-visit-parents: 6.0.1 + vfile: 6.0.3 + rehype-parse@9.0.1: dependencies: '@types/hast': 3.0.4 @@ -10981,6 +11078,15 @@ snapshots: transitivePeerDependencies: - supports-color + remark-math@6.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-math: 3.0.0 + micromark-extension-math: 3.1.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + remark-mdx@3.1.0: dependencies: mdast-util-mdx: 3.0.0 From 71c4a0b8ae52bc12bf9d55a3b33ffe649c8e3c15 Mon Sep 17 00:00:00 2001 From: Szymon Szulc Date: Wed, 13 Aug 2025 14:03:38 +0200 Subject: [PATCH 09/64] Updated docs --- apps/typegpu-docs/package.json | 1 + .../content/docs/ecosystem/typegpu-noise.mdx | 17 ++- .../examples/simple/probability/index-2d.ts | 101 -------------- .../examples/simple/probability/index.html | 20 --- .../examples/simple/probability/index.ts | 130 ------------------ .../examples/simple/probability/meta.json | 5 - packages/typegpu-noise/src/random.ts | 6 +- pnpm-lock.yaml | 51 ++++++- 8 files changed, 64 insertions(+), 267 deletions(-) delete mode 100644 apps/typegpu-docs/src/content/examples/simple/probability/index-2d.ts delete mode 100644 apps/typegpu-docs/src/content/examples/simple/probability/index.html delete mode 100644 apps/typegpu-docs/src/content/examples/simple/probability/index.ts delete mode 100644 apps/typegpu-docs/src/content/examples/simple/probability/meta.json diff --git a/apps/typegpu-docs/package.json b/apps/typegpu-docs/package.json index c30e0e300..1d4c04897 100644 --- a/apps/typegpu-docs/package.json +++ b/apps/typegpu-docs/package.json @@ -10,6 +10,7 @@ }, "dependencies": { "@astrojs/check": "^0.9.4", + "@astrojs/mdx": "^4.3.3", "@astrojs/react": "^4.3.0", "@astrojs/sitemap": "^3.4.1", "@astrojs/starlight": "^0.35.1", diff --git a/apps/typegpu-docs/src/content/docs/ecosystem/typegpu-noise.mdx b/apps/typegpu-docs/src/content/docs/ecosystem/typegpu-noise.mdx index 5eff36c54..da768a45e 100644 --- a/apps/typegpu-docs/src/content/docs/ecosystem/typegpu-noise.mdx +++ b/apps/typegpu-docs/src/content/docs/ecosystem/typegpu-noise.mdx @@ -2,6 +2,7 @@ title: "@typegpu/noise" --- + The `@typegpu/noise` package offers a set of pseudo-random utilities for use in TypeGPU and WebGPU projects. At its core, the package provides a pseudo-random number generator for uniformly distributed values (same probability for all numbers) in the range `[0, 1)`, as well as higher-level utilities built on top. @@ -101,9 +102,23 @@ const main = tgpu['~unstable'].fragmentFn({ ``` There are higher-level utilities built on top of `randf.sample`: + +### Discrete +- `bernoulli` - returns 1 with probability `p`, 0 otherwise. You can think of it as a flip of a biased coin. `p` has to be in range `[0, 1]` + +### Continuous +- `exponential` - returns a number using the exponential distribution with given `rate`. `rate` has to be `> 0`. Commonly used for modeling time until an event +- `normal` - returns a number using the normal (Gaussian) distribution with given mean (`mu`) and standard devation (`sigma`). `sigma` has to be `>= 0` +- `cauchy` - returns a number using the Cauchy distribution with given origin point (`x0`, `gamma`). `gamma` has to `>=0` + +### Geometric - `inUnitCircle` - returns a random 2D vector uniformly distributed inside a unit circle +- `onUnitCircle` - returns a random 2D vector uniformly distributed on the perimeter of a unit circle - `inUnitCube` - returns a random 3D vector uniformly distributed inside a unit cube -- `onHemisphere` - returns a random 3D vector uniformly distributed on the surface of the upper hemisphere oriented accordingly to given normal vector +- `onUnitCube` - returns a random 3D vector uniformly distributed on the surface of the a cube +- `inHemisphere` - returns a random 3D vector uniformly distributed inside an upper hemisphere oriented accordingly to given normal vector +- `onHemisphere` - returns a random 3D vector uniformly distributed on the surface of an upper hemisphere oriented accordingly to given normal vector +- `inUnitSphere` - returns a random 3D vector uniformly distributed inside a unit sphere - `onUnitSphere` - returns a random 3D vector uniformly distributed on the surface of a unit sphere ## Perlin noise diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/index-2d.ts b/apps/typegpu-docs/src/content/examples/simple/probability/index-2d.ts deleted file mode 100644 index 3186e1da1..000000000 --- a/apps/typegpu-docs/src/content/examples/simple/probability/index-2d.ts +++ /dev/null @@ -1,101 +0,0 @@ -import * as Plot from '@observablehq/plot'; - -import tgpu from 'typegpu'; -import * as d from 'typegpu/data'; -import { randf } from '@typegpu/noise'; - -const N = 10000; - -const range = Array.from( - { length: Math.round((10 - (-10)) / 0.05) + 1 }, - (_, i) => -10 + i * 0.05, -); - -const root = await tgpu.init(); -const b = root.createBuffer(d.arrayOf(d.f32, N)).$usage('storage'); -const bView = b.as('mutable'); - -const f1 = tgpu['~unstable'].computeFn({ workgroupSize: [1] })(() => { - for (let i = d.i32(0); i < d.i32(N); i++) { - bView.$[i] = randf.cauchy(0, 1); - } -}); - -const p1 = root['~unstable'].withCompute(f1).createPipeline(); -p1.dispatchWorkgroups(1); -const samples1 = (await b.read()).filter((x) => x >= -20 && x <= 20); - -const plot1 = Plot.plot({ - title: 'Cauchy(0, 1): 1 worker samples 10000 values', - y: { grid: true }, - marks: [ - Plot.rectY( - samples1, - Plot.binX( - { y: 'count' }, - { x: (d) => d, fill: 'lightblue' } as Plot.BinXInputs, - ), - ), - Plot.ruleY([0]), - ], -}); -// const plot1 = Plot.plot({ -// title: 'Bern(0.5): 1 worker samples 10000 values', -// y: { -// grid: true, -// percent: true, -// }, -// marks: [ -// Plot.barY( -// samples1, -// Plot.groupX({ y: 'proportion' }, { x: (d) => d, fill: 'lightblue' }), -// ), -// ], -// }); -const div1 = document.getElementById('hist1'); -div1?.append(plot1); - -const f2 = tgpu['~unstable'].computeFn({ - in: { gid: d.builtin.globalInvocationId }, - workgroupSize: [1], -})((input) => { - randf.seed2(d.vec2f(input.gid.xy)); - bView.$[input.gid.x * 100 + input.gid.y] = randf.bernoulli(0.5); -}); - -const p2 = root['~unstable'].withCompute(f2).createPipeline(); -p2.dispatchWorkgroups(100, 100); -const samples2 = (await b.read()).filter((x) => x >= -20 && x <= 20); - -console.log(samples1); -console.log(samples2); - -// const plot2 = Plot.plot({ -// title: 'Cauchy(0, 1): 10000 workers, each sampling 1 value with seed2(xy)', -// y: { grid: true }, -// marks: [ -// Plot.rectY( -// samples2, -// Plot.binX( -// { y: 'count' }, -// { x: (d) => d, fill: 'lightblue' } as Plot.BinXInputs, -// ), -// ), -// Plot.ruleY([0]), -// ], -// }); -const plot2 = Plot.plot({ - title: 'Bern(0.5): 10000 workers, each sampling 1 value with seed2(xy)', - y: { - grid: true, - percent: true, - }, - marks: [ - Plot.barY( - samples2, - Plot.groupX({ y: 'proportion' }, { x: (d) => d, fill: 'lightblue' }), - ), - ], -}); -const div2 = document.getElementById('hist2'); -div2?.append(plot2); diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/index.html b/apps/typegpu-docs/src/content/examples/simple/probability/index.html deleted file mode 100644 index 1337fce50..000000000 --- a/apps/typegpu-docs/src/content/examples/simple/probability/index.html +++ /dev/null @@ -1,20 +0,0 @@ - -
-

InHemisphere: 1 worker samples 10000 values

- -
-
-
diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/index.ts b/apps/typegpu-docs/src/content/examples/simple/probability/index.ts deleted file mode 100644 index cbb91cd42..000000000 --- a/apps/typegpu-docs/src/content/examples/simple/probability/index.ts +++ /dev/null @@ -1,130 +0,0 @@ -import * as MorphCharts from 'morphcharts'; -import tgpu from 'typegpu'; -import * as d from 'typegpu/data'; -import { randf } from '@typegpu/noise'; -import { sqrt } from 'typegpu/std'; - -// Core -const core = new MorphCharts.Core({ - container: document.getElementById('scatter') as HTMLElement, -}); - -core.config.logLevel = MorphCharts.LogLevel.trace; -const debug = document.getElementById('debug') as HTMLElement; -core.updateCallback = () => { - debug.innerText = core.debugText.text; -}; - -// Renderer -const main = new MorphCharts.Renderers.Basic.Main(); -main.depthEnabled = true; -core.renderer = main; - -// Data -const count = 10000; -const ids = new Uint32Array(count); -const positionsX = new Float64Array(count); -const positionsY = new Float64Array(count); -const positionsZ = new Float64Array(count); -const sizes = new Float64Array(count); -const dists = new Float64Array(count); - -const root = await tgpu.init(); -const b = root.createBuffer(d.arrayOf(d.vec3f, count)).$usage('storage'); -const bView = b.as('mutable'); - -const f1 = tgpu['~unstable'].computeFn({ workgroupSize: [1] })(() => { - for (let i = d.i32(0); i < d.i32(count); i++) { - bView.$[i] = randf.inHemisphere(d.vec3f(sqrt(2), sqrt(2), 0)); - } -}); - -const p1 = root['~unstable'].withCompute(f1).createPipeline(); -p1.dispatchWorkgroups(1); -const samples1 = await b.read(); - -const f2 = tgpu['~unstable'].computeFn({ - in: { gid: d.builtin.globalInvocationId }, - workgroupSize: [1], -})((input) => { - randf.seed2(d.vec2f(input.gid.xy)); - bView.$[input.gid.x * d.u32(sqrt(count)) + input.gid.y] = randf - .inHemisphere( - d.vec3f(sqrt(2), sqrt(2), 0), - ); -}); - -const p2 = root['~unstable'].withCompute(f2).createPipeline(); -p2.dispatchWorkgroups(d.u32(sqrt(count)), d.u32(sqrt(count))); -const samples2 = await b.read(); - -const buffer = samples1; - -for (let i = 0; i < count; i++) { - ids[i] = i; - positionsX[i] = buffer[i].x; - positionsY[i] = buffer[i].y; - positionsZ[i] = buffer[i].z; - sizes[i] = 0.17; - dists[i] = Math.sqrt( - (positionsX[i]) ** 2 + (positionsY[i]) ** 2 + - (positionsZ[i]) ** 2, - ); -} - -// Palette -const palette = MorphCharts.Helpers.PaletteHelper.resample( - core.paletteResources.palettes[ - MorphCharts.PaletteName.blues - ].colors, - 16, - false, -); - -// Transition buffer -const transitionBuffer = core.renderer.createTransitionBuffer(ids); -core.renderer.transitionBuffers = [transitionBuffer]; -transitionBuffer.currentBuffer.unitType = MorphCharts.UnitType.sphere; -transitionBuffer.currentPalette.colors = palette; - -// Layout -const scatter = new MorphCharts.Layouts.Scatter(core); -scatter.layout(transitionBuffer.currentBuffer, ids, { - positionsX: positionsX, - positionsY: positionsY, - positionsZ: positionsZ, -}); -scatter.update(transitionBuffer.currentBuffer, ids, { - sizes: sizes, - sizeScaling: 0.1, - colors: dists, -}); - -// Axes -const axes = MorphCharts.Axes.Cartesian3dAxesHelper.create( - core, - { - titleX: 'x', - titleY: 'y', - titleZ: 'z', - labelsX: (value) => { - return value.toFixed(1); - }, - minValueX: -1, - minValueY: -1, - // minValueZ: -1, - labelsY: (value) => { - return value.toFixed(1); - }, - labelsZ: (value) => { - return value.toFixed(1); - }, - }, -); -core.renderer.currentAxes = [ - core.renderer.createCartesian3dAxesVisual(axes), -]; - -// Alt-azimuth camera -const camera = core.camera; -camera.setPosition([0, 0, 0.2], false); diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/meta.json b/apps/typegpu-docs/src/content/examples/simple/probability/meta.json deleted file mode 100644 index f7fbf8446..000000000 --- a/apps/typegpu-docs/src/content/examples/simple/probability/meta.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "title": "Probability", - "category": "simple", - "tags": ["experimental"] -} diff --git a/packages/typegpu-noise/src/random.ts b/packages/typegpu-noise/src/random.ts index 0a356d522..93c550b3e 100644 --- a/packages/typegpu-noise/src/random.ts +++ b/packages/typegpu-noise/src/random.ts @@ -46,9 +46,9 @@ export const randFloat01: TgpuFn<() => d.F32> = tgpu export const randInUnitCube: TgpuFn<() => d.Vec3f> = tgpu .fn([], d.vec3f)(() => d.vec3f( - randomGeneratorSlot.value.sample() * 2 - 1, - randomGeneratorSlot.value.sample() * 2 - 1, - randomGeneratorSlot.value.sample() * 2 - 1, + randomGeneratorSlot.value.sample(), + randomGeneratorSlot.value.sample(), + randomGeneratorSlot.value.sample(), ) ); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 99579c3e5..e33736d54 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -119,6 +119,9 @@ importers: '@astrojs/check': specifier: ^0.9.4 version: 0.9.4(prettier@3.5.3)(typescript@5.8.3) + '@astrojs/mdx': + specifier: ^4.3.3 + version: 4.3.3(astro@5.12.3(@types/node@24.1.0)(jiti@2.4.2)(lightningcss@1.30.1)(rollup@4.34.8)(tsx@4.19.3)(typescript@5.8.3)(yaml@2.8.0)) '@astrojs/react': specifier: ^4.3.0 version: 4.3.0(@types/node@24.1.0)(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(jiti@2.4.2)(lightningcss@1.30.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(tsx@4.19.3)(yaml@2.8.0) @@ -644,6 +647,9 @@ packages: '@astrojs/internal-helpers@0.6.1': resolution: {integrity: sha512-l5Pqf6uZu31aG+3Lv8nl/3s4DbUzdlxTWDof4pEpto6GUJNhhCbelVi9dEyurOVyqaelwmS9oSyOWOENSfgo9A==} + '@astrojs/internal-helpers@0.7.1': + resolution: {integrity: sha512-7dwEVigz9vUWDw3nRwLQ/yH/xYovlUA0ZD86xoeKEBmkz9O6iELG1yri67PgAPW6VLL/xInA4t7H0CK6VmtkKQ==} + '@astrojs/language-server@2.15.4': resolution: {integrity: sha512-JivzASqTPR2bao9BWsSc/woPHH7OGSGc9aMxXL4U6egVTqBycB3ZHdBJPuOCVtcGLrzdWTosAqVPz1BVoxE0+A==} hasBin: true @@ -665,9 +671,12 @@ packages: '@astrojs/markdown-remark@6.3.3': resolution: {integrity: sha512-DDRtD1sPvAuA7ms2btc9A7/7DApKqgLMNrE6kh5tmkfy8utD0Z738gqd3p5aViYYdUtHIyEJ1X4mCMxfCfu15w==} - '@astrojs/mdx@4.2.6': - resolution: {integrity: sha512-0i/GmOm6d0qq1/SCfcUgY/IjDc/bS0i42u7h85TkPFBmlFOcBZfkYhR5iyz6hZLwidvJOEq5yGfzt9B1Azku4w==} - engines: {node: ^18.17.1 || ^20.3.0 || >=22.0.0} + '@astrojs/markdown-remark@6.3.5': + resolution: {integrity: sha512-MiR92CkE2BcyWf3b86cBBw/1dKiOH0qhLgXH2OXA6cScrrmmks1Rr4Tl0p/lFpvmgQQrP54Pd1uidJfmxGrpWQ==} + + '@astrojs/mdx@4.3.3': + resolution: {integrity: sha512-+9+xGP2TBXxcm84cpiq4S9JbuHOHM1fcvREfqW7VHxlUyfUQPByoJ9YYliqHkLS6BMzG+O/+o7n8nguVhuEv4w==} + engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0} peerDependencies: astro: ^5.0.0 @@ -6154,6 +6163,8 @@ snapshots: '@astrojs/internal-helpers@0.6.1': {} + '@astrojs/internal-helpers@0.7.1': {} + '@astrojs/language-server@2.15.4(prettier@3.5.3)(typescript@5.8.3)': dependencies: '@astrojs/compiler': 2.12.2 @@ -6257,9 +6268,35 @@ snapshots: transitivePeerDependencies: - supports-color - '@astrojs/mdx@4.2.6(astro@5.12.3(@types/node@24.1.0)(jiti@2.4.2)(lightningcss@1.30.1)(rollup@4.34.8)(tsx@4.19.3)(typescript@5.8.3)(yaml@2.8.0))': + '@astrojs/markdown-remark@6.3.5': dependencies: - '@astrojs/markdown-remark': 6.3.1 + '@astrojs/internal-helpers': 0.7.1 + '@astrojs/prism': 3.3.0 + github-slugger: 2.0.0 + hast-util-from-html: 2.0.3 + hast-util-to-text: 4.0.2 + import-meta-resolve: 4.1.0 + js-yaml: 4.1.0 + mdast-util-definitions: 6.0.0 + rehype-raw: 7.0.0 + rehype-stringify: 10.0.1 + remark-gfm: 4.0.1 + remark-parse: 11.0.0 + remark-rehype: 11.1.2 + remark-smartypants: 3.0.2 + shiki: 3.8.0 + smol-toml: 1.4.1 + unified: 11.0.5 + unist-util-remove-position: 5.0.0 + unist-util-visit: 5.0.0 + unist-util-visit-parents: 6.0.1 + vfile: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@astrojs/mdx@4.3.3(astro@5.12.3(@types/node@24.1.0)(jiti@2.4.2)(lightningcss@1.30.1)(rollup@4.34.8)(tsx@4.19.3)(typescript@5.8.3)(yaml@2.8.0))': + dependencies: + '@astrojs/markdown-remark': 6.3.5 '@mdx-js/mdx': 3.1.0(acorn@8.15.0) acorn: 8.15.0 astro: 5.12.3(@types/node@24.1.0)(jiti@2.4.2)(lightningcss@1.30.1)(rollup@4.34.8)(tsx@4.19.3)(typescript@5.8.3)(yaml@2.8.0) @@ -6326,7 +6363,7 @@ snapshots: '@astrojs/starlight@0.35.1(astro@5.12.3(@types/node@24.1.0)(jiti@2.4.2)(lightningcss@1.30.1)(rollup@4.34.8)(tsx@4.19.3)(typescript@5.8.3)(yaml@2.8.0))': dependencies: '@astrojs/markdown-remark': 6.3.2 - '@astrojs/mdx': 4.2.6(astro@5.12.3(@types/node@24.1.0)(jiti@2.4.2)(lightningcss@1.30.1)(rollup@4.34.8)(tsx@4.19.3)(typescript@5.8.3)(yaml@2.8.0)) + '@astrojs/mdx': 4.3.3(astro@5.12.3(@types/node@24.1.0)(jiti@2.4.2)(lightningcss@1.30.1)(rollup@4.34.8)(tsx@4.19.3)(typescript@5.8.3)(yaml@2.8.0)) '@astrojs/sitemap': 3.4.1 '@pagefind/default-ui': 1.3.0 '@types/hast': 3.0.4 @@ -11364,7 +11401,7 @@ snapshots: starlight-blog@0.23.2(@astrojs/starlight@0.35.1(astro@5.12.3(@types/node@24.1.0)(jiti@2.4.2)(lightningcss@1.30.1)(rollup@4.34.8)(tsx@4.19.3)(typescript@5.8.3)(yaml@2.8.0)))(astro@5.12.3(@types/node@24.1.0)(jiti@2.4.2)(lightningcss@1.30.1)(rollup@4.34.8)(tsx@4.19.3)(typescript@5.8.3)(yaml@2.8.0)): dependencies: '@astrojs/markdown-remark': 6.3.1 - '@astrojs/mdx': 4.2.6(astro@5.12.3(@types/node@24.1.0)(jiti@2.4.2)(lightningcss@1.30.1)(rollup@4.34.8)(tsx@4.19.3)(typescript@5.8.3)(yaml@2.8.0)) + '@astrojs/mdx': 4.3.3(astro@5.12.3(@types/node@24.1.0)(jiti@2.4.2)(lightningcss@1.30.1)(rollup@4.34.8)(tsx@4.19.3)(typescript@5.8.3)(yaml@2.8.0)) '@astrojs/rss': 4.0.11 '@astrojs/starlight': 0.35.1(astro@5.12.3(@types/node@24.1.0)(jiti@2.4.2)(lightningcss@1.30.1)(rollup@4.34.8)(tsx@4.19.3)(typescript@5.8.3)(yaml@2.8.0)) astro-remote: 0.3.3 From 7ec72e8ab8c96b551537a8fda1185f06891b4261 Mon Sep 17 00:00:00 2001 From: Szymon Szulc Date: Wed, 13 Aug 2025 14:06:05 +0200 Subject: [PATCH 10/64] Restored old pnpm lock file --- pnpm-lock.yaml | 199 ++----------------------------------------------- 1 file changed, 8 insertions(+), 191 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e33736d54..d44a14dcf 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -106,7 +106,7 @@ importers: devDependencies: '@types/bun': specifier: latest - version: 1.2.20(@types/react@19.1.8) + version: 1.2.19(@types/react@19.1.8) apps/infra-benchmarks: devDependencies: @@ -119,9 +119,6 @@ importers: '@astrojs/check': specifier: ^0.9.4 version: 0.9.4(prettier@3.5.3)(typescript@5.8.3) - '@astrojs/mdx': - specifier: ^4.3.3 - version: 4.3.3(astro@5.12.3(@types/node@24.1.0)(jiti@2.4.2)(lightningcss@1.30.1)(rollup@4.34.8)(tsx@4.19.3)(typescript@5.8.3)(yaml@2.8.0)) '@astrojs/react': specifier: ^4.3.0 version: 4.3.0(@types/node@24.1.0)(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(jiti@2.4.2)(lightningcss@1.30.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(tsx@4.19.3)(yaml@2.8.0) @@ -194,9 +191,6 @@ importers: fuse.js: specifier: catalog:frontend version: 7.1.0 - install: - specifier: ^0.13.0 - version: 0.13.0 jotai: specifier: ^2.12.5 version: 2.12.5(@types/react@19.1.8)(react@19.1.0) @@ -224,12 +218,6 @@ importers: react-dom: specifier: ^19.1.0 version: 19.1.0(react@19.1.0) - rehype-katex: - specifier: ^7.0.1 - version: 7.0.1 - remark-math: - specifier: ^6.0.0 - version: 6.0.0 remeda: specifier: ^2.21.2 version: 2.21.2 @@ -291,9 +279,6 @@ importers: autoprefixer: specifier: ^10.4.21 version: 10.4.21(postcss@8.5.3) - morphcharts: - specifier: ^1.3.2 - version: 1.3.2 tailwindcss: specifier: ^4.1.11 version: 4.1.11 @@ -647,9 +632,6 @@ packages: '@astrojs/internal-helpers@0.6.1': resolution: {integrity: sha512-l5Pqf6uZu31aG+3Lv8nl/3s4DbUzdlxTWDof4pEpto6GUJNhhCbelVi9dEyurOVyqaelwmS9oSyOWOENSfgo9A==} - '@astrojs/internal-helpers@0.7.1': - resolution: {integrity: sha512-7dwEVigz9vUWDw3nRwLQ/yH/xYovlUA0ZD86xoeKEBmkz9O6iELG1yri67PgAPW6VLL/xInA4t7H0CK6VmtkKQ==} - '@astrojs/language-server@2.15.4': resolution: {integrity: sha512-JivzASqTPR2bao9BWsSc/woPHH7OGSGc9aMxXL4U6egVTqBycB3ZHdBJPuOCVtcGLrzdWTosAqVPz1BVoxE0+A==} hasBin: true @@ -671,12 +653,9 @@ packages: '@astrojs/markdown-remark@6.3.3': resolution: {integrity: sha512-DDRtD1sPvAuA7ms2btc9A7/7DApKqgLMNrE6kh5tmkfy8utD0Z738gqd3p5aViYYdUtHIyEJ1X4mCMxfCfu15w==} - '@astrojs/markdown-remark@6.3.5': - resolution: {integrity: sha512-MiR92CkE2BcyWf3b86cBBw/1dKiOH0qhLgXH2OXA6cScrrmmks1Rr4Tl0p/lFpvmgQQrP54Pd1uidJfmxGrpWQ==} - - '@astrojs/mdx@4.3.3': - resolution: {integrity: sha512-+9+xGP2TBXxcm84cpiq4S9JbuHOHM1fcvREfqW7VHxlUyfUQPByoJ9YYliqHkLS6BMzG+O/+o7n8nguVhuEv4w==} - engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0} + '@astrojs/mdx@4.2.6': + resolution: {integrity: sha512-0i/GmOm6d0qq1/SCfcUgY/IjDc/bS0i42u7h85TkPFBmlFOcBZfkYhR5iyz6hZLwidvJOEq5yGfzt9B1Azku4w==} + engines: {node: ^18.17.1 || ^20.3.0 || >=22.0.0} peerDependencies: astro: ^5.0.0 @@ -2509,9 +2488,6 @@ packages: '@types/bun@1.2.19': resolution: {integrity: sha512-d9ZCmrH3CJ2uYKXQIUuZ/pUnTqIvLDS0SK7pFmbx8ma+ziH/FRMoAq5bYpRG7y+w1gl+HgyNZbtqgMq4W4e2Lg==} - '@types/bun@1.2.20': - resolution: {integrity: sha512-dX3RGzQ8+KgmMw7CsW4xT5ITBSCrSbfHc36SNT31EOUg/LA9JWq0VDdEXDRSe1InVWpd2yLUM1FUF/kEOyTzYA==} - '@types/chai@5.2.2': resolution: {integrity: sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==} @@ -2551,9 +2527,6 @@ packages: '@types/js-yaml@4.0.9': resolution: {integrity: sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==} - '@types/katex@0.16.7': - resolution: {integrity: sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ==} - '@types/mdast@4.0.4': resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} @@ -2607,9 +2580,6 @@ packages: '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} - '@types/webxr@0.4.0': - resolution: {integrity: sha512-LQvrACV3Pj17GpkwHwXuTd733gfY+D7b9mKdrTmLdO7vo7P/o6209Qqtk63y/FCv/lspdmi0pWz6Qe/ull9kQg==} - '@typescript/analyze-trace@0.10.1': resolution: {integrity: sha512-RnlSOPh14QbopGCApgkSx5UBgGda5MX1cHqp2fsqfiDyCwGL/m1jaeB9fzu7didVS81LQqGZZuxFBcg8YU8EVw==} hasBin: true @@ -2901,11 +2871,6 @@ packages: peerDependencies: '@types/react': ^19 - bun-types@1.2.20: - resolution: {integrity: sha512-pxTnQYOrKvdOwyiyd/7sMt9yFOenN004Y6O4lCcCUoKVej48FS5cvTw9geRaEcB9TsDZaJKAxPTVvi8tFsVuXA==} - peerDependencies: - '@types/react': ^19 - bundle-require@5.1.0: resolution: {integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -3050,10 +3015,6 @@ packages: resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} engines: {node: '>= 10'} - commander@8.3.0: - resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} - engines: {node: '>= 12'} - common-ancestor-path@1.0.1: resolution: {integrity: sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==} @@ -3630,9 +3591,6 @@ packages: github-slugger@2.0.0: resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} - gl-matrix@3.4.4: - resolution: {integrity: sha512-latSnyDNt/8zYUB6VIJ6PCh2jBjJX6gnDsoCZ7LyW7GkqrD51EWwa9qCoGixj8YqBtETQK/xY7OmpTF8xz1DdQ==} - glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -3674,12 +3632,6 @@ packages: hast-util-format@1.1.0: resolution: {integrity: sha512-yY1UDz6bC9rDvCWHpx12aIBGRG7krurX0p0Fm6pT547LwDIZZiNr8a+IHDogorAdreULSEzP82Nlv5SZkHZcjA==} - hast-util-from-dom@5.0.1: - resolution: {integrity: sha512-N+LqofjR2zuzTjCPzyDUdSshy4Ma6li7p/c3pA78uTwzFgENbgbUrm2ugwsOdcjI1muO+o6Dgzp9p8WHtn/39Q==} - - hast-util-from-html-isomorphic@2.0.0: - resolution: {integrity: sha512-zJfpXq44yff2hmE0XmwEOzdWin5xwH+QIhMLOScpX91e/NSGPsAzNCvLQDIEPyO2TXi+lBmU6hjLIhV8MwP2kw==} - hast-util-from-html@2.0.3: resolution: {integrity: sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==} @@ -3786,10 +3738,6 @@ packages: inline-style-parser@0.2.4: resolution: {integrity: sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==} - install@0.13.0: - resolution: {integrity: sha512-zDml/jzr2PKU9I8J/xyZBQn8rPCAY//UOYNmR01XwNwyfhEWObo2SWfSl1+0tm1u6PhxLwDnfsT/6jB7OUxqFA==} - engines: {node: '>= 0.10'} - internmap@2.0.3: resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} engines: {node: '>=12'} @@ -3981,10 +3929,6 @@ packages: engines: {node: '>=10'} hasBin: true - katex@0.16.22: - resolution: {integrity: sha512-XCHRdUw4lf3SKBaJe4EvgqIuWwkPSo9XoeO8GjQW94Bp7TWv9hNhzZjZ+OH9yf1UmLygb7DIT5GSFQiyt16zYg==} - hasBin: true - kleur@3.0.3: resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} engines: {node: '>=6'} @@ -4205,9 +4149,6 @@ packages: mdast-util-gfm@3.1.0: resolution: {integrity: sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==} - mdast-util-math@3.0.0: - resolution: {integrity: sha512-Tl9GBNeG/AhJnQM221bJR2HPvLOSnLE/T9cJI9tlc6zwQk2nPk/4f0cHkOdEixQPC/j8UtKDdITswvLAy1OZ1w==} - mdast-util-mdx-expression@2.0.1: resolution: {integrity: sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==} @@ -4275,9 +4216,6 @@ packages: micromark-extension-gfm@3.0.0: resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} - micromark-extension-math@3.1.0: - resolution: {integrity: sha512-lvEqd+fHjATVs+2v/8kg9i5Q0AP2k85H0WUOwpIVvUML8BapsMvh1XAogmQjOCsLpoKRCVQqEkQBB3NhVBcsOg==} - micromark-extension-mdx-expression@3.0.0: resolution: {integrity: sha512-sI0nwhUDz97xyzqJAbHQhp5TfaxEvZZZ2JDqUo+7NvyIYG6BZ5CPPqj2ogUoPJlmXHBnyZUzISg9+oUmU6tUjQ==} @@ -4418,9 +4356,6 @@ packages: moo@0.5.2: resolution: {integrity: sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q==} - morphcharts@1.3.2: - resolution: {integrity: sha512-0T34Aryx8a6p0hzOzKu4x/3cK9NBoq4+59fOapEt3Iy8mpQpVg3KiicKroZRfOyaz4gNPvgK9DG/Q37Ecgf2ig==} - motion-dom@12.23.7: resolution: {integrity: sha512-AyJR07/YxObtK3NyGLCfebUe0k9UZGhik+2eIPUoKz76cKRRSkMeifmIxfztIvOaKb/Smu9IfVHkmx+mV+iFmQ==} @@ -5035,9 +4970,6 @@ packages: rehype-format@5.0.1: resolution: {integrity: sha512-zvmVru9uB0josBVpr946OR8ui7nJEdzZobwLOOqHb/OOD88W0Vk2SqLwoVOj0fM6IPCCO6TaV9CvQvJMWwukFQ==} - rehype-katex@7.0.1: - resolution: {integrity: sha512-OiM2wrZ/wuhKkigASodFoo8wimG3H12LWQaH8qSPVJn9apWKFSH3YOCtbKpBorTVw/eI7cuT21XBbvwEswbIOA==} - rehype-parse@9.0.1: resolution: {integrity: sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag==} @@ -5059,9 +4991,6 @@ packages: remark-gfm@4.0.1: resolution: {integrity: sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==} - remark-math@6.0.0: - resolution: {integrity: sha512-MMqgnP74Igy+S3WwnhQ7kqGlEerTETXMvJhrUzDikVZ2/uogJCb+WHUg97hK9/jcfc0dkD73s3LN8zU49cTEtA==} - remark-mdx@3.1.0: resolution: {integrity: sha512-Ngl/H3YXyBV9RcRNdlYsZujAmhsxwzxpDzpDEhFBVAGthS4GDgnctpDjgFl/ULx5UEDzqtW1cyBSNKqYYrqLBA==} @@ -6163,8 +6092,6 @@ snapshots: '@astrojs/internal-helpers@0.6.1': {} - '@astrojs/internal-helpers@0.7.1': {} - '@astrojs/language-server@2.15.4(prettier@3.5.3)(typescript@5.8.3)': dependencies: '@astrojs/compiler': 2.12.2 @@ -6268,35 +6195,9 @@ snapshots: transitivePeerDependencies: - supports-color - '@astrojs/markdown-remark@6.3.5': - dependencies: - '@astrojs/internal-helpers': 0.7.1 - '@astrojs/prism': 3.3.0 - github-slugger: 2.0.0 - hast-util-from-html: 2.0.3 - hast-util-to-text: 4.0.2 - import-meta-resolve: 4.1.0 - js-yaml: 4.1.0 - mdast-util-definitions: 6.0.0 - rehype-raw: 7.0.0 - rehype-stringify: 10.0.1 - remark-gfm: 4.0.1 - remark-parse: 11.0.0 - remark-rehype: 11.1.2 - remark-smartypants: 3.0.2 - shiki: 3.8.0 - smol-toml: 1.4.1 - unified: 11.0.5 - unist-util-remove-position: 5.0.0 - unist-util-visit: 5.0.0 - unist-util-visit-parents: 6.0.1 - vfile: 6.0.3 - transitivePeerDependencies: - - supports-color - - '@astrojs/mdx@4.3.3(astro@5.12.3(@types/node@24.1.0)(jiti@2.4.2)(lightningcss@1.30.1)(rollup@4.34.8)(tsx@4.19.3)(typescript@5.8.3)(yaml@2.8.0))': + '@astrojs/mdx@4.2.6(astro@5.12.3(@types/node@24.1.0)(jiti@2.4.2)(lightningcss@1.30.1)(rollup@4.34.8)(tsx@4.19.3)(typescript@5.8.3)(yaml@2.8.0))': dependencies: - '@astrojs/markdown-remark': 6.3.5 + '@astrojs/markdown-remark': 6.3.1 '@mdx-js/mdx': 3.1.0(acorn@8.15.0) acorn: 8.15.0 astro: 5.12.3(@types/node@24.1.0)(jiti@2.4.2)(lightningcss@1.30.1)(rollup@4.34.8)(tsx@4.19.3)(typescript@5.8.3)(yaml@2.8.0) @@ -6363,7 +6264,7 @@ snapshots: '@astrojs/starlight@0.35.1(astro@5.12.3(@types/node@24.1.0)(jiti@2.4.2)(lightningcss@1.30.1)(rollup@4.34.8)(tsx@4.19.3)(typescript@5.8.3)(yaml@2.8.0))': dependencies: '@astrojs/markdown-remark': 6.3.2 - '@astrojs/mdx': 4.3.3(astro@5.12.3(@types/node@24.1.0)(jiti@2.4.2)(lightningcss@1.30.1)(rollup@4.34.8)(tsx@4.19.3)(typescript@5.8.3)(yaml@2.8.0)) + '@astrojs/mdx': 4.2.6(astro@5.12.3(@types/node@24.1.0)(jiti@2.4.2)(lightningcss@1.30.1)(rollup@4.34.8)(tsx@4.19.3)(typescript@5.8.3)(yaml@2.8.0)) '@astrojs/sitemap': 3.4.1 '@pagefind/default-ui': 1.3.0 '@types/hast': 3.0.4 @@ -7936,12 +7837,6 @@ snapshots: transitivePeerDependencies: - '@types/react' - '@types/bun@1.2.20(@types/react@19.1.8)': - dependencies: - bun-types: 1.2.20(@types/react@19.1.8) - transitivePeerDependencies: - - '@types/react' - '@types/chai@5.2.2': dependencies: '@types/deep-eql': 4.0.2 @@ -7981,8 +7876,6 @@ snapshots: '@types/js-yaml@4.0.9': {} - '@types/katex@0.16.7': {} - '@types/mdast@4.0.4': dependencies: '@types/unist': 3.0.3 @@ -8031,8 +7924,6 @@ snapshots: '@types/unist@3.0.3': {} - '@types/webxr@0.4.0': {} - '@typescript/analyze-trace@0.10.1': dependencies: chalk: 4.1.2 @@ -8496,11 +8387,6 @@ snapshots: '@types/node': 24.1.0 '@types/react': 19.1.8 - bun-types@1.2.20(@types/react@19.1.8): - dependencies: - '@types/node': 24.1.0 - '@types/react': 19.1.8 - bundle-require@5.1.0(esbuild@0.25.6): dependencies: esbuild: 0.25.6 @@ -8621,8 +8507,6 @@ snapshots: commander@7.2.0: {} - commander@8.3.0: {} - common-ancestor-path@1.0.1: {} commondir@1.0.1: {} @@ -9304,8 +9188,6 @@ snapshots: github-slugger@2.0.0: {} - gl-matrix@3.4.4: {} - glob-parent@5.1.2: dependencies: is-glob: 4.0.3 @@ -9368,19 +9250,6 @@ snapshots: html-whitespace-sensitive-tag-names: 3.0.1 unist-util-visit-parents: 6.0.1 - hast-util-from-dom@5.0.1: - dependencies: - '@types/hast': 3.0.4 - hastscript: 9.0.1 - web-namespaces: 2.0.1 - - hast-util-from-html-isomorphic@2.0.0: - dependencies: - '@types/hast': 3.0.4 - hast-util-from-dom: 5.0.1 - hast-util-from-html: 2.0.3 - unist-util-remove-position: 5.0.0 - hast-util-from-html@2.0.3: dependencies: '@types/hast': 3.0.4 @@ -9592,8 +9461,6 @@ snapshots: inline-style-parser@0.2.4: {} - install@0.13.0: {} - internmap@2.0.3: {} interval-tree-1d@1.0.4: @@ -9741,10 +9608,6 @@ snapshots: jsonparse: 1.3.1 through2: 4.0.2 - katex@0.16.22: - dependencies: - commander: 8.3.0 - kleur@3.0.3: {} kleur@4.1.5: {} @@ -9992,18 +9855,6 @@ snapshots: transitivePeerDependencies: - supports-color - mdast-util-math@3.0.0: - dependencies: - '@types/hast': 3.0.4 - '@types/mdast': 4.0.4 - devlop: 1.1.0 - longest-streak: 3.1.0 - mdast-util-from-markdown: 2.0.2 - mdast-util-to-markdown: 2.1.2 - unist-util-remove-position: 5.0.0 - transitivePeerDependencies: - - supports-color - mdast-util-mdx-expression@2.0.1: dependencies: '@types/estree-jsx': 1.0.5 @@ -10183,16 +10034,6 @@ snapshots: micromark-util-combine-extensions: 2.0.1 micromark-util-types: 2.0.2 - micromark-extension-math@3.1.0: - dependencies: - '@types/katex': 0.16.7 - devlop: 1.1.0 - katex: 0.16.22 - micromark-factory-space: 2.0.1 - micromark-util-character: 2.1.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - micromark-extension-mdx-expression@3.0.0: dependencies: '@types/estree': 1.0.8 @@ -10436,11 +10277,6 @@ snapshots: moo@0.5.2: {} - morphcharts@1.3.2: - dependencies: - '@types/webxr': 0.4.0 - gl-matrix: 3.4.4 - motion-dom@12.23.7: dependencies: motion-utils: 12.23.6 @@ -11052,16 +10888,6 @@ snapshots: '@types/hast': 3.0.4 hast-util-format: 1.1.0 - rehype-katex@7.0.1: - dependencies: - '@types/hast': 3.0.4 - '@types/katex': 0.16.7 - hast-util-from-html-isomorphic: 2.0.0 - hast-util-to-text: 4.0.2 - katex: 0.16.22 - unist-util-visit-parents: 6.0.1 - vfile: 6.0.3 - rehype-parse@9.0.1: dependencies: '@types/hast': 3.0.4 @@ -11115,15 +10941,6 @@ snapshots: transitivePeerDependencies: - supports-color - remark-math@6.0.0: - dependencies: - '@types/mdast': 4.0.4 - mdast-util-math: 3.0.0 - micromark-extension-math: 3.1.0 - unified: 11.0.5 - transitivePeerDependencies: - - supports-color - remark-mdx@3.1.0: dependencies: mdast-util-mdx: 3.0.0 @@ -11401,7 +11218,7 @@ snapshots: starlight-blog@0.23.2(@astrojs/starlight@0.35.1(astro@5.12.3(@types/node@24.1.0)(jiti@2.4.2)(lightningcss@1.30.1)(rollup@4.34.8)(tsx@4.19.3)(typescript@5.8.3)(yaml@2.8.0)))(astro@5.12.3(@types/node@24.1.0)(jiti@2.4.2)(lightningcss@1.30.1)(rollup@4.34.8)(tsx@4.19.3)(typescript@5.8.3)(yaml@2.8.0)): dependencies: '@astrojs/markdown-remark': 6.3.1 - '@astrojs/mdx': 4.3.3(astro@5.12.3(@types/node@24.1.0)(jiti@2.4.2)(lightningcss@1.30.1)(rollup@4.34.8)(tsx@4.19.3)(typescript@5.8.3)(yaml@2.8.0)) + '@astrojs/mdx': 4.2.6(astro@5.12.3(@types/node@24.1.0)(jiti@2.4.2)(lightningcss@1.30.1)(rollup@4.34.8)(tsx@4.19.3)(typescript@5.8.3)(yaml@2.8.0)) '@astrojs/rss': 4.0.11 '@astrojs/starlight': 0.35.1(astro@5.12.3(@types/node@24.1.0)(jiti@2.4.2)(lightningcss@1.30.1)(rollup@4.34.8)(tsx@4.19.3)(typescript@5.8.3)(yaml@2.8.0)) astro-remote: 0.3.3 From f086faa6dc9b67c17a42fa8eaad69e12050f8388 Mon Sep 17 00:00:00 2001 From: Szymon Szulc Date: Wed, 13 Aug 2025 14:06:05 +0200 Subject: [PATCH 11/64] Restored old pnpm lock file --- apps/typegpu-docs/package.json | 5 ----- 1 file changed, 5 deletions(-) diff --git a/apps/typegpu-docs/package.json b/apps/typegpu-docs/package.json index 1d4c04897..7a3e4a061 100644 --- a/apps/typegpu-docs/package.json +++ b/apps/typegpu-docs/package.json @@ -10,7 +10,6 @@ }, "dependencies": { "@astrojs/check": "^0.9.4", - "@astrojs/mdx": "^4.3.3", "@astrojs/react": "^4.3.0", "@astrojs/sitemap": "^3.4.1", "@astrojs/starlight": "^0.35.1", @@ -35,7 +34,6 @@ "classnames": "^2.5.1", "expressive-code-twoslash": "^0.5.3", "fuse.js": "catalog:frontend", - "install": "^0.13.0", "jotai": "^2.12.5", "jotai-location": "^0.6.1", "lucide-react": "^0.536.0", @@ -45,8 +43,6 @@ "pathe": "^2.0.3", "react": "^19.1.0", "react-dom": "^19.1.0", - "rehype-katex": "^7.0.1", - "remark-math": "^6.0.0", "remeda": "^2.21.2", "sharp": "^0.34.2", "starlight-blog": "^0.23.2", @@ -69,7 +65,6 @@ "@webgpu/types": "catalog:types", "astro-vtbot": "^2.1.6", "autoprefixer": "^10.4.21", - "morphcharts": "^1.3.2", "tailwindcss": "^4.1.11", "tailwindcss-motion": "^1.1.1", "vite-imagetools": "catalog:frontend", From f27fdb1f7ae3a6407f2a76a56a616881c391a0a6 Mon Sep 17 00:00:00 2001 From: Szymon Szulc Date: Wed, 13 Aug 2025 21:42:32 +0200 Subject: [PATCH 12/64] typos --- .../src/content/docs/ecosystem/typegpu-noise.mdx | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/apps/typegpu-docs/src/content/docs/ecosystem/typegpu-noise.mdx b/apps/typegpu-docs/src/content/docs/ecosystem/typegpu-noise.mdx index da768a45e..d3c27238b 100644 --- a/apps/typegpu-docs/src/content/docs/ecosystem/typegpu-noise.mdx +++ b/apps/typegpu-docs/src/content/docs/ecosystem/typegpu-noise.mdx @@ -2,7 +2,6 @@ title: "@typegpu/noise" --- - The `@typegpu/noise` package offers a set of pseudo-random utilities for use in TypeGPU and WebGPU projects. At its core, the package provides a pseudo-random number generator for uniformly distributed values (same probability for all numbers) in the range `[0, 1)`, as well as higher-level utilities built on top. @@ -104,20 +103,20 @@ const main = tgpu['~unstable'].fragmentFn({ There are higher-level utilities built on top of `randf.sample`: ### Discrete -- `bernoulli` - returns 1 with probability `p`, 0 otherwise. You can think of it as a flip of a biased coin. `p` has to be in range `[0, 1]` +- `bernoulli` - returns 1 with probability `p`, and 0 otherwise. You can think of it as the flip of a biased coin. `p` must be in the range `[0, 1]` ### Continuous -- `exponential` - returns a number using the exponential distribution with given `rate`. `rate` has to be `> 0`. Commonly used for modeling time until an event -- `normal` - returns a number using the normal (Gaussian) distribution with given mean (`mu`) and standard devation (`sigma`). `sigma` has to be `>= 0` -- `cauchy` - returns a number using the Cauchy distribution with given origin point (`x0`, `gamma`). `gamma` has to `>=0` +- `exponential` - returns a number based on the exponential distribution with a given `rate`. The `rate` must be greater than 0. It is commonly used for modeling the time until an event occurs +- `normal` - returns a number based on the normal (Gaussian) distribution with a given mean (`mu`) and standard deviation (`sigma`). `sigma` must be `>= 0` +- `cauchy` - returns a number based on the Cauchy distribution with a given origin point (`x0`) and scale parameter (`gamma`). `gamma` must be `>= 0` ### Geometric - `inUnitCircle` - returns a random 2D vector uniformly distributed inside a unit circle - `onUnitCircle` - returns a random 2D vector uniformly distributed on the perimeter of a unit circle - `inUnitCube` - returns a random 3D vector uniformly distributed inside a unit cube -- `onUnitCube` - returns a random 3D vector uniformly distributed on the surface of the a cube -- `inHemisphere` - returns a random 3D vector uniformly distributed inside an upper hemisphere oriented accordingly to given normal vector -- `onHemisphere` - returns a random 3D vector uniformly distributed on the surface of an upper hemisphere oriented accordingly to given normal vector +- `onUnitCube` - returns a random 3D vector uniformly distributed on the surface of a unit cube +- `inHemisphere` - returns a random 3D vector uniformly distributed inside an upper hemisphere oriented according to a given normal vector +- `onHemisphere` - returns a random 3D vector uniformly distributed on the surface of an upper hemisphere oriented according to a given normal vector - `inUnitSphere` - returns a random 3D vector uniformly distributed inside a unit sphere - `onUnitSphere` - returns a random 3D vector uniformly distributed on the surface of a unit sphere From 1912024c01d310f33bd981df52e651bee734aa84 Mon Sep 17 00:00:00 2001 From: Szymon Szulc Date: Wed, 13 Aug 2025 22:18:54 +0200 Subject: [PATCH 13/64] Corrected docs --- apps/typegpu-docs/src/content/docs/ecosystem/typegpu-noise.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/typegpu-docs/src/content/docs/ecosystem/typegpu-noise.mdx b/apps/typegpu-docs/src/content/docs/ecosystem/typegpu-noise.mdx index d3c27238b..1e5cc4983 100644 --- a/apps/typegpu-docs/src/content/docs/ecosystem/typegpu-noise.mdx +++ b/apps/typegpu-docs/src/content/docs/ecosystem/typegpu-noise.mdx @@ -108,7 +108,7 @@ There are higher-level utilities built on top of `randf.sample`: ### Continuous - `exponential` - returns a number based on the exponential distribution with a given `rate`. The `rate` must be greater than 0. It is commonly used for modeling the time until an event occurs - `normal` - returns a number based on the normal (Gaussian) distribution with a given mean (`mu`) and standard deviation (`sigma`). `sigma` must be `>= 0` -- `cauchy` - returns a number based on the Cauchy distribution with a given origin point (`x0`) and scale parameter (`gamma`). `gamma` must be `>= 0` +- `cauchy` - returns a number based on the Cauchy distribution with a given origin point (`x0`, `gamma`). `gamma` must be `>= 0` ### Geometric - `inUnitCircle` - returns a random 2D vector uniformly distributed inside a unit circle From a6a657ae1f7ef2fbc72904ccac5882585637e6d9 Mon Sep 17 00:00:00 2001 From: Szymon Szulc Date: Thu, 14 Aug 2025 16:18:45 +0200 Subject: [PATCH 14/64] Skeleton of an example --- apps/typegpu-docs/package.json | 1 + .../content/examples/simple/probability/2d.ts | 101 ++++++++++++++++ .../examples/simple/probability/executor.ts | 93 +++++++++++++++ .../examples/simple/probability/index.html | 4 + .../examples/simple/probability/index.ts | 47 ++++++++ .../examples/simple/probability/meta.json | 5 + .../examples/simple/probability/plotter.ts | 108 ++++++++++++++++++ .../examples/simple/probability/types.ts | 18 +++ pnpm-lock.yaml | 42 ++++++- 9 files changed, 418 insertions(+), 1 deletion(-) create mode 100644 apps/typegpu-docs/src/content/examples/simple/probability/2d.ts create mode 100644 apps/typegpu-docs/src/content/examples/simple/probability/executor.ts create mode 100644 apps/typegpu-docs/src/content/examples/simple/probability/index.html create mode 100644 apps/typegpu-docs/src/content/examples/simple/probability/index.ts create mode 100644 apps/typegpu-docs/src/content/examples/simple/probability/meta.json create mode 100644 apps/typegpu-docs/src/content/examples/simple/probability/plotter.ts create mode 100644 apps/typegpu-docs/src/content/examples/simple/probability/types.ts diff --git a/apps/typegpu-docs/package.json b/apps/typegpu-docs/package.json index 7a3e4a061..273f20fb4 100644 --- a/apps/typegpu-docs/package.json +++ b/apps/typegpu-docs/package.json @@ -39,6 +39,7 @@ "lucide-react": "^0.536.0", "lz-string": "^1.5.0", "monaco-editor": "^0.52.2", + "morphcharts": "^1.3.2", "motion": "^12.23.7", "pathe": "^2.0.3", "react": "^19.1.0", diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/2d.ts b/apps/typegpu-docs/src/content/examples/simple/probability/2d.ts new file mode 100644 index 000000000..3186e1da1 --- /dev/null +++ b/apps/typegpu-docs/src/content/examples/simple/probability/2d.ts @@ -0,0 +1,101 @@ +import * as Plot from '@observablehq/plot'; + +import tgpu from 'typegpu'; +import * as d from 'typegpu/data'; +import { randf } from '@typegpu/noise'; + +const N = 10000; + +const range = Array.from( + { length: Math.round((10 - (-10)) / 0.05) + 1 }, + (_, i) => -10 + i * 0.05, +); + +const root = await tgpu.init(); +const b = root.createBuffer(d.arrayOf(d.f32, N)).$usage('storage'); +const bView = b.as('mutable'); + +const f1 = tgpu['~unstable'].computeFn({ workgroupSize: [1] })(() => { + for (let i = d.i32(0); i < d.i32(N); i++) { + bView.$[i] = randf.cauchy(0, 1); + } +}); + +const p1 = root['~unstable'].withCompute(f1).createPipeline(); +p1.dispatchWorkgroups(1); +const samples1 = (await b.read()).filter((x) => x >= -20 && x <= 20); + +const plot1 = Plot.plot({ + title: 'Cauchy(0, 1): 1 worker samples 10000 values', + y: { grid: true }, + marks: [ + Plot.rectY( + samples1, + Plot.binX( + { y: 'count' }, + { x: (d) => d, fill: 'lightblue' } as Plot.BinXInputs, + ), + ), + Plot.ruleY([0]), + ], +}); +// const plot1 = Plot.plot({ +// title: 'Bern(0.5): 1 worker samples 10000 values', +// y: { +// grid: true, +// percent: true, +// }, +// marks: [ +// Plot.barY( +// samples1, +// Plot.groupX({ y: 'proportion' }, { x: (d) => d, fill: 'lightblue' }), +// ), +// ], +// }); +const div1 = document.getElementById('hist1'); +div1?.append(plot1); + +const f2 = tgpu['~unstable'].computeFn({ + in: { gid: d.builtin.globalInvocationId }, + workgroupSize: [1], +})((input) => { + randf.seed2(d.vec2f(input.gid.xy)); + bView.$[input.gid.x * 100 + input.gid.y] = randf.bernoulli(0.5); +}); + +const p2 = root['~unstable'].withCompute(f2).createPipeline(); +p2.dispatchWorkgroups(100, 100); +const samples2 = (await b.read()).filter((x) => x >= -20 && x <= 20); + +console.log(samples1); +console.log(samples2); + +// const plot2 = Plot.plot({ +// title: 'Cauchy(0, 1): 10000 workers, each sampling 1 value with seed2(xy)', +// y: { grid: true }, +// marks: [ +// Plot.rectY( +// samples2, +// Plot.binX( +// { y: 'count' }, +// { x: (d) => d, fill: 'lightblue' } as Plot.BinXInputs, +// ), +// ), +// Plot.ruleY([0]), +// ], +// }); +const plot2 = Plot.plot({ + title: 'Bern(0.5): 10000 workers, each sampling 1 value with seed2(xy)', + y: { + grid: true, + percent: true, + }, + marks: [ + Plot.barY( + samples2, + Plot.groupX({ y: 'proportion' }, { x: (d) => d, fill: 'lightblue' }), + ), + ], +}); +const div2 = document.getElementById('hist2'); +div2?.append(plot2); diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/executor.ts b/apps/typegpu-docs/src/content/examples/simple/probability/executor.ts new file mode 100644 index 000000000..47594934c --- /dev/null +++ b/apps/typegpu-docs/src/content/examples/simple/probability/executor.ts @@ -0,0 +1,93 @@ +import tgpu from 'typegpu'; +import type { + StorageFlag, + TgpuBuffer, + TgpuComputeFn, + TgpuFn, + TgpuRoot, + TgpuSlot, +} from 'typegpu'; +import * as d from 'typegpu/data'; +import { randf } from '@typegpu/noise'; + +export class Executor { + readonly #root: TgpuRoot; + // max count 50000 + #count: number; + #sampleBuffer: + & TgpuBuffer> + & StorageFlag; + readonly #dataSingleWorkerFunc: TgpuComputeFn; + readonly #dataMoreWorkersFunc: TgpuComputeFn; + readonly #distributionSlot: TgpuSlot d.Vec3f>>; + // inaccessible type + readonly #sampleBufferSlot; + + constructor(root: TgpuRoot, count: number) { + this.#root = root; + this.#count = count; + this.#sampleBuffer = this.#root.createBuffer(d.arrayOf(d.vec3f, count)) + .$usage( + 'storage', + ); + const sampleBufferSlotTempAlias = tgpu.slot( + this.#sampleBuffer.as('mutable'), + ); + const distributionSlotTempAlias = tgpu.slot d.Vec3f>>(); + this.#sampleBufferSlot = sampleBufferSlotTempAlias; + this.#distributionSlot = distributionSlotTempAlias; + + this.#dataSingleWorkerFunc = tgpu['~unstable'].computeFn({ + workgroupSize: [1], + })(() => { + for (let i = 0; i < sampleBufferSlotTempAlias.$.length; i++) { + sampleBufferSlotTempAlias.$[i] = distributionSlotTempAlias.$(); + } + }); + + this.#dataMoreWorkersFunc = tgpu['~unstable'].computeFn({ + in: { gid: d.builtin.globalInvocationId }, + workgroupSize: [1], + })((input) => { + const gid = input.gid; + randf.seed(d.f32(gid.x)); + sampleBufferSlotTempAlias.$[gid.x] = distributionSlotTempAlias.$(); + }); + } + + set count(value: number) { + this.#count = value; + this.#sampleBuffer = this.#root.createBuffer(d.arrayOf(d.vec3f, value)) + .$usage( + 'storage', + ); + } + + async executeSingleWorker( + distribution: TgpuFn<() => d.Vec3f>, + ): Promise { + const pipeline = this.#root['~unstable'] + .with(this.#sampleBufferSlot, this.#sampleBuffer.as('mutable')) + .with(this.#distributionSlot, distribution) + .withCompute(this.#dataSingleWorkerFunc as TgpuComputeFn) + .createPipeline(); + + pipeline.dispatchWorkgroups(1); + + return await this.#sampleBuffer.read(); + } + + async executeMoreWorkers( + distribution: TgpuFn<() => d.Vec3f>, + ): Promise { + const pipeline = this.#root['~unstable'] + .with(this.#sampleBufferSlot, this.#sampleBuffer.as('mutable')) + .with(this.#distributionSlot, distribution) + .withCompute(this.#dataMoreWorkersFunc as TgpuComputeFn) + .createPipeline(); + + pipeline.dispatchWorkgroups(this.#count); + + return await this.#sampleBuffer.read(); + } +} diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/index.html b/apps/typegpu-docs/src/content/examples/simple/probability/index.html new file mode 100644 index 000000000..8d9d5a61f --- /dev/null +++ b/apps/typegpu-docs/src/content/examples/simple/probability/index.html @@ -0,0 +1,4 @@ +
+

+
+
diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/index.ts b/apps/typegpu-docs/src/content/examples/simple/probability/index.ts new file mode 100644 index 000000000..c02a689ac --- /dev/null +++ b/apps/typegpu-docs/src/content/examples/simple/probability/index.ts @@ -0,0 +1,47 @@ +import tgpu from 'typegpu'; +import { randf } from '@typegpu/noise'; +import * as d from 'typegpu/data'; + +import { Plotter } from './plotter.ts'; +import { Executor } from './executor.ts'; +import { type Distributions, PlotType } from './types.ts'; + +const root = await tgpu.init(); +const count = 10000; + +const executor = new Executor(root, count); +const plotter = new Plotter(); + +// #region Example controls & Cleanup + +export const controls = { + 'Reset camera': { onButtonClick: () => plotter.resetCamera() }, + 'Distribution': { + initial: 'onUnitSphere', + options: ['onUnitSphere', 'inUnitSphere'], + onSelectChange: async (value: Distributions) => { + let samples = undefined; + let title = undefined; + switch (value) { + case 'onUnitSphere': { + samples = await executor.executeSingleWorker(randf.onUnitSphere); + title = 'Samples on Unit Sphere'; + break; + } + case 'inUnitSphere': { + samples = await executor.executeSingleWorker(randf.inUnitSphere); + title = 'Samples in Unit Sphere'; + break; + } + } + + plotter.plot(samples, PlotType.GEOMETRIC, d.vec3f(), title); + }, + }, +}; + +export function onCleanup() { + root.destroy(); +} + +// #endregion diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/meta.json b/apps/typegpu-docs/src/content/examples/simple/probability/meta.json new file mode 100644 index 000000000..43f248244 --- /dev/null +++ b/apps/typegpu-docs/src/content/examples/simple/probability/meta.json @@ -0,0 +1,5 @@ +{ + "title": "Probability Distribution Plot", + "category": "simple", + "tags": ["experimental"] +} diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/plotter.ts b/apps/typegpu-docs/src/content/examples/simple/probability/plotter.ts new file mode 100644 index 000000000..408f67d8c --- /dev/null +++ b/apps/typegpu-docs/src/content/examples/simple/probability/plotter.ts @@ -0,0 +1,108 @@ +import * as MorphCharts from 'morphcharts'; +import { PlotType } from './types.ts'; +import type { PlotData } from './types.ts'; +import type * as d from 'typegpu/data'; + +export class Plotter { + readonly #core; + readonly #palette; + readonly #title: HTMLElement; + + constructor() { + this.#core = new MorphCharts.Core({ + container: document.getElementById('canvas') as HTMLElement, + }); + this.#core.renderer = new MorphCharts.Renderers.Basic.Main(); + this.#palette = MorphCharts.Helpers.PaletteHelper.resample( + this.#core.paletteResources.palettes[ + MorphCharts.PaletteName.blues + ].colors, + 16, + false, + ); + this.#title = document.getElementById('title') as HTMLElement; + } + + plot(samples: d.v3f[], type: PlotType, origin: d.v3f, title: string) { + const count = samples.length; + const data: PlotData = { + count, + ids: new Uint32Array(count), + positionsX: new Float64Array(count), + positionsY: new Float64Array(count), + positionsZ: new Float64Array(count), + sizes: new Float64Array(count), + dists: new Float64Array(count), + }; + + for (let i = 0; i < count; i++) { + data.ids[i] = i; + data.positionsX[i] = samples[i].x; + data.positionsY[i] = samples[i].y; + data.positionsZ[i] = samples[i].z; + data.sizes[i] = 0.17; + data.dists[i] = Math.sqrt( + (data.positionsX[i] - origin.x) ** 2 + + (data.positionsY[i] - origin.y) ** 2 + + (data.positionsZ[i] - origin.z) ** 2, + ); + } + + switch (type) { + case PlotType.GEOMETRIC: + this.#plotGeomteric(data, this.#core); + this.#title.innerText = title; + break; + default: + throw new Error(`Unsupported plot type: ${type}`); + } + + const camera = this.#core.camera; + camera.setPosition([0, 0, 0.2], false); + } + + resetCamera() { + const camera = this.#core.camera; + camera.setPosition([0, 0, 0.2], false); + } + + #plotGeomteric(data: PlotData, core: MorphCharts.Core) { + const transitionBuffer = this.#core.renderer.createTransitionBuffer( + data.ids, + ); + this.#core.renderer.transitionBuffers = [transitionBuffer]; + transitionBuffer.currentBuffer.unitType = MorphCharts.UnitType.sphere; + transitionBuffer.currentPalette.colors = this.#palette; + const scatter = new MorphCharts.Layouts.Scatter(this.#core); + scatter.layout(transitionBuffer.currentBuffer, data.ids, { + positionsX: data.positionsX, + positionsY: data.positionsY, + positionsZ: data.positionsZ, + }); + scatter.update(transitionBuffer.currentBuffer, data.ids, { + sizes: data.sizes, + sizeScaling: 0.1, + colors: data.dists, + }); + const axes = MorphCharts.Axes.Cartesian3dAxesHelper.create( + core, + { + titleX: 'x', + titleY: 'y', + titleZ: 'z', + labelsX: (value) => { + return value.toFixed(1); + }, + labelsY: (value) => { + return value.toFixed(1); + }, + labelsZ: (value) => { + return value.toFixed(1); + }, + }, + ); + core.renderer.currentAxes = [ + core.renderer.createCartesian3dAxesVisual(axes), + ]; + } +} diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/types.ts b/apps/typegpu-docs/src/content/examples/simple/probability/types.ts new file mode 100644 index 000000000..0c4993297 --- /dev/null +++ b/apps/typegpu-docs/src/content/examples/simple/probability/types.ts @@ -0,0 +1,18 @@ +// biome-ignore lint/style/useEnumInitializers: +export enum PlotType { + GEOMETRIC, + HISTOGRAM, + BAR, +} + +export interface PlotData { + count: number; + ids: Uint32Array; + positionsX: Float64Array; + positionsY: Float64Array; + positionsZ: Float64Array; + sizes: Float64Array; + dists: Float64Array; +} + +export type Distributions = 'onUnitSphere' | 'inUnitSphere'; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d44a14dcf..2845729c0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -106,7 +106,7 @@ importers: devDependencies: '@types/bun': specifier: latest - version: 1.2.19(@types/react@19.1.8) + version: 1.2.20(@types/react@19.1.8) apps/infra-benchmarks: devDependencies: @@ -206,6 +206,9 @@ importers: monaco-editor: specifier: ^0.52.2 version: 0.52.2 + morphcharts: + specifier: ^1.3.2 + version: 1.3.2 motion: specifier: ^12.23.7 version: 12.23.7(react-dom@19.1.0(react@19.1.0))(react@19.1.0) @@ -2488,6 +2491,9 @@ packages: '@types/bun@1.2.19': resolution: {integrity: sha512-d9ZCmrH3CJ2uYKXQIUuZ/pUnTqIvLDS0SK7pFmbx8ma+ziH/FRMoAq5bYpRG7y+w1gl+HgyNZbtqgMq4W4e2Lg==} + '@types/bun@1.2.20': + resolution: {integrity: sha512-dX3RGzQ8+KgmMw7CsW4xT5ITBSCrSbfHc36SNT31EOUg/LA9JWq0VDdEXDRSe1InVWpd2yLUM1FUF/kEOyTzYA==} + '@types/chai@5.2.2': resolution: {integrity: sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==} @@ -2580,6 +2586,9 @@ packages: '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + '@types/webxr@0.4.0': + resolution: {integrity: sha512-LQvrACV3Pj17GpkwHwXuTd733gfY+D7b9mKdrTmLdO7vo7P/o6209Qqtk63y/FCv/lspdmi0pWz6Qe/ull9kQg==} + '@typescript/analyze-trace@0.10.1': resolution: {integrity: sha512-RnlSOPh14QbopGCApgkSx5UBgGda5MX1cHqp2fsqfiDyCwGL/m1jaeB9fzu7didVS81LQqGZZuxFBcg8YU8EVw==} hasBin: true @@ -2871,6 +2880,11 @@ packages: peerDependencies: '@types/react': ^19 + bun-types@1.2.20: + resolution: {integrity: sha512-pxTnQYOrKvdOwyiyd/7sMt9yFOenN004Y6O4lCcCUoKVej48FS5cvTw9geRaEcB9TsDZaJKAxPTVvi8tFsVuXA==} + peerDependencies: + '@types/react': ^19 + bundle-require@5.1.0: resolution: {integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -3591,6 +3605,9 @@ packages: github-slugger@2.0.0: resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} + gl-matrix@3.4.4: + resolution: {integrity: sha512-latSnyDNt/8zYUB6VIJ6PCh2jBjJX6gnDsoCZ7LyW7GkqrD51EWwa9qCoGixj8YqBtETQK/xY7OmpTF8xz1DdQ==} + glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -4356,6 +4373,9 @@ packages: moo@0.5.2: resolution: {integrity: sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q==} + morphcharts@1.3.2: + resolution: {integrity: sha512-0T34Aryx8a6p0hzOzKu4x/3cK9NBoq4+59fOapEt3Iy8mpQpVg3KiicKroZRfOyaz4gNPvgK9DG/Q37Ecgf2ig==} + motion-dom@12.23.7: resolution: {integrity: sha512-AyJR07/YxObtK3NyGLCfebUe0k9UZGhik+2eIPUoKz76cKRRSkMeifmIxfztIvOaKb/Smu9IfVHkmx+mV+iFmQ==} @@ -7837,6 +7857,12 @@ snapshots: transitivePeerDependencies: - '@types/react' + '@types/bun@1.2.20(@types/react@19.1.8)': + dependencies: + bun-types: 1.2.20(@types/react@19.1.8) + transitivePeerDependencies: + - '@types/react' + '@types/chai@5.2.2': dependencies: '@types/deep-eql': 4.0.2 @@ -7924,6 +7950,8 @@ snapshots: '@types/unist@3.0.3': {} + '@types/webxr@0.4.0': {} + '@typescript/analyze-trace@0.10.1': dependencies: chalk: 4.1.2 @@ -8387,6 +8415,11 @@ snapshots: '@types/node': 24.1.0 '@types/react': 19.1.8 + bun-types@1.2.20(@types/react@19.1.8): + dependencies: + '@types/node': 24.1.0 + '@types/react': 19.1.8 + bundle-require@5.1.0(esbuild@0.25.6): dependencies: esbuild: 0.25.6 @@ -9188,6 +9221,8 @@ snapshots: github-slugger@2.0.0: {} + gl-matrix@3.4.4: {} + glob-parent@5.1.2: dependencies: is-glob: 4.0.3 @@ -10277,6 +10312,11 @@ snapshots: moo@0.5.2: {} + morphcharts@1.3.2: + dependencies: + '@types/webxr': 0.4.0 + gl-matrix: 3.4.4 + motion-dom@12.23.7: dependencies: motion-utils: 12.23.6 From 60871d5a84c109143549300262990f9f93ec8a3d Mon Sep 17 00:00:00 2001 From: Szymon Szulc Date: Thu, 14 Aug 2025 21:34:33 +0200 Subject: [PATCH 15/64] Nice html layout + camera reset --- .../examples/simple/probability/constants.ts | 6 ++ .../examples/simple/probability/executor.ts | 2 +- .../examples/simple/probability/index.html | 9 ++- .../examples/simple/probability/index.ts | 61 ++++++++++++------- .../examples/simple/probability/plotter.ts | 21 ++++--- 5 files changed, 65 insertions(+), 34 deletions(-) create mode 100644 apps/typegpu-docs/src/content/examples/simple/probability/constants.ts diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/constants.ts b/apps/typegpu-docs/src/content/examples/simple/probability/constants.ts new file mode 100644 index 000000000..a949c0f65 --- /dev/null +++ b/apps/typegpu-docs/src/content/examples/simple/probability/constants.ts @@ -0,0 +1,6 @@ +import type { Distributions } from './types.ts'; + +export const initialCameraPosition = [0, 0, 0.5]; +export const initialNumSamples = 10000; +export const initialDistribution: Distributions = 'onUnitSphere'; +export const distributions: Distributions[] = ['onUnitSphere', 'inUnitSphere']; diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/executor.ts b/apps/typegpu-docs/src/content/examples/simple/probability/executor.ts index 47594934c..db2c5b5e0 100644 --- a/apps/typegpu-docs/src/content/examples/simple/probability/executor.ts +++ b/apps/typegpu-docs/src/content/examples/simple/probability/executor.ts @@ -12,7 +12,7 @@ import { randf } from '@typegpu/noise'; export class Executor { readonly #root: TgpuRoot; - // max count 50000 + // max count 65000 for convenience #count: number; #sampleBuffer: & TgpuBuffer> diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/index.html b/apps/typegpu-docs/src/content/examples/simple/probability/index.html index 8d9d5a61f..df26af4f7 100644 --- a/apps/typegpu-docs/src/content/examples/simple/probability/index.html +++ b/apps/typegpu-docs/src/content/examples/simple/probability/index.html @@ -1,4 +1,7 @@ -
-

-
+
+
+
diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/index.ts b/apps/typegpu-docs/src/content/examples/simple/probability/index.ts index c02a689ac..9952e2e49 100644 --- a/apps/typegpu-docs/src/content/examples/simple/probability/index.ts +++ b/apps/typegpu-docs/src/content/examples/simple/probability/index.ts @@ -5,37 +5,56 @@ import * as d from 'typegpu/data'; import { Plotter } from './plotter.ts'; import { Executor } from './executor.ts'; import { type Distributions, PlotType } from './types.ts'; +import * as c from './constants.ts'; const root = await tgpu.init(); -const count = 10000; -const executor = new Executor(root, count); +const executor = new Executor(root, c.initialNumSamples); const plotter = new Plotter(); +let currentDistribution = c.initialDistribution; + +const replot = async (distribution: Distributions) => { + let samples = undefined; + switch (distribution) { + case 'onUnitSphere': { + samples = await executor.executeSingleWorker(randf.onUnitSphere); + break; + } + case 'inUnitSphere': { + samples = await executor.executeSingleWorker(randf.inUnitSphere); + break; + } + } + + plotter.plot(samples, PlotType.GEOMETRIC, d.vec3f()); +}; + // #region Example controls & Cleanup export const controls = { - 'Reset camera': { onButtonClick: () => plotter.resetCamera() }, + 'Reset': { + onButtonClick: () => { + plotter.resetRotation(); + plotter.resetCamera(); + }, + }, 'Distribution': { - initial: 'onUnitSphere', - options: ['onUnitSphere', 'inUnitSphere'], + initial: c.initialDistribution, + options: c.distributions, onSelectChange: async (value: Distributions) => { - let samples = undefined; - let title = undefined; - switch (value) { - case 'onUnitSphere': { - samples = await executor.executeSingleWorker(randf.onUnitSphere); - title = 'Samples on Unit Sphere'; - break; - } - case 'inUnitSphere': { - samples = await executor.executeSingleWorker(randf.inUnitSphere); - title = 'Samples in Unit Sphere'; - break; - } - } - - plotter.plot(samples, PlotType.GEOMETRIC, d.vec3f(), title); + currentDistribution = value; + await replot(value); + }, + }, + 'Number of samples': { + initial: c.initialNumSamples, + min: 100, + max: 65000, + step: 100, + onSliderChange: async (value: number) => { + executor.count = value; + await replot(currentDistribution); }, }, }; diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/plotter.ts b/apps/typegpu-docs/src/content/examples/simple/probability/plotter.ts index 408f67d8c..9d98cea4a 100644 --- a/apps/typegpu-docs/src/content/examples/simple/probability/plotter.ts +++ b/apps/typegpu-docs/src/content/examples/simple/probability/plotter.ts @@ -1,12 +1,13 @@ import * as MorphCharts from 'morphcharts'; +import type * as d from 'typegpu/data'; + import { PlotType } from './types.ts'; import type { PlotData } from './types.ts'; -import type * as d from 'typegpu/data'; +import * as c from './constants.ts'; export class Plotter { readonly #core; readonly #palette; - readonly #title: HTMLElement; constructor() { this.#core = new MorphCharts.Core({ @@ -15,15 +16,14 @@ export class Plotter { this.#core.renderer = new MorphCharts.Renderers.Basic.Main(); this.#palette = MorphCharts.Helpers.PaletteHelper.resample( this.#core.paletteResources.palettes[ - MorphCharts.PaletteName.blues + MorphCharts.PaletteName.purples ].colors, - 16, + 64, false, ); - this.#title = document.getElementById('title') as HTMLElement; } - plot(samples: d.v3f[], type: PlotType, origin: d.v3f, title: string) { + plot(samples: d.v3f[], type: PlotType, origin: d.v3f) { const count = samples.length; const data: PlotData = { count, @@ -51,19 +51,22 @@ export class Plotter { switch (type) { case PlotType.GEOMETRIC: this.#plotGeomteric(data, this.#core); - this.#title.innerText = title; break; default: throw new Error(`Unsupported plot type: ${type}`); } const camera = this.#core.camera; - camera.setPosition([0, 0, 0.2], false); + camera.setPosition(c.initialCameraPosition, true); + } + + resetRotation() { + this.#core.reset(true); } resetCamera() { const camera = this.#core.camera; - camera.setPosition([0, 0, 0.2], false); + camera.setPosition(c.initialCameraPosition, true); } #plotGeomteric(data: PlotData, core: MorphCharts.Core) { From 450b303d57bf71178a201c521f629642f12f2fc2 Mon Sep 17 00:00:00 2001 From: Szymon Szulc Date: Thu, 14 Aug 2025 21:35:45 +0200 Subject: [PATCH 16/64] Added tag --- .../src/content/examples/simple/probability/meta.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/meta.json b/apps/typegpu-docs/src/content/examples/simple/probability/meta.json index 43f248244..27aa5cc48 100644 --- a/apps/typegpu-docs/src/content/examples/simple/probability/meta.json +++ b/apps/typegpu-docs/src/content/examples/simple/probability/meta.json @@ -1,5 +1,5 @@ { "title": "Probability Distribution Plot", "category": "simple", - "tags": ["experimental"] + "tags": ["experimental", "ecosystem"] } From c745a53427f9359b91c5a5fb72087da03906bff3 Mon Sep 17 00:00:00 2001 From: Szymon Szulc Date: Sun, 17 Aug 2025 23:04:56 +0200 Subject: [PATCH 17/64] Small refactor --- .../examples/simple/probability/constants.ts | 8 ++-- .../examples/simple/probability/executor.ts | 13 +++++- .../examples/simple/probability/helpers.ts | 13 ++++++ .../examples/simple/probability/index.ts | 44 ++++++++++++++----- .../examples/simple/probability/plotter.ts | 2 +- .../examples/simple/probability/types.ts | 10 ++++- 6 files changed, 72 insertions(+), 18 deletions(-) create mode 100644 apps/typegpu-docs/src/content/examples/simple/probability/helpers.ts diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/constants.ts b/apps/typegpu-docs/src/content/examples/simple/probability/constants.ts index a949c0f65..63b6fb794 100644 --- a/apps/typegpu-docs/src/content/examples/simple/probability/constants.ts +++ b/apps/typegpu-docs/src/content/examples/simple/probability/constants.ts @@ -1,6 +1,8 @@ -import type { Distributions } from './types.ts'; +import { Distribution, ExecutionMode } from './types.ts'; export const initialCameraPosition = [0, 0, 0.5]; export const initialNumSamples = 10000; -export const initialDistribution: Distributions = 'onUnitSphere'; -export const distributions: Distributions[] = ['onUnitSphere', 'inUnitSphere']; +export const initialDistribution: Distribution = Distribution.ON_UNIT_SPHERE; +export const distributions: Distribution[] = Object.values(Distribution); +export const initialExecutionMode: ExecutionMode = ExecutionMode.SINGLE; +export const executionModes: ExecutionMode[] = Object.values(ExecutionMode); diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/executor.ts b/apps/typegpu-docs/src/content/examples/simple/probability/executor.ts index db2c5b5e0..360fd3e10 100644 --- a/apps/typegpu-docs/src/content/examples/simple/probability/executor.ts +++ b/apps/typegpu-docs/src/content/examples/simple/probability/executor.ts @@ -12,7 +12,8 @@ import { randf } from '@typegpu/noise'; export class Executor { readonly #root: TgpuRoot; - // max count 65000 for convenience + // max `count` 65000 for convenience + // initial `count` cannot be 0 #count: number; #sampleBuffer: & TgpuBuffer> @@ -57,6 +58,8 @@ export class Executor { set count(value: number) { this.#count = value; + if (value === 0) return; + this.#sampleBuffer = this.#root.createBuffer(d.arrayOf(d.vec3f, value)) .$usage( 'storage', @@ -66,6 +69,10 @@ export class Executor { async executeSingleWorker( distribution: TgpuFn<() => d.Vec3f>, ): Promise { + if (this.#count === 0) { + return []; + } + const pipeline = this.#root['~unstable'] .with(this.#sampleBufferSlot, this.#sampleBuffer.as('mutable')) .with(this.#distributionSlot, distribution) @@ -80,6 +87,10 @@ export class Executor { async executeMoreWorkers( distribution: TgpuFn<() => d.Vec3f>, ): Promise { + if (this.#count === 0) { + return []; + } + const pipeline = this.#root['~unstable'] .with(this.#sampleBufferSlot, this.#sampleBuffer.as('mutable')) .with(this.#distributionSlot, distribution) diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/helpers.ts b/apps/typegpu-docs/src/content/examples/simple/probability/helpers.ts new file mode 100644 index 000000000..f60f5c13c --- /dev/null +++ b/apps/typegpu-docs/src/content/examples/simple/probability/helpers.ts @@ -0,0 +1,13 @@ +import { Distribution } from './types.ts'; +import { randf } from '@typegpu/noise'; + +export function getPRNG(distribution: Distribution) { + switch (distribution) { + case Distribution.ON_UNIT_SPHERE: { + return randf.onUnitSphere; + } + case Distribution.IN_UNIT_SPHERE: { + return randf.inUnitSphere; + } + } +} diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/index.ts b/apps/typegpu-docs/src/content/examples/simple/probability/index.ts index 9952e2e49..0cafd3a9d 100644 --- a/apps/typegpu-docs/src/content/examples/simple/probability/index.ts +++ b/apps/typegpu-docs/src/content/examples/simple/probability/index.ts @@ -1,11 +1,11 @@ import tgpu from 'typegpu'; -import { randf } from '@typegpu/noise'; import * as d from 'typegpu/data'; import { Plotter } from './plotter.ts'; import { Executor } from './executor.ts'; -import { type Distributions, PlotType } from './types.ts'; +import { type Distribution, ExecutionMode, PlotType } from './types.ts'; import * as c from './constants.ts'; +import { getPRNG } from './helpers.ts'; const root = await tgpu.init(); @@ -13,20 +13,25 @@ const executor = new Executor(root, c.initialNumSamples); const plotter = new Plotter(); let currentDistribution = c.initialDistribution; +let currentExecutionMode = c.initialExecutionMode; -const replot = async (distribution: Distributions) => { +const replot = async (distribution: Distribution, execMod: ExecutionMode) => { let samples = undefined; - switch (distribution) { - case 'onUnitSphere': { - samples = await executor.executeSingleWorker(randf.onUnitSphere); + let verdict = undefined; + const prng = getPRNG(distribution); + + switch (execMod) { + case ExecutionMode.SINGLE: { + verdict = executor.executeSingleWorker.bind(executor); break; } - case 'inUnitSphere': { - samples = await executor.executeSingleWorker(randf.inUnitSphere); + case ExecutionMode.PARALLEL: { + verdict = executor.executeMoreWorkers.bind(executor); break; } } + samples = await verdict(prng); plotter.plot(samples, PlotType.GEOMETRIC, d.vec3f()); }; @@ -34,27 +39,42 @@ const replot = async (distribution: Distributions) => { export const controls = { 'Reset': { + // camera with num of samples + }, + 'Reset Camera': { onButtonClick: () => { plotter.resetRotation(); plotter.resetCamera(); }, }, + 'Execution Mode': { + initial: c.initialExecutionMode, + options: c.executionModes, + onSelectChange: async (value: ExecutionMode) => { + currentExecutionMode = value; + await replot(currentDistribution, currentExecutionMode); + plotter.resetRotation(); + plotter.resetCamera(); + }, + }, 'Distribution': { initial: c.initialDistribution, options: c.distributions, - onSelectChange: async (value: Distributions) => { + onSelectChange: async (value: Distribution) => { currentDistribution = value; - await replot(value); + await replot(currentDistribution, currentExecutionMode); + plotter.resetRotation(); + plotter.resetCamera(); }, }, 'Number of samples': { initial: c.initialNumSamples, - min: 100, + min: 0, max: 65000, step: 100, onSliderChange: async (value: number) => { executor.count = value; - await replot(currentDistribution); + await replot(currentDistribution, currentExecutionMode); }, }, }; diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/plotter.ts b/apps/typegpu-docs/src/content/examples/simple/probability/plotter.ts index 9d98cea4a..7c510817c 100644 --- a/apps/typegpu-docs/src/content/examples/simple/probability/plotter.ts +++ b/apps/typegpu-docs/src/content/examples/simple/probability/plotter.ts @@ -57,7 +57,7 @@ export class Plotter { } const camera = this.#core.camera; - camera.setPosition(c.initialCameraPosition, true); + // camera.setPosition(c.initialCameraPosition, true); } resetRotation() { diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/types.ts b/apps/typegpu-docs/src/content/examples/simple/probability/types.ts index 0c4993297..20239e607 100644 --- a/apps/typegpu-docs/src/content/examples/simple/probability/types.ts +++ b/apps/typegpu-docs/src/content/examples/simple/probability/types.ts @@ -15,4 +15,12 @@ export interface PlotData { dists: Float64Array; } -export type Distributions = 'onUnitSphere' | 'inUnitSphere'; +export enum ExecutionMode { + SINGLE = 'single', + PARALLEL = 'parallel', +} + +export enum Distribution { + ON_UNIT_SPHERE = 'onUnitSphere', + IN_UNIT_SPHERE = 'inUnitSphere', +} From 5cbd897f25e224b831dceddd7b206d6f020a2cd6 Mon Sep 17 00:00:00 2001 From: Szymon Szulc Date: Mon, 18 Aug 2025 00:22:13 +0200 Subject: [PATCH 18/64] Dont care about 0 --- .../examples/simple/probability/executor.ts | 15 +++++---------- .../examples/simple/probability/helpers.ts | 14 ++++++-------- .../content/examples/simple/probability/index.ts | 5 +---- .../examples/simple/probability/plotter.ts | 5 ----- 4 files changed, 12 insertions(+), 27 deletions(-) diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/executor.ts b/apps/typegpu-docs/src/content/examples/simple/probability/executor.ts index 360fd3e10..41c5e199f 100644 --- a/apps/typegpu-docs/src/content/examples/simple/probability/executor.ts +++ b/apps/typegpu-docs/src/content/examples/simple/probability/executor.ts @@ -13,7 +13,6 @@ import { randf } from '@typegpu/noise'; export class Executor { readonly #root: TgpuRoot; // max `count` 65000 for convenience - // initial `count` cannot be 0 #count: number; #sampleBuffer: & TgpuBuffer> @@ -25,16 +24,21 @@ export class Executor { readonly #sampleBufferSlot; constructor(root: TgpuRoot, count: number) { + if (count === 0) { + throw new Error('Count cannot be 0. Cannot create buffer of size 0'); + } this.#root = root; this.#count = count; this.#sampleBuffer = this.#root.createBuffer(d.arrayOf(d.vec3f, count)) .$usage( 'storage', ); + const sampleBufferSlotTempAlias = tgpu.slot( this.#sampleBuffer.as('mutable'), ); const distributionSlotTempAlias = tgpu.slot d.Vec3f>>(); + this.#sampleBufferSlot = sampleBufferSlotTempAlias; this.#distributionSlot = distributionSlotTempAlias; @@ -58,7 +62,6 @@ export class Executor { set count(value: number) { this.#count = value; - if (value === 0) return; this.#sampleBuffer = this.#root.createBuffer(d.arrayOf(d.vec3f, value)) .$usage( @@ -69,10 +72,6 @@ export class Executor { async executeSingleWorker( distribution: TgpuFn<() => d.Vec3f>, ): Promise { - if (this.#count === 0) { - return []; - } - const pipeline = this.#root['~unstable'] .with(this.#sampleBufferSlot, this.#sampleBuffer.as('mutable')) .with(this.#distributionSlot, distribution) @@ -87,10 +86,6 @@ export class Executor { async executeMoreWorkers( distribution: TgpuFn<() => d.Vec3f>, ): Promise { - if (this.#count === 0) { - return []; - } - const pipeline = this.#root['~unstable'] .with(this.#sampleBufferSlot, this.#sampleBuffer.as('mutable')) .with(this.#distributionSlot, distribution) diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/helpers.ts b/apps/typegpu-docs/src/content/examples/simple/probability/helpers.ts index f60f5c13c..274f8ac3a 100644 --- a/apps/typegpu-docs/src/content/examples/simple/probability/helpers.ts +++ b/apps/typegpu-docs/src/content/examples/simple/probability/helpers.ts @@ -1,13 +1,11 @@ import { Distribution } from './types.ts'; import { randf } from '@typegpu/noise'; +const distributionPRNGs = { + [Distribution.ON_UNIT_SPHERE]: randf.onUnitSphere, + [Distribution.IN_UNIT_SPHERE]: randf.inUnitSphere, +} as const; + export function getPRNG(distribution: Distribution) { - switch (distribution) { - case Distribution.ON_UNIT_SPHERE: { - return randf.onUnitSphere; - } - case Distribution.IN_UNIT_SPHERE: { - return randf.inUnitSphere; - } - } + return distributionPRNGs[distribution]; } diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/index.ts b/apps/typegpu-docs/src/content/examples/simple/probability/index.ts index 0cafd3a9d..4fc9f1686 100644 --- a/apps/typegpu-docs/src/content/examples/simple/probability/index.ts +++ b/apps/typegpu-docs/src/content/examples/simple/probability/index.ts @@ -38,9 +38,6 @@ const replot = async (distribution: Distribution, execMod: ExecutionMode) => { // #region Example controls & Cleanup export const controls = { - 'Reset': { - // camera with num of samples - }, 'Reset Camera': { onButtonClick: () => { plotter.resetRotation(); @@ -69,7 +66,7 @@ export const controls = { }, 'Number of samples': { initial: c.initialNumSamples, - min: 0, + min: 100, max: 65000, step: 100, onSliderChange: async (value: number) => { diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/plotter.ts b/apps/typegpu-docs/src/content/examples/simple/probability/plotter.ts index 7c510817c..e15736faf 100644 --- a/apps/typegpu-docs/src/content/examples/simple/probability/plotter.ts +++ b/apps/typegpu-docs/src/content/examples/simple/probability/plotter.ts @@ -52,12 +52,7 @@ export class Plotter { case PlotType.GEOMETRIC: this.#plotGeomteric(data, this.#core); break; - default: - throw new Error(`Unsupported plot type: ${type}`); } - - const camera = this.#core.camera; - // camera.setPosition(c.initialCameraPosition, true); } resetRotation() { From 4216899a72fe183485f6fa1c691b1ad856eb56ee Mon Sep 17 00:00:00 2001 From: Szymon Szulc Date: Mon, 18 Aug 2025 11:34:03 +0200 Subject: [PATCH 19/64] More refactor --- .../content/docs/ecosystem/typegpu-noise.mdx | 1 + .../examples/simple/probability/helpers.ts | 58 +++++++++++++++++-- .../examples/simple/probability/index.ts | 16 ++--- .../examples/simple/probability/plotter.ts | 8 ++- .../examples/simple/probability/types.ts | 56 +++++++++++++----- packages/typegpu-noise/src/index.ts | 3 + packages/typegpu-noise/src/random.ts | 22 +++++-- 7 files changed, 129 insertions(+), 35 deletions(-) diff --git a/apps/typegpu-docs/src/content/docs/ecosystem/typegpu-noise.mdx b/apps/typegpu-docs/src/content/docs/ecosystem/typegpu-noise.mdx index 1e5cc4983..a62d44a9d 100644 --- a/apps/typegpu-docs/src/content/docs/ecosystem/typegpu-noise.mdx +++ b/apps/typegpu-docs/src/content/docs/ecosystem/typegpu-noise.mdx @@ -106,6 +106,7 @@ There are higher-level utilities built on top of `randf.sample`: - `bernoulli` - returns 1 with probability `p`, and 0 otherwise. You can think of it as the flip of a biased coin. `p` must be in the range `[0, 1]` ### Continuous +- `sampleExclusive` - works the same as `sample`, but returns a value strictly between 0 and 1 - `exponential` - returns a number based on the exponential distribution with a given `rate`. The `rate` must be greater than 0. It is commonly used for modeling the time until an event occurs - `normal` - returns a number based on the normal (Gaussian) distribution with a given mean (`mu`) and standard deviation (`sigma`). `sigma` must be `>= 0` - `cauchy` - returns a number based on the Cauchy distribution with a given origin point (`x0`, `gamma`). `gamma` must be `>= 0` diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/helpers.ts b/apps/typegpu-docs/src/content/examples/simple/probability/helpers.ts index 274f8ac3a..8eb16d960 100644 --- a/apps/typegpu-docs/src/content/examples/simple/probability/helpers.ts +++ b/apps/typegpu-docs/src/content/examples/simple/probability/helpers.ts @@ -1,11 +1,61 @@ -import { Distribution } from './types.ts'; +import tgpu from 'typegpu'; import { randf } from '@typegpu/noise'; +import * as d from 'typegpu/data'; + +import { Distribution, PlotType, type PRNG } from './types.ts'; + +const normal = d.vec3f(1.41, 1.41, 0); +const z2D = 0.5; const distributionPRNGs = { - [Distribution.ON_UNIT_SPHERE]: randf.onUnitSphere, - [Distribution.IN_UNIT_SPHERE]: randf.inUnitSphere, + [Distribution.IN_UNIT_SPHERE]: { + plotType: PlotType.GEOMETRIC, + prng: randf.inUnitSphere, + origin: d.vec3f(), + }, + [Distribution.ON_UNIT_SPHERE]: { + plotType: PlotType.GEOMETRIC, + prng: randf.onUnitSphere, + origin: d.vec3f(), + }, + [Distribution.IN_UNIT_CIRCLE]: { + plotType: PlotType.GEOMETRIC, + prng: tgpu.fn([], d.vec3f)(() => d.vec3f(randf.inUnitCircle(), z2D)), + origin: d.vec3f(), + }, + [Distribution.ON_UNIT_CIRCLE]: { + plotType: PlotType.GEOMETRIC, + prng: tgpu.fn([], d.vec3f)(() => d.vec3f(randf.onUnitCircle(), z2D)), + origin: d.vec3f(), + }, + [Distribution.IN_UNIT_CUBE]: { + plotType: PlotType.GEOMETRIC, + prng: randf.inUnitCube, + origin: d.vec3f(0.5), + }, + [Distribution.ON_UNIT_CUBE]: { + plotType: PlotType.GEOMETRIC, + prng: randf.onUnitCube, + origin: d.vec3f(0.5), + }, + [Distribution.IN_HEMISPHERE]: { + plotType: PlotType.GEOMETRIC, + prng: tgpu.fn([], d.vec3f)(() => randf.inHemisphere(normal)), + origin: d.vec3f(), + }, + [Distribution.ON_HEMISPHERE]: { + plotType: PlotType.GEOMETRIC, + prng: tgpu.fn([], d.vec3f)(() => randf.onHemisphere(normal)), + origin: d.vec3f(), + }, + // [Distribution.BERNOULLI]: randf.bernoulli, + + // [Distribution.SAMPLE_EXCLUSIVE]: randf.sampleExclusive, + // [Distribution.EXPONENTIAL]: randf.exponential, + // [Distribution.NORMAL]: randf.normal, + // [Distribution.CAUCHY]: randf.cauchy, } as const; -export function getPRNG(distribution: Distribution) { +export function getPRNG(distribution: Distribution): PRNG { return distributionPRNGs[distribution]; } diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/index.ts b/apps/typegpu-docs/src/content/examples/simple/probability/index.ts index 4fc9f1686..f3ba121b6 100644 --- a/apps/typegpu-docs/src/content/examples/simple/probability/index.ts +++ b/apps/typegpu-docs/src/content/examples/simple/probability/index.ts @@ -1,9 +1,8 @@ import tgpu from 'typegpu'; -import * as d from 'typegpu/data'; import { Plotter } from './plotter.ts'; import { Executor } from './executor.ts'; -import { type Distribution, ExecutionMode, PlotType } from './types.ts'; +import { type Distribution, ExecutionMode } from './types.ts'; import * as c from './constants.ts'; import { getPRNG } from './helpers.ts'; @@ -31,8 +30,8 @@ const replot = async (distribution: Distribution, execMod: ExecutionMode) => { } } - samples = await verdict(prng); - plotter.plot(samples, PlotType.GEOMETRIC, d.vec3f()); + samples = await verdict(prng.prng); + plotter.plot(samples, prng.plotType, prng.origin); }; // #region Example controls & Cleanup @@ -40,8 +39,7 @@ const replot = async (distribution: Distribution, execMod: ExecutionMode) => { export const controls = { 'Reset Camera': { onButtonClick: () => { - plotter.resetRotation(); - plotter.resetCamera(); + plotter.resetView(); }, }, 'Execution Mode': { @@ -50,8 +48,7 @@ export const controls = { onSelectChange: async (value: ExecutionMode) => { currentExecutionMode = value; await replot(currentDistribution, currentExecutionMode); - plotter.resetRotation(); - plotter.resetCamera(); + plotter.resetView(); }, }, 'Distribution': { @@ -60,8 +57,7 @@ export const controls = { onSelectChange: async (value: Distribution) => { currentDistribution = value; await replot(currentDistribution, currentExecutionMode); - plotter.resetRotation(); - plotter.resetCamera(); + plotter.resetView(); }, }, 'Number of samples': { diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/plotter.ts b/apps/typegpu-docs/src/content/examples/simple/probability/plotter.ts index e15736faf..747d050c8 100644 --- a/apps/typegpu-docs/src/content/examples/simple/probability/plotter.ts +++ b/apps/typegpu-docs/src/content/examples/simple/probability/plotter.ts @@ -1,8 +1,7 @@ import * as MorphCharts from 'morphcharts'; import type * as d from 'typegpu/data'; -import { PlotType } from './types.ts'; -import type { PlotData } from './types.ts'; +import { type PlotData, PlotType } from './types.ts'; import * as c from './constants.ts'; export class Plotter { @@ -55,6 +54,11 @@ export class Plotter { } } + resetView() { + this.resetRotation(); + this.resetCamera(); + } + resetRotation() { this.#core.reset(true); } diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/types.ts b/apps/typegpu-docs/src/content/examples/simple/probability/types.ts index 20239e607..32787d7d3 100644 --- a/apps/typegpu-docs/src/content/examples/simple/probability/types.ts +++ b/apps/typegpu-docs/src/content/examples/simple/probability/types.ts @@ -1,9 +1,13 @@ -// biome-ignore lint/style/useEnumInitializers: -export enum PlotType { - GEOMETRIC, - HISTOGRAM, - BAR, -} +import type { TgpuFn } from 'typegpu'; +import type * as d from 'typegpu/data'; + +export const PlotType = { + GEOMETRIC: 0, + HISTOGRAM: 1, + BAR: 2, +} as const; + +export type PlotType = typeof PlotType[keyof typeof PlotType]; export interface PlotData { count: number; @@ -15,12 +19,38 @@ export interface PlotData { dists: Float64Array; } -export enum ExecutionMode { - SINGLE = 'single', - PARALLEL = 'parallel', -} +export const ExecutionMode = { + SINGLE: 'single', + PARALLEL: 'parallel', +} as const; + +export type ExecutionMode = typeof ExecutionMode[keyof typeof ExecutionMode]; + +export const Distribution = { + IN_UNIT_SPHERE: 'inUnitSphere', + ON_UNIT_SPHERE: 'onUnitSphere', + IN_UNIT_CIRCLE: 'inUnitCircle', + ON_UNIT_CIRCLE: 'onUnitCircle', + IN_UNIT_CUBE: 'inUnitCube', + ON_UNIT_CUBE: 'onUnitCube', + IN_HEMISPHERE: 'inHemisphere', + ON_HEMISPHERE: 'onHemisphere', + // BERNOULLI: 'bernoulli', + + // SAMPLE: 'sample', + // SAMPLE_EXCLUSIVE: 'sampleExclusive', + // EXPONENTIAL: 'exponential', + // NORMAL: 'normal', + // CAUCHY: 'cauchy', +} as const; + +export type Distribution = typeof Distribution[keyof typeof Distribution]; + +export type PRNG = + & { plotType: PlotType } + & (GeometricPRNG); -export enum Distribution { - ON_UNIT_SPHERE = 'onUnitSphere', - IN_UNIT_SPHERE = 'inUnitSphere', +export interface GeometricPRNG { + prng: TgpuFn<() => d.Vec3f>; + origin: d.v3f; } diff --git a/packages/typegpu-noise/src/index.ts b/packages/typegpu-noise/src/index.ts index 071a92a92..afe77e571 100644 --- a/packages/typegpu-noise/src/index.ts +++ b/packages/typegpu-noise/src/index.ts @@ -16,6 +16,7 @@ import { randSeed2, randSeed3, randSeed4, + randUniformExclusive, } from './random.ts'; export const randf: { @@ -24,6 +25,7 @@ export const randf: { seed3: typeof randSeed3; seed4: typeof randSeed4; sample: typeof randFloat01; + sampleExclusive: typeof randUniformExclusive; normal: typeof randNormal; exponential: typeof randExponential; cauchy: typeof randCauchy; @@ -42,6 +44,7 @@ export const randf: { seed3: randSeed3, seed4: randSeed4, sample: randFloat01, + sampleExclusive: randUniformExclusive, normal: randNormal, exponential: randExponential, cauchy: randCauchy, diff --git a/packages/typegpu-noise/src/random.ts b/packages/typegpu-noise/src/random.ts index 93c550b3e..a4c9fb364 100644 --- a/packages/typegpu-noise/src/random.ts +++ b/packages/typegpu-noise/src/random.ts @@ -4,6 +4,7 @@ import { clamp, cos, dot, + length, log, mul, normalize, @@ -18,7 +19,7 @@ import { import { randomGeneratorSlot } from './generator.ts'; const TWO_PI = Math.PI * 2; -const EPS = 1e-6; +const EPS = 1e-9; export const randSeed: TgpuFn<(seed: d.F32) => d.Void> = tgpu .fn([d.f32])((seed) => { @@ -79,14 +80,23 @@ export const randOnUnitCircle: TgpuFn<() => d.Vec2f> = tgpu return d.vec2f(cos(angle), sin(angle)); }); +const safeNormalize: TgpuFn<(v: d.Vec3f) => d.Vec3f> = tgpu + .fn([d.vec3f], d.vec3f)((v) => { + let vNonZero = v; + if (length(v) === 0) { + vNonZero = v.add(EPS); + } + return normalize(vNonZero); + }); + export const randInUnitSphere: TgpuFn<() => d.Vec3f> = tgpu .fn([], d.vec3f)(() => { const u = randomGeneratorSlot.value.sample(); - const v = normalize( - d.vec3f(randNormal(0, 1), randNormal(0, 1), randNormal(0, 1)).add(EPS), - ); + const v = d.vec3f(randNormal(0, 1), randNormal(0, 1), randNormal(0, 1)); + + const vNorm = safeNormalize(v); - return v.mul(pow(u, 1 / 3)); + return vNorm.mul(pow(u, 1 / 3)); }); export const randOnUnitSphere: TgpuFn<() => d.Vec3f> = tgpu @@ -116,7 +126,7 @@ export const randOnUnitHemisphere: TgpuFn<(normal: d.Vec3f) => d.Vec3f> = tgpu return mul(sign(alignment), value); }); -const randUniformExclusive: TgpuFn<() => d.F32> = tgpu +export const randUniformExclusive: TgpuFn<() => d.F32> = tgpu .fn([], d.f32)(() => { // Our generator currently operates on the range [0, 1), // so clamping with 1 - EPS isn't necessary. From 0b38fff8b34f5f861f0e7e0863aa695a8ee5c45c Mon Sep 17 00:00:00 2001 From: Szymon Szulc Date: Mon, 18 Aug 2025 14:06:32 +0200 Subject: [PATCH 20/64] Histogram plot --- .../src/components/design/Select.tsx | 2 +- .../content/examples/simple/probability/2d.ts | 101 -------- .../examples/simple/probability/constants.ts | 8 +- .../examples/simple/probability/helpers.ts | 20 +- .../examples/simple/probability/index.ts | 8 +- .../examples/simple/probability/plotter.ts | 231 ++++++++++++++---- .../examples/simple/probability/types.ts | 39 ++- 7 files changed, 240 insertions(+), 169 deletions(-) delete mode 100644 apps/typegpu-docs/src/content/examples/simple/probability/2d.ts diff --git a/apps/typegpu-docs/src/components/design/Select.tsx b/apps/typegpu-docs/src/components/design/Select.tsx index 17e991bb0..9543fcc40 100644 --- a/apps/typegpu-docs/src/components/design/Select.tsx +++ b/apps/typegpu-docs/src/components/design/Select.tsx @@ -21,7 +21,7 @@ export function Select({ position='popper' className='-top-4 relative min-w-30' > - + {options.map((option) => ( -10 + i * 0.05, -); - -const root = await tgpu.init(); -const b = root.createBuffer(d.arrayOf(d.f32, N)).$usage('storage'); -const bView = b.as('mutable'); - -const f1 = tgpu['~unstable'].computeFn({ workgroupSize: [1] })(() => { - for (let i = d.i32(0); i < d.i32(N); i++) { - bView.$[i] = randf.cauchy(0, 1); - } -}); - -const p1 = root['~unstable'].withCompute(f1).createPipeline(); -p1.dispatchWorkgroups(1); -const samples1 = (await b.read()).filter((x) => x >= -20 && x <= 20); - -const plot1 = Plot.plot({ - title: 'Cauchy(0, 1): 1 worker samples 10000 values', - y: { grid: true }, - marks: [ - Plot.rectY( - samples1, - Plot.binX( - { y: 'count' }, - { x: (d) => d, fill: 'lightblue' } as Plot.BinXInputs, - ), - ), - Plot.ruleY([0]), - ], -}); -// const plot1 = Plot.plot({ -// title: 'Bern(0.5): 1 worker samples 10000 values', -// y: { -// grid: true, -// percent: true, -// }, -// marks: [ -// Plot.barY( -// samples1, -// Plot.groupX({ y: 'proportion' }, { x: (d) => d, fill: 'lightblue' }), -// ), -// ], -// }); -const div1 = document.getElementById('hist1'); -div1?.append(plot1); - -const f2 = tgpu['~unstable'].computeFn({ - in: { gid: d.builtin.globalInvocationId }, - workgroupSize: [1], -})((input) => { - randf.seed2(d.vec2f(input.gid.xy)); - bView.$[input.gid.x * 100 + input.gid.y] = randf.bernoulli(0.5); -}); - -const p2 = root['~unstable'].withCompute(f2).createPipeline(); -p2.dispatchWorkgroups(100, 100); -const samples2 = (await b.read()).filter((x) => x >= -20 && x <= 20); - -console.log(samples1); -console.log(samples2); - -// const plot2 = Plot.plot({ -// title: 'Cauchy(0, 1): 10000 workers, each sampling 1 value with seed2(xy)', -// y: { grid: true }, -// marks: [ -// Plot.rectY( -// samples2, -// Plot.binX( -// { y: 'count' }, -// { x: (d) => d, fill: 'lightblue' } as Plot.BinXInputs, -// ), -// ), -// Plot.ruleY([0]), -// ], -// }); -const plot2 = Plot.plot({ - title: 'Bern(0.5): 10000 workers, each sampling 1 value with seed2(xy)', - y: { - grid: true, - percent: true, - }, - marks: [ - Plot.barY( - samples2, - Plot.groupX({ y: 'proportion' }, { x: (d) => d, fill: 'lightblue' }), - ), - ], -}); -const div2 = document.getElementById('hist2'); -div2?.append(plot2); diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/constants.ts b/apps/typegpu-docs/src/content/examples/simple/probability/constants.ts index 63b6fb794..e2be0745c 100644 --- a/apps/typegpu-docs/src/content/examples/simple/probability/constants.ts +++ b/apps/typegpu-docs/src/content/examples/simple/probability/constants.ts @@ -1,8 +1,12 @@ import { Distribution, ExecutionMode } from './types.ts'; -export const initialCameraPosition = [0, 0, 0.5]; +export const initialCameraPosition = [0, 0, 0.3]; +export const initialCameraAngle = 30; export const initialNumSamples = 10000; -export const initialDistribution: Distribution = Distribution.ON_UNIT_SPHERE; +export const initialDistribution: Distribution = Distribution.SAMPLE; export const distributions: Distribution[] = Object.values(Distribution); export const initialExecutionMode: ExecutionMode = ExecutionMode.SINGLE; export const executionModes: ExecutionMode[] = Object.values(ExecutionMode); +export const minNumSamples = 100; +export const maxNumSamples = 30000; +export const step = 100; diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/helpers.ts b/apps/typegpu-docs/src/content/examples/simple/probability/helpers.ts index 8eb16d960..b6e39df5c 100644 --- a/apps/typegpu-docs/src/content/examples/simple/probability/helpers.ts +++ b/apps/typegpu-docs/src/content/examples/simple/probability/helpers.ts @@ -50,10 +50,22 @@ const distributionPRNGs = { }, // [Distribution.BERNOULLI]: randf.bernoulli, - // [Distribution.SAMPLE_EXCLUSIVE]: randf.sampleExclusive, - // [Distribution.EXPONENTIAL]: randf.exponential, - // [Distribution.NORMAL]: randf.normal, - // [Distribution.CAUCHY]: randf.cauchy, + [Distribution.SAMPLE]: { + plotType: PlotType.HISTOGRAM, + prng: tgpu.fn([], d.vec3f)(() => d.vec3f(randf.sample())), + }, + [Distribution.EXPONENTIAL]: { + plotType: PlotType.HISTOGRAM, + prng: tgpu.fn([], d.vec3f)(() => d.vec3f(randf.exponential(0.5))), + }, + [Distribution.NORMAL]: { + plotType: PlotType.HISTOGRAM, + prng: tgpu.fn([], d.vec3f)(() => d.vec3f(randf.normal(0, 1))), + }, + [Distribution.CAUCHY]: { + plotType: PlotType.HISTOGRAM, + prng: tgpu.fn([], d.vec3f)(() => d.vec3f(randf.cauchy(0, 0.5))), + }, } as const; export function getPRNG(distribution: Distribution): PRNG { diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/index.ts b/apps/typegpu-docs/src/content/examples/simple/probability/index.ts index f3ba121b6..288f6d962 100644 --- a/apps/typegpu-docs/src/content/examples/simple/probability/index.ts +++ b/apps/typegpu-docs/src/content/examples/simple/probability/index.ts @@ -31,7 +31,7 @@ const replot = async (distribution: Distribution, execMod: ExecutionMode) => { } samples = await verdict(prng.prng); - plotter.plot(samples, prng.plotType, prng.origin); + plotter.plot(samples, prng); }; // #region Example controls & Cleanup @@ -62,9 +62,9 @@ export const controls = { }, 'Number of samples': { initial: c.initialNumSamples, - min: 100, - max: 65000, - step: 100, + min: c.minNumSamples, + max: c.maxNumSamples, + step: c.step, onSliderChange: async (value: number) => { executor.count = value; await replot(currentDistribution, currentExecutionMode); diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/plotter.ts b/apps/typegpu-docs/src/content/examples/simple/probability/plotter.ts index 747d050c8..442ee11b9 100644 --- a/apps/typegpu-docs/src/content/examples/simple/probability/plotter.ts +++ b/apps/typegpu-docs/src/content/examples/simple/probability/plotter.ts @@ -1,9 +1,27 @@ import * as MorphCharts from 'morphcharts'; import type * as d from 'typegpu/data'; -import { type PlotData, PlotType } from './types.ts'; +import { + type GeometricData, + type GeometricPRNG, + type HistogramData, + PlotType, + type PRNG, +} from './types.ts'; import * as c from './constants.ts'; +// general +const defaultColorSpread = 16; +const defaultMinValue = -10; +const defaultMaxValue = 10; + +// geometric +const defaultSize = 0.17; + +// histogram +const defaultSizeX = 5; +const defaultSizeZ = 5; + export class Plotter { readonly #core; readonly #palette; @@ -17,39 +35,98 @@ export class Plotter { this.#core.paletteResources.palettes[ MorphCharts.PaletteName.purples ].colors, - 64, + defaultColorSpread, false, ); } - plot(samples: d.v3f[], type: PlotType, origin: d.v3f) { - const count = samples.length; - const data: PlotData = { - count, - ids: new Uint32Array(count), - positionsX: new Float64Array(count), - positionsY: new Float64Array(count), - positionsZ: new Float64Array(count), - sizes: new Float64Array(count), - dists: new Float64Array(count), - }; - - for (let i = 0; i < count; i++) { - data.ids[i] = i; - data.positionsX[i] = samples[i].x; - data.positionsY[i] = samples[i].y; - data.positionsZ[i] = samples[i].z; - data.sizes[i] = 0.17; - data.dists[i] = Math.sqrt( - (data.positionsX[i] - origin.x) ** 2 + - (data.positionsY[i] - origin.y) ** 2 + - (data.positionsZ[i] - origin.z) ** 2, - ); - } - - switch (type) { + plot(samples: d.v3f[], prng: PRNG) { + switch (prng.plotType) { case PlotType.GEOMETRIC: - this.#plotGeomteric(data, this.#core); + { + const count = samples.length; + const data: GeometricData = { + count, + ids: new Uint32Array(count), + positionsX: new Float64Array(count), + positionsY: new Float64Array(count), + positionsZ: new Float64Array(count), + sizes: new Float64Array(count), + dists: new Float64Array(count), + }; + + const origin = (prng as GeometricPRNG).origin; + + for (let i = 0; i < count; i++) { + data.ids[i] = i; + data.positionsX[i] = samples[i].x; + data.positionsY[i] = samples[i].y; + data.positionsZ[i] = samples[i].z; + data.sizes[i] = defaultSize; + data.dists[i] = Math.sqrt( + (data.positionsX[i] - origin.x) ** 2 + + (data.positionsY[i] - origin.y) ** 2 + + (data.positionsZ[i] - origin.z) ** 2, + ); + } + + this.#plotGeometric(data, this.#core); + } + break; + case PlotType.HISTOGRAM: + { + const samplesFiltered = samples.filter((sample) => + sample.x >= defaultMinValue && sample.x <= defaultMaxValue + ); + const count = samplesFiltered.length; + + const minSample = samplesFiltered.reduce( + (a, b) => Math.min(a, b.x), + Number.POSITIVE_INFINITY, + ); + const maxSample = samplesFiltered.reduce( + (a, b) => Math.max(a, b.x), + Number.NEGATIVE_INFINITY, + ); + + const optimalBinCount = Math.ceil(Math.log2(count)) + 1; + const binXWidth = (maxSample - minSample) / optimalBinCount; + + const data: HistogramData = { + count, + ids: new Uint32Array(count), + binIdsX: new Uint32Array(count), + binIdsZ: new Uint32Array(count), + values: new Float64Array(count), + binsX: optimalBinCount, + binsZ: 1, + binsWidth: binXWidth, + sizeX: defaultSizeX, + sizeZ: defaultSizeZ, + minX: minSample, + maxX: maxSample, + }; + + const binSizes = new Uint32Array(optimalBinCount); + binSizes.fill(0); + + for (let i = 0; i < count; i++) { + data.ids[i] = i; + data.binIdsZ[i] = 0; + data.binIdsX[i] = Math.min( + Math.floor((samplesFiltered[i].x - minSample) / binXWidth), + optimalBinCount - 1, + ); + binSizes[data.binIdsX[i]]++; + } + + const maxBinCount = binSizes.reduce((a, b) => Math.max(a, b), 0); + for (let i = 0; i < count; i++) { + data.values[i] = binSizes[data.binIdsX[i]] / maxBinCount; + } + + this.#plotHistogram(data, this.#core); + } break; } } @@ -61,14 +138,18 @@ export class Plotter { resetRotation() { this.#core.reset(true); + (this.#core.camera as MorphCharts.Cameras.AltAzimuthCamera).setAltAzimuth( + MorphCharts.Helpers.AngleHelper.degreesToRadians(c.initialCameraAngle), + 0, + true, + ); } resetCamera() { - const camera = this.#core.camera; - camera.setPosition(c.initialCameraPosition, true); + this.#core.camera.setPosition(c.initialCameraPosition, true); } - #plotGeomteric(data: PlotData, core: MorphCharts.Core) { + #plotGeometric(data: GeometricData, core: MorphCharts.Core) { const transitionBuffer = this.#core.renderer.createTransitionBuffer( data.ids, ); @@ -86,23 +167,77 @@ export class Plotter { sizeScaling: 0.1, colors: data.dists, }); - const axes = MorphCharts.Axes.Cartesian3dAxesHelper.create( - core, - { - titleX: 'x', - titleY: 'y', - titleZ: 'z', - labelsX: (value) => { - return value.toFixed(1); - }, - labelsY: (value) => { - return value.toFixed(1); - }, - labelsZ: (value) => { - return value.toFixed(1); - }, + const axes = MorphCharts.Axes.Cartesian3dAxesHelper.create(core, { + titleX: 'x', + titleY: 'y', + titleZ: 'z', + labelsX: (value) => { + return value.toFixed(1); }, - ); + labelsY: (value) => { + return value.toFixed(1); + }, + labelsZ: (value) => { + return value.toFixed(1); + }, + }); + core.renderer.currentAxes = [ + core.renderer.createCartesian3dAxesVisual(axes), + ]; + } + + #plotHistogram(data: HistogramData, core: MorphCharts.Core) { + const transitionBuffer = core.renderer.createTransitionBuffer(data.ids); + core.renderer.transitionBuffers = [transitionBuffer]; + transitionBuffer.currentBuffer.unitType = MorphCharts.UnitType.block; + transitionBuffer.currentPalette.colors = this.#palette; + + const stack = new MorphCharts.Layouts.Stack(core); + stack.layout(transitionBuffer.currentBuffer, data.ids, { + binsX: data.binsX, + binsZ: data.binsZ, + binIdsX: data.binIdsX, + binIdsZ: data.binIdsZ, + sizeX: data.sizeX, + sizeZ: data.sizeZ, + spacingX: 1, + spacingZ: 1, + }); + stack.update(transitionBuffer.currentBuffer, data.ids, { + colors: data.values, + padding: 0.025, + }); + + const axes = MorphCharts.Axes.Cartesian3dAxesHelper.create(core, { + minBoundsX: stack.minModelBoundsX, + minBoundsY: stack.minModelBoundsY, + minBoundsZ: stack.minModelBoundsZ, + maxBoundsX: stack.maxModelBoundsX, + maxBoundsY: stack.maxModelBoundsY, + maxBoundsZ: stack.maxModelBoundsZ, + minValueX: 0, + maxValueX: data.binsX - 1, + minValueY: 0, + maxValueY: stack.maxLevel * data.sizeX * data.sizeZ, + minValueZ: 0, + maxValueZ: data.binsZ - 1, + titleX: 'x', + titleY: 'y', + titleZ: 'z', + isDiscreteZ: true, + labelsX: (value) => { + return (value * data.binsWidth + data.minX).toFixed(1).toString(); + }, + labelsY: (value) => { + return Math.round(value).toString(); + }, + labelsZ: (value) => { + return value.toString(); + }, + }); + + axes.zero[0] = -1; + axes.zero[2] = -1; core.renderer.currentAxes = [ core.renderer.createCartesian3dAxesVisual(axes), ]; diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/types.ts b/apps/typegpu-docs/src/content/examples/simple/probability/types.ts index 32787d7d3..a201f63ec 100644 --- a/apps/typegpu-docs/src/content/examples/simple/probability/types.ts +++ b/apps/typegpu-docs/src/content/examples/simple/probability/types.ts @@ -4,21 +4,39 @@ import type * as d from 'typegpu/data'; export const PlotType = { GEOMETRIC: 0, HISTOGRAM: 1, - BAR: 2, + DISCRETE: 2, } as const; export type PlotType = typeof PlotType[keyof typeof PlotType]; -export interface PlotData { +export interface BaseData { count: number; ids: Uint32Array; +} + +export interface GeometricData extends BaseData { positionsX: Float64Array; positionsY: Float64Array; positionsZ: Float64Array; - sizes: Float64Array; dists: Float64Array; + sizes: Float64Array; +} + +export interface HistogramData extends BaseData { + binIdsX: Uint32Array; + binIdsZ: Uint32Array; + values: Float64Array; + binsX: number; + binsZ: number; + sizeX: number; + sizeZ: number; + binsWidth: number; + minX: number; + maxX: number; } +export type PlotData = GeometricData | HistogramData; + export const ExecutionMode = { SINGLE: 'single', PARALLEL: 'parallel', @@ -37,20 +55,23 @@ export const Distribution = { ON_HEMISPHERE: 'onHemisphere', // BERNOULLI: 'bernoulli', - // SAMPLE: 'sample', - // SAMPLE_EXCLUSIVE: 'sampleExclusive', - // EXPONENTIAL: 'exponential', - // NORMAL: 'normal', - // CAUCHY: 'cauchy', + SAMPLE: 'sample', + EXPONENTIAL: 'exponential', + NORMAL: 'normal', + CAUCHY: 'cauchy', } as const; export type Distribution = typeof Distribution[keyof typeof Distribution]; export type PRNG = & { plotType: PlotType } - & (GeometricPRNG); + & (GeometricPRNG | ContinuousPRNG); export interface GeometricPRNG { prng: TgpuFn<() => d.Vec3f>; origin: d.v3f; } + +export interface ContinuousPRNG { + prng: TgpuFn<() => d.Vec3f>; +} From 19d8aa6f7f246206d6adc9bd47a3c75318bc19a4 Mon Sep 17 00:00:00 2001 From: Szymon Szulc Date: Mon, 18 Aug 2025 16:33:33 +0200 Subject: [PATCH 21/64] All plots --- .../examples/simple/probability/constants.ts | 4 +- .../examples/simple/probability/helpers.ts | 18 +-- .../examples/simple/probability/plotter.ts | 116 ++++++++++++++---- .../examples/simple/probability/types.ts | 5 +- 4 files changed, 108 insertions(+), 35 deletions(-) diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/constants.ts b/apps/typegpu-docs/src/content/examples/simple/probability/constants.ts index e2be0745c..33d743a13 100644 --- a/apps/typegpu-docs/src/content/examples/simple/probability/constants.ts +++ b/apps/typegpu-docs/src/content/examples/simple/probability/constants.ts @@ -2,11 +2,11 @@ import { Distribution, ExecutionMode } from './types.ts'; export const initialCameraPosition = [0, 0, 0.3]; export const initialCameraAngle = 30; -export const initialNumSamples = 10000; +export const initialNumSamples = 5000; export const initialDistribution: Distribution = Distribution.SAMPLE; export const distributions: Distribution[] = Object.values(Distribution); export const initialExecutionMode: ExecutionMode = ExecutionMode.SINGLE; export const executionModes: ExecutionMode[] = Object.values(ExecutionMode); export const minNumSamples = 100; -export const maxNumSamples = 30000; +export const maxNumSamples = 65100; export const step = 100; diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/helpers.ts b/apps/typegpu-docs/src/content/examples/simple/probability/helpers.ts index b6e39df5c..6e91daad5 100644 --- a/apps/typegpu-docs/src/content/examples/simple/probability/helpers.ts +++ b/apps/typegpu-docs/src/content/examples/simple/probability/helpers.ts @@ -48,23 +48,25 @@ const distributionPRNGs = { prng: tgpu.fn([], d.vec3f)(() => randf.onHemisphere(normal)), origin: d.vec3f(), }, - // [Distribution.BERNOULLI]: randf.bernoulli, - + [Distribution.BERNOULLI]: { + plotType: PlotType.DISCRETE, + prng: tgpu.fn([], d.vec3f)(() => d.vec3f(randf.bernoulli(0.5))), + }, [Distribution.SAMPLE]: { - plotType: PlotType.HISTOGRAM, + plotType: PlotType.CONTINUOUS, prng: tgpu.fn([], d.vec3f)(() => d.vec3f(randf.sample())), }, [Distribution.EXPONENTIAL]: { - plotType: PlotType.HISTOGRAM, - prng: tgpu.fn([], d.vec3f)(() => d.vec3f(randf.exponential(0.5))), + plotType: PlotType.CONTINUOUS, + prng: tgpu.fn([], d.vec3f)(() => d.vec3f(randf.exponential(1))), }, [Distribution.NORMAL]: { - plotType: PlotType.HISTOGRAM, + plotType: PlotType.CONTINUOUS, prng: tgpu.fn([], d.vec3f)(() => d.vec3f(randf.normal(0, 1))), }, [Distribution.CAUCHY]: { - plotType: PlotType.HISTOGRAM, - prng: tgpu.fn([], d.vec3f)(() => d.vec3f(randf.cauchy(0, 0.5))), + plotType: PlotType.CONTINUOUS, + prng: tgpu.fn([], d.vec3f)(() => d.vec3f(randf.cauchy(0, 1))), }, } as const; diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/plotter.ts b/apps/typegpu-docs/src/content/examples/simple/probability/plotter.ts index 442ee11b9..33d9302aa 100644 --- a/apps/typegpu-docs/src/content/examples/simple/probability/plotter.ts +++ b/apps/typegpu-docs/src/content/examples/simple/probability/plotter.ts @@ -11,17 +11,13 @@ import { import * as c from './constants.ts'; // general -const defaultColorSpread = 16; +const defaultColorSpread = 32; const defaultMinValue = -10; const defaultMaxValue = 10; // geometric const defaultSize = 0.17; -// histogram -const defaultSizeX = 5; -const defaultSizeZ = 5; - export class Plotter { readonly #core; readonly #palette; @@ -73,23 +69,25 @@ export class Plotter { this.#plotGeometric(data, this.#core); } break; - case PlotType.HISTOGRAM: + case PlotType.CONTINUOUS: { const samplesFiltered = samples.filter((sample) => sample.x >= defaultMinValue && sample.x <= defaultMaxValue ); const count = samplesFiltered.length; - const minSample = samplesFiltered.reduce( - (a, b) => Math.min(a, b.x), - Number.POSITIVE_INFINITY, - ); - const maxSample = samplesFiltered.reduce( - (a, b) => Math.max(a, b.x), - Number.NEGATIVE_INFINITY, + const { minSample, maxSample } = samplesFiltered.reduce( + (acc, sample) => ({ + minSample: Math.min(acc.minSample, sample.x), + maxSample: Math.max(acc.maxSample, sample.x), + }), + { + minSample: Number.POSITIVE_INFINITY, + maxSample: Number.NEGATIVE_INFINITY, + }, ); - const optimalBinCount = Math.ceil(Math.log2(count)) + 1; + const optimalBinCount = 2 * Math.ceil(Math.log2(count)) + 1; const binXWidth = (maxSample - minSample) / optimalBinCount; const data: HistogramData = { @@ -101,8 +99,8 @@ export class Plotter { binsX: optimalBinCount, binsZ: 1, binsWidth: binXWidth, - sizeX: defaultSizeX, - sizeZ: defaultSizeZ, + sizeX: 1, + sizeZ: 1, minX: minSample, maxX: maxSample, }; @@ -120,12 +118,77 @@ export class Plotter { binSizes[data.binIdsX[i]]++; } - const maxBinCount = binSizes.reduce((a, b) => Math.max(a, b), 0); + const maxBinCount = binSizes.reduce( + (acc, size) => Math.max(acc, size), + 0, + ); for (let i = 0; i < count; i++) { data.values[i] = binSizes[data.binIdsX[i]] / maxBinCount; } - this.#plotHistogram(data, this.#core); + const guessedBinXZSize = Math.floor((maxBinCount / 7) ** (1 / 3)); + data.sizeX = guessedBinXZSize; + data.sizeZ = guessedBinXZSize; + + this.#plotHistogram(data, this.#core, false); + } + break; + case PlotType.DISCRETE: + { + const count = samples.length; + const samplesRounded = samples.map((sample) => Math.round(sample.x)); + + const uniqueValues = samplesRounded.reduce((map, value) => { + map.set(value, (map.get(value) || 0) + 1); + return map; + }, new Map()); + + const { minValue, maxValue } = [...uniqueValues.keys()].reduce( + (acc, value) => ({ + minValue: Math.min(acc.minValue, value), + maxValue: Math.max(acc.maxValue, value), + }), + { + minValue: Number.POSITIVE_INFINITY, + maxValue: Number.NEGATIVE_INFINITY, + }, + ); + + const uniqueRange = maxValue - minValue + 1; + + const data: HistogramData = { + count, + ids: new Uint32Array(count), + binIdsX: new Uint32Array(count), + binIdsZ: new Uint32Array(count), + values: new Float64Array(count), + binsX: uniqueRange, + binsZ: 1, + binsWidth: 1, + sizeX: 1, + sizeZ: 1, + minX: minValue, + maxX: maxValue, + }; + + const dominantFreq = uniqueValues.values().reduce( + (acc, freq) => Math.max(acc, freq), + 0, + ); + + for (let i = 0; i < count; i++) { + data.ids[i] = i; + data.binIdsZ[i] = 0; + data.binIdsX[i] = samplesRounded[i] - minValue; + data.values[i] = (uniqueValues.get(samplesRounded[i]) as number) / + dominantFreq; + } + + const guessedBinXZSize = Math.floor((dominantFreq / 11) ** (1 / 3)); + data.sizeX = guessedBinXZSize; + data.sizeZ = guessedBinXZSize; + + this.#plotHistogram(data, this.#core, true); } break; } @@ -156,6 +219,7 @@ export class Plotter { this.#core.renderer.transitionBuffers = [transitionBuffer]; transitionBuffer.currentBuffer.unitType = MorphCharts.UnitType.sphere; transitionBuffer.currentPalette.colors = this.#palette; + const scatter = new MorphCharts.Layouts.Scatter(this.#core); scatter.layout(transitionBuffer.currentBuffer, data.ids, { positionsX: data.positionsX, @@ -167,6 +231,7 @@ export class Plotter { sizeScaling: 0.1, colors: data.dists, }); + const axes = MorphCharts.Axes.Cartesian3dAxesHelper.create(core, { titleX: 'x', titleY: 'y', @@ -186,7 +251,11 @@ export class Plotter { ]; } - #plotHistogram(data: HistogramData, core: MorphCharts.Core) { + #plotHistogram( + data: HistogramData, + core: MorphCharts.Core, + isDiscreteX: boolean, + ) { const transitionBuffer = core.renderer.createTransitionBuffer(data.ids); core.renderer.transitionBuffers = [transitionBuffer]; transitionBuffer.currentBuffer.unitType = MorphCharts.UnitType.block; @@ -222,11 +291,13 @@ export class Plotter { minValueZ: 0, maxValueZ: data.binsZ - 1, titleX: 'x', - titleY: 'y', - titleZ: 'z', + titleY: 'count', + titleZ: '', + isDiscreteX, isDiscreteZ: true, labelsX: (value) => { - return (value * data.binsWidth + data.minX).toFixed(1).toString(); + return (value * data.binsWidth + data.minX).toFixed(isDiscreteX ? 0 : 1) + .toString(); }, labelsY: (value) => { return Math.round(value).toString(); @@ -235,7 +306,6 @@ export class Plotter { return value.toString(); }, }); - axes.zero[0] = -1; axes.zero[2] = -1; core.renderer.currentAxes = [ diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/types.ts b/apps/typegpu-docs/src/content/examples/simple/probability/types.ts index a201f63ec..4b743bea9 100644 --- a/apps/typegpu-docs/src/content/examples/simple/probability/types.ts +++ b/apps/typegpu-docs/src/content/examples/simple/probability/types.ts @@ -3,7 +3,7 @@ import type * as d from 'typegpu/data'; export const PlotType = { GEOMETRIC: 0, - HISTOGRAM: 1, + CONTINUOUS: 1, DISCRETE: 2, } as const; @@ -53,7 +53,8 @@ export const Distribution = { ON_UNIT_CUBE: 'onUnitCube', IN_HEMISPHERE: 'inHemisphere', ON_HEMISPHERE: 'onHemisphere', - // BERNOULLI: 'bernoulli', + + BERNOULLI: 'bernoulli', SAMPLE: 'sample', EXPONENTIAL: 'exponential', From f00de44ea35c51dabe74a1143a54af39dc67df96 Mon Sep 17 00:00:00 2001 From: Szymon Szulc Date: Mon, 18 Aug 2025 16:46:12 +0200 Subject: [PATCH 22/64] thumbnail --- .../examples/simple/probability/constants.ts | 4 ++-- .../examples/simple/probability/plotter.ts | 11 ++++++++--- .../examples/simple/probability/thumbnail.png | Bin 0 -> 122448 bytes 3 files changed, 10 insertions(+), 5 deletions(-) create mode 100644 apps/typegpu-docs/src/content/examples/simple/probability/thumbnail.png diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/constants.ts b/apps/typegpu-docs/src/content/examples/simple/probability/constants.ts index 33d743a13..73c768e85 100644 --- a/apps/typegpu-docs/src/content/examples/simple/probability/constants.ts +++ b/apps/typegpu-docs/src/content/examples/simple/probability/constants.ts @@ -1,7 +1,7 @@ import { Distribution, ExecutionMode } from './types.ts'; -export const initialCameraPosition = [0, 0, 0.3]; -export const initialCameraAngle = 30; +export const initialCameraPosition = [0, 0, 0.4]; +export const initialCameraAngle = 15; export const initialNumSamples = 5000; export const initialDistribution: Distribution = Distribution.SAMPLE; export const distributions: Distribution[] = Object.values(Distribution); diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/plotter.ts b/apps/typegpu-docs/src/content/examples/simple/probability/plotter.ts index 33d9302aa..4a8b3f167 100644 --- a/apps/typegpu-docs/src/content/examples/simple/probability/plotter.ts +++ b/apps/typegpu-docs/src/content/examples/simple/probability/plotter.ts @@ -14,6 +14,7 @@ import * as c from './constants.ts'; const defaultColorSpread = 32; const defaultMinValue = -10; const defaultMaxValue = 10; +const heightToBase = 7; // geometric const defaultSize = 0.17; @@ -87,7 +88,7 @@ export class Plotter { }, ); - const optimalBinCount = 2 * Math.ceil(Math.log2(count)) + 1; + const optimalBinCount = Math.ceil(Math.log2(count)) + 1; const binXWidth = (maxSample - minSample) / optimalBinCount; const data: HistogramData = { @@ -126,7 +127,9 @@ export class Plotter { data.values[i] = binSizes[data.binIdsX[i]] / maxBinCount; } - const guessedBinXZSize = Math.floor((maxBinCount / 7) ** (1 / 3)); + const guessedBinXZSize = Math.floor( + (maxBinCount / heightToBase) ** (1 / 3), + ); data.sizeX = guessedBinXZSize; data.sizeZ = guessedBinXZSize; @@ -184,7 +187,9 @@ export class Plotter { dominantFreq; } - const guessedBinXZSize = Math.floor((dominantFreq / 11) ** (1 / 3)); + const guessedBinXZSize = Math.floor( + (dominantFreq / heightToBase) ** (1 / 3), + ); data.sizeX = guessedBinXZSize; data.sizeZ = guessedBinXZSize; diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/thumbnail.png b/apps/typegpu-docs/src/content/examples/simple/probability/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..68244fd21640c615ce7ae202286a77e3f7c35a5c GIT binary patch literal 122448 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 literal 0 HcmV?d00001 From 18954d567c0ed8acc0228b0a53c8355a7b65aba8 Mon Sep 17 00:00:00 2001 From: Szymon Szulc Date: Tue, 19 Aug 2025 11:35:25 +0200 Subject: [PATCH 23/64] Optimized replotting --- .../examples/simple/probability/constants.ts | 4 +- .../examples/simple/probability/executor.ts | 54 +++++++++++++---- .../examples/simple/probability/helpers.ts | 23 +++++++ .../examples/simple/probability/index.ts | 57 +++++++++++++----- .../examples/simple/probability/plotter.ts | 10 +-- .../examples/simple/probability/thumbnail.png | Bin 122448 -> 217252 bytes 6 files changed, 115 insertions(+), 33 deletions(-) diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/constants.ts b/apps/typegpu-docs/src/content/examples/simple/probability/constants.ts index 73c768e85..bb2856e85 100644 --- a/apps/typegpu-docs/src/content/examples/simple/probability/constants.ts +++ b/apps/typegpu-docs/src/content/examples/simple/probability/constants.ts @@ -1,8 +1,10 @@ import { Distribution, ExecutionMode } from './types.ts'; -export const initialCameraPosition = [0, 0, 0.4]; +export const cameraPositionGeo = [0, 0, 0.5]; +export const cameraPositionHist = [0, 0, 0.2]; export const initialCameraAngle = 15; export const initialNumSamples = 5000; +export const numSamplesOptions = [100, 500, 1000, 5000, 10000, 50000]; export const initialDistribution: Distribution = Distribution.SAMPLE; export const distributions: Distribution[] = Object.values(Distribution); export const initialExecutionMode: ExecutionMode = ExecutionMode.SINGLE; diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/executor.ts b/apps/typegpu-docs/src/content/examples/simple/probability/executor.ts index 41c5e199f..c62e750d6 100644 --- a/apps/typegpu-docs/src/content/examples/simple/probability/executor.ts +++ b/apps/typegpu-docs/src/content/examples/simple/probability/executor.ts @@ -12,30 +12,34 @@ import { randf } from '@typegpu/noise'; export class Executor { readonly #root: TgpuRoot; - // max `count` 65000 for convenience + // don't exceed max workgroup grid X dimension size #count: number; - #sampleBuffer: + #maxCount: number; + #samplesBuffer: & TgpuBuffer> & StorageFlag; + #samples: d.v3f[]; readonly #dataSingleWorkerFunc: TgpuComputeFn; readonly #dataMoreWorkersFunc: TgpuComputeFn; readonly #distributionSlot: TgpuSlot d.Vec3f>>; - // inaccessible type readonly #sampleBufferSlot; constructor(root: TgpuRoot, count: number) { - if (count === 0) { - throw new Error('Count cannot be 0. Cannot create buffer of size 0'); - } + console.assert( + count > 0, + 'Count cannot be 0. Cannot create buffer of size 0', + ); this.#root = root; this.#count = count; - this.#sampleBuffer = this.#root.createBuffer(d.arrayOf(d.vec3f, count)) + this.#maxCount = count; + this.#samplesBuffer = this.#root.createBuffer(d.arrayOf(d.vec3f, count)) .$usage( 'storage', ); + this.#samples = []; const sampleBufferSlotTempAlias = tgpu.slot( - this.#sampleBuffer.as('mutable'), + this.#samplesBuffer.as('mutable'), ); const distributionSlotTempAlias = tgpu.slot d.Vec3f>>(); @@ -63,37 +67,61 @@ export class Executor { set count(value: number) { this.#count = value; - this.#sampleBuffer = this.#root.createBuffer(d.arrayOf(d.vec3f, value)) + if (value <= this.#maxCount) { + return; + } + + this.#maxCount = value; + this.#samplesBuffer = this.#root.createBuffer(d.arrayOf(d.vec3f, value)) .$usage( 'storage', ); + this.#samples = []; + } + + get count() { + return this.#count; } async executeSingleWorker( distribution: TgpuFn<() => d.Vec3f>, + forceReExec = false, ): Promise { + if (this.#samples.length !== 0 && !forceReExec) { + return this.#samples.slice(0, this.#count); + } + + console.log('running pipeline'); + const pipeline = this.#root['~unstable'] - .with(this.#sampleBufferSlot, this.#sampleBuffer.as('mutable')) + .with(this.#sampleBufferSlot, this.#samplesBuffer.as('mutable')) .with(this.#distributionSlot, distribution) .withCompute(this.#dataSingleWorkerFunc as TgpuComputeFn) .createPipeline(); pipeline.dispatchWorkgroups(1); - return await this.#sampleBuffer.read(); + this.#samples = await this.#samplesBuffer.read(); + return this.#samples; } async executeMoreWorkers( distribution: TgpuFn<() => d.Vec3f>, + forceReExec = false, ): Promise { + if (this.#samples.length !== 0 && !forceReExec) { + return this.#samples.slice(0, this.#count); + } + const pipeline = this.#root['~unstable'] - .with(this.#sampleBufferSlot, this.#sampleBuffer.as('mutable')) + .with(this.#sampleBufferSlot, this.#samplesBuffer.as('mutable')) .with(this.#distributionSlot, distribution) .withCompute(this.#dataMoreWorkersFunc as TgpuComputeFn) .createPipeline(); pipeline.dispatchWorkgroups(this.#count); - return await this.#sampleBuffer.read(); + this.#samples = await this.#samplesBuffer.read(); + return this.#samples; } } diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/helpers.ts b/apps/typegpu-docs/src/content/examples/simple/probability/helpers.ts index 6e91daad5..db6dd9055 100644 --- a/apps/typegpu-docs/src/content/examples/simple/probability/helpers.ts +++ b/apps/typegpu-docs/src/content/examples/simple/probability/helpers.ts @@ -3,6 +3,7 @@ import { randf } from '@typegpu/noise'; import * as d from 'typegpu/data'; import { Distribution, PlotType, type PRNG } from './types.ts'; +import * as c from './constants.ts'; const normal = d.vec3f(1.41, 1.41, 0); const z2D = 0.5; @@ -73,3 +74,25 @@ const distributionPRNGs = { export function getPRNG(distribution: Distribution): PRNG { return distributionPRNGs[distribution]; } + +const distributionCameras = { + [Distribution.IN_UNIT_SPHERE]: c.cameraPositionGeo, + [Distribution.ON_UNIT_SPHERE]: c.cameraPositionGeo, + [Distribution.IN_UNIT_CIRCLE]: c.cameraPositionGeo, + [Distribution.ON_UNIT_CIRCLE]: c.cameraPositionGeo, + [Distribution.IN_UNIT_CUBE]: c.cameraPositionGeo, + [Distribution.ON_UNIT_CUBE]: c.cameraPositionGeo, + [Distribution.IN_HEMISPHERE]: c.cameraPositionGeo, + [Distribution.ON_HEMISPHERE]: c.cameraPositionGeo, + + [Distribution.BERNOULLI]: c.cameraPositionHist, + + [Distribution.SAMPLE]: c.cameraPositionHist, + [Distribution.EXPONENTIAL]: c.cameraPositionHist, + [Distribution.NORMAL]: c.cameraPositionHist, + [Distribution.CAUCHY]: c.cameraPositionHist, +} as const; + +export function getCameraPosition(distribution: Distribution): number[] { + return distributionCameras[distribution]; +} diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/index.ts b/apps/typegpu-docs/src/content/examples/simple/probability/index.ts index 288f6d962..f70048ea4 100644 --- a/apps/typegpu-docs/src/content/examples/simple/probability/index.ts +++ b/apps/typegpu-docs/src/content/examples/simple/probability/index.ts @@ -4,7 +4,7 @@ import { Plotter } from './plotter.ts'; import { Executor } from './executor.ts'; import { type Distribution, ExecutionMode } from './types.ts'; import * as c from './constants.ts'; -import { getPRNG } from './helpers.ts'; +import { getCameraPosition, getPRNG } from './helpers.ts'; const root = await tgpu.init(); @@ -14,10 +14,15 @@ const plotter = new Plotter(); let currentDistribution = c.initialDistribution; let currentExecutionMode = c.initialExecutionMode; -const replot = async (distribution: Distribution, execMod: ExecutionMode) => { +const replot = async ( + currentDistribution: Distribution, + execMod: ExecutionMode, + animate = false, + forceReExec = false, +) => { let samples = undefined; let verdict = undefined; - const prng = getPRNG(distribution); + const prng = getPRNG(currentDistribution); switch (execMod) { case ExecutionMode.SINGLE: { @@ -30,44 +35,68 @@ const replot = async (distribution: Distribution, execMod: ExecutionMode) => { } } - samples = await verdict(prng.prng); + samples = await verdict(prng.prng, forceReExec); plotter.plot(samples, prng); }; +await replot(currentDistribution, currentExecutionMode); +plotter.resetView(getCameraPosition(currentDistribution)); + // #region Example controls & Cleanup export const controls = { 'Reset Camera': { onButtonClick: () => { - plotter.resetView(); + plotter.resetView(getCameraPosition(currentDistribution)); }, }, 'Execution Mode': { initial: c.initialExecutionMode, options: c.executionModes, onSelectChange: async (value: ExecutionMode) => { + if (currentExecutionMode === value) { + console.log(1); + return; + } + currentExecutionMode = value; - await replot(currentDistribution, currentExecutionMode); - plotter.resetView(); + await replot(currentDistribution, currentExecutionMode, false, true); + plotter.resetView(getCameraPosition(currentDistribution)); }, }, 'Distribution': { initial: c.initialDistribution, options: c.distributions, onSelectChange: async (value: Distribution) => { + if (currentDistribution === value) { + console.log(2); + return; + } + currentDistribution = value; - await replot(currentDistribution, currentExecutionMode); - plotter.resetView(); + await replot( + currentDistribution, + currentExecutionMode, + true, + true, + ); + plotter.resetView(getCameraPosition(currentDistribution)); }, }, 'Number of samples': { initial: c.initialNumSamples, - min: c.minNumSamples, - max: c.maxNumSamples, - step: c.step, - onSliderChange: async (value: number) => { + options: c.numSamplesOptions, + onSelectChange: async (value: number) => { + if (value === executor.count) { + console.log(3); + return; + } + executor.count = value; - await replot(currentDistribution, currentExecutionMode); + await replot( + currentDistribution, + currentExecutionMode, + ); }, }, }; diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/plotter.ts b/apps/typegpu-docs/src/content/examples/simple/probability/plotter.ts index 4a8b3f167..51a59cbc2 100644 --- a/apps/typegpu-docs/src/content/examples/simple/probability/plotter.ts +++ b/apps/typegpu-docs/src/content/examples/simple/probability/plotter.ts @@ -88,7 +88,7 @@ export class Plotter { }, ); - const optimalBinCount = Math.ceil(Math.log2(count)) + 1; + const optimalBinCount = 2 * Math.ceil(Math.log2(count)) + 1; // always odd const binXWidth = (maxSample - minSample) / optimalBinCount; const data: HistogramData = { @@ -199,9 +199,9 @@ export class Plotter { } } - resetView() { + resetView(cameraPos: number[]) { this.resetRotation(); - this.resetCamera(); + this.resetCamera(cameraPos); } resetRotation() { @@ -213,8 +213,8 @@ export class Plotter { ); } - resetCamera() { - this.#core.camera.setPosition(c.initialCameraPosition, true); + resetCamera(cameraPos: number[]) { + this.#core.camera.setPosition(cameraPos, true); } #plotGeometric(data: GeometricData, core: MorphCharts.Core) { diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/thumbnail.png b/apps/typegpu-docs/src/content/examples/simple/probability/thumbnail.png index 68244fd21640c615ce7ae202286a77e3f7c35a5c..ac6d418dd3c921372050a50041a3c3398b6ec1ac 100644 GIT binary patch literal 217252 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

{>>+Mwo5Vb33@(^b1WD#E|L>_z@@r(U^C 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

YwB2DonQXcG)eD>+dp>w?)jU`k(8ha@Ssx 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℘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

+ +
+

Controls

+

Left Mouse Button / Drag: Rotate plot

+

+ Right Mouse Button / Two-Finger Drag: Move plot +

+

Scroll: Zoom

diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/index.ts b/apps/typegpu-docs/src/content/examples/simple/probability/index.ts index fe9616978..a3111da59 100644 --- a/apps/typegpu-docs/src/content/examples/simple/probability/index.ts +++ b/apps/typegpu-docs/src/content/examples/simple/probability/index.ts @@ -43,6 +43,25 @@ await replot(currentDistribution, currentExecutionMode); plotter.resetView(getCameraPosition(currentDistribution)); // #region Example controls & Cleanup +const canvas = document.getElementById('canvas') as HTMLDivElement; +const helpInfo = document.getElementById('help') as HTMLDivElement; + +canvas.addEventListener('contextmenu', (event) => { + event.preventDefault(); +}); +canvas.addEventListener('mouseover', () => { + helpInfo.style.opacity = '0'; +}); +canvas.addEventListener('mouseout', () => { + helpInfo.style.opacity = '1'; +}); +// handle mobile devices +canvas.addEventListener('touchstart', () => { + helpInfo.style.opacity = '0'; +}); +canvas.addEventListener('touchend', () => { + helpInfo.style.opacity = '1'; +}); export const controls = { 'Reset Camera': { diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/meta.json b/apps/typegpu-docs/src/content/examples/simple/probability/meta.json index 27aa5cc48..0a36a27f5 100644 --- a/apps/typegpu-docs/src/content/examples/simple/probability/meta.json +++ b/apps/typegpu-docs/src/content/examples/simple/probability/meta.json @@ -1,5 +1,5 @@ { "title": "Probability Distribution Plot", "category": "simple", - "tags": ["experimental", "ecosystem"] + "tags": ["experimental", "ecosystem", "@typegpu/noise"] } diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/plotter.ts b/apps/typegpu-docs/src/content/examples/simple/probability/plotter.ts index 9a4256aa0..03519b7d1 100644 --- a/apps/typegpu-docs/src/content/examples/simple/probability/plotter.ts +++ b/apps/typegpu-docs/src/content/examples/simple/probability/plotter.ts @@ -32,7 +32,7 @@ export class Plotter { constructor() { this.#core = new MorphCharts.Core({ - container: document.getElementById('canvas') as HTMLElement, + container: document.getElementById('canvas') as HTMLDivElement, }); this.#core.renderer = new MorphCharts.Renderers.Basic.Main(); this.#palette = MorphCharts.Helpers.PaletteHelper.resample( From e604da99e1791a110d313ad67628d0832b56f090 Mon Sep 17 00:00:00 2001 From: Szymon Szulc Date: Thu, 21 Aug 2025 15:52:49 +0200 Subject: [PATCH 35/64] deno fmt --- .../examples/simple/probability/index.html | 63 ++++++++++--------- 1 file changed, 32 insertions(+), 31 deletions(-) diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/index.html b/apps/typegpu-docs/src/content/examples/simple/probability/index.html index beab602b6..3b821a0b8 100644 --- a/apps/typegpu-docs/src/content/examples/simple/probability/index.html +++ b/apps/typegpu-docs/src/content/examples/simple/probability/index.html @@ -1,37 +1,38 @@
-
+
+
-

Controls

-

Left Mouse Button / Drag: Rotate plot

-

- Right Mouse Button / Two-Finger Drag: Move plot -

-

Scroll: Zoom

+

Controls

+

Left Mouse Button / Drag: Rotate plot

+

+ Right Mouse Button / Two-Finger Drag: Move plot +

+

Scroll: Zoom

From 6e0cce0a332b48885c2639e42951f70cd7be8f27 Mon Sep 17 00:00:00 2001 From: Szymon Szulc Date: Thu, 21 Aug 2025 15:57:51 +0200 Subject: [PATCH 36/64] Broken lockfile --- pnpm-lock.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3173e8431..18f01647d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8487,7 +8487,7 @@ snapshots: bun-types@1.2.20(@types/react@19.1.8): dependencies: - '@types/node': 24.1.0 + '@types/node': 24.3.0 '@types/react': 19.1.8 bundle-require@5.1.0(esbuild@0.25.6): From 3fc305089b9b4b8f7261059dc367ea3eb0276fa1 Mon Sep 17 00:00:00 2001 From: Szymon Szulc Date: Mon, 25 Aug 2025 12:05:05 +0200 Subject: [PATCH 37/64] Example tests alignment --- packages/typegpu/tests/examples/individual/caustics.test.ts | 6 +++--- .../typegpu/tests/examples/individual/perlin-noise.test.ts | 6 +++--- .../typegpu/tests/examples/individual/vaporrave.test.ts | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/typegpu/tests/examples/individual/caustics.test.ts b/packages/typegpu/tests/examples/individual/caustics.test.ts index 52e0e2e9c..e8ed12ff9 100644 --- a/packages/typegpu/tests/examples/individual/caustics.test.ts +++ b/packages/typegpu/tests/examples/individual/caustics.test.ts @@ -68,9 +68,9 @@ describe('caustics example', () => { fn randOnUnitSphere_15() -> vec3f { var z = ((2 * item_16()) - 1); var oneMinusZSq = sqrt((1 - (z * z))); - var theta = ((6.283185307179586 * item_16()) - 3.141592653589793); - var x = (sin(theta) * oneMinusZSq); - var y = (cos(theta) * oneMinusZSq); + var theta = (6.283185307179586 * item_16()); + var x = (cos(theta) * oneMinusZSq); + var y = (sin(theta) * oneMinusZSq); return vec3f(x, y, z); } diff --git a/packages/typegpu/tests/examples/individual/perlin-noise.test.ts b/packages/typegpu/tests/examples/individual/perlin-noise.test.ts index b636b7adf..027484b3d 100644 --- a/packages/typegpu/tests/examples/individual/perlin-noise.test.ts +++ b/packages/typegpu/tests/examples/individual/perlin-noise.test.ts @@ -46,9 +46,9 @@ describe('perlin noise example', () => { fn randOnUnitSphere_8() -> vec3f { var z = ((2 * item_9()) - 1); var oneMinusZSq = sqrt((1 - (z * z))); - var theta = ((6.283185307179586 * item_9()) - 3.141592653589793); - var x = (sin(theta) * oneMinusZSq); - var y = (cos(theta) * oneMinusZSq); + var theta = (6.283185307179586 * item_9()); + var x = (cos(theta) * oneMinusZSq); + var y = (sin(theta) * oneMinusZSq); return vec3f(x, y, z); } diff --git a/packages/typegpu/tests/examples/individual/vaporrave.test.ts b/packages/typegpu/tests/examples/individual/vaporrave.test.ts index 28c91f937..e69b14702 100644 --- a/packages/typegpu/tests/examples/individual/vaporrave.test.ts +++ b/packages/typegpu/tests/examples/individual/vaporrave.test.ts @@ -44,9 +44,9 @@ describe('vaporrave example', () => { fn randOnUnitSphere_7() -> vec3f { var z = ((2 * item_8()) - 1); var oneMinusZSq = sqrt((1 - (z * z))); - var theta = ((6.283185307179586 * item_8()) - 3.141592653589793); - var x = (sin(theta) * oneMinusZSq); - var y = (cos(theta) * oneMinusZSq); + var theta = (6.283185307179586 * item_8()); + var x = (cos(theta) * oneMinusZSq); + var y = (sin(theta) * oneMinusZSq); return vec3f(x, y, z); } From 8763ef66ebe12b3af3eb6e6f7dd0acafed562b9e Mon Sep 17 00:00:00 2001 From: Szymon Szulc Date: Thu, 28 Aug 2025 17:03:57 +0200 Subject: [PATCH 38/64] Some review fixes --- .../examples/simple/probability/constants.ts | 9 +- .../examples/simple/probability/executor.ts | 85 ++++++------------- .../examples/simple/probability/index.ts | 66 ++++---------- .../examples/simple/probability/plotter.ts | 10 +-- .../examples/simple/probability/types.ts | 7 -- 5 files changed, 47 insertions(+), 130 deletions(-) diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/constants.ts b/apps/typegpu-docs/src/content/examples/simple/probability/constants.ts index f0fed9c81..2129b9b06 100644 --- a/apps/typegpu-docs/src/content/examples/simple/probability/constants.ts +++ b/apps/typegpu-docs/src/content/examples/simple/probability/constants.ts @@ -1,14 +1,9 @@ -import { Distribution, ExecutionMode } from './types.ts'; +import { Distribution } from './types.ts'; export const cameraPositionGeo = [0, 0, 0.5]; export const cameraPositionHist = [0, 0, 0.2]; export const initialCameraAngle = 15; -export const initialNumSamples = 2000; export const numSamplesOptions = [100, 1000, 2000, 5000, 10000, 50000]; +export const initialNumSamples = numSamplesOptions[2]; export const initialDistribution: Distribution = Distribution.NORMAL; export const distributions: Distribution[] = Object.values(Distribution); -export const initialExecutionMode: ExecutionMode = ExecutionMode.SINGLE; -export const executionModes: ExecutionMode[] = Object.values(ExecutionMode); -export const minNumSamples = 100; -export const maxNumSamples = 65100; -export const step = 100; diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/executor.ts b/apps/typegpu-docs/src/content/examples/simple/probability/executor.ts index 07f11b0ff..3c2c9d853 100644 --- a/apps/typegpu-docs/src/content/examples/simple/probability/executor.ts +++ b/apps/typegpu-docs/src/content/examples/simple/probability/executor.ts @@ -14,123 +14,92 @@ export class Executor { readonly #root: TgpuRoot; // don't exceed max workgroup grid X dimension size #count: number; - #maxCount: number; #samplesBuffer: & TgpuBuffer> & StorageFlag; - #samples: d.v3f[]; - readonly #dataSingleWorkerFunc: TgpuComputeFn; + #seedBuffer: + & TgpuBuffer> + & StorageFlag; readonly #dataMoreWorkersFunc: TgpuComputeFn; readonly #distributionSlot: TgpuSlot d.Vec3f>>; readonly #sampleBufferSlot; + readonly #seedBufferSlot; constructor(root: TgpuRoot, count: number) { console.assert( count > 0, 'Count cannot be 0. Cannot create buffer of size 0', ); + console.assert( + count <= 65536, + 'Count cannot exceed max workgroup grid X dimension size', + ); this.#root = root; this.#count = count; - this.#maxCount = count; this.#samplesBuffer = this.#root.createBuffer(d.arrayOf(d.vec3f, count)) .$usage( 'storage', ); - this.#samples = []; + this.#seedBuffer = this.#root.createBuffer( + d.arrayOf(d.f32, count), + Array.from({ length: count }, () => Math.random()), + ) + .$usage( + 'storage', + ); const sampleBufferSlotTempAlias = tgpu.slot( this.#samplesBuffer.as('mutable'), ); const distributionSlotTempAlias = tgpu.slot d.Vec3f>>(); + const seedBufferSlotTempAlias = tgpu.slot( + this.#seedBuffer.as('mutable'), + ); this.#sampleBufferSlot = sampleBufferSlotTempAlias; this.#distributionSlot = distributionSlotTempAlias; - - this.#dataSingleWorkerFunc = tgpu['~unstable'].computeFn({ - workgroupSize: [1], - })(() => { - for (let i = 0; i < sampleBufferSlotTempAlias.$.length; i++) { - sampleBufferSlotTempAlias.$[i] = distributionSlotTempAlias.$(); - } - }); + this.#seedBufferSlot = seedBufferSlotTempAlias; this.#dataMoreWorkersFunc = tgpu['~unstable'].computeFn({ in: { gid: d.builtin.globalInvocationId, count: d.builtin.numWorkgroups }, workgroupSize: [1], })((input) => { const gid = input.gid; - randf.seed(d.f32(gid.x) / input.count.x); + randf.seed(seedBufferSlotTempAlias.$[gid.x]); sampleBufferSlotTempAlias.$[gid.x] = distributionSlotTempAlias.$(); }); } set count(value: number) { this.#count = value; - - if (value <= this.#maxCount) { - return; - } - - this.#maxCount = value; this.#samplesBuffer = this.#root.createBuffer(d.arrayOf(d.vec3f, value)) .$usage( 'storage', ); - this.#samples = []; + + this.#seedBuffer = this.#root.createBuffer( + d.arrayOf(d.f32, value), + Array.from({ length: value }, () => Math.random()), + ).$usage('storage'); } get count() { return this.#count; } - async executeSingleWorker( - distribution: TgpuFn<() => d.Vec3f>, - forceReexec = false, - ): Promise { - if (this.#samples.length !== 0 && !forceReexec) { - return this.#samples.slice(0, this.#count); - } - - if (forceReexec) { - this.#maxCount = 0; - this.count = this.#count; - } - - const pipeline = this.#root['~unstable'] - .with(this.#sampleBufferSlot, this.#samplesBuffer.as('mutable')) - .with(this.#distributionSlot, distribution) - .withCompute(this.#dataSingleWorkerFunc as TgpuComputeFn) - .createPipeline(); - - pipeline.dispatchWorkgroups(1); - - this.#samples = await this.#samplesBuffer.read(); - return this.#samples; - } - async executeMoreWorkers( distribution: TgpuFn<() => d.Vec3f>, - forceReexec = false, ): Promise { - if (this.#samples.length !== 0 && !forceReexec) { - return this.#samples.slice(0, this.#count); - } - - if (forceReexec) { - this.#maxCount = 0; - this.count = this.#count; - } - const pipeline = this.#root['~unstable'] .with(this.#sampleBufferSlot, this.#samplesBuffer.as('mutable')) + .with(this.#seedBufferSlot, this.#seedBuffer.as('mutable')) .with(this.#distributionSlot, distribution) .withCompute(this.#dataMoreWorkersFunc as TgpuComputeFn) .createPipeline(); pipeline.dispatchWorkgroups(this.#count); - this.#samples = await this.#samplesBuffer.read(); - return this.#samples; + return await this.#samplesBuffer.read(); } } diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/index.ts b/apps/typegpu-docs/src/content/examples/simple/probability/index.ts index a3111da59..693507b89 100644 --- a/apps/typegpu-docs/src/content/examples/simple/probability/index.ts +++ b/apps/typegpu-docs/src/content/examples/simple/probability/index.ts @@ -2,7 +2,7 @@ import tgpu from 'typegpu'; import { Plotter } from './plotter.ts'; import { Executor } from './executor.ts'; -import { type Distribution, ExecutionMode } from './types.ts'; +import type { Distribution } from './types.ts'; import * as c from './constants.ts'; import { getCameraPosition, getPRNG } from './helpers.ts'; @@ -12,75 +12,46 @@ const executor = new Executor(root, c.initialNumSamples); const plotter = new Plotter(); let currentDistribution = c.initialDistribution; -let currentExecutionMode = c.initialExecutionMode; const replot = async ( currentDistribution: Distribution, - execMod: ExecutionMode, animate = false, - forceReexec = false, ) => { let samples = undefined; - let verdict = undefined; const prng = getPRNG(currentDistribution); - switch (execMod) { - case ExecutionMode.SINGLE: { - verdict = executor.executeSingleWorker.bind(executor); - break; - } - case ExecutionMode.PARALLEL: { - verdict = executor.executeMoreWorkers.bind(executor); - break; - } - } - - samples = await verdict(prng.prng, forceReexec); + samples = await executor.executeMoreWorkers(prng.prng); plotter.plot(samples, prng, animate); }; -await replot(currentDistribution, currentExecutionMode); +await replot(currentDistribution); plotter.resetView(getCameraPosition(currentDistribution)); // #region Example controls & Cleanup const canvas = document.getElementById('canvas') as HTMLDivElement; const helpInfo = document.getElementById('help') as HTMLDivElement; -canvas.addEventListener('contextmenu', (event) => { - event.preventDefault(); -}); +canvas.addEventListener('contextmenu', (event) => event.preventDefault()); canvas.addEventListener('mouseover', () => { helpInfo.style.opacity = '0'; }); -canvas.addEventListener('mouseout', () => { - helpInfo.style.opacity = '1'; -}); +canvas.addEventListener('mouseout', () => + setTimeout(() => { + helpInfo.style.opacity = '1'; + }, 5000)); // handle mobile devices canvas.addEventListener('touchstart', () => { helpInfo.style.opacity = '0'; -}); -canvas.addEventListener('touchend', () => { - helpInfo.style.opacity = '1'; -}); +}, { passive: true }); +canvas.addEventListener('touchend', () => + setTimeout(() => { + helpInfo.style.opacity = '1'; + }, 5000)); export const controls = { 'Reset Camera': { - onButtonClick: () => { - plotter.resetView(getCameraPosition(currentDistribution)); - }, - }, - 'Execution Mode': { - initial: c.initialExecutionMode, - options: c.executionModes, - onSelectChange: async (value: ExecutionMode) => { - if (currentExecutionMode === value) { - return; - } - - currentExecutionMode = value; - await replot(currentDistribution, currentExecutionMode, false, true); - plotter.resetView(getCameraPosition(currentDistribution)); - }, + onButtonClick: () => + plotter.resetView(getCameraPosition(currentDistribution)), }, 'Distribution': { initial: c.initialDistribution, @@ -93,8 +64,6 @@ export const controls = { currentDistribution = value; await replot( currentDistribution, - currentExecutionMode, - true, true, ); plotter.resetView(getCameraPosition(currentDistribution)); @@ -104,14 +73,9 @@ export const controls = { initial: c.initialNumSamples, options: c.numSamplesOptions, onSelectChange: async (value: number) => { - if (value === executor.count) { - return; - } - executor.count = value; await replot( currentDistribution, - currentExecutionMode, ); }, }, diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/plotter.ts b/apps/typegpu-docs/src/content/examples/simple/probability/plotter.ts index 03519b7d1..9af69ad0f 100644 --- a/apps/typegpu-docs/src/content/examples/simple/probability/plotter.ts +++ b/apps/typegpu-docs/src/content/examples/simple/probability/plotter.ts @@ -1,6 +1,6 @@ import * as MorphCharts from 'morphcharts'; import type * as d from 'typegpu/data'; -import { clamp } from 'typegpu/std'; +import * as std from 'typegpu/std'; import { type GeometricData, @@ -140,7 +140,7 @@ export class Plotter { const animateTransition = (time: number) => { const duration = time - start; - this.#core.renderer.transitionTime = clamp( + this.#core.renderer.transitionTime = std.clamp( duration / transitionTime, 0, 1, @@ -242,11 +242,7 @@ export class Plotter { // that's why I clamp them instead of filtering const samplesFiltered = samples.map((sample) => ({ ...sample, - x: sample.x < defaultMinValue - ? defaultMinValue - : sample.x > defaultMaxValue - ? defaultMaxValue - : sample.x, + x: std.clamp(sample.x, defaultMinValue, defaultMaxValue), })); const { minSample, maxSample } = samplesFiltered.reduce( diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/types.ts b/apps/typegpu-docs/src/content/examples/simple/probability/types.ts index a115b7141..f1577162f 100644 --- a/apps/typegpu-docs/src/content/examples/simple/probability/types.ts +++ b/apps/typegpu-docs/src/content/examples/simple/probability/types.ts @@ -37,13 +37,6 @@ export interface HistogramData extends BaseData { export type PlotData = GeometricData | HistogramData; -export const ExecutionMode = { - SINGLE: 'single', - PARALLEL: 'parallel', -} as const; - -export type ExecutionMode = typeof ExecutionMode[keyof typeof ExecutionMode]; - export const Distribution = { IN_UNIT_SPHERE: 'inUnitSphere', ON_UNIT_SPHERE: 'onUnitSphere', From abc9b2a5de0070949b697ac2f44fce29b874a06e Mon Sep 17 00:00:00 2001 From: Szymon Szulc Date: Fri, 29 Aug 2025 11:08:24 +0200 Subject: [PATCH 39/64] rescaling instead of clamping --- packages/typegpu-noise/src/index.ts | 6 +++--- packages/typegpu-noise/src/random.ts | 5 ++--- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/packages/typegpu-noise/src/index.ts b/packages/typegpu-noise/src/index.ts index afe77e571..fa1917809 100644 --- a/packages/typegpu-noise/src/index.ts +++ b/packages/typegpu-noise/src/index.ts @@ -16,7 +16,7 @@ import { randSeed2, randSeed3, randSeed4, - randUniformExclusive, + randUniformExclusive as randFloat01Exclusive, } from './random.ts'; export const randf: { @@ -25,7 +25,7 @@ export const randf: { seed3: typeof randSeed3; seed4: typeof randSeed4; sample: typeof randFloat01; - sampleExclusive: typeof randUniformExclusive; + sampleExclusive: typeof randFloat01Exclusive; normal: typeof randNormal; exponential: typeof randExponential; cauchy: typeof randCauchy; @@ -44,7 +44,7 @@ export const randf: { seed3: randSeed3, seed4: randSeed4, sample: randFloat01, - sampleExclusive: randUniformExclusive, + sampleExclusive: randFloat01Exclusive, normal: randNormal, exponential: randExponential, cauchy: randCauchy, diff --git a/packages/typegpu-noise/src/random.ts b/packages/typegpu-noise/src/random.ts index 762493cc1..b18aadd1c 100644 --- a/packages/typegpu-noise/src/random.ts +++ b/packages/typegpu-noise/src/random.ts @@ -1,7 +1,6 @@ import tgpu, { type TgpuFn } from 'typegpu'; import * as d from 'typegpu/data'; import { - clamp, cos, dot, length, @@ -129,9 +128,9 @@ export const randOnUnitHemisphere: TgpuFn<(normal: d.Vec3f) => d.Vec3f> = tgpu export const randUniformExclusive: TgpuFn<() => d.F32> = tgpu .fn([], d.f32)(() => { // Our generator currently operates on the range [0, 1), - // so clamping with 1 - EPS isn't necessary. + // so we don't need to clamp with 1 - EPS. // However, let's keep it, in case we change the generator's domain in the future. - return clamp(randomGeneratorSlot.value.sample(), 0 + EPS, 1 - EPS); + return randomGeneratorSlot.value.sample() * (1 - 2 * EPS) + EPS; }); export const randNormal: TgpuFn<(mu: d.F32, sigma: d.F32) => d.F32> = tgpu From 1c05a69b8d12f4961bf6fd47d42197526cb7bac1 Mon Sep 17 00:00:00 2001 From: Szymon Szulc Date: Fri, 29 Aug 2025 11:36:30 +0200 Subject: [PATCH 40/64] Brutal replotFlag --- .../examples/simple/probability/index.ts | 22 ++++++++++++------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/index.ts b/apps/typegpu-docs/src/content/examples/simple/probability/index.ts index 693507b89..ca4512324 100644 --- a/apps/typegpu-docs/src/content/examples/simple/probability/index.ts +++ b/apps/typegpu-docs/src/content/examples/simple/probability/index.ts @@ -12,21 +12,24 @@ const executor = new Executor(root, c.initialNumSamples); const plotter = new Plotter(); let currentDistribution = c.initialDistribution; +let replotFlag = false; const replot = async ( currentDistribution: Distribution, animate = false, ) => { - let samples = undefined; - const prng = getPRNG(currentDistribution); + replotFlag = true; + try { + let samples = undefined; + const prng = getPRNG(currentDistribution); - samples = await executor.executeMoreWorkers(prng.prng); - plotter.plot(samples, prng, animate); + samples = await executor.executeMoreWorkers(prng.prng); + plotter.plot(samples, prng, animate); + } finally { + replotFlag = false; + } }; -await replot(currentDistribution); -plotter.resetView(getCameraPosition(currentDistribution)); - // #region Example controls & Cleanup const canvas = document.getElementById('canvas') as HTMLDivElement; const helpInfo = document.getElementById('help') as HTMLDivElement; @@ -57,7 +60,7 @@ export const controls = { initial: c.initialDistribution, options: c.distributions, onSelectChange: async (value: Distribution) => { - if (currentDistribution === value) { + if (currentDistribution === value || replotFlag) { return; } @@ -73,6 +76,9 @@ export const controls = { initial: c.initialNumSamples, options: c.numSamplesOptions, onSelectChange: async (value: number) => { + if (replotFlag) { + return; + } executor.count = value; await replot( currentDistribution, From e5a8dff9eb86c1d5d18c83ffe06afc1926152110 Mon Sep 17 00:00:00 2001 From: Szymon Szulc Date: Fri, 29 Aug 2025 13:23:45 +0200 Subject: [PATCH 41/64] Review changes --- .../examples/simple/probability/executor.ts | 59 ++++++++----------- .../examples/simple/probability/index.ts | 26 ++++---- 2 files changed, 34 insertions(+), 51 deletions(-) diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/executor.ts b/apps/typegpu-docs/src/content/examples/simple/probability/executor.ts index 3c2c9d853..503648e56 100644 --- a/apps/typegpu-docs/src/content/examples/simple/probability/executor.ts +++ b/apps/typegpu-docs/src/content/examples/simple/probability/executor.ts @@ -26,28 +26,17 @@ export class Executor { readonly #seedBufferSlot; constructor(root: TgpuRoot, count: number) { - console.assert( - count > 0, - 'Count cannot be 0. Cannot create buffer of size 0', - ); - console.assert( - count <= 65536, - 'Count cannot exceed max workgroup grid X dimension size', - ); - this.#root = root; this.#count = count; - this.#samplesBuffer = this.#root.createBuffer(d.arrayOf(d.vec3f, count)) - .$usage( - 'storage', - ); - this.#seedBuffer = this.#root.createBuffer( - d.arrayOf(d.f32, count), - Array.from({ length: count }, () => Math.random()), - ) - .$usage( - 'storage', - ); + this.#samplesBuffer = this.#root + .createBuffer(d.arrayOf(d.vec3f, count)) + .$usage('storage'); + this.#seedBuffer = this.#root + .createBuffer( + d.arrayOf(d.f32, count), + Array.from({ length: count }, () => Math.random()), + ) + .$usage('storage'); const sampleBufferSlotTempAlias = tgpu.slot( this.#samplesBuffer.as('mutable'), @@ -62,26 +51,26 @@ export class Executor { this.#seedBufferSlot = seedBufferSlotTempAlias; this.#dataMoreWorkersFunc = tgpu['~unstable'].computeFn({ - in: { gid: d.builtin.globalInvocationId, count: d.builtin.numWorkgroups }, - workgroupSize: [1], + in: { gid: d.builtin.globalInvocationId }, + workgroupSize: [64], })((input) => { - const gid = input.gid; - randf.seed(seedBufferSlotTempAlias.$[gid.x]); - sampleBufferSlotTempAlias.$[gid.x] = distributionSlotTempAlias.$(); + const id = input.gid.x; + if (id >= seedBufferSlotTempAlias.$.length) return; + randf.seed(seedBufferSlotTempAlias.$[id]); + sampleBufferSlotTempAlias.$[id] = distributionSlotTempAlias.$(); }); } set count(value: number) { this.#count = value; - this.#samplesBuffer = this.#root.createBuffer(d.arrayOf(d.vec3f, value)) - .$usage( - 'storage', - ); - - this.#seedBuffer = this.#root.createBuffer( - d.arrayOf(d.f32, value), - Array.from({ length: value }, () => Math.random()), - ).$usage('storage'); + this.#samplesBuffer = this.#root + .createBuffer(d.arrayOf(d.vec3f, value)) + .$usage('storage'); + this.#seedBuffer = this.#root + .createBuffer( + d.arrayOf(d.f32, value), + Array.from({ length: value }, () => Math.random()), + ).$usage('storage'); } get count() { @@ -98,7 +87,7 @@ export class Executor { .withCompute(this.#dataMoreWorkersFunc as TgpuComputeFn) .createPipeline(); - pipeline.dispatchWorkgroups(this.#count); + pipeline.dispatchWorkgroups(Math.ceil(this.#count / 64)); return await this.#samplesBuffer.read(); } diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/index.ts b/apps/typegpu-docs/src/content/examples/simple/probability/index.ts index ca4512324..0eaeea5b9 100644 --- a/apps/typegpu-docs/src/content/examples/simple/probability/index.ts +++ b/apps/typegpu-docs/src/content/examples/simple/probability/index.ts @@ -12,22 +12,16 @@ const executor = new Executor(root, c.initialNumSamples); const plotter = new Plotter(); let currentDistribution = c.initialDistribution; -let replotFlag = false; const replot = async ( currentDistribution: Distribution, animate = false, ) => { - replotFlag = true; - try { - let samples = undefined; - const prng = getPRNG(currentDistribution); + let samples = undefined; + const prng = getPRNG(currentDistribution); - samples = await executor.executeMoreWorkers(prng.prng); - plotter.plot(samples, prng, animate); - } finally { - replotFlag = false; - } + samples = await executor.executeMoreWorkers(prng.prng); + plotter.plot(samples, prng, animate); }; // #region Example controls & Cleanup @@ -51,16 +45,19 @@ canvas.addEventListener('touchend', () => helpInfo.style.opacity = '1'; }, 5000)); +plotter.resetView(getCameraPosition(currentDistribution)); + export const controls = { 'Reset Camera': { - onButtonClick: () => - plotter.resetView(getCameraPosition(currentDistribution)), + onButtonClick: () => { + plotter.resetView(getCameraPosition(currentDistribution)); + }, }, 'Distribution': { initial: c.initialDistribution, options: c.distributions, onSelectChange: async (value: Distribution) => { - if (currentDistribution === value || replotFlag) { + if (currentDistribution === value) { return; } @@ -76,9 +73,6 @@ export const controls = { initial: c.initialNumSamples, options: c.numSamplesOptions, onSelectChange: async (value: number) => { - if (replotFlag) { - return; - } executor.count = value; await replot( currentDistribution, From 3eae7b5300c3cb89b3bba916c6d4bd0aba0a5930 Mon Sep 17 00:00:00 2001 From: Szymon Szulc Date: Sat, 30 Aug 2025 02:18:47 +0200 Subject: [PATCH 42/64] Reseed button and minor changes --- .../examples/simple/probability/constants.ts | 1 + .../examples/simple/probability/executor.ts | 6 ++++++ .../content/examples/simple/probability/index.ts | 16 +++++++++++++--- .../examples/simple/probability/plotter.ts | 10 +++++----- 4 files changed, 25 insertions(+), 8 deletions(-) diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/constants.ts b/apps/typegpu-docs/src/content/examples/simple/probability/constants.ts index 2129b9b06..cf8aa2522 100644 --- a/apps/typegpu-docs/src/content/examples/simple/probability/constants.ts +++ b/apps/typegpu-docs/src/content/examples/simple/probability/constants.ts @@ -1,5 +1,6 @@ import { Distribution } from './types.ts'; +export const popupCooldown = 100000; export const cameraPositionGeo = [0, 0, 0.5]; export const cameraPositionHist = [0, 0, 0.2]; export const initialCameraAngle = 15; diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/executor.ts b/apps/typegpu-docs/src/content/examples/simple/probability/executor.ts index 503648e56..5330357bb 100644 --- a/apps/typegpu-docs/src/content/examples/simple/probability/executor.ts +++ b/apps/typegpu-docs/src/content/examples/simple/probability/executor.ts @@ -61,6 +61,12 @@ export class Executor { }); } + reseed() { + this.#seedBuffer.write( + Array.from({ length: this.#count }, () => Math.random()), + ); + } + set count(value: number) { this.#count = value; this.#samplesBuffer = this.#root diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/index.ts b/apps/typegpu-docs/src/content/examples/simple/probability/index.ts index 0eaeea5b9..95283273e 100644 --- a/apps/typegpu-docs/src/content/examples/simple/probability/index.ts +++ b/apps/typegpu-docs/src/content/examples/simple/probability/index.ts @@ -21,7 +21,7 @@ const replot = async ( const prng = getPRNG(currentDistribution); samples = await executor.executeMoreWorkers(prng.prng); - plotter.plot(samples, prng, animate); + await plotter.plot(samples, prng, animate); }; // #region Example controls & Cleanup @@ -35,7 +35,7 @@ canvas.addEventListener('mouseover', () => { canvas.addEventListener('mouseout', () => setTimeout(() => { helpInfo.style.opacity = '1'; - }, 5000)); + }, c.popupCooldown)); // handle mobile devices canvas.addEventListener('touchstart', () => { helpInfo.style.opacity = '0'; @@ -43,7 +43,7 @@ canvas.addEventListener('touchstart', () => { canvas.addEventListener('touchend', () => setTimeout(() => { helpInfo.style.opacity = '1'; - }, 5000)); + }, c.popupCooldown)); plotter.resetView(getCameraPosition(currentDistribution)); @@ -53,6 +53,16 @@ export const controls = { plotter.resetView(getCameraPosition(currentDistribution)); }, }, + 'Reseed': { + onButtonClick: async () => { + executor.reseed(); + await replot( + currentDistribution, + true, + ); + plotter.resetView(getCameraPosition(currentDistribution)); + }, + }, 'Distribution': { initial: c.initialDistribution, options: c.distributions, diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/plotter.ts b/apps/typegpu-docs/src/content/examples/simple/probability/plotter.ts index 9af69ad0f..7d46b518a 100644 --- a/apps/typegpu-docs/src/content/examples/simple/probability/plotter.ts +++ b/apps/typegpu-docs/src/content/examples/simple/probability/plotter.ts @@ -46,11 +46,11 @@ export class Plotter { this.#core.renderer.transitionTime = 1; // it is number from [0, 1] indicating the state of the animation - 1 means current } - async plot(samples: d.v3f[], prng: PRNG, animate = false) { + async plot(samples: d.v3f[], prng: PRNG, animate = false): Promise { let needNewBuffer = false; if (samples.length !== this.#count) { - needNewBuffer = true; this.#count = samples.length; + needNewBuffer = true; } switch (prng.plotType) { @@ -97,7 +97,7 @@ export class Plotter { subplotter: () => void, animate: boolean, needNewBuffer: boolean, - ) { + ): Promise { if (animate && !needNewBuffer) { this.#makeRoomForNewPlot(); } @@ -134,9 +134,8 @@ export class Plotter { } #distributionsTransition(): Promise { - const start = performance.now(); - return new Promise((resolve) => { + const start = performance.now(); const animateTransition = (time: number) => { const duration = time - start; @@ -155,6 +154,7 @@ export class Plotter { requestAnimationFrame(animateTransition); } else { resolve(); + return; } }; requestAnimationFrame(animateTransition); From b4f083152e554050e5a41bbb3193181f68efeb41 Mon Sep 17 00:00:00 2001 From: Szymon Szulc Date: Wed, 3 Sep 2025 14:07:03 +0200 Subject: [PATCH 43/64] Fix randf.sampleExclusive --- packages/typegpu-noise/src/random.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/typegpu-noise/src/random.ts b/packages/typegpu-noise/src/random.ts index b18aadd1c..6e49fb699 100644 --- a/packages/typegpu-noise/src/random.ts +++ b/packages/typegpu-noise/src/random.ts @@ -18,7 +18,7 @@ import { import { randomGeneratorSlot } from './generator.ts'; const TWO_PI = Math.PI * 2; -const EPS = 1e-9; +const EPS = 1e-7; // don't ever get any lower than this export const randSeed: TgpuFn<(seed: d.F32) => d.Void> = tgpu .fn([d.f32])((seed) => { @@ -93,9 +93,9 @@ export const randInUnitSphere: TgpuFn<() => d.Vec3f> = tgpu const u = randomGeneratorSlot.value.sample(); const v = d.vec3f(randNormal(0, 1), randNormal(0, 1), randNormal(0, 1)); - const vNorm = safeNormalize(v); + const vNorm = normalize(v); - return vNorm.mul(pow(u, 1 / 3)); + return vNorm.mul(pow(u, 0.33)); }); export const randOnUnitSphere: TgpuFn<() => d.Vec3f> = tgpu From 641e621823d76dbb50664dacb790dd307c69f0d7 Mon Sep 17 00:00:00 2001 From: Szymon Szulc Date: Wed, 3 Sep 2025 16:16:53 +0200 Subject: [PATCH 44/64] Bind Group Layouts --- .../examples/simple/probability/executor.ts | 58 +++++++++---------- .../examples/simple/probability/index.ts | 2 +- 2 files changed, 28 insertions(+), 32 deletions(-) diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/executor.ts b/apps/typegpu-docs/src/content/examples/simple/probability/executor.ts index 5330357bb..0d87cb165 100644 --- a/apps/typegpu-docs/src/content/examples/simple/probability/executor.ts +++ b/apps/typegpu-docs/src/content/examples/simple/probability/executor.ts @@ -1,6 +1,8 @@ import tgpu from 'typegpu'; import type { StorageFlag, + TgpuBindGroup, + TgpuBindGroupLayout, TgpuBuffer, TgpuComputeFn, TgpuFn, @@ -13,51 +15,39 @@ import { randf } from '@typegpu/noise'; export class Executor { readonly #root: TgpuRoot; // don't exceed max workgroup grid X dimension size - #count: number; - #samplesBuffer: + #count!: number; + #samplesBuffer!: & TgpuBuffer> & StorageFlag; - #seedBuffer: + #seedBuffer!: & TgpuBuffer> & StorageFlag; readonly #dataMoreWorkersFunc: TgpuComputeFn; readonly #distributionSlot: TgpuSlot d.Vec3f>>; - readonly #sampleBufferSlot; - readonly #seedBufferSlot; + readonly #bindGroupLayout: TgpuBindGroupLayout; + #bindGroup!: TgpuBindGroup; - constructor(root: TgpuRoot, count: number) { + constructor(root: TgpuRoot) { this.#root = root; - this.#count = count; - this.#samplesBuffer = this.#root - .createBuffer(d.arrayOf(d.vec3f, count)) - .$usage('storage'); - this.#seedBuffer = this.#root - .createBuffer( - d.arrayOf(d.f32, count), - Array.from({ length: count }, () => Math.random()), - ) - .$usage('storage'); - const sampleBufferSlotTempAlias = tgpu.slot( - this.#samplesBuffer.as('mutable'), - ); const distributionSlotTempAlias = tgpu.slot d.Vec3f>>(); - const seedBufferSlotTempAlias = tgpu.slot( - this.#seedBuffer.as('mutable'), - ); - - this.#sampleBufferSlot = sampleBufferSlotTempAlias; this.#distributionSlot = distributionSlotTempAlias; - this.#seedBufferSlot = seedBufferSlotTempAlias; + + const bindGroupLayoutTempAlias = tgpu.bindGroupLayout({ + seedBuffer: { storage: d.arrayOf(d.f32), access: 'readonly' }, + samplesBuffer: { storage: d.arrayOf(d.vec3f), access: 'mutable' }, + }); + this.#bindGroupLayout = bindGroupLayoutTempAlias; this.#dataMoreWorkersFunc = tgpu['~unstable'].computeFn({ in: { gid: d.builtin.globalInvocationId }, workgroupSize: [64], })((input) => { const id = input.gid.x; - if (id >= seedBufferSlotTempAlias.$.length) return; - randf.seed(seedBufferSlotTempAlias.$[id]); - sampleBufferSlotTempAlias.$[id] = distributionSlotTempAlias.$(); + if (id >= bindGroupLayoutTempAlias.$.samplesBuffer.length) return; + randf.seed(bindGroupLayoutTempAlias.$.seedBuffer[id]); + bindGroupLayoutTempAlias.$.samplesBuffer[id] = distributionSlotTempAlias + .$(); }); } @@ -77,6 +67,11 @@ export class Executor { d.arrayOf(d.f32, value), Array.from({ length: value }, () => Math.random()), ).$usage('storage'); + + this.#bindGroup = this.#root.createBindGroup(this.#bindGroupLayout, { + seedBuffer: this.#seedBuffer, + samplesBuffer: this.#samplesBuffer, + }); } get count() { @@ -87,13 +82,14 @@ export class Executor { distribution: TgpuFn<() => d.Vec3f>, ): Promise { const pipeline = this.#root['~unstable'] - .with(this.#sampleBufferSlot, this.#samplesBuffer.as('mutable')) - .with(this.#seedBufferSlot, this.#seedBuffer.as('mutable')) .with(this.#distributionSlot, distribution) .withCompute(this.#dataMoreWorkersFunc as TgpuComputeFn) .createPipeline(); - pipeline.dispatchWorkgroups(Math.ceil(this.#count / 64)); + pipeline + .with(this.#bindGroupLayout, this.#bindGroup) + .dispatchWorkgroups(Math.ceil(this.#count / 64)); + this.#root['~unstable'].flush(); return await this.#samplesBuffer.read(); } diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/index.ts b/apps/typegpu-docs/src/content/examples/simple/probability/index.ts index 95283273e..1e9389586 100644 --- a/apps/typegpu-docs/src/content/examples/simple/probability/index.ts +++ b/apps/typegpu-docs/src/content/examples/simple/probability/index.ts @@ -8,7 +8,7 @@ import { getCameraPosition, getPRNG } from './helpers.ts'; const root = await tgpu.init(); -const executor = new Executor(root, c.initialNumSamples); +const executor = new Executor(root); const plotter = new Plotter(); let currentDistribution = c.initialDistribution; From e7d370c66031c92c13a7a763518f6561501856b2 Mon Sep 17 00:00:00 2001 From: Szymon Szulc Date: Wed, 3 Sep 2025 16:36:01 +0200 Subject: [PATCH 45/64] Buffer cache --- .../examples/simple/probability/executor.ts | 36 +++++++++++++------ 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/executor.ts b/apps/typegpu-docs/src/content/examples/simple/probability/executor.ts index 0d87cb165..95bb8548a 100644 --- a/apps/typegpu-docs/src/content/examples/simple/probability/executor.ts +++ b/apps/typegpu-docs/src/content/examples/simple/probability/executor.ts @@ -13,7 +13,6 @@ import * as d from 'typegpu/data'; import { randf } from '@typegpu/noise'; export class Executor { - readonly #root: TgpuRoot; // don't exceed max workgroup grid X dimension size #count!: number; #samplesBuffer!: @@ -22,13 +21,24 @@ export class Executor { #seedBuffer!: & TgpuBuffer> & StorageFlag; + #bindGroup!: TgpuBindGroup; + readonly #root: TgpuRoot; readonly #dataMoreWorkersFunc: TgpuComputeFn; readonly #distributionSlot: TgpuSlot d.Vec3f>>; readonly #bindGroupLayout: TgpuBindGroupLayout; - #bindGroup!: TgpuBindGroup; + readonly #bufferCache: Map< + number, + [ + & TgpuBuffer> + & StorageFlag, + & TgpuBuffer> + & StorageFlag, + ] + >; constructor(root: TgpuRoot) { this.#root = root; + this.#bufferCache = new Map(); const distributionSlotTempAlias = tgpu.slot d.Vec3f>>(); this.#distributionSlot = distributionSlotTempAlias; @@ -59,14 +69,20 @@ export class Executor { set count(value: number) { this.#count = value; - this.#samplesBuffer = this.#root - .createBuffer(d.arrayOf(d.vec3f, value)) - .$usage('storage'); - this.#seedBuffer = this.#root - .createBuffer( - d.arrayOf(d.f32, value), - Array.from({ length: value }, () => Math.random()), - ).$usage('storage'); + if (this.#bufferCache.has(value)) { + // biome-ignore lint/style/noNonNullAssertion: just checked it above + [this.#samplesBuffer, this.#seedBuffer] = this.#bufferCache.get(value)!; + } else { + this.#samplesBuffer = this.#root + .createBuffer(d.arrayOf(d.vec3f, value)) + .$usage('storage'); + this.#seedBuffer = this.#root + .createBuffer( + d.arrayOf(d.f32, value), + Array.from({ length: value }, () => Math.random()), + ).$usage('storage'); + this.#bufferCache.set(value, [this.#samplesBuffer, this.#seedBuffer]); + } this.#bindGroup = this.#root.createBindGroup(this.#bindGroupLayout, { seedBuffer: this.#seedBuffer, From 4c5bf8e7001847f9b23eaab6cb07e63aaabe21ec Mon Sep 17 00:00:00 2001 From: Szymon Szulc Date: Wed, 3 Sep 2025 16:47:50 +0200 Subject: [PATCH 46/64] Pipeline cache --- apps/typegpu-docs/astro.config.mjs | 1 - .../examples/simple/probability/executor.ts | 23 +++++++++++-------- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/apps/typegpu-docs/astro.config.mjs b/apps/typegpu-docs/astro.config.mjs index e79daf5da..8d08263f4 100644 --- a/apps/typegpu-docs/astro.config.mjs +++ b/apps/typegpu-docs/astro.config.mjs @@ -4,7 +4,6 @@ import react from '@astrojs/react'; import sitemap from '@astrojs/sitemap'; import starlight from '@astrojs/starlight'; import tailwindVite from '@tailwindcss/vite'; -import basicSsl from '@vitejs/plugin-basic-ssl'; import { defineConfig } from 'astro/config'; import starlightBlog from 'starlight-blog'; import starlightTypeDoc, { typeDocSidebarGroup } from 'starlight-typedoc'; diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/executor.ts b/apps/typegpu-docs/src/content/examples/simple/probability/executor.ts index 95bb8548a..a5824ff1d 100644 --- a/apps/typegpu-docs/src/content/examples/simple/probability/executor.ts +++ b/apps/typegpu-docs/src/content/examples/simple/probability/executor.ts @@ -5,6 +5,7 @@ import type { TgpuBindGroupLayout, TgpuBuffer, TgpuComputeFn, + TgpuComputePipeline, TgpuFn, TgpuRoot, TgpuSlot, @@ -35,10 +36,12 @@ export class Executor { & StorageFlag, ] >; + readonly #pipelineCache: Map; constructor(root: TgpuRoot) { this.#root = root; this.#bufferCache = new Map(); + this.#pipelineCache = new Map(); const distributionSlotTempAlias = tgpu.slot d.Vec3f>>(); this.#distributionSlot = distributionSlotTempAlias; @@ -90,22 +93,24 @@ export class Executor { }); } - get count() { - return this.#count; - } - async executeMoreWorkers( distribution: TgpuFn<() => d.Vec3f>, ): Promise { - const pipeline = this.#root['~unstable'] - .with(this.#distributionSlot, distribution) - .withCompute(this.#dataMoreWorkersFunc as TgpuComputeFn) - .createPipeline(); + let pipeline: TgpuComputePipeline; + if (this.#pipelineCache.has(distribution)) { + // biome-ignore lint/style/noNonNullAssertion: just checked it above + pipeline = this.#pipelineCache.get(distribution)!; + } else { + pipeline = this.#root['~unstable'] + .with(this.#distributionSlot, distribution) + .withCompute(this.#dataMoreWorkersFunc as TgpuComputeFn) + .createPipeline(); + this.#pipelineCache.set(distribution, pipeline); + } pipeline .with(this.#bindGroupLayout, this.#bindGroup) .dispatchWorkgroups(Math.ceil(this.#count / 64)); - this.#root['~unstable'].flush(); return await this.#samplesBuffer.read(); } From b2bb9d2bd245e9f2b9ac71992036e71aebf336bd Mon Sep 17 00:00:00 2001 From: Szymon Szulc Date: Fri, 29 Aug 2025 11:00:00 +0200 Subject: [PATCH 47/64] Generator slot docs --- .../content/docs/ecosystem/typegpu-noise.mdx | 68 ++++++++++- .../content/examples/simple/triangle/index.ts | 111 ++++++++---------- 2 files changed, 119 insertions(+), 60 deletions(-) diff --git a/apps/typegpu-docs/src/content/docs/ecosystem/typegpu-noise.mdx b/apps/typegpu-docs/src/content/docs/ecosystem/typegpu-noise.mdx index 729f1025e..7a0f76375 100644 --- a/apps/typegpu-docs/src/content/docs/ecosystem/typegpu-noise.mdx +++ b/apps/typegpu-docs/src/content/docs/ecosystem/typegpu-noise.mdx @@ -10,7 +10,7 @@ It also features a [Perlin noise](#perlin-noise) implementation, which is useful effects, terrains, and other procedural elements. :::note -Threads do not share the generator's `State`. As a result, unless you change the seed or provide thread-dependent variables, each thread will produce the same sequence of sampled values. +Threads do not share the generator's `State`. As a result, unless you change the seed in each thread, each thread will produce the same sequence of sampled values. ::: ## Use with either TypeGPU or WebGPU @@ -267,3 +267,69 @@ pipeline // a different domain size bindGroup = initBindGroup(d.vec3u(5, 5, 1)); ``` + +## Generator slot +The package provides convenient way to change PRNG as needed. +You can easily implement your own PRNG and plug it into the pipeline. + +```ts twoslash +import tgpu from 'typegpu'; +import * as d from 'typegpu/data'; +import { randf } from '@typegpu/noise'; + +const root = await tgpu.init(); + +const b = root.createMutable(d.f32); +const f = tgpu['~unstable'].computeFn({ workgroupSize: [1] })(() => { + b.$ = randf.sample(); +}); +// ---cut--- +import { + randomGeneratorShell, + randomGeneratorSlot, + type StatefulGenerator, +} from '@typegpu/noise'; +import * as std from 'typegpu/std'; + +const LCG: StatefulGenerator = (() => { + const seed = tgpu['~unstable'].privateVar(d.u32); + + const u32ToFloat = tgpu.fn([d.u32], d.f32)`(val){ + let exponent: u32 = 0x3f800000; + let mantissa: u32 = 0x007fffff & val; + var ufloat: u32 = (exponent | mantissa); + return bitcast(ufloat) - 1f; + }`; + + return { + seed: tgpu.fn([d.f32])((value) => { + seed.$ = d.u32(value * std.pow(32, 3)); + }), + seed2: tgpu.fn([d.vec2f])((value) => { + seed.$ = d.u32(value.x * std.pow(32, 3) + value.y * std.pow(32, 2)); + }), + seed3: tgpu.fn([d.vec3f])((value) => { + seed.$ = d.u32( + value.x * std.pow(32, 3) + value.y * std.pow(32, 2) + + value.z * std.pow(32, 1), + ); + }), + seed4: tgpu.fn([d.vec4f])((value) => { + seed.$ = d.u32( + value.x * std.pow(32, 3) + value.y * std.pow(32, 2) + + value.z * std.pow(32, 1) + value.w * std.pow(32, 0), + ); + }), + sample: randomGeneratorShell(() => { + 'kernel'; + seed.$ = seed.$ * 1664525 + 1013904223; // implicit modulo 2 ^ 32 + return u32ToFloat(seed.$); + }), + }; +})(); + +const pipeline = root['~unstable'] + .with(randomGeneratorSlot, LCG) + .withCompute(f) + .createPipeline(); +``` diff --git a/apps/typegpu-docs/src/content/examples/simple/triangle/index.ts b/apps/typegpu-docs/src/content/examples/simple/triangle/index.ts index d9553b6fd..bcecd335e 100644 --- a/apps/typegpu-docs/src/content/examples/simple/triangle/index.ts +++ b/apps/typegpu-docs/src/content/examples/simple/triangle/index.ts @@ -1,69 +1,62 @@ import tgpu from 'typegpu'; import * as d from 'typegpu/data'; - -const purple = d.vec4f(0.769, 0.392, 1.0, 1); -const blue = d.vec4f(0.114, 0.447, 0.941, 1); - -const getGradientColor = tgpu.fn([d.f32], d.vec4f) /* wgsl */`(ratio) { - return mix(purple, blue, ratio); -} -`.$uses({ purple, blue }); - -const mainVertex = tgpu['~unstable'].vertexFn({ - in: { vertexIndex: d.builtin.vertexIndex }, - out: { outPos: d.builtin.position, uv: d.vec2f }, -}) /* wgsl */`{ - var pos = array( - vec2(0.0, 0.5), - vec2(-0.5, -0.5), - vec2(0.5, -0.5) - ); - - var uv = array( - vec2(0.5, 1.0), - vec2(0.0, 0.0), - vec2(1.0, 0.0), - ); - - return Out(vec4f(pos[in.vertexIndex], 0.0, 1.0), uv[in.vertexIndex]); -}`; - -const mainFragment = tgpu['~unstable'].fragmentFn({ - in: { uv: d.vec2f }, - out: d.vec4f, -}) /* wgsl */`{ - return getGradientColor((in.uv[0] + in.uv[1]) / 2); -} -`.$uses({ getGradientColor }); +import { randf } from '@typegpu/noise'; const root = await tgpu.init(); -const presentationFormat = navigator.gpu.getPreferredCanvasFormat(); -const canvas = document.querySelector('canvas') as HTMLCanvasElement; -const context = canvas.getContext('webgpu') as GPUCanvasContext; - -context.configure({ - device: root.device, - format: presentationFormat, - alphaMode: 'premultiplied', +const b = root.createMutable(d.f32); +const f = tgpu['~unstable'].computeFn({ workgroupSize: [1] })(() => { + b.$ = randf.sample(); }); +import { + randomGeneratorShell, + randomGeneratorSlot, + type StatefulGenerator, +} from '@typegpu/noise'; +import * as std from 'typegpu/std'; + +const LCG: StatefulGenerator = (() => { + const seed = tgpu['~unstable'].privateVar(d.u32); + + const u32ToFloat = tgpu.fn([d.u32], d.f32)`(val){ + let exponent: u32 = 0x3f800000; + let mantissa: u32 = 0x007fffff & val; + var ufloat: u32 = (exponent | mantissa); + return bitcast(ufloat) - 1f; + }`; + + return { + seed: tgpu.fn([d.f32])((value) => { + seed.$ = d.u32(value * std.pow(32, 3)); + }), + seed2: tgpu.fn([d.vec2f])((value) => { + seed.$ = d.u32(value.x * std.pow(32, 3) + value.y * std.pow(32, 2)); + }), + seed3: tgpu.fn([d.vec3f])((value) => { + seed.$ = d.u32( + value.x * std.pow(32, 3) + value.y * std.pow(32, 2) + + value.z * std.pow(32, 1), + ); + }), + seed4: tgpu.fn([d.vec4f])((value) => { + seed.$ = d.u32( + value.x * std.pow(32, 3) + value.y * std.pow(32, 2) + + value.z * std.pow(32, 1) + value.w * std.pow(32, 0), + ); + }), + sample: randomGeneratorShell(() => { + 'kernel'; + seed.$ = seed.$ * 1664525 + 1013904223; // % 2 ^ 32 + return u32ToFloat(seed.$); + }), + }; +})(); + const pipeline = root['~unstable'] - .withVertex(mainVertex, {}) - .withFragment(mainFragment, { format: presentationFormat }) + .with(randomGeneratorSlot, LCG) + .withCompute(f) .createPipeline(); -setTimeout(() => { - pipeline - .withColorAttachment({ - view: context.getCurrentTexture().createView(), - clearValue: [0, 0, 0, 0], - loadOp: 'clear', - storeOp: 'store', - }) - .draw(3); -}, 100); - -export function onCleanup() { - root.destroy(); -} +pipeline.dispatchWorkgroups(1); +console.log(await b.read()); From 31b9131154d45ac9236b2776bae3403edfb0d70d Mon Sep 17 00:00:00 2001 From: Szymon Szulc Date: Fri, 29 Aug 2025 12:07:29 +0200 Subject: [PATCH 48/64] more docs --- packages/typegpu-noise/src/index.ts | 69 +++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) diff --git a/packages/typegpu-noise/src/index.ts b/packages/typegpu-noise/src/index.ts index fa1917809..d98c21c36 100644 --- a/packages/typegpu-noise/src/index.ts +++ b/packages/typegpu-noise/src/index.ts @@ -20,23 +20,91 @@ import { } from './random.ts'; export const randf: { + /** + * Sets the private seed of the thread. + * @param seed seed value to set. For the best results, should be in [0, 1] range. + */ seed: typeof randSeed; + /** + * Sets the private seed of the thread. + * @param seed seed value to set. For the best results, all elements should be in [0, 1] range. + */ seed2: typeof randSeed2; + /** + * Sets the private seed of the thread. + * @param seed seed value to set. For the best results, all elements should be in [0, 1] range. + */ seed3: typeof randSeed3; + /** + * Sets the private seed of the thread. + * @param seed seed value to set. For the best results, all elements should be in [0, 1] range. + */ seed4: typeof randSeed4; + /** + * Returns a random f32 value in [0, 1) range. + */ sample: typeof randFloat01; + /** + * Returns a random f32 value in (0, 1) range. + */ sampleExclusive: typeof randFloat01Exclusive; + /** + * Returns a random f32 value basen on normal (gaussian) distribution. + * @param mu mean value. + * @param sigma standard deviation. Must be > 0. + */ normal: typeof randNormal; + /** + * Returns a random f32 value basen on exponential distribution. + * @param rate rate parameter. Must be > 0. + */ exponential: typeof randExponential; + /** + * Returns a random f32 value basen on cauchy distribution. + * @param x0 location parameter. + * @param gamma scale parameter. Must be > 0. + */ cauchy: typeof randCauchy; + /** + * Returns 1 with probability p, 0 with probability 1 - p. + * @param p probability of sampling 1. Must be in [0, 1]. + */ bernoulli: typeof randBernoulli; + /** + * Returns a random 2D vector uniformly distributed inside a unit circle. + */ inUnitCircle: typeof randInUnitCircle; + /** + * Returns a random 2D vector uniformly distributed on a unit circle. + */ onUnitCircle: typeof randOnUnitCircle; + /** + * Returns a random 3D vector uniformly distributed inside a unit cube. + */ inUnitCube: typeof randInUnitCube; + /** + * Returns a random 3D vector uniformly distributed on a unit cube. + */ onUnitCube: typeof randOnUnitCube; + /** + * Returns a random 3D vector uniformly distributed inside an upper hemisphere + * oriented according to a given normal vector. + * @param normal normal vector. + */ inHemisphere: typeof randInUnitHemisphere; + /** + * Returns a random 3D vector uniformly distributed on the surface of + * an upper hemisphere oriented according to a given normal vector. + * @param normal normal vector. + */ onHemisphere: typeof randOnUnitHemisphere; + /** + * Returns a random 3D vector uniformly distributed inside a unit sphere. + */ inUnitSphere: typeof randInUnitSphere; + /** + * Returns a random 3D vector uniformly distributed on a unit sphere. + */ onUnitSphere: typeof randOnUnitSphere; } = { seed: randSeed, @@ -68,6 +136,7 @@ export { // --- randomGeneratorShell, randomGeneratorSlot, + type StatefulGenerator, } from './generator.ts'; export * as perlin2d from './perlin-2d/index.ts'; From bcd57b12bbdb4314ec8c8693a423441054c01de8 Mon Sep 17 00:00:00 2001 From: Szymon Szulc Date: Fri, 29 Aug 2025 12:17:08 +0200 Subject: [PATCH 49/64] Visual uniformity test --- .../content/examples/simple/triangle/index.ts | 111 ++++++++++-------- .../examples/tests/uniformity/index.html | 1 + .../examples/tests/uniformity/index.ts | 91 ++++++++++++++ .../content/examples/tests/uniformity/lcg.ts | 41 +++++++ .../examples/tests/uniformity/meta.json | 5 + 5 files changed, 197 insertions(+), 52 deletions(-) create mode 100644 apps/typegpu-docs/src/content/examples/tests/uniformity/index.html create mode 100644 apps/typegpu-docs/src/content/examples/tests/uniformity/index.ts create mode 100644 apps/typegpu-docs/src/content/examples/tests/uniformity/lcg.ts create mode 100644 apps/typegpu-docs/src/content/examples/tests/uniformity/meta.json diff --git a/apps/typegpu-docs/src/content/examples/simple/triangle/index.ts b/apps/typegpu-docs/src/content/examples/simple/triangle/index.ts index bcecd335e..d9553b6fd 100644 --- a/apps/typegpu-docs/src/content/examples/simple/triangle/index.ts +++ b/apps/typegpu-docs/src/content/examples/simple/triangle/index.ts @@ -1,62 +1,69 @@ import tgpu from 'typegpu'; import * as d from 'typegpu/data'; -import { randf } from '@typegpu/noise'; + +const purple = d.vec4f(0.769, 0.392, 1.0, 1); +const blue = d.vec4f(0.114, 0.447, 0.941, 1); + +const getGradientColor = tgpu.fn([d.f32], d.vec4f) /* wgsl */`(ratio) { + return mix(purple, blue, ratio); +} +`.$uses({ purple, blue }); + +const mainVertex = tgpu['~unstable'].vertexFn({ + in: { vertexIndex: d.builtin.vertexIndex }, + out: { outPos: d.builtin.position, uv: d.vec2f }, +}) /* wgsl */`{ + var pos = array( + vec2(0.0, 0.5), + vec2(-0.5, -0.5), + vec2(0.5, -0.5) + ); + + var uv = array( + vec2(0.5, 1.0), + vec2(0.0, 0.0), + vec2(1.0, 0.0), + ); + + return Out(vec4f(pos[in.vertexIndex], 0.0, 1.0), uv[in.vertexIndex]); +}`; + +const mainFragment = tgpu['~unstable'].fragmentFn({ + in: { uv: d.vec2f }, + out: d.vec4f, +}) /* wgsl */`{ + return getGradientColor((in.uv[0] + in.uv[1]) / 2); +} +`.$uses({ getGradientColor }); const root = await tgpu.init(); -const b = root.createMutable(d.f32); -const f = tgpu['~unstable'].computeFn({ workgroupSize: [1] })(() => { - b.$ = randf.sample(); -}); +const presentationFormat = navigator.gpu.getPreferredCanvasFormat(); +const canvas = document.querySelector('canvas') as HTMLCanvasElement; +const context = canvas.getContext('webgpu') as GPUCanvasContext; -import { - randomGeneratorShell, - randomGeneratorSlot, - type StatefulGenerator, -} from '@typegpu/noise'; -import * as std from 'typegpu/std'; - -const LCG: StatefulGenerator = (() => { - const seed = tgpu['~unstable'].privateVar(d.u32); - - const u32ToFloat = tgpu.fn([d.u32], d.f32)`(val){ - let exponent: u32 = 0x3f800000; - let mantissa: u32 = 0x007fffff & val; - var ufloat: u32 = (exponent | mantissa); - return bitcast(ufloat) - 1f; - }`; - - return { - seed: tgpu.fn([d.f32])((value) => { - seed.$ = d.u32(value * std.pow(32, 3)); - }), - seed2: tgpu.fn([d.vec2f])((value) => { - seed.$ = d.u32(value.x * std.pow(32, 3) + value.y * std.pow(32, 2)); - }), - seed3: tgpu.fn([d.vec3f])((value) => { - seed.$ = d.u32( - value.x * std.pow(32, 3) + value.y * std.pow(32, 2) + - value.z * std.pow(32, 1), - ); - }), - seed4: tgpu.fn([d.vec4f])((value) => { - seed.$ = d.u32( - value.x * std.pow(32, 3) + value.y * std.pow(32, 2) + - value.z * std.pow(32, 1) + value.w * std.pow(32, 0), - ); - }), - sample: randomGeneratorShell(() => { - 'kernel'; - seed.$ = seed.$ * 1664525 + 1013904223; // % 2 ^ 32 - return u32ToFloat(seed.$); - }), - }; -})(); +context.configure({ + device: root.device, + format: presentationFormat, + alphaMode: 'premultiplied', +}); const pipeline = root['~unstable'] - .with(randomGeneratorSlot, LCG) - .withCompute(f) + .withVertex(mainVertex, {}) + .withFragment(mainFragment, { format: presentationFormat }) .createPipeline(); -pipeline.dispatchWorkgroups(1); -console.log(await b.read()); +setTimeout(() => { + pipeline + .withColorAttachment({ + view: context.getCurrentTexture().createView(), + clearValue: [0, 0, 0, 0], + loadOp: 'clear', + storeOp: 'store', + }) + .draw(3); +}, 100); + +export function onCleanup() { + root.destroy(); +} diff --git a/apps/typegpu-docs/src/content/examples/tests/uniformity/index.html b/apps/typegpu-docs/src/content/examples/tests/uniformity/index.html new file mode 100644 index 000000000..581d6789f --- /dev/null +++ b/apps/typegpu-docs/src/content/examples/tests/uniformity/index.html @@ -0,0 +1 @@ + diff --git a/apps/typegpu-docs/src/content/examples/tests/uniformity/index.ts b/apps/typegpu-docs/src/content/examples/tests/uniformity/index.ts new file mode 100644 index 000000000..fb66129db --- /dev/null +++ b/apps/typegpu-docs/src/content/examples/tests/uniformity/index.ts @@ -0,0 +1,91 @@ +import tgpu from 'typegpu'; +import * as d from 'typegpu/data'; +import * as std from 'typegpu/std'; +import { randf, randomGeneratorSlot } from '@typegpu/noise'; +import { LCG } from './lcg.ts'; + +const root = await tgpu.init(); + +const fullScreenTriangle = tgpu['~unstable'].vertexFn({ + in: { vertexIndex: d.builtin.vertexIndex }, + out: { pos: d.builtin.position, uv: d.vec2f }, +})((input) => { + const pos = [d.vec2f(-1, -1), d.vec2f(3, -1), d.vec2f(-1, 3)]; + + return { + pos: d.vec4f(pos[input.vertexIndex], 0.0, 1.0), + uv: pos[input.vertexIndex], + }; +}); + +// === GRID === +const gridSize = 100; + +const b1 = root.createBuffer(d.arrayOf(d.u32, gridSize * gridSize)).$usage( + 'storage', +); +const b2 = root.createBuffer(d.arrayOf(d.f32, gridSize * gridSize)).$usage( + 'storage', +); + +const layout = tgpu.bindGroupLayout({ + u: { + storage: d.arrayOf(d.u32, gridSize * gridSize), + access: 'mutable', + visibility: ['fragment'], + }, + f: { + storage: d.arrayOf(d.f32, gridSize * gridSize), + access: 'mutable', + visibility: ['fragment'], + }, +}); + +const group = root.createBindGroup(layout, { + u: b1, + f: b2, +}); + +const mainFragment = tgpu['~unstable'].fragmentFn({ + in: { uv: d.vec2f }, + out: d.vec4f, +})((input) => { + const uv = input.uv.add(d.f32(1)).div(d.f32(2)); + const grided = std.floor(uv.mul(gridSize)); + // const id = d.u32(grided.x * gridSize + grided.y); + + randf.seed2(grided); + const sample = randf.sample(); + + // layout.bound.u.$[id] = sample; + // layout.bound.f.$[id] = floater(sample); + + return d.vec4f(d.vec3f(sample), 1.0); +}); + +const canvas = document.querySelector('canvas') as HTMLCanvasElement; +const context = canvas.getContext('webgpu') as GPUCanvasContext; +const presentationFormat = navigator.gpu.getPreferredCanvasFormat(); +context.configure({ + device: root.device, + format: presentationFormat, + alphaMode: 'premultiplied', +}); + +const pipeline = root['~unstable'] + .with(randomGeneratorSlot, LCG) + .withVertex(fullScreenTriangle, {}) + .withFragment(mainFragment, { format: presentationFormat }) + .createPipeline(); + +pipeline + .with(layout, group) + .withColorAttachment({ + view: context.getCurrentTexture().createView(), + loadOp: 'clear', + storeOp: 'store', + }) + .draw(3); + +// console.log('our grid u32', await b1.read()); +// console.log('our grid f32', await b2.read()); diff --git a/apps/typegpu-docs/src/content/examples/tests/uniformity/lcg.ts b/apps/typegpu-docs/src/content/examples/tests/uniformity/lcg.ts new file mode 100644 index 000000000..147d609ae --- /dev/null +++ b/apps/typegpu-docs/src/content/examples/tests/uniformity/lcg.ts @@ -0,0 +1,41 @@ +import tgpu from 'typegpu'; +import * as d from 'typegpu/data'; +import * as std from 'typegpu/std'; +import { randomGeneratorShell, type StatefulGenerator } from '@typegpu/noise'; + +export const LCG: StatefulGenerator = (() => { + const seed = tgpu['~unstable'].privateVar(d.u32); + + const u32ToFloat = tgpu.fn([d.u32], d.f32)`(val){ + let exponent: u32 = 0x3f800000; + let mantissa: u32 = 0x007fffff & val; + var ufloat: u32 = (exponent | mantissa); + return bitcast(ufloat) - 1f; + }`; + + return { + seed: tgpu.fn([d.f32])((value) => { + seed.$ = d.u32(value * std.pow(32, 3)); + }), + seed2: tgpu.fn([d.vec2f])((value) => { + seed.$ = d.u32(value.x * std.pow(32, 3) + value.y * std.pow(32, 2)); + }), + seed3: tgpu.fn([d.vec3f])((value) => { + seed.$ = d.u32( + value.x * std.pow(32, 3) + value.y * std.pow(32, 2) + + value.z * std.pow(32, 1), + ); + }), + seed4: tgpu.fn([d.vec4f])((value) => { + seed.$ = d.u32( + value.x * std.pow(32, 3) + value.y * std.pow(32, 2) + + value.z * std.pow(32, 1) + value.w * std.pow(32, 0), + ); + }), + sample: randomGeneratorShell(() => { + 'kernel'; + seed.$ = seed.$ * 1664525 + 1013904223; // % 2 ^ 32 + return u32ToFloat(seed.$); + }), + }; +})(); diff --git a/apps/typegpu-docs/src/content/examples/tests/uniformity/meta.json b/apps/typegpu-docs/src/content/examples/tests/uniformity/meta.json new file mode 100644 index 000000000..b53380f0b --- /dev/null +++ b/apps/typegpu-docs/src/content/examples/tests/uniformity/meta.json @@ -0,0 +1,5 @@ +{ + "title": "Uniformity", + "category": "tests", + "tags": ["experimental"] +} From cabf42ae4d23f6118c9392ba2edcf4b6dfeb95ea Mon Sep 17 00:00:00 2001 From: Szymon Szulc Date: Wed, 3 Sep 2025 17:14:19 +0200 Subject: [PATCH 50/64] Typos --- .../content/docs/ecosystem/typegpu-noise.mdx | 2 +- packages/typegpu-noise/src/index.ts | 17 ++++++++--------- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/apps/typegpu-docs/src/content/docs/ecosystem/typegpu-noise.mdx b/apps/typegpu-docs/src/content/docs/ecosystem/typegpu-noise.mdx index 7a0f76375..83d28cc00 100644 --- a/apps/typegpu-docs/src/content/docs/ecosystem/typegpu-noise.mdx +++ b/apps/typegpu-docs/src/content/docs/ecosystem/typegpu-noise.mdx @@ -276,6 +276,7 @@ You can easily implement your own PRNG and plug it into the pipeline. import tgpu from 'typegpu'; import * as d from 'typegpu/data'; import { randf } from '@typegpu/noise'; +import * as std from 'typegpu/std'; const root = await tgpu.init(); @@ -289,7 +290,6 @@ import { randomGeneratorSlot, type StatefulGenerator, } from '@typegpu/noise'; -import * as std from 'typegpu/std'; const LCG: StatefulGenerator = (() => { const seed = tgpu['~unstable'].privateVar(d.u32); diff --git a/packages/typegpu-noise/src/index.ts b/packages/typegpu-noise/src/index.ts index d98c21c36..ca4fd6269 100644 --- a/packages/typegpu-noise/src/index.ts +++ b/packages/typegpu-noise/src/index.ts @@ -22,22 +22,22 @@ import { export const randf: { /** * Sets the private seed of the thread. - * @param seed seed value to set. For the best results, should be in [0, 1] range. + * @param seed seed value to set. For the best results, should be in [-1000, 1000] range. */ seed: typeof randSeed; /** * Sets the private seed of the thread. - * @param seed seed value to set. For the best results, all elements should be in [0, 1] range. + * @param seed seed value to set. For the best results, all elements should be in [-1000, 1000] range. */ seed2: typeof randSeed2; /** * Sets the private seed of the thread. - * @param seed seed value to set. For the best results, all elements should be in [0, 1] range. + * @param seed seed value to set. For the best results, all elements should be in [-1000, 1000] range. */ seed3: typeof randSeed3; /** * Sets the private seed of the thread. - * @param seed seed value to set. For the best results, all elements should be in [0, 1] range. + * @param seed seed value to set. For the best results, all elements should be in [-1000, 1000] range. */ seed4: typeof randSeed4; /** @@ -49,18 +49,18 @@ export const randf: { */ sampleExclusive: typeof randFloat01Exclusive; /** - * Returns a random f32 value basen on normal (gaussian) distribution. + * Returns a random f32 value based on normal (gaussian) distribution. * @param mu mean value. * @param sigma standard deviation. Must be > 0. */ normal: typeof randNormal; /** - * Returns a random f32 value basen on exponential distribution. + * Returns a random f32 value based on exponential distribution. * @param rate rate parameter. Must be > 0. */ exponential: typeof randExponential; /** - * Returns a random f32 value basen on cauchy distribution. + * Returns a random f32 value based on cauchy distribution. * @param x0 location parameter. * @param gamma scale parameter. Must be > 0. */ @@ -128,9 +128,8 @@ export const randf: { }; export { - // Generators + // --- Generators --- BPETER, - // --- // The default (Can change between releases to improve uniformity). DefaultGenerator, // --- From 553b6ea98777549065faa781fc616614e248d2b3 Mon Sep 17 00:00:00 2001 From: Szymon Szulc Date: Wed, 3 Sep 2025 23:55:08 +0200 Subject: [PATCH 51/64] Nice uniformity test --- .../examples/tests/uniformity/constants.ts | 5 + .../examples/tests/uniformity/fragment.ts | 18 ++++ .../examples/tests/uniformity/helpers.ts | 28 ++++++ .../examples/tests/uniformity/index.ts | 94 ++++--------------- .../examples/tests/uniformity/prngs.ts | 25 +++++ .../examples/tests/uniformity/vertex.ts | 14 +++ 6 files changed, 108 insertions(+), 76 deletions(-) create mode 100644 apps/typegpu-docs/src/content/examples/tests/uniformity/constants.ts create mode 100644 apps/typegpu-docs/src/content/examples/tests/uniformity/fragment.ts create mode 100644 apps/typegpu-docs/src/content/examples/tests/uniformity/helpers.ts create mode 100644 apps/typegpu-docs/src/content/examples/tests/uniformity/prngs.ts create mode 100644 apps/typegpu-docs/src/content/examples/tests/uniformity/vertex.ts diff --git a/apps/typegpu-docs/src/content/examples/tests/uniformity/constants.ts b/apps/typegpu-docs/src/content/examples/tests/uniformity/constants.ts new file mode 100644 index 000000000..301d03e90 --- /dev/null +++ b/apps/typegpu-docs/src/content/examples/tests/uniformity/constants.ts @@ -0,0 +1,5 @@ +import { PRNG } from './prngs.ts'; + +export const gridSize = 100; +export const initialPRNG = PRNG.DEFAULT_GENERATOR; +export const prngs: PRNG[] = Object.values(PRNG); diff --git a/apps/typegpu-docs/src/content/examples/tests/uniformity/fragment.ts b/apps/typegpu-docs/src/content/examples/tests/uniformity/fragment.ts new file mode 100644 index 000000000..ee7a92bea --- /dev/null +++ b/apps/typegpu-docs/src/content/examples/tests/uniformity/fragment.ts @@ -0,0 +1,18 @@ +import tgpu from 'typegpu'; +import * as d from 'typegpu/data'; +import * as std from 'typegpu/std'; +import { randf } from '@typegpu/noise'; + +import * as c from './constants.ts'; + +export const fullScreenGridFragmentShader = tgpu['~unstable'].fragmentFn({ + in: { uv: d.vec2f }, + out: d.vec4f, +})((input) => { + const uv = input.uv.add(1).div(2); + const gridedUV = std.floor(uv.mul(c.gridSize)); + + randf.seed2(gridedUV); + + return d.vec4f(d.vec3f(randf.sample()), 1.0); +}); diff --git a/apps/typegpu-docs/src/content/examples/tests/uniformity/helpers.ts b/apps/typegpu-docs/src/content/examples/tests/uniformity/helpers.ts new file mode 100644 index 000000000..1e8bc578e --- /dev/null +++ b/apps/typegpu-docs/src/content/examples/tests/uniformity/helpers.ts @@ -0,0 +1,28 @@ +import type { TgpuRoot } from 'typegpu'; +import { randomGeneratorSlot } from '@typegpu/noise'; +import { fullScreenTriangleVertexShader } from './vertex.ts'; +import { fullScreenGridFragmentShader } from './fragment.ts'; + +import { getPRNG, type PRNG } from './prngs.ts'; + +export const executePipeline = ( + root: TgpuRoot, + context: GPUCanvasContext, + prng: PRNG, +) => { + const pipeline = root['~unstable'] + .with(randomGeneratorSlot, getPRNG(prng)) + .withVertex(fullScreenTriangleVertexShader, {}) + .withFragment(fullScreenGridFragmentShader, { + format: context.getConfiguration()?.format as GPUTextureFormat, + }) + .createPipeline(); + + pipeline + .withColorAttachment({ + view: context.getCurrentTexture().createView(), + loadOp: 'clear', + storeOp: 'store', + }) + .draw(3); +}; diff --git a/apps/typegpu-docs/src/content/examples/tests/uniformity/index.ts b/apps/typegpu-docs/src/content/examples/tests/uniformity/index.ts index fb66129db..9e2df06ab 100644 --- a/apps/typegpu-docs/src/content/examples/tests/uniformity/index.ts +++ b/apps/typegpu-docs/src/content/examples/tests/uniformity/index.ts @@ -1,67 +1,10 @@ import tgpu from 'typegpu'; -import * as d from 'typegpu/data'; -import * as std from 'typegpu/std'; -import { randf, randomGeneratorSlot } from '@typegpu/noise'; -import { LCG } from './lcg.ts'; -const root = await tgpu.init(); - -const fullScreenTriangle = tgpu['~unstable'].vertexFn({ - in: { vertexIndex: d.builtin.vertexIndex }, - out: { pos: d.builtin.position, uv: d.vec2f }, -})((input) => { - const pos = [d.vec2f(-1, -1), d.vec2f(3, -1), d.vec2f(-1, 3)]; - - return { - pos: d.vec4f(pos[input.vertexIndex], 0.0, 1.0), - uv: pos[input.vertexIndex], - }; -}); - -// === GRID === -const gridSize = 100; - -const b1 = root.createBuffer(d.arrayOf(d.u32, gridSize * gridSize)).$usage( - 'storage', -); -const b2 = root.createBuffer(d.arrayOf(d.f32, gridSize * gridSize)).$usage( - 'storage', -); - -const layout = tgpu.bindGroupLayout({ - u: { - storage: d.arrayOf(d.u32, gridSize * gridSize), - access: 'mutable', - visibility: ['fragment'], - }, - f: { - storage: d.arrayOf(d.f32, gridSize * gridSize), - access: 'mutable', - visibility: ['fragment'], - }, -}); +import * as c from './constants.ts'; +import type { PRNG } from './prngs.ts'; +import { executePipeline } from './helpers.ts'; -const group = root.createBindGroup(layout, { - u: b1, - f: b2, -}); - -const mainFragment = tgpu['~unstable'].fragmentFn({ - in: { uv: d.vec2f }, - out: d.vec4f, -})((input) => { - const uv = input.uv.add(d.f32(1)).div(d.f32(2)); - const grided = std.floor(uv.mul(gridSize)); - // const id = d.u32(grided.x * gridSize + grided.y); - - randf.seed2(grided); - const sample = randf.sample(); - - // layout.bound.u.$[id] = sample; - // layout.bound.f.$[id] = floater(sample); - - return d.vec4f(d.vec3f(sample), 1.0); -}); +const root = await tgpu.init(); const canvas = document.querySelector('canvas') as HTMLCanvasElement; const context = canvas.getContext('webgpu') as GPUCanvasContext; @@ -72,20 +15,19 @@ context.configure({ alphaMode: 'premultiplied', }); -const pipeline = root['~unstable'] - .with(randomGeneratorSlot, LCG) - .withVertex(fullScreenTriangle, {}) - .withFragment(mainFragment, { format: presentationFormat }) - .createPipeline(); +// #region Example controls & Cleanup + +export const controls = { + 'PRNG': { + initial: c.initialPRNG, + options: c.prngs, + onSelectChange: async (value: PRNG) => + executePipeline(root, context, value), + }, +}; -pipeline - .with(layout, group) - .withColorAttachment({ - view: context.getCurrentTexture().createView(), - loadOp: 'clear', - storeOp: 'store', - }) - .draw(3); +export function onCleanup() { + root.destroy(); +} -// console.log('our grid u32', await b1.read()); -// console.log('our grid f32', await b2.read()); +// #endregion diff --git a/apps/typegpu-docs/src/content/examples/tests/uniformity/prngs.ts b/apps/typegpu-docs/src/content/examples/tests/uniformity/prngs.ts new file mode 100644 index 000000000..f8d5f4632 --- /dev/null +++ b/apps/typegpu-docs/src/content/examples/tests/uniformity/prngs.ts @@ -0,0 +1,25 @@ +import { + BPETER, + DefaultGenerator, + type StatefulGenerator, +} from '@typegpu/noise'; + +import { LCG } from './lcg.ts'; + +export const PRNG = { + BPETER: 'bpeter', + DEFAULT_GENERATOR: 'default', + LCG: 'lcg', +} as const; + +export type PRNG = typeof PRNG[keyof typeof PRNG]; + +const PRNG_MAP = { + [PRNG.BPETER]: BPETER, + [PRNG.DEFAULT_GENERATOR]: DefaultGenerator, + [PRNG.LCG]: LCG, +}; + +export const getPRNG = (prng: PRNG): StatefulGenerator => { + return PRNG_MAP[prng]; +}; diff --git a/apps/typegpu-docs/src/content/examples/tests/uniformity/vertex.ts b/apps/typegpu-docs/src/content/examples/tests/uniformity/vertex.ts new file mode 100644 index 000000000..a818ba642 --- /dev/null +++ b/apps/typegpu-docs/src/content/examples/tests/uniformity/vertex.ts @@ -0,0 +1,14 @@ +import tgpu from 'typegpu'; +import * as d from 'typegpu/data'; + +export const fullScreenTriangleVertexShader = tgpu['~unstable'].vertexFn({ + in: { vertexIndex: d.builtin.vertexIndex }, + out: { pos: d.builtin.position, uv: d.vec2f }, +})((input) => { + const pos = [d.vec2f(-1, -1), d.vec2f(3, -1), d.vec2f(-1, 3)]; + + return { + pos: d.vec4f(pos[input.vertexIndex], 0.0, 1.0), + uv: pos[input.vertexIndex], + }; +}); From 21442d1548fb198961aebb9f23cca7a279ba6703 Mon Sep 17 00:00:00 2001 From: Szymon Szulc Date: Thu, 4 Sep 2025 10:47:34 +0200 Subject: [PATCH 52/64] Example resolution test --- .../examples/simple/probability/executor.ts | 17 + .../examples/simple/probability/index.ts | 13 + .../examples/individual/probability.test.ts | 639 ++++++++++++++++++ 3 files changed, 669 insertions(+) create mode 100644 packages/typegpu/tests/examples/individual/probability.test.ts diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/executor.ts b/apps/typegpu-docs/src/content/examples/simple/probability/executor.ts index a5824ff1d..f4371492d 100644 --- a/apps/typegpu-docs/src/content/examples/simple/probability/executor.ts +++ b/apps/typegpu-docs/src/content/examples/simple/probability/executor.ts @@ -93,6 +93,23 @@ export class Executor { }); } + cachedPipeline(distribution: TgpuFn<() => d.Vec3f>) { + if (!import.meta.env.DEV) { + throw new Error('Function only for testing purposes'); + } + + if (!this.#pipelineCache.has(distribution)) { + const pipeline = this.#root['~unstable'] + .with(this.#distributionSlot, distribution) + .withCompute(this.#dataMoreWorkersFunc as TgpuComputeFn) + .createPipeline(); + this.#pipelineCache.set(distribution, pipeline); + } + + // biome-ignore lint/style/noNonNullAssertion: just checked it above + return this.#pipelineCache.get(distribution)!; + } + async executeMoreWorkers( distribution: TgpuFn<() => d.Vec3f>, ): Promise { diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/index.ts b/apps/typegpu-docs/src/content/examples/simple/probability/index.ts index 1e9389586..d06a17083 100644 --- a/apps/typegpu-docs/src/content/examples/simple/probability/index.ts +++ b/apps/typegpu-docs/src/content/examples/simple/probability/index.ts @@ -89,6 +89,19 @@ export const controls = { ); }, }, + 'Test Resolution': import.meta.env.DEV && { + onButtonClick: () => { + c.distributions + .map((dist) => + tgpu.resolve({ + externals: { + f: executor.cachedPipeline(getPRNG(dist).prng), + }, + }) + ) + .map((r) => root.device.createShaderModule({ code: r })); + }, + }, }; export function onCleanup() { diff --git a/packages/typegpu/tests/examples/individual/probability.test.ts b/packages/typegpu/tests/examples/individual/probability.test.ts new file mode 100644 index 000000000..6d0e41cb7 --- /dev/null +++ b/packages/typegpu/tests/examples/individual/probability.test.ts @@ -0,0 +1,639 @@ +/** + * @vitest-environment jsdom + */ + +import { describe, expect } from 'vitest'; +import { it } from '../../utils/extendedIt.ts'; +import { runExampleTest, setupCommonMocks } from '../utils/baseTest.ts'; + +describe('probability distribution plot example', () => { + setupCommonMocks(); + + it('should produce valid code', async ({ device }) => { + const shaderCodes = await runExampleTest({ + category: 'simple', + name: 'probability', + controlTriggers: ['Test Resolution'], + expectedCalls: 13, + }, device); + + expect(shaderCodes).toMatchInlineSnapshot(` + "struct item_1 { + @builtin(global_invocation_id) gid: vec3u, + } + + @group(0) @binding(1) var samplesBuffer_2: array; + + @group(0) @binding(0) var seedBuffer_3: array; + + var seed_6: vec2f; + + fn seed_5(value: f32) { + seed_6 = vec2f(value, 0); + } + + fn randSeed_4(seed: f32) { + seed_5(seed); + } + + fn item_8() -> f32 { + var a = dot(seed_6, vec2f(23.140779495239258, 232.6168975830078)); + var b = dot(seed_6, vec2f(54.47856521606445, 345.8415222167969)); + seed_6.x = fract((cos(a) * 136.8168)); + seed_6.y = fract((cos(b) * 534.7645)); + return seed_6.y; + } + + fn randUniformExclusive_10() -> f32 { + return ((item_8() * 0.9999998) + 1e-7); + } + + fn randNormal_9(mu: f32, sigma: f32) -> f32 { + var theta = (6.283185307179586 * randUniformExclusive_10()); + var R = sqrt((-2 * log(randUniformExclusive_10()))); + return (((R * sin(theta)) * sigma) + mu); + } + + fn randInUnitSphere_7() -> vec3f { + var u = item_8(); + var v = vec3f(randNormal_9(0, 1), randNormal_9(0, 1), randNormal_9(0, 1)); + var vNorm = normalize(v); + return (vNorm * pow(u, 0.33)); + } + + @compute @workgroup_size(64) fn item_0(input: item_1) { + var id = input.gid.x; + if ((id >= arrayLength(&samplesBuffer_2))) { + return; + } + randSeed_4(seedBuffer_3[id]); + samplesBuffer_2[id] = randInUnitSphere_7(); + } + + struct item_1 { + @builtin(global_invocation_id) gid: vec3u, + } + + @group(0) @binding(1) var samplesBuffer_2: array; + + @group(0) @binding(0) var seedBuffer_3: array; + + var seed_6: vec2f; + + fn seed_5(value: f32) { + seed_6 = vec2f(value, 0); + } + + fn randSeed_4(seed: f32) { + seed_5(seed); + } + + fn item_8() -> f32 { + var a = dot(seed_6, vec2f(23.140779495239258, 232.6168975830078)); + var b = dot(seed_6, vec2f(54.47856521606445, 345.8415222167969)); + seed_6.x = fract((cos(a) * 136.8168)); + seed_6.y = fract((cos(b) * 534.7645)); + return seed_6.y; + } + + fn randOnUnitSphere_7() -> vec3f { + var z = ((2 * item_8()) - 1); + var oneMinusZSq = sqrt((1 - (z * z))); + var theta = (6.283185307179586 * item_8()); + var x = (cos(theta) * oneMinusZSq); + var y = (sin(theta) * oneMinusZSq); + return vec3f(x, y, z); + } + + @compute @workgroup_size(64) fn item_0(input: item_1) { + var id = input.gid.x; + if ((id >= arrayLength(&samplesBuffer_2))) { + return; + } + randSeed_4(seedBuffer_3[id]); + samplesBuffer_2[id] = randOnUnitSphere_7(); + } + + struct item_1 { + @builtin(global_invocation_id) gid: vec3u, + } + + @group(0) @binding(1) var samplesBuffer_2: array; + + @group(0) @binding(0) var seedBuffer_3: array; + + var seed_6: vec2f; + + fn seed_5(value: f32) { + seed_6 = vec2f(value, 0); + } + + fn randSeed_4(seed: f32) { + seed_5(seed); + } + + fn item_9() -> f32 { + var a = dot(seed_6, vec2f(23.140779495239258, 232.6168975830078)); + var b = dot(seed_6, vec2f(54.47856521606445, 345.8415222167969)); + seed_6.x = fract((cos(a) * 136.8168)); + seed_6.y = fract((cos(b) * 534.7645)); + return seed_6.y; + } + + fn randInUnitCircle_8() -> vec2f { + var radius = sqrt(item_9()); + var angle = (item_9() * 6.283185307179586); + return vec2f((cos(angle) * radius), (sin(angle) * radius)); + } + + fn prng_7() -> vec3f { + return vec3f(randInUnitCircle_8(), 0.5); + } + + @compute @workgroup_size(64) fn item_0(input: item_1) { + var id = input.gid.x; + if ((id >= arrayLength(&samplesBuffer_2))) { + return; + } + randSeed_4(seedBuffer_3[id]); + samplesBuffer_2[id] = prng_7(); + } + + struct item_1 { + @builtin(global_invocation_id) gid: vec3u, + } + + @group(0) @binding(1) var samplesBuffer_2: array; + + @group(0) @binding(0) var seedBuffer_3: array; + + var seed_6: vec2f; + + fn seed_5(value: f32) { + seed_6 = vec2f(value, 0); + } + + fn randSeed_4(seed: f32) { + seed_5(seed); + } + + fn item_9() -> f32 { + var a = dot(seed_6, vec2f(23.140779495239258, 232.6168975830078)); + var b = dot(seed_6, vec2f(54.47856521606445, 345.8415222167969)); + seed_6.x = fract((cos(a) * 136.8168)); + seed_6.y = fract((cos(b) * 534.7645)); + return seed_6.y; + } + + fn randOnUnitCircle_8() -> vec2f { + var angle = (item_9() * 6.283185307179586); + return vec2f(cos(angle), sin(angle)); + } + + fn prng_7() -> vec3f { + return vec3f(randOnUnitCircle_8(), 0.5); + } + + @compute @workgroup_size(64) fn item_0(input: item_1) { + var id = input.gid.x; + if ((id >= arrayLength(&samplesBuffer_2))) { + return; + } + randSeed_4(seedBuffer_3[id]); + samplesBuffer_2[id] = prng_7(); + } + + struct item_1 { + @builtin(global_invocation_id) gid: vec3u, + } + + @group(0) @binding(1) var samplesBuffer_2: array; + + @group(0) @binding(0) var seedBuffer_3: array; + + var seed_6: vec2f; + + fn seed_5(value: f32) { + seed_6 = vec2f(value, 0); + } + + fn randSeed_4(seed: f32) { + seed_5(seed); + } + + fn item_8() -> f32 { + var a = dot(seed_6, vec2f(23.140779495239258, 232.6168975830078)); + var b = dot(seed_6, vec2f(54.47856521606445, 345.8415222167969)); + seed_6.x = fract((cos(a) * 136.8168)); + seed_6.y = fract((cos(b) * 534.7645)); + return seed_6.y; + } + + fn randInUnitCube_7() -> vec3f { + return vec3f(item_8(), item_8(), item_8()); + } + + @compute @workgroup_size(64) fn item_0(input: item_1) { + var id = input.gid.x; + if ((id >= arrayLength(&samplesBuffer_2))) { + return; + } + randSeed_4(seedBuffer_3[id]); + samplesBuffer_2[id] = randInUnitCube_7(); + } + + struct item_1 { + @builtin(global_invocation_id) gid: vec3u, + } + + @group(0) @binding(1) var samplesBuffer_2: array; + + @group(0) @binding(0) var seedBuffer_3: array; + + var seed_6: vec2f; + + fn seed_5(value: f32) { + seed_6 = vec2f(value, 0); + } + + fn randSeed_4(seed: f32) { + seed_5(seed); + } + + fn item_8() -> f32 { + var a = dot(seed_6, vec2f(23.140779495239258, 232.6168975830078)); + var b = dot(seed_6, vec2f(54.47856521606445, 345.8415222167969)); + seed_6.x = fract((cos(a) * 136.8168)); + seed_6.y = fract((cos(b) * 534.7645)); + return seed_6.y; + } + + fn randOnUnitCube_7() -> vec3f { + var face = u32((item_8() * 6)); + var axis = (face % 3); + var result = vec3f(); + result[axis] = f32(select(0, 1, (face > 2))); + result[((axis + 1) % 3)] = item_8(); + result[((axis + 2) % 3)] = item_8(); + return result; + } + + @compute @workgroup_size(64) fn item_0(input: item_1) { + var id = input.gid.x; + if ((id >= arrayLength(&samplesBuffer_2))) { + return; + } + randSeed_4(seedBuffer_3[id]); + samplesBuffer_2[id] = randOnUnitCube_7(); + } + + struct item_1 { + @builtin(global_invocation_id) gid: vec3u, + } + + @group(0) @binding(1) var samplesBuffer_2: array; + + @group(0) @binding(0) var seedBuffer_3: array; + + var seed_6: vec2f; + + fn seed_5(value: f32) { + seed_6 = vec2f(value, 0); + } + + fn randSeed_4(seed: f32) { + seed_5(seed); + } + + fn item_10() -> f32 { + var a = dot(seed_6, vec2f(23.140779495239258, 232.6168975830078)); + var b = dot(seed_6, vec2f(54.47856521606445, 345.8415222167969)); + seed_6.x = fract((cos(a) * 136.8168)); + seed_6.y = fract((cos(b) * 534.7645)); + return seed_6.y; + } + + fn randUniformExclusive_12() -> f32 { + return ((item_10() * 0.9999998) + 1e-7); + } + + fn randNormal_11(mu: f32, sigma: f32) -> f32 { + var theta = (6.283185307179586 * randUniformExclusive_12()); + var R = sqrt((-2 * log(randUniformExclusive_12()))); + return (((R * sin(theta)) * sigma) + mu); + } + + fn randInUnitSphere_9() -> vec3f { + var u = item_10(); + var v = vec3f(randNormal_11(0, 1), randNormal_11(0, 1), randNormal_11(0, 1)); + var vNorm = normalize(v); + return (vNorm * pow(u, 0.33)); + } + + fn randInUnitHemisphere_8(normal: vec3f) -> vec3f { + var value = randInUnitSphere_9(); + var alignment = dot(normal, value); + return (sign(alignment) * value); + } + + fn prng_7() -> vec3f { + return randInUnitHemisphere_8(vec3f(1.409999966621399, 1.409999966621399, 0)); + } + + @compute @workgroup_size(64) fn item_0(input: item_1) { + var id = input.gid.x; + if ((id >= arrayLength(&samplesBuffer_2))) { + return; + } + randSeed_4(seedBuffer_3[id]); + samplesBuffer_2[id] = prng_7(); + } + + struct item_1 { + @builtin(global_invocation_id) gid: vec3u, + } + + @group(0) @binding(1) var samplesBuffer_2: array; + + @group(0) @binding(0) var seedBuffer_3: array; + + var seed_6: vec2f; + + fn seed_5(value: f32) { + seed_6 = vec2f(value, 0); + } + + fn randSeed_4(seed: f32) { + seed_5(seed); + } + + fn item_10() -> f32 { + var a = dot(seed_6, vec2f(23.140779495239258, 232.6168975830078)); + var b = dot(seed_6, vec2f(54.47856521606445, 345.8415222167969)); + seed_6.x = fract((cos(a) * 136.8168)); + seed_6.y = fract((cos(b) * 534.7645)); + return seed_6.y; + } + + fn randOnUnitSphere_9() -> vec3f { + var z = ((2 * item_10()) - 1); + var oneMinusZSq = sqrt((1 - (z * z))); + var theta = (6.283185307179586 * item_10()); + var x = (cos(theta) * oneMinusZSq); + var y = (sin(theta) * oneMinusZSq); + return vec3f(x, y, z); + } + + fn randOnUnitHemisphere_8(normal: vec3f) -> vec3f { + var value = randOnUnitSphere_9(); + var alignment = dot(normal, value); + return (sign(alignment) * value); + } + + fn prng_7() -> vec3f { + return randOnUnitHemisphere_8(vec3f(1.409999966621399, 1.409999966621399, 0)); + } + + @compute @workgroup_size(64) fn item_0(input: item_1) { + var id = input.gid.x; + if ((id >= arrayLength(&samplesBuffer_2))) { + return; + } + randSeed_4(seedBuffer_3[id]); + samplesBuffer_2[id] = prng_7(); + } + + struct item_1 { + @builtin(global_invocation_id) gid: vec3u, + } + + @group(0) @binding(1) var samplesBuffer_2: array; + + @group(0) @binding(0) var seedBuffer_3: array; + + var seed_6: vec2f; + + fn seed_5(value: f32) { + seed_6 = vec2f(value, 0); + } + + fn randSeed_4(seed: f32) { + seed_5(seed); + } + + fn item_9() -> f32 { + var a = dot(seed_6, vec2f(23.140779495239258, 232.6168975830078)); + var b = dot(seed_6, vec2f(54.47856521606445, 345.8415222167969)); + seed_6.x = fract((cos(a) * 136.8168)); + seed_6.y = fract((cos(b) * 534.7645)); + return seed_6.y; + } + + fn randBernoulli_8(p: f32) -> f32 { + var u = item_9(); + return step(u, p); + } + + fn prng_7() -> vec3f { + return vec3f(randBernoulli_8(0.7)); + } + + @compute @workgroup_size(64) fn item_0(input: item_1) { + var id = input.gid.x; + if ((id >= arrayLength(&samplesBuffer_2))) { + return; + } + randSeed_4(seedBuffer_3[id]); + samplesBuffer_2[id] = prng_7(); + } + + struct item_1 { + @builtin(global_invocation_id) gid: vec3u, + } + + @group(0) @binding(1) var samplesBuffer_2: array; + + @group(0) @binding(0) var seedBuffer_3: array; + + var seed_6: vec2f; + + fn seed_5(value: f32) { + seed_6 = vec2f(value, 0); + } + + fn randSeed_4(seed: f32) { + seed_5(seed); + } + + fn item_9() -> f32 { + var a = dot(seed_6, vec2f(23.140779495239258, 232.6168975830078)); + var b = dot(seed_6, vec2f(54.47856521606445, 345.8415222167969)); + seed_6.x = fract((cos(a) * 136.8168)); + seed_6.y = fract((cos(b) * 534.7645)); + return seed_6.y; + } + + fn randFloat01_8() -> f32 { + return item_9(); + } + + fn prng_7() -> vec3f { + return vec3f(randFloat01_8()); + } + + @compute @workgroup_size(64) fn item_0(input: item_1) { + var id = input.gid.x; + if ((id >= arrayLength(&samplesBuffer_2))) { + return; + } + randSeed_4(seedBuffer_3[id]); + samplesBuffer_2[id] = prng_7(); + } + + struct item_1 { + @builtin(global_invocation_id) gid: vec3u, + } + + @group(0) @binding(1) var samplesBuffer_2: array; + + @group(0) @binding(0) var seedBuffer_3: array; + + var seed_6: vec2f; + + fn seed_5(value: f32) { + seed_6 = vec2f(value, 0); + } + + fn randSeed_4(seed: f32) { + seed_5(seed); + } + + fn item_10() -> f32 { + var a = dot(seed_6, vec2f(23.140779495239258, 232.6168975830078)); + var b = dot(seed_6, vec2f(54.47856521606445, 345.8415222167969)); + seed_6.x = fract((cos(a) * 136.8168)); + seed_6.y = fract((cos(b) * 534.7645)); + return seed_6.y; + } + + fn randUniformExclusive_9() -> f32 { + return ((item_10() * 0.9999998) + 1e-7); + } + + fn randExponential_8(rate: f32) -> f32 { + var u = randUniformExclusive_9(); + return ((-1 / rate) * log(u)); + } + + fn prng_7() -> vec3f { + return vec3f(randExponential_8(1)); + } + + @compute @workgroup_size(64) fn item_0(input: item_1) { + var id = input.gid.x; + if ((id >= arrayLength(&samplesBuffer_2))) { + return; + } + randSeed_4(seedBuffer_3[id]); + samplesBuffer_2[id] = prng_7(); + } + + struct item_1 { + @builtin(global_invocation_id) gid: vec3u, + } + + @group(0) @binding(1) var samplesBuffer_2: array; + + @group(0) @binding(0) var seedBuffer_3: array; + + var seed_6: vec2f; + + fn seed_5(value: f32) { + seed_6 = vec2f(value, 0); + } + + fn randSeed_4(seed: f32) { + seed_5(seed); + } + + fn item_10() -> f32 { + var a = dot(seed_6, vec2f(23.140779495239258, 232.6168975830078)); + var b = dot(seed_6, vec2f(54.47856521606445, 345.8415222167969)); + seed_6.x = fract((cos(a) * 136.8168)); + seed_6.y = fract((cos(b) * 534.7645)); + return seed_6.y; + } + + fn randUniformExclusive_9() -> f32 { + return ((item_10() * 0.9999998) + 1e-7); + } + + fn randNormal_8(mu: f32, sigma: f32) -> f32 { + var theta = (6.283185307179586 * randUniformExclusive_9()); + var R = sqrt((-2 * log(randUniformExclusive_9()))); + return (((R * sin(theta)) * sigma) + mu); + } + + fn prng_7() -> vec3f { + return vec3f(randNormal_8(0, 1)); + } + + @compute @workgroup_size(64) fn item_0(input: item_1) { + var id = input.gid.x; + if ((id >= arrayLength(&samplesBuffer_2))) { + return; + } + randSeed_4(seedBuffer_3[id]); + samplesBuffer_2[id] = prng_7(); + } + + struct item_1 { + @builtin(global_invocation_id) gid: vec3u, + } + + @group(0) @binding(1) var samplesBuffer_2: array; + + @group(0) @binding(0) var seedBuffer_3: array; + + var seed_6: vec2f; + + fn seed_5(value: f32) { + seed_6 = vec2f(value, 0); + } + + fn randSeed_4(seed: f32) { + seed_5(seed); + } + + fn item_10() -> f32 { + var a = dot(seed_6, vec2f(23.140779495239258, 232.6168975830078)); + var b = dot(seed_6, vec2f(54.47856521606445, 345.8415222167969)); + seed_6.x = fract((cos(a) * 136.8168)); + seed_6.y = fract((cos(b) * 534.7645)); + return seed_6.y; + } + + fn randUniformExclusive_9() -> f32 { + return ((item_10() * 0.9999998) + 1e-7); + } + + fn randCauchy_8(x0: f32, gamma: f32) -> f32 { + var u = randUniformExclusive_9(); + return (x0 + (gamma * tan((3.141592653589793 * (u - 0.5))))); + } + + fn prng_7() -> vec3f { + return vec3f(randCauchy_8(0, 1)); + } + + @compute @workgroup_size(64) fn item_0(input: item_1) { + var id = input.gid.x; + if ((id >= arrayLength(&samplesBuffer_2))) { + return; + } + randSeed_4(seedBuffer_3[id]); + samplesBuffer_2[id] = prng_7(); + }" + `); + }); +}); From a751ae76bcd25fab4bb9c8650f5a0511c74972e4 Mon Sep 17 00:00:00 2001 From: Szymon Szulc Date: Thu, 4 Sep 2025 12:02:20 +0200 Subject: [PATCH 53/64] More controls and thumbnail --- .../examples/tests/uniformity/constants.ts | 3 +- .../examples/tests/uniformity/fragment.ts | 26 +++++---- .../examples/tests/uniformity/helpers.ts | 29 ++++++---- .../examples/tests/uniformity/index.ts | 51 ++++++++++++++++-- .../examples/tests/uniformity/thumbnail.png | Bin 0 -> 142997 bytes 5 files changed, 83 insertions(+), 26 deletions(-) create mode 100644 apps/typegpu-docs/src/content/examples/tests/uniformity/thumbnail.png diff --git a/apps/typegpu-docs/src/content/examples/tests/uniformity/constants.ts b/apps/typegpu-docs/src/content/examples/tests/uniformity/constants.ts index 301d03e90..8422a66bd 100644 --- a/apps/typegpu-docs/src/content/examples/tests/uniformity/constants.ts +++ b/apps/typegpu-docs/src/content/examples/tests/uniformity/constants.ts @@ -1,5 +1,6 @@ import { PRNG } from './prngs.ts'; -export const gridSize = 100; +export const gridSizes = [10, 25, 50, 100, 200, 500, 700, 1000]; +export const initialGridSize = gridSizes[3]; export const initialPRNG = PRNG.DEFAULT_GENERATOR; export const prngs: PRNG[] = Object.values(PRNG); diff --git a/apps/typegpu-docs/src/content/examples/tests/uniformity/fragment.ts b/apps/typegpu-docs/src/content/examples/tests/uniformity/fragment.ts index ee7a92bea..0797e3109 100644 --- a/apps/typegpu-docs/src/content/examples/tests/uniformity/fragment.ts +++ b/apps/typegpu-docs/src/content/examples/tests/uniformity/fragment.ts @@ -1,18 +1,22 @@ import tgpu from 'typegpu'; +import type { TgpuUniform } from 'typegpu'; import * as d from 'typegpu/data'; import * as std from 'typegpu/std'; import { randf } from '@typegpu/noise'; -import * as c from './constants.ts'; +export const bindFullScreenGridFSWithUniforms = ( + gridSizeUniform: TgpuUniform, + canvasRatioUniform: TgpuUniform, +) => { + return tgpu['~unstable'].fragmentFn({ + in: { uv: d.vec2f }, + out: d.vec4f, + })((input) => { + const uv = input.uv.add(1).div(2).mul(d.vec2f(canvasRatioUniform.$, 1)); + const gridedUV = std.floor(uv.mul(gridSizeUniform.$)); -export const fullScreenGridFragmentShader = tgpu['~unstable'].fragmentFn({ - in: { uv: d.vec2f }, - out: d.vec4f, -})((input) => { - const uv = input.uv.add(1).div(2); - const gridedUV = std.floor(uv.mul(c.gridSize)); + randf.seed2(gridedUV); - randf.seed2(gridedUV); - - return d.vec4f(d.vec3f(randf.sample()), 1.0); -}); + return d.vec4f(d.vec3f(randf.sample()), 1.0); + }); +}; diff --git a/apps/typegpu-docs/src/content/examples/tests/uniformity/helpers.ts b/apps/typegpu-docs/src/content/examples/tests/uniformity/helpers.ts index 1e8bc578e..1387b9685 100644 --- a/apps/typegpu-docs/src/content/examples/tests/uniformity/helpers.ts +++ b/apps/typegpu-docs/src/content/examples/tests/uniformity/helpers.ts @@ -1,23 +1,33 @@ -import type { TgpuRoot } from 'typegpu'; +import type { TgpuRenderPipeline, TgpuRoot, TgpuUniform } from 'typegpu'; import { randomGeneratorSlot } from '@typegpu/noise'; -import { fullScreenTriangleVertexShader } from './vertex.ts'; -import { fullScreenGridFragmentShader } from './fragment.ts'; +import type * as d from 'typegpu/data'; +import { fullScreenTriangleVertexShader } from './vertex.ts'; +import { bindFullScreenGridFSWithUniforms } from './fragment.ts'; import { getPRNG, type PRNG } from './prngs.ts'; -export const executePipeline = ( +export const preparePipeline = ( root: TgpuRoot, context: GPUCanvasContext, prng: PRNG, -) => { - const pipeline = root['~unstable'] + gridSizeUniform: TgpuUniform, + canvasRatioUniform: TgpuUniform, +): TgpuRenderPipeline => + root['~unstable'] .with(randomGeneratorSlot, getPRNG(prng)) .withVertex(fullScreenTriangleVertexShader, {}) - .withFragment(fullScreenGridFragmentShader, { - format: context.getConfiguration()?.format as GPUTextureFormat, - }) + .withFragment( + bindFullScreenGridFSWithUniforms(gridSizeUniform, canvasRatioUniform), + { + format: context.getConfiguration()?.format as GPUTextureFormat, + }, + ) .createPipeline(); +export const executePipeline = ( + pipeline: TgpuRenderPipeline, + context: GPUCanvasContext, +) => pipeline .withColorAttachment({ view: context.getCurrentTexture().createView(), @@ -25,4 +35,3 @@ export const executePipeline = ( storeOp: 'store', }) .draw(3); -}; diff --git a/apps/typegpu-docs/src/content/examples/tests/uniformity/index.ts b/apps/typegpu-docs/src/content/examples/tests/uniformity/index.ts index 9e2df06ab..7d29c3db2 100644 --- a/apps/typegpu-docs/src/content/examples/tests/uniformity/index.ts +++ b/apps/typegpu-docs/src/content/examples/tests/uniformity/index.ts @@ -1,8 +1,9 @@ -import tgpu from 'typegpu'; +import tgpu, { type TgpuRenderPipeline } from 'typegpu'; +import * as d from 'typegpu/data'; import * as c from './constants.ts'; import type { PRNG } from './prngs.ts'; -import { executePipeline } from './helpers.ts'; +import { executePipeline, preparePipeline } from './helpers.ts'; const root = await tgpu.init(); @@ -15,18 +16,60 @@ context.configure({ alphaMode: 'premultiplied', }); +const gridSizeUniform = root.createUniform(d.f32, c.initialGridSize); +const canvasRatioUniform = root.createUniform( + d.f32, + canvas.width / canvas.height, +); +const pipelineCache = new Map(); +let prng: PRNG = c.initialPRNG; + +const redraw = (value: PRNG) => { + let pipeline = undefined; + if (!pipelineCache.has(value)) { + pipeline = preparePipeline( + root, + context, + value, + gridSizeUniform, + canvasRatioUniform, + ); + pipelineCache.set(value, pipeline); + } else { + pipeline = pipelineCache.get(value); + } + executePipeline(pipeline as TgpuRenderPipeline, context); +}; + // #region Example controls & Cleanup export const controls = { 'PRNG': { initial: c.initialPRNG, options: c.prngs, - onSelectChange: async (value: PRNG) => - executePipeline(root, context, value), + onSelectChange: async (value: PRNG) => { + prng = value; + redraw(value); + }, + }, + 'Grid Size': { + initial: c.initialGridSize, + options: c.gridSizes, + onSelectChange: async (value: number) => { + gridSizeUniform.write(value); + redraw(prng); + }, }, }; +const resizeObserver = new ResizeObserver(() => { + canvasRatioUniform.write(canvas.width / canvas.height); + redraw(prng); +}); +resizeObserver.observe(canvas); + export function onCleanup() { + resizeObserver.disconnect(); root.destroy(); } diff --git a/apps/typegpu-docs/src/content/examples/tests/uniformity/thumbnail.png b/apps/typegpu-docs/src/content/examples/tests/uniformity/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..0f55b3f1490f7b072570d9314afeacf5749c1628 GIT binary patch literal 142997 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�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
CBrrNZFrlY+5{})`6yQgc3?$@fyOZ*%xIjJ zq^GJlVz5ZZq4|V)0wRk)d*pCPvAZYJQ*=1y&Iyf?0vo7L>Fk(rf`J=S&`g6@?qfpK zb4nM8f_CV882}1OlJn|ql5ovZ71wZezpp92Wo`F)P@*3+^^)`v15gzkeH$#Q3i)e) zn?~><{DnqNI5nKW-5stUn{a!Th9~&COh6$`wj`lq9Y~`?f|eZJut1Zd4k@SZYeW0z zaFCMA+cOnj$q%n*S?hBc=1WlB3ylC?YH%{^>(3?uT}g7_I&SP7?x1`N)XG#trlNFD zKO!RC#6!S?7?x+>4np=hf>qFu!@BIUOn`Jf-4Jwm`EdQo$jS*?x?^GL;%|AIkanH{ zk^O8ueaku?8mOuGBc{7phm4g9o4_M0M`a6O8iLqU6g6BQ3L{I4Qwm~KJn4QWpNKE9 zy?6p9xg|A*PDU#Q{y^`!#UIaOPaKk@&SzbSY$}XpCSaF_D~z=?-M~I8b$Q$*ND#xV W+dO}_`wRFt&)eVY$Y0+7_ Date: Thu, 4 Sep 2025 13:23:49 +0200 Subject: [PATCH 54/64] Resolution test --- .../examples/tests/uniformity/helpers.ts | 9 +- .../examples/tests/uniformity/index.ts | 25 +++- .../examples/individual/uniformity.test.ts | 130 ++++++++++++++++++ 3 files changed, 157 insertions(+), 7 deletions(-) create mode 100644 packages/typegpu/tests/examples/individual/uniformity.test.ts diff --git a/apps/typegpu-docs/src/content/examples/tests/uniformity/helpers.ts b/apps/typegpu-docs/src/content/examples/tests/uniformity/helpers.ts index 1387b9685..e3a03cec6 100644 --- a/apps/typegpu-docs/src/content/examples/tests/uniformity/helpers.ts +++ b/apps/typegpu-docs/src/content/examples/tests/uniformity/helpers.ts @@ -8,21 +8,22 @@ import { getPRNG, type PRNG } from './prngs.ts'; export const preparePipeline = ( root: TgpuRoot, - context: GPUCanvasContext, + presentationFormat: GPUTextureFormat, prng: PRNG, gridSizeUniform: TgpuUniform, canvasRatioUniform: TgpuUniform, -): TgpuRenderPipeline => - root['~unstable'] +): TgpuRenderPipeline => { + return root['~unstable'] .with(randomGeneratorSlot, getPRNG(prng)) .withVertex(fullScreenTriangleVertexShader, {}) .withFragment( bindFullScreenGridFSWithUniforms(gridSizeUniform, canvasRatioUniform), { - format: context.getConfiguration()?.format as GPUTextureFormat, + format: presentationFormat, }, ) .createPipeline(); +}; export const executePipeline = ( pipeline: TgpuRenderPipeline, diff --git a/apps/typegpu-docs/src/content/examples/tests/uniformity/index.ts b/apps/typegpu-docs/src/content/examples/tests/uniformity/index.ts index 7d29c3db2..56e0d8fba 100644 --- a/apps/typegpu-docs/src/content/examples/tests/uniformity/index.ts +++ b/apps/typegpu-docs/src/content/examples/tests/uniformity/index.ts @@ -2,7 +2,7 @@ import tgpu, { type TgpuRenderPipeline } from 'typegpu'; import * as d from 'typegpu/data'; import * as c from './constants.ts'; -import type { PRNG } from './prngs.ts'; +import { PRNG } from './prngs.ts'; import { executePipeline, preparePipeline } from './helpers.ts'; const root = await tgpu.init(); @@ -29,7 +29,7 @@ const redraw = (value: PRNG) => { if (!pipelineCache.has(value)) { pipeline = preparePipeline( root, - context, + presentationFormat, value, gridSizeUniform, canvasRatioUniform, @@ -42,7 +42,6 @@ const redraw = (value: PRNG) => { }; // #region Example controls & Cleanup - export const controls = { 'PRNG': { initial: c.initialPRNG, @@ -60,6 +59,26 @@ export const controls = { redraw(prng); }, }, + 'Test Resolution': import.meta.env.DEV && { + onButtonClick: () => { + c.prngs + .filter((prng) => prng !== PRNG.DEFAULT_GENERATOR) + .map((prng) => + tgpu.resolve({ + externals: { + f: preparePipeline( + root, + presentationFormat, + prng, + gridSizeUniform, + canvasRatioUniform, + ), + }, + }) + ) + .map((r) => root.device.createShaderModule({ code: r })); + }, + }, }; const resizeObserver = new ResizeObserver(() => { diff --git a/packages/typegpu/tests/examples/individual/uniformity.test.ts b/packages/typegpu/tests/examples/individual/uniformity.test.ts new file mode 100644 index 000000000..fa3f5c364 --- /dev/null +++ b/packages/typegpu/tests/examples/individual/uniformity.test.ts @@ -0,0 +1,130 @@ +/** + * @vitest-environment jsdom + */ + +import { describe, expect } from 'vitest'; +import { it } from '../../utils/extendedIt.ts'; +import { runExampleTest, setupCommonMocks } from '../utils/baseTest.ts'; +import { mockResizeObserver } from '../utils/commonMocks.ts'; + +describe('uniformity test example', () => { + setupCommonMocks(); + + it('should produce valid code', async ({ device }) => { + const shaderCodes = await runExampleTest({ + category: 'tests', + name: 'uniformity', + setupMocks: mockResizeObserver, + controlTriggers: ['Test Resolution'], + expectedCalls: 2, + }, device); + + expect(shaderCodes).toMatchInlineSnapshot(` + "struct fullScreenTriangleVertexShader_Input_1 { + @builtin(vertex_index) vertexIndex: u32, + } + + struct fullScreenTriangleVertexShader_Output_2 { + @builtin(position) pos: vec4f, + @location(0) uv: vec2f, + } + + @vertex fn fullScreenTriangleVertexShader_0(input: fullScreenTriangleVertexShader_Input_1) -> fullScreenTriangleVertexShader_Output_2 { + var pos = array(vec2f(-1, -1), vec2f(3, -1), vec2f(-1, 3)); + return fullScreenTriangleVertexShader_Output_2(vec4f(pos[input.vertexIndex], 0, 1), pos[input.vertexIndex]); + } + + struct _Input_4 { + @location(0) uv: vec2f, + } + + @group(0) @binding(0) var canvasRatioUniform_5: f32; + + @group(0) @binding(1) var gridSizeUniform_6: f32; + + var seed_9: vec2f; + + fn seed2_8(value: vec2f) { + seed_9 = value; + } + + fn randSeed2_7(seed: vec2f) { + seed2_8(seed); + } + + fn item_11() -> f32 { + var a = dot(seed_9, vec2f(23.140779495239258, 232.6168975830078)); + var b = dot(seed_9, vec2f(54.47856521606445, 345.8415222167969)); + seed_9.x = fract((cos(a) * 136.8168)); + seed_9.y = fract((cos(b) * 534.7645)); + return seed_9.y; + } + + fn randFloat01_10() -> f32 { + return item_11(); + } + + @fragment fn item_3(input: _Input_4) -> @location(0) vec4f { + var uv = (((input.uv + 1) / 2) * vec2f(canvasRatioUniform_5, 1)); + var gridedUV = floor((uv * gridSizeUniform_6)); + randSeed2_7(gridedUV); + return vec4f(vec3f(randFloat01_10()), 1); + } + + struct fullScreenTriangleVertexShader_Input_1 { + @builtin(vertex_index) vertexIndex: u32, + } + + struct fullScreenTriangleVertexShader_Output_2 { + @builtin(position) pos: vec4f, + @location(0) uv: vec2f, + } + + @vertex fn fullScreenTriangleVertexShader_0(input: fullScreenTriangleVertexShader_Input_1) -> fullScreenTriangleVertexShader_Output_2 { + var pos = array(vec2f(-1, -1), vec2f(3, -1), vec2f(-1, 3)); + return fullScreenTriangleVertexShader_Output_2(vec4f(pos[input.vertexIndex], 0, 1), pos[input.vertexIndex]); + } + + struct _Input_4 { + @location(0) uv: vec2f, + } + + @group(0) @binding(0) var canvasRatioUniform_5: f32; + + @group(0) @binding(1) var gridSizeUniform_6: f32; + + var seed_9: u32; + + fn seed2_8(value: vec2f) { + seed_9 = u32(((value.x * 32768) + (value.y * 1024))); + } + + fn randSeed2_7(seed: vec2f) { + seed2_8(seed); + } + + fn u32ToFloat_12(val: u32) -> f32{ + let exponent: u32 = 0x3f800000; + let mantissa: u32 = 0x007fffff & val; + var ufloat: u32 = (exponent | mantissa); + return bitcast(ufloat) - 1f; + } + + fn item_11() -> f32 { + seed_9 = ((seed_9 * 1664525) + 1013904223); + return u32ToFloat_12(seed_9); + } + + fn randFloat01_10() -> f32 { + return item_11(); + } + + @fragment fn item_3(input: _Input_4) -> @location(0) vec4f { + var uv = (((input.uv + 1) / 2) * vec2f(canvasRatioUniform_5, 1)); + var gridedUV = floor((uv * gridSizeUniform_6)); + randSeed2_7(gridedUV); + return vec4f(vec3f(randFloat01_10()), 1); + }" + `); + }); +}); From df711375152a9cc4606f7043f293990098a7d099 Mon Sep 17 00:00:00 2001 From: Szymon Szulc Date: Fri, 5 Sep 2025 10:40:16 +0200 Subject: [PATCH 55/64] final polish --- .../src/content/examples/tests/uniformity/fragment.ts | 5 ++--- .../src/content/examples/tests/uniformity/helpers.ts | 5 ++--- .../src/content/examples/tests/uniformity/index.ts | 4 ++-- .../src/content/examples/tests/uniformity/prngs.ts | 4 +--- 4 files changed, 7 insertions(+), 11 deletions(-) diff --git a/apps/typegpu-docs/src/content/examples/tests/uniformity/fragment.ts b/apps/typegpu-docs/src/content/examples/tests/uniformity/fragment.ts index 0797e3109..a608f4117 100644 --- a/apps/typegpu-docs/src/content/examples/tests/uniformity/fragment.ts +++ b/apps/typegpu-docs/src/content/examples/tests/uniformity/fragment.ts @@ -7,8 +7,8 @@ import { randf } from '@typegpu/noise'; export const bindFullScreenGridFSWithUniforms = ( gridSizeUniform: TgpuUniform, canvasRatioUniform: TgpuUniform, -) => { - return tgpu['~unstable'].fragmentFn({ +) => + tgpu['~unstable'].fragmentFn({ in: { uv: d.vec2f }, out: d.vec4f, })((input) => { @@ -19,4 +19,3 @@ export const bindFullScreenGridFSWithUniforms = ( return d.vec4f(d.vec3f(randf.sample()), 1.0); }); -}; diff --git a/apps/typegpu-docs/src/content/examples/tests/uniformity/helpers.ts b/apps/typegpu-docs/src/content/examples/tests/uniformity/helpers.ts index e3a03cec6..d77ebce83 100644 --- a/apps/typegpu-docs/src/content/examples/tests/uniformity/helpers.ts +++ b/apps/typegpu-docs/src/content/examples/tests/uniformity/helpers.ts @@ -12,8 +12,8 @@ export const preparePipeline = ( prng: PRNG, gridSizeUniform: TgpuUniform, canvasRatioUniform: TgpuUniform, -): TgpuRenderPipeline => { - return root['~unstable'] +): TgpuRenderPipeline => + root['~unstable'] .with(randomGeneratorSlot, getPRNG(prng)) .withVertex(fullScreenTriangleVertexShader, {}) .withFragment( @@ -23,7 +23,6 @@ export const preparePipeline = ( }, ) .createPipeline(); -}; export const executePipeline = ( pipeline: TgpuRenderPipeline, diff --git a/apps/typegpu-docs/src/content/examples/tests/uniformity/index.ts b/apps/typegpu-docs/src/content/examples/tests/uniformity/index.ts index 56e0d8fba..08850de75 100644 --- a/apps/typegpu-docs/src/content/examples/tests/uniformity/index.ts +++ b/apps/typegpu-docs/src/content/examples/tests/uniformity/index.ts @@ -46,7 +46,7 @@ export const controls = { 'PRNG': { initial: c.initialPRNG, options: c.prngs, - onSelectChange: async (value: PRNG) => { + onSelectChange: (value: PRNG) => { prng = value; redraw(value); }, @@ -54,7 +54,7 @@ export const controls = { 'Grid Size': { initial: c.initialGridSize, options: c.gridSizes, - onSelectChange: async (value: number) => { + onSelectChange: (value: number) => { gridSizeUniform.write(value); redraw(prng); }, diff --git a/apps/typegpu-docs/src/content/examples/tests/uniformity/prngs.ts b/apps/typegpu-docs/src/content/examples/tests/uniformity/prngs.ts index f8d5f4632..622b12a4a 100644 --- a/apps/typegpu-docs/src/content/examples/tests/uniformity/prngs.ts +++ b/apps/typegpu-docs/src/content/examples/tests/uniformity/prngs.ts @@ -20,6 +20,4 @@ const PRNG_MAP = { [PRNG.LCG]: LCG, }; -export const getPRNG = (prng: PRNG): StatefulGenerator => { - return PRNG_MAP[prng]; -}; +export const getPRNG = (prng: PRNG): StatefulGenerator => PRNG_MAP[prng]; From 6b0aff3a719a8fef7d754cf40f0927c2974291ca Mon Sep 17 00:00:00 2001 From: Szymon Szulc Date: Thu, 25 Sep 2025 16:58:46 +0200 Subject: [PATCH 56/64] Broken pnpm-lock --- pnpm-lock.yaml | 12848 ++++++++++++++++------------------------------- 1 file changed, 4371 insertions(+), 8477 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 89090ae8a..498126798 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,4 +1,4 @@ -lockfileVersion: "9.0" +lockfileVersion: '9.0' settings: autoInstallPeers: true @@ -35,7 +35,7 @@ catalogs: specifier: ^3.2.4 version: 3.2.4 types: - "@webgpu/types": + '@webgpu/types': specifier: ^0.1.63 version: 0.1.63 typescript: @@ -46,21 +46,22 @@ overrides: rollup: 4.34.8 importers: + .: devDependencies: - "@biomejs/biome": + '@biomejs/biome': specifier: ^1.9.4 version: 1.9.4 - "@typegpu/tgpu-dev-cli": + '@typegpu/tgpu-dev-cli': specifier: workspace:* version: link:packages/tgpu-dev-cli - "@vitest/browser": + '@vitest/browser': specifier: ^3.2.4 version: 3.2.4(msw@2.10.2(@types/node@24.5.2)(typescript@5.8.3))(vite@6.3.6(@types/node@24.5.2)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.1))(vitest@3.2.4) - "@vitest/coverage-v8": + '@vitest/coverage-v8': specifier: 3.1.2 version: 3.1.2(@vitest/browser@3.2.4)(vitest@3.2.4) - "@webgpu/types": + '@webgpu/types': specifier: catalog:types version: 0.1.63 dpdm: @@ -90,20 +91,20 @@ importers: apps/bun-example: dependencies: - "@typegpu/noise": - specifier: "workspace:" + '@typegpu/noise': + specifier: 'workspace:' version: link:../../packages/typegpu-noise typegpu: - specifier: "workspace:" + specifier: 'workspace:' version: link:../../packages/typegpu typescript: specifier: ^5 version: 5.8.3 unplugin-typegpu: - specifier: "workspace:" + specifier: 'workspace:' version: link:../../packages/unplugin-typegpu devDependencies: - "@types/bun": + '@types/bun': specifier: latest version: 1.2.22(@types/react@19.1.8) @@ -115,65 +116,65 @@ importers: apps/typegpu-docs: dependencies: - "@astrojs/check": + '@astrojs/check': specifier: ^0.9.4 version: 0.9.4(prettier@3.5.3)(typescript@5.8.3) - "@astrojs/react": + '@astrojs/react': specifier: ^4.3.1 version: 4.3.1(@types/node@24.3.0)(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(jiti@2.5.1)(lightningcss@1.30.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(tsx@4.19.3)(yaml@2.8.0) - "@astrojs/sitemap": + '@astrojs/sitemap': specifier: ^3.5.0 version: 3.5.0 - "@astrojs/starlight": + '@astrojs/starlight': specifier: ^0.35.2 version: 0.35.2(astro@5.13.7(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(rollup@4.34.8)(tsx@4.19.3)(typescript@5.8.3)(yaml@2.8.0)) - "@astrojs/starlight-tailwind": + '@astrojs/starlight-tailwind': specifier: ^4.0.1 version: 4.0.1(@astrojs/starlight@0.35.2(astro@5.13.7(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(rollup@4.34.8)(tsx@4.19.3)(typescript@5.8.3)(yaml@2.8.0)))(tailwindcss@4.1.11) - "@astrojs/tailwind": + '@astrojs/tailwind': specifier: ^6.0.2 version: 6.0.2(astro@5.13.7(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(rollup@4.34.8)(tsx@4.19.3)(typescript@5.8.3)(yaml@2.8.0))(tailwindcss@4.1.11) - "@babel/standalone": + '@babel/standalone': specifier: ^7.27.0 version: 7.27.0 - "@loaders.gl/core": + '@loaders.gl/core': specifier: ^4.3.4 version: 4.3.4 - "@loaders.gl/obj": + '@loaders.gl/obj': specifier: ^4.3.4 version: 4.3.4(@loaders.gl/core@4.3.4) - "@monaco-editor/react": + '@monaco-editor/react': specifier: ^4.7.0 version: 4.7.0(monaco-editor@0.53.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - "@radix-ui/react-select": + '@radix-ui/react-select': specifier: ^2.2.5 version: 2.2.5(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - "@radix-ui/react-slider": + '@radix-ui/react-slider': specifier: ^1.3.5 version: 1.3.5(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - "@stackblitz/sdk": + '@stackblitz/sdk': specifier: ^1.11.0 version: 1.11.0 - "@tailwindcss/vite": + '@tailwindcss/vite': specifier: ^4.1.13 version: 4.1.13(vite@6.3.6(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0)) - "@typegpu/color": + '@typegpu/color': specifier: workspace:* version: link:../../packages/typegpu-color - "@typegpu/noise": + '@typegpu/noise': specifier: workspace:* version: link:../../packages/typegpu-noise - "@typegpu/sdf": + '@typegpu/sdf': specifier: workspace:* version: link:../../packages/typegpu-sdf - "@types/react": + '@types/react': specifier: ^19.1.8 version: 19.1.8 - "@types/react-dom": + '@types/react-dom': specifier: ^19.1.6 version: 19.1.6(@types/react@19.1.8) arktype: - specifier: "catalog:" + specifier: 'catalog:' version: 2.1.22 astro: specifier: ^5.13.7 @@ -260,28 +261,28 @@ importers: specifier: ^0.0.1 version: 0.0.1 devDependencies: - "@observablehq/plot": + '@observablehq/plot': specifier: ^0.6.17 version: 0.6.17 - "@types/babel__standalone": + '@types/babel__standalone': specifier: ^7.1.9 version: 7.1.9 - "@types/babel__template": + '@types/babel__template': specifier: ^7.4.4 version: 7.4.4 - "@types/babel__traverse": + '@types/babel__traverse': specifier: ^7.20.7 version: 7.20.7 - "@types/dom-mediacapture-record": + '@types/dom-mediacapture-record': specifier: ^1.0.22 version: 1.0.22 - "@types/node": + '@types/node': specifier: ^24.2.0 version: 24.3.0 - "@vitejs/plugin-basic-ssl": + '@vitejs/plugin-basic-ssl': specifier: ^2.1.0 version: 2.1.0(vite@6.3.6(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0)) - "@webgpu/types": + '@webgpu/types': specifier: catalog:types version: 0.1.63 astro-vtbot: @@ -312,7 +313,7 @@ importers: specifier: ^5.0.2 version: 5.0.2 arktype: - specifier: "catalog:" + specifier: 'catalog:' version: 2.1.22 consola: specifier: ^3.4.0 @@ -361,16 +362,16 @@ importers: specifier: ^2.20.1 version: 2.20.1 devDependencies: - "@typegpu/tgpu-dev-cli": + '@typegpu/tgpu-dev-cli': specifier: workspace:* version: link:../tgpu-dev-cli - "@types/moo": + '@types/moo': specifier: ^0.5.9 version: 0.5.10 - "@types/nearley": + '@types/nearley': specifier: ^2.11.5 version: 2.11.5 - "@webgpu/types": + '@webgpu/types': specifier: catalog:types version: 0.1.63 moo: @@ -392,7 +393,7 @@ importers: packages/tinyest: devDependencies: - "@typegpu/tgpu-dev-cli": + '@typegpu/tgpu-dev-cli': specifier: workspace:* version: link:../tgpu-dev-cli tsup: @@ -409,13 +410,13 @@ importers: specifier: workspace:~0.1.1 version: link:../tinyest devDependencies: - "@babel/parser": + '@babel/parser': specifier: ^7.27.0 version: 7.27.0 - "@babel/types": + '@babel/types': specifier: 7.26.5 version: 7.26.5 - "@typegpu/tgpu-dev-cli": + '@typegpu/tgpu-dev-cli': specifier: workspace:* version: link:../tgpu-dev-cli acorn: @@ -438,17 +439,17 @@ importers: specifier: ^4.3.1 version: 4.3.2 devDependencies: - "@ark/attest": + '@ark/attest': specifier: ^0.46.0 version: 0.46.0(typescript@5.8.3) - "@typegpu/tgpu-dev-cli": + '@typegpu/tgpu-dev-cli': specifier: workspace:* version: link:../tgpu-dev-cli - "@webgpu/types": + '@webgpu/types': specifier: catalog:types version: 0.1.63 arktype: - specifier: "catalog:" + specifier: 'catalog:' version: 2.1.22 jiti: specifier: catalog:build @@ -475,10 +476,10 @@ importers: packages/typegpu-color: devDependencies: - "@typegpu/tgpu-dev-cli": + '@typegpu/tgpu-dev-cli': specifier: workspace:* version: link:../tgpu-dev-cli - "@webgpu/types": + '@webgpu/types': specifier: catalog:types version: 0.1.63 typegpu: @@ -497,10 +498,10 @@ importers: packages/typegpu-noise: devDependencies: - "@typegpu/tgpu-dev-cli": + '@typegpu/tgpu-dev-cli': specifier: workspace:* version: link:../tgpu-dev-cli - "@webgpu/types": + '@webgpu/types': specifier: catalog:types version: 0.1.63 typegpu: @@ -519,10 +520,10 @@ importers: packages/typegpu-sdf: devDependencies: - "@typegpu/tgpu-dev-cli": + '@typegpu/tgpu-dev-cli': specifier: workspace:* version: link:../tgpu-dev-cli - "@webgpu/types": + '@webgpu/types': specifier: catalog:types version: 0.1.63 typegpu: @@ -541,7 +542,7 @@ importers: packages/unplugin-typegpu: dependencies: - "@babel/standalone": + '@babel/standalone': specifier: ^7.27.0 version: 7.27.0 defu: @@ -572,31 +573,31 @@ importers: specifier: ^2.3.5 version: 2.3.5 devDependencies: - "@babel/template": + '@babel/template': specifier: ^7.27.2 version: 7.27.2 - "@babel/types": + '@babel/types': specifier: ^7.26.5 version: 7.26.5 - "@rollup/plugin-virtual": + '@rollup/plugin-virtual': specifier: ^3.0.2 version: 3.0.2(rollup@4.34.8) - "@typegpu/tgpu-dev-cli": + '@typegpu/tgpu-dev-cli': specifier: workspace:* version: link:../tgpu-dev-cli - "@types/babel__standalone": + '@types/babel__standalone': specifier: ^7.1.9 version: 7.1.9 - "@types/babel__template": + '@types/babel__template': specifier: ^7.4.4 version: 7.4.4 - "@types/babel__traverse": + '@types/babel__traverse': specifier: ^7.20.7 version: 7.20.7 - "@types/bun": + '@types/bun': specifier: ^1.2.22 version: 1.2.22(@types/react@19.1.8) - "@types/picomatch": + '@types/picomatch': specifier: ^4.0.1 version: 4.0.1 acorn: @@ -614,3661 +615,2318 @@ importers: publishDirectory: dist packages: - "@ampproject/remapping@2.3.0": - resolution: - { - integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==, - } - engines: { node: ">=6.0.0" } - - "@ark/attest@0.46.0": - resolution: - { - integrity: sha512-bDo8Mtx94oFkhozao9rjoWf1/MOV4lakpoKtPvIFfHceE3M3jVqIOVY46Xh1TibMhjQ1vMtd55PcfllHYjbm8w==, - } + + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + + '@ark/attest@0.46.0': + resolution: {integrity: sha512-bDo8Mtx94oFkhozao9rjoWf1/MOV4lakpoKtPvIFfHceE3M3jVqIOVY46Xh1TibMhjQ1vMtd55PcfllHYjbm8w==} hasBin: true peerDependencies: - typescript: "*" - - "@ark/fs@0.46.0": - resolution: - { - integrity: sha512-lBW6Vv6dZ74Gcc+zvJP8gjZACMo5o6hEuOvAtX6EJ5xNYBmX7nrXQaDdRfQNGDzgaX5UHGqi/vxk5moK94K7Yw==, - } - - "@ark/schema@0.46.0": - resolution: - { - integrity: sha512-c2UQdKgP2eqqDArfBqQIJppxJHvNNXuQPeuSPlDML4rjw+f1cu0qAlzOG4b8ujgm9ctIDWwhpyw6gjG5ledIVQ==, - } - - "@ark/schema@0.49.0": - resolution: - { - integrity: sha512-GphZBLpW72iS0v4YkeUtV3YIno35Gimd7+ezbPO9GwEi9kzdUrPVjvf6aXSBAfHikaFc/9pqZOpv3pOXnC71tw==, - } - - "@ark/util@0.46.0": - resolution: - { - integrity: sha512-JPy/NGWn/lvf1WmGCPw2VGpBg5utZraE84I7wli18EDF3p3zc/e9WolT35tINeZO3l7C77SjqRJeAUoT0CvMRg==, - } - - "@ark/util@0.49.0": - resolution: - { - integrity: sha512-/BtnX7oCjNkxi2vi6y1399b+9xd1jnCrDYhZ61f0a+3X8x8DxlK52VgEEzyuC2UQMPACIfYrmHkhD3lGt2GaMA==, - } - - "@asamuzakjp/css-color@4.0.5": - resolution: - { - integrity: sha512-lMrXidNhPGsDjytDy11Vwlb6OIGrT3CmLg3VWNFyWkLWtijKl7xjvForlh8vuj0SHGjgl4qZEQzUmYTeQA2JFQ==, - } - - "@asamuzakjp/dom-selector@6.5.6": - resolution: - { - integrity: sha512-Mj3Hu9ymlsERd7WOsUKNUZnJYL4IZ/I9wVVYgtvOsWYiEFbkQ4G7VRIh2USxTVW4BBDIsLG+gBUgqOqf2Kvqow==, - } - - "@asamuzakjp/nwsapi@2.3.9": - resolution: - { - integrity: sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==, - } - - "@astrojs/check@0.9.4": - resolution: - { - integrity: sha512-IOheHwCtpUfvogHHsvu0AbeRZEnjJg3MopdLddkJE70mULItS/Vh37BHcI00mcOJcH1vhD3odbpvWokpxam7xA==, - } + typescript: '*' + + '@ark/fs@0.46.0': + resolution: {integrity: sha512-lBW6Vv6dZ74Gcc+zvJP8gjZACMo5o6hEuOvAtX6EJ5xNYBmX7nrXQaDdRfQNGDzgaX5UHGqi/vxk5moK94K7Yw==} + + '@ark/schema@0.46.0': + resolution: {integrity: sha512-c2UQdKgP2eqqDArfBqQIJppxJHvNNXuQPeuSPlDML4rjw+f1cu0qAlzOG4b8ujgm9ctIDWwhpyw6gjG5ledIVQ==} + + '@ark/schema@0.49.0': + resolution: {integrity: sha512-GphZBLpW72iS0v4YkeUtV3YIno35Gimd7+ezbPO9GwEi9kzdUrPVjvf6aXSBAfHikaFc/9pqZOpv3pOXnC71tw==} + + '@ark/util@0.46.0': + resolution: {integrity: sha512-JPy/NGWn/lvf1WmGCPw2VGpBg5utZraE84I7wli18EDF3p3zc/e9WolT35tINeZO3l7C77SjqRJeAUoT0CvMRg==} + + '@ark/util@0.49.0': + resolution: {integrity: sha512-/BtnX7oCjNkxi2vi6y1399b+9xd1jnCrDYhZ61f0a+3X8x8DxlK52VgEEzyuC2UQMPACIfYrmHkhD3lGt2GaMA==} + + '@asamuzakjp/css-color@4.0.5': + resolution: {integrity: sha512-lMrXidNhPGsDjytDy11Vwlb6OIGrT3CmLg3VWNFyWkLWtijKl7xjvForlh8vuj0SHGjgl4qZEQzUmYTeQA2JFQ==} + + '@asamuzakjp/dom-selector@6.5.6': + resolution: {integrity: sha512-Mj3Hu9ymlsERd7WOsUKNUZnJYL4IZ/I9wVVYgtvOsWYiEFbkQ4G7VRIh2USxTVW4BBDIsLG+gBUgqOqf2Kvqow==} + + '@asamuzakjp/nwsapi@2.3.9': + resolution: {integrity: sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==} + + '@astrojs/check@0.9.4': + resolution: {integrity: sha512-IOheHwCtpUfvogHHsvu0AbeRZEnjJg3MopdLddkJE70mULItS/Vh37BHcI00mcOJcH1vhD3odbpvWokpxam7xA==} hasBin: true peerDependencies: typescript: ^5.0.0 - "@astrojs/compiler@2.13.0": - resolution: - { - integrity: sha512-mqVORhUJViA28fwHYaWmsXSzLO9osbdZ5ImUfxBarqsYdMlPbqAqGJCxsNzvppp1BEzc1mJNjOVvQqeDN8Vspw==, - } - - "@astrojs/internal-helpers@0.6.1": - resolution: - { - integrity: sha512-l5Pqf6uZu31aG+3Lv8nl/3s4DbUzdlxTWDof4pEpto6GUJNhhCbelVi9dEyurOVyqaelwmS9oSyOWOENSfgo9A==, - } - - "@astrojs/internal-helpers@0.7.2": - resolution: - { - integrity: sha512-KCkCqR3Goym79soqEtbtLzJfqhTWMyVaizUi35FLzgGSzBotSw8DB1qwsu7U96ihOJgYhDk2nVPz+3LnXPeX6g==, - } - - "@astrojs/language-server@2.15.4": - resolution: - { - integrity: sha512-JivzASqTPR2bao9BWsSc/woPHH7OGSGc9aMxXL4U6egVTqBycB3ZHdBJPuOCVtcGLrzdWTosAqVPz1BVoxE0+A==, - } + '@astrojs/compiler@2.13.0': + resolution: {integrity: sha512-mqVORhUJViA28fwHYaWmsXSzLO9osbdZ5ImUfxBarqsYdMlPbqAqGJCxsNzvppp1BEzc1mJNjOVvQqeDN8Vspw==} + + '@astrojs/internal-helpers@0.6.1': + resolution: {integrity: sha512-l5Pqf6uZu31aG+3Lv8nl/3s4DbUzdlxTWDof4pEpto6GUJNhhCbelVi9dEyurOVyqaelwmS9oSyOWOENSfgo9A==} + + '@astrojs/internal-helpers@0.7.2': + resolution: {integrity: sha512-KCkCqR3Goym79soqEtbtLzJfqhTWMyVaizUi35FLzgGSzBotSw8DB1qwsu7U96ihOJgYhDk2nVPz+3LnXPeX6g==} + + '@astrojs/language-server@2.15.4': + resolution: {integrity: sha512-JivzASqTPR2bao9BWsSc/woPHH7OGSGc9aMxXL4U6egVTqBycB3ZHdBJPuOCVtcGLrzdWTosAqVPz1BVoxE0+A==} hasBin: true peerDependencies: prettier: ^3.0.0 - prettier-plugin-astro: ">=0.11.0" + prettier-plugin-astro: '>=0.11.0' peerDependenciesMeta: prettier: optional: true prettier-plugin-astro: optional: true - "@astrojs/markdown-remark@6.3.1": - resolution: - { - integrity: sha512-c5F5gGrkczUaTVgmMW9g1YMJGzOtRvjjhw6IfGuxarM6ct09MpwysP10US729dy07gg8y+ofVifezvP3BNsWZg==, - } - - "@astrojs/markdown-remark@6.3.3": - resolution: - { - integrity: sha512-DDRtD1sPvAuA7ms2btc9A7/7DApKqgLMNrE6kh5tmkfy8utD0Z738gqd3p5aViYYdUtHIyEJ1X4mCMxfCfu15w==, - } - - "@astrojs/markdown-remark@6.3.6": - resolution: - { - integrity: sha512-bwylYktCTsLMVoCOEHbn2GSUA3c5KT/qilekBKA3CBng0bo1TYjNZPr761vxumRk9kJGqTOtU+fgCAp5Vwokug==, - } - - "@astrojs/mdx@4.2.6": - resolution: - { - integrity: sha512-0i/GmOm6d0qq1/SCfcUgY/IjDc/bS0i42u7h85TkPFBmlFOcBZfkYhR5iyz6hZLwidvJOEq5yGfzt9B1Azku4w==, - } - engines: { node: ^18.17.1 || ^20.3.0 || >=22.0.0 } + '@astrojs/markdown-remark@6.3.1': + resolution: {integrity: sha512-c5F5gGrkczUaTVgmMW9g1YMJGzOtRvjjhw6IfGuxarM6ct09MpwysP10US729dy07gg8y+ofVifezvP3BNsWZg==} + + '@astrojs/markdown-remark@6.3.3': + resolution: {integrity: sha512-DDRtD1sPvAuA7ms2btc9A7/7DApKqgLMNrE6kh5tmkfy8utD0Z738gqd3p5aViYYdUtHIyEJ1X4mCMxfCfu15w==} + + '@astrojs/markdown-remark@6.3.6': + resolution: {integrity: sha512-bwylYktCTsLMVoCOEHbn2GSUA3c5KT/qilekBKA3CBng0bo1TYjNZPr761vxumRk9kJGqTOtU+fgCAp5Vwokug==} + + '@astrojs/mdx@4.2.6': + resolution: {integrity: sha512-0i/GmOm6d0qq1/SCfcUgY/IjDc/bS0i42u7h85TkPFBmlFOcBZfkYhR5iyz6hZLwidvJOEq5yGfzt9B1Azku4w==} + engines: {node: ^18.17.1 || ^20.3.0 || >=22.0.0} peerDependencies: astro: ^5.0.0 - "@astrojs/prism@3.2.0": - resolution: - { - integrity: sha512-GilTHKGCW6HMq7y3BUv9Ac7GMe/MO9gi9GW62GzKtth0SwukCu/qp2wLiGpEujhY+VVhaG9v7kv/5vFzvf4NYw==, - } - engines: { node: ^18.17.1 || ^20.3.0 || >=22.0.0 } - - "@astrojs/prism@3.3.0": - resolution: - { - integrity: sha512-q8VwfU/fDZNoDOf+r7jUnMC2//H2l0TuQ6FkGJL8vD8nw/q5KiL3DS1KKBI3QhI9UQhpJ5dc7AtqfbXWuOgLCQ==, - } - engines: { node: 18.20.8 || ^20.3.0 || >=22.0.0 } - - "@astrojs/react@4.3.1": - resolution: - { - integrity: sha512-Jhv35TsDHuQLvwof2z10P3g1s9wIR4UN9jE7O4NZBJNXOt/+qk+L0rY9th4SX7VzccKmRltUGxAhI1cXH52gXw==, - } - engines: { node: 18.20.8 || ^20.3.0 || >=22.0.0 } + '@astrojs/prism@3.2.0': + resolution: {integrity: sha512-GilTHKGCW6HMq7y3BUv9Ac7GMe/MO9gi9GW62GzKtth0SwukCu/qp2wLiGpEujhY+VVhaG9v7kv/5vFzvf4NYw==} + engines: {node: ^18.17.1 || ^20.3.0 || >=22.0.0} + + '@astrojs/prism@3.3.0': + resolution: {integrity: sha512-q8VwfU/fDZNoDOf+r7jUnMC2//H2l0TuQ6FkGJL8vD8nw/q5KiL3DS1KKBI3QhI9UQhpJ5dc7AtqfbXWuOgLCQ==} + engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0} + + '@astrojs/react@4.3.1': + resolution: {integrity: sha512-Jhv35TsDHuQLvwof2z10P3g1s9wIR4UN9jE7O4NZBJNXOt/+qk+L0rY9th4SX7VzccKmRltUGxAhI1cXH52gXw==} + engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0} peerDependencies: - "@types/react": ^17.0.50 || ^18.0.21 || ^19.0.0 - "@types/react-dom": ^17.0.17 || ^18.0.6 || ^19.0.0 + '@types/react': ^17.0.50 || ^18.0.21 || ^19.0.0 + '@types/react-dom': ^17.0.17 || ^18.0.6 || ^19.0.0 react: ^17.0.2 || ^18.0.0 || ^19.0.0 react-dom: ^17.0.2 || ^18.0.0 || ^19.0.0 - "@astrojs/rss@4.0.11": - resolution: - { - integrity: sha512-3e3H8i6kc97KGnn9iaZBJpIkdoQi8MmR5zH5R+dWsfCM44lLTszOqy1OBfGGxDt56mpQkYVtZJWoxMyWuUZBfw==, - } - - "@astrojs/sitemap@3.5.0": - resolution: - { - integrity: sha512-ldOvoBxuRgpcdndzksskOTzU55g76tkHC/POpejUbPGz6zR4rJKiXh8thX4WEPWDhCTZUafhJ1qf7k1muStHfg==, - } - - "@astrojs/starlight-tailwind@4.0.1": - resolution: - { - integrity: sha512-AOOEWTGqJ7fG66U04xTmZQZ40oZnUYe4Qljpr+No88ozKywtsD1DiXOrGTeHCnZu0hRtMbRtBGB1fZsf0L62iw==, - } + '@astrojs/rss@4.0.11': + resolution: {integrity: sha512-3e3H8i6kc97KGnn9iaZBJpIkdoQi8MmR5zH5R+dWsfCM44lLTszOqy1OBfGGxDt56mpQkYVtZJWoxMyWuUZBfw==} + + '@astrojs/sitemap@3.5.0': + resolution: {integrity: sha512-ldOvoBxuRgpcdndzksskOTzU55g76tkHC/POpejUbPGz6zR4rJKiXh8thX4WEPWDhCTZUafhJ1qf7k1muStHfg==} + + '@astrojs/starlight-tailwind@4.0.1': + resolution: {integrity: sha512-AOOEWTGqJ7fG66U04xTmZQZ40oZnUYe4Qljpr+No88ozKywtsD1DiXOrGTeHCnZu0hRtMbRtBGB1fZsf0L62iw==} peerDependencies: - "@astrojs/starlight": ">=0.34.0" + '@astrojs/starlight': '>=0.34.0' tailwindcss: ^4.0.0 - "@astrojs/starlight@0.35.2": - resolution: - { - integrity: sha512-curGghoW4s5pCbW2tINsJPoxEYPan87ptCOv7GZ+S24N3J6AyaOu/OsjZDEMaIpo3ZlObM5DQn+w7iXl3drDhQ==, - } + '@astrojs/starlight@0.35.2': + resolution: {integrity: sha512-curGghoW4s5pCbW2tINsJPoxEYPan87ptCOv7GZ+S24N3J6AyaOu/OsjZDEMaIpo3ZlObM5DQn+w7iXl3drDhQ==} peerDependencies: astro: ^5.5.0 - "@astrojs/tailwind@6.0.2": - resolution: - { - integrity: sha512-j3mhLNeugZq6A8dMNXVarUa8K6X9AW+QHU9u3lKNrPLMHhOQ0S7VeWhHwEeJFpEK1BTKEUY1U78VQv2gN6hNGg==, - } + '@astrojs/tailwind@6.0.2': + resolution: {integrity: sha512-j3mhLNeugZq6A8dMNXVarUa8K6X9AW+QHU9u3lKNrPLMHhOQ0S7VeWhHwEeJFpEK1BTKEUY1U78VQv2gN6hNGg==} peerDependencies: astro: ^3.0.0 || ^4.0.0 || ^5.0.0 tailwindcss: ^3.0.24 - "@astrojs/telemetry@3.3.0": - resolution: - { - integrity: sha512-UFBgfeldP06qu6khs/yY+q1cDAaArM2/7AEIqQ9Cuvf7B1hNLq0xDrZkct+QoIGyjq56y8IaE2I3CTvG99mlhQ==, - } - engines: { node: 18.20.8 || ^20.3.0 || >=22.0.0 } - - "@astrojs/yaml2ts@0.2.2": - resolution: - { - integrity: sha512-GOfvSr5Nqy2z5XiwqTouBBpy5FyI6DEe+/g/Mk5am9SjILN1S5fOEvYK0GuWHg98yS/dobP4m8qyqw/URW35fQ==, - } - - "@babel/code-frame@7.27.1": - resolution: - { - integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==, - } - engines: { node: ">=6.9.0" } - - "@babel/compat-data@7.28.4": - resolution: - { - integrity: sha512-YsmSKC29MJwf0gF8Rjjrg5LQCmyh+j/nD8/eP7f+BeoQTKYqs9RoWbjGOdy0+1Ekr68RJZMUOPVQaQisnIo4Rw==, - } - engines: { node: ">=6.9.0" } - - "@babel/core@7.28.4": - resolution: - { - integrity: sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==, - } - engines: { node: ">=6.9.0" } - - "@babel/generator@7.28.3": - resolution: - { - integrity: sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==, - } - engines: { node: ">=6.9.0" } - - "@babel/helper-compilation-targets@7.27.2": - resolution: - { - integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==, - } - engines: { node: ">=6.9.0" } - - "@babel/helper-globals@7.28.0": - resolution: - { - integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==, - } - engines: { node: ">=6.9.0" } - - "@babel/helper-module-imports@7.27.1": - resolution: - { - integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==, - } - engines: { node: ">=6.9.0" } - - "@babel/helper-module-transforms@7.28.3": - resolution: - { - integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==, - } - engines: { node: ">=6.9.0" } + '@astrojs/telemetry@3.3.0': + resolution: {integrity: sha512-UFBgfeldP06qu6khs/yY+q1cDAaArM2/7AEIqQ9Cuvf7B1hNLq0xDrZkct+QoIGyjq56y8IaE2I3CTvG99mlhQ==} + engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0} + + '@astrojs/yaml2ts@0.2.2': + resolution: {integrity: sha512-GOfvSr5Nqy2z5XiwqTouBBpy5FyI6DEe+/g/Mk5am9SjILN1S5fOEvYK0GuWHg98yS/dobP4m8qyqw/URW35fQ==} + + '@babel/code-frame@7.27.1': + resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.28.4': + resolution: {integrity: sha512-YsmSKC29MJwf0gF8Rjjrg5LQCmyh+j/nD8/eP7f+BeoQTKYqs9RoWbjGOdy0+1Ekr68RJZMUOPVQaQisnIo4Rw==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.28.4': + resolution: {integrity: sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.28.3': + resolution: {integrity: sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.27.2': + resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-globals@7.28.0': + resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.27.1': + resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.28.3': + resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==} + engines: {node: '>=6.9.0'} peerDependencies: - "@babel/core": ^7.0.0 - - "@babel/helper-plugin-utils@7.27.1": - resolution: - { - integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==, - } - engines: { node: ">=6.9.0" } - - "@babel/helper-string-parser@7.25.9": - resolution: - { - integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==, - } - engines: { node: ">=6.9.0" } - - "@babel/helper-string-parser@7.27.1": - resolution: - { - integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==, - } - engines: { node: ">=6.9.0" } - - "@babel/helper-validator-identifier@7.25.9": - resolution: - { - integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==, - } - engines: { node: ">=6.9.0" } - - "@babel/helper-validator-identifier@7.27.1": - resolution: - { - integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==, - } - engines: { node: ">=6.9.0" } - - "@babel/helper-validator-option@7.27.1": - resolution: - { - integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==, - } - engines: { node: ">=6.9.0" } - - "@babel/helpers@7.28.4": - resolution: - { - integrity: sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==, - } - engines: { node: ">=6.9.0" } - - "@babel/parser@7.26.9": - resolution: - { - integrity: sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A==, - } - engines: { node: ">=6.0.0" } + '@babel/core': ^7.0.0 + + '@babel/helper-plugin-utils@7.27.1': + resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.25.9': + resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.25.9': + resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.27.1': + resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.27.1': + resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.28.4': + resolution: {integrity: sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.26.9': + resolution: {integrity: sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A==} + engines: {node: '>=6.0.0'} hasBin: true - "@babel/parser@7.27.0": - resolution: - { - integrity: sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==, - } - engines: { node: ">=6.0.0" } + '@babel/parser@7.27.0': + resolution: {integrity: sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==} + engines: {node: '>=6.0.0'} hasBin: true - "@babel/parser@7.27.2": - resolution: - { - integrity: sha512-QYLs8299NA7WM/bZAdp+CviYYkVoYXlDW2rzliy3chxd1PQjej7JORuMJDJXJUb9g0TT+B99EwaVLKmX+sPXWw==, - } - engines: { node: ">=6.0.0" } + '@babel/parser@7.27.2': + resolution: {integrity: sha512-QYLs8299NA7WM/bZAdp+CviYYkVoYXlDW2rzliy3chxd1PQjej7JORuMJDJXJUb9g0TT+B99EwaVLKmX+sPXWw==} + engines: {node: '>=6.0.0'} hasBin: true - "@babel/parser@7.28.4": - resolution: - { - integrity: sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==, - } - engines: { node: ">=6.0.0" } + '@babel/parser@7.28.4': + resolution: {integrity: sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==} + engines: {node: '>=6.0.0'} hasBin: true - "@babel/plugin-transform-react-jsx-self@7.27.1": - resolution: - { - integrity: sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==, - } - engines: { node: ">=6.9.0" } + '@babel/plugin-transform-react-jsx-self@7.27.1': + resolution: {integrity: sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==} + engines: {node: '>=6.9.0'} peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-transform-react-jsx-source@7.27.1": - resolution: - { - integrity: sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==, - } - engines: { node: ">=6.9.0" } + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-source@7.27.1': + resolution: {integrity: sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==} + engines: {node: '>=6.9.0'} peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/runtime@7.26.9": - resolution: - { - integrity: sha512-aA63XwOkcl4xxQa3HjPMqOP6LiK0ZDv3mUPYEFXkpHbaFjtGggE1A61FjFzJnB+p7/oy2gA8E+rcBNl/zC1tMg==, - } - engines: { node: ">=6.9.0" } - - "@babel/standalone@7.27.0": - resolution: - { - integrity: sha512-UxFDpi+BuSz6Q1X73P3ZSM1CB7Nbbqys+7COi/tdouRuaqRsJ6GAzUyxTswbqItHSItVY3frQdd+paBHHGEk9g==, - } - engines: { node: ">=6.9.0" } - - "@babel/template@7.27.2": - resolution: - { - integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==, - } - engines: { node: ">=6.9.0" } - - "@babel/traverse@7.28.4": - resolution: - { - integrity: sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==, - } - engines: { node: ">=6.9.0" } - - "@babel/types@7.26.5": - resolution: - { - integrity: sha512-L6mZmwFDK6Cjh1nRCLXpa6no13ZIioJDz7mdkzHv399pThrTa/k0nUlNaenOeh2kWu/iaOQYElEpKPUswUa9Vg==, - } - engines: { node: ">=6.9.0" } - - "@babel/types@7.26.9": - resolution: - { - integrity: sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw==, - } - engines: { node: ">=6.9.0" } - - "@babel/types@7.27.0": - resolution: - { - integrity: sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==, - } - engines: { node: ">=6.9.0" } - - "@babel/types@7.27.1": - resolution: - { - integrity: sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q==, - } - engines: { node: ">=6.9.0" } - - "@babel/types@7.28.4": - resolution: - { - integrity: sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==, - } - engines: { node: ">=6.9.0" } - - "@bcoe/v8-coverage@1.0.2": - resolution: - { - integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==, - } - engines: { node: ">=18" } - - "@biomejs/biome@1.9.4": - resolution: - { - integrity: sha512-1rkd7G70+o9KkTn5KLmDYXihGoTaIGO9PIIN2ZB7UJxFrWw04CZHPYiMRjYsaDvVV7hP1dYNRLxSANLaBFGpog==, - } - engines: { node: ">=14.21.3" } + '@babel/core': ^7.0.0-0 + + '@babel/runtime@7.26.9': + resolution: {integrity: sha512-aA63XwOkcl4xxQa3HjPMqOP6LiK0ZDv3mUPYEFXkpHbaFjtGggE1A61FjFzJnB+p7/oy2gA8E+rcBNl/zC1tMg==} + engines: {node: '>=6.9.0'} + + '@babel/standalone@7.27.0': + resolution: {integrity: sha512-UxFDpi+BuSz6Q1X73P3ZSM1CB7Nbbqys+7COi/tdouRuaqRsJ6GAzUyxTswbqItHSItVY3frQdd+paBHHGEk9g==} + engines: {node: '>=6.9.0'} + + '@babel/template@7.27.2': + resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.28.4': + resolution: {integrity: sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.26.5': + resolution: {integrity: sha512-L6mZmwFDK6Cjh1nRCLXpa6no13ZIioJDz7mdkzHv399pThrTa/k0nUlNaenOeh2kWu/iaOQYElEpKPUswUa9Vg==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.26.9': + resolution: {integrity: sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.27.0': + resolution: {integrity: sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.27.1': + resolution: {integrity: sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.28.4': + resolution: {integrity: sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==} + engines: {node: '>=6.9.0'} + + '@bcoe/v8-coverage@1.0.2': + resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} + engines: {node: '>=18'} + + '@biomejs/biome@1.9.4': + resolution: {integrity: sha512-1rkd7G70+o9KkTn5KLmDYXihGoTaIGO9PIIN2ZB7UJxFrWw04CZHPYiMRjYsaDvVV7hP1dYNRLxSANLaBFGpog==} + engines: {node: '>=14.21.3'} hasBin: true - "@biomejs/cli-darwin-arm64@1.9.4": - resolution: - { - integrity: sha512-bFBsPWrNvkdKrNCYeAp+xo2HecOGPAy9WyNyB/jKnnedgzl4W4Hb9ZMzYNbf8dMCGmUdSavlYHiR01QaYR58cw==, - } - engines: { node: ">=14.21.3" } + '@biomejs/cli-darwin-arm64@1.9.4': + resolution: {integrity: sha512-bFBsPWrNvkdKrNCYeAp+xo2HecOGPAy9WyNyB/jKnnedgzl4W4Hb9ZMzYNbf8dMCGmUdSavlYHiR01QaYR58cw==} + engines: {node: '>=14.21.3'} cpu: [arm64] os: [darwin] - "@biomejs/cli-darwin-x64@1.9.4": - resolution: - { - integrity: sha512-ngYBh/+bEedqkSevPVhLP4QfVPCpb+4BBe2p7Xs32dBgs7rh9nY2AIYUL6BgLw1JVXV8GlpKmb/hNiuIxfPfZg==, - } - engines: { node: ">=14.21.3" } + '@biomejs/cli-darwin-x64@1.9.4': + resolution: {integrity: sha512-ngYBh/+bEedqkSevPVhLP4QfVPCpb+4BBe2p7Xs32dBgs7rh9nY2AIYUL6BgLw1JVXV8GlpKmb/hNiuIxfPfZg==} + engines: {node: '>=14.21.3'} cpu: [x64] os: [darwin] - "@biomejs/cli-linux-arm64-musl@1.9.4": - resolution: - { - integrity: sha512-v665Ct9WCRjGa8+kTr0CzApU0+XXtRgwmzIf1SeKSGAv+2scAlW6JR5PMFo6FzqqZ64Po79cKODKf3/AAmECqA==, - } - engines: { node: ">=14.21.3" } + '@biomejs/cli-linux-arm64-musl@1.9.4': + resolution: {integrity: sha512-v665Ct9WCRjGa8+kTr0CzApU0+XXtRgwmzIf1SeKSGAv+2scAlW6JR5PMFo6FzqqZ64Po79cKODKf3/AAmECqA==} + engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] - "@biomejs/cli-linux-arm64@1.9.4": - resolution: - { - integrity: sha512-fJIW0+LYujdjUgJJuwesP4EjIBl/N/TcOX3IvIHJQNsAqvV2CHIogsmA94BPG6jZATS4Hi+xv4SkBBQSt1N4/g==, - } - engines: { node: ">=14.21.3" } + '@biomejs/cli-linux-arm64@1.9.4': + resolution: {integrity: sha512-fJIW0+LYujdjUgJJuwesP4EjIBl/N/TcOX3IvIHJQNsAqvV2CHIogsmA94BPG6jZATS4Hi+xv4SkBBQSt1N4/g==} + engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] - "@biomejs/cli-linux-x64-musl@1.9.4": - resolution: - { - integrity: sha512-gEhi/jSBhZ2m6wjV530Yy8+fNqG8PAinM3oV7CyO+6c3CEh16Eizm21uHVsyVBEB6RIM8JHIl6AGYCv6Q6Q9Tg==, - } - engines: { node: ">=14.21.3" } + '@biomejs/cli-linux-x64-musl@1.9.4': + resolution: {integrity: sha512-gEhi/jSBhZ2m6wjV530Yy8+fNqG8PAinM3oV7CyO+6c3CEh16Eizm21uHVsyVBEB6RIM8JHIl6AGYCv6Q6Q9Tg==} + engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] - "@biomejs/cli-linux-x64@1.9.4": - resolution: - { - integrity: sha512-lRCJv/Vi3Vlwmbd6K+oQ0KhLHMAysN8lXoCI7XeHlxaajk06u7G+UsFSO01NAs5iYuWKmVZjmiOzJ0OJmGsMwg==, - } - engines: { node: ">=14.21.3" } + '@biomejs/cli-linux-x64@1.9.4': + resolution: {integrity: sha512-lRCJv/Vi3Vlwmbd6K+oQ0KhLHMAysN8lXoCI7XeHlxaajk06u7G+UsFSO01NAs5iYuWKmVZjmiOzJ0OJmGsMwg==} + engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] - "@biomejs/cli-win32-arm64@1.9.4": - resolution: - { - integrity: sha512-tlbhLk+WXZmgwoIKwHIHEBZUwxml7bRJgk0X2sPyNR3S93cdRq6XulAZRQJ17FYGGzWne0fgrXBKpl7l4M87Hg==, - } - engines: { node: ">=14.21.3" } + '@biomejs/cli-win32-arm64@1.9.4': + resolution: {integrity: sha512-tlbhLk+WXZmgwoIKwHIHEBZUwxml7bRJgk0X2sPyNR3S93cdRq6XulAZRQJ17FYGGzWne0fgrXBKpl7l4M87Hg==} + engines: {node: '>=14.21.3'} cpu: [arm64] os: [win32] - "@biomejs/cli-win32-x64@1.9.4": - resolution: - { - integrity: sha512-8Y5wMhVIPaWe6jw2H+KlEm4wP/f7EW3810ZLmDlrEEy5KvBsb9ECEfu/kMWD484ijfQ8+nIi0giMgu9g1UAuuA==, - } - engines: { node: ">=14.21.3" } + '@biomejs/cli-win32-x64@1.9.4': + resolution: {integrity: sha512-8Y5wMhVIPaWe6jw2H+KlEm4wP/f7EW3810ZLmDlrEEy5KvBsb9ECEfu/kMWD484ijfQ8+nIi0giMgu9g1UAuuA==} + engines: {node: '>=14.21.3'} cpu: [x64] os: [win32] - "@bundled-es-modules/cookie@2.0.1": - resolution: - { - integrity: sha512-8o+5fRPLNbjbdGRRmJj3h6Hh1AQJf2dk3qQ/5ZFb+PXkRNiSoMGGUKlsgLfrxneb72axVJyIYji64E2+nNfYyw==, - } - - "@bundled-es-modules/statuses@1.0.1": - resolution: - { - integrity: sha512-yn7BklA5acgcBr+7w064fGV+SGIFySjCKpqjcWgBAIfrAkY+4GQTJJHQMeT3V/sgz23VTEVV8TtOmkvJAhFVfg==, - } - - "@bundled-es-modules/tough-cookie@0.1.6": - resolution: - { - integrity: sha512-dvMHbL464C0zI+Yqxbz6kZ5TOEp7GLW+pry/RWndAR8MJQAXZ2rPmIs8tziTZjeIyhSNZgZbCePtfSbdWqStJw==, - } - - "@capsizecss/unpack@2.4.0": - resolution: - { - integrity: sha512-GrSU71meACqcmIUxPYOJvGKF0yryjN/L1aCuE9DViCTJI7bfkjgYDPD1zbNDcINJwSSP6UaBZY9GAbYDO7re0Q==, - } - - "@csstools/color-helpers@5.1.0": - resolution: - { - integrity: sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==, - } - engines: { node: ">=18" } - - "@csstools/css-calc@2.1.4": - resolution: - { - integrity: sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==, - } - engines: { node: ">=18" } + '@bundled-es-modules/cookie@2.0.1': + resolution: {integrity: sha512-8o+5fRPLNbjbdGRRmJj3h6Hh1AQJf2dk3qQ/5ZFb+PXkRNiSoMGGUKlsgLfrxneb72axVJyIYji64E2+nNfYyw==} + + '@bundled-es-modules/statuses@1.0.1': + resolution: {integrity: sha512-yn7BklA5acgcBr+7w064fGV+SGIFySjCKpqjcWgBAIfrAkY+4GQTJJHQMeT3V/sgz23VTEVV8TtOmkvJAhFVfg==} + + '@bundled-es-modules/tough-cookie@0.1.6': + resolution: {integrity: sha512-dvMHbL464C0zI+Yqxbz6kZ5TOEp7GLW+pry/RWndAR8MJQAXZ2rPmIs8tziTZjeIyhSNZgZbCePtfSbdWqStJw==} + + '@capsizecss/unpack@2.4.0': + resolution: {integrity: sha512-GrSU71meACqcmIUxPYOJvGKF0yryjN/L1aCuE9DViCTJI7bfkjgYDPD1zbNDcINJwSSP6UaBZY9GAbYDO7re0Q==} + + '@csstools/color-helpers@5.1.0': + resolution: {integrity: sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==} + engines: {node: '>=18'} + + '@csstools/css-calc@2.1.4': + resolution: {integrity: sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==} + engines: {node: '>=18'} peerDependencies: - "@csstools/css-parser-algorithms": ^3.0.5 - "@csstools/css-tokenizer": ^3.0.4 - - "@csstools/css-color-parser@3.1.0": - resolution: - { - integrity: sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==, - } - engines: { node: ">=18" } + '@csstools/css-parser-algorithms': ^3.0.5 + '@csstools/css-tokenizer': ^3.0.4 + + '@csstools/css-color-parser@3.1.0': + resolution: {integrity: sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==} + engines: {node: '>=18'} peerDependencies: - "@csstools/css-parser-algorithms": ^3.0.5 - "@csstools/css-tokenizer": ^3.0.4 - - "@csstools/css-parser-algorithms@3.0.5": - resolution: - { - integrity: sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==, - } - engines: { node: ">=18" } + '@csstools/css-parser-algorithms': ^3.0.5 + '@csstools/css-tokenizer': ^3.0.4 + + '@csstools/css-parser-algorithms@3.0.5': + resolution: {integrity: sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==} + engines: {node: '>=18'} peerDependencies: - "@csstools/css-tokenizer": ^3.0.4 - - "@csstools/css-syntax-patches-for-csstree@1.0.14": - resolution: - { - integrity: sha512-zSlIxa20WvMojjpCSy8WrNpcZ61RqfTfX3XTaOeVlGJrt/8HF3YbzgFZa01yTbT4GWQLwfTcC3EB8i3XnB647Q==, - } - engines: { node: ">=18" } + '@csstools/css-tokenizer': ^3.0.4 + + '@csstools/css-syntax-patches-for-csstree@1.0.14': + resolution: {integrity: sha512-zSlIxa20WvMojjpCSy8WrNpcZ61RqfTfX3XTaOeVlGJrt/8HF3YbzgFZa01yTbT4GWQLwfTcC3EB8i3XnB647Q==} + engines: {node: '>=18'} peerDependencies: postcss: ^8.4 - "@csstools/css-tokenizer@3.0.4": - resolution: - { - integrity: sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==, - } - engines: { node: ">=18" } - - "@ctrl/tinycolor@4.1.0": - resolution: - { - integrity: sha512-WyOx8cJQ+FQus4Mm4uPIZA64gbk3Wxh0so5Lcii0aJifqwoVOlfFtorjLE0Hen4OYyHZMXDWqMmaQemBhgxFRQ==, - } - engines: { node: ">=14" } - - "@emmetio/abbreviation@2.3.3": - resolution: - { - integrity: sha512-mgv58UrU3rh4YgbE/TzgLQwJ3pFsHHhCLqY20aJq+9comytTXUDNGG/SMtSeMJdkpxgXSXunBGLD8Boka3JyVA==, - } - - "@emmetio/css-abbreviation@2.1.8": - resolution: - { - integrity: sha512-s9yjhJ6saOO/uk1V74eifykk2CBYi01STTK3WlXWGOepyKa23ymJ053+DNQjpFcy1ingpaO7AxCcwLvHFY9tuw==, - } - - "@emmetio/css-parser@0.4.0": - resolution: - { - integrity: sha512-z7wkxRSZgrQHXVzObGkXG+Vmj3uRlpM11oCZ9pbaz0nFejvCDmAiNDpY75+wgXOcffKpj4rzGtwGaZxfJKsJxw==, - } - - "@emmetio/html-matcher@1.3.0": - resolution: - { - integrity: sha512-NTbsvppE5eVyBMuyGfVu2CRrLvo7J4YHb6t9sBFLyY03WYhXET37qA4zOYUjBWFCRHO7pS1B9khERtY0f5JXPQ==, - } - - "@emmetio/scanner@1.0.4": - resolution: - { - integrity: sha512-IqRuJtQff7YHHBk4G8YZ45uB9BaAGcwQeVzgj/zj8/UdOhtQpEIupUhSk8dys6spFIWVZVeK20CzGEnqR5SbqA==, - } - - "@emmetio/stream-reader-utils@0.1.0": - resolution: - { - integrity: sha512-ZsZ2I9Vzso3Ho/pjZFsmmZ++FWeEd/txqybHTm4OgaZzdS8V9V/YYWQwg5TC38Z7uLWUV1vavpLLbjJtKubR1A==, - } - - "@emmetio/stream-reader@2.2.0": - resolution: - { - integrity: sha512-fXVXEyFA5Yv3M3n8sUGT7+fvecGrZP4k6FnWWMSZVQf69kAq0LLpaBQLGcPR30m3zMmKYhECP4k/ZkzvhEW5kw==, - } - - "@emnapi/runtime@1.4.3": - resolution: - { - integrity: sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==, - } - - "@esbuild/aix-ppc64@0.24.2": - resolution: - { - integrity: sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==, - } - engines: { node: ">=18" } + '@csstools/css-tokenizer@3.0.4': + resolution: {integrity: sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==} + engines: {node: '>=18'} + + '@ctrl/tinycolor@4.1.0': + resolution: {integrity: sha512-WyOx8cJQ+FQus4Mm4uPIZA64gbk3Wxh0so5Lcii0aJifqwoVOlfFtorjLE0Hen4OYyHZMXDWqMmaQemBhgxFRQ==} + engines: {node: '>=14'} + + '@emmetio/abbreviation@2.3.3': + resolution: {integrity: sha512-mgv58UrU3rh4YgbE/TzgLQwJ3pFsHHhCLqY20aJq+9comytTXUDNGG/SMtSeMJdkpxgXSXunBGLD8Boka3JyVA==} + + '@emmetio/css-abbreviation@2.1.8': + resolution: {integrity: sha512-s9yjhJ6saOO/uk1V74eifykk2CBYi01STTK3WlXWGOepyKa23ymJ053+DNQjpFcy1ingpaO7AxCcwLvHFY9tuw==} + + '@emmetio/css-parser@0.4.0': + resolution: {integrity: sha512-z7wkxRSZgrQHXVzObGkXG+Vmj3uRlpM11oCZ9pbaz0nFejvCDmAiNDpY75+wgXOcffKpj4rzGtwGaZxfJKsJxw==} + + '@emmetio/html-matcher@1.3.0': + resolution: {integrity: sha512-NTbsvppE5eVyBMuyGfVu2CRrLvo7J4YHb6t9sBFLyY03WYhXET37qA4zOYUjBWFCRHO7pS1B9khERtY0f5JXPQ==} + + '@emmetio/scanner@1.0.4': + resolution: {integrity: sha512-IqRuJtQff7YHHBk4G8YZ45uB9BaAGcwQeVzgj/zj8/UdOhtQpEIupUhSk8dys6spFIWVZVeK20CzGEnqR5SbqA==} + + '@emmetio/stream-reader-utils@0.1.0': + resolution: {integrity: sha512-ZsZ2I9Vzso3Ho/pjZFsmmZ++FWeEd/txqybHTm4OgaZzdS8V9V/YYWQwg5TC38Z7uLWUV1vavpLLbjJtKubR1A==} + + '@emmetio/stream-reader@2.2.0': + resolution: {integrity: sha512-fXVXEyFA5Yv3M3n8sUGT7+fvecGrZP4k6FnWWMSZVQf69kAq0LLpaBQLGcPR30m3zMmKYhECP4k/ZkzvhEW5kw==} + + '@emnapi/runtime@1.4.3': + resolution: {integrity: sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==} + + '@esbuild/aix-ppc64@0.24.2': + resolution: {integrity: sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==} + engines: {node: '>=18'} cpu: [ppc64] os: [aix] - "@esbuild/aix-ppc64@0.25.10": - resolution: - { - integrity: sha512-0NFWnA+7l41irNuaSVlLfgNT12caWJVLzp5eAVhZ0z1qpxbockccEt3s+149rE64VUI3Ml2zt8Nv5JVc4QXTsw==, - } - engines: { node: ">=18" } + '@esbuild/aix-ppc64@0.25.10': + resolution: {integrity: sha512-0NFWnA+7l41irNuaSVlLfgNT12caWJVLzp5eAVhZ0z1qpxbockccEt3s+149rE64VUI3Ml2zt8Nv5JVc4QXTsw==} + engines: {node: '>=18'} cpu: [ppc64] os: [aix] - "@esbuild/aix-ppc64@0.25.5": - resolution: - { - integrity: sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==, - } - engines: { node: ">=18" } + '@esbuild/aix-ppc64@0.25.5': + resolution: {integrity: sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==} + engines: {node: '>=18'} cpu: [ppc64] os: [aix] - "@esbuild/aix-ppc64@0.25.6": - resolution: - { - integrity: sha512-ShbM/3XxwuxjFiuVBHA+d3j5dyac0aEVVq1oluIDf71hUw0aRF59dV/efUsIwFnR6m8JNM2FjZOzmaZ8yG61kw==, - } - engines: { node: ">=18" } + '@esbuild/aix-ppc64@0.25.6': + resolution: {integrity: sha512-ShbM/3XxwuxjFiuVBHA+d3j5dyac0aEVVq1oluIDf71hUw0aRF59dV/efUsIwFnR6m8JNM2FjZOzmaZ8yG61kw==} + engines: {node: '>=18'} cpu: [ppc64] os: [aix] - "@esbuild/aix-ppc64@0.25.9": - resolution: - { - integrity: sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==, - } - engines: { node: ">=18" } + '@esbuild/aix-ppc64@0.25.9': + resolution: {integrity: sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==} + engines: {node: '>=18'} cpu: [ppc64] os: [aix] - "@esbuild/android-arm64@0.24.2": - resolution: - { - integrity: sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==, - } - engines: { node: ">=18" } + '@esbuild/android-arm64@0.24.2': + resolution: {integrity: sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==} + engines: {node: '>=18'} cpu: [arm64] os: [android] - "@esbuild/android-arm64@0.25.10": - resolution: - { - integrity: sha512-LSQa7eDahypv/VO6WKohZGPSJDq5OVOo3UoFR1E4t4Gj1W7zEQMUhI+lo81H+DtB+kP+tDgBp+M4oNCwp6kffg==, - } - engines: { node: ">=18" } + '@esbuild/android-arm64@0.25.10': + resolution: {integrity: sha512-LSQa7eDahypv/VO6WKohZGPSJDq5OVOo3UoFR1E4t4Gj1W7zEQMUhI+lo81H+DtB+kP+tDgBp+M4oNCwp6kffg==} + engines: {node: '>=18'} cpu: [arm64] os: [android] - "@esbuild/android-arm64@0.25.5": - resolution: - { - integrity: sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==, - } - engines: { node: ">=18" } + '@esbuild/android-arm64@0.25.5': + resolution: {integrity: sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==} + engines: {node: '>=18'} cpu: [arm64] os: [android] - "@esbuild/android-arm64@0.25.6": - resolution: - { - integrity: sha512-hd5zdUarsK6strW+3Wxi5qWws+rJhCCbMiC9QZyzoxfk5uHRIE8T287giQxzVpEvCwuJ9Qjg6bEjcRJcgfLqoA==, - } - engines: { node: ">=18" } + '@esbuild/android-arm64@0.25.6': + resolution: {integrity: sha512-hd5zdUarsK6strW+3Wxi5qWws+rJhCCbMiC9QZyzoxfk5uHRIE8T287giQxzVpEvCwuJ9Qjg6bEjcRJcgfLqoA==} + engines: {node: '>=18'} cpu: [arm64] os: [android] - "@esbuild/android-arm64@0.25.9": - resolution: - { - integrity: sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==, - } - engines: { node: ">=18" } + '@esbuild/android-arm64@0.25.9': + resolution: {integrity: sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==} + engines: {node: '>=18'} cpu: [arm64] os: [android] - "@esbuild/android-arm@0.24.2": - resolution: - { - integrity: sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==, - } - engines: { node: ">=18" } + '@esbuild/android-arm@0.24.2': + resolution: {integrity: sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==} + engines: {node: '>=18'} cpu: [arm] os: [android] - "@esbuild/android-arm@0.25.10": - resolution: - { - integrity: sha512-dQAxF1dW1C3zpeCDc5KqIYuZ1tgAdRXNoZP7vkBIRtKZPYe2xVr/d3SkirklCHudW1B45tGiUlz2pUWDfbDD4w==, - } - engines: { node: ">=18" } + '@esbuild/android-arm@0.25.10': + resolution: {integrity: sha512-dQAxF1dW1C3zpeCDc5KqIYuZ1tgAdRXNoZP7vkBIRtKZPYe2xVr/d3SkirklCHudW1B45tGiUlz2pUWDfbDD4w==} + engines: {node: '>=18'} cpu: [arm] os: [android] - "@esbuild/android-arm@0.25.5": - resolution: - { - integrity: sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==, - } - engines: { node: ">=18" } + '@esbuild/android-arm@0.25.5': + resolution: {integrity: sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==} + engines: {node: '>=18'} cpu: [arm] os: [android] - "@esbuild/android-arm@0.25.6": - resolution: - { - integrity: sha512-S8ToEOVfg++AU/bHwdksHNnyLyVM+eMVAOf6yRKFitnwnbwwPNqKr3srzFRe7nzV69RQKb5DgchIX5pt3L53xg==, - } - engines: { node: ">=18" } + '@esbuild/android-arm@0.25.6': + resolution: {integrity: sha512-S8ToEOVfg++AU/bHwdksHNnyLyVM+eMVAOf6yRKFitnwnbwwPNqKr3srzFRe7nzV69RQKb5DgchIX5pt3L53xg==} + engines: {node: '>=18'} cpu: [arm] os: [android] - "@esbuild/android-arm@0.25.9": - resolution: - { - integrity: sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==, - } - engines: { node: ">=18" } + '@esbuild/android-arm@0.25.9': + resolution: {integrity: sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==} + engines: {node: '>=18'} cpu: [arm] os: [android] - "@esbuild/android-x64@0.24.2": - resolution: - { - integrity: sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==, - } - engines: { node: ">=18" } + '@esbuild/android-x64@0.24.2': + resolution: {integrity: sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==} + engines: {node: '>=18'} cpu: [x64] os: [android] - "@esbuild/android-x64@0.25.10": - resolution: - { - integrity: sha512-MiC9CWdPrfhibcXwr39p9ha1x0lZJ9KaVfvzA0Wxwz9ETX4v5CHfF09bx935nHlhi+MxhA63dKRRQLiVgSUtEg==, - } - engines: { node: ">=18" } + '@esbuild/android-x64@0.25.10': + resolution: {integrity: sha512-MiC9CWdPrfhibcXwr39p9ha1x0lZJ9KaVfvzA0Wxwz9ETX4v5CHfF09bx935nHlhi+MxhA63dKRRQLiVgSUtEg==} + engines: {node: '>=18'} cpu: [x64] os: [android] - "@esbuild/android-x64@0.25.5": - resolution: - { - integrity: sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==, - } - engines: { node: ">=18" } + '@esbuild/android-x64@0.25.5': + resolution: {integrity: sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==} + engines: {node: '>=18'} cpu: [x64] os: [android] - "@esbuild/android-x64@0.25.6": - resolution: - { - integrity: sha512-0Z7KpHSr3VBIO9A/1wcT3NTy7EB4oNC4upJ5ye3R7taCc2GUdeynSLArnon5G8scPwaU866d3H4BCrE5xLW25A==, - } - engines: { node: ">=18" } + '@esbuild/android-x64@0.25.6': + resolution: {integrity: sha512-0Z7KpHSr3VBIO9A/1wcT3NTy7EB4oNC4upJ5ye3R7taCc2GUdeynSLArnon5G8scPwaU866d3H4BCrE5xLW25A==} + engines: {node: '>=18'} cpu: [x64] os: [android] - "@esbuild/android-x64@0.25.9": - resolution: - { - integrity: sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==, - } - engines: { node: ">=18" } + '@esbuild/android-x64@0.25.9': + resolution: {integrity: sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==} + engines: {node: '>=18'} cpu: [x64] os: [android] - "@esbuild/darwin-arm64@0.24.2": - resolution: - { - integrity: sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==, - } - engines: { node: ">=18" } + '@esbuild/darwin-arm64@0.24.2': + resolution: {integrity: sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==} + engines: {node: '>=18'} cpu: [arm64] os: [darwin] - "@esbuild/darwin-arm64@0.25.10": - resolution: - { - integrity: sha512-JC74bdXcQEpW9KkV326WpZZjLguSZ3DfS8wrrvPMHgQOIEIG/sPXEN/V8IssoJhbefLRcRqw6RQH2NnpdprtMA==, - } - engines: { node: ">=18" } + '@esbuild/darwin-arm64@0.25.10': + resolution: {integrity: sha512-JC74bdXcQEpW9KkV326WpZZjLguSZ3DfS8wrrvPMHgQOIEIG/sPXEN/V8IssoJhbefLRcRqw6RQH2NnpdprtMA==} + engines: {node: '>=18'} cpu: [arm64] os: [darwin] - "@esbuild/darwin-arm64@0.25.5": - resolution: - { - integrity: sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==, - } - engines: { node: ">=18" } + '@esbuild/darwin-arm64@0.25.5': + resolution: {integrity: sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==} + engines: {node: '>=18'} cpu: [arm64] os: [darwin] - "@esbuild/darwin-arm64@0.25.6": - resolution: - { - integrity: sha512-FFCssz3XBavjxcFxKsGy2DYK5VSvJqa6y5HXljKzhRZ87LvEi13brPrf/wdyl/BbpbMKJNOr1Sd0jtW4Ge1pAA==, - } - engines: { node: ">=18" } + '@esbuild/darwin-arm64@0.25.6': + resolution: {integrity: sha512-FFCssz3XBavjxcFxKsGy2DYK5VSvJqa6y5HXljKzhRZ87LvEi13brPrf/wdyl/BbpbMKJNOr1Sd0jtW4Ge1pAA==} + engines: {node: '>=18'} cpu: [arm64] os: [darwin] - "@esbuild/darwin-arm64@0.25.9": - resolution: - { - integrity: sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==, - } - engines: { node: ">=18" } + '@esbuild/darwin-arm64@0.25.9': + resolution: {integrity: sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==} + engines: {node: '>=18'} cpu: [arm64] os: [darwin] - "@esbuild/darwin-x64@0.24.2": - resolution: - { - integrity: sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==, - } - engines: { node: ">=18" } + '@esbuild/darwin-x64@0.24.2': + resolution: {integrity: sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==} + engines: {node: '>=18'} cpu: [x64] os: [darwin] - "@esbuild/darwin-x64@0.25.10": - resolution: - { - integrity: sha512-tguWg1olF6DGqzws97pKZ8G2L7Ig1vjDmGTwcTuYHbuU6TTjJe5FXbgs5C1BBzHbJ2bo1m3WkQDbWO2PvamRcg==, - } - engines: { node: ">=18" } + '@esbuild/darwin-x64@0.25.10': + resolution: {integrity: sha512-tguWg1olF6DGqzws97pKZ8G2L7Ig1vjDmGTwcTuYHbuU6TTjJe5FXbgs5C1BBzHbJ2bo1m3WkQDbWO2PvamRcg==} + engines: {node: '>=18'} cpu: [x64] os: [darwin] - "@esbuild/darwin-x64@0.25.5": - resolution: - { - integrity: sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==, - } - engines: { node: ">=18" } + '@esbuild/darwin-x64@0.25.5': + resolution: {integrity: sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==} + engines: {node: '>=18'} cpu: [x64] os: [darwin] - "@esbuild/darwin-x64@0.25.6": - resolution: - { - integrity: sha512-GfXs5kry/TkGM2vKqK2oyiLFygJRqKVhawu3+DOCk7OxLy/6jYkWXhlHwOoTb0WqGnWGAS7sooxbZowy+pK9Yg==, - } - engines: { node: ">=18" } + '@esbuild/darwin-x64@0.25.6': + resolution: {integrity: sha512-GfXs5kry/TkGM2vKqK2oyiLFygJRqKVhawu3+DOCk7OxLy/6jYkWXhlHwOoTb0WqGnWGAS7sooxbZowy+pK9Yg==} + engines: {node: '>=18'} cpu: [x64] os: [darwin] - "@esbuild/darwin-x64@0.25.9": - resolution: - { - integrity: sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==, - } - engines: { node: ">=18" } + '@esbuild/darwin-x64@0.25.9': + resolution: {integrity: sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==} + engines: {node: '>=18'} cpu: [x64] os: [darwin] - "@esbuild/freebsd-arm64@0.24.2": - resolution: - { - integrity: sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==, - } - engines: { node: ">=18" } + '@esbuild/freebsd-arm64@0.24.2': + resolution: {integrity: sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==} + engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - "@esbuild/freebsd-arm64@0.25.10": - resolution: - { - integrity: sha512-3ZioSQSg1HT2N05YxeJWYR+Libe3bREVSdWhEEgExWaDtyFbbXWb49QgPvFH8u03vUPX10JhJPcz7s9t9+boWg==, - } - engines: { node: ">=18" } + '@esbuild/freebsd-arm64@0.25.10': + resolution: {integrity: sha512-3ZioSQSg1HT2N05YxeJWYR+Libe3bREVSdWhEEgExWaDtyFbbXWb49QgPvFH8u03vUPX10JhJPcz7s9t9+boWg==} + engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - "@esbuild/freebsd-arm64@0.25.5": - resolution: - { - integrity: sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==, - } - engines: { node: ">=18" } + '@esbuild/freebsd-arm64@0.25.5': + resolution: {integrity: sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==} + engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - "@esbuild/freebsd-arm64@0.25.6": - resolution: - { - integrity: sha512-aoLF2c3OvDn2XDTRvn8hN6DRzVVpDlj2B/F66clWd/FHLiHaG3aVZjxQX2DYphA5y/evbdGvC6Us13tvyt4pWg==, - } - engines: { node: ">=18" } + '@esbuild/freebsd-arm64@0.25.6': + resolution: {integrity: sha512-aoLF2c3OvDn2XDTRvn8hN6DRzVVpDlj2B/F66clWd/FHLiHaG3aVZjxQX2DYphA5y/evbdGvC6Us13tvyt4pWg==} + engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - "@esbuild/freebsd-arm64@0.25.9": - resolution: - { - integrity: sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==, - } - engines: { node: ">=18" } + '@esbuild/freebsd-arm64@0.25.9': + resolution: {integrity: sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==} + engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - "@esbuild/freebsd-x64@0.24.2": - resolution: - { - integrity: sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==, - } - engines: { node: ">=18" } + '@esbuild/freebsd-x64@0.24.2': + resolution: {integrity: sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==} + engines: {node: '>=18'} cpu: [x64] os: [freebsd] - "@esbuild/freebsd-x64@0.25.10": - resolution: - { - integrity: sha512-LLgJfHJk014Aa4anGDbh8bmI5Lk+QidDmGzuC2D+vP7mv/GeSN+H39zOf7pN5N8p059FcOfs2bVlrRr4SK9WxA==, - } - engines: { node: ">=18" } + '@esbuild/freebsd-x64@0.25.10': + resolution: {integrity: sha512-LLgJfHJk014Aa4anGDbh8bmI5Lk+QidDmGzuC2D+vP7mv/GeSN+H39zOf7pN5N8p059FcOfs2bVlrRr4SK9WxA==} + engines: {node: '>=18'} cpu: [x64] os: [freebsd] - "@esbuild/freebsd-x64@0.25.5": - resolution: - { - integrity: sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==, - } - engines: { node: ">=18" } + '@esbuild/freebsd-x64@0.25.5': + resolution: {integrity: sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==} + engines: {node: '>=18'} cpu: [x64] os: [freebsd] - "@esbuild/freebsd-x64@0.25.6": - resolution: - { - integrity: sha512-2SkqTjTSo2dYi/jzFbU9Plt1vk0+nNg8YC8rOXXea+iA3hfNJWebKYPs3xnOUf9+ZWhKAaxnQNUf2X9LOpeiMQ==, - } - engines: { node: ">=18" } + '@esbuild/freebsd-x64@0.25.6': + resolution: {integrity: sha512-2SkqTjTSo2dYi/jzFbU9Plt1vk0+nNg8YC8rOXXea+iA3hfNJWebKYPs3xnOUf9+ZWhKAaxnQNUf2X9LOpeiMQ==} + engines: {node: '>=18'} cpu: [x64] os: [freebsd] - "@esbuild/freebsd-x64@0.25.9": - resolution: - { - integrity: sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==, - } - engines: { node: ">=18" } + '@esbuild/freebsd-x64@0.25.9': + resolution: {integrity: sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==} + engines: {node: '>=18'} cpu: [x64] os: [freebsd] - "@esbuild/linux-arm64@0.24.2": - resolution: - { - integrity: sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==, - } - engines: { node: ">=18" } + '@esbuild/linux-arm64@0.24.2': + resolution: {integrity: sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==} + engines: {node: '>=18'} cpu: [arm64] os: [linux] - "@esbuild/linux-arm64@0.25.10": - resolution: - { - integrity: sha512-5luJWN6YKBsawd5f9i4+c+geYiVEw20FVW5x0v1kEMWNq8UctFjDiMATBxLvmmHA4bf7F6hTRaJgtghFr9iziQ==, - } - engines: { node: ">=18" } + '@esbuild/linux-arm64@0.25.10': + resolution: {integrity: sha512-5luJWN6YKBsawd5f9i4+c+geYiVEw20FVW5x0v1kEMWNq8UctFjDiMATBxLvmmHA4bf7F6hTRaJgtghFr9iziQ==} + engines: {node: '>=18'} cpu: [arm64] os: [linux] - "@esbuild/linux-arm64@0.25.5": - resolution: - { - integrity: sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==, - } - engines: { node: ">=18" } + '@esbuild/linux-arm64@0.25.5': + resolution: {integrity: sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==} + engines: {node: '>=18'} cpu: [arm64] os: [linux] - "@esbuild/linux-arm64@0.25.6": - resolution: - { - integrity: sha512-b967hU0gqKd9Drsh/UuAm21Khpoh6mPBSgz8mKRq4P5mVK8bpA+hQzmm/ZwGVULSNBzKdZPQBRT3+WuVavcWsQ==, - } - engines: { node: ">=18" } + '@esbuild/linux-arm64@0.25.6': + resolution: {integrity: sha512-b967hU0gqKd9Drsh/UuAm21Khpoh6mPBSgz8mKRq4P5mVK8bpA+hQzmm/ZwGVULSNBzKdZPQBRT3+WuVavcWsQ==} + engines: {node: '>=18'} cpu: [arm64] os: [linux] - "@esbuild/linux-arm64@0.25.9": - resolution: - { - integrity: sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==, - } - engines: { node: ">=18" } + '@esbuild/linux-arm64@0.25.9': + resolution: {integrity: sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==} + engines: {node: '>=18'} cpu: [arm64] os: [linux] - "@esbuild/linux-arm@0.24.2": - resolution: - { - integrity: sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==, - } - engines: { node: ">=18" } + '@esbuild/linux-arm@0.24.2': + resolution: {integrity: sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==} + engines: {node: '>=18'} cpu: [arm] os: [linux] - "@esbuild/linux-arm@0.25.10": - resolution: - { - integrity: sha512-oR31GtBTFYCqEBALI9r6WxoU/ZofZl962pouZRTEYECvNF/dtXKku8YXcJkhgK/beU+zedXfIzHijSRapJY3vg==, - } - engines: { node: ">=18" } + '@esbuild/linux-arm@0.25.10': + resolution: {integrity: sha512-oR31GtBTFYCqEBALI9r6WxoU/ZofZl962pouZRTEYECvNF/dtXKku8YXcJkhgK/beU+zedXfIzHijSRapJY3vg==} + engines: {node: '>=18'} cpu: [arm] os: [linux] - "@esbuild/linux-arm@0.25.5": - resolution: - { - integrity: sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==, - } - engines: { node: ">=18" } + '@esbuild/linux-arm@0.25.5': + resolution: {integrity: sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==} + engines: {node: '>=18'} cpu: [arm] os: [linux] - "@esbuild/linux-arm@0.25.6": - resolution: - { - integrity: sha512-SZHQlzvqv4Du5PrKE2faN0qlbsaW/3QQfUUc6yO2EjFcA83xnwm91UbEEVx4ApZ9Z5oG8Bxz4qPE+HFwtVcfyw==, - } - engines: { node: ">=18" } + '@esbuild/linux-arm@0.25.6': + resolution: {integrity: sha512-SZHQlzvqv4Du5PrKE2faN0qlbsaW/3QQfUUc6yO2EjFcA83xnwm91UbEEVx4ApZ9Z5oG8Bxz4qPE+HFwtVcfyw==} + engines: {node: '>=18'} cpu: [arm] os: [linux] - "@esbuild/linux-arm@0.25.9": - resolution: - { - integrity: sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==, - } - engines: { node: ">=18" } + '@esbuild/linux-arm@0.25.9': + resolution: {integrity: sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==} + engines: {node: '>=18'} cpu: [arm] os: [linux] - "@esbuild/linux-ia32@0.24.2": - resolution: - { - integrity: sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==, - } - engines: { node: ">=18" } + '@esbuild/linux-ia32@0.24.2': + resolution: {integrity: sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==} + engines: {node: '>=18'} cpu: [ia32] os: [linux] - "@esbuild/linux-ia32@0.25.10": - resolution: - { - integrity: sha512-NrSCx2Kim3EnnWgS4Txn0QGt0Xipoumb6z6sUtl5bOEZIVKhzfyp/Lyw4C1DIYvzeW/5mWYPBFJU3a/8Yr75DQ==, - } - engines: { node: ">=18" } + '@esbuild/linux-ia32@0.25.10': + resolution: {integrity: sha512-NrSCx2Kim3EnnWgS4Txn0QGt0Xipoumb6z6sUtl5bOEZIVKhzfyp/Lyw4C1DIYvzeW/5mWYPBFJU3a/8Yr75DQ==} + engines: {node: '>=18'} cpu: [ia32] os: [linux] - "@esbuild/linux-ia32@0.25.5": - resolution: - { - integrity: sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==, - } - engines: { node: ">=18" } + '@esbuild/linux-ia32@0.25.5': + resolution: {integrity: sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==} + engines: {node: '>=18'} cpu: [ia32] os: [linux] - "@esbuild/linux-ia32@0.25.6": - resolution: - { - integrity: sha512-aHWdQ2AAltRkLPOsKdi3xv0mZ8fUGPdlKEjIEhxCPm5yKEThcUjHpWB1idN74lfXGnZ5SULQSgtr5Qos5B0bPw==, - } - engines: { node: ">=18" } + '@esbuild/linux-ia32@0.25.6': + resolution: {integrity: sha512-aHWdQ2AAltRkLPOsKdi3xv0mZ8fUGPdlKEjIEhxCPm5yKEThcUjHpWB1idN74lfXGnZ5SULQSgtr5Qos5B0bPw==} + engines: {node: '>=18'} cpu: [ia32] os: [linux] - "@esbuild/linux-ia32@0.25.9": - resolution: - { - integrity: sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==, - } - engines: { node: ">=18" } + '@esbuild/linux-ia32@0.25.9': + resolution: {integrity: sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==} + engines: {node: '>=18'} cpu: [ia32] os: [linux] - "@esbuild/linux-loong64@0.24.2": - resolution: - { - integrity: sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==, - } - engines: { node: ">=18" } + '@esbuild/linux-loong64@0.24.2': + resolution: {integrity: sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==} + engines: {node: '>=18'} cpu: [loong64] os: [linux] - "@esbuild/linux-loong64@0.25.10": - resolution: - { - integrity: sha512-xoSphrd4AZda8+rUDDfD9J6FUMjrkTz8itpTITM4/xgerAZZcFW7Dv+sun7333IfKxGG8gAq+3NbfEMJfiY+Eg==, - } - engines: { node: ">=18" } + '@esbuild/linux-loong64@0.25.10': + resolution: {integrity: sha512-xoSphrd4AZda8+rUDDfD9J6FUMjrkTz8itpTITM4/xgerAZZcFW7Dv+sun7333IfKxGG8gAq+3NbfEMJfiY+Eg==} + engines: {node: '>=18'} cpu: [loong64] os: [linux] - "@esbuild/linux-loong64@0.25.5": - resolution: - { - integrity: sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==, - } - engines: { node: ">=18" } + '@esbuild/linux-loong64@0.25.5': + resolution: {integrity: sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==} + engines: {node: '>=18'} cpu: [loong64] os: [linux] - "@esbuild/linux-loong64@0.25.6": - resolution: - { - integrity: sha512-VgKCsHdXRSQ7E1+QXGdRPlQ/e08bN6WMQb27/TMfV+vPjjTImuT9PmLXupRlC90S1JeNNW5lzkAEO/McKeJ2yg==, - } - engines: { node: ">=18" } + '@esbuild/linux-loong64@0.25.6': + resolution: {integrity: sha512-VgKCsHdXRSQ7E1+QXGdRPlQ/e08bN6WMQb27/TMfV+vPjjTImuT9PmLXupRlC90S1JeNNW5lzkAEO/McKeJ2yg==} + engines: {node: '>=18'} cpu: [loong64] os: [linux] - "@esbuild/linux-loong64@0.25.9": - resolution: - { - integrity: sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==, - } - engines: { node: ">=18" } + '@esbuild/linux-loong64@0.25.9': + resolution: {integrity: sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==} + engines: {node: '>=18'} cpu: [loong64] os: [linux] - "@esbuild/linux-mips64el@0.24.2": - resolution: - { - integrity: sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==, - } - engines: { node: ">=18" } + '@esbuild/linux-mips64el@0.24.2': + resolution: {integrity: sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==} + engines: {node: '>=18'} cpu: [mips64el] os: [linux] - "@esbuild/linux-mips64el@0.25.10": - resolution: - { - integrity: sha512-ab6eiuCwoMmYDyTnyptoKkVS3k8fy/1Uvq7Dj5czXI6DF2GqD2ToInBI0SHOp5/X1BdZ26RKc5+qjQNGRBelRA==, - } - engines: { node: ">=18" } + '@esbuild/linux-mips64el@0.25.10': + resolution: {integrity: sha512-ab6eiuCwoMmYDyTnyptoKkVS3k8fy/1Uvq7Dj5czXI6DF2GqD2ToInBI0SHOp5/X1BdZ26RKc5+qjQNGRBelRA==} + engines: {node: '>=18'} cpu: [mips64el] os: [linux] - "@esbuild/linux-mips64el@0.25.5": - resolution: - { - integrity: sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==, - } - engines: { node: ">=18" } + '@esbuild/linux-mips64el@0.25.5': + resolution: {integrity: sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==} + engines: {node: '>=18'} cpu: [mips64el] os: [linux] - "@esbuild/linux-mips64el@0.25.6": - resolution: - { - integrity: sha512-WViNlpivRKT9/py3kCmkHnn44GkGXVdXfdc4drNmRl15zVQ2+D2uFwdlGh6IuK5AAnGTo2qPB1Djppj+t78rzw==, - } - engines: { node: ">=18" } + '@esbuild/linux-mips64el@0.25.6': + resolution: {integrity: sha512-WViNlpivRKT9/py3kCmkHnn44GkGXVdXfdc4drNmRl15zVQ2+D2uFwdlGh6IuK5AAnGTo2qPB1Djppj+t78rzw==} + engines: {node: '>=18'} cpu: [mips64el] os: [linux] - "@esbuild/linux-mips64el@0.25.9": - resolution: - { - integrity: sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==, - } - engines: { node: ">=18" } + '@esbuild/linux-mips64el@0.25.9': + resolution: {integrity: sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==} + engines: {node: '>=18'} cpu: [mips64el] os: [linux] - "@esbuild/linux-ppc64@0.24.2": - resolution: - { - integrity: sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==, - } - engines: { node: ">=18" } + '@esbuild/linux-ppc64@0.24.2': + resolution: {integrity: sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==} + engines: {node: '>=18'} cpu: [ppc64] os: [linux] - "@esbuild/linux-ppc64@0.25.10": - resolution: - { - integrity: sha512-NLinzzOgZQsGpsTkEbdJTCanwA5/wozN9dSgEl12haXJBzMTpssebuXR42bthOF3z7zXFWH1AmvWunUCkBE4EA==, - } - engines: { node: ">=18" } + '@esbuild/linux-ppc64@0.25.10': + resolution: {integrity: sha512-NLinzzOgZQsGpsTkEbdJTCanwA5/wozN9dSgEl12haXJBzMTpssebuXR42bthOF3z7zXFWH1AmvWunUCkBE4EA==} + engines: {node: '>=18'} cpu: [ppc64] os: [linux] - "@esbuild/linux-ppc64@0.25.5": - resolution: - { - integrity: sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==, - } - engines: { node: ">=18" } + '@esbuild/linux-ppc64@0.25.5': + resolution: {integrity: sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==} + engines: {node: '>=18'} cpu: [ppc64] os: [linux] - "@esbuild/linux-ppc64@0.25.6": - resolution: - { - integrity: sha512-wyYKZ9NTdmAMb5730I38lBqVu6cKl4ZfYXIs31Baf8aoOtB4xSGi3THmDYt4BTFHk7/EcVixkOV2uZfwU3Q2Jw==, - } - engines: { node: ">=18" } + '@esbuild/linux-ppc64@0.25.6': + resolution: {integrity: sha512-wyYKZ9NTdmAMb5730I38lBqVu6cKl4ZfYXIs31Baf8aoOtB4xSGi3THmDYt4BTFHk7/EcVixkOV2uZfwU3Q2Jw==} + engines: {node: '>=18'} cpu: [ppc64] os: [linux] - "@esbuild/linux-ppc64@0.25.9": - resolution: - { - integrity: sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==, - } - engines: { node: ">=18" } + '@esbuild/linux-ppc64@0.25.9': + resolution: {integrity: sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==} + engines: {node: '>=18'} cpu: [ppc64] os: [linux] - "@esbuild/linux-riscv64@0.24.2": - resolution: - { - integrity: sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==, - } - engines: { node: ">=18" } + '@esbuild/linux-riscv64@0.24.2': + resolution: {integrity: sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==} + engines: {node: '>=18'} cpu: [riscv64] os: [linux] - "@esbuild/linux-riscv64@0.25.10": - resolution: - { - integrity: sha512-FE557XdZDrtX8NMIeA8LBJX3dC2M8VGXwfrQWU7LB5SLOajfJIxmSdyL/gU1m64Zs9CBKvm4UAuBp5aJ8OgnrA==, - } - engines: { node: ">=18" } + '@esbuild/linux-riscv64@0.25.10': + resolution: {integrity: sha512-FE557XdZDrtX8NMIeA8LBJX3dC2M8VGXwfrQWU7LB5SLOajfJIxmSdyL/gU1m64Zs9CBKvm4UAuBp5aJ8OgnrA==} + engines: {node: '>=18'} cpu: [riscv64] os: [linux] - "@esbuild/linux-riscv64@0.25.5": - resolution: - { - integrity: sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==, - } - engines: { node: ">=18" } + '@esbuild/linux-riscv64@0.25.5': + resolution: {integrity: sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==} + engines: {node: '>=18'} cpu: [riscv64] os: [linux] - "@esbuild/linux-riscv64@0.25.6": - resolution: - { - integrity: sha512-KZh7bAGGcrinEj4qzilJ4hqTY3Dg2U82c8bv+e1xqNqZCrCyc+TL9AUEn5WGKDzm3CfC5RODE/qc96OcbIe33w==, - } - engines: { node: ">=18" } + '@esbuild/linux-riscv64@0.25.6': + resolution: {integrity: sha512-KZh7bAGGcrinEj4qzilJ4hqTY3Dg2U82c8bv+e1xqNqZCrCyc+TL9AUEn5WGKDzm3CfC5RODE/qc96OcbIe33w==} + engines: {node: '>=18'} cpu: [riscv64] os: [linux] - "@esbuild/linux-riscv64@0.25.9": - resolution: - { - integrity: sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==, - } - engines: { node: ">=18" } + '@esbuild/linux-riscv64@0.25.9': + resolution: {integrity: sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==} + engines: {node: '>=18'} cpu: [riscv64] os: [linux] - "@esbuild/linux-s390x@0.24.2": - resolution: - { - integrity: sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==, - } - engines: { node: ">=18" } + '@esbuild/linux-s390x@0.24.2': + resolution: {integrity: sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==} + engines: {node: '>=18'} cpu: [s390x] os: [linux] - "@esbuild/linux-s390x@0.25.10": - resolution: - { - integrity: sha512-3BBSbgzuB9ajLoVZk0mGu+EHlBwkusRmeNYdqmznmMc9zGASFjSsxgkNsqmXugpPk00gJ0JNKh/97nxmjctdew==, - } - engines: { node: ">=18" } + '@esbuild/linux-s390x@0.25.10': + resolution: {integrity: sha512-3BBSbgzuB9ajLoVZk0mGu+EHlBwkusRmeNYdqmznmMc9zGASFjSsxgkNsqmXugpPk00gJ0JNKh/97nxmjctdew==} + engines: {node: '>=18'} cpu: [s390x] os: [linux] - "@esbuild/linux-s390x@0.25.5": - resolution: - { - integrity: sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==, - } - engines: { node: ">=18" } + '@esbuild/linux-s390x@0.25.5': + resolution: {integrity: sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==} + engines: {node: '>=18'} cpu: [s390x] os: [linux] - "@esbuild/linux-s390x@0.25.6": - resolution: - { - integrity: sha512-9N1LsTwAuE9oj6lHMyyAM+ucxGiVnEqUdp4v7IaMmrwb06ZTEVCIs3oPPplVsnjPfyjmxwHxHMF8b6vzUVAUGw==, - } - engines: { node: ">=18" } + '@esbuild/linux-s390x@0.25.6': + resolution: {integrity: sha512-9N1LsTwAuE9oj6lHMyyAM+ucxGiVnEqUdp4v7IaMmrwb06ZTEVCIs3oPPplVsnjPfyjmxwHxHMF8b6vzUVAUGw==} + engines: {node: '>=18'} cpu: [s390x] os: [linux] - "@esbuild/linux-s390x@0.25.9": - resolution: - { - integrity: sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==, - } - engines: { node: ">=18" } + '@esbuild/linux-s390x@0.25.9': + resolution: {integrity: sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==} + engines: {node: '>=18'} cpu: [s390x] os: [linux] - "@esbuild/linux-x64@0.24.2": - resolution: - { - integrity: sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==, - } - engines: { node: ">=18" } + '@esbuild/linux-x64@0.24.2': + resolution: {integrity: sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==} + engines: {node: '>=18'} cpu: [x64] os: [linux] - "@esbuild/linux-x64@0.25.10": - resolution: - { - integrity: sha512-QSX81KhFoZGwenVyPoberggdW1nrQZSvfVDAIUXr3WqLRZGZqWk/P4T8p2SP+de2Sr5HPcvjhcJzEiulKgnxtA==, - } - engines: { node: ">=18" } + '@esbuild/linux-x64@0.25.10': + resolution: {integrity: sha512-QSX81KhFoZGwenVyPoberggdW1nrQZSvfVDAIUXr3WqLRZGZqWk/P4T8p2SP+de2Sr5HPcvjhcJzEiulKgnxtA==} + engines: {node: '>=18'} cpu: [x64] os: [linux] - "@esbuild/linux-x64@0.25.5": - resolution: - { - integrity: sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==, - } - engines: { node: ">=18" } + '@esbuild/linux-x64@0.25.5': + resolution: {integrity: sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==} + engines: {node: '>=18'} cpu: [x64] os: [linux] - "@esbuild/linux-x64@0.25.6": - resolution: - { - integrity: sha512-A6bJB41b4lKFWRKNrWoP2LHsjVzNiaurf7wyj/XtFNTsnPuxwEBWHLty+ZE0dWBKuSK1fvKgrKaNjBS7qbFKig==, - } - engines: { node: ">=18" } + '@esbuild/linux-x64@0.25.6': + resolution: {integrity: sha512-A6bJB41b4lKFWRKNrWoP2LHsjVzNiaurf7wyj/XtFNTsnPuxwEBWHLty+ZE0dWBKuSK1fvKgrKaNjBS7qbFKig==} + engines: {node: '>=18'} cpu: [x64] os: [linux] - "@esbuild/linux-x64@0.25.9": - resolution: - { - integrity: sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==, - } - engines: { node: ">=18" } + '@esbuild/linux-x64@0.25.9': + resolution: {integrity: sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==} + engines: {node: '>=18'} cpu: [x64] os: [linux] - "@esbuild/netbsd-arm64@0.24.2": - resolution: - { - integrity: sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==, - } - engines: { node: ">=18" } + '@esbuild/netbsd-arm64@0.24.2': + resolution: {integrity: sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==} + engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - "@esbuild/netbsd-arm64@0.25.10": - resolution: - { - integrity: sha512-AKQM3gfYfSW8XRk8DdMCzaLUFB15dTrZfnX8WXQoOUpUBQ+NaAFCP1kPS/ykbbGYz7rxn0WS48/81l9hFl3u4A==, - } - engines: { node: ">=18" } + '@esbuild/netbsd-arm64@0.25.10': + resolution: {integrity: sha512-AKQM3gfYfSW8XRk8DdMCzaLUFB15dTrZfnX8WXQoOUpUBQ+NaAFCP1kPS/ykbbGYz7rxn0WS48/81l9hFl3u4A==} + engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - "@esbuild/netbsd-arm64@0.25.5": - resolution: - { - integrity: sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==, - } - engines: { node: ">=18" } + '@esbuild/netbsd-arm64@0.25.5': + resolution: {integrity: sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==} + engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - "@esbuild/netbsd-arm64@0.25.6": - resolution: - { - integrity: sha512-IjA+DcwoVpjEvyxZddDqBY+uJ2Snc6duLpjmkXm/v4xuS3H+3FkLZlDm9ZsAbF9rsfP3zeA0/ArNDORZgrxR/Q==, - } - engines: { node: ">=18" } + '@esbuild/netbsd-arm64@0.25.6': + resolution: {integrity: sha512-IjA+DcwoVpjEvyxZddDqBY+uJ2Snc6duLpjmkXm/v4xuS3H+3FkLZlDm9ZsAbF9rsfP3zeA0/ArNDORZgrxR/Q==} + engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - "@esbuild/netbsd-arm64@0.25.9": - resolution: - { - integrity: sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==, - } - engines: { node: ">=18" } + '@esbuild/netbsd-arm64@0.25.9': + resolution: {integrity: sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==} + engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - "@esbuild/netbsd-x64@0.24.2": - resolution: - { - integrity: sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==, - } - engines: { node: ">=18" } + '@esbuild/netbsd-x64@0.24.2': + resolution: {integrity: sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==} + engines: {node: '>=18'} cpu: [x64] os: [netbsd] - "@esbuild/netbsd-x64@0.25.10": - resolution: - { - integrity: sha512-7RTytDPGU6fek/hWuN9qQpeGPBZFfB4zZgcz2VK2Z5VpdUxEI8JKYsg3JfO0n/Z1E/6l05n0unDCNc4HnhQGig==, - } - engines: { node: ">=18" } + '@esbuild/netbsd-x64@0.25.10': + resolution: {integrity: sha512-7RTytDPGU6fek/hWuN9qQpeGPBZFfB4zZgcz2VK2Z5VpdUxEI8JKYsg3JfO0n/Z1E/6l05n0unDCNc4HnhQGig==} + engines: {node: '>=18'} cpu: [x64] os: [netbsd] - "@esbuild/netbsd-x64@0.25.5": - resolution: - { - integrity: sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==, - } - engines: { node: ">=18" } + '@esbuild/netbsd-x64@0.25.5': + resolution: {integrity: sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==} + engines: {node: '>=18'} cpu: [x64] os: [netbsd] - "@esbuild/netbsd-x64@0.25.6": - resolution: - { - integrity: sha512-dUXuZr5WenIDlMHdMkvDc1FAu4xdWixTCRgP7RQLBOkkGgwuuzaGSYcOpW4jFxzpzL1ejb8yF620UxAqnBrR9g==, - } - engines: { node: ">=18" } + '@esbuild/netbsd-x64@0.25.6': + resolution: {integrity: sha512-dUXuZr5WenIDlMHdMkvDc1FAu4xdWixTCRgP7RQLBOkkGgwuuzaGSYcOpW4jFxzpzL1ejb8yF620UxAqnBrR9g==} + engines: {node: '>=18'} cpu: [x64] os: [netbsd] - "@esbuild/netbsd-x64@0.25.9": - resolution: - { - integrity: sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==, - } - engines: { node: ">=18" } + '@esbuild/netbsd-x64@0.25.9': + resolution: {integrity: sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==} + engines: {node: '>=18'} cpu: [x64] os: [netbsd] - "@esbuild/openbsd-arm64@0.24.2": - resolution: - { - integrity: sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==, - } - engines: { node: ">=18" } + '@esbuild/openbsd-arm64@0.24.2': + resolution: {integrity: sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==} + engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - "@esbuild/openbsd-arm64@0.25.10": - resolution: - { - integrity: sha512-5Se0VM9Wtq797YFn+dLimf2Zx6McttsH2olUBsDml+lm0GOCRVebRWUvDtkY4BWYv/3NgzS8b/UM3jQNh5hYyw==, - } - engines: { node: ">=18" } + '@esbuild/openbsd-arm64@0.25.10': + resolution: {integrity: sha512-5Se0VM9Wtq797YFn+dLimf2Zx6McttsH2olUBsDml+lm0GOCRVebRWUvDtkY4BWYv/3NgzS8b/UM3jQNh5hYyw==} + engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - "@esbuild/openbsd-arm64@0.25.5": - resolution: - { - integrity: sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==, - } - engines: { node: ">=18" } + '@esbuild/openbsd-arm64@0.25.5': + resolution: {integrity: sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==} + engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - "@esbuild/openbsd-arm64@0.25.6": - resolution: - { - integrity: sha512-l8ZCvXP0tbTJ3iaqdNf3pjaOSd5ex/e6/omLIQCVBLmHTlfXW3zAxQ4fnDmPLOB1x9xrcSi/xtCWFwCZRIaEwg==, - } - engines: { node: ">=18" } + '@esbuild/openbsd-arm64@0.25.6': + resolution: {integrity: sha512-l8ZCvXP0tbTJ3iaqdNf3pjaOSd5ex/e6/omLIQCVBLmHTlfXW3zAxQ4fnDmPLOB1x9xrcSi/xtCWFwCZRIaEwg==} + engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - "@esbuild/openbsd-arm64@0.25.9": - resolution: - { - integrity: sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==, - } - engines: { node: ">=18" } + '@esbuild/openbsd-arm64@0.25.9': + resolution: {integrity: sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==} + engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - "@esbuild/openbsd-x64@0.24.2": - resolution: - { - integrity: sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==, - } - engines: { node: ">=18" } + '@esbuild/openbsd-x64@0.24.2': + resolution: {integrity: sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==} + engines: {node: '>=18'} cpu: [x64] os: [openbsd] - "@esbuild/openbsd-x64@0.25.10": - resolution: - { - integrity: sha512-XkA4frq1TLj4bEMB+2HnI0+4RnjbuGZfet2gs/LNs5Hc7D89ZQBHQ0gL2ND6Lzu1+QVkjp3x1gIcPKzRNP8bXw==, - } - engines: { node: ">=18" } + '@esbuild/openbsd-x64@0.25.10': + resolution: {integrity: sha512-XkA4frq1TLj4bEMB+2HnI0+4RnjbuGZfet2gs/LNs5Hc7D89ZQBHQ0gL2ND6Lzu1+QVkjp3x1gIcPKzRNP8bXw==} + engines: {node: '>=18'} cpu: [x64] os: [openbsd] - "@esbuild/openbsd-x64@0.25.5": - resolution: - { - integrity: sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==, - } - engines: { node: ">=18" } + '@esbuild/openbsd-x64@0.25.5': + resolution: {integrity: sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==} + engines: {node: '>=18'} cpu: [x64] os: [openbsd] - "@esbuild/openbsd-x64@0.25.6": - resolution: - { - integrity: sha512-hKrmDa0aOFOr71KQ/19JC7az1P0GWtCN1t2ahYAf4O007DHZt/dW8ym5+CUdJhQ/qkZmI1HAF8KkJbEFtCL7gw==, - } - engines: { node: ">=18" } + '@esbuild/openbsd-x64@0.25.6': + resolution: {integrity: sha512-hKrmDa0aOFOr71KQ/19JC7az1P0GWtCN1t2ahYAf4O007DHZt/dW8ym5+CUdJhQ/qkZmI1HAF8KkJbEFtCL7gw==} + engines: {node: '>=18'} cpu: [x64] os: [openbsd] - "@esbuild/openbsd-x64@0.25.9": - resolution: - { - integrity: sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==, - } - engines: { node: ">=18" } + '@esbuild/openbsd-x64@0.25.9': + resolution: {integrity: sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==} + engines: {node: '>=18'} cpu: [x64] os: [openbsd] - "@esbuild/openharmony-arm64@0.25.10": - resolution: - { - integrity: sha512-AVTSBhTX8Y/Fz6OmIVBip9tJzZEUcY8WLh7I59+upa5/GPhh2/aM6bvOMQySspnCCHvFi79kMtdJS1w0DXAeag==, - } - engines: { node: ">=18" } + '@esbuild/openharmony-arm64@0.25.10': + resolution: {integrity: sha512-AVTSBhTX8Y/Fz6OmIVBip9tJzZEUcY8WLh7I59+upa5/GPhh2/aM6bvOMQySspnCCHvFi79kMtdJS1w0DXAeag==} + engines: {node: '>=18'} cpu: [arm64] os: [openharmony] - "@esbuild/openharmony-arm64@0.25.6": - resolution: - { - integrity: sha512-+SqBcAWoB1fYKmpWoQP4pGtx+pUUC//RNYhFdbcSA16617cchuryuhOCRpPsjCblKukAckWsV+aQ3UKT/RMPcA==, - } - engines: { node: ">=18" } + '@esbuild/openharmony-arm64@0.25.6': + resolution: {integrity: sha512-+SqBcAWoB1fYKmpWoQP4pGtx+pUUC//RNYhFdbcSA16617cchuryuhOCRpPsjCblKukAckWsV+aQ3UKT/RMPcA==} + engines: {node: '>=18'} cpu: [arm64] os: [openharmony] - "@esbuild/openharmony-arm64@0.25.9": - resolution: - { - integrity: sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==, - } - engines: { node: ">=18" } + '@esbuild/openharmony-arm64@0.25.9': + resolution: {integrity: sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==} + engines: {node: '>=18'} cpu: [arm64] os: [openharmony] - "@esbuild/sunos-x64@0.24.2": - resolution: - { - integrity: sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==, - } - engines: { node: ">=18" } + '@esbuild/sunos-x64@0.24.2': + resolution: {integrity: sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==} + engines: {node: '>=18'} cpu: [x64] os: [sunos] - "@esbuild/sunos-x64@0.25.10": - resolution: - { - integrity: sha512-fswk3XT0Uf2pGJmOpDB7yknqhVkJQkAQOcW/ccVOtfx05LkbWOaRAtn5SaqXypeKQra1QaEa841PgrSL9ubSPQ==, - } - engines: { node: ">=18" } + '@esbuild/sunos-x64@0.25.10': + resolution: {integrity: sha512-fswk3XT0Uf2pGJmOpDB7yknqhVkJQkAQOcW/ccVOtfx05LkbWOaRAtn5SaqXypeKQra1QaEa841PgrSL9ubSPQ==} + engines: {node: '>=18'} cpu: [x64] os: [sunos] - "@esbuild/sunos-x64@0.25.5": - resolution: - { - integrity: sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==, - } - engines: { node: ">=18" } + '@esbuild/sunos-x64@0.25.5': + resolution: {integrity: sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==} + engines: {node: '>=18'} cpu: [x64] os: [sunos] - "@esbuild/sunos-x64@0.25.6": - resolution: - { - integrity: sha512-dyCGxv1/Br7MiSC42qinGL8KkG4kX0pEsdb0+TKhmJZgCUDBGmyo1/ArCjNGiOLiIAgdbWgmWgib4HoCi5t7kA==, - } - engines: { node: ">=18" } + '@esbuild/sunos-x64@0.25.6': + resolution: {integrity: sha512-dyCGxv1/Br7MiSC42qinGL8KkG4kX0pEsdb0+TKhmJZgCUDBGmyo1/ArCjNGiOLiIAgdbWgmWgib4HoCi5t7kA==} + engines: {node: '>=18'} cpu: [x64] os: [sunos] - "@esbuild/sunos-x64@0.25.9": - resolution: - { - integrity: sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==, - } - engines: { node: ">=18" } + '@esbuild/sunos-x64@0.25.9': + resolution: {integrity: sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==} + engines: {node: '>=18'} cpu: [x64] os: [sunos] - "@esbuild/win32-arm64@0.24.2": - resolution: - { - integrity: sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==, - } - engines: { node: ">=18" } + '@esbuild/win32-arm64@0.24.2': + resolution: {integrity: sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==} + engines: {node: '>=18'} cpu: [arm64] os: [win32] - "@esbuild/win32-arm64@0.25.10": - resolution: - { - integrity: sha512-ah+9b59KDTSfpaCg6VdJoOQvKjI33nTaQr4UluQwW7aEwZQsbMCfTmfEO4VyewOxx4RaDT/xCy9ra2GPWmO7Kw==, - } - engines: { node: ">=18" } + '@esbuild/win32-arm64@0.25.10': + resolution: {integrity: sha512-ah+9b59KDTSfpaCg6VdJoOQvKjI33nTaQr4UluQwW7aEwZQsbMCfTmfEO4VyewOxx4RaDT/xCy9ra2GPWmO7Kw==} + engines: {node: '>=18'} cpu: [arm64] os: [win32] - "@esbuild/win32-arm64@0.25.5": - resolution: - { - integrity: sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==, - } - engines: { node: ">=18" } + '@esbuild/win32-arm64@0.25.5': + resolution: {integrity: sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==} + engines: {node: '>=18'} cpu: [arm64] os: [win32] - "@esbuild/win32-arm64@0.25.6": - resolution: - { - integrity: sha512-42QOgcZeZOvXfsCBJF5Afw73t4veOId//XD3i+/9gSkhSV6Gk3VPlWncctI+JcOyERv85FUo7RxuxGy+z8A43Q==, - } - engines: { node: ">=18" } + '@esbuild/win32-arm64@0.25.6': + resolution: {integrity: sha512-42QOgcZeZOvXfsCBJF5Afw73t4veOId//XD3i+/9gSkhSV6Gk3VPlWncctI+JcOyERv85FUo7RxuxGy+z8A43Q==} + engines: {node: '>=18'} cpu: [arm64] os: [win32] - "@esbuild/win32-arm64@0.25.9": - resolution: - { - integrity: sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==, - } - engines: { node: ">=18" } + '@esbuild/win32-arm64@0.25.9': + resolution: {integrity: sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==} + engines: {node: '>=18'} cpu: [arm64] os: [win32] - "@esbuild/win32-ia32@0.24.2": - resolution: - { - integrity: sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==, - } - engines: { node: ">=18" } + '@esbuild/win32-ia32@0.24.2': + resolution: {integrity: sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==} + engines: {node: '>=18'} cpu: [ia32] os: [win32] - "@esbuild/win32-ia32@0.25.10": - resolution: - { - integrity: sha512-QHPDbKkrGO8/cz9LKVnJU22HOi4pxZnZhhA2HYHez5Pz4JeffhDjf85E57Oyco163GnzNCVkZK0b/n4Y0UHcSw==, - } - engines: { node: ">=18" } + '@esbuild/win32-ia32@0.25.10': + resolution: {integrity: sha512-QHPDbKkrGO8/cz9LKVnJU22HOi4pxZnZhhA2HYHez5Pz4JeffhDjf85E57Oyco163GnzNCVkZK0b/n4Y0UHcSw==} + engines: {node: '>=18'} cpu: [ia32] os: [win32] - "@esbuild/win32-ia32@0.25.5": - resolution: - { - integrity: sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==, - } - engines: { node: ">=18" } + '@esbuild/win32-ia32@0.25.5': + resolution: {integrity: sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==} + engines: {node: '>=18'} cpu: [ia32] os: [win32] - "@esbuild/win32-ia32@0.25.6": - resolution: - { - integrity: sha512-4AWhgXmDuYN7rJI6ORB+uU9DHLq/erBbuMoAuB4VWJTu5KtCgcKYPynF0YI1VkBNuEfjNlLrFr9KZPJzrtLkrQ==, - } - engines: { node: ">=18" } + '@esbuild/win32-ia32@0.25.6': + resolution: {integrity: sha512-4AWhgXmDuYN7rJI6ORB+uU9DHLq/erBbuMoAuB4VWJTu5KtCgcKYPynF0YI1VkBNuEfjNlLrFr9KZPJzrtLkrQ==} + engines: {node: '>=18'} cpu: [ia32] os: [win32] - "@esbuild/win32-ia32@0.25.9": - resolution: - { - integrity: sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==, - } - engines: { node: ">=18" } + '@esbuild/win32-ia32@0.25.9': + resolution: {integrity: sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==} + engines: {node: '>=18'} cpu: [ia32] os: [win32] - "@esbuild/win32-x64@0.24.2": - resolution: - { - integrity: sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==, - } - engines: { node: ">=18" } + '@esbuild/win32-x64@0.24.2': + resolution: {integrity: sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==} + engines: {node: '>=18'} cpu: [x64] os: [win32] - "@esbuild/win32-x64@0.25.10": - resolution: - { - integrity: sha512-9KpxSVFCu0iK1owoez6aC/s/EdUQLDN3adTxGCqxMVhrPDj6bt5dbrHDXUuq+Bs2vATFBBrQS5vdQ/Ed2P+nbw==, - } - engines: { node: ">=18" } + '@esbuild/win32-x64@0.25.10': + resolution: {integrity: sha512-9KpxSVFCu0iK1owoez6aC/s/EdUQLDN3adTxGCqxMVhrPDj6bt5dbrHDXUuq+Bs2vATFBBrQS5vdQ/Ed2P+nbw==} + engines: {node: '>=18'} cpu: [x64] os: [win32] - "@esbuild/win32-x64@0.25.5": - resolution: - { - integrity: sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==, - } - engines: { node: ">=18" } + '@esbuild/win32-x64@0.25.5': + resolution: {integrity: sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==} + engines: {node: '>=18'} cpu: [x64] os: [win32] - "@esbuild/win32-x64@0.25.6": - resolution: - { - integrity: sha512-NgJPHHbEpLQgDH2MjQu90pzW/5vvXIZ7KOnPyNBm92A6WgZ/7b6fJyUBjoumLqeOQQGqY2QjQxRo97ah4Sj0cA==, - } - engines: { node: ">=18" } + '@esbuild/win32-x64@0.25.6': + resolution: {integrity: sha512-NgJPHHbEpLQgDH2MjQu90pzW/5vvXIZ7KOnPyNBm92A6WgZ/7b6fJyUBjoumLqeOQQGqY2QjQxRo97ah4Sj0cA==} + engines: {node: '>=18'} cpu: [x64] os: [win32] - "@esbuild/win32-x64@0.25.9": - resolution: - { - integrity: sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==, - } - engines: { node: ">=18" } + '@esbuild/win32-x64@0.25.9': + resolution: {integrity: sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==} + engines: {node: '>=18'} cpu: [x64] os: [win32] - "@expressive-code/core@0.41.2": - resolution: - { - integrity: sha512-AJW5Tp9czbLqKMzwudL9Rv4js9afXBxkSGLmCNPq1iRgAYcx9NkTPJiSNCesjKRWoVC328AdSu6fqrD22zDgDg==, - } - - "@expressive-code/plugin-frames@0.41.2": - resolution: - { - integrity: sha512-pfy0hkJI4nbaONjmksFDcuHmIuyPTFmi1JpABe4q2ajskiJtfBf+WDAL2pg595R9JNoPrrH5+aT9lbkx2noicw==, - } - - "@expressive-code/plugin-shiki@0.41.2": - resolution: - { - integrity: sha512-xD4zwqAkDccXqye+235BH5bN038jYiSMLfUrCOmMlzxPDGWdxJDk5z4uUB/aLfivEF2tXyO2zyaarL3Oqht0fQ==, - } - - "@expressive-code/plugin-text-markers@0.41.2": - resolution: - { - integrity: sha512-JFWBz2qYxxJOJkkWf96LpeolbnOqJY95TvwYc0hXIHf9oSWV0h0SY268w/5N3EtQaD9KktzDE+VIVwb9jdb3nw==, - } - - "@floating-ui/core@1.7.1": - resolution: - { - integrity: sha512-azI0DrjMMfIug/ExbBaeDVJXcY0a7EPvPjb2xAJPa4HeimBX+Z18HK8QQR3jb6356SnDDdxx+hinMLcJEDdOjw==, - } - - "@floating-ui/dom@1.7.1": - resolution: - { - integrity: sha512-cwsmW/zyw5ltYTUeeYJ60CnQuPqmGwuGVhG9w0PRaRKkAyi38BT5CKrpIbb+jtahSwUl04cWzSx9ZOIxeS6RsQ==, - } - - "@floating-ui/react-dom@2.1.3": - resolution: - { - integrity: sha512-huMBfiU9UnQ2oBwIhgzyIiSpVgvlDstU8CX0AF+wS+KzmYMs0J2a3GwuFHV1Lz+jlrQGeC1fF+Nv0QoumyV0bA==, - } + '@expressive-code/core@0.41.2': + resolution: {integrity: sha512-AJW5Tp9czbLqKMzwudL9Rv4js9afXBxkSGLmCNPq1iRgAYcx9NkTPJiSNCesjKRWoVC328AdSu6fqrD22zDgDg==} + + '@expressive-code/plugin-frames@0.41.2': + resolution: {integrity: sha512-pfy0hkJI4nbaONjmksFDcuHmIuyPTFmi1JpABe4q2ajskiJtfBf+WDAL2pg595R9JNoPrrH5+aT9lbkx2noicw==} + + '@expressive-code/plugin-shiki@0.41.2': + resolution: {integrity: sha512-xD4zwqAkDccXqye+235BH5bN038jYiSMLfUrCOmMlzxPDGWdxJDk5z4uUB/aLfivEF2tXyO2zyaarL3Oqht0fQ==} + + '@expressive-code/plugin-text-markers@0.41.2': + resolution: {integrity: sha512-JFWBz2qYxxJOJkkWf96LpeolbnOqJY95TvwYc0hXIHf9oSWV0h0SY268w/5N3EtQaD9KktzDE+VIVwb9jdb3nw==} + + '@floating-ui/core@1.7.1': + resolution: {integrity: sha512-azI0DrjMMfIug/ExbBaeDVJXcY0a7EPvPjb2xAJPa4HeimBX+Z18HK8QQR3jb6356SnDDdxx+hinMLcJEDdOjw==} + + '@floating-ui/dom@1.7.1': + resolution: {integrity: sha512-cwsmW/zyw5ltYTUeeYJ60CnQuPqmGwuGVhG9w0PRaRKkAyi38BT5CKrpIbb+jtahSwUl04cWzSx9ZOIxeS6RsQ==} + + '@floating-ui/react-dom@2.1.3': + resolution: {integrity: sha512-huMBfiU9UnQ2oBwIhgzyIiSpVgvlDstU8CX0AF+wS+KzmYMs0J2a3GwuFHV1Lz+jlrQGeC1fF+Nv0QoumyV0bA==} peerDependencies: - react: ">=16.8.0" - react-dom: ">=16.8.0" - - "@floating-ui/utils@0.2.9": - resolution: - { - integrity: sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==, - } - - "@gerrit0/mini-shiki@3.13.0": - resolution: - { - integrity: sha512-mCrNvZNYNrwKer5PWLF6cOc0OEe2eKzgy976x+IT2tynwJYl+7UpHTSeXQJGijgTcoOf+f359L946unWlYRnsg==, - } - - "@img/sharp-darwin-arm64@0.34.2": - resolution: - { - integrity: sha512-OfXHZPppddivUJnqyKoi5YVeHRkkNE2zUFT2gbpKxp/JZCFYEYubnMg+gOp6lWfasPrTS+KPosKqdI+ELYVDtg==, - } - engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@floating-ui/utils@0.2.9': + resolution: {integrity: sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==} + + '@gerrit0/mini-shiki@3.13.0': + resolution: {integrity: sha512-mCrNvZNYNrwKer5PWLF6cOc0OEe2eKzgy976x+IT2tynwJYl+7UpHTSeXQJGijgTcoOf+f359L946unWlYRnsg==} + + '@img/sharp-darwin-arm64@0.34.2': + resolution: {integrity: sha512-OfXHZPppddivUJnqyKoi5YVeHRkkNE2zUFT2gbpKxp/JZCFYEYubnMg+gOp6lWfasPrTS+KPosKqdI+ELYVDtg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [darwin] - "@img/sharp-darwin-x64@0.34.2": - resolution: - { - integrity: sha512-dYvWqmjU9VxqXmjEtjmvHnGqF8GrVjM2Epj9rJ6BUIXvk8slvNDJbhGFvIoXzkDhrJC2jUxNLz/GUjjvSzfw+g==, - } - engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + '@img/sharp-darwin-x64@0.34.2': + resolution: {integrity: sha512-dYvWqmjU9VxqXmjEtjmvHnGqF8GrVjM2Epj9rJ6BUIXvk8slvNDJbhGFvIoXzkDhrJC2jUxNLz/GUjjvSzfw+g==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [darwin] - "@img/sharp-libvips-darwin-arm64@1.1.0": - resolution: - { - integrity: sha512-HZ/JUmPwrJSoM4DIQPv/BfNh9yrOA8tlBbqbLz4JZ5uew2+o22Ik+tHQJcih7QJuSa0zo5coHTfD5J8inqj9DA==, - } + '@img/sharp-libvips-darwin-arm64@1.1.0': + resolution: {integrity: sha512-HZ/JUmPwrJSoM4DIQPv/BfNh9yrOA8tlBbqbLz4JZ5uew2+o22Ik+tHQJcih7QJuSa0zo5coHTfD5J8inqj9DA==} cpu: [arm64] os: [darwin] - "@img/sharp-libvips-darwin-x64@1.1.0": - resolution: - { - integrity: sha512-Xzc2ToEmHN+hfvsl9wja0RlnXEgpKNmftriQp6XzY/RaSfwD9th+MSh0WQKzUreLKKINb3afirxW7A0fz2YWuQ==, - } + '@img/sharp-libvips-darwin-x64@1.1.0': + resolution: {integrity: sha512-Xzc2ToEmHN+hfvsl9wja0RlnXEgpKNmftriQp6XzY/RaSfwD9th+MSh0WQKzUreLKKINb3afirxW7A0fz2YWuQ==} cpu: [x64] os: [darwin] - "@img/sharp-libvips-linux-arm64@1.1.0": - resolution: - { - integrity: sha512-IVfGJa7gjChDET1dK9SekxFFdflarnUB8PwW8aGwEoF3oAsSDuNUTYS+SKDOyOJxQyDC1aPFMuRYLoDInyV9Ew==, - } + '@img/sharp-libvips-linux-arm64@1.1.0': + resolution: {integrity: sha512-IVfGJa7gjChDET1dK9SekxFFdflarnUB8PwW8aGwEoF3oAsSDuNUTYS+SKDOyOJxQyDC1aPFMuRYLoDInyV9Ew==} cpu: [arm64] os: [linux] - "@img/sharp-libvips-linux-arm@1.1.0": - resolution: - { - integrity: sha512-s8BAd0lwUIvYCJyRdFqvsj+BJIpDBSxs6ivrOPm/R7piTs5UIwY5OjXrP2bqXC9/moGsyRa37eYWYCOGVXxVrA==, - } + '@img/sharp-libvips-linux-arm@1.1.0': + resolution: {integrity: sha512-s8BAd0lwUIvYCJyRdFqvsj+BJIpDBSxs6ivrOPm/R7piTs5UIwY5OjXrP2bqXC9/moGsyRa37eYWYCOGVXxVrA==} cpu: [arm] os: [linux] - "@img/sharp-libvips-linux-ppc64@1.1.0": - resolution: - { - integrity: sha512-tiXxFZFbhnkWE2LA8oQj7KYR+bWBkiV2nilRldT7bqoEZ4HiDOcePr9wVDAZPi/Id5fT1oY9iGnDq20cwUz8lQ==, - } + '@img/sharp-libvips-linux-ppc64@1.1.0': + resolution: {integrity: sha512-tiXxFZFbhnkWE2LA8oQj7KYR+bWBkiV2nilRldT7bqoEZ4HiDOcePr9wVDAZPi/Id5fT1oY9iGnDq20cwUz8lQ==} cpu: [ppc64] os: [linux] - "@img/sharp-libvips-linux-s390x@1.1.0": - resolution: - { - integrity: sha512-xukSwvhguw7COyzvmjydRb3x/09+21HykyapcZchiCUkTThEQEOMtBj9UhkaBRLuBrgLFzQ2wbxdeCCJW/jgJA==, - } + '@img/sharp-libvips-linux-s390x@1.1.0': + resolution: {integrity: sha512-xukSwvhguw7COyzvmjydRb3x/09+21HykyapcZchiCUkTThEQEOMtBj9UhkaBRLuBrgLFzQ2wbxdeCCJW/jgJA==} cpu: [s390x] os: [linux] - "@img/sharp-libvips-linux-x64@1.1.0": - resolution: - { - integrity: sha512-yRj2+reB8iMg9W5sULM3S74jVS7zqSzHG3Ol/twnAAkAhnGQnpjj6e4ayUz7V+FpKypwgs82xbRdYtchTTUB+Q==, - } + '@img/sharp-libvips-linux-x64@1.1.0': + resolution: {integrity: sha512-yRj2+reB8iMg9W5sULM3S74jVS7zqSzHG3Ol/twnAAkAhnGQnpjj6e4ayUz7V+FpKypwgs82xbRdYtchTTUB+Q==} cpu: [x64] os: [linux] - "@img/sharp-libvips-linuxmusl-arm64@1.1.0": - resolution: - { - integrity: sha512-jYZdG+whg0MDK+q2COKbYidaqW/WTz0cc1E+tMAusiDygrM4ypmSCjOJPmFTvHHJ8j/6cAGyeDWZOsK06tP33w==, - } + '@img/sharp-libvips-linuxmusl-arm64@1.1.0': + resolution: {integrity: sha512-jYZdG+whg0MDK+q2COKbYidaqW/WTz0cc1E+tMAusiDygrM4ypmSCjOJPmFTvHHJ8j/6cAGyeDWZOsK06tP33w==} cpu: [arm64] os: [linux] - "@img/sharp-libvips-linuxmusl-x64@1.1.0": - resolution: - { - integrity: sha512-wK7SBdwrAiycjXdkPnGCPLjYb9lD4l6Ze2gSdAGVZrEL05AOUJESWU2lhlC+Ffn5/G+VKuSm6zzbQSzFX/P65A==, - } + '@img/sharp-libvips-linuxmusl-x64@1.1.0': + resolution: {integrity: sha512-wK7SBdwrAiycjXdkPnGCPLjYb9lD4l6Ze2gSdAGVZrEL05AOUJESWU2lhlC+Ffn5/G+VKuSm6zzbQSzFX/P65A==} cpu: [x64] os: [linux] - "@img/sharp-linux-arm64@0.34.2": - resolution: - { - integrity: sha512-D8n8wgWmPDakc83LORcfJepdOSN6MvWNzzz2ux0MnIbOqdieRZwVYY32zxVx+IFUT8er5KPcyU3XXsn+GzG/0Q==, - } - engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + '@img/sharp-linux-arm64@0.34.2': + resolution: {integrity: sha512-D8n8wgWmPDakc83LORcfJepdOSN6MvWNzzz2ux0MnIbOqdieRZwVYY32zxVx+IFUT8er5KPcyU3XXsn+GzG/0Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] - "@img/sharp-linux-arm@0.34.2": - resolution: - { - integrity: sha512-0DZzkvuEOqQUP9mo2kjjKNok5AmnOr1jB2XYjkaoNRwpAYMDzRmAqUIa1nRi58S2WswqSfPOWLNOr0FDT3H5RQ==, - } - engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + '@img/sharp-linux-arm@0.34.2': + resolution: {integrity: sha512-0DZzkvuEOqQUP9mo2kjjKNok5AmnOr1jB2XYjkaoNRwpAYMDzRmAqUIa1nRi58S2WswqSfPOWLNOr0FDT3H5RQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm] os: [linux] - "@img/sharp-linux-s390x@0.34.2": - resolution: - { - integrity: sha512-EGZ1xwhBI7dNISwxjChqBGELCWMGDvmxZXKjQRuqMrakhO8QoMgqCrdjnAqJq/CScxfRn+Bb7suXBElKQpPDiw==, - } - engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + '@img/sharp-linux-s390x@0.34.2': + resolution: {integrity: sha512-EGZ1xwhBI7dNISwxjChqBGELCWMGDvmxZXKjQRuqMrakhO8QoMgqCrdjnAqJq/CScxfRn+Bb7suXBElKQpPDiw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [s390x] os: [linux] - "@img/sharp-linux-x64@0.34.2": - resolution: - { - integrity: sha512-sD7J+h5nFLMMmOXYH4DD9UtSNBD05tWSSdWAcEyzqW8Cn5UxXvsHAxmxSesYUsTOBmUnjtxghKDl15EvfqLFbQ==, - } - engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + '@img/sharp-linux-x64@0.34.2': + resolution: {integrity: sha512-sD7J+h5nFLMMmOXYH4DD9UtSNBD05tWSSdWAcEyzqW8Cn5UxXvsHAxmxSesYUsTOBmUnjtxghKDl15EvfqLFbQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] - "@img/sharp-linuxmusl-arm64@0.34.2": - resolution: - { - integrity: sha512-NEE2vQ6wcxYav1/A22OOxoSOGiKnNmDzCYFOZ949xFmrWZOVII1Bp3NqVVpvj+3UeHMFyN5eP/V5hzViQ5CZNA==, - } - engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + '@img/sharp-linuxmusl-arm64@0.34.2': + resolution: {integrity: sha512-NEE2vQ6wcxYav1/A22OOxoSOGiKnNmDzCYFOZ949xFmrWZOVII1Bp3NqVVpvj+3UeHMFyN5eP/V5hzViQ5CZNA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] - "@img/sharp-linuxmusl-x64@0.34.2": - resolution: - { - integrity: sha512-DOYMrDm5E6/8bm/yQLCWyuDJwUnlevR8xtF8bs+gjZ7cyUNYXiSf/E8Kp0Ss5xasIaXSHzb888V1BE4i1hFhAA==, - } - engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + '@img/sharp-linuxmusl-x64@0.34.2': + resolution: {integrity: sha512-DOYMrDm5E6/8bm/yQLCWyuDJwUnlevR8xtF8bs+gjZ7cyUNYXiSf/E8Kp0Ss5xasIaXSHzb888V1BE4i1hFhAA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] - "@img/sharp-wasm32@0.34.2": - resolution: - { - integrity: sha512-/VI4mdlJ9zkaq53MbIG6rZY+QRN3MLbR6usYlgITEzi4Rpx5S6LFKsycOQjkOGmqTNmkIdLjEvooFKwww6OpdQ==, - } - engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + '@img/sharp-wasm32@0.34.2': + resolution: {integrity: sha512-/VI4mdlJ9zkaq53MbIG6rZY+QRN3MLbR6usYlgITEzi4Rpx5S6LFKsycOQjkOGmqTNmkIdLjEvooFKwww6OpdQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [wasm32] - "@img/sharp-win32-arm64@0.34.2": - resolution: - { - integrity: sha512-cfP/r9FdS63VA5k0xiqaNaEoGxBg9k7uE+RQGzuK9fHt7jib4zAVVseR9LsE4gJcNWgT6APKMNnCcnyOtmSEUQ==, - } - engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + '@img/sharp-win32-arm64@0.34.2': + resolution: {integrity: sha512-cfP/r9FdS63VA5k0xiqaNaEoGxBg9k7uE+RQGzuK9fHt7jib4zAVVseR9LsE4gJcNWgT6APKMNnCcnyOtmSEUQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [win32] - "@img/sharp-win32-ia32@0.34.2": - resolution: - { - integrity: sha512-QLjGGvAbj0X/FXl8n1WbtQ6iVBpWU7JO94u/P2M4a8CFYsvQi4GW2mRy/JqkRx0qpBzaOdKJKw8uc930EX2AHw==, - } - engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + '@img/sharp-win32-ia32@0.34.2': + resolution: {integrity: sha512-QLjGGvAbj0X/FXl8n1WbtQ6iVBpWU7JO94u/P2M4a8CFYsvQi4GW2mRy/JqkRx0qpBzaOdKJKw8uc930EX2AHw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [ia32] os: [win32] - "@img/sharp-win32-x64@0.34.2": - resolution: - { - integrity: sha512-aUdT6zEYtDKCaxkofmmJDJYGCf0+pJg3eU9/oBuqvEeoB9dKI6ZLc/1iLJCTuJQDO4ptntAlkUmHgGjyuobZbw==, - } - engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + '@img/sharp-win32-x64@0.34.2': + resolution: {integrity: sha512-aUdT6zEYtDKCaxkofmmJDJYGCf0+pJg3eU9/oBuqvEeoB9dKI6ZLc/1iLJCTuJQDO4ptntAlkUmHgGjyuobZbw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [win32] - "@inquirer/ansi@1.0.0": - resolution: - { - integrity: sha512-JWaTfCxI1eTmJ1BIv86vUfjVatOdxwD0DAVKYevY8SazeUUZtW+tNbsdejVO1GYE0GXJW1N1ahmiC3TFd+7wZA==, - } - engines: { node: ">=18" } - - "@inquirer/confirm@5.1.18": - resolution: - { - integrity: sha512-MilmWOzHa3Ks11tzvuAmFoAd/wRuaP3SwlT1IZhyMke31FKLxPiuDWcGXhU+PKveNOpAc4axzAgrgxuIJJRmLw==, - } - engines: { node: ">=18" } + '@inquirer/ansi@1.0.0': + resolution: {integrity: sha512-JWaTfCxI1eTmJ1BIv86vUfjVatOdxwD0DAVKYevY8SazeUUZtW+tNbsdejVO1GYE0GXJW1N1ahmiC3TFd+7wZA==} + engines: {node: '>=18'} + + '@inquirer/confirm@5.1.18': + resolution: {integrity: sha512-MilmWOzHa3Ks11tzvuAmFoAd/wRuaP3SwlT1IZhyMke31FKLxPiuDWcGXhU+PKveNOpAc4axzAgrgxuIJJRmLw==} + engines: {node: '>=18'} peerDependencies: - "@types/node": ">=18" + '@types/node': '>=18' peerDependenciesMeta: - "@types/node": + '@types/node': optional: true - "@inquirer/core@10.2.2": - resolution: - { - integrity: sha512-yXq/4QUnk4sHMtmbd7irwiepjB8jXU0kkFRL4nr/aDBA2mDz13cMakEWdDwX3eSCTkk03kwcndD1zfRAIlELxA==, - } - engines: { node: ">=18" } + '@inquirer/core@10.2.2': + resolution: {integrity: sha512-yXq/4QUnk4sHMtmbd7irwiepjB8jXU0kkFRL4nr/aDBA2mDz13cMakEWdDwX3eSCTkk03kwcndD1zfRAIlELxA==} + engines: {node: '>=18'} peerDependencies: - "@types/node": ">=18" + '@types/node': '>=18' peerDependenciesMeta: - "@types/node": + '@types/node': optional: true - "@inquirer/figures@1.0.13": - resolution: - { - integrity: sha512-lGPVU3yO9ZNqA7vTYz26jny41lE7yoQansmqdMLBEfqaGsmdg7V3W9mK9Pvb5IL4EVZ9GnSDGMO/cJXud5dMaw==, - } - engines: { node: ">=18" } - - "@inquirer/type@3.0.8": - resolution: - { - integrity: sha512-lg9Whz8onIHRthWaN1Q9EGLa/0LFJjyM8mEUbL1eTi6yMGvBf8gvyDLtxSXztQsxMvhxxNpJYrwa1YHdq+w4Jw==, - } - engines: { node: ">=18" } + '@inquirer/figures@1.0.13': + resolution: {integrity: sha512-lGPVU3yO9ZNqA7vTYz26jny41lE7yoQansmqdMLBEfqaGsmdg7V3W9mK9Pvb5IL4EVZ9GnSDGMO/cJXud5dMaw==} + engines: {node: '>=18'} + + '@inquirer/type@3.0.8': + resolution: {integrity: sha512-lg9Whz8onIHRthWaN1Q9EGLa/0LFJjyM8mEUbL1eTi6yMGvBf8gvyDLtxSXztQsxMvhxxNpJYrwa1YHdq+w4Jw==} + engines: {node: '>=18'} peerDependencies: - "@types/node": ">=18" + '@types/node': '>=18' peerDependenciesMeta: - "@types/node": + '@types/node': optional: true - "@isaacs/balanced-match@4.0.1": - resolution: - { - integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==, - } - engines: { node: 20 || >=22 } - - "@isaacs/brace-expansion@5.0.0": - resolution: - { - integrity: sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==, - } - engines: { node: 20 || >=22 } - - "@isaacs/cliui@8.0.2": - resolution: - { - integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==, - } - engines: { node: ">=12" } - - "@isaacs/fs-minipass@4.0.1": - resolution: - { - integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==, - } - engines: { node: ">=18.0.0" } - - "@istanbuljs/schema@0.1.3": - resolution: - { - integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==, - } - engines: { node: ">=8" } - - "@jridgewell/gen-mapping@0.3.11": - resolution: - { - integrity: sha512-C512c1ytBTio4MrpWKlJpyFHT6+qfFL8SZ58zBzJ1OOzUEjHeF1BtjY2fH7n4x/g2OV/KiiMLAivOp1DXmiMMw==, - } - - "@jridgewell/gen-mapping@0.3.13": - resolution: - { - integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==, - } - - "@jridgewell/gen-mapping@0.3.8": - resolution: - { - integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==, - } - engines: { node: ">=6.0.0" } - - "@jridgewell/remapping@2.3.5": - resolution: - { - integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==, - } - - "@jridgewell/resolve-uri@3.1.2": - resolution: - { - integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==, - } - engines: { node: ">=6.0.0" } - - "@jridgewell/set-array@1.2.1": - resolution: - { - integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==, - } - engines: { node: ">=6.0.0" } - - "@jridgewell/sourcemap-codec@1.5.0": - resolution: - { - integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==, - } - - "@jridgewell/sourcemap-codec@1.5.4": - resolution: - { - integrity: sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==, - } - - "@jridgewell/sourcemap-codec@1.5.5": - resolution: - { - integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==, - } - - "@jridgewell/trace-mapping@0.3.25": - resolution: - { - integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==, - } - - "@jridgewell/trace-mapping@0.3.28": - resolution: - { - integrity: sha512-KNNHHwW3EIp4EDYOvYFGyIFfx36R2dNJYH4knnZlF8T5jdbD5Wx8xmSaQ2gP9URkJ04LGEtlcCtwArKcmFcwKw==, - } - - "@jridgewell/trace-mapping@0.3.31": - resolution: - { - integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==, - } - - "@jsdevtools/ez-spawn@3.0.4": - resolution: - { - integrity: sha512-f5DRIOZf7wxogefH03RjMPMdBF7ADTWUMoOs9kaJo06EfwF+aFhMZMDZxHg/Xe12hptN9xoZjGso2fdjapBRIA==, - } - engines: { node: ">=10" } - - "@loaders.gl/core@4.3.4": - resolution: - { - integrity: sha512-cG0C5fMZ1jyW6WCsf4LoHGvaIAJCEVA/ioqKoYRwoSfXkOf+17KupK1OUQyUCw5XoRn+oWA1FulJQOYlXnb9Gw==, - } - - "@loaders.gl/loader-utils@4.3.4": - resolution: - { - integrity: sha512-tjMZvlKQSaMl2qmYTAxg+ySR6zd6hQn5n3XaU8+Ehp90TD3WzxvDKOMNDqOa72fFmIV+KgPhcmIJTpq4lAdC4Q==, - } + '@isaacs/balanced-match@4.0.1': + resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==} + engines: {node: 20 || >=22} + + '@isaacs/brace-expansion@5.0.0': + resolution: {integrity: sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==} + engines: {node: 20 || >=22} + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@isaacs/fs-minipass@4.0.1': + resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} + engines: {node: '>=18.0.0'} + + '@istanbuljs/schema@0.1.3': + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + + '@jridgewell/gen-mapping@0.3.11': + resolution: {integrity: sha512-C512c1ytBTio4MrpWKlJpyFHT6+qfFL8SZ58zBzJ1OOzUEjHeF1BtjY2fH7n4x/g2OV/KiiMLAivOp1DXmiMMw==} + + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/gen-mapping@0.3.8': + resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} + engines: {node: '>=6.0.0'} + + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + + '@jridgewell/sourcemap-codec@1.5.4': + resolution: {integrity: sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + + '@jridgewell/trace-mapping@0.3.28': + resolution: {integrity: sha512-KNNHHwW3EIp4EDYOvYFGyIFfx36R2dNJYH4knnZlF8T5jdbD5Wx8xmSaQ2gP9URkJ04LGEtlcCtwArKcmFcwKw==} + + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + + '@jsdevtools/ez-spawn@3.0.4': + resolution: {integrity: sha512-f5DRIOZf7wxogefH03RjMPMdBF7ADTWUMoOs9kaJo06EfwF+aFhMZMDZxHg/Xe12hptN9xoZjGso2fdjapBRIA==} + engines: {node: '>=10'} + + '@loaders.gl/core@4.3.4': + resolution: {integrity: sha512-cG0C5fMZ1jyW6WCsf4LoHGvaIAJCEVA/ioqKoYRwoSfXkOf+17KupK1OUQyUCw5XoRn+oWA1FulJQOYlXnb9Gw==} + + '@loaders.gl/loader-utils@4.3.4': + resolution: {integrity: sha512-tjMZvlKQSaMl2qmYTAxg+ySR6zd6hQn5n3XaU8+Ehp90TD3WzxvDKOMNDqOa72fFmIV+KgPhcmIJTpq4lAdC4Q==} peerDependencies: - "@loaders.gl/core": ^4.3.0 + '@loaders.gl/core': ^4.3.0 - "@loaders.gl/obj@4.3.4": - resolution: - { - integrity: sha512-Rdn+NHjLI0jKYrKNicJuQJohnHh7QAv4szCji8eafYYMrVtSIonNozBXUfe/c4V7HL/FVvvHCkfC66rvLvayaQ==, - } + '@loaders.gl/obj@4.3.4': + resolution: {integrity: sha512-Rdn+NHjLI0jKYrKNicJuQJohnHh7QAv4szCji8eafYYMrVtSIonNozBXUfe/c4V7HL/FVvvHCkfC66rvLvayaQ==} peerDependencies: - "@loaders.gl/core": ^4.3.0 + '@loaders.gl/core': ^4.3.0 - "@loaders.gl/schema@4.3.4": - resolution: - { - integrity: sha512-1YTYoatgzr/6JTxqBLwDiD3AVGwQZheYiQwAimWdRBVB0JAzych7s1yBuE0CVEzj4JDPKOzVAz8KnU1TiBvJGw==, - } + '@loaders.gl/schema@4.3.4': + resolution: {integrity: sha512-1YTYoatgzr/6JTxqBLwDiD3AVGwQZheYiQwAimWdRBVB0JAzych7s1yBuE0CVEzj4JDPKOzVAz8KnU1TiBvJGw==} peerDependencies: - "@loaders.gl/core": ^4.3.0 + '@loaders.gl/core': ^4.3.0 - "@loaders.gl/worker-utils@4.3.4": - resolution: - { - integrity: sha512-EbsszrASgT85GH3B7jkx7YXfQyIYo/rlobwMx6V3ewETapPUwdSAInv+89flnk5n2eu2Lpdeh+2zS6PvqbL2RA==, - } + '@loaders.gl/worker-utils@4.3.4': + resolution: {integrity: sha512-EbsszrASgT85GH3B7jkx7YXfQyIYo/rlobwMx6V3ewETapPUwdSAInv+89flnk5n2eu2Lpdeh+2zS6PvqbL2RA==} peerDependencies: - "@loaders.gl/core": ^4.3.0 - - "@mdx-js/mdx@3.1.0": - resolution: - { - integrity: sha512-/QxEhPAvGwbQmy1Px8F899L5Uc2KZ6JtXwlCgJmjSTBedwOZkByYcBG4GceIGPXRDsmfxhHazuS+hlOShRLeDw==, - } - - "@monaco-editor/loader@1.5.0": - resolution: - { - integrity: sha512-hKoGSM+7aAc7eRTRjpqAZucPmoNOC4UUbknb/VNoTkEIkCPhqV8LfbsgM1webRM7S/z21eHEx9Fkwx8Z/C/+Xw==, - } - - "@monaco-editor/react@4.7.0": - resolution: - { - integrity: sha512-cyzXQCtO47ydzxpQtCGSQGOC8Gk3ZUeBXFAxD+CWXYFo5OqZyZUonFl0DwUlTyAfRHntBfw2p3w4s9R6oe1eCA==, - } + '@loaders.gl/core': ^4.3.0 + + '@mdx-js/mdx@3.1.0': + resolution: {integrity: sha512-/QxEhPAvGwbQmy1Px8F899L5Uc2KZ6JtXwlCgJmjSTBedwOZkByYcBG4GceIGPXRDsmfxhHazuS+hlOShRLeDw==} + + '@monaco-editor/loader@1.5.0': + resolution: {integrity: sha512-hKoGSM+7aAc7eRTRjpqAZucPmoNOC4UUbknb/VNoTkEIkCPhqV8LfbsgM1webRM7S/z21eHEx9Fkwx8Z/C/+Xw==} + + '@monaco-editor/react@4.7.0': + resolution: {integrity: sha512-cyzXQCtO47ydzxpQtCGSQGOC8Gk3ZUeBXFAxD+CWXYFo5OqZyZUonFl0DwUlTyAfRHntBfw2p3w4s9R6oe1eCA==} peerDependencies: - monaco-editor: ">= 0.25.0 < 1" + monaco-editor: '>= 0.25.0 < 1' react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - "@mswjs/interceptors@0.39.6": - resolution: - { - integrity: sha512-bndDP83naYYkfayr/qhBHMhk0YGwS1iv6vaEGcr0SQbO0IZtbOPqjKjds/WcG+bJA+1T5vCx6kprKOzn5Bg+Vw==, - } - engines: { node: ">=18" } - - "@nodelib/fs.scandir@2.1.5": - resolution: - { - integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==, - } - engines: { node: ">= 8" } - - "@nodelib/fs.stat@2.0.5": - resolution: - { - integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==, - } - engines: { node: ">= 8" } - - "@nodelib/fs.walk@1.2.8": - resolution: - { - integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==, - } - engines: { node: ">= 8" } - - "@observablehq/plot@0.6.17": - resolution: - { - integrity: sha512-/qaXP/7mc4MUS0s4cPPFASDRjtsWp85/TbfsciqDgU1HwYixbSbbytNuInD8AcTYC3xaxACgVX06agdfQy9W+g==, - } - engines: { node: ">=12" } - - "@octokit/action@6.1.0": - resolution: - { - integrity: sha512-lo+nHx8kAV86bxvOVOI3vFjX3gXPd/L7guAUbvs3pUvnR2KC+R7yjBkA1uACt4gYhs4LcWP3AXSGQzsbeN2XXw==, - } - engines: { node: ">= 18" } - - "@octokit/auth-action@4.1.0": - resolution: - { - integrity: sha512-m+3t7K46IYyMk7Bl6/lF4Rv09GqDZjYmNg8IWycJ2Fa3YE3DE7vQcV6G2hUPmR9NDqenefNJwVtlisMjzymPiQ==, - } - engines: { node: ">= 18" } - - "@octokit/auth-token@4.0.0": - resolution: - { - integrity: sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==, - } - engines: { node: ">= 18" } - - "@octokit/core@5.2.1": - resolution: - { - integrity: sha512-dKYCMuPO1bmrpuogcjQ8z7ICCH3FP6WmxpwC03yjzGfZhj9fTJg6+bS1+UAplekbN2C+M61UNllGOOoAfGCrdQ==, - } - engines: { node: ">= 18" } - - "@octokit/endpoint@9.0.6": - resolution: - { - integrity: sha512-H1fNTMA57HbkFESSt3Y9+FBICv+0jFceJFPWDePYlR/iMGrwM5ph+Dd4XRQs+8X+PUFURLQgX9ChPfhJ/1uNQw==, - } - engines: { node: ">= 18" } - - "@octokit/graphql@7.1.1": - resolution: - { - integrity: sha512-3mkDltSfcDUoa176nlGoA32RGjeWjl3K7F/BwHwRMJUW/IteSa4bnSV8p2ThNkcIcZU2umkZWxwETSSCJf2Q7g==, - } - engines: { node: ">= 18" } - - "@octokit/openapi-types@20.0.0": - resolution: - { - integrity: sha512-EtqRBEjp1dL/15V7WiX5LJMIxxkdiGJnabzYx5Apx4FkQIFgAfKumXeYAqqJCj1s+BMX4cPFIFC4OLCR6stlnA==, - } - - "@octokit/openapi-types@24.2.0": - resolution: - { - integrity: sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==, - } - - "@octokit/plugin-paginate-rest@9.2.2": - resolution: - { - integrity: sha512-u3KYkGF7GcZnSD/3UP0S7K5XUFT2FkOQdcfXZGZQPGv3lm4F2Xbf71lvjldr8c1H3nNbF+33cLEkWYbokGWqiQ==, - } - engines: { node: ">= 18" } + '@mswjs/interceptors@0.39.6': + resolution: {integrity: sha512-bndDP83naYYkfayr/qhBHMhk0YGwS1iv6vaEGcr0SQbO0IZtbOPqjKjds/WcG+bJA+1T5vCx6kprKOzn5Bg+Vw==} + engines: {node: '>=18'} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@observablehq/plot@0.6.17': + resolution: {integrity: sha512-/qaXP/7mc4MUS0s4cPPFASDRjtsWp85/TbfsciqDgU1HwYixbSbbytNuInD8AcTYC3xaxACgVX06agdfQy9W+g==} + engines: {node: '>=12'} + + '@octokit/action@6.1.0': + resolution: {integrity: sha512-lo+nHx8kAV86bxvOVOI3vFjX3gXPd/L7guAUbvs3pUvnR2KC+R7yjBkA1uACt4gYhs4LcWP3AXSGQzsbeN2XXw==} + engines: {node: '>= 18'} + + '@octokit/auth-action@4.1.0': + resolution: {integrity: sha512-m+3t7K46IYyMk7Bl6/lF4Rv09GqDZjYmNg8IWycJ2Fa3YE3DE7vQcV6G2hUPmR9NDqenefNJwVtlisMjzymPiQ==} + engines: {node: '>= 18'} + + '@octokit/auth-token@4.0.0': + resolution: {integrity: sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==} + engines: {node: '>= 18'} + + '@octokit/core@5.2.1': + resolution: {integrity: sha512-dKYCMuPO1bmrpuogcjQ8z7ICCH3FP6WmxpwC03yjzGfZhj9fTJg6+bS1+UAplekbN2C+M61UNllGOOoAfGCrdQ==} + engines: {node: '>= 18'} + + '@octokit/endpoint@9.0.6': + resolution: {integrity: sha512-H1fNTMA57HbkFESSt3Y9+FBICv+0jFceJFPWDePYlR/iMGrwM5ph+Dd4XRQs+8X+PUFURLQgX9ChPfhJ/1uNQw==} + engines: {node: '>= 18'} + + '@octokit/graphql@7.1.1': + resolution: {integrity: sha512-3mkDltSfcDUoa176nlGoA32RGjeWjl3K7F/BwHwRMJUW/IteSa4bnSV8p2ThNkcIcZU2umkZWxwETSSCJf2Q7g==} + engines: {node: '>= 18'} + + '@octokit/openapi-types@20.0.0': + resolution: {integrity: sha512-EtqRBEjp1dL/15V7WiX5LJMIxxkdiGJnabzYx5Apx4FkQIFgAfKumXeYAqqJCj1s+BMX4cPFIFC4OLCR6stlnA==} + + '@octokit/openapi-types@24.2.0': + resolution: {integrity: sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==} + + '@octokit/plugin-paginate-rest@9.2.2': + resolution: {integrity: sha512-u3KYkGF7GcZnSD/3UP0S7K5XUFT2FkOQdcfXZGZQPGv3lm4F2Xbf71lvjldr8c1H3nNbF+33cLEkWYbokGWqiQ==} + engines: {node: '>= 18'} peerDependencies: - "@octokit/core": "5" - - "@octokit/plugin-rest-endpoint-methods@10.4.1": - resolution: - { - integrity: sha512-xV1b+ceKV9KytQe3zCVqjg+8GTGfDYwaT1ATU5isiUyVtlVAO3HNdzpS4sr4GBx4hxQ46s7ITtZrAsxG22+rVg==, - } - engines: { node: ">= 18" } + '@octokit/core': '5' + + '@octokit/plugin-rest-endpoint-methods@10.4.1': + resolution: {integrity: sha512-xV1b+ceKV9KytQe3zCVqjg+8GTGfDYwaT1ATU5isiUyVtlVAO3HNdzpS4sr4GBx4hxQ46s7ITtZrAsxG22+rVg==} + engines: {node: '>= 18'} peerDependencies: - "@octokit/core": "5" - - "@octokit/request-error@5.1.1": - resolution: - { - integrity: sha512-v9iyEQJH6ZntoENr9/yXxjuezh4My67CBSu9r6Ve/05Iu5gNgnisNWOsoJHTP6k0Rr0+HQIpnH+kyammu90q/g==, - } - engines: { node: ">= 18" } - - "@octokit/request@8.4.1": - resolution: - { - integrity: sha512-qnB2+SY3hkCmBxZsR/MPCybNmbJe4KAlfWErXq+rBKkQJlbjdJeS85VI9r8UqeLYLvnAenU8Q1okM/0MBsAGXw==, - } - engines: { node: ">= 18" } - - "@octokit/types@12.6.0": - resolution: - { - integrity: sha512-1rhSOfRa6H9w4YwK0yrf5faDaDTb+yLyBUKOCV4xtCDB5VmIPqd/v9yr9o6SAzOAlRxMiRiCic6JVM1/kunVkw==, - } - - "@octokit/types@13.10.0": - resolution: - { - integrity: sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==, - } - - "@open-draft/deferred-promise@2.2.0": - resolution: - { - integrity: sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==, - } - - "@open-draft/logger@0.3.0": - resolution: - { - integrity: sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==, - } - - "@open-draft/until@2.1.0": - resolution: - { - integrity: sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==, - } - - "@oslojs/encoding@1.1.0": - resolution: - { - integrity: sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==, - } - - "@pagefind/darwin-arm64@1.3.0": - resolution: - { - integrity: sha512-365BEGl6ChOsauRjyVpBjXybflXAOvoMROw3TucAROHIcdBvXk9/2AmEvGFU0r75+vdQI4LJdJdpH4Y6Yqaj4A==, - } + '@octokit/core': '5' + + '@octokit/request-error@5.1.1': + resolution: {integrity: sha512-v9iyEQJH6ZntoENr9/yXxjuezh4My67CBSu9r6Ve/05Iu5gNgnisNWOsoJHTP6k0Rr0+HQIpnH+kyammu90q/g==} + engines: {node: '>= 18'} + + '@octokit/request@8.4.1': + resolution: {integrity: sha512-qnB2+SY3hkCmBxZsR/MPCybNmbJe4KAlfWErXq+rBKkQJlbjdJeS85VI9r8UqeLYLvnAenU8Q1okM/0MBsAGXw==} + engines: {node: '>= 18'} + + '@octokit/types@12.6.0': + resolution: {integrity: sha512-1rhSOfRa6H9w4YwK0yrf5faDaDTb+yLyBUKOCV4xtCDB5VmIPqd/v9yr9o6SAzOAlRxMiRiCic6JVM1/kunVkw==} + + '@octokit/types@13.10.0': + resolution: {integrity: sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==} + + '@open-draft/deferred-promise@2.2.0': + resolution: {integrity: sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==} + + '@open-draft/logger@0.3.0': + resolution: {integrity: sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==} + + '@open-draft/until@2.1.0': + resolution: {integrity: sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==} + + '@oslojs/encoding@1.1.0': + resolution: {integrity: sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==} + + '@pagefind/darwin-arm64@1.3.0': + resolution: {integrity: sha512-365BEGl6ChOsauRjyVpBjXybflXAOvoMROw3TucAROHIcdBvXk9/2AmEvGFU0r75+vdQI4LJdJdpH4Y6Yqaj4A==} cpu: [arm64] os: [darwin] - "@pagefind/darwin-x64@1.3.0": - resolution: - { - integrity: sha512-zlGHA23uuXmS8z3XxEGmbHpWDxXfPZ47QS06tGUq0HDcZjXjXHeLG+cboOy828QIV5FXsm9MjfkP5e4ZNbOkow==, - } + '@pagefind/darwin-x64@1.3.0': + resolution: {integrity: sha512-zlGHA23uuXmS8z3XxEGmbHpWDxXfPZ47QS06tGUq0HDcZjXjXHeLG+cboOy828QIV5FXsm9MjfkP5e4ZNbOkow==} cpu: [x64] os: [darwin] - "@pagefind/default-ui@1.3.0": - resolution: - { - integrity: sha512-CGKT9ccd3+oRK6STXGgfH+m0DbOKayX6QGlq38TfE1ZfUcPc5+ulTuzDbZUnMo+bubsEOIypm4Pl2iEyzZ1cNg==, - } - - "@pagefind/linux-arm64@1.3.0": - resolution: - { - integrity: sha512-8lsxNAiBRUk72JvetSBXs4WRpYrQrVJXjlRRnOL6UCdBN9Nlsz0t7hWstRk36+JqHpGWOKYiuHLzGYqYAqoOnQ==, - } + '@pagefind/default-ui@1.3.0': + resolution: {integrity: sha512-CGKT9ccd3+oRK6STXGgfH+m0DbOKayX6QGlq38TfE1ZfUcPc5+ulTuzDbZUnMo+bubsEOIypm4Pl2iEyzZ1cNg==} + + '@pagefind/linux-arm64@1.3.0': + resolution: {integrity: sha512-8lsxNAiBRUk72JvetSBXs4WRpYrQrVJXjlRRnOL6UCdBN9Nlsz0t7hWstRk36+JqHpGWOKYiuHLzGYqYAqoOnQ==} cpu: [arm64] os: [linux] - "@pagefind/linux-x64@1.3.0": - resolution: - { - integrity: sha512-hAvqdPJv7A20Ucb6FQGE6jhjqy+vZ6pf+s2tFMNtMBG+fzcdc91uTw7aP/1Vo5plD0dAOHwdxfkyw0ugal4kcQ==, - } + '@pagefind/linux-x64@1.3.0': + resolution: {integrity: sha512-hAvqdPJv7A20Ucb6FQGE6jhjqy+vZ6pf+s2tFMNtMBG+fzcdc91uTw7aP/1Vo5plD0dAOHwdxfkyw0ugal4kcQ==} cpu: [x64] os: [linux] - "@pagefind/windows-x64@1.3.0": - resolution: - { - integrity: sha512-BR1bIRWOMqkf8IoU576YDhij1Wd/Zf2kX/kCI0b2qzCKC8wcc2GQJaaRMCpzvCCrmliO4vtJ6RITp/AnoYUUmQ==, - } + '@pagefind/windows-x64@1.3.0': + resolution: {integrity: sha512-BR1bIRWOMqkf8IoU576YDhij1Wd/Zf2kX/kCI0b2qzCKC8wcc2GQJaaRMCpzvCCrmliO4vtJ6RITp/AnoYUUmQ==} cpu: [x64] os: [win32] - "@pkgjs/parseargs@0.11.0": - resolution: - { - integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==, - } - engines: { node: ">=14" } - - "@polka/url@1.0.0-next.29": - resolution: - { - integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==, - } - - "@prettier/sync@0.5.5": - resolution: - { - integrity: sha512-6BMtNr7aQhyNcGzmumkL0tgr1YQGfm9d7ZdmRpWqWuqpc9vZBind4xMe5NMiRECOhjuSiWHfBWLBnXkpeE90bw==, - } + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@polka/url@1.0.0-next.29': + resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==} + + '@prettier/sync@0.5.5': + resolution: {integrity: sha512-6BMtNr7aQhyNcGzmumkL0tgr1YQGfm9d7ZdmRpWqWuqpc9vZBind4xMe5NMiRECOhjuSiWHfBWLBnXkpeE90bw==} peerDependencies: - prettier: "*" - - "@probe.gl/env@4.1.0": - resolution: - { - integrity: sha512-5ac2Jm2K72VCs4eSMsM7ykVRrV47w32xOGMvcgqn8vQdEMF9PRXyBGYEV9YbqRKWNKpNKmQJVi4AHM/fkCxs9w==, - } - - "@probe.gl/log@4.1.0": - resolution: - { - integrity: sha512-r4gRReNY6f+OZEMgfWEXrAE2qJEt8rX0HsDJQXUBMoc+5H47bdB7f/5HBHAmapK8UydwPKL9wCDoS22rJ0yq7Q==, - } - - "@probe.gl/stats@4.1.0": - resolution: - { - integrity: sha512-EI413MkWKBDVNIfLdqbeNSJTs7ToBz/KVGkwi3D+dQrSIkRI2IYbWGAU3xX+D6+CI4ls8ehxMhNpUVMaZggDvQ==, - } - - "@radix-ui/number@1.1.1": - resolution: - { - integrity: sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==, - } - - "@radix-ui/primitive@1.1.2": - resolution: - { - integrity: sha512-XnbHrrprsNqZKQhStrSwgRUQzoCI1glLzdw79xiZPoofhGICeZRSQ3dIxAKH1gb3OHfNf4d6f+vAv3kil2eggA==, - } - - "@radix-ui/react-arrow@1.1.7": - resolution: - { - integrity: sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==, - } + prettier: '*' + + '@probe.gl/env@4.1.0': + resolution: {integrity: sha512-5ac2Jm2K72VCs4eSMsM7ykVRrV47w32xOGMvcgqn8vQdEMF9PRXyBGYEV9YbqRKWNKpNKmQJVi4AHM/fkCxs9w==} + + '@probe.gl/log@4.1.0': + resolution: {integrity: sha512-r4gRReNY6f+OZEMgfWEXrAE2qJEt8rX0HsDJQXUBMoc+5H47bdB7f/5HBHAmapK8UydwPKL9wCDoS22rJ0yq7Q==} + + '@probe.gl/stats@4.1.0': + resolution: {integrity: sha512-EI413MkWKBDVNIfLdqbeNSJTs7ToBz/KVGkwi3D+dQrSIkRI2IYbWGAU3xX+D6+CI4ls8ehxMhNpUVMaZggDvQ==} + + '@radix-ui/number@1.1.1': + resolution: {integrity: sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==} + + '@radix-ui/primitive@1.1.2': + resolution: {integrity: sha512-XnbHrrprsNqZKQhStrSwgRUQzoCI1glLzdw79xiZPoofhGICeZRSQ3dIxAKH1gb3OHfNf4d6f+vAv3kil2eggA==} + + '@radix-ui/react-arrow@1.1.7': + resolution: {integrity: sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==} peerDependencies: - "@types/react": "*" - "@types/react-dom": "*" + '@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": + '@types/react': optional: true - "@types/react-dom": + '@types/react-dom': optional: true - "@radix-ui/react-collection@1.1.7": - resolution: - { - integrity: sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==, - } + '@radix-ui/react-collection@1.1.7': + resolution: {integrity: sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==} peerDependencies: - "@types/react": "*" - "@types/react-dom": "*" + '@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": + '@types/react': optional: true - "@types/react-dom": + '@types/react-dom': optional: true - "@radix-ui/react-compose-refs@1.1.2": - resolution: - { - integrity: sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==, - } + '@radix-ui/react-compose-refs@1.1.2': + resolution: {integrity: sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==} peerDependencies: - "@types/react": "*" + '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: - "@types/react": + '@types/react': optional: true - "@radix-ui/react-context@1.1.2": - resolution: - { - integrity: sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==, - } + '@radix-ui/react-context@1.1.2': + resolution: {integrity: sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==} peerDependencies: - "@types/react": "*" + '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: - "@types/react": + '@types/react': optional: true - "@radix-ui/react-direction@1.1.1": - resolution: - { - integrity: sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==, - } + '@radix-ui/react-direction@1.1.1': + resolution: {integrity: sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==} peerDependencies: - "@types/react": "*" + '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: - "@types/react": + '@types/react': optional: true - "@radix-ui/react-dismissable-layer@1.1.10": - resolution: - { - integrity: sha512-IM1zzRV4W3HtVgftdQiiOmA0AdJlCtMLe00FXaHwgt3rAnNsIyDqshvkIW3hj/iu5hu8ERP7KIYki6NkqDxAwQ==, - } + '@radix-ui/react-dismissable-layer@1.1.10': + resolution: {integrity: sha512-IM1zzRV4W3HtVgftdQiiOmA0AdJlCtMLe00FXaHwgt3rAnNsIyDqshvkIW3hj/iu5hu8ERP7KIYki6NkqDxAwQ==} peerDependencies: - "@types/react": "*" - "@types/react-dom": "*" + '@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": + '@types/react': optional: true - "@types/react-dom": + '@types/react-dom': optional: true - "@radix-ui/react-focus-guards@1.1.2": - resolution: - { - integrity: sha512-fyjAACV62oPV925xFCrH8DR5xWhg9KYtJT4s3u54jxp+L/hbpTY2kIeEFFbFe+a/HCE94zGQMZLIpVTPVZDhaA==, - } + '@radix-ui/react-focus-guards@1.1.2': + resolution: {integrity: sha512-fyjAACV62oPV925xFCrH8DR5xWhg9KYtJT4s3u54jxp+L/hbpTY2kIeEFFbFe+a/HCE94zGQMZLIpVTPVZDhaA==} peerDependencies: - "@types/react": "*" + '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: - "@types/react": + '@types/react': optional: true - "@radix-ui/react-focus-scope@1.1.7": - resolution: - { - integrity: sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==, - } + '@radix-ui/react-focus-scope@1.1.7': + resolution: {integrity: sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==} peerDependencies: - "@types/react": "*" - "@types/react-dom": "*" + '@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": + '@types/react': optional: true - "@types/react-dom": + '@types/react-dom': optional: true - "@radix-ui/react-id@1.1.1": - resolution: - { - integrity: sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==, - } + '@radix-ui/react-id@1.1.1': + resolution: {integrity: sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==} peerDependencies: - "@types/react": "*" + '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: - "@types/react": + '@types/react': optional: true - "@radix-ui/react-popper@1.2.7": - resolution: - { - integrity: sha512-IUFAccz1JyKcf/RjB552PlWwxjeCJB8/4KxT7EhBHOJM+mN7LdW+B3kacJXILm32xawcMMjb2i0cIZpo+f9kiQ==, - } + '@radix-ui/react-popper@1.2.7': + resolution: {integrity: sha512-IUFAccz1JyKcf/RjB552PlWwxjeCJB8/4KxT7EhBHOJM+mN7LdW+B3kacJXILm32xawcMMjb2i0cIZpo+f9kiQ==} peerDependencies: - "@types/react": "*" - "@types/react-dom": "*" + '@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": + '@types/react': optional: true - "@types/react-dom": + '@types/react-dom': optional: true - "@radix-ui/react-portal@1.1.9": - resolution: - { - integrity: sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==, - } + '@radix-ui/react-portal@1.1.9': + resolution: {integrity: sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==} peerDependencies: - "@types/react": "*" - "@types/react-dom": "*" + '@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": + '@types/react': optional: true - "@types/react-dom": + '@types/react-dom': optional: true - "@radix-ui/react-primitive@2.1.3": - resolution: - { - integrity: sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==, - } + '@radix-ui/react-primitive@2.1.3': + resolution: {integrity: sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==} peerDependencies: - "@types/react": "*" - "@types/react-dom": "*" + '@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": + '@types/react': optional: true - "@types/react-dom": + '@types/react-dom': optional: true - "@radix-ui/react-select@2.2.5": - resolution: - { - integrity: sha512-HnMTdXEVuuyzx63ME0ut4+sEMYW6oouHWNGUZc7ddvUWIcfCva/AMoqEW/3wnEllriMWBa0RHspCYnfCWJQYmA==, - } + '@radix-ui/react-select@2.2.5': + resolution: {integrity: sha512-HnMTdXEVuuyzx63ME0ut4+sEMYW6oouHWNGUZc7ddvUWIcfCva/AMoqEW/3wnEllriMWBa0RHspCYnfCWJQYmA==} peerDependencies: - "@types/react": "*" - "@types/react-dom": "*" + '@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": + '@types/react': optional: true - "@types/react-dom": + '@types/react-dom': optional: true - "@radix-ui/react-slider@1.3.5": - resolution: - { - integrity: sha512-rkfe2pU2NBAYfGaxa3Mqosi7VZEWX5CxKaanRv0vZd4Zhl9fvQrg0VM93dv3xGLGfrHuoTRF3JXH8nb9g+B3fw==, - } + '@radix-ui/react-slider@1.3.5': + resolution: {integrity: sha512-rkfe2pU2NBAYfGaxa3Mqosi7VZEWX5CxKaanRv0vZd4Zhl9fvQrg0VM93dv3xGLGfrHuoTRF3JXH8nb9g+B3fw==} peerDependencies: - "@types/react": "*" - "@types/react-dom": "*" + '@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": + '@types/react': optional: true - "@types/react-dom": + '@types/react-dom': optional: true - "@radix-ui/react-slot@1.2.3": - resolution: - { - integrity: sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==, - } + '@radix-ui/react-slot@1.2.3': + resolution: {integrity: sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==} peerDependencies: - "@types/react": "*" + '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: - "@types/react": + '@types/react': optional: true - "@radix-ui/react-use-callback-ref@1.1.1": - resolution: - { - integrity: sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==, - } + '@radix-ui/react-use-callback-ref@1.1.1': + resolution: {integrity: sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==} peerDependencies: - "@types/react": "*" + '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: - "@types/react": + '@types/react': optional: true - "@radix-ui/react-use-controllable-state@1.2.2": - resolution: - { - integrity: sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==, - } + '@radix-ui/react-use-controllable-state@1.2.2': + resolution: {integrity: sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==} peerDependencies: - "@types/react": "*" + '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: - "@types/react": + '@types/react': optional: true - "@radix-ui/react-use-effect-event@0.0.2": - resolution: - { - integrity: sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==, - } + '@radix-ui/react-use-effect-event@0.0.2': + resolution: {integrity: sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==} peerDependencies: - "@types/react": "*" + '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: - "@types/react": + '@types/react': optional: true - "@radix-ui/react-use-escape-keydown@1.1.1": - resolution: - { - integrity: sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==, - } + '@radix-ui/react-use-escape-keydown@1.1.1': + resolution: {integrity: sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==} peerDependencies: - "@types/react": "*" + '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: - "@types/react": + '@types/react': optional: true - "@radix-ui/react-use-layout-effect@1.1.1": - resolution: - { - integrity: sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==, - } + '@radix-ui/react-use-layout-effect@1.1.1': + resolution: {integrity: sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==} peerDependencies: - "@types/react": "*" + '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: - "@types/react": + '@types/react': optional: true - "@radix-ui/react-use-previous@1.1.1": - resolution: - { - integrity: sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ==, - } + '@radix-ui/react-use-previous@1.1.1': + resolution: {integrity: sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ==} peerDependencies: - "@types/react": "*" + '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: - "@types/react": + '@types/react': optional: true - "@radix-ui/react-use-rect@1.1.1": - resolution: - { - integrity: sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==, - } + '@radix-ui/react-use-rect@1.1.1': + resolution: {integrity: sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==} peerDependencies: - "@types/react": "*" + '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: - "@types/react": + '@types/react': optional: true - "@radix-ui/react-use-size@1.1.1": - resolution: - { - integrity: sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==, - } + '@radix-ui/react-use-size@1.1.1': + resolution: {integrity: sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==} peerDependencies: - "@types/react": "*" + '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: - "@types/react": + '@types/react': optional: true - "@radix-ui/react-visually-hidden@1.2.3": - resolution: - { - integrity: sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug==, - } + '@radix-ui/react-visually-hidden@1.2.3': + resolution: {integrity: sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug==} peerDependencies: - "@types/react": "*" - "@types/react-dom": "*" + '@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": + '@types/react': optional: true - "@types/react-dom": + '@types/react-dom': optional: true - "@radix-ui/rect@1.1.1": - resolution: - { - integrity: sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==, - } - - "@rolldown/pluginutils@1.0.0-beta.27": - resolution: - { - integrity: sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==, - } - - "@rollup/plugin-alias@5.1.1": - resolution: - { - integrity: sha512-PR9zDb+rOzkRb2VD+EuKB7UC41vU5DIwZ5qqCpk0KJudcWAyi8rvYOhS7+L5aZCspw1stTViLgN5v6FF1p5cgQ==, - } - engines: { node: ">=14.0.0" } + '@radix-ui/rect@1.1.1': + resolution: {integrity: sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==} + + '@rolldown/pluginutils@1.0.0-beta.27': + resolution: {integrity: sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==} + + '@rollup/plugin-alias@5.1.1': + resolution: {integrity: sha512-PR9zDb+rOzkRb2VD+EuKB7UC41vU5DIwZ5qqCpk0KJudcWAyi8rvYOhS7+L5aZCspw1stTViLgN5v6FF1p5cgQ==} + engines: {node: '>=14.0.0'} peerDependencies: rollup: 4.34.8 peerDependenciesMeta: rollup: optional: true - "@rollup/plugin-commonjs@28.0.3": - resolution: - { - integrity: sha512-pyltgilam1QPdn+Zd9gaCfOLcnjMEJ9gV+bTw6/r73INdvzf1ah9zLIJBm+kW7R6IUFIQ1YO+VqZtYxZNWFPEQ==, - } - engines: { node: ">=16.0.0 || 14 >= 14.17" } + '@rollup/plugin-commonjs@28.0.3': + resolution: {integrity: sha512-pyltgilam1QPdn+Zd9gaCfOLcnjMEJ9gV+bTw6/r73INdvzf1ah9zLIJBm+kW7R6IUFIQ1YO+VqZtYxZNWFPEQ==} + engines: {node: '>=16.0.0 || 14 >= 14.17'} peerDependencies: rollup: 4.34.8 peerDependenciesMeta: rollup: optional: true - "@rollup/plugin-json@6.1.0": - resolution: - { - integrity: sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==, - } - engines: { node: ">=14.0.0" } + '@rollup/plugin-json@6.1.0': + resolution: {integrity: sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==} + engines: {node: '>=14.0.0'} peerDependencies: rollup: 4.34.8 peerDependenciesMeta: rollup: optional: true - "@rollup/plugin-node-resolve@16.0.1": - resolution: - { - integrity: sha512-tk5YCxJWIG81umIvNkSod2qK5KyQW19qcBF/B78n1bjtOON6gzKoVeSzAE8yHCZEDmqkHKkxplExA8KzdJLJpA==, - } - engines: { node: ">=14.0.0" } + '@rollup/plugin-node-resolve@16.0.1': + resolution: {integrity: sha512-tk5YCxJWIG81umIvNkSod2qK5KyQW19qcBF/B78n1bjtOON6gzKoVeSzAE8yHCZEDmqkHKkxplExA8KzdJLJpA==} + engines: {node: '>=14.0.0'} peerDependencies: rollup: 4.34.8 peerDependenciesMeta: rollup: optional: true - "@rollup/plugin-replace@6.0.2": - resolution: - { - integrity: sha512-7QaYCf8bqF04dOy7w/eHmJeNExxTYwvKAmlSAH/EaWWUzbT0h5sbF6bktFoX/0F/0qwng5/dWFMyf3gzaM8DsQ==, - } - engines: { node: ">=14.0.0" } + '@rollup/plugin-replace@6.0.2': + resolution: {integrity: sha512-7QaYCf8bqF04dOy7w/eHmJeNExxTYwvKAmlSAH/EaWWUzbT0h5sbF6bktFoX/0F/0qwng5/dWFMyf3gzaM8DsQ==} + engines: {node: '>=14.0.0'} peerDependencies: rollup: 4.34.8 peerDependenciesMeta: rollup: optional: true - "@rollup/plugin-virtual@3.0.2": - resolution: - { - integrity: sha512-10monEYsBp3scM4/ND4LNH5Rxvh3e/cVeL3jWTgZ2SrQ+BmUoQcopVQvnaMcOnykb1VkxUFuDAN+0FnpTFRy2A==, - } - engines: { node: ">=14.0.0" } + '@rollup/plugin-virtual@3.0.2': + resolution: {integrity: sha512-10monEYsBp3scM4/ND4LNH5Rxvh3e/cVeL3jWTgZ2SrQ+BmUoQcopVQvnaMcOnykb1VkxUFuDAN+0FnpTFRy2A==} + engines: {node: '>=14.0.0'} peerDependencies: rollup: 4.34.8 peerDependenciesMeta: rollup: optional: true - "@rollup/pluginutils@5.2.0": - resolution: - { - integrity: sha512-qWJ2ZTbmumwiLFomfzTyt5Kng4hwPi9rwCYN4SHb6eaRU1KNO4ccxINHr/VhH4GgPlt1XfSTLX2LBTme8ne4Zw==, - } - engines: { node: ">=14.0.0" } + '@rollup/pluginutils@5.2.0': + resolution: {integrity: sha512-qWJ2ZTbmumwiLFomfzTyt5Kng4hwPi9rwCYN4SHb6eaRU1KNO4ccxINHr/VhH4GgPlt1XfSTLX2LBTme8ne4Zw==} + engines: {node: '>=14.0.0'} peerDependencies: rollup: 4.34.8 peerDependenciesMeta: rollup: optional: true - "@rollup/pluginutils@5.3.0": - resolution: - { - integrity: sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==, - } - engines: { node: ">=14.0.0" } + '@rollup/pluginutils@5.3.0': + resolution: {integrity: sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==} + engines: {node: '>=14.0.0'} peerDependencies: rollup: 4.34.8 peerDependenciesMeta: rollup: optional: true - "@rollup/rollup-android-arm-eabi@4.34.8": - resolution: - { - integrity: sha512-q217OSE8DTp8AFHuNHXo0Y86e1wtlfVrXiAlwkIvGRQv9zbc6mE3sjIVfwI8sYUyNxwOg0j/Vm1RKM04JcWLJw==, - } + '@rollup/rollup-android-arm-eabi@4.34.8': + resolution: {integrity: sha512-q217OSE8DTp8AFHuNHXo0Y86e1wtlfVrXiAlwkIvGRQv9zbc6mE3sjIVfwI8sYUyNxwOg0j/Vm1RKM04JcWLJw==} cpu: [arm] os: [android] - "@rollup/rollup-android-arm64@4.34.8": - resolution: - { - integrity: sha512-Gigjz7mNWaOL9wCggvoK3jEIUUbGul656opstjaUSGC3eT0BM7PofdAJaBfPFWWkXNVAXbaQtC99OCg4sJv70Q==, - } + '@rollup/rollup-android-arm64@4.34.8': + resolution: {integrity: sha512-Gigjz7mNWaOL9wCggvoK3jEIUUbGul656opstjaUSGC3eT0BM7PofdAJaBfPFWWkXNVAXbaQtC99OCg4sJv70Q==} cpu: [arm64] os: [android] - "@rollup/rollup-darwin-arm64@4.34.8": - resolution: - { - integrity: sha512-02rVdZ5tgdUNRxIUrFdcMBZQoaPMrxtwSb+/hOfBdqkatYHR3lZ2A2EGyHq2sGOd0Owk80oV3snlDASC24He3Q==, - } + '@rollup/rollup-darwin-arm64@4.34.8': + resolution: {integrity: sha512-02rVdZ5tgdUNRxIUrFdcMBZQoaPMrxtwSb+/hOfBdqkatYHR3lZ2A2EGyHq2sGOd0Owk80oV3snlDASC24He3Q==} cpu: [arm64] os: [darwin] - "@rollup/rollup-darwin-x64@4.34.8": - resolution: - { - integrity: sha512-qIP/elwR/tq/dYRx3lgwK31jkZvMiD6qUtOycLhTzCvrjbZ3LjQnEM9rNhSGpbLXVJYQ3rq39A6Re0h9tU2ynw==, - } + '@rollup/rollup-darwin-x64@4.34.8': + resolution: {integrity: sha512-qIP/elwR/tq/dYRx3lgwK31jkZvMiD6qUtOycLhTzCvrjbZ3LjQnEM9rNhSGpbLXVJYQ3rq39A6Re0h9tU2ynw==} cpu: [x64] os: [darwin] - "@rollup/rollup-freebsd-arm64@4.34.8": - resolution: - { - integrity: sha512-IQNVXL9iY6NniYbTaOKdrlVP3XIqazBgJOVkddzJlqnCpRi/yAeSOa8PLcECFSQochzqApIOE1GHNu3pCz+BDA==, - } + '@rollup/rollup-freebsd-arm64@4.34.8': + resolution: {integrity: sha512-IQNVXL9iY6NniYbTaOKdrlVP3XIqazBgJOVkddzJlqnCpRi/yAeSOa8PLcECFSQochzqApIOE1GHNu3pCz+BDA==} cpu: [arm64] os: [freebsd] - "@rollup/rollup-freebsd-x64@4.34.8": - resolution: - { - integrity: sha512-TYXcHghgnCqYFiE3FT5QwXtOZqDj5GmaFNTNt3jNC+vh22dc/ukG2cG+pi75QO4kACohZzidsq7yKTKwq/Jq7Q==, - } + '@rollup/rollup-freebsd-x64@4.34.8': + resolution: {integrity: sha512-TYXcHghgnCqYFiE3FT5QwXtOZqDj5GmaFNTNt3jNC+vh22dc/ukG2cG+pi75QO4kACohZzidsq7yKTKwq/Jq7Q==} cpu: [x64] os: [freebsd] - "@rollup/rollup-linux-arm-gnueabihf@4.34.8": - resolution: - { - integrity: sha512-A4iphFGNkWRd+5m3VIGuqHnG3MVnqKe7Al57u9mwgbyZ2/xF9Jio72MaY7xxh+Y87VAHmGQr73qoKL9HPbXj1g==, - } + '@rollup/rollup-linux-arm-gnueabihf@4.34.8': + resolution: {integrity: sha512-A4iphFGNkWRd+5m3VIGuqHnG3MVnqKe7Al57u9mwgbyZ2/xF9Jio72MaY7xxh+Y87VAHmGQr73qoKL9HPbXj1g==} cpu: [arm] os: [linux] - "@rollup/rollup-linux-arm-musleabihf@4.34.8": - resolution: - { - integrity: sha512-S0lqKLfTm5u+QTxlFiAnb2J/2dgQqRy/XvziPtDd1rKZFXHTyYLoVL58M/XFwDI01AQCDIevGLbQrMAtdyanpA==, - } + '@rollup/rollup-linux-arm-musleabihf@4.34.8': + resolution: {integrity: sha512-S0lqKLfTm5u+QTxlFiAnb2J/2dgQqRy/XvziPtDd1rKZFXHTyYLoVL58M/XFwDI01AQCDIevGLbQrMAtdyanpA==} cpu: [arm] os: [linux] - "@rollup/rollup-linux-arm64-gnu@4.34.8": - resolution: - { - integrity: sha512-jpz9YOuPiSkL4G4pqKrus0pn9aYwpImGkosRKwNi+sJSkz+WU3anZe6hi73StLOQdfXYXC7hUfsQlTnjMd3s1A==, - } + '@rollup/rollup-linux-arm64-gnu@4.34.8': + resolution: {integrity: sha512-jpz9YOuPiSkL4G4pqKrus0pn9aYwpImGkosRKwNi+sJSkz+WU3anZe6hi73StLOQdfXYXC7hUfsQlTnjMd3s1A==} cpu: [arm64] os: [linux] - "@rollup/rollup-linux-arm64-musl@4.34.8": - resolution: - { - integrity: sha512-KdSfaROOUJXgTVxJNAZ3KwkRc5nggDk+06P6lgi1HLv1hskgvxHUKZ4xtwHkVYJ1Rep4GNo+uEfycCRRxht7+Q==, - } + '@rollup/rollup-linux-arm64-musl@4.34.8': + resolution: {integrity: sha512-KdSfaROOUJXgTVxJNAZ3KwkRc5nggDk+06P6lgi1HLv1hskgvxHUKZ4xtwHkVYJ1Rep4GNo+uEfycCRRxht7+Q==} cpu: [arm64] os: [linux] - "@rollup/rollup-linux-loongarch64-gnu@4.34.8": - resolution: - { - integrity: sha512-NyF4gcxwkMFRjgXBM6g2lkT58OWztZvw5KkV2K0qqSnUEqCVcqdh2jN4gQrTn/YUpAcNKyFHfoOZEer9nwo6uQ==, - } + '@rollup/rollup-linux-loongarch64-gnu@4.34.8': + resolution: {integrity: sha512-NyF4gcxwkMFRjgXBM6g2lkT58OWztZvw5KkV2K0qqSnUEqCVcqdh2jN4gQrTn/YUpAcNKyFHfoOZEer9nwo6uQ==} cpu: [loong64] os: [linux] - "@rollup/rollup-linux-powerpc64le-gnu@4.34.8": - resolution: - { - integrity: sha512-LMJc999GkhGvktHU85zNTDImZVUCJ1z/MbAJTnviiWmmjyckP5aQsHtcujMjpNdMZPT2rQEDBlJfubhs3jsMfw==, - } + '@rollup/rollup-linux-powerpc64le-gnu@4.34.8': + resolution: {integrity: sha512-LMJc999GkhGvktHU85zNTDImZVUCJ1z/MbAJTnviiWmmjyckP5aQsHtcujMjpNdMZPT2rQEDBlJfubhs3jsMfw==} cpu: [ppc64] os: [linux] - "@rollup/rollup-linux-riscv64-gnu@4.34.8": - resolution: - { - integrity: sha512-xAQCAHPj8nJq1PI3z8CIZzXuXCstquz7cIOL73HHdXiRcKk8Ywwqtx2wrIy23EcTn4aZ2fLJNBB8d0tQENPCmw==, - } + '@rollup/rollup-linux-riscv64-gnu@4.34.8': + resolution: {integrity: sha512-xAQCAHPj8nJq1PI3z8CIZzXuXCstquz7cIOL73HHdXiRcKk8Ywwqtx2wrIy23EcTn4aZ2fLJNBB8d0tQENPCmw==} cpu: [riscv64] os: [linux] - "@rollup/rollup-linux-s390x-gnu@4.34.8": - resolution: - { - integrity: sha512-DdePVk1NDEuc3fOe3dPPTb+rjMtuFw89gw6gVWxQFAuEqqSdDKnrwzZHrUYdac7A7dXl9Q2Vflxpme15gUWQFA==, - } + '@rollup/rollup-linux-s390x-gnu@4.34.8': + resolution: {integrity: sha512-DdePVk1NDEuc3fOe3dPPTb+rjMtuFw89gw6gVWxQFAuEqqSdDKnrwzZHrUYdac7A7dXl9Q2Vflxpme15gUWQFA==} cpu: [s390x] os: [linux] - "@rollup/rollup-linux-x64-gnu@4.34.8": - resolution: - { - integrity: sha512-8y7ED8gjxITUltTUEJLQdgpbPh1sUQ0kMTmufRF/Ns5tI9TNMNlhWtmPKKHCU0SilX+3MJkZ0zERYYGIVBYHIA==, - } + '@rollup/rollup-linux-x64-gnu@4.34.8': + resolution: {integrity: sha512-8y7ED8gjxITUltTUEJLQdgpbPh1sUQ0kMTmufRF/Ns5tI9TNMNlhWtmPKKHCU0SilX+3MJkZ0zERYYGIVBYHIA==} cpu: [x64] os: [linux] - "@rollup/rollup-linux-x64-musl@4.34.8": - resolution: - { - integrity: sha512-SCXcP0ZpGFIe7Ge+McxY5zKxiEI5ra+GT3QRxL0pMMtxPfpyLAKleZODi1zdRHkz5/BhueUrYtYVgubqe9JBNQ==, - } + '@rollup/rollup-linux-x64-musl@4.34.8': + resolution: {integrity: sha512-SCXcP0ZpGFIe7Ge+McxY5zKxiEI5ra+GT3QRxL0pMMtxPfpyLAKleZODi1zdRHkz5/BhueUrYtYVgubqe9JBNQ==} cpu: [x64] os: [linux] - "@rollup/rollup-win32-arm64-msvc@4.34.8": - resolution: - { - integrity: sha512-YHYsgzZgFJzTRbth4h7Or0m5O74Yda+hLin0irAIobkLQFRQd1qWmnoVfwmKm9TXIZVAD0nZ+GEb2ICicLyCnQ==, - } + '@rollup/rollup-win32-arm64-msvc@4.34.8': + resolution: {integrity: sha512-YHYsgzZgFJzTRbth4h7Or0m5O74Yda+hLin0irAIobkLQFRQd1qWmnoVfwmKm9TXIZVAD0nZ+GEb2ICicLyCnQ==} cpu: [arm64] os: [win32] - "@rollup/rollup-win32-ia32-msvc@4.34.8": - resolution: - { - integrity: sha512-r3NRQrXkHr4uWy5TOjTpTYojR9XmF0j/RYgKCef+Ag46FWUTltm5ziticv8LdNsDMehjJ543x/+TJAek/xBA2w==, - } + '@rollup/rollup-win32-ia32-msvc@4.34.8': + resolution: {integrity: sha512-r3NRQrXkHr4uWy5TOjTpTYojR9XmF0j/RYgKCef+Ag46FWUTltm5ziticv8LdNsDMehjJ543x/+TJAek/xBA2w==} cpu: [ia32] os: [win32] - "@rollup/rollup-win32-x64-msvc@4.34.8": - resolution: - { - integrity: sha512-U0FaE5O1BCpZSeE6gBl3c5ObhePQSfk9vDRToMmTkbhCOgW4jqvtS5LGyQ76L1fH8sM0keRp4uDTsbjiUyjk0g==, - } + '@rollup/rollup-win32-x64-msvc@4.34.8': + resolution: {integrity: sha512-U0FaE5O1BCpZSeE6gBl3c5ObhePQSfk9vDRToMmTkbhCOgW4jqvtS5LGyQ76L1fH8sM0keRp4uDTsbjiUyjk0g==} cpu: [x64] os: [win32] - "@sec-ant/readable-stream@0.4.1": - resolution: - { - integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==, - } - - "@shikijs/core@3.12.2": - resolution: - { - integrity: sha512-L1Safnhra3tX/oJK5kYHaWmLEBJi1irASwewzY3taX5ibyXyMkkSDZlq01qigjryOBwrXSdFgTiZ3ryzSNeu7Q==, - } - - "@shikijs/engine-javascript@3.12.2": - resolution: - { - integrity: sha512-Nm3/azSsaVS7hk6EwtHEnTythjQfwvrO5tKqMlaH9TwG1P+PNaR8M0EAKZ+GaH2DFwvcr4iSfTveyxMIvXEHMw==, - } - - "@shikijs/engine-oniguruma@3.12.2": - resolution: - { - integrity: sha512-hozwnFHsLvujK4/CPVHNo3Bcg2EsnG8krI/ZQ2FlBlCRpPZW4XAEQmEwqegJsypsTAN9ehu2tEYe30lYKSZW/w==, - } - - "@shikijs/engine-oniguruma@3.13.0": - resolution: - { - integrity: sha512-O42rBGr4UDSlhT2ZFMxqM7QzIU+IcpoTMzb3W7AlziI1ZF7R8eS2M0yt5Ry35nnnTX/LTLXFPUjRFCIW+Operg==, - } - - "@shikijs/langs@3.12.2": - resolution: - { - integrity: sha512-bVx5PfuZHDSHoBal+KzJZGheFuyH4qwwcwG/n+MsWno5cTlKmaNtTsGzJpHYQ8YPbB5BdEdKU1rga5/6JGY8ww==, - } - - "@shikijs/langs@3.13.0": - resolution: - { - integrity: sha512-672c3WAETDYHwrRP0yLy3W1QYB89Hbpj+pO4KhxK6FzIrDI2FoEXNiNCut6BQmEApYLfuYfpgOZaqbY+E9b8wQ==, - } - - "@shikijs/themes@3.12.2": - resolution: - { - integrity: sha512-fTR3QAgnwYpfGczpIbzPjlRnxyONJOerguQv1iwpyQZ9QXX4qy/XFQqXlf17XTsorxnHoJGbH/LXBvwtqDsF5A==, - } - - "@shikijs/themes@3.13.0": - resolution: - { - integrity: sha512-Vxw1Nm1/Od8jyA7QuAenaV78BG2nSr3/gCGdBkLpfLscddCkzkL36Q5b67SrLLfvAJTOUzW39x4FHVCFriPVgg==, - } - - "@shikijs/types@3.12.2": - resolution: - { - integrity: sha512-K5UIBzxCyv0YoxN3LMrKB9zuhp1bV+LgewxuVwHdl4Gz5oePoUFrr9EfgJlGlDeXCU1b/yhdnXeuRvAnz8HN8Q==, - } - - "@shikijs/types@3.13.0": - resolution: - { - integrity: sha512-oM9P+NCFri/mmQ8LoFGVfVyemm5Hi27330zuOBp0annwJdKH1kOLndw3zCtAVDehPLg9fKqoEx3Ht/wNZxolfw==, - } - - "@shikijs/vscode-textmate@10.0.2": - resolution: - { - integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==, - } - - "@sindresorhus/merge-streams@4.0.0": - resolution: - { - integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==, - } - engines: { node: ">=18" } - - "@stackblitz/sdk@1.11.0": - resolution: - { - integrity: sha512-DFQGANNkEZRzFk1/rDP6TcFdM82ycHE+zfl9C/M/jXlH68jiqHWHFMQURLELoD8koxvu/eW5uhg94NSAZlYrUQ==, - } - - "@swc/helpers@0.5.17": - resolution: - { - integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==, - } - - "@tailwindcss/node@4.1.13": - resolution: - { - integrity: sha512-eq3ouolC1oEFOAvOMOBAmfCIqZBJuvWvvYWh5h5iOYfe1HFC6+GZ6EIL0JdM3/niGRJmnrOc+8gl9/HGUaaptw==, - } - - "@tailwindcss/oxide-android-arm64@4.1.13": - resolution: - { - integrity: sha512-BrpTrVYyejbgGo57yc8ieE+D6VT9GOgnNdmh5Sac6+t0m+v+sKQevpFVpwX3pBrM2qKrQwJ0c5eDbtjouY/+ew==, - } - engines: { node: ">= 10" } + '@sec-ant/readable-stream@0.4.1': + resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} + + '@shikijs/core@3.12.2': + resolution: {integrity: sha512-L1Safnhra3tX/oJK5kYHaWmLEBJi1irASwewzY3taX5ibyXyMkkSDZlq01qigjryOBwrXSdFgTiZ3ryzSNeu7Q==} + + '@shikijs/engine-javascript@3.12.2': + resolution: {integrity: sha512-Nm3/azSsaVS7hk6EwtHEnTythjQfwvrO5tKqMlaH9TwG1P+PNaR8M0EAKZ+GaH2DFwvcr4iSfTveyxMIvXEHMw==} + + '@shikijs/engine-oniguruma@3.12.2': + resolution: {integrity: sha512-hozwnFHsLvujK4/CPVHNo3Bcg2EsnG8krI/ZQ2FlBlCRpPZW4XAEQmEwqegJsypsTAN9ehu2tEYe30lYKSZW/w==} + + '@shikijs/engine-oniguruma@3.13.0': + resolution: {integrity: sha512-O42rBGr4UDSlhT2ZFMxqM7QzIU+IcpoTMzb3W7AlziI1ZF7R8eS2M0yt5Ry35nnnTX/LTLXFPUjRFCIW+Operg==} + + '@shikijs/langs@3.12.2': + resolution: {integrity: sha512-bVx5PfuZHDSHoBal+KzJZGheFuyH4qwwcwG/n+MsWno5cTlKmaNtTsGzJpHYQ8YPbB5BdEdKU1rga5/6JGY8ww==} + + '@shikijs/langs@3.13.0': + resolution: {integrity: sha512-672c3WAETDYHwrRP0yLy3W1QYB89Hbpj+pO4KhxK6FzIrDI2FoEXNiNCut6BQmEApYLfuYfpgOZaqbY+E9b8wQ==} + + '@shikijs/themes@3.12.2': + resolution: {integrity: sha512-fTR3QAgnwYpfGczpIbzPjlRnxyONJOerguQv1iwpyQZ9QXX4qy/XFQqXlf17XTsorxnHoJGbH/LXBvwtqDsF5A==} + + '@shikijs/themes@3.13.0': + resolution: {integrity: sha512-Vxw1Nm1/Od8jyA7QuAenaV78BG2nSr3/gCGdBkLpfLscddCkzkL36Q5b67SrLLfvAJTOUzW39x4FHVCFriPVgg==} + + '@shikijs/types@3.12.2': + resolution: {integrity: sha512-K5UIBzxCyv0YoxN3LMrKB9zuhp1bV+LgewxuVwHdl4Gz5oePoUFrr9EfgJlGlDeXCU1b/yhdnXeuRvAnz8HN8Q==} + + '@shikijs/types@3.13.0': + resolution: {integrity: sha512-oM9P+NCFri/mmQ8LoFGVfVyemm5Hi27330zuOBp0annwJdKH1kOLndw3zCtAVDehPLg9fKqoEx3Ht/wNZxolfw==} + + '@shikijs/vscode-textmate@10.0.2': + resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} + + '@sindresorhus/merge-streams@4.0.0': + resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} + engines: {node: '>=18'} + + '@stackblitz/sdk@1.11.0': + resolution: {integrity: sha512-DFQGANNkEZRzFk1/rDP6TcFdM82ycHE+zfl9C/M/jXlH68jiqHWHFMQURLELoD8koxvu/eW5uhg94NSAZlYrUQ==} + + '@swc/helpers@0.5.17': + resolution: {integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==} + + '@tailwindcss/node@4.1.13': + resolution: {integrity: sha512-eq3ouolC1oEFOAvOMOBAmfCIqZBJuvWvvYWh5h5iOYfe1HFC6+GZ6EIL0JdM3/niGRJmnrOc+8gl9/HGUaaptw==} + + '@tailwindcss/oxide-android-arm64@4.1.13': + resolution: {integrity: sha512-BrpTrVYyejbgGo57yc8ieE+D6VT9GOgnNdmh5Sac6+t0m+v+sKQevpFVpwX3pBrM2qKrQwJ0c5eDbtjouY/+ew==} + engines: {node: '>= 10'} cpu: [arm64] os: [android] - "@tailwindcss/oxide-darwin-arm64@4.1.13": - resolution: - { - integrity: sha512-YP+Jksc4U0KHcu76UhRDHq9bx4qtBftp9ShK/7UGfq0wpaP96YVnnjFnj3ZFrUAjc5iECzODl/Ts0AN7ZPOANQ==, - } - engines: { node: ">= 10" } + '@tailwindcss/oxide-darwin-arm64@4.1.13': + resolution: {integrity: sha512-YP+Jksc4U0KHcu76UhRDHq9bx4qtBftp9ShK/7UGfq0wpaP96YVnnjFnj3ZFrUAjc5iECzODl/Ts0AN7ZPOANQ==} + engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - "@tailwindcss/oxide-darwin-x64@4.1.13": - resolution: - { - integrity: sha512-aAJ3bbwrn/PQHDxCto9sxwQfT30PzyYJFG0u/BWZGeVXi5Hx6uuUOQEI2Fa43qvmUjTRQNZnGqe9t0Zntexeuw==, - } - engines: { node: ">= 10" } + '@tailwindcss/oxide-darwin-x64@4.1.13': + resolution: {integrity: sha512-aAJ3bbwrn/PQHDxCto9sxwQfT30PzyYJFG0u/BWZGeVXi5Hx6uuUOQEI2Fa43qvmUjTRQNZnGqe9t0Zntexeuw==} + engines: {node: '>= 10'} cpu: [x64] os: [darwin] - "@tailwindcss/oxide-freebsd-x64@4.1.13": - resolution: - { - integrity: sha512-Wt8KvASHwSXhKE/dJLCCWcTSVmBj3xhVhp/aF3RpAhGeZ3sVo7+NTfgiN8Vey/Fi8prRClDs6/f0KXPDTZE6nQ==, - } - engines: { node: ">= 10" } + '@tailwindcss/oxide-freebsd-x64@4.1.13': + resolution: {integrity: sha512-Wt8KvASHwSXhKE/dJLCCWcTSVmBj3xhVhp/aF3RpAhGeZ3sVo7+NTfgiN8Vey/Fi8prRClDs6/f0KXPDTZE6nQ==} + engines: {node: '>= 10'} cpu: [x64] os: [freebsd] - "@tailwindcss/oxide-linux-arm-gnueabihf@4.1.13": - resolution: - { - integrity: sha512-mbVbcAsW3Gkm2MGwA93eLtWrwajz91aXZCNSkGTx/R5eb6KpKD5q8Ueckkh9YNboU8RH7jiv+ol/I7ZyQ9H7Bw==, - } - engines: { node: ">= 10" } + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.13': + resolution: {integrity: sha512-mbVbcAsW3Gkm2MGwA93eLtWrwajz91aXZCNSkGTx/R5eb6KpKD5q8Ueckkh9YNboU8RH7jiv+ol/I7ZyQ9H7Bw==} + engines: {node: '>= 10'} cpu: [arm] os: [linux] - "@tailwindcss/oxide-linux-arm64-gnu@4.1.13": - resolution: - { - integrity: sha512-wdtfkmpXiwej/yoAkrCP2DNzRXCALq9NVLgLELgLim1QpSfhQM5+ZxQQF8fkOiEpuNoKLp4nKZ6RC4kmeFH0HQ==, - } - engines: { node: ">= 10" } + '@tailwindcss/oxide-linux-arm64-gnu@4.1.13': + resolution: {integrity: sha512-wdtfkmpXiwej/yoAkrCP2DNzRXCALq9NVLgLELgLim1QpSfhQM5+ZxQQF8fkOiEpuNoKLp4nKZ6RC4kmeFH0HQ==} + engines: {node: '>= 10'} cpu: [arm64] os: [linux] - "@tailwindcss/oxide-linux-arm64-musl@4.1.13": - resolution: - { - integrity: sha512-hZQrmtLdhyqzXHB7mkXfq0IYbxegaqTmfa1p9MBj72WPoDD3oNOh1Lnxf6xZLY9C3OV6qiCYkO1i/LrzEdW2mg==, - } - engines: { node: ">= 10" } + '@tailwindcss/oxide-linux-arm64-musl@4.1.13': + resolution: {integrity: sha512-hZQrmtLdhyqzXHB7mkXfq0IYbxegaqTmfa1p9MBj72WPoDD3oNOh1Lnxf6xZLY9C3OV6qiCYkO1i/LrzEdW2mg==} + engines: {node: '>= 10'} cpu: [arm64] os: [linux] - "@tailwindcss/oxide-linux-x64-gnu@4.1.13": - resolution: - { - integrity: sha512-uaZTYWxSXyMWDJZNY1Ul7XkJTCBRFZ5Fo6wtjrgBKzZLoJNrG+WderJwAjPzuNZOnmdrVg260DKwXCFtJ/hWRQ==, - } - engines: { node: ">= 10" } + '@tailwindcss/oxide-linux-x64-gnu@4.1.13': + resolution: {integrity: sha512-uaZTYWxSXyMWDJZNY1Ul7XkJTCBRFZ5Fo6wtjrgBKzZLoJNrG+WderJwAjPzuNZOnmdrVg260DKwXCFtJ/hWRQ==} + engines: {node: '>= 10'} cpu: [x64] os: [linux] - "@tailwindcss/oxide-linux-x64-musl@4.1.13": - resolution: - { - integrity: sha512-oXiPj5mi4Hdn50v5RdnuuIms0PVPI/EG4fxAfFiIKQh5TgQgX7oSuDWntHW7WNIi/yVLAiS+CRGW4RkoGSSgVQ==, - } - engines: { node: ">= 10" } + '@tailwindcss/oxide-linux-x64-musl@4.1.13': + resolution: {integrity: sha512-oXiPj5mi4Hdn50v5RdnuuIms0PVPI/EG4fxAfFiIKQh5TgQgX7oSuDWntHW7WNIi/yVLAiS+CRGW4RkoGSSgVQ==} + engines: {node: '>= 10'} cpu: [x64] os: [linux] - "@tailwindcss/oxide-wasm32-wasi@4.1.13": - resolution: - { - integrity: sha512-+LC2nNtPovtrDwBc/nqnIKYh/W2+R69FA0hgoeOn64BdCX522u19ryLh3Vf3F8W49XBcMIxSe665kwy21FkhvA==, - } - engines: { node: ">=14.0.0" } + '@tailwindcss/oxide-wasm32-wasi@4.1.13': + resolution: {integrity: sha512-+LC2nNtPovtrDwBc/nqnIKYh/W2+R69FA0hgoeOn64BdCX522u19ryLh3Vf3F8W49XBcMIxSe665kwy21FkhvA==} + engines: {node: '>=14.0.0'} cpu: [wasm32] bundledDependencies: - - "@napi-rs/wasm-runtime" - - "@emnapi/core" - - "@emnapi/runtime" - - "@tybys/wasm-util" - - "@emnapi/wasi-threads" + - '@napi-rs/wasm-runtime' + - '@emnapi/core' + - '@emnapi/runtime' + - '@tybys/wasm-util' + - '@emnapi/wasi-threads' - tslib - "@tailwindcss/oxide-win32-arm64-msvc@4.1.13": - resolution: - { - integrity: sha512-dziTNeQXtoQ2KBXmrjCxsuPk3F3CQ/yb7ZNZNA+UkNTeiTGgfeh+gH5Pi7mRncVgcPD2xgHvkFCh/MhZWSgyQg==, - } - engines: { node: ">= 10" } + '@tailwindcss/oxide-win32-arm64-msvc@4.1.13': + resolution: {integrity: sha512-dziTNeQXtoQ2KBXmrjCxsuPk3F3CQ/yb7ZNZNA+UkNTeiTGgfeh+gH5Pi7mRncVgcPD2xgHvkFCh/MhZWSgyQg==} + engines: {node: '>= 10'} cpu: [arm64] os: [win32] - "@tailwindcss/oxide-win32-x64-msvc@4.1.13": - resolution: - { - integrity: sha512-3+LKesjXydTkHk5zXX01b5KMzLV1xl2mcktBJkje7rhFUpUlYJy7IMOLqjIRQncLTa1WZZiFY/foAeB5nmaiTw==, - } - engines: { node: ">= 10" } + '@tailwindcss/oxide-win32-x64-msvc@4.1.13': + resolution: {integrity: sha512-3+LKesjXydTkHk5zXX01b5KMzLV1xl2mcktBJkje7rhFUpUlYJy7IMOLqjIRQncLTa1WZZiFY/foAeB5nmaiTw==} + engines: {node: '>= 10'} cpu: [x64] os: [win32] - "@tailwindcss/oxide@4.1.13": - resolution: - { - integrity: sha512-CPgsM1IpGRa880sMbYmG1s4xhAy3xEt1QULgTJGQmZUeNgXFR7s1YxYygmJyBGtou4SyEosGAGEeYqY7R53bIA==, - } - engines: { node: ">= 10" } - - "@tailwindcss/vite@4.1.13": - resolution: - { - integrity: sha512-0PmqLQ010N58SbMTJ7BVJ4I2xopiQn/5i6nlb4JmxzQf8zcS5+m2Cv6tqh+sfDwtIdjoEnOvwsGQ1hkUi8QEHQ==, - } + '@tailwindcss/oxide@4.1.13': + resolution: {integrity: sha512-CPgsM1IpGRa880sMbYmG1s4xhAy3xEt1QULgTJGQmZUeNgXFR7s1YxYygmJyBGtou4SyEosGAGEeYqY7R53bIA==} + engines: {node: '>= 10'} + + '@tailwindcss/vite@4.1.13': + resolution: {integrity: sha512-0PmqLQ010N58SbMTJ7BVJ4I2xopiQn/5i6nlb4JmxzQf8zcS5+m2Cv6tqh+sfDwtIdjoEnOvwsGQ1hkUi8QEHQ==} peerDependencies: vite: ^5.2.0 || ^6 || ^7 - "@testing-library/dom@10.4.0": - resolution: - { - integrity: sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==, - } - engines: { node: ">=18" } - - "@testing-library/user-event@14.6.1": - resolution: - { - integrity: sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw==, - } - engines: { node: ">=12", npm: ">=6" } + '@testing-library/dom@10.4.0': + resolution: {integrity: sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==} + engines: {node: '>=18'} + + '@testing-library/user-event@14.6.1': + resolution: {integrity: sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw==} + engines: {node: '>=12', npm: '>=6'} peerDependencies: - "@testing-library/dom": ">=7.21.4" - - "@trysound/sax@0.2.0": - resolution: - { - integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==, - } - engines: { node: ">=10.13.0" } - - "@types/acorn@4.0.6": - resolution: - { - integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==, - } - - "@types/aria-query@5.0.4": - resolution: - { - integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==, - } - - "@types/babel__core@7.20.5": - resolution: - { - integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==, - } - - "@types/babel__generator@7.6.8": - resolution: - { - integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==, - } - - "@types/babel__standalone@7.1.9": - resolution: - { - integrity: sha512-IcCNPLqpevUD7UpV8QB0uwQPOyoOKACFf0YtYWRHcmxcakaje4Q7dbG2+jMqxw/I8Zk0NHvEps66WwS7z/UaaA==, - } - - "@types/babel__template@7.4.4": - resolution: - { - integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==, - } - - "@types/babel__traverse@7.20.7": - resolution: - { - integrity: sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==, - } - - "@types/bun@1.2.22": - resolution: - { - integrity: sha512-5A/KrKos2ZcN0c6ljRSOa1fYIyCKhZfIVYeuyb4snnvomnpFqC0tTsEkdqNxbAgExV384OETQ//WAjl3XbYqQA==, - } - - "@types/chai@5.2.2": - resolution: - { - integrity: sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==, - } - - "@types/cookie@0.6.0": - resolution: - { - integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==, - } - - "@types/debug@4.1.12": - resolution: - { - integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==, - } - - "@types/deep-eql@4.0.2": - resolution: - { - integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==, - } - - "@types/dom-mediacapture-record@1.0.22": - resolution: - { - integrity: sha512-mUMZLK3NvwRLcAAT9qmcK+9p7tpU2FHdDsntR3YI4+GY88XrgG4XiE7u1Q2LAN2/FZOz/tdMDC3GQCR4T8nFuw==, - } - - "@types/estree-jsx@1.0.5": - resolution: - { - integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==, - } - - "@types/estree@1.0.6": - resolution: - { - integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==, - } - - "@types/estree@1.0.8": - resolution: - { - integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==, - } - - "@types/fontkit@2.0.8": - resolution: - { - integrity: sha512-wN+8bYxIpJf+5oZdrdtaX04qUuWHcKxcDEgRS9Qm9ZClSHjzEn13SxUC+5eRM+4yXIeTYk8mTzLAWGF64847ew==, - } - - "@types/geojson@7946.0.16": - resolution: - { - integrity: sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==, - } - - "@types/hast@3.0.4": - resolution: - { - integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==, - } - - "@types/js-yaml@4.0.9": - resolution: - { - integrity: sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==, - } - - "@types/katex@0.16.7": - resolution: - { - integrity: sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ==, - } - - "@types/mathjax@0.0.40": - resolution: - { - integrity: sha512-rHusx08LCg92WJxrsM3SPjvLTSvK5C+gealtSuhKbEOcUZfWlwigaFoPLf6Dfxhg4oryN5qP9Sj7zOQ4HYXINw==, - } - - "@types/mdast@4.0.4": - resolution: - { - integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==, - } - - "@types/mdx@2.0.13": - resolution: - { - integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==, - } - - "@types/moo@0.5.10": - resolution: - { - integrity: sha512-W6KzyZjXUYpwQfLK1O1UDzqcqYlul+lO7Bt71luyIIyNlOZwJaNeWWdqFs1C/f2hohZvUFHMk6oFNe9Rg48DbA==, - } - - "@types/ms@2.1.0": - resolution: - { - integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==, - } - - "@types/nearley@2.11.5": - resolution: - { - integrity: sha512-dM7TrN0bVxGGXTYGx4YhGear8ysLO5SOuouAWM9oltjQ3m9oYa13qi8Z1DJp5zxVMPukvQdsrnZmgzpeuTSEQA==, - } - - "@types/nlcst@2.0.3": - resolution: - { - integrity: sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==, - } - - "@types/node@17.0.45": - resolution: - { - integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==, - } - - "@types/node@24.3.0": - resolution: - { - integrity: sha512-aPTXCrfwnDLj4VvXrm+UUCQjNEvJgNA8s5F1cvwQU+3KNltTOkBm1j30uNLyqqPNe7gE3KFzImYoZEfLhp4Yow==, - } - - "@types/node@24.5.2": - resolution: - { - integrity: sha512-FYxk1I7wPv3K2XBaoyH2cTnocQEu8AOZ60hPbsyukMPLv5/5qr7V1i8PLHdl6Zf87I+xZXFvPCXYjiTFq+YSDQ==, - } - - "@types/picomatch@4.0.1": - resolution: - { - integrity: sha512-dLqxmi5VJRC9XTvc/oaTtk+bDb4RRqxLZPZ3jIpYBHEnDXX8lu02w2yWI6NsPPsELuVK298Z2iR8jgoWKRdUVQ==, - } - - "@types/react-dom@19.1.6": - resolution: - { - integrity: sha512-4hOiT/dwO8Ko0gV1m/TJZYk3y0KBnY9vzDh7W+DH17b2HFSOGgdj33dhihPeuy3l0q23+4e+hoXHV6hCC4dCXw==, - } + '@testing-library/dom': '>=7.21.4' + + '@trysound/sax@0.2.0': + resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} + engines: {node: '>=10.13.0'} + + '@types/acorn@4.0.6': + resolution: {integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==} + + '@types/aria-query@5.0.4': + resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} + + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + + '@types/babel__generator@7.6.8': + resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} + + '@types/babel__standalone@7.1.9': + resolution: {integrity: sha512-IcCNPLqpevUD7UpV8QB0uwQPOyoOKACFf0YtYWRHcmxcakaje4Q7dbG2+jMqxw/I8Zk0NHvEps66WwS7z/UaaA==} + + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + + '@types/babel__traverse@7.20.7': + resolution: {integrity: sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==} + + '@types/bun@1.2.22': + resolution: {integrity: sha512-5A/KrKos2ZcN0c6ljRSOa1fYIyCKhZfIVYeuyb4snnvomnpFqC0tTsEkdqNxbAgExV384OETQ//WAjl3XbYqQA==} + + '@types/chai@5.2.2': + resolution: {integrity: sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==} + + '@types/cookie@0.6.0': + resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} + + '@types/debug@4.1.12': + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + + '@types/deep-eql@4.0.2': + resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + + '@types/dom-mediacapture-record@1.0.22': + resolution: {integrity: sha512-mUMZLK3NvwRLcAAT9qmcK+9p7tpU2FHdDsntR3YI4+GY88XrgG4XiE7u1Q2LAN2/FZOz/tdMDC3GQCR4T8nFuw==} + + '@types/estree-jsx@1.0.5': + resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} + + '@types/estree@1.0.6': + resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + + '@types/fontkit@2.0.8': + resolution: {integrity: sha512-wN+8bYxIpJf+5oZdrdtaX04qUuWHcKxcDEgRS9Qm9ZClSHjzEn13SxUC+5eRM+4yXIeTYk8mTzLAWGF64847ew==} + + '@types/geojson@7946.0.16': + resolution: {integrity: sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==} + + '@types/hast@3.0.4': + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + + '@types/js-yaml@4.0.9': + resolution: {integrity: sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==} + + '@types/katex@0.16.7': + resolution: {integrity: sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ==} + + '@types/mathjax@0.0.40': + resolution: {integrity: sha512-rHusx08LCg92WJxrsM3SPjvLTSvK5C+gealtSuhKbEOcUZfWlwigaFoPLf6Dfxhg4oryN5qP9Sj7zOQ4HYXINw==} + + '@types/mdast@4.0.4': + resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + + '@types/mdx@2.0.13': + resolution: {integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==} + + '@types/moo@0.5.10': + resolution: {integrity: sha512-W6KzyZjXUYpwQfLK1O1UDzqcqYlul+lO7Bt71luyIIyNlOZwJaNeWWdqFs1C/f2hohZvUFHMk6oFNe9Rg48DbA==} + + '@types/ms@2.1.0': + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + + '@types/nearley@2.11.5': + resolution: {integrity: sha512-dM7TrN0bVxGGXTYGx4YhGear8ysLO5SOuouAWM9oltjQ3m9oYa13qi8Z1DJp5zxVMPukvQdsrnZmgzpeuTSEQA==} + + '@types/nlcst@2.0.3': + resolution: {integrity: sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==} + + '@types/node@17.0.45': + resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==} + + '@types/node@24.3.0': + resolution: {integrity: sha512-aPTXCrfwnDLj4VvXrm+UUCQjNEvJgNA8s5F1cvwQU+3KNltTOkBm1j30uNLyqqPNe7gE3KFzImYoZEfLhp4Yow==} + + '@types/node@24.5.2': + resolution: {integrity: sha512-FYxk1I7wPv3K2XBaoyH2cTnocQEu8AOZ60hPbsyukMPLv5/5qr7V1i8PLHdl6Zf87I+xZXFvPCXYjiTFq+YSDQ==} + + '@types/picomatch@4.0.1': + resolution: {integrity: sha512-dLqxmi5VJRC9XTvc/oaTtk+bDb4RRqxLZPZ3jIpYBHEnDXX8lu02w2yWI6NsPPsELuVK298Z2iR8jgoWKRdUVQ==} + + '@types/react-dom@19.1.6': + resolution: {integrity: sha512-4hOiT/dwO8Ko0gV1m/TJZYk3y0KBnY9vzDh7W+DH17b2HFSOGgdj33dhihPeuy3l0q23+4e+hoXHV6hCC4dCXw==} peerDependencies: - "@types/react": ^19.0.0 - - "@types/react@19.1.8": - resolution: - { - integrity: sha512-AwAfQ2Wa5bCx9WP8nZL2uMZWod7J7/JSplxbTmBQ5ms6QpqNYm672H0Vu9ZVKVngQ+ii4R/byguVEUZQyeg44g==, - } - - "@types/resolve@1.20.2": - resolution: - { - integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==, - } - - "@types/sax@1.2.7": - resolution: - { - integrity: sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==, - } - - "@types/statuses@2.0.6": - resolution: - { - integrity: sha512-xMAgYwceFhRA2zY+XbEA7mxYbA093wdiW8Vu6gZPGWy9cmOyU9XesH1tNcEWsKFd5Vzrqx5T3D38PWx1FIIXkA==, - } - - "@types/tough-cookie@4.0.5": - resolution: - { - integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==, - } - - "@types/trusted-types@1.0.6": - resolution: - { - integrity: sha512-230RC8sFeHoT6sSUlRO6a8cAnclO06eeiq1QDfiv2FGCLWFvvERWgwIQD4FWqD9A69BN7Lzee4OXwoMVnnsWDw==, - } - - "@types/unist@2.0.11": - resolution: - { - integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==, - } - - "@types/unist@3.0.3": - resolution: - { - integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==, - } - - "@types/webxr@0.4.0": - resolution: - { - integrity: sha512-LQvrACV3Pj17GpkwHwXuTd733gfY+D7b9mKdrTmLdO7vo7P/o6209Qqtk63y/FCv/lspdmi0pWz6Qe/ull9kQg==, - } - - "@typescript/analyze-trace@0.10.1": - resolution: - { - integrity: sha512-RnlSOPh14QbopGCApgkSx5UBgGda5MX1cHqp2fsqfiDyCwGL/m1jaeB9fzu7didVS81LQqGZZuxFBcg8YU8EVw==, - } + '@types/react': ^19.0.0 + + '@types/react@19.1.8': + resolution: {integrity: sha512-AwAfQ2Wa5bCx9WP8nZL2uMZWod7J7/JSplxbTmBQ5ms6QpqNYm672H0Vu9ZVKVngQ+ii4R/byguVEUZQyeg44g==} + + '@types/resolve@1.20.2': + resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} + + '@types/sax@1.2.7': + resolution: {integrity: sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==} + + '@types/statuses@2.0.6': + resolution: {integrity: sha512-xMAgYwceFhRA2zY+XbEA7mxYbA093wdiW8Vu6gZPGWy9cmOyU9XesH1tNcEWsKFd5Vzrqx5T3D38PWx1FIIXkA==} + + '@types/tough-cookie@4.0.5': + resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==} + + '@types/trusted-types@1.0.6': + resolution: {integrity: sha512-230RC8sFeHoT6sSUlRO6a8cAnclO06eeiq1QDfiv2FGCLWFvvERWgwIQD4FWqD9A69BN7Lzee4OXwoMVnnsWDw==} + + '@types/unist@2.0.11': + resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} + + '@types/unist@3.0.3': + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + + '@types/webxr@0.4.0': + resolution: {integrity: sha512-LQvrACV3Pj17GpkwHwXuTd733gfY+D7b9mKdrTmLdO7vo7P/o6209Qqtk63y/FCv/lspdmi0pWz6Qe/ull9kQg==} + + '@typescript/analyze-trace@0.10.1': + resolution: {integrity: sha512-RnlSOPh14QbopGCApgkSx5UBgGda5MX1cHqp2fsqfiDyCwGL/m1jaeB9fzu7didVS81LQqGZZuxFBcg8YU8EVw==} hasBin: true - "@typescript/vfs@1.6.1": - resolution: - { - integrity: sha512-JwoxboBh7Oz1v38tPbkrZ62ZXNHAk9bJ7c9x0eI5zBfBnBYGhURdbnh7Z4smN/MV48Y5OCcZb58n972UtbazsA==, - } + '@typescript/vfs@1.6.1': + resolution: {integrity: sha512-JwoxboBh7Oz1v38tPbkrZ62ZXNHAk9bJ7c9x0eI5zBfBnBYGhURdbnh7Z4smN/MV48Y5OCcZb58n972UtbazsA==} peerDependencies: - typescript: "*" - - "@ungap/structured-clone@1.3.0": - resolution: - { - integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==, - } - - "@vitejs/plugin-basic-ssl@2.1.0": - resolution: - { - integrity: sha512-dOxxrhgyDIEUADhb/8OlV9JIqYLgos03YorAueTIeOUskLJSEsfwCByjbu98ctXitUN3znXKp0bYD/WHSudCeA==, - } - engines: { node: ^18.0.0 || ^20.0.0 || >=22.0.0 } + typescript: '*' + + '@ungap/structured-clone@1.3.0': + resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + + '@vitejs/plugin-basic-ssl@2.1.0': + resolution: {integrity: sha512-dOxxrhgyDIEUADhb/8OlV9JIqYLgos03YorAueTIeOUskLJSEsfwCByjbu98ctXitUN3znXKp0bYD/WHSudCeA==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} peerDependencies: vite: ^6.0.0 || ^7.0.0 - "@vitejs/plugin-react@4.7.0": - resolution: - { - integrity: sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==, - } - engines: { node: ^14.18.0 || >=16.0.0 } + '@vitejs/plugin-react@4.7.0': + resolution: {integrity: sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==} + engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 - "@vitest/browser@3.2.4": - resolution: - { - integrity: sha512-tJxiPrWmzH8a+w9nLKlQMzAKX/7VjFs50MWgcAj7p9XQ7AQ9/35fByFYptgPELyLw+0aixTnC4pUWV+APcZ/kw==, - } + '@vitest/browser@3.2.4': + resolution: {integrity: sha512-tJxiPrWmzH8a+w9nLKlQMzAKX/7VjFs50MWgcAj7p9XQ7AQ9/35fByFYptgPELyLw+0aixTnC4pUWV+APcZ/kw==} peerDependencies: - playwright: "*" - safaridriver: "*" + playwright: '*' + safaridriver: '*' vitest: 3.2.4 webdriverio: ^7.0.0 || ^8.0.0 || ^9.0.0 peerDependenciesMeta: @@ -4279,29 +2937,20 @@ packages: webdriverio: optional: true - "@vitest/coverage-v8@3.1.2": - resolution: - { - integrity: sha512-XDdaDOeaTMAMYW7N63AqoK32sYUWbXnTkC6tEbVcu3RlU1bB9of32T+PGf8KZvxqLNqeXhafDFqCkwpf2+dyaQ==, - } + '@vitest/coverage-v8@3.1.2': + resolution: {integrity: sha512-XDdaDOeaTMAMYW7N63AqoK32sYUWbXnTkC6tEbVcu3RlU1bB9of32T+PGf8KZvxqLNqeXhafDFqCkwpf2+dyaQ==} peerDependencies: - "@vitest/browser": 3.1.2 + '@vitest/browser': 3.1.2 vitest: 3.1.2 peerDependenciesMeta: - "@vitest/browser": + '@vitest/browser': optional: true - "@vitest/expect@3.2.4": - resolution: - { - integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==, - } - - "@vitest/mocker@3.2.4": - resolution: - { - integrity: sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==, - } + '@vitest/expect@3.2.4': + resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==} + + '@vitest/mocker@3.2.4': + resolution: {integrity: sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==} peerDependencies: msw: ^2.4.9 vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0 @@ -4311,1722 +2960,956 @@ packages: vite: optional: true - "@vitest/pretty-format@3.2.4": - resolution: - { - integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==, - } - - "@vitest/runner@3.2.4": - resolution: - { - integrity: sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==, - } - - "@vitest/snapshot@3.2.4": - resolution: - { - integrity: sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==, - } - - "@vitest/spy@3.2.4": - resolution: - { - integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==, - } - - "@vitest/utils@3.2.4": - resolution: - { - integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==, - } - - "@volar/kit@2.4.11": - resolution: - { - integrity: sha512-ups5RKbMzMCr6RKafcCqDRnJhJDNWqo2vfekwOAj6psZ15v5TlcQFQAyokQJ3wZxVkzxrQM+TqTRDENfQEXpmA==, - } + '@vitest/pretty-format@3.2.4': + resolution: {integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==} + + '@vitest/runner@3.2.4': + resolution: {integrity: sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==} + + '@vitest/snapshot@3.2.4': + resolution: {integrity: sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==} + + '@vitest/spy@3.2.4': + resolution: {integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==} + + '@vitest/utils@3.2.4': + resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==} + + '@volar/kit@2.4.11': + resolution: {integrity: sha512-ups5RKbMzMCr6RKafcCqDRnJhJDNWqo2vfekwOAj6psZ15v5TlcQFQAyokQJ3wZxVkzxrQM+TqTRDENfQEXpmA==} peerDependencies: - typescript: "*" - - "@volar/language-core@2.4.11": - resolution: - { - integrity: sha512-lN2C1+ByfW9/JRPpqScuZt/4OrUUse57GLI6TbLgTIqBVemdl1wNcZ1qYGEo2+Gw8coYLgCy7SuKqn6IrQcQgg==, - } - - "@volar/language-server@2.4.11": - resolution: - { - integrity: sha512-W9P8glH1M8LGREJ7yHRCANI5vOvTrRO15EMLdmh5WNF9sZYSEbQxiHKckZhvGIkbeR1WAlTl3ORTrJXUghjk7g==, - } - - "@volar/language-service@2.4.11": - resolution: - { - integrity: sha512-KIb6g8gjUkS2LzAJ9bJCLIjfsJjeRtmXlu7b2pDFGD3fNqdbC53cCAKzgWDs64xtQVKYBU13DLWbtSNFtGuMLQ==, - } - - "@volar/source-map@2.4.11": - resolution: - { - integrity: sha512-ZQpmafIGvaZMn/8iuvCFGrW3smeqkq/IIh9F1SdSx9aUl0J4Iurzd6/FhmjNO5g2ejF3rT45dKskgXWiofqlZQ==, - } - - "@volar/typescript@2.4.11": - resolution: - { - integrity: sha512-2DT+Tdh88Spp5PyPbqhyoYavYCPDsqbHLFwcUI9K1NlY1YgUJvujGdrqUp0zWxnW7KWNTr3xSpMuv2WnaTKDAw==, - } - - "@vscode/emmet-helper@2.11.0": - resolution: - { - integrity: sha512-QLxjQR3imPZPQltfbWRnHU6JecWTF1QSWhx3GAKQpslx7y3Dp6sIIXhKjiUJ/BR9FX8PVthjr9PD6pNwOJfAzw==, - } - - "@vscode/l10n@0.0.18": - resolution: - { - integrity: sha512-KYSIHVmslkaCDyw013pphY+d7x1qV8IZupYfeIfzNA+nsaWHbn5uPuQRvdRFsa9zFzGeudPuoGoZ1Op4jrJXIQ==, - } - - "@vtbag/cam-shaft@1.0.6": - resolution: - { - integrity: sha512-Xy1bmJJLXuCqxmY2agwPfhGNv1XZViqh54H0VGK4mouGsItFsh8Mz/wWAP6mZwAOEuu9bEOJ1mJ+oNoaczZ1zw==, - } - - "@vtbag/element-crossing@1.1.0": - resolution: - { - integrity: sha512-1YL609KPwhHUKRrVNfoogQCVJPfFrE5DubOLcCJZLHVCjWZ2ZAPcaq1wR2OP6nXD0Ok9JLX41YsEtYBYzw6CxQ==, - } - - "@vtbag/inspection-chamber@1.0.22": - resolution: - { - integrity: sha512-M0iVmgUEjTmjX3/LEVxpNFjqZSdKN/y6otH4aD6x8c3HhJjlD9OwStJaYHS8EoiQtvmPWIdG79iXOCesXTGfaQ==, - } - - "@vtbag/turn-signal@1.3.1": - resolution: - { - integrity: sha512-6rWkG+ik3U+KQGI94yNOrOh5QedB9zmP/8H51X5WQwrJz8m2MAU5YwGRRcweO/dJ6wW/Bn7OsgC1vRURnwrvCg==, - } - - "@vtbag/utensil-drawer@1.2.11": - resolution: - { - integrity: sha512-ZopaB1qd8RCjfbVCpI+xgVAzFVe/b65SzQhKX8E6+TLdkq7Tp2+0z091W0Ro7C4QHXpfi7Y93cXSA+1DDYQOVA==, - } - - "@webgpu/types@0.1.63": - resolution: - { - integrity: sha512-s9Kuh0nE/2+nKrvmKNMB2fE5Zlr3DL2t3OFKM55v5jRcfCOxbkOHhQoshoFum5mmXIfEtRXtLCWmkeTJsVjE9w==, - } - - "@xmldom/xmldom@0.9.8": - resolution: - { - integrity: sha512-p96FSY54r+WJ50FIOsCOjyj/wavs8921hG5+kVMmZgKcvIKxMXHTrjNJvRgWa/zuX3B6t2lijLNFaOyuxUH+2A==, - } - engines: { node: ">=14.6" } + typescript: '*' + + '@volar/language-core@2.4.11': + resolution: {integrity: sha512-lN2C1+ByfW9/JRPpqScuZt/4OrUUse57GLI6TbLgTIqBVemdl1wNcZ1qYGEo2+Gw8coYLgCy7SuKqn6IrQcQgg==} + + '@volar/language-server@2.4.11': + resolution: {integrity: sha512-W9P8glH1M8LGREJ7yHRCANI5vOvTrRO15EMLdmh5WNF9sZYSEbQxiHKckZhvGIkbeR1WAlTl3ORTrJXUghjk7g==} + + '@volar/language-service@2.4.11': + resolution: {integrity: sha512-KIb6g8gjUkS2LzAJ9bJCLIjfsJjeRtmXlu7b2pDFGD3fNqdbC53cCAKzgWDs64xtQVKYBU13DLWbtSNFtGuMLQ==} + + '@volar/source-map@2.4.11': + resolution: {integrity: sha512-ZQpmafIGvaZMn/8iuvCFGrW3smeqkq/IIh9F1SdSx9aUl0J4Iurzd6/FhmjNO5g2ejF3rT45dKskgXWiofqlZQ==} + + '@volar/typescript@2.4.11': + resolution: {integrity: sha512-2DT+Tdh88Spp5PyPbqhyoYavYCPDsqbHLFwcUI9K1NlY1YgUJvujGdrqUp0zWxnW7KWNTr3xSpMuv2WnaTKDAw==} + + '@vscode/emmet-helper@2.11.0': + resolution: {integrity: sha512-QLxjQR3imPZPQltfbWRnHU6JecWTF1QSWhx3GAKQpslx7y3Dp6sIIXhKjiUJ/BR9FX8PVthjr9PD6pNwOJfAzw==} + + '@vscode/l10n@0.0.18': + resolution: {integrity: sha512-KYSIHVmslkaCDyw013pphY+d7x1qV8IZupYfeIfzNA+nsaWHbn5uPuQRvdRFsa9zFzGeudPuoGoZ1Op4jrJXIQ==} + + '@vtbag/cam-shaft@1.0.6': + resolution: {integrity: sha512-Xy1bmJJLXuCqxmY2agwPfhGNv1XZViqh54H0VGK4mouGsItFsh8Mz/wWAP6mZwAOEuu9bEOJ1mJ+oNoaczZ1zw==} + + '@vtbag/element-crossing@1.1.0': + resolution: {integrity: sha512-1YL609KPwhHUKRrVNfoogQCVJPfFrE5DubOLcCJZLHVCjWZ2ZAPcaq1wR2OP6nXD0Ok9JLX41YsEtYBYzw6CxQ==} + + '@vtbag/inspection-chamber@1.0.22': + resolution: {integrity: sha512-M0iVmgUEjTmjX3/LEVxpNFjqZSdKN/y6otH4aD6x8c3HhJjlD9OwStJaYHS8EoiQtvmPWIdG79iXOCesXTGfaQ==} + + '@vtbag/turn-signal@1.3.1': + resolution: {integrity: sha512-6rWkG+ik3U+KQGI94yNOrOh5QedB9zmP/8H51X5WQwrJz8m2MAU5YwGRRcweO/dJ6wW/Bn7OsgC1vRURnwrvCg==} + + '@vtbag/utensil-drawer@1.2.11': + resolution: {integrity: sha512-ZopaB1qd8RCjfbVCpI+xgVAzFVe/b65SzQhKX8E6+TLdkq7Tp2+0z091W0Ro7C4QHXpfi7Y93cXSA+1DDYQOVA==} + + '@webgpu/types@0.1.63': + resolution: {integrity: sha512-s9Kuh0nE/2+nKrvmKNMB2fE5Zlr3DL2t3OFKM55v5jRcfCOxbkOHhQoshoFum5mmXIfEtRXtLCWmkeTJsVjE9w==} + + '@xmldom/xmldom@0.9.8': + resolution: {integrity: sha512-p96FSY54r+WJ50FIOsCOjyj/wavs8921hG5+kVMmZgKcvIKxMXHTrjNJvRgWa/zuX3B6t2lijLNFaOyuxUH+2A==} + engines: {node: '>=14.6'} acorn-jsx@5.3.2: - resolution: - { - integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==, - } + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 acorn@8.14.1: - resolution: - { - integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==, - } - engines: { node: ">=0.4.0" } + resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==} + engines: {node: '>=0.4.0'} hasBin: true acorn@8.15.0: - resolution: - { - integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==, - } - engines: { node: ">=0.4.0" } + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + engines: {node: '>=0.4.0'} hasBin: true agent-base@7.1.4: - resolution: - { - integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==, - } - engines: { node: ">= 14" } + resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} + engines: {node: '>= 14'} ajv@8.17.1: - resolution: - { - integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==, - } + resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} ansi-align@3.0.1: - resolution: - { - integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==, - } + resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} ansi-regex@5.0.1: - resolution: - { - integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} ansi-regex@6.1.0: - resolution: - { - integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} + engines: {node: '>=12'} ansi-regex@6.2.2: - resolution: - { - integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} + engines: {node: '>=12'} ansi-styles@4.3.0: - resolution: - { - integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} ansi-styles@5.2.0: - resolution: - { - integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} ansi-styles@6.2.3: - resolution: - { - integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} + engines: {node: '>=12'} any-promise@1.3.0: - resolution: - { - integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==, - } + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} anymatch@3.1.3: - resolution: - { - integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==, - } - engines: { node: ">= 8" } + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} arg@5.0.2: - resolution: - { - integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==, - } + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} argparse@2.0.1: - resolution: - { - integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==, - } + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} aria-hidden@1.2.6: - resolution: - { - integrity: sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==} + engines: {node: '>=10'} aria-query@5.3.0: - resolution: - { - integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==, - } + resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} aria-query@5.3.2: - resolution: - { - integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} + engines: {node: '>= 0.4'} arktype@2.1.20: - resolution: - { - integrity: sha512-IZCEEXaJ8g+Ijd59WtSYwtjnqXiwM8sWQ5EjGamcto7+HVN9eK0C4p0zDlCuAwWhpqr6fIBkxPuYDl4/Mcj/+Q==, - } + resolution: {integrity: sha512-IZCEEXaJ8g+Ijd59WtSYwtjnqXiwM8sWQ5EjGamcto7+HVN9eK0C4p0zDlCuAwWhpqr6fIBkxPuYDl4/Mcj/+Q==} arktype@2.1.22: - resolution: - { - integrity: sha512-xdzl6WcAhrdahvRRnXaNwsipCgHuNoLobRqhiP8RjnfL9Gp947abGlo68GAIyLtxbD+MLzNyH2YR4kEqioMmYQ==, - } + resolution: {integrity: sha512-xdzl6WcAhrdahvRRnXaNwsipCgHuNoLobRqhiP8RjnfL9Gp947abGlo68GAIyLtxbD+MLzNyH2YR4kEqioMmYQ==} array-iterate@2.0.1: - resolution: - { - integrity: sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==, - } + resolution: {integrity: sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==} assertion-error@2.0.1: - resolution: - { - integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} astring@1.9.0: - resolution: - { - integrity: sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==, - } + resolution: {integrity: sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==} hasBin: true astro-expressive-code@0.41.2: - resolution: - { - integrity: sha512-HN0jWTnhr7mIV/2e6uu4PPRNNo/k4UEgTLZqbp3MrHU+caCARveG2yZxaZVBmxyiVdYqW5Pd3u3n2zjnshixbw==, - } + resolution: {integrity: sha512-HN0jWTnhr7mIV/2e6uu4PPRNNo/k4UEgTLZqbp3MrHU+caCARveG2yZxaZVBmxyiVdYqW5Pd3u3n2zjnshixbw==} peerDependencies: astro: ^4.0.0-beta || ^5.0.0-beta || ^3.3.0 astro-remote@0.3.3: - resolution: - { - integrity: sha512-ufS/aOBXQKAe6hZ5NbiHUsC01o0ZcEwS+nNhd/mr1avLV+NbgYJEbwY8VRorzLs/GH5COOTaxl2795DkGIUTcw==, - } - engines: { node: ">=18.14.1" } + resolution: {integrity: sha512-ufS/aOBXQKAe6hZ5NbiHUsC01o0ZcEwS+nNhd/mr1avLV+NbgYJEbwY8VRorzLs/GH5COOTaxl2795DkGIUTcw==} + engines: {node: '>=18.14.1'} astro-vtbot@2.1.6: - resolution: - { - integrity: sha512-zmd8TQ4fqT3KxRrDpMVmp8LmtYKjMgC8c3ScmXlNIUdfhukArQ7vdOzSYlF4asNFMHli8Pr5Vx1HbsTBklGIpA==, - } + resolution: {integrity: sha512-zmd8TQ4fqT3KxRrDpMVmp8LmtYKjMgC8c3ScmXlNIUdfhukArQ7vdOzSYlF4asNFMHli8Pr5Vx1HbsTBklGIpA==} astro@5.13.7: - resolution: - { - integrity: sha512-Of2tST7ErbE4y1dVb4aWDXaQSIRBAfraJ4jDqaA3PzPRJOn6Ina36+tQ+8BezjYqiWwRRJdOEE07PRAJXnsddw==, - } - engines: - { node: 18.20.8 || ^20.3.0 || >=22.0.0, npm: ">=9.6.5", pnpm: ">=7.1.0" } + resolution: {integrity: sha512-Of2tST7ErbE4y1dVb4aWDXaQSIRBAfraJ4jDqaA3PzPRJOn6Ina36+tQ+8BezjYqiWwRRJdOEE07PRAJXnsddw==} + engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0'} hasBin: true autoprefixer@10.4.21: - resolution: - { - integrity: sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==, - } - engines: { node: ^10 || ^12 || >=14 } + resolution: {integrity: sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==} + engines: {node: ^10 || ^12 || >=14} hasBin: true peerDependencies: postcss: ^8.1.0 axobject-query@4.1.0: - resolution: - { - integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} + engines: {node: '>= 0.4'} bail@2.0.2: - resolution: - { - integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==, - } + resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} balanced-match@1.0.2: - resolution: - { - integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==, - } + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} base-64@1.0.0: - resolution: - { - integrity: sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg==, - } + resolution: {integrity: sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg==} base64-js@1.5.1: - resolution: - { - integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==, - } + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} baseline-browser-mapping@2.8.5: - resolution: - { - integrity: sha512-TiU4qUT9jdCuh4aVOG7H1QozyeI2sZRqoRPdqBIaslfNt4WUSanRBueAwl2x5jt4rXBMim3lIN2x6yT8PDi24Q==, - } + resolution: {integrity: sha512-TiU4qUT9jdCuh4aVOG7H1QozyeI2sZRqoRPdqBIaslfNt4WUSanRBueAwl2x5jt4rXBMim3lIN2x6yT8PDi24Q==} hasBin: true bcp-47-match@2.0.3: - resolution: - { - integrity: sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ==, - } + resolution: {integrity: sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ==} bcp-47@2.1.0: - resolution: - { - integrity: sha512-9IIS3UPrvIa1Ej+lVDdDwO7zLehjqsaByECw0bu2RRGP73jALm6FYbzI5gWbgHLvNdkvfXB5YrSbocZdOS0c0w==, - } + resolution: {integrity: sha512-9IIS3UPrvIa1Ej+lVDdDwO7zLehjqsaByECw0bu2RRGP73jALm6FYbzI5gWbgHLvNdkvfXB5YrSbocZdOS0c0w==} before-after-hook@2.2.3: - resolution: - { - integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==, - } + resolution: {integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==} bidi-js@1.0.3: - resolution: - { - integrity: sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==, - } + resolution: {integrity: sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==} binary-search-bounds@2.0.5: - resolution: - { - integrity: sha512-H0ea4Fd3lS1+sTEB2TgcLoK21lLhwEJzlQv3IN47pJS976Gx4zoWe0ak3q+uYh60ppQxg9F16Ri4tS1sfD4+jA==, - } + resolution: {integrity: sha512-H0ea4Fd3lS1+sTEB2TgcLoK21lLhwEJzlQv3IN47pJS976Gx4zoWe0ak3q+uYh60ppQxg9F16Ri4tS1sfD4+jA==} bl@4.1.0: - resolution: - { - integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==, - } + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} blob-to-buffer@1.2.9: - resolution: - { - integrity: sha512-BF033y5fN6OCofD3vgHmNtwZWRcq9NLyyxyILx9hfMy1sXYy4ojFl765hJ2lP0YaN2fuxPaLO2Vzzoxy0FLFFA==, - } + resolution: {integrity: sha512-BF033y5fN6OCofD3vgHmNtwZWRcq9NLyyxyILx9hfMy1sXYy4ojFl765hJ2lP0YaN2fuxPaLO2Vzzoxy0FLFFA==} boolbase@1.0.0: - resolution: - { - integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==, - } + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} boxen@8.0.1: - resolution: - { - integrity: sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw==} + engines: {node: '>=18'} brace-expansion@2.0.2: - resolution: - { - integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==, - } + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} braces@3.0.3: - resolution: - { - integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} brotli@1.3.3: - resolution: - { - integrity: sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg==, - } + resolution: {integrity: sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg==} browserslist@4.25.0: - resolution: - { - integrity: sha512-PJ8gYKeS5e/whHBh8xrwYK+dAvEj7JXtz6uTucnMRB8OiGTsKccFekoRrjajPBHV8oOY+2tI4uxeceSimKwMFA==, - } - engines: { node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7 } + resolution: {integrity: sha512-PJ8gYKeS5e/whHBh8xrwYK+dAvEj7JXtz6uTucnMRB8OiGTsKccFekoRrjajPBHV8oOY+2tI4uxeceSimKwMFA==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true browserslist@4.25.1: - resolution: - { - integrity: sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==, - } - engines: { node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7 } + resolution: {integrity: sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true browserslist@4.26.2: - resolution: - { - integrity: sha512-ECFzp6uFOSB+dcZ5BK/IBaGWssbSYBHvuMeMt3MMFyhI0Z8SqGgEkBLARgpRH3hutIgPVsALcMwbDrJqPxQ65A==, - } - engines: { node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7 } + resolution: {integrity: sha512-ECFzp6uFOSB+dcZ5BK/IBaGWssbSYBHvuMeMt3MMFyhI0Z8SqGgEkBLARgpRH3hutIgPVsALcMwbDrJqPxQ65A==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true buffer@5.7.1: - resolution: - { - integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==, - } + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} bun-types@1.2.22: - resolution: - { - integrity: sha512-hwaAu8tct/Zn6Zft4U9BsZcXkYomzpHJX28ofvx7k0Zz2HNz54n1n+tDgxoWFGB4PcFvJXJQloPhaV2eP3Q6EA==, - } + resolution: {integrity: sha512-hwaAu8tct/Zn6Zft4U9BsZcXkYomzpHJX28ofvx7k0Zz2HNz54n1n+tDgxoWFGB4PcFvJXJQloPhaV2eP3Q6EA==} peerDependencies: - "@types/react": ^19 + '@types/react': ^19 bundle-require@5.1.0: - resolution: - { - integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==, - } - engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + resolution: {integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} peerDependencies: - esbuild: ">=0.18" + esbuild: '>=0.18' cac@6.7.14: - resolution: - { - integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} call-me-maybe@1.0.2: - resolution: - { - integrity: sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==, - } + resolution: {integrity: sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==} camelcase@8.0.0: - resolution: - { - integrity: sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==, - } - engines: { node: ">=16" } + resolution: {integrity: sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==} + engines: {node: '>=16'} caniuse-api@3.0.0: - resolution: - { - integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==, - } + resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} caniuse-lite@1.0.30001723: - resolution: - { - integrity: sha512-1R/elMjtehrFejxwmexeXAtae5UO9iSyFn6G/I806CYC/BLyyBk1EPhrKBkWhy6wM6Xnm47dSJQec+tLJ39WHw==, - } + resolution: {integrity: sha512-1R/elMjtehrFejxwmexeXAtae5UO9iSyFn6G/I806CYC/BLyyBk1EPhrKBkWhy6wM6Xnm47dSJQec+tLJ39WHw==} caniuse-lite@1.0.30001726: - resolution: - { - integrity: sha512-VQAUIUzBiZ/UnlM28fSp2CRF3ivUn1BWEvxMcVTNwpw91Py1pGbPIyIKtd+tzct9C3ouceCVdGAXxZOpZAsgdw==, - } + resolution: {integrity: sha512-VQAUIUzBiZ/UnlM28fSp2CRF3ivUn1BWEvxMcVTNwpw91Py1pGbPIyIKtd+tzct9C3ouceCVdGAXxZOpZAsgdw==} caniuse-lite@1.0.30001743: - resolution: - { - integrity: sha512-e6Ojr7RV14Un7dz6ASD0aZDmQPT/A+eZU+nuTNfjqmRrmkmQlnTNWH0SKmqagx9PeW87UVqapSurtAXifmtdmw==, - } + resolution: {integrity: sha512-e6Ojr7RV14Un7dz6ASD0aZDmQPT/A+eZU+nuTNfjqmRrmkmQlnTNWH0SKmqagx9PeW87UVqapSurtAXifmtdmw==} canvas@3.2.0: - resolution: - { - integrity: sha512-jk0GxrLtUEmW/TmFsk2WghvgHe8B0pxGilqCL21y8lHkPUGa6FTsnCNtHPOzT8O3y+N+m3espawV80bbBlgfTA==, - } - engines: { node: ^18.12.0 || >= 20.9.0 } + resolution: {integrity: sha512-jk0GxrLtUEmW/TmFsk2WghvgHe8B0pxGilqCL21y8lHkPUGa6FTsnCNtHPOzT8O3y+N+m3espawV80bbBlgfTA==} + engines: {node: ^18.12.0 || >= 20.9.0} ccount@2.0.1: - resolution: - { - integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==, - } + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} chai@5.2.0: - resolution: - { - integrity: sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==} + engines: {node: '>=12'} chalk@4.1.2: - resolution: - { - integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} chalk@5.6.2: - resolution: - { - integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==, - } - engines: { node: ^12.17.0 || ^14.13 || >=16.0.0 } + resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} character-entities-html4@2.1.0: - resolution: - { - integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==, - } + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} character-entities-legacy@3.0.0: - resolution: - { - integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==, - } + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} character-entities@2.0.2: - resolution: - { - integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==, - } + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} character-reference-invalid@2.0.1: - resolution: - { - integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==, - } + resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} check-error@2.1.1: - resolution: - { - integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==, - } - engines: { node: ">= 16" } + resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} + engines: {node: '>= 16'} chokidar@4.0.3: - resolution: - { - integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==, - } - engines: { node: ">= 14.16.0" } + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} chownr@1.1.4: - resolution: - { - integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==, - } + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} chownr@3.0.0: - resolution: - { - integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} + engines: {node: '>=18'} ci-info@4.3.0: - resolution: - { - integrity: sha512-l+2bNRMiQgcfILUi33labAZYIWlH1kWDp+ecNo5iisRKrbm0xcRyCww71/YU0Fkw0mAFpz9bJayXPjey6vkmaQ==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-l+2bNRMiQgcfILUi33labAZYIWlH1kWDp+ecNo5iisRKrbm0xcRyCww71/YU0Fkw0mAFpz9bJayXPjey6vkmaQ==} + engines: {node: '>=8'} citty@0.1.6: - resolution: - { - integrity: sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==, - } + resolution: {integrity: sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==} classnames@2.5.1: - resolution: - { - integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==, - } + resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==} cli-boxes@3.0.0: - resolution: - { - integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} + engines: {node: '>=10'} cli-cursor@3.1.0: - resolution: - { - integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + engines: {node: '>=8'} cli-spinners@2.9.2: - resolution: - { - integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==, - } - engines: { node: ">=6" } + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} + engines: {node: '>=6'} cli-width@4.1.0: - resolution: - { - integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==, - } - engines: { node: ">= 12" } + resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} + engines: {node: '>= 12'} cliui@7.0.4: - resolution: - { - integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==, - } + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} cliui@8.0.1: - resolution: - { - integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} clone@1.0.4: - resolution: - { - integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==, - } - engines: { node: ">=0.8" } + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} clone@2.1.2: - resolution: - { - integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==, - } - engines: { node: ">=0.8" } + resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==} + engines: {node: '>=0.8'} clsx@2.1.1: - resolution: - { - integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==, - } - engines: { node: ">=6" } + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} collapse-white-space@2.1.0: - resolution: - { - integrity: sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==, - } + resolution: {integrity: sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==} color-convert@2.0.1: - resolution: - { - integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==, - } - engines: { node: ">=7.0.0" } + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} color-name@1.1.4: - resolution: - { - integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==, - } + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} color-string@1.9.1: - resolution: - { - integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==, - } + resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} color@4.2.3: - resolution: - { - integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==, - } - engines: { node: ">=12.5.0" } + resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} + engines: {node: '>=12.5.0'} colord@2.9.3: - resolution: - { - integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==, - } + resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==} comma-separated-tokens@2.0.3: - resolution: - { - integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==, - } + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} commander@13.1.0: - resolution: - { - integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==} + engines: {node: '>=18'} commander@2.20.3: - resolution: - { - integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==, - } + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} commander@4.1.1: - resolution: - { - integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==, - } - engines: { node: ">= 6" } + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} commander@7.2.0: - resolution: - { - integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==, - } - engines: { node: ">= 10" } + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} + engines: {node: '>= 10'} commander@8.3.0: - resolution: - { - integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==, - } - engines: { node: ">= 12" } + resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} + engines: {node: '>= 12'} common-ancestor-path@1.0.1: - resolution: - { - integrity: sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==, - } + resolution: {integrity: sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==} commondir@1.0.1: - resolution: - { - integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==, - } + resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} confbox@0.1.8: - resolution: - { - integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==, - } + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} confbox@0.2.1: - resolution: - { - integrity: sha512-hkT3yDPFbs95mNCy1+7qNKC6Pro+/ibzYxtM2iqEigpf0sVw+bg4Zh9/snjsBcf990vfIsg5+1U7VyiyBb3etg==, - } + resolution: {integrity: sha512-hkT3yDPFbs95mNCy1+7qNKC6Pro+/ibzYxtM2iqEigpf0sVw+bg4Zh9/snjsBcf990vfIsg5+1U7VyiyBb3etg==} consola@3.4.0: - resolution: - { - integrity: sha512-EiPU8G6dQG0GFHNR8ljnZFki/8a+cQwEQ+7wpxdChl02Q8HXlwEZWD5lqAF8vC2sEC3Tehr8hy7vErz88LHyUA==, - } - engines: { node: ^14.18.0 || >=16.10.0 } + resolution: {integrity: sha512-EiPU8G6dQG0GFHNR8ljnZFki/8a+cQwEQ+7wpxdChl02Q8HXlwEZWD5lqAF8vC2sEC3Tehr8hy7vErz88LHyUA==} + engines: {node: ^14.18.0 || >=16.10.0} convert-source-map@2.0.0: - resolution: - { - integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==, - } + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} cookie-es@1.2.2: - resolution: - { - integrity: sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg==, - } + resolution: {integrity: sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg==} cookie@0.7.2: - resolution: - { - integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==, - } - engines: { node: ">= 0.6" } + resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} + engines: {node: '>= 0.6'} cookie@1.0.2: - resolution: - { - integrity: sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==} + engines: {node: '>=18'} cross-fetch@3.2.0: - resolution: - { - integrity: sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==, - } + resolution: {integrity: sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==} cross-spawn@7.0.6: - resolution: - { - integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==, - } - engines: { node: ">= 8" } + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} crossws@0.3.5: - resolution: - { - integrity: sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==, - } + resolution: {integrity: sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==} css-declaration-sorter@7.2.0: - resolution: - { - integrity: sha512-h70rUM+3PNFuaBDTLe8wF/cdWu+dOZmb7pJt8Z2sedYbAcQVQV/tEchueg3GWxwqS0cxtbxmaHEdkNACqcvsow==, - } - engines: { node: ^14 || ^16 || >=18 } + resolution: {integrity: sha512-h70rUM+3PNFuaBDTLe8wF/cdWu+dOZmb7pJt8Z2sedYbAcQVQV/tEchueg3GWxwqS0cxtbxmaHEdkNACqcvsow==} + engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.0.9 css-select@5.1.0: - resolution: - { - integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==, - } + resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} css-selector-parser@3.0.5: - resolution: - { - integrity: sha512-3itoDFbKUNx1eKmVpYMFyqKX04Ww9osZ+dLgrk6GEv6KMVeXUhUnp4I5X+evw+u3ZxVU6RFXSSRxlTeMh8bA+g==, - } + resolution: {integrity: sha512-3itoDFbKUNx1eKmVpYMFyqKX04Ww9osZ+dLgrk6GEv6KMVeXUhUnp4I5X+evw+u3ZxVU6RFXSSRxlTeMh8bA+g==} css-tree@2.2.1: - resolution: - { - integrity: sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==, - } - engines: { node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: ">=7.0.0" } + resolution: {integrity: sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} css-tree@2.3.1: - resolution: - { - integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==, - } - engines: { node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0 } + resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} css-tree@3.1.0: - resolution: - { - integrity: sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==, - } - engines: { node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0 } + resolution: {integrity: sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} css-what@6.1.0: - resolution: - { - integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==, - } - engines: { node: ">= 6" } + resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} + engines: {node: '>= 6'} cssesc@3.0.0: - resolution: - { - integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==, - } - engines: { node: ">=4" } + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} hasBin: true cssnano-preset-default@7.0.6: - resolution: - { - integrity: sha512-ZzrgYupYxEvdGGuqL+JKOY70s7+saoNlHSCK/OGn1vB2pQK8KSET8jvenzItcY+kA7NoWvfbb/YhlzuzNKjOhQ==, - } - engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 } + resolution: {integrity: sha512-ZzrgYupYxEvdGGuqL+JKOY70s7+saoNlHSCK/OGn1vB2pQK8KSET8jvenzItcY+kA7NoWvfbb/YhlzuzNKjOhQ==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.4.31 cssnano-utils@5.0.0: - resolution: - { - integrity: sha512-Uij0Xdxc24L6SirFr25MlwC2rCFX6scyUmuKpzI+JQ7cyqDEwD42fJ0xfB3yLfOnRDU5LKGgjQ9FA6LYh76GWQ==, - } - engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 } + resolution: {integrity: sha512-Uij0Xdxc24L6SirFr25MlwC2rCFX6scyUmuKpzI+JQ7cyqDEwD42fJ0xfB3yLfOnRDU5LKGgjQ9FA6LYh76GWQ==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.4.31 cssnano@7.0.6: - resolution: - { - integrity: sha512-54woqx8SCbp8HwvNZYn68ZFAepuouZW4lTwiMVnBErM3VkO7/Sd4oTOt3Zz3bPx3kxQ36aISppyXj2Md4lg8bw==, - } - engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 } + resolution: {integrity: sha512-54woqx8SCbp8HwvNZYn68ZFAepuouZW4lTwiMVnBErM3VkO7/Sd4oTOt3Zz3bPx3kxQ36aISppyXj2Md4lg8bw==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.4.31 csso@5.0.5: - resolution: - { - integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==, - } - engines: { node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: ">=7.0.0" } + resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} cssstyle@5.3.1: - resolution: - { - integrity: sha512-g5PC9Aiph9eiczFpcgUhd9S4UUO3F+LHGRIi5NUMZ+4xtoIYbHNZwZnWA2JsFGe8OU8nl4WyaEFiZuGuxlutJQ==, - } - engines: { node: ">=20" } + resolution: {integrity: sha512-g5PC9Aiph9eiczFpcgUhd9S4UUO3F+LHGRIi5NUMZ+4xtoIYbHNZwZnWA2JsFGe8OU8nl4WyaEFiZuGuxlutJQ==} + engines: {node: '>=20'} csstype@3.1.3: - resolution: - { - integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==, - } + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} d3-array@3.2.4: - resolution: - { - integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==} + engines: {node: '>=12'} d3-axis@3.0.0: - resolution: - { - integrity: sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==} + engines: {node: '>=12'} d3-brush@3.0.0: - resolution: - { - integrity: sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==} + engines: {node: '>=12'} d3-chord@3.0.1: - resolution: - { - integrity: sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==} + engines: {node: '>=12'} d3-color@3.1.0: - resolution: - { - integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} + engines: {node: '>=12'} d3-contour@4.0.2: - resolution: - { - integrity: sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==} + engines: {node: '>=12'} d3-delaunay@6.0.4: - resolution: - { - integrity: sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==} + engines: {node: '>=12'} d3-dispatch@3.0.1: - resolution: - { - integrity: sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==} + engines: {node: '>=12'} d3-drag@3.0.0: - resolution: - { - integrity: sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==} + engines: {node: '>=12'} d3-dsv@3.0.1: - resolution: - { - integrity: sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==} + engines: {node: '>=12'} hasBin: true d3-ease@3.0.1: - resolution: - { - integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==} + engines: {node: '>=12'} d3-fetch@3.0.1: - resolution: - { - integrity: sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==} + engines: {node: '>=12'} d3-force@3.0.0: - resolution: - { - integrity: sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==} + engines: {node: '>=12'} d3-format@3.1.0: - resolution: - { - integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==} + engines: {node: '>=12'} d3-geo@3.1.1: - resolution: - { - integrity: sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==} + engines: {node: '>=12'} d3-hierarchy@3.1.2: - resolution: - { - integrity: sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==} + engines: {node: '>=12'} d3-interpolate@3.0.1: - resolution: - { - integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} + engines: {node: '>=12'} d3-path@3.1.0: - resolution: - { - integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==} + engines: {node: '>=12'} d3-polygon@3.0.1: - resolution: - { - integrity: sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==} + engines: {node: '>=12'} d3-quadtree@3.0.1: - resolution: - { - integrity: sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==} + engines: {node: '>=12'} d3-random@3.0.1: - resolution: - { - integrity: sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==} + engines: {node: '>=12'} d3-scale-chromatic@3.1.0: - resolution: - { - integrity: sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==} + engines: {node: '>=12'} d3-scale@4.0.2: - resolution: - { - integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==} + engines: {node: '>=12'} d3-selection@3.0.0: - resolution: - { - integrity: sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==} + engines: {node: '>=12'} d3-shape@3.2.0: - resolution: - { - integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==} + engines: {node: '>=12'} d3-time-format@4.1.0: - resolution: - { - integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==} + engines: {node: '>=12'} d3-time@3.1.0: - resolution: - { - integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==} + engines: {node: '>=12'} d3-timer@3.0.1: - resolution: - { - integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} + engines: {node: '>=12'} d3-transition@3.0.1: - resolution: - { - integrity: sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==} + engines: {node: '>=12'} peerDependencies: d3-selection: 2 - 3 d3-zoom@3.0.0: - resolution: - { - integrity: sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==} + engines: {node: '>=12'} d3@7.9.0: - resolution: - { - integrity: sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==} + engines: {node: '>=12'} data-urls@6.0.0: - resolution: - { - integrity: sha512-BnBS08aLUM+DKamupXs3w2tJJoqU+AkaE/+6vQxi/G/DPmIZFJJp9Dkb1kM03AZx8ADehDUZgsNxju3mPXZYIA==, - } - engines: { node: ">=20" } + resolution: {integrity: sha512-BnBS08aLUM+DKamupXs3w2tJJoqU+AkaE/+6vQxi/G/DPmIZFJJp9Dkb1kM03AZx8ADehDUZgsNxju3mPXZYIA==} + engines: {node: '>=20'} debug@4.4.0: - resolution: - { - integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==, - } - engines: { node: ">=6.0" } + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + engines: {node: '>=6.0'} peerDependencies: - supports-color: "*" + supports-color: '*' peerDependenciesMeta: supports-color: optional: true debug@4.4.1: - resolution: - { - integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==, - } - engines: { node: ">=6.0" } + resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} + engines: {node: '>=6.0'} peerDependencies: - supports-color: "*" + supports-color: '*' peerDependenciesMeta: supports-color: optional: true debug@4.4.3: - resolution: - { - integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==, - } - engines: { node: ">=6.0" } + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} peerDependencies: - supports-color: "*" + supports-color: '*' peerDependenciesMeta: supports-color: optional: true decimal.js@10.6.0: - resolution: - { - integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==, - } + resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==} decode-named-character-reference@1.1.0: - resolution: - { - integrity: sha512-Wy+JTSbFThEOXQIR2L6mxJvEs+veIzpmqD7ynWxMXGpnk3smkHQOp6forLdHsKpAMW9iJpaBBIxz285t1n1C3w==, - } + resolution: {integrity: sha512-Wy+JTSbFThEOXQIR2L6mxJvEs+veIzpmqD7ynWxMXGpnk3smkHQOp6forLdHsKpAMW9iJpaBBIxz285t1n1C3w==} decode-uri-component@0.4.1: - resolution: - { - integrity: sha512-+8VxcR21HhTy8nOt6jf20w0c9CADrw1O8d+VZ/YzzCt4bJ3uBjw+D1q2osAB8RnpwwaeYBxy0HyKQxD5JBMuuQ==, - } - engines: { node: ">=14.16" } + resolution: {integrity: sha512-+8VxcR21HhTy8nOt6jf20w0c9CADrw1O8d+VZ/YzzCt4bJ3uBjw+D1q2osAB8RnpwwaeYBxy0HyKQxD5JBMuuQ==} + engines: {node: '>=14.16'} decompress-response@6.0.0: - resolution: - { - integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} deep-eql@5.0.2: - resolution: - { - integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==, - } - engines: { node: ">=6" } + resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} + engines: {node: '>=6'} deep-extend@0.6.0: - resolution: - { - integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==, - } - engines: { node: ">=4.0.0" } + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} deepmerge@4.3.1: - resolution: - { - integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==, - } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} defaults@1.0.4: - resolution: - { - integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==, - } + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} defu@6.1.4: - resolution: - { - integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==, - } + resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} delaunator@5.0.1: - resolution: - { - integrity: sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==, - } + resolution: {integrity: sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==} deprecation@2.3.1: - resolution: - { - integrity: sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==, - } + resolution: {integrity: sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==} dequal@2.0.3: - resolution: - { - integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==, - } - engines: { node: ">=6" } + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} destr@2.0.5: - resolution: - { - integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==, - } + resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==} detect-libc@2.0.4: - resolution: - { - integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==} + engines: {node: '>=8'} detect-libc@2.1.0: - resolution: - { - integrity: sha512-vEtk+OcP7VBRtQZ1EJ3bdgzSfBjgnEalLTp5zjJrS+2Z1w2KZly4SBdac/WDU3hhsNAZ9E8SC96ME4Ey8MZ7cg==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-vEtk+OcP7VBRtQZ1EJ3bdgzSfBjgnEalLTp5zjJrS+2Z1w2KZly4SBdac/WDU3hhsNAZ9E8SC96ME4Ey8MZ7cg==} + engines: {node: '>=8'} detect-node-es@1.1.0: - resolution: - { - integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==, - } + resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} deterministic-object-hash@2.0.2: - resolution: - { - integrity: sha512-KxektNH63SrbfUyDiwXqRb1rLwKt33AmMv+5Nhsw1kqZ13SJBRTgZHtGbE+hH3a1mVW1cz+4pqSWVPAtLVXTzQ==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-KxektNH63SrbfUyDiwXqRb1rLwKt33AmMv+5Nhsw1kqZ13SJBRTgZHtGbE+hH3a1mVW1cz+4pqSWVPAtLVXTzQ==} + engines: {node: '>=18'} devalue@5.3.2: - resolution: - { - integrity: sha512-UDsjUbpQn9kvm68slnrs+mfxwFkIflOhkanmyabZ8zOYk8SMEIbJ3TK+88g70hSIeytu4y18f0z/hYHMTrXIWw==, - } + resolution: {integrity: sha512-UDsjUbpQn9kvm68slnrs+mfxwFkIflOhkanmyabZ8zOYk8SMEIbJ3TK+88g70hSIeytu4y18f0z/hYHMTrXIWw==} devlop@1.1.0: - resolution: - { - integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==, - } + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} dfa@1.2.0: - resolution: - { - integrity: sha512-ED3jP8saaweFTjeGX8HQPjeC1YYyZs98jGNZx6IiBvxW7JG5v492kamAQB3m2wop07CvU/RQmzcKr6bgcC5D/Q==, - } + resolution: {integrity: sha512-ED3jP8saaweFTjeGX8HQPjeC1YYyZs98jGNZx6IiBvxW7JG5v492kamAQB3m2wop07CvU/RQmzcKr6bgcC5D/Q==} diff@5.2.0: - resolution: - { - integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==, - } - engines: { node: ">=0.3.1" } + resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} + engines: {node: '>=0.3.1'} direction@2.0.1: - resolution: - { - integrity: sha512-9S6m9Sukh1cZNknO1CWAr2QAWsbKLafQiyM5gZ7VgXHeuaoUwffKN4q6NC4A/Mf9iiPlOXQEKW/Mv/mh9/3YFA==, - } + resolution: {integrity: sha512-9S6m9Sukh1cZNknO1CWAr2QAWsbKLafQiyM5gZ7VgXHeuaoUwffKN4q6NC4A/Mf9iiPlOXQEKW/Mv/mh9/3YFA==} hasBin: true discontinuous-range@1.0.0: - resolution: - { - integrity: sha512-c68LpLbO+7kP/b1Hr1qs8/BJ09F5khZGTxqxZuhzxpmwJKOgRFHJWIb9/KmqnqHhLdO55aOxFH/EGBvUQbL/RQ==, - } + resolution: {integrity: sha512-c68LpLbO+7kP/b1Hr1qs8/BJ09F5khZGTxqxZuhzxpmwJKOgRFHJWIb9/KmqnqHhLdO55aOxFH/EGBvUQbL/RQ==} dlv@1.1.3: - resolution: - { - integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==, - } + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} dom-accessibility-api@0.5.16: - resolution: - { - integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==, - } + resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} dom-serializer@2.0.0: - resolution: - { - integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==, - } + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} domelementtype@2.3.0: - resolution: - { - integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==, - } + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} domhandler@5.0.3: - resolution: - { - integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==, - } - engines: { node: ">= 4" } + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} domutils@3.2.2: - resolution: - { - integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==, - } + resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} dpdm@3.14.0: - resolution: - { - integrity: sha512-YJzsFSyEtj88q5eTELg3UWU7TVZkG1dpbF4JDQ3t1b07xuzXmdoGeSz9TKOke1mUuOpWlk4q+pBh+aHzD6GBTg==, - } + resolution: {integrity: sha512-YJzsFSyEtj88q5eTELg3UWU7TVZkG1dpbF4JDQ3t1b07xuzXmdoGeSz9TKOke1mUuOpWlk4q+pBh+aHzD6GBTg==} hasBin: true dset@3.1.4: - resolution: - { - integrity: sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==, - } - engines: { node: ">=4" } + resolution: {integrity: sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==} + engines: {node: '>=4'} eastasianwidth@0.2.0: - resolution: - { - integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==, - } + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} electron-to-chromium@1.5.168: - resolution: - { - integrity: sha512-RUNQmFLNIWVW6+z32EJQ5+qx8ci6RGvdtDC0Ls+F89wz6I2AthpXF0w0DIrn2jpLX0/PU9ZCo+Qp7bg/EckJmA==, - } + resolution: {integrity: sha512-RUNQmFLNIWVW6+z32EJQ5+qx8ci6RGvdtDC0Ls+F89wz6I2AthpXF0w0DIrn2jpLX0/PU9ZCo+Qp7bg/EckJmA==} electron-to-chromium@1.5.178: - resolution: - { - integrity: sha512-wObbz/ar3Bc6e4X5vf0iO8xTN8YAjN/tgiAOJLr7yjYFtP9wAjq8Mb5h0yn6kResir+VYx2DXBj9NNobs0ETSA==, - } + resolution: {integrity: sha512-wObbz/ar3Bc6e4X5vf0iO8xTN8YAjN/tgiAOJLr7yjYFtP9wAjq8Mb5h0yn6kResir+VYx2DXBj9NNobs0ETSA==} electron-to-chromium@1.5.221: - resolution: - { - integrity: sha512-/1hFJ39wkW01ogqSyYoA4goOXOtMRy6B+yvA1u42nnsEGtHzIzmk93aPISumVQeblj47JUHLC9coCjUxb1EvtQ==, - } + resolution: {integrity: sha512-/1hFJ39wkW01ogqSyYoA4goOXOtMRy6B+yvA1u42nnsEGtHzIzmk93aPISumVQeblj47JUHLC9coCjUxb1EvtQ==} emmet@2.4.11: - resolution: - { - integrity: sha512-23QPJB3moh/U9sT4rQzGgeyyGIrcM+GH5uVYg2C6wZIxAIJq7Ng3QLT79tl8FUwDXhyq9SusfknOrofAKqvgyQ==, - } + resolution: {integrity: sha512-23QPJB3moh/U9sT4rQzGgeyyGIrcM+GH5uVYg2C6wZIxAIJq7Ng3QLT79tl8FUwDXhyq9SusfknOrofAKqvgyQ==} emoji-regex@10.5.0: - resolution: - { - integrity: sha512-lb49vf1Xzfx080OKA0o6l8DQQpV+6Vg95zyCJX9VB/BqKYlhG7N4wgROUUHRA+ZPUefLnteQOad7z1kT2bV7bg==, - } + resolution: {integrity: sha512-lb49vf1Xzfx080OKA0o6l8DQQpV+6Vg95zyCJX9VB/BqKYlhG7N4wgROUUHRA+ZPUefLnteQOad7z1kT2bV7bg==} emoji-regex@8.0.0: - resolution: - { - integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==, - } + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} emoji-regex@9.2.2: - resolution: - { - integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==, - } + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} end-of-stream@1.4.5: - resolution: - { - integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==, - } + resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} enhanced-resolve@5.18.3: - resolution: - { - integrity: sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==, - } - engines: { node: ">=10.13.0" } + resolution: {integrity: sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==} + engines: {node: '>=10.13.0'} entities@4.5.0: - resolution: - { - integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==, - } - engines: { node: ">=0.12" } + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} entities@6.0.1: - resolution: - { - integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==, - } - engines: { node: ">=0.12" } + resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} + engines: {node: '>=0.12'} es-module-lexer@1.7.0: - resolution: - { - integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==, - } + resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} esast-util-from-estree@2.0.0: - resolution: - { - integrity: sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==, - } + resolution: {integrity: sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==} esast-util-from-js@2.0.1: - resolution: - { - integrity: sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==, - } + resolution: {integrity: sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==} esbuild@0.24.2: - resolution: - { - integrity: sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==} + engines: {node: '>=18'} hasBin: true esbuild@0.25.10: - resolution: - { - integrity: sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==} + engines: {node: '>=18'} hasBin: true esbuild@0.25.5: - resolution: - { - integrity: sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==} + engines: {node: '>=18'} hasBin: true esbuild@0.25.6: - resolution: - { - integrity: sha512-GVuzuUwtdsghE3ocJ9Bs8PNoF13HNQ5TXbEi2AhvVb8xU1Iwt9Fos9FEamfoee+u/TOsn7GUWc04lz46n2bbTg==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-GVuzuUwtdsghE3ocJ9Bs8PNoF13HNQ5TXbEi2AhvVb8xU1Iwt9Fos9FEamfoee+u/TOsn7GUWc04lz46n2bbTg==} + engines: {node: '>=18'} hasBin: true esbuild@0.25.9: - resolution: - { - integrity: sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==} + engines: {node: '>=18'} hasBin: true escalade@3.2.0: - resolution: - { - integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==, - } - engines: { node: ">=6" } + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} escape-string-regexp@5.0.0: - resolution: - { - integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} esm@3.2.25: - resolution: - { - integrity: sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==, - } - engines: { node: ">=6" } + resolution: {integrity: sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==} + engines: {node: '>=6'} estree-util-attach-comments@3.0.0: - resolution: - { - integrity: sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==, - } + resolution: {integrity: sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==} estree-util-build-jsx@3.0.1: - resolution: - { - integrity: sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==, - } + resolution: {integrity: sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==} estree-util-is-identifier-name@3.0.0: - resolution: - { - integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==, - } + resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} estree-util-scope@1.0.0: - resolution: - { - integrity: sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ==, - } + resolution: {integrity: sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ==} estree-util-to-js@2.0.0: - resolution: - { - integrity: sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==, - } + resolution: {integrity: sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==} estree-util-visit@2.0.0: - resolution: - { - integrity: sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==, - } + resolution: {integrity: sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==} estree-walker@2.0.2: - resolution: - { - integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==, - } + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} estree-walker@3.0.3: - resolution: - { - integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==, - } + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} eventemitter3@5.0.1: - resolution: - { - integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==, - } + resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} execa@9.6.0: - resolution: - { - integrity: sha512-jpWzZ1ZhwUmeWRhS7Qv3mhpOhLfwI+uAX4e5fOcXqwMR7EcJ0pj2kV1CVzHVMX/LphnKWD3LObjZCoJ71lKpHw==, - } - engines: { node: ^18.19.0 || >=20.5.0 } + resolution: {integrity: sha512-jpWzZ1ZhwUmeWRhS7Qv3mhpOhLfwI+uAX4e5fOcXqwMR7EcJ0pj2kV1CVzHVMX/LphnKWD3LObjZCoJ71lKpHw==} + engines: {node: ^18.19.0 || >=20.5.0} exit@0.1.2: - resolution: - { - integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==, - } - engines: { node: ">= 0.8.0" } + resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} + engines: {node: '>= 0.8.0'} expand-template@2.0.3: - resolution: - { - integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==, - } - engines: { node: ">=6" } + resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} + engines: {node: '>=6'} expect-type@1.2.1: - resolution: - { - integrity: sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw==, - } - engines: { node: ">=12.0.0" } + resolution: {integrity: sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw==} + engines: {node: '>=12.0.0'} expressive-code-twoslash@0.5.3: - resolution: - { - integrity: sha512-BcttA3taicvhesKpQ4TvRxoDHByDr2FH6bvjc6elxC8TXVU3GVZv0wHvdcNz9xrVEUcwbDbsprqsGF7M7Yq59A==, - } + resolution: {integrity: sha512-BcttA3taicvhesKpQ4TvRxoDHByDr2FH6bvjc6elxC8TXVU3GVZv0wHvdcNz9xrVEUcwbDbsprqsGF7M7Yq59A==} peerDependencies: - "@expressive-code/core": ">=0.40.0" - expressive-code: ">=0.40.0" + '@expressive-code/core': '>=0.40.0' + expressive-code: '>=0.40.0' typescript: ^5.7 expressive-code@0.41.2: - resolution: - { - integrity: sha512-aLZiZaqorRtNExtGpUjK9zFH9aTpWeoTXMyLo4b4IcuXfPqtLPPxhRm/QlPb8QqIcMMXnSiGRHSFpQfX0m7HJw==, - } + resolution: {integrity: sha512-aLZiZaqorRtNExtGpUjK9zFH9aTpWeoTXMyLo4b4IcuXfPqtLPPxhRm/QlPb8QqIcMMXnSiGRHSFpQfX0m7HJw==} exsolve@1.0.4: - resolution: - { - integrity: sha512-xsZH6PXaER4XoV+NiT7JHp1bJodJVT+cxeSH1G0f0tlT0lJqYuHUP3bUx2HtfTDvOagMINYp8rsqusxud3RXhw==, - } + resolution: {integrity: sha512-xsZH6PXaER4XoV+NiT7JHp1bJodJVT+cxeSH1G0f0tlT0lJqYuHUP3bUx2HtfTDvOagMINYp8rsqusxud3RXhw==} extend@3.0.2: - resolution: - { - integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==, - } + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} fast-deep-equal@3.1.3: - resolution: - { - integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==, - } + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} fast-glob@3.3.3: - resolution: - { - integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==, - } - engines: { node: ">=8.6.0" } + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} fast-uri@3.0.6: - resolution: - { - integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==, - } + resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==} fast-xml-parser@4.5.3: - resolution: - { - integrity: sha512-RKihhV+SHsIUGXObeVy9AXiBbFwkVk7Syp8XgwN5U3JV416+Gwp/GO9i0JYKmikykgz/UHRrrV4ROuZEo/T0ig==, - } + resolution: {integrity: sha512-RKihhV+SHsIUGXObeVy9AXiBbFwkVk7Syp8XgwN5U3JV416+Gwp/GO9i0JYKmikykgz/UHRrrV4ROuZEo/T0ig==} hasBin: true fastq@1.19.0: - resolution: - { - integrity: sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA==, - } + resolution: {integrity: sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA==} fdir@6.4.3: - resolution: - { - integrity: sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==, - } + resolution: {integrity: sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==} peerDependencies: picomatch: ^3 || ^4 peerDependenciesMeta: @@ -6034,10 +3917,7 @@ packages: optional: true fdir@6.4.6: - resolution: - { - integrity: sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==, - } + resolution: {integrity: sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==} peerDependencies: picomatch: ^3 || ^4 peerDependenciesMeta: @@ -6045,11 +3925,8 @@ packages: optional: true fdir@6.5.0: - resolution: - { - integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==, - } - engines: { node: ">=12.0.0" } + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} peerDependencies: picomatch: ^3 || ^4 peerDependenciesMeta: @@ -6057,75 +3934,45 @@ packages: optional: true figures@6.1.0: - resolution: - { - integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==} + engines: {node: '>=18'} fill-range@7.1.1: - resolution: - { - integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} filter-obj@5.1.0: - resolution: - { - integrity: sha512-qWeTREPoT7I0bifpPUXtxkZJ1XJzxWtfoWWkdVGqa+eCr3SHW/Ocp89o8vLvbUuQnadybJpjOKu4V+RwO6sGng==, - } - engines: { node: ">=14.16" } + resolution: {integrity: sha512-qWeTREPoT7I0bifpPUXtxkZJ1XJzxWtfoWWkdVGqa+eCr3SHW/Ocp89o8vLvbUuQnadybJpjOKu4V+RwO6sGng==} + engines: {node: '>=14.16'} fix-dts-default-cjs-exports@1.0.0: - resolution: - { - integrity: sha512-i9Vd++WOWo6JilNgZvNvmy1T0r+/j7vikghQSEhKIuDwz4GjUrYj+Z18zlL7MleYNxE+xE6t3aG7LiAwA1P+dg==, - } + resolution: {integrity: sha512-i9Vd++WOWo6JilNgZvNvmy1T0r+/j7vikghQSEhKIuDwz4GjUrYj+Z18zlL7MleYNxE+xE6t3aG7LiAwA1P+dg==} flattie@1.1.1: - resolution: - { - integrity: sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==} + engines: {node: '>=8'} fontace@0.3.0: - resolution: - { - integrity: sha512-czoqATrcnxgWb/nAkfyIrRp6Q8biYj7nGnL6zfhTcX+JKKpWHFBnb8uNMw/kZr7u++3Y3wYSYoZgHkCcsuBpBg==, - } + resolution: {integrity: sha512-czoqATrcnxgWb/nAkfyIrRp6Q8biYj7nGnL6zfhTcX+JKKpWHFBnb8uNMw/kZr7u++3Y3wYSYoZgHkCcsuBpBg==} fontkit@2.0.4: - resolution: - { - integrity: sha512-syetQadaUEDNdxdugga9CpEYVaQIxOwk7GlwZWWZ19//qW4zE5bknOKeMBDYAASwnpaSHKJITRLMF9m1fp3s6g==, - } + resolution: {integrity: sha512-syetQadaUEDNdxdugga9CpEYVaQIxOwk7GlwZWWZ19//qW4zE5bknOKeMBDYAASwnpaSHKJITRLMF9m1fp3s6g==} foreground-child@3.3.1: - resolution: - { - integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==, - } - engines: { node: ">=14" } + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} + engines: {node: '>=14'} fraction.js@4.3.7: - resolution: - { - integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==, - } + resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} framer-motion@12.23.7: - resolution: - { - integrity: sha512-Qs+zNG9D/3c9C0riom1iXVVOOOaY3T32LIofgbQJz9APY/CUE5v6G41WkcZl2lVhaAgQDQcNq94f8qzLf3rTZA==, - } + resolution: {integrity: sha512-Qs+zNG9D/3c9C0riom1iXVVOOOaY3T32LIofgbQJz9APY/CUE5v6G41WkcZl2lVhaAgQDQcNq94f8qzLf3rTZA==} peerDependencies: - "@emotion/is-prop-valid": "*" + '@emotion/is-prop-valid': '*' react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 peerDependenciesMeta: - "@emotion/is-prop-valid": + '@emotion/is-prop-valid': optional: true react: optional: true @@ -6133,708 +3980,390 @@ packages: optional: true fs-constants@1.0.0: - resolution: - { - integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==, - } + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} fs-extra@11.3.0: - resolution: - { - integrity: sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==, - } - engines: { node: ">=14.14" } + resolution: {integrity: sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==} + engines: {node: '>=14.14'} fsevents@2.3.3: - resolution: - { - integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==, - } - engines: { node: ^8.16.0 || ^10.6.0 || >=11.0.0 } + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] function-bind@1.1.2: - resolution: - { - integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==, - } + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} fuse.js@7.1.0: - resolution: - { - integrity: sha512-trLf4SzuuUxfusZADLINj+dE8clK1frKdmqiJNb1Es75fmI5oY6X2mxLVUciLLjxqw/xr72Dhy+lER6dGd02FQ==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-trLf4SzuuUxfusZADLINj+dE8clK1frKdmqiJNb1Es75fmI5oY6X2mxLVUciLLjxqw/xr72Dhy+lER6dGd02FQ==} + engines: {node: '>=10'} gensync@1.0.0-beta.2: - resolution: - { - integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==, - } - engines: { node: ">=6.9.0" } + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} get-caller-file@2.0.5: - resolution: - { - integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==, - } - engines: { node: 6.* || 8.* || >= 10.* } + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} get-east-asian-width@1.4.0: - resolution: - { - integrity: sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==} + engines: {node: '>=18'} get-nonce@1.0.1: - resolution: - { - integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==, - } - engines: { node: ">=6" } + resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} + engines: {node: '>=6'} get-stream@9.0.1: - resolution: - { - integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==} + engines: {node: '>=18'} get-tsconfig@4.10.0: - resolution: - { - integrity: sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==, - } + resolution: {integrity: sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==} github-from-package@0.0.0: - resolution: - { - integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==, - } + resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} github-slugger@2.0.0: - resolution: - { - integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==, - } + resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} gl-matrix@3.4.4: - resolution: - { - integrity: sha512-latSnyDNt/8zYUB6VIJ6PCh2jBjJX6gnDsoCZ7LyW7GkqrD51EWwa9qCoGixj8YqBtETQK/xY7OmpTF8xz1DdQ==, - } + resolution: {integrity: sha512-latSnyDNt/8zYUB6VIJ6PCh2jBjJX6gnDsoCZ7LyW7GkqrD51EWwa9qCoGixj8YqBtETQK/xY7OmpTF8xz1DdQ==} glob-parent@5.1.2: - resolution: - { - integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==, - } - engines: { node: ">= 6" } + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} glob@10.4.5: - resolution: - { - integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==, - } + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} hasBin: true glob@11.0.3: - resolution: - { - integrity: sha512-2Nim7dha1KVkaiF4q6Dj+ngPPMdfvLJEOpZk/jKiUAkqKebpGAWQXAq9z1xu9HKu5lWfqw/FASuccEjyznjPaA==, - } - engines: { node: 20 || >=22 } + resolution: {integrity: sha512-2Nim7dha1KVkaiF4q6Dj+ngPPMdfvLJEOpZk/jKiUAkqKebpGAWQXAq9z1xu9HKu5lWfqw/FASuccEjyznjPaA==} + engines: {node: 20 || >=22} hasBin: true graceful-fs@4.2.11: - resolution: - { - integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==, - } + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} graphql@16.11.0: - resolution: - { - integrity: sha512-mS1lbMsxgQj6hge1XZ6p7GPhbrtFwUFYi3wRzXAC/FmYnyXMTvvI3td3rjmQ2u8ewXueaSvRPWaEcgVVOT9Jnw==, - } - engines: { node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0 } + resolution: {integrity: sha512-mS1lbMsxgQj6hge1XZ6p7GPhbrtFwUFYi3wRzXAC/FmYnyXMTvvI3td3rjmQ2u8ewXueaSvRPWaEcgVVOT9Jnw==} + engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} h3@1.15.4: - resolution: - { - integrity: sha512-z5cFQWDffyOe4vQ9xIqNfCZdV4p//vy6fBnr8Q1AWnVZ0teurKMG66rLj++TKwKPUP3u7iMUvrvKaEUiQw2QWQ==, - } + resolution: {integrity: sha512-z5cFQWDffyOe4vQ9xIqNfCZdV4p//vy6fBnr8Q1AWnVZ0teurKMG66rLj++TKwKPUP3u7iMUvrvKaEUiQw2QWQ==} has-flag@4.0.0: - resolution: - { - integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} hasown@2.0.2: - resolution: - { - integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} hast-util-embedded@3.0.0: - resolution: - { - integrity: sha512-naH8sld4Pe2ep03qqULEtvYr7EjrLK2QHY8KJR6RJkTUjPGObe1vnx585uzem2hGra+s1q08DZZpfgDVYRbaXA==, - } + resolution: {integrity: sha512-naH8sld4Pe2ep03qqULEtvYr7EjrLK2QHY8KJR6RJkTUjPGObe1vnx585uzem2hGra+s1q08DZZpfgDVYRbaXA==} hast-util-format@1.1.0: - resolution: - { - integrity: sha512-yY1UDz6bC9rDvCWHpx12aIBGRG7krurX0p0Fm6pT547LwDIZZiNr8a+IHDogorAdreULSEzP82Nlv5SZkHZcjA==, - } + resolution: {integrity: sha512-yY1UDz6bC9rDvCWHpx12aIBGRG7krurX0p0Fm6pT547LwDIZZiNr8a+IHDogorAdreULSEzP82Nlv5SZkHZcjA==} hast-util-from-html@2.0.3: - resolution: - { - integrity: sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==, - } + resolution: {integrity: sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==} hast-util-from-parse5@8.0.3: - resolution: - { - integrity: sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==, - } + resolution: {integrity: sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==} hast-util-has-property@3.0.0: - resolution: - { - integrity: sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA==, - } + resolution: {integrity: sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA==} hast-util-is-body-ok-link@3.0.1: - resolution: - { - integrity: sha512-0qpnzOBLztXHbHQenVB8uNuxTnm/QBFUOmdOSsEn7GnBtyY07+ENTWVFBAnXd/zEgd9/SUG3lRY7hSIBWRgGpQ==, - } + resolution: {integrity: sha512-0qpnzOBLztXHbHQenVB8uNuxTnm/QBFUOmdOSsEn7GnBtyY07+ENTWVFBAnXd/zEgd9/SUG3lRY7hSIBWRgGpQ==} hast-util-is-element@3.0.0: - resolution: - { - integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==, - } + resolution: {integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==} hast-util-minify-whitespace@1.0.1: - resolution: - { - integrity: sha512-L96fPOVpnclQE0xzdWb/D12VT5FabA7SnZOUMtL1DbXmYiHJMXZvFkIZfiMmTCNJHUeO2K9UYNXoVyfz+QHuOw==, - } + resolution: {integrity: sha512-L96fPOVpnclQE0xzdWb/D12VT5FabA7SnZOUMtL1DbXmYiHJMXZvFkIZfiMmTCNJHUeO2K9UYNXoVyfz+QHuOw==} hast-util-parse-selector@4.0.0: - resolution: - { - integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==, - } + resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} hast-util-phrasing@3.0.1: - resolution: - { - integrity: sha512-6h60VfI3uBQUxHqTyMymMZnEbNl1XmEGtOxxKYL7stY2o601COo62AWAYBQR9lZbYXYSBoxag8UpPRXK+9fqSQ==, - } + resolution: {integrity: sha512-6h60VfI3uBQUxHqTyMymMZnEbNl1XmEGtOxxKYL7stY2o601COo62AWAYBQR9lZbYXYSBoxag8UpPRXK+9fqSQ==} hast-util-raw@9.1.0: - resolution: - { - integrity: sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==, - } + resolution: {integrity: sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==} hast-util-select@6.0.4: - resolution: - { - integrity: sha512-RqGS1ZgI0MwxLaKLDxjprynNzINEkRHY2i8ln4DDjgv9ZhcYVIHN9rlpiYsqtFwrgpYU361SyWDQcGNIBVu3lw==, - } + resolution: {integrity: sha512-RqGS1ZgI0MwxLaKLDxjprynNzINEkRHY2i8ln4DDjgv9ZhcYVIHN9rlpiYsqtFwrgpYU361SyWDQcGNIBVu3lw==} hast-util-to-estree@3.1.3: - resolution: - { - integrity: sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w==, - } + resolution: {integrity: sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w==} hast-util-to-html@9.0.5: - resolution: - { - integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==, - } + resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==} hast-util-to-jsx-runtime@2.3.6: - resolution: - { - integrity: sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==, - } + resolution: {integrity: sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==} hast-util-to-parse5@8.0.0: - resolution: - { - integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==, - } + resolution: {integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==} hast-util-to-string@3.0.1: - resolution: - { - integrity: sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A==, - } + resolution: {integrity: sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A==} hast-util-to-text@4.0.2: - resolution: - { - integrity: sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==, - } + resolution: {integrity: sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==} hast-util-whitespace@3.0.0: - resolution: - { - integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==, - } + resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} hastscript@9.0.1: - resolution: - { - integrity: sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==, - } + resolution: {integrity: sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==} headers-polyfill@4.0.3: - resolution: - { - integrity: sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ==, - } + resolution: {integrity: sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ==} hookable@5.5.3: - resolution: - { - integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==, - } + resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} html-encoding-sniffer@4.0.0: - resolution: - { - integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} + engines: {node: '>=18'} html-escaper@2.0.2: - resolution: - { - integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==, - } + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} html-escaper@3.0.3: - resolution: - { - integrity: sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==, - } + resolution: {integrity: sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==} html-void-elements@3.0.0: - resolution: - { - integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==, - } + resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} html-whitespace-sensitive-tag-names@3.0.1: - resolution: - { - integrity: sha512-q+310vW8zmymYHALr1da4HyXUQ0zgiIwIicEfotYPWGN0OJVEN/58IJ3A4GBYcEq3LGAZqKb+ugvP0GNB9CEAA==, - } + resolution: {integrity: sha512-q+310vW8zmymYHALr1da4HyXUQ0zgiIwIicEfotYPWGN0OJVEN/58IJ3A4GBYcEq3LGAZqKb+ugvP0GNB9CEAA==} http-cache-semantics@4.2.0: - resolution: - { - integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==, - } + resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} http-proxy-agent@7.0.2: - resolution: - { - integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==, - } - engines: { node: ">= 14" } + resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} + engines: {node: '>= 14'} https-proxy-agent@7.0.6: - resolution: - { - integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==, - } - engines: { node: ">= 14" } + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} + engines: {node: '>= 14'} human-signals@8.0.1: - resolution: - { - integrity: sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==, - } - engines: { node: ">=18.18.0" } + resolution: {integrity: sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==} + engines: {node: '>=18.18.0'} i18next@23.16.8: - resolution: - { - integrity: sha512-06r/TitrM88Mg5FdUXAKL96dJMzgqLE5dv3ryBAra4KCwD9mJ4ndOTS95ZuymIGoE+2hzfdaMak2X11/es7ZWg==, - } + resolution: {integrity: sha512-06r/TitrM88Mg5FdUXAKL96dJMzgqLE5dv3ryBAra4KCwD9mJ4ndOTS95ZuymIGoE+2hzfdaMak2X11/es7ZWg==} iconv-lite@0.6.3: - resolution: - { - integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==, - } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} ieee754@1.2.1: - resolution: - { - integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==, - } + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} ignore@5.3.2: - resolution: - { - integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==, - } - engines: { node: ">= 4" } + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} imagetools-core@7.1.0: - resolution: - { - integrity: sha512-8Aa4NecBBGmTkaAUjcuRYgTPKHCsBEWYmCnvKCL6/bxedehtVVFyZPdXe8DD0Nevd6UWBq85ifUaJ8498lgqNQ==, - } - engines: { node: ">=18.0.0" } + resolution: {integrity: sha512-8Aa4NecBBGmTkaAUjcuRYgTPKHCsBEWYmCnvKCL6/bxedehtVVFyZPdXe8DD0Nevd6UWBq85ifUaJ8498lgqNQ==} + engines: {node: '>=18.0.0'} import-meta-resolve@4.2.0: - resolution: - { - integrity: sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==, - } + resolution: {integrity: sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==} inherits@2.0.4: - resolution: - { - integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==, - } + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} ini@1.3.8: - resolution: - { - integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==, - } + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} inline-style-parser@0.2.4: - resolution: - { - integrity: sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==, - } + resolution: {integrity: sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==} internmap@2.0.3: - resolution: - { - integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} + engines: {node: '>=12'} interval-tree-1d@1.0.4: - resolution: - { - integrity: sha512-wY8QJH+6wNI0uh4pDQzMvl+478Qh7Rl4qLmqiluxALlNvl+I+o5x38Pw3/z7mDPTPS1dQalZJXsmbvxx5gclhQ==, - } + resolution: {integrity: sha512-wY8QJH+6wNI0uh4pDQzMvl+478Qh7Rl4qLmqiluxALlNvl+I+o5x38Pw3/z7mDPTPS1dQalZJXsmbvxx5gclhQ==} iron-webcrypto@1.2.1: - resolution: - { - integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==, - } + resolution: {integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==} is-alphabetical@2.0.1: - resolution: - { - integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==, - } + resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} is-alphanumerical@2.0.1: - resolution: - { - integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==, - } + resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} is-arrayish@0.3.2: - resolution: - { - integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==, - } + resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} is-core-module@2.16.1: - resolution: - { - integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} is-decimal@2.0.1: - resolution: - { - integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==, - } + resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} is-docker@3.0.0: - resolution: - { - integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==, - } - engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} hasBin: true is-extglob@2.1.1: - resolution: - { - integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==, - } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} is-fullwidth-code-point@3.0.0: - resolution: - { - integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} is-glob@4.0.3: - resolution: - { - integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==, - } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} is-hexadecimal@2.0.1: - resolution: - { - integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==, - } + resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} is-inside-container@1.0.0: - resolution: - { - integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==, - } - engines: { node: ">=14.16" } + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} hasBin: true is-interactive@1.0.0: - resolution: - { - integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} + engines: {node: '>=8'} is-module@1.0.0: - resolution: - { - integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==, - } + resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} is-node-process@1.2.0: - resolution: - { - integrity: sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==, - } + resolution: {integrity: sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==} is-number@7.0.0: - resolution: - { - integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==, - } - engines: { node: ">=0.12.0" } + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} is-plain-obj@4.1.0: - resolution: - { - integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} is-potential-custom-element-name@1.0.1: - resolution: - { - integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==, - } + resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} is-reference@1.2.1: - resolution: - { - integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==, - } + resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} is-stream@4.0.1: - resolution: - { - integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==} + engines: {node: '>=18'} is-unicode-supported@0.1.0: - resolution: - { - integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} is-unicode-supported@2.1.0: - resolution: - { - integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} + engines: {node: '>=18'} is-wsl@3.1.0: - resolution: - { - integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==, - } - engines: { node: ">=16" } + resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} + engines: {node: '>=16'} isbinaryfile@5.0.4: - resolution: - { - integrity: sha512-YKBKVkKhty7s8rxddb40oOkuP0NbaeXrQvLin6QMHL7Ypiy2RW9LwOVrVgZRyOrhQlayMd9t+D8yDy8MKFTSDQ==, - } - engines: { node: ">= 18.0.0" } + resolution: {integrity: sha512-YKBKVkKhty7s8rxddb40oOkuP0NbaeXrQvLin6QMHL7Ypiy2RW9LwOVrVgZRyOrhQlayMd9t+D8yDy8MKFTSDQ==} + engines: {node: '>= 18.0.0'} isexe@2.0.0: - resolution: - { - integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==, - } + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} isoformat@0.2.1: - resolution: - { - integrity: sha512-tFLRAygk9NqrRPhJSnNGh7g7oaVWDwR0wKh/GM2LgmPa50Eg4UfyaCO4I8k6EqJHl1/uh2RAD6g06n5ygEnrjQ==, - } + resolution: {integrity: sha512-tFLRAygk9NqrRPhJSnNGh7g7oaVWDwR0wKh/GM2LgmPa50Eg4UfyaCO4I8k6EqJHl1/uh2RAD6g06n5ygEnrjQ==} istanbul-lib-coverage@3.2.2: - resolution: - { - integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + engines: {node: '>=8'} istanbul-lib-report@3.0.1: - resolution: - { - integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} istanbul-lib-source-maps@5.0.6: - resolution: - { - integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==} + engines: {node: '>=10'} istanbul-reports@3.1.7: - resolution: - { - integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} + engines: {node: '>=8'} jackspeak@3.4.3: - resolution: - { - integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==, - } + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} jackspeak@4.1.1: - resolution: - { - integrity: sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==, - } - engines: { node: 20 || >=22 } + resolution: {integrity: sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==} + engines: {node: 20 || >=22} jiti@1.21.7: - resolution: - { - integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==, - } + resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==} hasBin: true jiti@2.4.2: - resolution: - { - integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==, - } + resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} hasBin: true jiti@2.5.1: - resolution: - { - integrity: sha512-twQoecYPiVA5K/h6SxtORw/Bs3ar+mLUtoPSc7iMXzQzK8d7eJ/R09wmTwAjiamETn1cXYPGfNnu7DMoHgu12w==, - } + resolution: {integrity: sha512-twQoecYPiVA5K/h6SxtORw/Bs3ar+mLUtoPSc7iMXzQzK8d7eJ/R09wmTwAjiamETn1cXYPGfNnu7DMoHgu12w==} hasBin: true jotai-location@0.6.2: - resolution: - { - integrity: sha512-D+fqGNNgPHpehOsGBsYsS7F3kNgml099MJrGYt8YlLumcnoTVrBdcO+Y11KyMlyzwPihEN0HPUgke9Iihz9OXw==, - } + resolution: {integrity: sha512-D+fqGNNgPHpehOsGBsYsS7F3kNgml099MJrGYt8YlLumcnoTVrBdcO+Y11KyMlyzwPihEN0HPUgke9Iihz9OXw==} peerDependencies: - jotai: ">=1.11.0" + jotai: '>=1.11.0' jotai@2.14.0: - resolution: - { - integrity: sha512-JQkNkTnqjk1BlSUjHfXi+pGG/573bVN104gp6CymhrWDseZGDReTNniWrLhJ+zXbM6pH+82+UNJ2vwYQUkQMWQ==, - } - engines: { node: ">=12.20.0" } + resolution: {integrity: sha512-JQkNkTnqjk1BlSUjHfXi+pGG/573bVN104gp6CymhrWDseZGDReTNniWrLhJ+zXbM6pH+82+UNJ2vwYQUkQMWQ==} + engines: {node: '>=12.20.0'} peerDependencies: - "@babel/core": ">=7.0.0" - "@babel/template": ">=7.0.0" - "@types/react": ">=17.0.0" - react: ">=17.0.0" + '@babel/core': '>=7.0.0' + '@babel/template': '>=7.0.0' + '@types/react': '>=17.0.0' + react: '>=17.0.0' peerDependenciesMeta: - "@babel/core": + '@babel/core': optional: true - "@babel/template": + '@babel/template': optional: true - "@types/react": + '@types/react': optional: true react: optional: true joycon@3.1.1: - resolution: - { - integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} + engines: {node: '>=10'} js-tokens@4.0.0: - resolution: - { - integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==, - } + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} js-tokens@9.0.1: - resolution: - { - integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==, - } + resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} js-yaml@4.1.0: - resolution: - { - integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==, - } + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true jsdom@27.0.0: - resolution: - { - integrity: sha512-lIHeR1qlIRrIN5VMccd8tI2Sgw6ieYXSVktcSHaNe3Z5nE/tcPQYQWOq00wxMvYOsz+73eAkNenVvmPC6bba9A==, - } - engines: { node: ">=20" } + resolution: {integrity: sha512-lIHeR1qlIRrIN5VMccd8tI2Sgw6ieYXSVktcSHaNe3Z5nE/tcPQYQWOq00wxMvYOsz+73eAkNenVvmPC6bba9A==} + engines: {node: '>=20'} peerDependencies: canvas: ^3.0.0 peerDependenciesMeta: @@ -6842,874 +4371,478 @@ packages: optional: true jsesc@3.1.0: - resolution: - { - integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==, - } - engines: { node: ">=6" } + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} hasBin: true json-schema-traverse@1.0.0: - resolution: - { - integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==, - } + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} json5@2.2.3: - resolution: - { - integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==, - } - engines: { node: ">=6" } + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} hasBin: true jsonc-parser@2.3.1: - resolution: - { - integrity: sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg==, - } + resolution: {integrity: sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg==} jsonc-parser@3.3.1: - resolution: - { - integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==, - } + resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==} jsonfile@6.1.0: - resolution: - { - integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==, - } + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} jsonparse@1.3.1: - resolution: - { - integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==, - } - engines: { "0": node >= 0.2.0 } + resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} + engines: {'0': node >= 0.2.0} jsonstream-next@3.0.0: - resolution: - { - integrity: sha512-aAi6oPhdt7BKyQn1SrIIGZBt0ukKuOUE1qV6kJ3GgioSOYzsRc8z9Hfr1BVmacA/jLe9nARfmgMGgn68BqIAgg==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-aAi6oPhdt7BKyQn1SrIIGZBt0ukKuOUE1qV6kJ3GgioSOYzsRc8z9Hfr1BVmacA/jLe9nARfmgMGgn68BqIAgg==} + engines: {node: '>=10'} hasBin: true katex@0.16.22: - resolution: - { - integrity: sha512-XCHRdUw4lf3SKBaJe4EvgqIuWwkPSo9XoeO8GjQW94Bp7TWv9hNhzZjZ+OH9yf1UmLygb7DIT5GSFQiyt16zYg==, - } + resolution: {integrity: sha512-XCHRdUw4lf3SKBaJe4EvgqIuWwkPSo9XoeO8GjQW94Bp7TWv9hNhzZjZ+OH9yf1UmLygb7DIT5GSFQiyt16zYg==} hasBin: true kleur@3.0.3: - resolution: - { - integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==, - } - engines: { node: ">=6" } + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} kleur@4.1.5: - resolution: - { - integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==, - } - engines: { node: ">=6" } + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} klona@2.0.6: - resolution: - { - integrity: sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==, - } - engines: { node: ">= 8" } + resolution: {integrity: sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==} + engines: {node: '>= 8'} knitwork@1.2.0: - resolution: - { - integrity: sha512-xYSH7AvuQ6nXkq42x0v5S8/Iry+cfulBz/DJQzhIyESdLD7425jXsPy4vn5cCXU+HhRN2kVw51Vd1K6/By4BQg==, - } + resolution: {integrity: sha512-xYSH7AvuQ6nXkq42x0v5S8/Iry+cfulBz/DJQzhIyESdLD7425jXsPy4vn5cCXU+HhRN2kVw51Vd1K6/By4BQg==} lightningcss-darwin-arm64@1.30.1: - resolution: - { - integrity: sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==, - } - engines: { node: ">= 12.0.0" } + resolution: {integrity: sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==} + engines: {node: '>= 12.0.0'} cpu: [arm64] os: [darwin] lightningcss-darwin-x64@1.30.1: - resolution: - { - integrity: sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==, - } - engines: { node: ">= 12.0.0" } + resolution: {integrity: sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==} + engines: {node: '>= 12.0.0'} cpu: [x64] os: [darwin] lightningcss-freebsd-x64@1.30.1: - resolution: - { - integrity: sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==, - } - engines: { node: ">= 12.0.0" } + resolution: {integrity: sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==} + engines: {node: '>= 12.0.0'} cpu: [x64] os: [freebsd] lightningcss-linux-arm-gnueabihf@1.30.1: - resolution: - { - integrity: sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==, - } - engines: { node: ">= 12.0.0" } + resolution: {integrity: sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==} + engines: {node: '>= 12.0.0'} cpu: [arm] os: [linux] lightningcss-linux-arm64-gnu@1.30.1: - resolution: - { - integrity: sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==, - } - engines: { node: ">= 12.0.0" } + resolution: {integrity: sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==} + engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] lightningcss-linux-arm64-musl@1.30.1: - resolution: - { - integrity: sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==, - } - engines: { node: ">= 12.0.0" } + resolution: {integrity: sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==} + engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] lightningcss-linux-x64-gnu@1.30.1: - resolution: - { - integrity: sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==, - } - engines: { node: ">= 12.0.0" } + resolution: {integrity: sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==} + engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] lightningcss-linux-x64-musl@1.30.1: - resolution: - { - integrity: sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==, - } - engines: { node: ">= 12.0.0" } + resolution: {integrity: sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==} + engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] lightningcss-win32-arm64-msvc@1.30.1: - resolution: - { - integrity: sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==, - } - engines: { node: ">= 12.0.0" } + resolution: {integrity: sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==} + engines: {node: '>= 12.0.0'} cpu: [arm64] os: [win32] lightningcss-win32-x64-msvc@1.30.1: - resolution: - { - integrity: sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==, - } - engines: { node: ">= 12.0.0" } + resolution: {integrity: sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==} + engines: {node: '>= 12.0.0'} cpu: [x64] os: [win32] lightningcss@1.30.1: - resolution: - { - integrity: sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==, - } - engines: { node: ">= 12.0.0" } + resolution: {integrity: sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==} + engines: {node: '>= 12.0.0'} lilconfig@3.1.3: - resolution: - { - integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==, - } - engines: { node: ">=14" } + resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} + engines: {node: '>=14'} lines-and-columns@1.2.4: - resolution: - { - integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==, - } + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} linkify-it@5.0.0: - resolution: - { - integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==, - } + resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} load-tsconfig@0.2.5: - resolution: - { - integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==, - } - engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} lodash.memoize@4.1.2: - resolution: - { - integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==, - } + resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} lodash.sortby@4.7.0: - resolution: - { - integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==, - } + resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} lodash.uniq@4.5.0: - resolution: - { - integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==, - } + resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} lodash@4.17.21: - resolution: - { - integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==, - } + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} log-symbols@4.1.0: - resolution: - { - integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} longest-streak@3.1.0: - resolution: - { - integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==, - } + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} loupe@3.1.4: - resolution: - { - integrity: sha512-wJzkKwJrheKtknCOKNEtDK4iqg/MxmZheEMtSTYvnzRdEYaZzmgH976nenp8WdJRdx5Vc1X/9MO0Oszl6ezeXg==, - } + resolution: {integrity: sha512-wJzkKwJrheKtknCOKNEtDK4iqg/MxmZheEMtSTYvnzRdEYaZzmgH976nenp8WdJRdx5Vc1X/9MO0Oszl6ezeXg==} lru-cache@10.4.3: - resolution: - { - integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==, - } + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} lru-cache@11.1.0: - resolution: - { - integrity: sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A==, - } - engines: { node: 20 || >=22 } + resolution: {integrity: sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A==} + engines: {node: 20 || >=22} lru-cache@11.2.2: - resolution: - { - integrity: sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==, - } - engines: { node: 20 || >=22 } + resolution: {integrity: sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==} + engines: {node: 20 || >=22} lru-cache@5.1.1: - resolution: - { - integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==, - } + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} lucide-react@0.536.0: - resolution: - { - integrity: sha512-2PgvNa9v+qz4Jt/ni8vPLt4jwoFybXHuubQT8fv4iCW5TjDxkbZjNZZHa485ad73NSEn/jdsEtU57eE1g+ma8A==, - } + resolution: {integrity: sha512-2PgvNa9v+qz4Jt/ni8vPLt4jwoFybXHuubQT8fv4iCW5TjDxkbZjNZZHa485ad73NSEn/jdsEtU57eE1g+ma8A==} peerDependencies: react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 lunr@2.3.9: - resolution: - { - integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==, - } + resolution: {integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==} lz-string@1.5.0: - resolution: - { - integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==, - } + resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} hasBin: true magic-string-ast@1.0.0: - resolution: - { - integrity: sha512-8rbuNizut2gW94kv7pqgt0dvk+AHLPVIm0iJtpSgQJ9dx21eWx5SBel8z3jp1xtC0j6/iyK3AWGhAR1H61s7LA==, - } - engines: { node: ">=20.18.0" } + resolution: {integrity: sha512-8rbuNizut2gW94kv7pqgt0dvk+AHLPVIm0iJtpSgQJ9dx21eWx5SBel8z3jp1xtC0j6/iyK3AWGhAR1H61s7LA==} + engines: {node: '>=20.18.0'} magic-string@0.30.17: - resolution: - { - integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==, - } + resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} magic-string@0.30.19: - resolution: - { - integrity: sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==, - } + resolution: {integrity: sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==} magicast@0.3.5: - resolution: - { - integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==, - } + resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} make-dir@4.0.0: - resolution: - { - integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} make-synchronized@0.4.2: - resolution: - { - integrity: sha512-EwEJSg8gSGLicKXp/VzNi1tvzhdmNBxOzslkkJSoNUCQFZKH/NIUIp7xlfN+noaHrz4BJDN73gne8IHnjl/F/A==, - } + resolution: {integrity: sha512-EwEJSg8gSGLicKXp/VzNi1tvzhdmNBxOzslkkJSoNUCQFZKH/NIUIp7xlfN+noaHrz4BJDN73gne8IHnjl/F/A==} markdown-extensions@2.0.0: - resolution: - { - integrity: sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==, - } - engines: { node: ">=16" } + resolution: {integrity: sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==} + engines: {node: '>=16'} markdown-it@14.1.0: - resolution: - { - integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==, - } + resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} hasBin: true markdown-table@3.0.4: - resolution: - { - integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==, - } + resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} marked-footnote@1.2.4: - resolution: - { - integrity: sha512-DB2Kl+wFh6YwZd70qABMY6WUkG1UuyqoNTFoDfGyG79Pz24neYtLBkB+45a7o72V7gkfvbC3CGzIYFobxfMT1Q==, - } + resolution: {integrity: sha512-DB2Kl+wFh6YwZd70qABMY6WUkG1UuyqoNTFoDfGyG79Pz24neYtLBkB+45a7o72V7gkfvbC3CGzIYFobxfMT1Q==} peerDependencies: - marked: ">=7.0.0" + marked: '>=7.0.0' marked-plaintify@1.1.1: - resolution: - { - integrity: sha512-r3kMKArhfo2H3lD4ctFq/OJTzM0uNvXHh7FBTI1hMDpf4Ac1djjtq4g8NfTBWMxWLmaEz3KL1jCkLygik3gExA==, - } + resolution: {integrity: sha512-r3kMKArhfo2H3lD4ctFq/OJTzM0uNvXHh7FBTI1hMDpf4Ac1djjtq4g8NfTBWMxWLmaEz3KL1jCkLygik3gExA==} peerDependencies: - marked: ">=13.0.0" + marked: '>=13.0.0' marked-smartypants@1.1.9: - resolution: - { - integrity: sha512-VPeuaUr5IWptI7nJdgQ9ugrLWYGv13NdzEXTtKY3cmB4aRWOI2RzhLlf+xQp6Wnob9SAPO2sNVlfSJr+nflk/A==, - } + resolution: {integrity: sha512-VPeuaUr5IWptI7nJdgQ9ugrLWYGv13NdzEXTtKY3cmB4aRWOI2RzhLlf+xQp6Wnob9SAPO2sNVlfSJr+nflk/A==} peerDependencies: - marked: ">=4 <16" + marked: '>=4 <16' marked@12.0.2: - resolution: - { - integrity: sha512-qXUm7e/YKFoqFPYPa3Ukg9xlI5cyAtGmyEIzMfW//m6kXwCy2Ps9DYf5ioijFKQ8qyuscrHoY04iJGctu2Kg0Q==, - } - engines: { node: ">= 18" } + resolution: {integrity: sha512-qXUm7e/YKFoqFPYPa3Ukg9xlI5cyAtGmyEIzMfW//m6kXwCy2Ps9DYf5ioijFKQ8qyuscrHoY04iJGctu2Kg0Q==} + engines: {node: '>= 18'} hasBin: true marked@15.0.7: - resolution: - { - integrity: sha512-dgLIeKGLx5FwziAnsk4ONoGwHwGPJzselimvlVskE9XLN4Orv9u2VA3GWw/lYUqjfA0rUT/6fqKwfZJapP9BEg==, - } - engines: { node: ">= 18" } + resolution: {integrity: sha512-dgLIeKGLx5FwziAnsk4ONoGwHwGPJzselimvlVskE9XLN4Orv9u2VA3GWw/lYUqjfA0rUT/6fqKwfZJapP9BEg==} + engines: {node: '>= 18'} hasBin: true mathjax-full@3.2.2: - resolution: - { - integrity: sha512-+LfG9Fik+OuI8SLwsiR02IVdjcnRCy5MufYLi0C3TdMT56L/pjB0alMVGgoWJF8pN9Rc7FESycZB9BMNWIid5w==, - } + resolution: {integrity: sha512-+LfG9Fik+OuI8SLwsiR02IVdjcnRCy5MufYLi0C3TdMT56L/pjB0alMVGgoWJF8pN9Rc7FESycZB9BMNWIid5w==} mdast-util-definitions@6.0.0: - resolution: - { - integrity: sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ==, - } + resolution: {integrity: sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ==} mdast-util-directive@3.1.0: - resolution: - { - integrity: sha512-I3fNFt+DHmpWCYAT7quoM6lHf9wuqtI+oCOfvILnoicNIqjh5E3dEJWiXuYME2gNe8vl1iMQwyUHa7bgFmak6Q==, - } + resolution: {integrity: sha512-I3fNFt+DHmpWCYAT7quoM6lHf9wuqtI+oCOfvILnoicNIqjh5E3dEJWiXuYME2gNe8vl1iMQwyUHa7bgFmak6Q==} mdast-util-find-and-replace@3.0.2: - resolution: - { - integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==, - } + resolution: {integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==} mdast-util-from-markdown@2.0.2: - resolution: - { - integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==, - } + resolution: {integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==} mdast-util-gfm-autolink-literal@2.0.1: - resolution: - { - integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==, - } + resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==} mdast-util-gfm-footnote@2.1.0: - resolution: - { - integrity: sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==, - } + resolution: {integrity: sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==} mdast-util-gfm-strikethrough@2.0.0: - resolution: - { - integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==, - } + resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} mdast-util-gfm-table@2.0.0: - resolution: - { - integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==, - } + resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==} mdast-util-gfm-task-list-item@2.0.0: - resolution: - { - integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==, - } + resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} mdast-util-gfm@3.1.0: - resolution: - { - integrity: sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==, - } + resolution: {integrity: sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==} mdast-util-math@3.0.0: - resolution: - { - integrity: sha512-Tl9GBNeG/AhJnQM221bJR2HPvLOSnLE/T9cJI9tlc6zwQk2nPk/4f0cHkOdEixQPC/j8UtKDdITswvLAy1OZ1w==, - } + resolution: {integrity: sha512-Tl9GBNeG/AhJnQM221bJR2HPvLOSnLE/T9cJI9tlc6zwQk2nPk/4f0cHkOdEixQPC/j8UtKDdITswvLAy1OZ1w==} mdast-util-mdx-expression@2.0.1: - resolution: - { - integrity: sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==, - } + resolution: {integrity: sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==} mdast-util-mdx-jsx@3.2.0: - resolution: - { - integrity: sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==, - } + resolution: {integrity: sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==} mdast-util-mdx@3.0.0: - resolution: - { - integrity: sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==, - } + resolution: {integrity: sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==} mdast-util-mdxjs-esm@2.0.1: - resolution: - { - integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==, - } + resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==} mdast-util-phrasing@4.1.0: - resolution: - { - integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==, - } + resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} mdast-util-to-hast@13.2.0: - resolution: - { - integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==, - } + resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==} mdast-util-to-markdown@2.1.2: - resolution: - { - integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==, - } + resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==} mdast-util-to-string@4.0.0: - resolution: - { - integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==, - } + resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} mdn-data@2.0.28: - resolution: - { - integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==, - } + resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==} mdn-data@2.0.30: - resolution: - { - integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==, - } + resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} mdn-data@2.12.2: - resolution: - { - integrity: sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==, - } + resolution: {integrity: sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==} mdurl@2.0.0: - resolution: - { - integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==, - } + resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} merge2@1.4.1: - resolution: - { - integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==, - } - engines: { node: ">= 8" } + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} mhchemparser@4.2.1: - resolution: - { - integrity: sha512-kYmyrCirqJf3zZ9t/0wGgRZ4/ZJw//VwaRVGA75C4nhE60vtnIzhl9J9ndkX/h6hxSN7pjg/cE0VxbnNM+bnDQ==, - } + resolution: {integrity: sha512-kYmyrCirqJf3zZ9t/0wGgRZ4/ZJw//VwaRVGA75C4nhE60vtnIzhl9J9ndkX/h6hxSN7pjg/cE0VxbnNM+bnDQ==} micromark-core-commonmark@2.0.3: - resolution: - { - integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==, - } + resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} micromark-extension-directive@3.0.2: - resolution: - { - integrity: sha512-wjcXHgk+PPdmvR58Le9d7zQYWy+vKEU9Se44p2CrCDPiLr2FMyiT4Fyb5UFKFC66wGB3kPlgD7q3TnoqPS7SZA==, - } + resolution: {integrity: sha512-wjcXHgk+PPdmvR58Le9d7zQYWy+vKEU9Se44p2CrCDPiLr2FMyiT4Fyb5UFKFC66wGB3kPlgD7q3TnoqPS7SZA==} micromark-extension-gfm-autolink-literal@2.1.0: - resolution: - { - integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==, - } + resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==} micromark-extension-gfm-footnote@2.1.0: - resolution: - { - integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==, - } + resolution: {integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==} micromark-extension-gfm-strikethrough@2.1.0: - resolution: - { - integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==, - } + resolution: {integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==} micromark-extension-gfm-table@2.1.1: - resolution: - { - integrity: sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==, - } + resolution: {integrity: sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==} micromark-extension-gfm-tagfilter@2.0.0: - resolution: - { - integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==, - } + resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==} micromark-extension-gfm-task-list-item@2.1.0: - resolution: - { - integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==, - } + resolution: {integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==} micromark-extension-gfm@3.0.0: - resolution: - { - integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==, - } + resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} micromark-extension-math@3.1.0: - resolution: - { - integrity: sha512-lvEqd+fHjATVs+2v/8kg9i5Q0AP2k85H0WUOwpIVvUML8BapsMvh1XAogmQjOCsLpoKRCVQqEkQBB3NhVBcsOg==, - } + resolution: {integrity: sha512-lvEqd+fHjATVs+2v/8kg9i5Q0AP2k85H0WUOwpIVvUML8BapsMvh1XAogmQjOCsLpoKRCVQqEkQBB3NhVBcsOg==} micromark-extension-mdx-expression@3.0.0: - resolution: - { - integrity: sha512-sI0nwhUDz97xyzqJAbHQhp5TfaxEvZZZ2JDqUo+7NvyIYG6BZ5CPPqj2ogUoPJlmXHBnyZUzISg9+oUmU6tUjQ==, - } + resolution: {integrity: sha512-sI0nwhUDz97xyzqJAbHQhp5TfaxEvZZZ2JDqUo+7NvyIYG6BZ5CPPqj2ogUoPJlmXHBnyZUzISg9+oUmU6tUjQ==} micromark-extension-mdx-jsx@3.0.1: - resolution: - { - integrity: sha512-vNuFb9czP8QCtAQcEJn0UJQJZA8Dk6DXKBqx+bg/w0WGuSxDxNr7hErW89tHUY31dUW4NqEOWwmEUNhjTFmHkg==, - } + resolution: {integrity: sha512-vNuFb9czP8QCtAQcEJn0UJQJZA8Dk6DXKBqx+bg/w0WGuSxDxNr7hErW89tHUY31dUW4NqEOWwmEUNhjTFmHkg==} micromark-extension-mdx-md@2.0.0: - resolution: - { - integrity: sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==, - } + resolution: {integrity: sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==} micromark-extension-mdxjs-esm@3.0.0: - resolution: - { - integrity: sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==, - } + resolution: {integrity: sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==} micromark-extension-mdxjs@3.0.0: - resolution: - { - integrity: sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==, - } + resolution: {integrity: sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==} micromark-factory-destination@2.0.1: - resolution: - { - integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==, - } + resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} micromark-factory-label@2.0.1: - resolution: - { - integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==, - } + resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==} micromark-factory-mdx-expression@2.0.2: - resolution: - { - integrity: sha512-5E5I2pFzJyg2CtemqAbcyCktpHXuJbABnsb32wX2U8IQKhhVFBqkcZR5LRm1WVoFqa4kTueZK4abep7wdo9nrw==, - } + resolution: {integrity: sha512-5E5I2pFzJyg2CtemqAbcyCktpHXuJbABnsb32wX2U8IQKhhVFBqkcZR5LRm1WVoFqa4kTueZK4abep7wdo9nrw==} micromark-factory-space@2.0.1: - resolution: - { - integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==, - } + resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==} micromark-factory-title@2.0.1: - resolution: - { - integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==, - } + resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==} micromark-factory-whitespace@2.0.1: - resolution: - { - integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==, - } + resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==} micromark-util-character@2.1.1: - resolution: - { - integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==, - } + resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} micromark-util-chunked@2.0.1: - resolution: - { - integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==, - } + resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==} micromark-util-classify-character@2.0.1: - resolution: - { - integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==, - } + resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==} micromark-util-combine-extensions@2.0.1: - resolution: - { - integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==, - } + resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==} micromark-util-decode-numeric-character-reference@2.0.2: - resolution: - { - integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==, - } + resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==} micromark-util-decode-string@2.0.1: - resolution: - { - integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==, - } + resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==} micromark-util-encode@2.0.1: - resolution: - { - integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==, - } + resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} micromark-util-events-to-acorn@2.0.2: - resolution: - { - integrity: sha512-Fk+xmBrOv9QZnEDguL9OI9/NQQp6Hz4FuQ4YmCb/5V7+9eAh1s6AYSvL20kHkD67YIg7EpE54TiSlcsf3vyZgA==, - } + resolution: {integrity: sha512-Fk+xmBrOv9QZnEDguL9OI9/NQQp6Hz4FuQ4YmCb/5V7+9eAh1s6AYSvL20kHkD67YIg7EpE54TiSlcsf3vyZgA==} micromark-util-html-tag-name@2.0.1: - resolution: - { - integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==, - } + resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==} micromark-util-normalize-identifier@2.0.1: - resolution: - { - integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==, - } + resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==} micromark-util-resolve-all@2.0.1: - resolution: - { - integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==, - } + resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==} micromark-util-sanitize-uri@2.0.1: - resolution: - { - integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==, - } + resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} micromark-util-subtokenize@2.1.0: - resolution: - { - integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==, - } + resolution: {integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==} micromark-util-symbol@2.0.1: - resolution: - { - integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==, - } + resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} micromark-util-types@2.0.2: - resolution: - { - integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==, - } + resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} micromark@4.0.1: - resolution: - { - integrity: sha512-eBPdkcoCNvYcxQOAKAlceo5SNdzZWfF+FcSupREAzdAh9rRmE239CEQAiTwIgblwnoM8zzj35sZ5ZwvSEOF6Kw==, - } + resolution: {integrity: sha512-eBPdkcoCNvYcxQOAKAlceo5SNdzZWfF+FcSupREAzdAh9rRmE239CEQAiTwIgblwnoM8zzj35sZ5ZwvSEOF6Kw==} micromatch@4.0.8: - resolution: - { - integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==, - } - engines: { node: ">=8.6" } + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} mimic-fn@2.1.0: - resolution: - { - integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==, - } - engines: { node: ">=6" } + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} mimic-response@3.1.0: - resolution: - { - integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} mini-parse@0.6.7: - resolution: - { - integrity: sha512-rxyTgJNp4GwmE0JGFx8DKLuJfdiMV7TRP/aonobpIdL0Fp4RxkEX16A/rFpGhD5B3UzEYJZ7S8EtbQbdJPWQew==, - } + resolution: {integrity: sha512-rxyTgJNp4GwmE0JGFx8DKLuJfdiMV7TRP/aonobpIdL0Fp4RxkEX16A/rFpGhD5B3UzEYJZ7S8EtbQbdJPWQew==} minimatch@10.0.3: - resolution: - { - integrity: sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==, - } - engines: { node: 20 || >=22 } + resolution: {integrity: sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==} + engines: {node: 20 || >=22} minimatch@9.0.5: - resolution: - { - integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==, - } - engines: { node: ">=16 || 14 >=14.17" } + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} minimist@1.2.8: - resolution: - { - integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==, - } + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} minipass@7.1.2: - resolution: - { - integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==, - } - engines: { node: ">=16 || 14 >=14.17" } + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} minizlib@3.0.2: - resolution: - { - integrity: sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==, - } - engines: { node: ">= 18" } - + resolution: {integrity: sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==} + engines: {node: '>= 18'} + mj-context-menu@0.6.1: - resolution: - { - integrity: sha512-7NO5s6n10TIV96d4g2uDpG7ZDpIhMh0QNfGdJw/W47JswFcosz457wqz/b5sAKvl12sxINGFCn80NZHKwxQEXA==, - } - + resolution: {integrity: sha512-7NO5s6n10TIV96d4g2uDpG7ZDpIhMh0QNfGdJw/W47JswFcosz457wqz/b5sAKvl12sxINGFCn80NZHKwxQEXA==} + mkdirp-classic@0.5.3: - resolution: - { - integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==, - } + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} mkdirp@3.0.1: - resolution: - { - integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} + engines: {node: '>=10'} hasBin: true mkdist@2.2.0: - resolution: - { - integrity: sha512-GfKwu4A2grXfhj2TZm4ydfzP515NaALqKaPq4WqaZ6NhEnD47BiIQPySoCTTvVqHxYcuqVkNdCXjYf9Bz1Y04Q==, - } + resolution: {integrity: sha512-GfKwu4A2grXfhj2TZm4ydfzP515NaALqKaPq4WqaZ6NhEnD47BiIQPySoCTTvVqHxYcuqVkNdCXjYf9Bz1Y04Q==} hasBin: true peerDependencies: sass: ^1.83.0 - typescript: ">=5.7.2" + typescript: '>=5.7.2' vue: ^3.5.13 vue-tsc: ^1.8.27 || ^2.0.21 peerDependenciesMeta: @@ -7723,52 +4856,31 @@ packages: optional: true mlly@1.7.4: - resolution: - { - integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==, - } + resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==} monaco-editor@0.53.0: - resolution: - { - integrity: sha512-0WNThgC6CMWNXXBxTbaYYcunj08iB5rnx4/G56UOPeL9UVIUGGHA1GR0EWIh9Ebabj7NpCRawQ5b0hfN1jQmYQ==, - } + resolution: {integrity: sha512-0WNThgC6CMWNXXBxTbaYYcunj08iB5rnx4/G56UOPeL9UVIUGGHA1GR0EWIh9Ebabj7NpCRawQ5b0hfN1jQmYQ==} moo@0.5.2: - resolution: - { - integrity: sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q==, - } + resolution: {integrity: sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q==} morphcharts@1.3.2: - resolution: - { - integrity: sha512-0T34Aryx8a6p0hzOzKu4x/3cK9NBoq4+59fOapEt3Iy8mpQpVg3KiicKroZRfOyaz4gNPvgK9DG/Q37Ecgf2ig==, - } + resolution: {integrity: sha512-0T34Aryx8a6p0hzOzKu4x/3cK9NBoq4+59fOapEt3Iy8mpQpVg3KiicKroZRfOyaz4gNPvgK9DG/Q37Ecgf2ig==} motion-dom@12.23.7: - resolution: - { - integrity: sha512-AyJR07/YxObtK3NyGLCfebUe0k9UZGhik+2eIPUoKz76cKRRSkMeifmIxfztIvOaKb/Smu9IfVHkmx+mV+iFmQ==, - } + resolution: {integrity: sha512-AyJR07/YxObtK3NyGLCfebUe0k9UZGhik+2eIPUoKz76cKRRSkMeifmIxfztIvOaKb/Smu9IfVHkmx+mV+iFmQ==} motion-utils@12.23.6: - resolution: - { - integrity: sha512-eAWoPgr4eFEOFfg2WjIsMoqJTW6Z8MTUCgn/GZ3VRpClWBdnbjryiA3ZSNLyxCTmCQx4RmYX6jX1iWHbenUPNQ==, - } + resolution: {integrity: sha512-eAWoPgr4eFEOFfg2WjIsMoqJTW6Z8MTUCgn/GZ3VRpClWBdnbjryiA3ZSNLyxCTmCQx4RmYX6jX1iWHbenUPNQ==} motion@12.23.7: - resolution: - { - integrity: sha512-h6xccd06g+VizejdBGWKgFzOROIHjhLDmzhdphUQ62C693dtP40YSSgj47916hovFXfH4jvYEca4duW7EZ7Iug==, - } + resolution: {integrity: sha512-h6xccd06g+VizejdBGWKgFzOROIHjhLDmzhdphUQ62C693dtP40YSSgj47916hovFXfH4jvYEca4duW7EZ7Iug==} peerDependencies: - "@emotion/is-prop-valid": "*" + '@emotion/is-prop-valid': '*' react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 peerDependenciesMeta: - "@emotion/is-prop-valid": + '@emotion/is-prop-valid': optional: true react: optional: true @@ -7776,109 +4888,64 @@ packages: optional: true mrmime@2.0.1: - resolution: - { - integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} + engines: {node: '>=10'} ms@2.1.3: - resolution: - { - integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==, - } + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} msw@2.10.2: - resolution: - { - integrity: sha512-RCKM6IZseZQCWcSWlutdf590M8nVfRHG1ImwzOtwz8IYxgT4zhUO0rfTcTvDGiaFE0Rhcc+h43lcF3Jc9gFtwQ==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-RCKM6IZseZQCWcSWlutdf590M8nVfRHG1ImwzOtwz8IYxgT4zhUO0rfTcTvDGiaFE0Rhcc+h43lcF3Jc9gFtwQ==} + engines: {node: '>=18'} hasBin: true peerDependencies: - typescript: ">= 4.8.x" + typescript: '>= 4.8.x' peerDependenciesMeta: typescript: optional: true muggle-string@0.4.1: - resolution: - { - integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==, - } + resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} mute-stream@2.0.0: - resolution: - { - integrity: sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==, - } - engines: { node: ^18.17.0 || >=20.5.0 } + resolution: {integrity: sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==} + engines: {node: ^18.17.0 || >=20.5.0} mz@2.7.0: - resolution: - { - integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==, - } + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} nanoid@3.3.11: - resolution: - { - integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==, - } - engines: { node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1 } + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true napi-build-utils@2.0.0: - resolution: - { - integrity: sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==, - } + resolution: {integrity: sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==} nearley@2.20.1: - resolution: - { - integrity: sha512-+Mc8UaAebFzgV+KpI5n7DasuuQCHA89dmwm7JXw3TV43ukfNQ9DnBH3Mdb2g/I4Fdxc26pwimBWvjIw0UAILSQ==, - } + resolution: {integrity: sha512-+Mc8UaAebFzgV+KpI5n7DasuuQCHA89dmwm7JXw3TV43ukfNQ9DnBH3Mdb2g/I4Fdxc26pwimBWvjIw0UAILSQ==} hasBin: true neotraverse@0.6.18: - resolution: - { - integrity: sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA==, - } - engines: { node: ">= 10" } + resolution: {integrity: sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA==} + engines: {node: '>= 10'} nlcst-to-string@4.0.0: - resolution: - { - integrity: sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA==, - } + resolution: {integrity: sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA==} node-abi@3.77.0: - resolution: - { - integrity: sha512-DSmt0OEcLoK4i3NuscSbGjOf3bqiDEutejqENSplMSFA/gmB8mkED9G4pKWnPl7MDU4rSHebKPHeitpDfyH0cQ==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-DSmt0OEcLoK4i3NuscSbGjOf3bqiDEutejqENSplMSFA/gmB8mkED9G4pKWnPl7MDU4rSHebKPHeitpDfyH0cQ==} + engines: {node: '>=10'} node-addon-api@7.1.1: - resolution: - { - integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==, - } + resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} node-fetch-native@1.6.7: - resolution: - { - integrity: sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==, - } + resolution: {integrity: sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==} node-fetch@2.7.0: - resolution: - { - integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==, - } - engines: { node: 4.x || >=6.0.0 } + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} peerDependencies: encoding: ^0.1.0 peerDependenciesMeta: @@ -7886,368 +4953,209 @@ packages: optional: true node-mock-http@1.0.3: - resolution: - { - integrity: sha512-jN8dK25fsfnMrVsEhluUTPkBFY+6ybu7jSB1n+ri/vOGjJxU8J9CZhpSGkHXSkFjtUhbmoncG/YG9ta5Ludqog==, - } + resolution: {integrity: sha512-jN8dK25fsfnMrVsEhluUTPkBFY+6ybu7jSB1n+ri/vOGjJxU8J9CZhpSGkHXSkFjtUhbmoncG/YG9ta5Ludqog==} node-releases@2.0.19: - resolution: - { - integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==, - } + resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} node-releases@2.0.21: - resolution: - { - integrity: sha512-5b0pgg78U3hwXkCM8Z9b2FJdPZlr9Psr9V2gQPESdGHqbntyFJKFW4r5TeWGFzafGY3hzs1JC62VEQMbl1JFkw==, - } + resolution: {integrity: sha512-5b0pgg78U3hwXkCM8Z9b2FJdPZlr9Psr9V2gQPESdGHqbntyFJKFW4r5TeWGFzafGY3hzs1JC62VEQMbl1JFkw==} normalize-path@3.0.0: - resolution: - { - integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==, - } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} normalize-range@0.1.2: - resolution: - { - integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==, - } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} + engines: {node: '>=0.10.0'} npm-run-path@6.0.0: - resolution: - { - integrity: sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==} + engines: {node: '>=18'} nth-check@2.1.1: - resolution: - { - integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==, - } + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} object-assign@4.1.1: - resolution: - { - integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==, - } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} ofetch@1.4.1: - resolution: - { - integrity: sha512-QZj2DfGplQAr2oj9KzceK9Hwz6Whxazmn85yYeVuS3u9XTMOGMRx0kO95MQ+vLsj/S/NwBDMMLU5hpxvI6Tklw==, - } + resolution: {integrity: sha512-QZj2DfGplQAr2oj9KzceK9Hwz6Whxazmn85yYeVuS3u9XTMOGMRx0kO95MQ+vLsj/S/NwBDMMLU5hpxvI6Tklw==} ohash@2.0.11: - resolution: - { - integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==, - } + resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==} once@1.4.0: - resolution: - { - integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==, - } + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} onetime@5.1.2: - resolution: - { - integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==, - } - engines: { node: ">=6" } + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} oniguruma-parser@0.12.1: - resolution: - { - integrity: sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w==, - } + resolution: {integrity: sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w==} oniguruma-to-es@4.3.3: - resolution: - { - integrity: sha512-rPiZhzC3wXwE59YQMRDodUwwT9FZ9nNBwQQfsd1wfdtlKEyCdRV0avrTcSZ5xlIvGRVPd/cx6ZN45ECmS39xvg==, - } + resolution: {integrity: sha512-rPiZhzC3wXwE59YQMRDodUwwT9FZ9nNBwQQfsd1wfdtlKEyCdRV0avrTcSZ5xlIvGRVPd/cx6ZN45ECmS39xvg==} ora@5.4.1: - resolution: - { - integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} + engines: {node: '>=10'} outvariant@1.4.3: - resolution: - { - integrity: sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==, - } + resolution: {integrity: sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==} p-limit@3.1.0: - resolution: - { - integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} p-limit@6.2.0: - resolution: - { - integrity: sha512-kuUqqHNUqoIWp/c467RI4X6mmyuojY5jGutNU0wVTmEOOfcuwLqyMVoAi9MKi2Ak+5i9+nhmrK4ufZE8069kHA==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-kuUqqHNUqoIWp/c467RI4X6mmyuojY5jGutNU0wVTmEOOfcuwLqyMVoAi9MKi2Ak+5i9+nhmrK4ufZE8069kHA==} + engines: {node: '>=18'} p-queue@8.1.1: - resolution: - { - integrity: sha512-aNZ+VfjobsWryoiPnEApGGmf5WmNsCo9xu8dfaYamG5qaLP7ClhLN6NgsFe6SwJ2UbLEBK5dv9x8Mn5+RVhMWQ==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-aNZ+VfjobsWryoiPnEApGGmf5WmNsCo9xu8dfaYamG5qaLP7ClhLN6NgsFe6SwJ2UbLEBK5dv9x8Mn5+RVhMWQ==} + engines: {node: '>=18'} p-timeout@6.1.4: - resolution: - { - integrity: sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==, - } - engines: { node: ">=14.16" } + resolution: {integrity: sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==} + engines: {node: '>=14.16'} package-json-from-dist@1.0.1: - resolution: - { - integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==, - } + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} package-manager-detector@1.3.0: - resolution: - { - integrity: sha512-ZsEbbZORsyHuO00lY1kV3/t72yp6Ysay6Pd17ZAlNGuGwmWDLCJxFpRs0IzfXfj1o4icJOkUEioexFHzyPurSQ==, - } + resolution: {integrity: sha512-ZsEbbZORsyHuO00lY1kV3/t72yp6Ysay6Pd17ZAlNGuGwmWDLCJxFpRs0IzfXfj1o4icJOkUEioexFHzyPurSQ==} pagefind@1.3.0: - resolution: - { - integrity: sha512-8KPLGT5g9s+olKMRTU9LFekLizkVIu9tes90O1/aigJ0T5LmyPqTzGJrETnSw3meSYg58YH7JTzhTTW/3z6VAw==, - } + resolution: {integrity: sha512-8KPLGT5g9s+olKMRTU9LFekLizkVIu9tes90O1/aigJ0T5LmyPqTzGJrETnSw3meSYg58YH7JTzhTTW/3z6VAw==} hasBin: true pako@0.2.9: - resolution: - { - integrity: sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==, - } + resolution: {integrity: sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==} parse-entities@4.0.2: - resolution: - { - integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==, - } + resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==} parse-latin@7.0.0: - resolution: - { - integrity: sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ==, - } + resolution: {integrity: sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ==} parse-ms@4.0.0: - resolution: - { - integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==} + engines: {node: '>=18'} parse5@7.3.0: - resolution: - { - integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==, - } + resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} path-browserify@1.0.1: - resolution: - { - integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==, - } + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} path-key@3.1.1: - resolution: - { - integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} path-key@4.0.0: - resolution: - { - integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} path-parse@1.0.7: - resolution: - { - integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==, - } + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} path-scurry@1.11.1: - resolution: - { - integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==, - } - engines: { node: ">=16 || 14 >=14.18" } + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} path-scurry@2.0.0: - resolution: - { - integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==, - } - engines: { node: 20 || >=22 } + resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==} + engines: {node: 20 || >=22} path-to-regexp@6.3.0: - resolution: - { - integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==, - } + resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} pathe@1.1.2: - resolution: - { - integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==, - } + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} pathe@2.0.3: - resolution: - { - integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==, - } + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} pathval@2.0.0: - resolution: - { - integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==, - } - engines: { node: ">= 14.16" } + resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} + engines: {node: '>= 14.16'} picocolors@1.1.1: - resolution: - { - integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==, - } + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} picomatch@2.3.1: - resolution: - { - integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==, - } - engines: { node: ">=8.6" } + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} picomatch@4.0.3: - resolution: - { - integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} pirates@4.0.6: - resolution: - { - integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==, - } - engines: { node: ">= 6" } + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} pkg-pr-new@0.0.41: - resolution: - { - integrity: sha512-jpxquPsewDDx2pn33gZBgrlczN41gsCrqOkhBoW00rBBcwqLyBD5baQzp/nbZZf53LCgSrGVM9xp2rgAkgjTfg==, - } + resolution: {integrity: sha512-jpxquPsewDDx2pn33gZBgrlczN41gsCrqOkhBoW00rBBcwqLyBD5baQzp/nbZZf53LCgSrGVM9xp2rgAkgjTfg==} hasBin: true pkg-types@1.3.1: - resolution: - { - integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==, - } + resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} pkg-types@2.1.0: - resolution: - { - integrity: sha512-wmJwA+8ihJixSoHKxZJRBQG1oY8Yr9pGLzRmSsNms0iNWyHHAlZCa7mmKiFR10YPZuz/2k169JiS/inOjBCZ2A==, - } + resolution: {integrity: sha512-wmJwA+8ihJixSoHKxZJRBQG1oY8Yr9pGLzRmSsNms0iNWyHHAlZCa7mmKiFR10YPZuz/2k169JiS/inOjBCZ2A==} postcss-calc@10.1.1: - resolution: - { - integrity: sha512-NYEsLHh8DgG/PRH2+G9BTuUdtf9ViS+vdoQ0YA5OQdGsfN4ztiwtDWNtBl9EKeqNMFnIu8IKZ0cLxEQ5r5KVMw==, - } - engines: { node: ^18.12 || ^20.9 || >=22.0 } + resolution: {integrity: sha512-NYEsLHh8DgG/PRH2+G9BTuUdtf9ViS+vdoQ0YA5OQdGsfN4ztiwtDWNtBl9EKeqNMFnIu8IKZ0cLxEQ5r5KVMw==} + engines: {node: ^18.12 || ^20.9 || >=22.0} peerDependencies: postcss: ^8.4.38 postcss-colormin@7.0.2: - resolution: - { - integrity: sha512-YntRXNngcvEvDbEjTdRWGU606eZvB5prmHG4BF0yLmVpamXbpsRJzevyy6MZVyuecgzI2AWAlvFi8DAeCqwpvA==, - } - engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 } + resolution: {integrity: sha512-YntRXNngcvEvDbEjTdRWGU606eZvB5prmHG4BF0yLmVpamXbpsRJzevyy6MZVyuecgzI2AWAlvFi8DAeCqwpvA==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.4.31 postcss-convert-values@7.0.4: - resolution: - { - integrity: sha512-e2LSXPqEHVW6aoGbjV9RsSSNDO3A0rZLCBxN24zvxF25WknMPpX8Dm9UxxThyEbaytzggRuZxaGXqaOhxQ514Q==, - } - engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 } + resolution: {integrity: sha512-e2LSXPqEHVW6aoGbjV9RsSSNDO3A0rZLCBxN24zvxF25WknMPpX8Dm9UxxThyEbaytzggRuZxaGXqaOhxQ514Q==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.4.31 postcss-discard-comments@7.0.3: - resolution: - { - integrity: sha512-q6fjd4WU4afNhWOA2WltHgCbkRhZPgQe7cXF74fuVB/ge4QbM9HEaOIzGSiMvM+g/cOsNAUGdf2JDzqA2F8iLA==, - } - engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 } + resolution: {integrity: sha512-q6fjd4WU4afNhWOA2WltHgCbkRhZPgQe7cXF74fuVB/ge4QbM9HEaOIzGSiMvM+g/cOsNAUGdf2JDzqA2F8iLA==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.4.31 postcss-discard-duplicates@7.0.1: - resolution: - { - integrity: sha512-oZA+v8Jkpu1ct/xbbrntHRsfLGuzoP+cpt0nJe5ED2FQF8n8bJtn7Bo28jSmBYwqgqnqkuSXJfSUEE7if4nClQ==, - } - engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 } + resolution: {integrity: sha512-oZA+v8Jkpu1ct/xbbrntHRsfLGuzoP+cpt0nJe5ED2FQF8n8bJtn7Bo28jSmBYwqgqnqkuSXJfSUEE7if4nClQ==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.4.31 postcss-discard-empty@7.0.0: - resolution: - { - integrity: sha512-e+QzoReTZ8IAwhnSdp/++7gBZ/F+nBq9y6PomfwORfP7q9nBpK5AMP64kOt0bA+lShBFbBDcgpJ3X4etHg4lzA==, - } - engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 } + resolution: {integrity: sha512-e+QzoReTZ8IAwhnSdp/++7gBZ/F+nBq9y6PomfwORfP7q9nBpK5AMP64kOt0bA+lShBFbBDcgpJ3X4etHg4lzA==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.4.31 postcss-discard-overridden@7.0.0: - resolution: - { - integrity: sha512-GmNAzx88u3k2+sBTZrJSDauR0ccpE24omTQCVmaTTZFz1du6AasspjaUPMJ2ud4RslZpoFKyf+6MSPETLojc6w==, - } - engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 } + resolution: {integrity: sha512-GmNAzx88u3k2+sBTZrJSDauR0ccpE24omTQCVmaTTZFz1du6AasspjaUPMJ2ud4RslZpoFKyf+6MSPETLojc6w==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.4.31 postcss-load-config@4.0.2: - resolution: - { - integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==, - } - engines: { node: ">= 14" } + resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} + engines: {node: '>= 14'} peerDependencies: - postcss: ">=8.0.9" - ts-node: ">=9.0.0" + postcss: '>=8.0.9' + ts-node: '>=9.0.0' peerDependenciesMeta: postcss: optional: true @@ -8255,14 +5163,11 @@ packages: optional: true postcss-load-config@6.0.1: - resolution: - { - integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==, - } - engines: { node: ">= 18" } + resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} + engines: {node: '>= 18'} peerDependencies: - jiti: ">=1.21.0" - postcss: ">=8.0.9" + jiti: '>=1.21.0' + postcss: '>=8.0.9' tsx: ^4.8.1 yaml: ^2.4.2 peerDependenciesMeta: @@ -8276,1409 +5181,806 @@ packages: optional: true postcss-merge-longhand@7.0.4: - resolution: - { - integrity: sha512-zer1KoZA54Q8RVHKOY5vMke0cCdNxMP3KBfDerjH/BYHh4nCIh+1Yy0t1pAEQF18ac/4z3OFclO+ZVH8azjR4A==, - } - engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 } + resolution: {integrity: sha512-zer1KoZA54Q8RVHKOY5vMke0cCdNxMP3KBfDerjH/BYHh4nCIh+1Yy0t1pAEQF18ac/4z3OFclO+ZVH8azjR4A==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.4.31 postcss-merge-rules@7.0.4: - resolution: - { - integrity: sha512-ZsaamiMVu7uBYsIdGtKJ64PkcQt6Pcpep/uO90EpLS3dxJi6OXamIobTYcImyXGoW0Wpugh7DSD3XzxZS9JCPg==, - } - engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 } + resolution: {integrity: sha512-ZsaamiMVu7uBYsIdGtKJ64PkcQt6Pcpep/uO90EpLS3dxJi6OXamIobTYcImyXGoW0Wpugh7DSD3XzxZS9JCPg==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.4.31 postcss-minify-font-values@7.0.0: - resolution: - { - integrity: sha512-2ckkZtgT0zG8SMc5aoNwtm5234eUx1GGFJKf2b1bSp8UflqaeFzR50lid4PfqVI9NtGqJ2J4Y7fwvnP/u1cQog==, - } - engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 } + resolution: {integrity: sha512-2ckkZtgT0zG8SMc5aoNwtm5234eUx1GGFJKf2b1bSp8UflqaeFzR50lid4PfqVI9NtGqJ2J4Y7fwvnP/u1cQog==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.4.31 postcss-minify-gradients@7.0.0: - resolution: - { - integrity: sha512-pdUIIdj/C93ryCHew0UgBnL2DtUS3hfFa5XtERrs4x+hmpMYGhbzo6l/Ir5de41O0GaKVpK1ZbDNXSY6GkXvtg==, - } - engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 } + resolution: {integrity: sha512-pdUIIdj/C93ryCHew0UgBnL2DtUS3hfFa5XtERrs4x+hmpMYGhbzo6l/Ir5de41O0GaKVpK1ZbDNXSY6GkXvtg==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.4.31 postcss-minify-params@7.0.2: - resolution: - { - integrity: sha512-nyqVLu4MFl9df32zTsdcLqCFfE/z2+f8GE1KHPxWOAmegSo6lpV2GNy5XQvrzwbLmiU7d+fYay4cwto1oNdAaQ==, - } - engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 } + resolution: {integrity: sha512-nyqVLu4MFl9df32zTsdcLqCFfE/z2+f8GE1KHPxWOAmegSo6lpV2GNy5XQvrzwbLmiU7d+fYay4cwto1oNdAaQ==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.4.31 postcss-minify-selectors@7.0.4: - resolution: - { - integrity: sha512-JG55VADcNb4xFCf75hXkzc1rNeURhlo7ugf6JjiiKRfMsKlDzN9CXHZDyiG6x/zGchpjQS+UAgb1d4nqXqOpmA==, - } - engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 } + resolution: {integrity: sha512-JG55VADcNb4xFCf75hXkzc1rNeURhlo7ugf6JjiiKRfMsKlDzN9CXHZDyiG6x/zGchpjQS+UAgb1d4nqXqOpmA==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.4.31 postcss-nested@6.2.0: - resolution: - { - integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==, - } - engines: { node: ">=12.0" } + resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} + engines: {node: '>=12.0'} peerDependencies: postcss: ^8.2.14 postcss-nested@7.0.2: - resolution: - { - integrity: sha512-5osppouFc0VR9/VYzYxO03VaDa3e8F23Kfd6/9qcZTUI8P58GIYlArOET2Wq0ywSl2o2PjELhYOFI4W7l5QHKw==, - } - engines: { node: ">=18.0" } + resolution: {integrity: sha512-5osppouFc0VR9/VYzYxO03VaDa3e8F23Kfd6/9qcZTUI8P58GIYlArOET2Wq0ywSl2o2PjELhYOFI4W7l5QHKw==} + engines: {node: '>=18.0'} peerDependencies: postcss: ^8.2.14 postcss-normalize-charset@7.0.0: - resolution: - { - integrity: sha512-ABisNUXMeZeDNzCQxPxBCkXexvBrUHV+p7/BXOY+ulxkcjUZO0cp8ekGBwvIh2LbCwnWbyMPNJVtBSdyhM2zYQ==, - } - engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 } + resolution: {integrity: sha512-ABisNUXMeZeDNzCQxPxBCkXexvBrUHV+p7/BXOY+ulxkcjUZO0cp8ekGBwvIh2LbCwnWbyMPNJVtBSdyhM2zYQ==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.4.31 postcss-normalize-display-values@7.0.0: - resolution: - { - integrity: sha512-lnFZzNPeDf5uGMPYgGOw7v0BfB45+irSRz9gHQStdkkhiM0gTfvWkWB5BMxpn0OqgOQuZG/mRlZyJxp0EImr2Q==, - } - engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 } + resolution: {integrity: sha512-lnFZzNPeDf5uGMPYgGOw7v0BfB45+irSRz9gHQStdkkhiM0gTfvWkWB5BMxpn0OqgOQuZG/mRlZyJxp0EImr2Q==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.4.31 postcss-normalize-positions@7.0.0: - resolution: - { - integrity: sha512-I0yt8wX529UKIGs2y/9Ybs2CelSvItfmvg/DBIjTnoUSrPxSV7Z0yZ8ShSVtKNaV/wAY+m7bgtyVQLhB00A1NQ==, - } - engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 } + resolution: {integrity: sha512-I0yt8wX529UKIGs2y/9Ybs2CelSvItfmvg/DBIjTnoUSrPxSV7Z0yZ8ShSVtKNaV/wAY+m7bgtyVQLhB00A1NQ==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.4.31 postcss-normalize-repeat-style@7.0.0: - resolution: - { - integrity: sha512-o3uSGYH+2q30ieM3ppu9GTjSXIzOrRdCUn8UOMGNw7Af61bmurHTWI87hRybrP6xDHvOe5WlAj3XzN6vEO8jLw==, - } - engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 } + resolution: {integrity: sha512-o3uSGYH+2q30ieM3ppu9GTjSXIzOrRdCUn8UOMGNw7Af61bmurHTWI87hRybrP6xDHvOe5WlAj3XzN6vEO8jLw==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.4.31 postcss-normalize-string@7.0.0: - resolution: - { - integrity: sha512-w/qzL212DFVOpMy3UGyxrND+Kb0fvCiBBujiaONIihq7VvtC7bswjWgKQU/w4VcRyDD8gpfqUiBQ4DUOwEJ6Qg==, - } - engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 } + resolution: {integrity: sha512-w/qzL212DFVOpMy3UGyxrND+Kb0fvCiBBujiaONIihq7VvtC7bswjWgKQU/w4VcRyDD8gpfqUiBQ4DUOwEJ6Qg==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.4.31 postcss-normalize-timing-functions@7.0.0: - resolution: - { - integrity: sha512-tNgw3YV0LYoRwg43N3lTe3AEWZ66W7Dh7lVEpJbHoKOuHc1sLrzMLMFjP8SNULHaykzsonUEDbKedv8C+7ej6g==, - } - engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 } + resolution: {integrity: sha512-tNgw3YV0LYoRwg43N3lTe3AEWZ66W7Dh7lVEpJbHoKOuHc1sLrzMLMFjP8SNULHaykzsonUEDbKedv8C+7ej6g==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.4.31 postcss-normalize-unicode@7.0.2: - resolution: - { - integrity: sha512-ztisabK5C/+ZWBdYC+Y9JCkp3M9qBv/XFvDtSw0d/XwfT3UaKeW/YTm/MD/QrPNxuecia46vkfEhewjwcYFjkg==, - } - engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 } + resolution: {integrity: sha512-ztisabK5C/+ZWBdYC+Y9JCkp3M9qBv/XFvDtSw0d/XwfT3UaKeW/YTm/MD/QrPNxuecia46vkfEhewjwcYFjkg==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.4.31 postcss-normalize-url@7.0.0: - resolution: - { - integrity: sha512-+d7+PpE+jyPX1hDQZYG+NaFD+Nd2ris6r8fPTBAjE8z/U41n/bib3vze8x7rKs5H1uEw5ppe9IojewouHk0klQ==, - } - engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 } + resolution: {integrity: sha512-+d7+PpE+jyPX1hDQZYG+NaFD+Nd2ris6r8fPTBAjE8z/U41n/bib3vze8x7rKs5H1uEw5ppe9IojewouHk0klQ==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.4.31 postcss-normalize-whitespace@7.0.0: - resolution: - { - integrity: sha512-37/toN4wwZErqohedXYqWgvcHUGlT8O/m2jVkAfAe9Bd4MzRqlBmXrJRePH0e9Wgnz2X7KymTgTOaaFizQe3AQ==, - } - engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 } + resolution: {integrity: sha512-37/toN4wwZErqohedXYqWgvcHUGlT8O/m2jVkAfAe9Bd4MzRqlBmXrJRePH0e9Wgnz2X7KymTgTOaaFizQe3AQ==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.4.31 postcss-ordered-values@7.0.1: - resolution: - { - integrity: sha512-irWScWRL6nRzYmBOXReIKch75RRhNS86UPUAxXdmW/l0FcAsg0lvAXQCby/1lymxn/o0gVa6Rv/0f03eJOwHxw==, - } - engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 } + resolution: {integrity: sha512-irWScWRL6nRzYmBOXReIKch75RRhNS86UPUAxXdmW/l0FcAsg0lvAXQCby/1lymxn/o0gVa6Rv/0f03eJOwHxw==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.4.31 postcss-reduce-initial@7.0.2: - resolution: - { - integrity: sha512-pOnu9zqQww7dEKf62Nuju6JgsW2V0KRNBHxeKohU+JkHd/GAH5uvoObqFLqkeB2n20mr6yrlWDvo5UBU5GnkfA==, - } - engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 } + resolution: {integrity: sha512-pOnu9zqQww7dEKf62Nuju6JgsW2V0KRNBHxeKohU+JkHd/GAH5uvoObqFLqkeB2n20mr6yrlWDvo5UBU5GnkfA==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.4.31 postcss-reduce-transforms@7.0.0: - resolution: - { - integrity: sha512-pnt1HKKZ07/idH8cpATX/ujMbtOGhUfE+m8gbqwJE05aTaNw8gbo34a2e3if0xc0dlu75sUOiqvwCGY3fzOHew==, - } - engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 } + resolution: {integrity: sha512-pnt1HKKZ07/idH8cpATX/ujMbtOGhUfE+m8gbqwJE05aTaNw8gbo34a2e3if0xc0dlu75sUOiqvwCGY3fzOHew==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.4.31 postcss-selector-parser@6.1.2: - resolution: - { - integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==, - } - engines: { node: ">=4" } + resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} + engines: {node: '>=4'} postcss-selector-parser@7.1.0: - resolution: - { - integrity: sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==, - } - engines: { node: ">=4" } + resolution: {integrity: sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==} + engines: {node: '>=4'} postcss-svgo@7.0.1: - resolution: - { - integrity: sha512-0WBUlSL4lhD9rA5k1e5D8EN5wCEyZD6HJk0jIvRxl+FDVOMlJ7DePHYWGGVc5QRqrJ3/06FTXM0bxjmJpmTPSA==, - } - engines: { node: ^18.12.0 || ^20.9.0 || >= 18 } + resolution: {integrity: sha512-0WBUlSL4lhD9rA5k1e5D8EN5wCEyZD6HJk0jIvRxl+FDVOMlJ7DePHYWGGVc5QRqrJ3/06FTXM0bxjmJpmTPSA==} + engines: {node: ^18.12.0 || ^20.9.0 || >= 18} peerDependencies: postcss: ^8.4.31 postcss-unique-selectors@7.0.3: - resolution: - { - integrity: sha512-J+58u5Ic5T1QjP/LDV9g3Cx4CNOgB5vz+kM6+OxHHhFACdcDeKhBXjQmB7fnIZM12YSTvsL0Opwco83DmacW2g==, - } - engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 } + resolution: {integrity: sha512-J+58u5Ic5T1QjP/LDV9g3Cx4CNOgB5vz+kM6+OxHHhFACdcDeKhBXjQmB7fnIZM12YSTvsL0Opwco83DmacW2g==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.4.31 postcss-value-parser@4.2.0: - resolution: - { - integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==, - } + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} postcss@8.5.3: - resolution: - { - integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==, - } - engines: { node: ^10 || ^12 || >=14 } + resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} + engines: {node: ^10 || ^12 || >=14} postcss@8.5.6: - resolution: - { - integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==, - } - engines: { node: ^10 || ^12 || >=14 } + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + engines: {node: ^10 || ^12 || >=14} prebuild-install@7.1.3: - resolution: - { - integrity: sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==} + engines: {node: '>=10'} hasBin: true prettier@2.8.7: - resolution: - { - integrity: sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==, - } - engines: { node: ">=10.13.0" } + resolution: {integrity: sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==} + engines: {node: '>=10.13.0'} hasBin: true prettier@3.5.3: - resolution: - { - integrity: sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==, - } - engines: { node: ">=14" } + resolution: {integrity: sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==} + engines: {node: '>=14'} hasBin: true pretty-bytes@6.1.1: - resolution: - { - integrity: sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==, - } - engines: { node: ^14.13.1 || >=16.0.0 } + resolution: {integrity: sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==} + engines: {node: ^14.13.1 || >=16.0.0} pretty-format@27.5.1: - resolution: - { - integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } + resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} pretty-ms@9.2.0: - resolution: - { - integrity: sha512-4yf0QO/sllf/1zbZWYnvWw3NxCQwLXKzIj0G849LSufP15BXKM0rbD2Z3wVnkMfjdn/CB0Dpp444gYAACdsplg==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-4yf0QO/sllf/1zbZWYnvWw3NxCQwLXKzIj0G849LSufP15BXKM0rbD2Z3wVnkMfjdn/CB0Dpp444gYAACdsplg==} + engines: {node: '>=18'} prismjs@1.30.0: - resolution: - { - integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==, - } - engines: { node: ">=6" } + resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==} + engines: {node: '>=6'} prompts@2.4.2: - resolution: - { - integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==, - } - engines: { node: ">= 6" } + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} property-information@6.5.0: - resolution: - { - integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==, - } + resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} property-information@7.0.0: - resolution: - { - integrity: sha512-7D/qOz/+Y4X/rzSB6jKxKUsQnphO046ei8qxG59mtM3RG3DHgTK81HrxrmoDVINJb8NKT5ZsRbwHvQ6B68Iyhg==, - } + resolution: {integrity: sha512-7D/qOz/+Y4X/rzSB6jKxKUsQnphO046ei8qxG59mtM3RG3DHgTK81HrxrmoDVINJb8NKT5ZsRbwHvQ6B68Iyhg==} psl@1.15.0: - resolution: - { - integrity: sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==, - } + resolution: {integrity: sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==} pump@3.0.3: - resolution: - { - integrity: sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==, - } + resolution: {integrity: sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==} punycode.js@2.3.1: - resolution: - { - integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==, - } - engines: { node: ">=6" } + resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} + engines: {node: '>=6'} punycode@2.3.1: - resolution: - { - integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==, - } - engines: { node: ">=6" } + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} query-registry@3.0.1: - resolution: - { - integrity: sha512-M9RxRITi2mHMVPU5zysNjctUT8bAPx6ltEXo/ir9+qmiM47Y7f0Ir3+OxUO5OjYAWdicBQRew7RtHtqUXydqlg==, - } - engines: { node: ">=20" } + resolution: {integrity: sha512-M9RxRITi2mHMVPU5zysNjctUT8bAPx6ltEXo/ir9+qmiM47Y7f0Ir3+OxUO5OjYAWdicBQRew7RtHtqUXydqlg==} + engines: {node: '>=20'} query-string@9.1.1: - resolution: - { - integrity: sha512-MWkCOVIcJP9QSKU52Ngow6bsAWAPlPK2MludXvcrS2bGZSl+T1qX9MZvRIkqUIkGLJquMJHWfsT6eRqUpp4aWg==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-MWkCOVIcJP9QSKU52Ngow6bsAWAPlPK2MludXvcrS2bGZSl+T1qX9MZvRIkqUIkGLJquMJHWfsT6eRqUpp4aWg==} + engines: {node: '>=18'} querystringify@2.2.0: - resolution: - { - integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==, - } + resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} queue-microtask@1.2.3: - resolution: - { - integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==, - } + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} quick-lru@7.0.0: - resolution: - { - integrity: sha512-MX8gB7cVYTrYcFfAnfLlhRd0+Toyl8yX8uBx1MrX7K0jegiz9TumwOK27ldXrgDlHRdVi+MqU9Ssw6dr4BNreg==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-MX8gB7cVYTrYcFfAnfLlhRd0+Toyl8yX8uBx1MrX7K0jegiz9TumwOK27ldXrgDlHRdVi+MqU9Ssw6dr4BNreg==} + engines: {node: '>=18'} radix3@1.1.2: - resolution: - { - integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==, - } + resolution: {integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==} railroad-diagrams@1.0.0: - resolution: - { - integrity: sha512-cz93DjNeLY0idrCNOH6PviZGRN9GJhsdm9hpn1YCS879fj4W+x5IFJhhkRZcwVgMmFF7R82UA/7Oh+R8lLZg6A==, - } + resolution: {integrity: sha512-cz93DjNeLY0idrCNOH6PviZGRN9GJhsdm9hpn1YCS879fj4W+x5IFJhhkRZcwVgMmFF7R82UA/7Oh+R8lLZg6A==} randexp@0.4.6: - resolution: - { - integrity: sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ==, - } - engines: { node: ">=0.12" } + resolution: {integrity: sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ==} + engines: {node: '>=0.12'} rc@1.2.8: - resolution: - { - integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==, - } + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} hasBin: true react-dom@19.1.0: - resolution: - { - integrity: sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==, - } + resolution: {integrity: sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==} peerDependencies: react: ^19.1.0 react-is@17.0.2: - resolution: - { - integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==, - } + resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} react-refresh@0.17.0: - resolution: - { - integrity: sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==, - } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==} + engines: {node: '>=0.10.0'} react-remove-scroll-bar@2.3.8: - resolution: - { - integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==} + engines: {node: '>=10'} peerDependencies: - "@types/react": "*" + '@types/react': '*' react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 peerDependenciesMeta: - "@types/react": + '@types/react': optional: true react-remove-scroll@2.7.1: - resolution: - { - integrity: sha512-HpMh8+oahmIdOuS5aFKKY6Pyog+FNaZV/XyJOq7b4YFwsFHe5yYfdbIalI4k3vU2nSDql7YskmUseHsRrJqIPA==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-HpMh8+oahmIdOuS5aFKKY6Pyog+FNaZV/XyJOq7b4YFwsFHe5yYfdbIalI4k3vU2nSDql7YskmUseHsRrJqIPA==} + engines: {node: '>=10'} peerDependencies: - "@types/react": "*" + '@types/react': '*' react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc peerDependenciesMeta: - "@types/react": + '@types/react': optional: true react-style-singleton@2.2.3: - resolution: - { - integrity: sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==} + engines: {node: '>=10'} peerDependencies: - "@types/react": "*" + '@types/react': '*' react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc peerDependenciesMeta: - "@types/react": + '@types/react': optional: true react@19.1.0: - resolution: - { - integrity: sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==, - } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==} + engines: {node: '>=0.10.0'} readable-stream@3.6.2: - resolution: - { - integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==, - } - engines: { node: ">= 6" } + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} readdirp@4.1.2: - resolution: - { - integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==, - } - engines: { node: ">= 14.18.0" } + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} recma-build-jsx@1.0.0: - resolution: - { - integrity: sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==, - } + resolution: {integrity: sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==} recma-jsx@1.0.0: - resolution: - { - integrity: sha512-5vwkv65qWwYxg+Atz95acp8DMu1JDSqdGkA2Of1j6rCreyFUE/gp15fC8MnGEuG1W68UKjM6x6+YTWIh7hZM/Q==, - } + resolution: {integrity: sha512-5vwkv65qWwYxg+Atz95acp8DMu1JDSqdGkA2Of1j6rCreyFUE/gp15fC8MnGEuG1W68UKjM6x6+YTWIh7hZM/Q==} recma-parse@1.0.0: - resolution: - { - integrity: sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==, - } + resolution: {integrity: sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==} recma-stringify@1.0.0: - resolution: - { - integrity: sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==, - } + resolution: {integrity: sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==} regenerator-runtime@0.14.1: - resolution: - { - integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==, - } + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} regex-recursion@6.0.2: - resolution: - { - integrity: sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==, - } + resolution: {integrity: sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==} regex-utilities@2.3.0: - resolution: - { - integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==, - } + resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==} regex@6.0.1: - resolution: - { - integrity: sha512-uorlqlzAKjKQZ5P+kTJr3eeJGSVroLKoHmquUj4zHWuR+hEyNqlXsSKlYYF5F4NI6nl7tWCs0apKJ0lmfsXAPA==, - } + resolution: {integrity: sha512-uorlqlzAKjKQZ5P+kTJr3eeJGSVroLKoHmquUj4zHWuR+hEyNqlXsSKlYYF5F4NI6nl7tWCs0apKJ0lmfsXAPA==} rehype-expressive-code@0.41.2: - resolution: - { - integrity: sha512-vHYfWO9WxAw6kHHctddOt+P4266BtyT1mrOIuxJD+1ELuvuJAa5uBIhYt0OVMyOhlvf57hzWOXJkHnMhpaHyxw==, - } + resolution: {integrity: sha512-vHYfWO9WxAw6kHHctddOt+P4266BtyT1mrOIuxJD+1ELuvuJAa5uBIhYt0OVMyOhlvf57hzWOXJkHnMhpaHyxw==} rehype-format@5.0.1: - resolution: - { - integrity: sha512-zvmVru9uB0josBVpr946OR8ui7nJEdzZobwLOOqHb/OOD88W0Vk2SqLwoVOj0fM6IPCCO6TaV9CvQvJMWwukFQ==, - } + resolution: {integrity: sha512-zvmVru9uB0josBVpr946OR8ui7nJEdzZobwLOOqHb/OOD88W0Vk2SqLwoVOj0fM6IPCCO6TaV9CvQvJMWwukFQ==} rehype-mathjax@7.1.0: - resolution: - { - integrity: sha512-mJHNpoqCC5UZ24OKx0wNjlzV18qeJz/Q/LtEjxXzt8vqrZ1Z3GxQnVrHcF5/PogcXUK8cWwJ4U/LWOQWEiABHw==, - } + resolution: {integrity: sha512-mJHNpoqCC5UZ24OKx0wNjlzV18qeJz/Q/LtEjxXzt8vqrZ1Z3GxQnVrHcF5/PogcXUK8cWwJ4U/LWOQWEiABHw==} rehype-parse@9.0.1: - resolution: - { - integrity: sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag==, - } + resolution: {integrity: sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag==} rehype-raw@7.0.0: - resolution: - { - integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==, - } + resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==} rehype-recma@1.0.0: - resolution: - { - integrity: sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==, - } + resolution: {integrity: sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==} rehype-stringify@10.0.1: - resolution: - { - integrity: sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA==, - } + resolution: {integrity: sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA==} rehype@13.0.2: - resolution: - { - integrity: sha512-j31mdaRFrwFRUIlxGeuPXXKWQxet52RBQRvCmzl5eCefn/KGbomK5GMHNMsOJf55fgo3qw5tST5neDuarDYR2A==, - } + resolution: {integrity: sha512-j31mdaRFrwFRUIlxGeuPXXKWQxet52RBQRvCmzl5eCefn/KGbomK5GMHNMsOJf55fgo3qw5tST5neDuarDYR2A==} remark-directive@3.0.1: - resolution: - { - integrity: sha512-gwglrEQEZcZYgVyG1tQuA+h58EZfq5CSULw7J90AFuCTyib1thgHPoqQ+h9iFvU6R+vnZ5oNFQR5QKgGpk741A==, - } + resolution: {integrity: sha512-gwglrEQEZcZYgVyG1tQuA+h58EZfq5CSULw7J90AFuCTyib1thgHPoqQ+h9iFvU6R+vnZ5oNFQR5QKgGpk741A==} remark-gfm@4.0.1: - resolution: - { - integrity: sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==, - } + resolution: {integrity: sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==} remark-math@6.0.0: - resolution: - { - integrity: sha512-MMqgnP74Igy+S3WwnhQ7kqGlEerTETXMvJhrUzDikVZ2/uogJCb+WHUg97hK9/jcfc0dkD73s3LN8zU49cTEtA==, - } + resolution: {integrity: sha512-MMqgnP74Igy+S3WwnhQ7kqGlEerTETXMvJhrUzDikVZ2/uogJCb+WHUg97hK9/jcfc0dkD73s3LN8zU49cTEtA==} remark-mdx@3.1.0: - resolution: - { - integrity: sha512-Ngl/H3YXyBV9RcRNdlYsZujAmhsxwzxpDzpDEhFBVAGthS4GDgnctpDjgFl/ULx5UEDzqtW1cyBSNKqYYrqLBA==, - } + resolution: {integrity: sha512-Ngl/H3YXyBV9RcRNdlYsZujAmhsxwzxpDzpDEhFBVAGthS4GDgnctpDjgFl/ULx5UEDzqtW1cyBSNKqYYrqLBA==} remark-parse@11.0.0: - resolution: - { - integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==, - } + resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} remark-rehype@11.1.2: - resolution: - { - integrity: sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==, - } + resolution: {integrity: sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==} remark-smartypants@3.0.2: - resolution: - { - integrity: sha512-ILTWeOriIluwEvPjv67v7Blgrcx+LZOkAUVtKI3putuhlZm84FnqDORNXPPm+HY3NdZOMhyDwZ1E+eZB/Df5dA==, - } - engines: { node: ">=16.0.0" } + resolution: {integrity: sha512-ILTWeOriIluwEvPjv67v7Blgrcx+LZOkAUVtKI3putuhlZm84FnqDORNXPPm+HY3NdZOMhyDwZ1E+eZB/Df5dA==} + engines: {node: '>=16.0.0'} remark-stringify@11.0.0: - resolution: - { - integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==, - } + resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} remeda@2.21.2: - resolution: - { - integrity: sha512-wdhkMDou8HRpD7RnxKJ/FHJWEGXRH7jV/pb0NsdLLSoBo+G9RjtxcY41hVhogLfEMkThk6aySKjs+Yd6PnpzBA==, - } + resolution: {integrity: sha512-wdhkMDou8HRpD7RnxKJ/FHJWEGXRH7jV/pb0NsdLLSoBo+G9RjtxcY41hVhogLfEMkThk6aySKjs+Yd6PnpzBA==} request-light@0.5.8: - resolution: - { - integrity: sha512-3Zjgh+8b5fhRJBQZoy+zbVKpAQGLyka0MPgW3zruTF4dFFJ8Fqcfu9YsAvi/rvdcaTeWG3MkbZv4WKxAn/84Lg==, - } + resolution: {integrity: sha512-3Zjgh+8b5fhRJBQZoy+zbVKpAQGLyka0MPgW3zruTF4dFFJ8Fqcfu9YsAvi/rvdcaTeWG3MkbZv4WKxAn/84Lg==} request-light@0.7.0: - resolution: - { - integrity: sha512-lMbBMrDoxgsyO+yB3sDcrDuX85yYt7sS8BfQd11jtbW/z5ZWgLZRcEGLsLoYw7I0WSUGQBs8CC8ScIxkTX1+6Q==, - } + resolution: {integrity: sha512-lMbBMrDoxgsyO+yB3sDcrDuX85yYt7sS8BfQd11jtbW/z5ZWgLZRcEGLsLoYw7I0WSUGQBs8CC8ScIxkTX1+6Q==} require-directory@2.1.1: - resolution: - { - integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==, - } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} require-from-string@2.0.2: - resolution: - { - integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==, - } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} requires-port@1.0.0: - resolution: - { - integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==, - } + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} resolve-from@5.0.0: - resolution: - { - integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} resolve-pkg-maps@1.0.0: - resolution: - { - integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==, - } + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} resolve@1.22.10: - resolution: - { - integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} + engines: {node: '>= 0.4'} hasBin: true restore-cursor@3.1.0: - resolution: - { - integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + engines: {node: '>=8'} restructure@3.0.2: - resolution: - { - integrity: sha512-gSfoiOEA0VPE6Tukkrr7I0RBdE0s7H1eFCDBk05l1KIQT1UIKNc5JZy6jdyW6eYH3aR3g5b3PuL77rq0hvwtAw==, - } + resolution: {integrity: sha512-gSfoiOEA0VPE6Tukkrr7I0RBdE0s7H1eFCDBk05l1KIQT1UIKNc5JZy6jdyW6eYH3aR3g5b3PuL77rq0hvwtAw==} ret@0.1.15: - resolution: - { - integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==, - } - engines: { node: ">=0.12" } + resolution: {integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==} + engines: {node: '>=0.12'} retext-latin@4.0.0: - resolution: - { - integrity: sha512-hv9woG7Fy0M9IlRQloq/N6atV82NxLGveq+3H2WOi79dtIYWN8OaxogDm77f8YnVXJL2VD3bbqowu5E3EMhBYA==, - } + resolution: {integrity: sha512-hv9woG7Fy0M9IlRQloq/N6atV82NxLGveq+3H2WOi79dtIYWN8OaxogDm77f8YnVXJL2VD3bbqowu5E3EMhBYA==} retext-smartypants@6.2.0: - resolution: - { - integrity: sha512-kk0jOU7+zGv//kfjXEBjdIryL1Acl4i9XNkHxtM7Tm5lFiCog576fjNC9hjoR7LTKQ0DsPWy09JummSsH1uqfQ==, - } + resolution: {integrity: sha512-kk0jOU7+zGv//kfjXEBjdIryL1Acl4i9XNkHxtM7Tm5lFiCog576fjNC9hjoR7LTKQ0DsPWy09JummSsH1uqfQ==} retext-stringify@4.0.0: - resolution: - { - integrity: sha512-rtfN/0o8kL1e+78+uxPTqu1Klt0yPzKuQ2BfWwwfgIUSayyzxpM1PJzkKt4V8803uB9qSy32MvI7Xep9khTpiA==, - } + resolution: {integrity: sha512-rtfN/0o8kL1e+78+uxPTqu1Klt0yPzKuQ2BfWwwfgIUSayyzxpM1PJzkKt4V8803uB9qSy32MvI7Xep9khTpiA==} retext@9.0.0: - resolution: - { - integrity: sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA==, - } + resolution: {integrity: sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA==} reusify@1.0.4: - resolution: - { - integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==, - } - engines: { iojs: ">=1.0.0", node: ">=0.10.0" } + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} robust-predicates@3.0.2: - resolution: - { - integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==, - } + resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==} rollup-plugin-dts@6.1.1: - resolution: - { - integrity: sha512-aSHRcJ6KG2IHIioYlvAOcEq6U99sVtqDDKVhnwt70rW6tsz3tv5OSjEiWcgzfsHdLyGXZ/3b/7b/+Za3Y6r1XA==, - } - engines: { node: ">=16" } + resolution: {integrity: sha512-aSHRcJ6KG2IHIioYlvAOcEq6U99sVtqDDKVhnwt70rW6tsz3tv5OSjEiWcgzfsHdLyGXZ/3b/7b/+Za3Y6r1XA==} + engines: {node: '>=16'} peerDependencies: rollup: 4.34.8 typescript: ^4.5 || ^5.0 rollup@4.34.8: - resolution: - { - integrity: sha512-489gTVMzAYdiZHFVA/ig/iYFllCcWFHMvUHI1rpFmkoUtRlQxqh6/yiNqnYibjMZ2b/+FUQwldG+aLsEt6bglQ==, - } - engines: { node: ">=18.0.0", npm: ">=8.0.0" } + resolution: {integrity: sha512-489gTVMzAYdiZHFVA/ig/iYFllCcWFHMvUHI1rpFmkoUtRlQxqh6/yiNqnYibjMZ2b/+FUQwldG+aLsEt6bglQ==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true rrweb-cssom@0.8.0: - resolution: - { - integrity: sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==, - } + resolution: {integrity: sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==} run-parallel@1.2.0: - resolution: - { - integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==, - } + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} rw@1.3.3: - resolution: - { - integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==, - } + resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==} safe-buffer@5.2.1: - resolution: - { - integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==, - } + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} safer-buffer@2.1.2: - resolution: - { - integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==, - } + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} sax@1.4.1: - resolution: - { - integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==, - } + resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} saxes@6.0.0: - resolution: - { - integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==, - } - engines: { node: ">=v12.22.7" } + resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} + engines: {node: '>=v12.22.7'} scheduler@0.26.0: - resolution: - { - integrity: sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==, - } + resolution: {integrity: sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==} scule@1.3.0: - resolution: - { - integrity: sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==, - } + resolution: {integrity: sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==} semver@6.3.1: - resolution: - { - integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==, - } + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true semver@7.7.2: - resolution: - { - integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} + engines: {node: '>=10'} hasBin: true sharp@0.34.2: - resolution: - { - integrity: sha512-lszvBmB9QURERtyKT2bNmsgxXK0ShJrL/fvqlonCo7e6xBF8nT8xU6pW+PMIbLsz0RxQk3rgH9kd8UmvOzlMJg==, - } - engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + resolution: {integrity: sha512-lszvBmB9QURERtyKT2bNmsgxXK0ShJrL/fvqlonCo7e6xBF8nT8xU6pW+PMIbLsz0RxQk3rgH9kd8UmvOzlMJg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} shebang-command@2.0.0: - resolution: - { - integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} shebang-regex@3.0.0: - resolution: - { - integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} shiki@3.12.2: - resolution: - { - integrity: sha512-uIrKI+f9IPz1zDT+GMz+0RjzKJiijVr6WDWm9Pe3NNY6QigKCfifCEv9v9R2mDASKKjzjQ2QpFLcxaR3iHSnMA==, - } + resolution: {integrity: sha512-uIrKI+f9IPz1zDT+GMz+0RjzKJiijVr6WDWm9Pe3NNY6QigKCfifCEv9v9R2mDASKKjzjQ2QpFLcxaR3iHSnMA==} siginfo@2.0.0: - resolution: - { - integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==, - } + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} signal-exit@3.0.7: - resolution: - { - integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==, - } + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} signal-exit@4.1.0: - resolution: - { - integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==, - } - engines: { node: ">=14" } + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} simple-concat@1.0.1: - resolution: - { - integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==, - } + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} simple-get@4.0.1: - resolution: - { - integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==, - } + resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} simple-swizzle@0.2.2: - resolution: - { - integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==, - } + resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} sirv@3.0.1: - resolution: - { - integrity: sha512-FoqMu0NCGBLCcAkS1qA+XJIQTR6/JHfQXl+uGteNCQ76T91DMUjPa9xfmeqMY3z80nLSg9yQmNjK0Px6RWsH/A==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-FoqMu0NCGBLCcAkS1qA+XJIQTR6/JHfQXl+uGteNCQ76T91DMUjPa9xfmeqMY3z80nLSg9yQmNjK0Px6RWsH/A==} + engines: {node: '>=18'} sisteransi@1.0.5: - resolution: - { - integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==, - } + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} sitemap@8.0.0: - resolution: - { - integrity: sha512-+AbdxhM9kJsHtruUF39bwS/B0Fytw6Fr1o4ZAIAEqA6cke2xcoO2GleBw9Zw7nRzILVEgz7zBM5GiTJjie1G9A==, - } - engines: { node: ">=14.0.0", npm: ">=6.0.0" } + resolution: {integrity: sha512-+AbdxhM9kJsHtruUF39bwS/B0Fytw6Fr1o4ZAIAEqA6cke2xcoO2GleBw9Zw7nRzILVEgz7zBM5GiTJjie1G9A==} + engines: {node: '>=14.0.0', npm: '>=6.0.0'} hasBin: true smartypants@0.2.2: - resolution: - { - integrity: sha512-TzobUYoEft/xBtb2voRPryAUIvYguG0V7Tt3de79I1WfXgCwelqVsGuZSnu3GFGRZhXR90AeEYIM+icuB/S06Q==, - } + resolution: {integrity: sha512-TzobUYoEft/xBtb2voRPryAUIvYguG0V7Tt3de79I1WfXgCwelqVsGuZSnu3GFGRZhXR90AeEYIM+icuB/S06Q==} hasBin: true smol-toml@1.4.2: - resolution: - { - integrity: sha512-rInDH6lCNiEyn3+hH8KVGFdbjc099j47+OSgbMrfDYX1CmXLfdKd7qi6IfcWj2wFxvSVkuI46M+wPGYfEOEj6g==, - } - engines: { node: ">= 18" } + resolution: {integrity: sha512-rInDH6lCNiEyn3+hH8KVGFdbjc099j47+OSgbMrfDYX1CmXLfdKd7qi6IfcWj2wFxvSVkuI46M+wPGYfEOEj6g==} + engines: {node: '>= 18'} source-map-js@1.2.1: - resolution: - { - integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==, - } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} source-map@0.7.4: - resolution: - { - integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==, - } - engines: { node: ">= 8" } + resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} + engines: {node: '>= 8'} source-map@0.8.0-beta.0: - resolution: - { - integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==, - } - engines: { node: ">= 8" } + resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} + engines: {node: '>= 8'} deprecated: The work that was done in this beta branch won't be included in future versions space-separated-tokens@2.0.2: - resolution: - { - integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==, - } + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} speech-rule-engine@4.1.2: - resolution: - { - integrity: sha512-S6ji+flMEga+1QU79NDbwZ8Ivf0S/MpupQQiIC0rTpU/ZTKgcajijJJb1OcByBQDjrXCN1/DJtGz4ZJeBMPGJw==, - } + resolution: {integrity: sha512-S6ji+flMEga+1QU79NDbwZ8Ivf0S/MpupQQiIC0rTpU/ZTKgcajijJJb1OcByBQDjrXCN1/DJtGz4ZJeBMPGJw==} hasBin: true split-on-first@3.0.0: - resolution: - { - integrity: sha512-qxQJTx2ryR0Dw0ITYyekNQWpz6f8dGd7vffGNflQQ3Iqj9NJ6qiZ7ELpZsJ/QBhIVAiDfXdag3+Gp8RvWa62AA==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-qxQJTx2ryR0Dw0ITYyekNQWpz6f8dGd7vffGNflQQ3Iqj9NJ6qiZ7ELpZsJ/QBhIVAiDfXdag3+Gp8RvWa62AA==} + engines: {node: '>=12'} split2@3.2.2: - resolution: - { - integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==, - } + resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} stackback@0.0.2: - resolution: - { - integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==, - } + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} starlight-blog@0.23.2: - resolution: - { - integrity: sha512-ymyCOsohNb7xomYEL0+S6kV+RWE8uN3FJs6IqgKu2+930nt31zem+NYTCu81BO1wIXx3aF/qPK04RWLZ3wXhIg==, - } - engines: { node: ">=18.17.1" } + resolution: {integrity: sha512-ymyCOsohNb7xomYEL0+S6kV+RWE8uN3FJs6IqgKu2+930nt31zem+NYTCu81BO1wIXx3aF/qPK04RWLZ3wXhIg==} + engines: {node: '>=18.17.1'} peerDependencies: - "@astrojs/starlight": ">=0.33.0" + '@astrojs/starlight': '>=0.33.0' starlight-typedoc@0.19.0: - resolution: - { - integrity: sha512-NR1A3XjxEl8hS3xKaw7TutuFMaEYmMstgZNmSNAnAzav1dZtMoZsp3KM+S4Tr+5kYCR1v0DlF+ESouOn8Nl5Dw==, - } - engines: { node: ">=18.17.1" } + resolution: {integrity: sha512-NR1A3XjxEl8hS3xKaw7TutuFMaEYmMstgZNmSNAnAzav1dZtMoZsp3KM+S4Tr+5kYCR1v0DlF+ESouOn8Nl5Dw==} + engines: {node: '>=18.17.1'} peerDependencies: - "@astrojs/starlight": ">=0.32.0" - typedoc: ">=0.26.5" - typedoc-plugin-markdown: ">=4.1.1" + '@astrojs/starlight': '>=0.32.0' + typedoc: '>=0.26.5' + typedoc-plugin-markdown: '>=4.1.1' state-local@1.0.7: - resolution: - { - integrity: sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w==, - } + resolution: {integrity: sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w==} statuses@2.0.2: - resolution: - { - integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==, - } - engines: { node: ">= 0.8" } + resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} + engines: {node: '>= 0.8'} std-env@3.9.0: - resolution: - { - integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==, - } + resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} stream-replace-string@2.0.0: - resolution: - { - integrity: sha512-TlnjJ1C0QrmxRNrON00JvaFFlNh5TTG00APw23j74ET7gkQpTASi6/L2fuiav8pzK715HXtUeClpBTw2NPSn6w==, - } + resolution: {integrity: sha512-TlnjJ1C0QrmxRNrON00JvaFFlNh5TTG00APw23j74ET7gkQpTASi6/L2fuiav8pzK715HXtUeClpBTw2NPSn6w==} strict-event-emitter@0.5.1: - resolution: - { - integrity: sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==, - } + resolution: {integrity: sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==} string-argv@0.3.2: - resolution: - { - integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==, - } - engines: { node: ">=0.6.19" } + resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} + engines: {node: '>=0.6.19'} string-width@4.2.3: - resolution: - { - integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} string-width@5.1.2: - resolution: - { - integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} string-width@7.2.0: - resolution: - { - integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} + engines: {node: '>=18'} string_decoder@1.3.0: - resolution: - { - integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==, - } + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} stringify-entities@4.0.4: - resolution: - { - integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==, - } + resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} strip-ansi@6.0.1: - resolution: - { - integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} strip-ansi@7.1.0: - resolution: - { - integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} strip-ansi@7.1.2: - resolution: - { - integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==} + engines: {node: '>=12'} strip-final-newline@4.0.0: - resolution: - { - integrity: sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==} + engines: {node: '>=18'} strip-json-comments@2.0.1: - resolution: - { - integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==, - } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} strip-literal@3.0.0: - resolution: - { - integrity: sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==, - } + resolution: {integrity: sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==} strnum@1.1.1: - resolution: - { - integrity: sha512-O7aCHfYCamLCctjAiaucmE+fHf2DYHkus2OKCn4Wv03sykfFtgeECn505X6K4mPl8CRNd/qurC9guq+ynoN4pw==, - } + resolution: {integrity: sha512-O7aCHfYCamLCctjAiaucmE+fHf2DYHkus2OKCn4Wv03sykfFtgeECn505X6K4mPl8CRNd/qurC9guq+ynoN4pw==} style-to-js@1.1.16: - resolution: - { - integrity: sha512-/Q6ld50hKYPH3d/r6nr117TZkHR0w0kGGIVfpG9N6D8NymRPM9RqCUv4pRpJ62E5DqOYx2AFpbZMyCPnjQCnOw==, - } + resolution: {integrity: sha512-/Q6ld50hKYPH3d/r6nr117TZkHR0w0kGGIVfpG9N6D8NymRPM9RqCUv4pRpJ62E5DqOYx2AFpbZMyCPnjQCnOw==} style-to-object@1.0.8: - resolution: - { - integrity: sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g==, - } + resolution: {integrity: sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g==} stylehacks@7.0.4: - resolution: - { - integrity: sha512-i4zfNrGMt9SB4xRK9L83rlsFCgdGANfeDAYacO1pkqcE7cRHPdWHwnKZVz7WY17Veq/FvyYsRAU++Ga+qDFIww==, - } - engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 } + resolution: {integrity: sha512-i4zfNrGMt9SB4xRK9L83rlsFCgdGANfeDAYacO1pkqcE7cRHPdWHwnKZVz7WY17Veq/FvyYsRAU++Ga+qDFIww==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.4.31 sucrase@3.35.0: - resolution: - { - integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==, - } - engines: { node: ">=16 || 14 >=14.17" } + resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} + engines: {node: '>=16 || 14 >=14.17'} hasBin: true supports-color@7.2.0: - resolution: - { - integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} supports-preserve-symlinks-flag@1.0.0: - resolution: - { - integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} svgo@3.3.2: - resolution: - { - integrity: sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==, - } - engines: { node: ">=14.0.0" } + resolution: {integrity: sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==} + engines: {node: '>=14.0.0'} hasBin: true symbol-tree@3.2.4: - resolution: - { - integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==, - } + resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} tailwindcss-motion@1.1.1: - resolution: - { - integrity: sha512-CeeQAc5o31BuEPMyWdq/786X7QWNeifa+8khfu74Fs8lGkgEwjNYv6dGv+lRFS8FWXV5dp7F3AU9JjBXjiaQfw==, - } + resolution: {integrity: sha512-CeeQAc5o31BuEPMyWdq/786X7QWNeifa+8khfu74Fs8lGkgEwjNYv6dGv+lRFS8FWXV5dp7F3AU9JjBXjiaQfw==} peerDependencies: - tailwindcss: ">=3.0.0 || insiders" + tailwindcss: '>=3.0.0 || insiders' tailwindcss@4.1.11: - resolution: - { - integrity: sha512-2E9TBm6MDD/xKYe+dvJZAmg3yxIEDNRc0jwlNyDg/4Fil2QcSLjFKGVff0lAf1jjeaArlG/M75Ey/EYr/OJtBA==, - } + resolution: {integrity: sha512-2E9TBm6MDD/xKYe+dvJZAmg3yxIEDNRc0jwlNyDg/4Fil2QcSLjFKGVff0lAf1jjeaArlG/M75Ey/EYr/OJtBA==} tailwindcss@4.1.13: - resolution: - { - integrity: sha512-i+zidfmTqtwquj4hMEwdjshYYgMbOrPzb9a0M3ZgNa0JMoZeFC6bxZvO8yr8ozS6ix2SDz0+mvryPeBs2TFE+w==, - } + resolution: {integrity: sha512-i+zidfmTqtwquj4hMEwdjshYYgMbOrPzb9a0M3ZgNa0JMoZeFC6bxZvO8yr8ozS6ix2SDz0+mvryPeBs2TFE+w==} tapable@2.2.3: - resolution: - { - integrity: sha512-ZL6DDuAlRlLGghwcfmSn9sK3Hr6ArtyudlSAiCqQ6IfE+b+HHbydbYDIG15IfS5do+7XQQBdBiubF/cV2dnDzg==, - } - engines: { node: ">=6" } + resolution: {integrity: sha512-ZL6DDuAlRlLGghwcfmSn9sK3Hr6ArtyudlSAiCqQ6IfE+b+HHbydbYDIG15IfS5do+7XQQBdBiubF/cV2dnDzg==} + engines: {node: '>=6'} tar-fs@2.1.4: - resolution: - { - integrity: sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==, - } + resolution: {integrity: sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==} tar-stream@2.2.0: - resolution: - { - integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==, - } - engines: { node: ">=6" } + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} tar@7.4.3: - resolution: - { - integrity: sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==} + engines: {node: '>=18'} test-exclude@7.0.1: - resolution: - { - integrity: sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==} + engines: {node: '>=18'} thenify-all@1.6.0: - resolution: - { - integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==, - } - engines: { node: ">=0.8" } + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} thenify@3.3.1: - resolution: - { - integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==, - } + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} through2@4.0.2: - resolution: - { - integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==, - } + resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} tiny-inflate@1.0.3: - resolution: - { - integrity: sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==, - } + resolution: {integrity: sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==} tinybench@2.9.0: - resolution: - { - integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==, - } + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} tinybench@3.1.1: - resolution: - { - integrity: sha512-74pmf47HY/bHqamcCMGris+1AtGGsqTZ3Hc/UK4QvSmRuf/9PIF9753+c8XBh7JfX2r9KeZtVjOYjd6vFpc0qQ==, - } - engines: { node: ">=18.0.0" } + resolution: {integrity: sha512-74pmf47HY/bHqamcCMGris+1AtGGsqTZ3Hc/UK4QvSmRuf/9PIF9753+c8XBh7JfX2r9KeZtVjOYjd6vFpc0qQ==} + engines: {node: '>=18.0.0'} tinyexec@0.3.2: - resolution: - { - integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==, - } + resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} tinyglobby@0.2.12: - resolution: - { - integrity: sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==, - } - engines: { node: ">=12.0.0" } + resolution: {integrity: sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==} + engines: {node: '>=12.0.0'} tinyglobby@0.2.14: - resolution: - { - integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==, - } - engines: { node: ">=12.0.0" } + resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} + engines: {node: '>=12.0.0'} tinyglobby@0.2.15: - resolution: - { - integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==, - } - engines: { node: ">=12.0.0" } + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} + engines: {node: '>=12.0.0'} tinypool@1.1.1: - resolution: - { - integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==, - } - engines: { node: ^18.0.0 || >=20.0.0 } + resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} + engines: {node: ^18.0.0 || >=20.0.0} tinyrainbow@2.0.0: - resolution: - { - integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==, - } - engines: { node: ">=14.0.0" } + resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} + engines: {node: '>=14.0.0'} tinyspy@4.0.3: - resolution: - { - integrity: sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==, - } - engines: { node: ">=14.0.0" } + resolution: {integrity: sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==} + engines: {node: '>=14.0.0'} tldts-core@7.0.16: - resolution: - { - integrity: sha512-XHhPmHxphLi+LGbH0G/O7dmUH9V65OY20R7vH8gETHsp5AZCjBk9l8sqmRKLaGOxnETU7XNSDUPtewAy/K6jbA==, - } + resolution: {integrity: sha512-XHhPmHxphLi+LGbH0G/O7dmUH9V65OY20R7vH8gETHsp5AZCjBk9l8sqmRKLaGOxnETU7XNSDUPtewAy/K6jbA==} tldts@7.0.16: - resolution: - { - integrity: sha512-5bdPHSwbKTeHmXrgecID4Ljff8rQjv7g8zKQPkCozRo2HWWni+p310FSn5ImI+9kWw9kK4lzOB5q/a6iv0IJsw==, - } + resolution: {integrity: sha512-5bdPHSwbKTeHmXrgecID4Ljff8rQjv7g8zKQPkCozRo2HWWni+p310FSn5ImI+9kWw9kK4lzOB5q/a6iv0IJsw==} hasBin: true to-regex-range@5.0.1: - resolution: - { - integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==, - } - engines: { node: ">=8.0" } + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} totalist@3.0.1: - resolution: - { - integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==, - } - engines: { node: ">=6" } + resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} + engines: {node: '>=6'} tough-cookie@4.1.4: - resolution: - { - integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==, - } - engines: { node: ">=6" } + resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} + engines: {node: '>=6'} tough-cookie@6.0.0: - resolution: - { - integrity: sha512-kXuRi1mtaKMrsLUxz3sQYvVl37B0Ns6MzfrtV5DvJceE9bPyspOqk9xxv7XbZWcfLWbFmm997vl83qUWVJA64w==, - } - engines: { node: ">=16" } + resolution: {integrity: sha512-kXuRi1mtaKMrsLUxz3sQYvVl37B0Ns6MzfrtV5DvJceE9bPyspOqk9xxv7XbZWcfLWbFmm997vl83qUWVJA64w==} + engines: {node: '>=16'} tr46@0.0.3: - resolution: - { - integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==, - } + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} tr46@1.0.1: - resolution: - { - integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==, - } + resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} tr46@6.0.0: - resolution: - { - integrity: sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==, - } - engines: { node: ">=20" } + resolution: {integrity: sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==} + engines: {node: '>=20'} tree-kill@1.2.2: - resolution: - { - integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==, - } + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} hasBin: true treeify@1.1.0: - resolution: - { - integrity: sha512-1m4RA7xVAJrSGrrXGs0L3YTwyvBs2S8PbRHaLZAkFw7JR8oIFwYtysxlBZhYIa7xSyiYJKZ3iGrrk55cGA3i9A==, - } - engines: { node: ">=0.6" } + resolution: {integrity: sha512-1m4RA7xVAJrSGrrXGs0L3YTwyvBs2S8PbRHaLZAkFw7JR8oIFwYtysxlBZhYIa7xSyiYJKZ3iGrrk55cGA3i9A==} + engines: {node: '>=0.6'} trim-lines@3.0.1: - resolution: - { - integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==, - } + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} trough@2.2.0: - resolution: - { - integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==, - } + resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} ts-interface-checker@0.1.13: - resolution: - { - integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==, - } + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} tsconfck@3.1.6: - resolution: - { - integrity: sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==, - } - engines: { node: ^18 || >=20 } + resolution: {integrity: sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==} + engines: {node: ^18 || >=20} hasBin: true peerDependencies: typescript: ^5.0.0 @@ -9687,27 +5989,21 @@ packages: optional: true tslib@2.8.1: - resolution: - { - integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==, - } + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} tsup@8.5.0: - resolution: - { - integrity: sha512-VmBp77lWNQq6PfuMqCHD3xWl22vEoWsKajkF8t+yMBawlUS8JzEI+vOVMeuNZIuMML8qXRizFKi9oD5glKQVcQ==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-VmBp77lWNQq6PfuMqCHD3xWl22vEoWsKajkF8t+yMBawlUS8JzEI+vOVMeuNZIuMML8qXRizFKi9oD5glKQVcQ==} + engines: {node: '>=18'} hasBin: true peerDependencies: - "@microsoft/api-extractor": ^7.36.0 - "@swc/core": ^1 + '@microsoft/api-extractor': ^7.36.0 + '@swc/core': ^1 postcss: ^8.4.12 - typescript: ">=4.5.0" + typescript: '>=4.5.0' peerDependenciesMeta: - "@microsoft/api-extractor": + '@microsoft/api-extractor': optional: true - "@swc/core": + '@swc/core': optional: true postcss: optional: true @@ -9715,128 +6011,74 @@ packages: optional: true tsx@4.19.3: - resolution: - { - integrity: sha512-4H8vUNGNjQ4V2EOoGw005+c+dGuPSnhpPBPHBtsZdGZBk/iJb4kguGlPWaZTZ3q5nMtFOEsY0nRDlh9PJyd6SQ==, - } - engines: { node: ">=18.0.0" } + resolution: {integrity: sha512-4H8vUNGNjQ4V2EOoGw005+c+dGuPSnhpPBPHBtsZdGZBk/iJb4kguGlPWaZTZ3q5nMtFOEsY0nRDlh9PJyd6SQ==} + engines: {node: '>=18.0.0'} hasBin: true tunnel-agent@0.6.0: - resolution: - { - integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==, - } + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} twoslash-protocol@0.2.12: - resolution: - { - integrity: sha512-5qZLXVYfZ9ABdjqbvPc4RWMr7PrpPaaDSeaYY55vl/w1j6H6kzsWK/urAEIXlzYlyrFmyz1UbwIt+AA0ck+wbg==, - } + resolution: {integrity: sha512-5qZLXVYfZ9ABdjqbvPc4RWMr7PrpPaaDSeaYY55vl/w1j6H6kzsWK/urAEIXlzYlyrFmyz1UbwIt+AA0ck+wbg==} twoslash@0.2.12: - resolution: - { - integrity: sha512-tEHPASMqi7kqwfJbkk7hc/4EhlrKCSLcur+TcvYki3vhIfaRMXnXjaYFgXpoZRbT6GdprD4tGuVBEmTpUgLBsw==, - } + resolution: {integrity: sha512-tEHPASMqi7kqwfJbkk7hc/4EhlrKCSLcur+TcvYki3vhIfaRMXnXjaYFgXpoZRbT6GdprD4tGuVBEmTpUgLBsw==} peerDependencies: - typescript: "*" + typescript: '*' type-detect@4.1.0: - resolution: - { - integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==, - } - engines: { node: ">=4" } + resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} + engines: {node: '>=4'} type-fest@4.38.0: - resolution: - { - integrity: sha512-2dBz5D5ycHIoliLYLi0Q2V7KRaDlH0uWIvmk7TYlAg5slqwiPv1ezJdZm1QEM0xgk29oYWMCbIG7E6gHpvChlg==, - } - engines: { node: ">=16" } + resolution: {integrity: sha512-2dBz5D5ycHIoliLYLi0Q2V7KRaDlH0uWIvmk7TYlAg5slqwiPv1ezJdZm1QEM0xgk29oYWMCbIG7E6gHpvChlg==} + engines: {node: '>=16'} type-fest@4.41.0: - resolution: - { - integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==, - } - engines: { node: ">=16" } + resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} + engines: {node: '>=16'} typed-binary@4.3.2: - resolution: - { - integrity: sha512-HT3pIBM2njCZUmeczDaQUUErGiM6GXFCqMsHegE12HCoBtvHCkfR10JJni0TeGOTnLilTd6YFyj+YhflqQDrDQ==, - } + resolution: {integrity: sha512-HT3pIBM2njCZUmeczDaQUUErGiM6GXFCqMsHegE12HCoBtvHCkfR10JJni0TeGOTnLilTd6YFyj+YhflqQDrDQ==} typedoc-plugin-markdown@4.4.2: - resolution: - { - integrity: sha512-kJVkU2Wd+AXQpyL6DlYXXRrfNrHrEIUgiABWH8Z+2Lz5Sq6an4dQ/hfvP75bbokjNDUskOdFlEEm/0fSVyC7eg==, - } - engines: { node: ">= 18" } + resolution: {integrity: sha512-kJVkU2Wd+AXQpyL6DlYXXRrfNrHrEIUgiABWH8Z+2Lz5Sq6an4dQ/hfvP75bbokjNDUskOdFlEEm/0fSVyC7eg==} + engines: {node: '>= 18'} peerDependencies: typedoc: 0.27.x typedoc@0.28.13: - resolution: - { - integrity: sha512-dNWY8msnYB2a+7Audha+aTF1Pu3euiE7ySp53w8kEsXoYw7dMouV5A1UsTUY345aB152RHnmRMDiovuBi7BD+w==, - } - engines: { node: ">= 18", pnpm: ">= 10" } + resolution: {integrity: sha512-dNWY8msnYB2a+7Audha+aTF1Pu3euiE7ySp53w8kEsXoYw7dMouV5A1UsTUY345aB152RHnmRMDiovuBi7BD+w==} + engines: {node: '>= 18', pnpm: '>= 10'} hasBin: true peerDependencies: typescript: 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x || 5.7.x || 5.8.x || 5.9.x typesafe-path@0.2.2: - resolution: - { - integrity: sha512-OJabfkAg1WLZSqJAJ0Z6Sdt3utnbzr/jh+NAHoyWHJe8CMSy79Gm085094M9nvTPy22KzTVn5Zq5mbapCI/hPA==, - } + resolution: {integrity: sha512-OJabfkAg1WLZSqJAJ0Z6Sdt3utnbzr/jh+NAHoyWHJe8CMSy79Gm085094M9nvTPy22KzTVn5Zq5mbapCI/hPA==} typescript-auto-import-cache@0.3.5: - resolution: - { - integrity: sha512-fAIveQKsoYj55CozUiBoj4b/7WpN0i4o74wiGY5JVUEoD0XiqDk1tJqTEjgzL2/AizKQrXxyRosSebyDzBZKjw==, - } + resolution: {integrity: sha512-fAIveQKsoYj55CozUiBoj4b/7WpN0i4o74wiGY5JVUEoD0XiqDk1tJqTEjgzL2/AizKQrXxyRosSebyDzBZKjw==} typescript@5.8.3: - resolution: - { - integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==, - } - engines: { node: ">=14.17" } + resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} + engines: {node: '>=14.17'} hasBin: true uc.micro@2.1.0: - resolution: - { - integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==, - } + resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} ufo@1.5.4: - resolution: - { - integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==, - } + resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==} ufo@1.6.1: - resolution: - { - integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==, - } + resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} ultrahtml@1.6.0: - resolution: - { - integrity: sha512-R9fBn90VTJrqqLDwyMph+HGne8eqY1iPfYhPzZrvKpIfwkWZbcYlfpsb8B9dTvBfpy1/hqAD7Wi8EKfP9e8zdw==, - } + resolution: {integrity: sha512-R9fBn90VTJrqqLDwyMph+HGne8eqY1iPfYhPzZrvKpIfwkWZbcYlfpsb8B9dTvBfpy1/hqAD7Wi8EKfP9e8zdw==} unbuild@3.5.0: - resolution: - { - integrity: sha512-DPFttsiADnHRb/K+yJ9r9jdn6JyXlsmdT0S12VFC14DFSJD+cxBnHq+v0INmqqPVPxOoUjvJFYUVIb02rWnVeA==, - } + resolution: {integrity: sha512-DPFttsiADnHRb/K+yJ9r9jdn6JyXlsmdT0S12VFC14DFSJD+cxBnHq+v0INmqqPVPxOoUjvJFYUVIb02rWnVeA==} hasBin: true peerDependencies: typescript: ^5.7.3 @@ -9845,201 +6087,129 @@ packages: optional: true uncrypto@0.1.3: - resolution: - { - integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==, - } + resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} undici-types@7.10.0: - resolution: - { - integrity: sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==, - } + resolution: {integrity: sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==} undici-types@7.12.0: - resolution: - { - integrity: sha512-goOacqME2GYyOZZfb5Lgtu+1IDmAlAEu5xnD3+xTzS10hT0vzpf0SPjkXwAw9Jm+4n/mQGDP3LO8CPbYROeBfQ==, - } + resolution: {integrity: sha512-goOacqME2GYyOZZfb5Lgtu+1IDmAlAEu5xnD3+xTzS10hT0vzpf0SPjkXwAw9Jm+4n/mQGDP3LO8CPbYROeBfQ==} undici@6.21.2: - resolution: - { - integrity: sha512-uROZWze0R0itiAKVPsYhFov9LxrPMHLMEQFszeI2gCN6bnIIZ8twzBCJcN2LJrBBLfrP0t1FW0g+JmKVl8Vk1g==, - } - engines: { node: ">=18.17" } + resolution: {integrity: sha512-uROZWze0R0itiAKVPsYhFov9LxrPMHLMEQFszeI2gCN6bnIIZ8twzBCJcN2LJrBBLfrP0t1FW0g+JmKVl8Vk1g==} + engines: {node: '>=18.17'} unicode-properties@1.4.1: - resolution: - { - integrity: sha512-CLjCCLQ6UuMxWnbIylkisbRj31qxHPAurvena/0iwSVbQ2G1VY5/HjV0IRabOEbDHlzZlRdCrD4NhB0JtU40Pg==, - } + resolution: {integrity: sha512-CLjCCLQ6UuMxWnbIylkisbRj31qxHPAurvena/0iwSVbQ2G1VY5/HjV0IRabOEbDHlzZlRdCrD4NhB0JtU40Pg==} unicode-trie@2.0.0: - resolution: - { - integrity: sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==, - } + resolution: {integrity: sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==} unicorn-magic@0.3.0: - resolution: - { - integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} + engines: {node: '>=18'} unified@11.0.5: - resolution: - { - integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==, - } + resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} unifont@0.5.2: - resolution: - { - integrity: sha512-LzR4WUqzH9ILFvjLAUU7dK3Lnou/qd5kD+IakBtBK4S15/+x2y9VX+DcWQv6s551R6W+vzwgVS6tFg3XggGBgg==, - } + resolution: {integrity: sha512-LzR4WUqzH9ILFvjLAUU7dK3Lnou/qd5kD+IakBtBK4S15/+x2y9VX+DcWQv6s551R6W+vzwgVS6tFg3XggGBgg==} unist-util-find-after@5.0.0: - resolution: - { - integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==, - } + resolution: {integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==} unist-util-is@6.0.0: - resolution: - { - integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==, - } + resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} unist-util-modify-children@4.0.0: - resolution: - { - integrity: sha512-+tdN5fGNddvsQdIzUF3Xx82CU9sMM+fA0dLgR9vOmT0oPT2jH+P1nd5lSqfCfXAw+93NhcXNY2qqvTUtE4cQkw==, - } + resolution: {integrity: sha512-+tdN5fGNddvsQdIzUF3Xx82CU9sMM+fA0dLgR9vOmT0oPT2jH+P1nd5lSqfCfXAw+93NhcXNY2qqvTUtE4cQkw==} unist-util-position-from-estree@2.0.0: - resolution: - { - integrity: sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==, - } + resolution: {integrity: sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==} unist-util-position@5.0.0: - resolution: - { - integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==, - } + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} unist-util-remove-position@5.0.0: - resolution: - { - integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==, - } + resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==} unist-util-stringify-position@4.0.0: - resolution: - { - integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==, - } + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} unist-util-visit-children@3.0.0: - resolution: - { - integrity: sha512-RgmdTfSBOg04sdPcpTSD1jzoNBjt9a80/ZCzp5cI9n1qPzLZWF9YdvWGN2zmTumP1HWhXKdUWexjy/Wy/lJ7tA==, - } + resolution: {integrity: sha512-RgmdTfSBOg04sdPcpTSD1jzoNBjt9a80/ZCzp5cI9n1qPzLZWF9YdvWGN2zmTumP1HWhXKdUWexjy/Wy/lJ7tA==} unist-util-visit-parents@6.0.1: - resolution: - { - integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==, - } + resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} unist-util-visit@5.0.0: - resolution: - { - integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==, - } + resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} universal-user-agent@6.0.1: - resolution: - { - integrity: sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==, - } + resolution: {integrity: sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==} universalify@0.2.0: - resolution: - { - integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==, - } - engines: { node: ">= 4.0.0" } + resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} + engines: {node: '>= 4.0.0'} universalify@2.0.1: - resolution: - { - integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==, - } - engines: { node: ">= 10.0.0" } + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} unplugin@2.3.5: - resolution: - { - integrity: sha512-RyWSb5AHmGtjjNQ6gIlA67sHOsWpsbWpwDokLwTcejVdOjEkJZh7QKu14J00gDDVSh8kGH4KYC/TNBceXFZhtw==, - } - engines: { node: ">=18.12.0" } + resolution: {integrity: sha512-RyWSb5AHmGtjjNQ6gIlA67sHOsWpsbWpwDokLwTcejVdOjEkJZh7QKu14J00gDDVSh8kGH4KYC/TNBceXFZhtw==} + engines: {node: '>=18.12.0'} unstorage@1.17.1: - resolution: - { - integrity: sha512-KKGwRTT0iVBCErKemkJCLs7JdxNVfqTPc/85ae1XES0+bsHbc/sFBfVi5kJp156cc51BHinIH2l3k0EZ24vOBQ==, - } - peerDependencies: - "@azure/app-configuration": ^1.8.0 - "@azure/cosmos": ^4.2.0 - "@azure/data-tables": ^13.3.0 - "@azure/identity": ^4.6.0 - "@azure/keyvault-secrets": ^4.9.0 - "@azure/storage-blob": ^12.26.0 - "@capacitor/preferences": ^6.0.3 || ^7.0.0 - "@deno/kv": ">=0.9.0" - "@netlify/blobs": ^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0 - "@planetscale/database": ^1.19.0 - "@upstash/redis": ^1.34.3 - "@vercel/blob": ">=0.27.1" - "@vercel/functions": ^2.2.12 || ^3.0.0 - "@vercel/kv": ^1.0.1 + resolution: {integrity: sha512-KKGwRTT0iVBCErKemkJCLs7JdxNVfqTPc/85ae1XES0+bsHbc/sFBfVi5kJp156cc51BHinIH2l3k0EZ24vOBQ==} + peerDependencies: + '@azure/app-configuration': ^1.8.0 + '@azure/cosmos': ^4.2.0 + '@azure/data-tables': ^13.3.0 + '@azure/identity': ^4.6.0 + '@azure/keyvault-secrets': ^4.9.0 + '@azure/storage-blob': ^12.26.0 + '@capacitor/preferences': ^6.0.3 || ^7.0.0 + '@deno/kv': '>=0.9.0' + '@netlify/blobs': ^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0 + '@planetscale/database': ^1.19.0 + '@upstash/redis': ^1.34.3 + '@vercel/blob': '>=0.27.1' + '@vercel/functions': ^2.2.12 || ^3.0.0 + '@vercel/kv': ^1.0.1 aws4fetch: ^1.0.20 - db0: ">=0.2.1" + db0: '>=0.2.1' idb-keyval: ^6.2.1 ioredis: ^5.4.2 uploadthing: ^7.4.4 peerDependenciesMeta: - "@azure/app-configuration": + '@azure/app-configuration': optional: true - "@azure/cosmos": + '@azure/cosmos': optional: true - "@azure/data-tables": + '@azure/data-tables': optional: true - "@azure/identity": + '@azure/identity': optional: true - "@azure/keyvault-secrets": + '@azure/keyvault-secrets': optional: true - "@azure/storage-blob": + '@azure/storage-blob': optional: true - "@capacitor/preferences": + '@capacitor/preferences': optional: true - "@deno/kv": + '@deno/kv': optional: true - "@netlify/blobs": + '@netlify/blobs': optional: true - "@planetscale/database": + '@planetscale/database': optional: true - "@upstash/redis": + '@upstash/redis': optional: true - "@vercel/blob": + '@vercel/blob': optional: true - "@vercel/functions": + '@vercel/functions': optional: true - "@vercel/kv": + '@vercel/kv': optional: true aws4fetch: optional: true @@ -10053,141 +6223,93 @@ packages: optional: true untyped@2.0.0: - resolution: - { - integrity: sha512-nwNCjxJTjNuLCgFr42fEak5OcLuB3ecca+9ksPFNvtfYSLpjf+iJqSIaSnIile6ZPbKYxI5k2AfXqeopGudK/g==, - } + resolution: {integrity: sha512-nwNCjxJTjNuLCgFr42fEak5OcLuB3ecca+9ksPFNvtfYSLpjf+iJqSIaSnIile6ZPbKYxI5k2AfXqeopGudK/g==} hasBin: true update-browserslist-db@1.1.3: - resolution: - { - integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==, - } + resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} hasBin: true peerDependencies: - browserslist: ">= 4.21.0" + browserslist: '>= 4.21.0' url-join@5.0.0: - resolution: - { - integrity: sha512-n2huDr9h9yzd6exQVnH/jU5mr+Pfx08LRXXZhkLLetAMESRj+anQsTAh940iMrIetKAmry9coFuZQ2jY8/p3WA==, - } - engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + resolution: {integrity: sha512-n2huDr9h9yzd6exQVnH/jU5mr+Pfx08LRXXZhkLLetAMESRj+anQsTAh940iMrIetKAmry9coFuZQ2jY8/p3WA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} url-parse@1.5.10: - resolution: - { - integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==, - } + resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} use-callback-ref@1.3.3: - resolution: - { - integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==} + engines: {node: '>=10'} peerDependencies: - "@types/react": "*" + '@types/react': '*' react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc peerDependenciesMeta: - "@types/react": + '@types/react': optional: true use-sidecar@1.1.3: - resolution: - { - integrity: sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==} + engines: {node: '>=10'} peerDependencies: - "@types/react": "*" + '@types/react': '*' react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc peerDependenciesMeta: - "@types/react": + '@types/react': optional: true util-deprecate@1.0.2: - resolution: - { - integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==, - } + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} validate-npm-package-name@5.0.1: - resolution: - { - integrity: sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + resolution: {integrity: sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} vfile-location@5.0.3: - resolution: - { - integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==, - } + resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==} vfile-message@4.0.2: - resolution: - { - integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==, - } + resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} vfile-message@4.0.3: - resolution: - { - integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==, - } + resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==} vfile@6.0.3: - resolution: - { - integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==, - } + resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} vite-imagetools@7.1.0: - resolution: - { - integrity: sha512-Mqh1uUY2DEMuBOogFz5Rd7cAs70VP6wsdQh2IShrJ+qGk5f7yQa4pN8w0YMLlGIKYW1JfM8oXrznUwVkhG+qxg==, - } - engines: { node: ">=18.0.0" } + resolution: {integrity: sha512-Mqh1uUY2DEMuBOogFz5Rd7cAs70VP6wsdQh2IShrJ+qGk5f7yQa4pN8w0YMLlGIKYW1JfM8oXrznUwVkhG+qxg==} + engines: {node: '>=18.0.0'} vite-node@3.2.4: - resolution: - { - integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==, - } - engines: { node: ^18.0.0 || ^20.0.0 || >=22.0.0 } + resolution: {integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true vite-plugin-wasm@3.5.0: - resolution: - { - integrity: sha512-X5VWgCnqiQEGb+omhlBVsvTfxikKtoOgAzQ95+BZ8gQ+VfMHIjSHr0wyvXFQCa0eKQ0fKyaL0kWcEnYqBac4lQ==, - } + resolution: {integrity: sha512-X5VWgCnqiQEGb+omhlBVsvTfxikKtoOgAzQ95+BZ8gQ+VfMHIjSHr0wyvXFQCa0eKQ0fKyaL0kWcEnYqBac4lQ==} peerDependencies: vite: ^2 || ^3 || ^4 || ^5 || ^6 || ^7 vite@6.3.5: - resolution: - { - integrity: sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==, - } - engines: { node: ^18.0.0 || ^20.0.0 || >=22.0.0 } + resolution: {integrity: sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: - "@types/node": ^18.0.0 || ^20.0.0 || >=22.0.0 - jiti: ">=1.21.0" - less: "*" + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + jiti: '>=1.21.0' + less: '*' lightningcss: ^1.21.0 - sass: "*" - sass-embedded: "*" - stylus: "*" - sugarss: "*" + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' terser: ^5.16.0 tsx: ^4.8.1 yaml: ^2.4.2 peerDependenciesMeta: - "@types/node": + '@types/node': optional: true jiti: optional: true @@ -10211,26 +6333,23 @@ packages: optional: true vite@6.3.6: - resolution: - { - integrity: sha512-0msEVHJEScQbhkbVTb/4iHZdJ6SXp/AvxL2sjwYQFfBqleHtnCqv1J3sa9zbWz/6kW1m9Tfzn92vW+kZ1WV6QA==, - } - engines: { node: ^18.0.0 || ^20.0.0 || >=22.0.0 } + resolution: {integrity: sha512-0msEVHJEScQbhkbVTb/4iHZdJ6SXp/AvxL2sjwYQFfBqleHtnCqv1J3sa9zbWz/6kW1m9Tfzn92vW+kZ1WV6QA==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: - "@types/node": ^18.0.0 || ^20.0.0 || >=22.0.0 - jiti: ">=1.21.0" - less: "*" + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + jiti: '>=1.21.0' + less: '*' lightningcss: ^1.21.0 - sass: "*" - sass-embedded: "*" - stylus: "*" - sugarss: "*" + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' terser: ^5.16.0 tsx: ^4.8.1 yaml: ^2.4.2 peerDependenciesMeta: - "@types/node": + '@types/node': optional: true jiti: optional: true @@ -10254,10 +6373,7 @@ packages: optional: true vitefu@1.1.1: - resolution: - { - integrity: sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ==, - } + resolution: {integrity: sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ==} peerDependencies: vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0 peerDependenciesMeta: @@ -10265,30 +6381,27 @@ packages: optional: true vitest@3.2.4: - resolution: - { - integrity: sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==, - } - engines: { node: ^18.0.0 || ^20.0.0 || >=22.0.0 } + resolution: {integrity: sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: - "@edge-runtime/vm": "*" - "@types/debug": ^4.1.12 - "@types/node": ^18.0.0 || ^20.0.0 || >=22.0.0 - "@vitest/browser": 3.2.4 - "@vitest/ui": 3.2.4 - happy-dom: "*" - jsdom: "*" + '@edge-runtime/vm': '*' + '@types/debug': ^4.1.12 + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + '@vitest/browser': 3.2.4 + '@vitest/ui': 3.2.4 + happy-dom: '*' + jsdom: '*' peerDependenciesMeta: - "@edge-runtime/vm": + '@edge-runtime/vm': optional: true - "@types/debug": + '@types/debug': optional: true - "@types/node": + '@types/node': optional: true - "@vitest/browser": + '@vitest/browser': optional: true - "@vitest/ui": + '@vitest/ui': optional: true happy-dom: optional: true @@ -10296,355 +6409,211 @@ packages: optional: true volar-service-css@0.0.62: - resolution: - { - integrity: sha512-JwNyKsH3F8PuzZYuqPf+2e+4CTU8YoyUHEHVnoXNlrLe7wy9U3biomZ56llN69Ris7TTy/+DEX41yVxQpM4qvg==, - } + resolution: {integrity: sha512-JwNyKsH3F8PuzZYuqPf+2e+4CTU8YoyUHEHVnoXNlrLe7wy9U3biomZ56llN69Ris7TTy/+DEX41yVxQpM4qvg==} peerDependencies: - "@volar/language-service": ~2.4.0 + '@volar/language-service': ~2.4.0 peerDependenciesMeta: - "@volar/language-service": + '@volar/language-service': optional: true volar-service-emmet@0.0.62: - resolution: - { - integrity: sha512-U4dxWDBWz7Pi4plpbXf4J4Z/ss6kBO3TYrACxWNsE29abu75QzVS0paxDDhI6bhqpbDFXlpsDhZ9aXVFpnfGRQ==, - } + resolution: {integrity: sha512-U4dxWDBWz7Pi4plpbXf4J4Z/ss6kBO3TYrACxWNsE29abu75QzVS0paxDDhI6bhqpbDFXlpsDhZ9aXVFpnfGRQ==} peerDependencies: - "@volar/language-service": ~2.4.0 + '@volar/language-service': ~2.4.0 peerDependenciesMeta: - "@volar/language-service": + '@volar/language-service': optional: true volar-service-html@0.0.62: - resolution: - { - integrity: sha512-Zw01aJsZRh4GTGUjveyfEzEqpULQUdQH79KNEiKVYHZyuGtdBRYCHlrus1sueSNMxwwkuF5WnOHfvBzafs8yyQ==, - } + resolution: {integrity: sha512-Zw01aJsZRh4GTGUjveyfEzEqpULQUdQH79KNEiKVYHZyuGtdBRYCHlrus1sueSNMxwwkuF5WnOHfvBzafs8yyQ==} peerDependencies: - "@volar/language-service": ~2.4.0 + '@volar/language-service': ~2.4.0 peerDependenciesMeta: - "@volar/language-service": + '@volar/language-service': optional: true volar-service-prettier@0.0.62: - resolution: - { - integrity: sha512-h2yk1RqRTE+vkYZaI9KYuwpDfOQRrTEMvoHol0yW4GFKc75wWQRrb5n/5abDrzMPrkQbSip8JH2AXbvrRtYh4w==, - } + resolution: {integrity: sha512-h2yk1RqRTE+vkYZaI9KYuwpDfOQRrTEMvoHol0yW4GFKc75wWQRrb5n/5abDrzMPrkQbSip8JH2AXbvrRtYh4w==} peerDependencies: - "@volar/language-service": ~2.4.0 + '@volar/language-service': ~2.4.0 prettier: ^2.2 || ^3.0 peerDependenciesMeta: - "@volar/language-service": + '@volar/language-service': optional: true prettier: optional: true volar-service-typescript-twoslash-queries@0.0.62: - resolution: - { - integrity: sha512-KxFt4zydyJYYI0kFAcWPTh4u0Ha36TASPZkAnNY784GtgajerUqM80nX/W1d0wVhmcOFfAxkVsf/Ed+tiYU7ng==, - } + resolution: {integrity: sha512-KxFt4zydyJYYI0kFAcWPTh4u0Ha36TASPZkAnNY784GtgajerUqM80nX/W1d0wVhmcOFfAxkVsf/Ed+tiYU7ng==} peerDependencies: - "@volar/language-service": ~2.4.0 + '@volar/language-service': ~2.4.0 peerDependenciesMeta: - "@volar/language-service": + '@volar/language-service': optional: true volar-service-typescript@0.0.62: - resolution: - { - integrity: sha512-p7MPi71q7KOsH0eAbZwPBiKPp9B2+qrdHAd6VY5oTo9BUXatsOAdakTm9Yf0DUj6uWBAaOT01BSeVOPwucMV1g==, - } + resolution: {integrity: sha512-p7MPi71q7KOsH0eAbZwPBiKPp9B2+qrdHAd6VY5oTo9BUXatsOAdakTm9Yf0DUj6uWBAaOT01BSeVOPwucMV1g==} peerDependencies: - "@volar/language-service": ~2.4.0 + '@volar/language-service': ~2.4.0 peerDependenciesMeta: - "@volar/language-service": + '@volar/language-service': optional: true volar-service-yaml@0.0.62: - resolution: - { - integrity: sha512-k7gvv7sk3wa+nGll3MaSKyjwQsJjIGCHFjVkl3wjaSP2nouKyn9aokGmqjrl39mi88Oy49giog2GkZH526wjig==, - } + resolution: {integrity: sha512-k7gvv7sk3wa+nGll3MaSKyjwQsJjIGCHFjVkl3wjaSP2nouKyn9aokGmqjrl39mi88Oy49giog2GkZH526wjig==} peerDependencies: - "@volar/language-service": ~2.4.0 + '@volar/language-service': ~2.4.0 peerDependenciesMeta: - "@volar/language-service": + '@volar/language-service': optional: true vscode-css-languageservice@6.3.2: - resolution: - { - integrity: sha512-GEpPxrUTAeXWdZWHev1OJU9lz2Q2/PPBxQ2TIRmLGvQiH3WZbqaNoute0n0ewxlgtjzTW3AKZT+NHySk5Rf4Eg==, - } + resolution: {integrity: sha512-GEpPxrUTAeXWdZWHev1OJU9lz2Q2/PPBxQ2TIRmLGvQiH3WZbqaNoute0n0ewxlgtjzTW3AKZT+NHySk5Rf4Eg==} vscode-html-languageservice@5.3.1: - resolution: - { - integrity: sha512-ysUh4hFeW/WOWz/TO9gm08xigiSsV/FOAZ+DolgJfeLftna54YdmZ4A+lIn46RbdO3/Qv5QHTn1ZGqmrXQhZyA==, - } + resolution: {integrity: sha512-ysUh4hFeW/WOWz/TO9gm08xigiSsV/FOAZ+DolgJfeLftna54YdmZ4A+lIn46RbdO3/Qv5QHTn1ZGqmrXQhZyA==} vscode-json-languageservice@4.1.8: - resolution: - { - integrity: sha512-0vSpg6Xd9hfV+eZAaYN63xVVMOTmJ4GgHxXnkLCh+9RsQBkWKIghzLhW2B9ebfG+LQQg8uLtsQ2aUKjTgE+QOg==, - } - engines: { npm: ">=7.0.0" } + resolution: {integrity: sha512-0vSpg6Xd9hfV+eZAaYN63xVVMOTmJ4GgHxXnkLCh+9RsQBkWKIghzLhW2B9ebfG+LQQg8uLtsQ2aUKjTgE+QOg==} + engines: {npm: '>=7.0.0'} vscode-jsonrpc@6.0.0: - resolution: - { - integrity: sha512-wnJA4BnEjOSyFMvjZdpiOwhSq9uDoK8e/kpRJDTaMYzwlkrhG1fwDIZI94CLsLzlCK5cIbMMtFlJlfR57Lavmg==, - } - engines: { node: ">=8.0.0 || >=10.0.0" } + resolution: {integrity: sha512-wnJA4BnEjOSyFMvjZdpiOwhSq9uDoK8e/kpRJDTaMYzwlkrhG1fwDIZI94CLsLzlCK5cIbMMtFlJlfR57Lavmg==} + engines: {node: '>=8.0.0 || >=10.0.0'} vscode-jsonrpc@8.2.0: - resolution: - { - integrity: sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==, - } - engines: { node: ">=14.0.0" } + resolution: {integrity: sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==} + engines: {node: '>=14.0.0'} vscode-languageserver-protocol@3.16.0: - resolution: - { - integrity: sha512-sdeUoAawceQdgIfTI+sdcwkiK2KU+2cbEYA0agzM2uqaUy2UpnnGHtWTHVEtS0ES4zHU0eMFRGN+oQgDxlD66A==, - } + resolution: {integrity: sha512-sdeUoAawceQdgIfTI+sdcwkiK2KU+2cbEYA0agzM2uqaUy2UpnnGHtWTHVEtS0ES4zHU0eMFRGN+oQgDxlD66A==} vscode-languageserver-protocol@3.17.5: - resolution: - { - integrity: sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==, - } + resolution: {integrity: sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==} vscode-languageserver-textdocument@1.0.12: - resolution: - { - integrity: sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==, - } + resolution: {integrity: sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==} vscode-languageserver-types@3.16.0: - resolution: - { - integrity: sha512-k8luDIWJWyenLc5ToFQQMaSrqCHiLwyKPHKPQZ5zz21vM+vIVUSvsRpcbiECH4WR88K2XZqc4ScRcZ7nk/jbeA==, - } + resolution: {integrity: sha512-k8luDIWJWyenLc5ToFQQMaSrqCHiLwyKPHKPQZ5zz21vM+vIVUSvsRpcbiECH4WR88K2XZqc4ScRcZ7nk/jbeA==} vscode-languageserver-types@3.17.5: - resolution: - { - integrity: sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==, - } + resolution: {integrity: sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==} vscode-languageserver@7.0.0: - resolution: - { - integrity: sha512-60HTx5ID+fLRcgdHfmz0LDZAXYEV68fzwG0JWwEPBode9NuMYTIxuYXPg4ngO8i8+Ou0lM7y6GzaYWbiDL0drw==, - } + resolution: {integrity: sha512-60HTx5ID+fLRcgdHfmz0LDZAXYEV68fzwG0JWwEPBode9NuMYTIxuYXPg4ngO8i8+Ou0lM7y6GzaYWbiDL0drw==} hasBin: true vscode-languageserver@9.0.1: - resolution: - { - integrity: sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==, - } + resolution: {integrity: sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==} hasBin: true vscode-nls@5.2.0: - resolution: - { - integrity: sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng==, - } + resolution: {integrity: sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng==} vscode-uri@3.1.0: - resolution: - { - integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==, - } + resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==} w3c-xmlserializer@5.0.0: - resolution: - { - integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} + engines: {node: '>=18'} wcwidth@1.0.1: - resolution: - { - integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==, - } + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} web-namespaces@2.0.1: - resolution: - { - integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==, - } + resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} webidl-conversions@3.0.1: - resolution: - { - integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==, - } + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} webidl-conversions@4.0.2: - resolution: - { - integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==, - } + resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} webidl-conversions@8.0.0: - resolution: - { - integrity: sha512-n4W4YFyz5JzOfQeA8oN7dUYpR+MBP3PIUsn2jLjWXwK5ASUzt0Jc/A5sAUZoCYFJRGF0FBKJ+1JjN43rNdsQzA==, - } - engines: { node: ">=20" } + resolution: {integrity: sha512-n4W4YFyz5JzOfQeA8oN7dUYpR+MBP3PIUsn2jLjWXwK5ASUzt0Jc/A5sAUZoCYFJRGF0FBKJ+1JjN43rNdsQzA==} + engines: {node: '>=20'} webpack-virtual-modules@0.6.2: - resolution: - { - integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==, - } + resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} wesl@0.6.7: - resolution: - { - integrity: sha512-/T8KvIscZZnya1Xa6RoGM4RicgGNFrUIOzubz95Sz2ZhTJmJrV+jsdQNqvH3nBghR3yCIvA/H32GOjG1HG8XKA==, - } + resolution: {integrity: sha512-/T8KvIscZZnya1Xa6RoGM4RicgGNFrUIOzubz95Sz2ZhTJmJrV+jsdQNqvH3nBghR3yCIvA/H32GOjG1HG8XKA==} wgpu-matrix@3.4.0: - resolution: - { - integrity: sha512-kXHrbAPKEn9A32Wf4wVldyx9MmnzwhuB5p8GCqoJP3ItU5+iDT4J3aTQwPZWkfb153hwGtqZtUwR2M+ipJKadg==, - } + resolution: {integrity: sha512-kXHrbAPKEn9A32Wf4wVldyx9MmnzwhuB5p8GCqoJP3ItU5+iDT4J3aTQwPZWkfb153hwGtqZtUwR2M+ipJKadg==} wgsl-wasm-transpiler-bundler@0.0.1: - resolution: - { - integrity: sha512-xYys/sgYuqk1CmIGfsIBCI9gG9Or48qk5TFtlGby5qx+hn+FvCMC8SBC0EkQ/wCDxjTORDb8d/6B27U/BX7qMQ==, - } + resolution: {integrity: sha512-xYys/sgYuqk1CmIGfsIBCI9gG9Or48qk5TFtlGby5qx+hn+FvCMC8SBC0EkQ/wCDxjTORDb8d/6B27U/BX7qMQ==} wgsl_reflect@https://codeload.github.com/mhawryluk/wgsl_reflect/tar.gz/85994fdc8d8a3abbb4f79baf3891e54eed0c1c63: - resolution: - { - tarball: https://codeload.github.com/mhawryluk/wgsl_reflect/tar.gz/85994fdc8d8a3abbb4f79baf3891e54eed0c1c63, - } + resolution: {tarball: https://codeload.github.com/mhawryluk/wgsl_reflect/tar.gz/85994fdc8d8a3abbb4f79baf3891e54eed0c1c63} version: 1.0.14 whatwg-encoding@3.1.1: - resolution: - { - integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} + engines: {node: '>=18'} whatwg-mimetype@4.0.0: - resolution: - { - integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} + engines: {node: '>=18'} whatwg-url@15.1.0: - resolution: - { - integrity: sha512-2ytDk0kiEj/yu90JOAp44PVPUkO9+jVhyf+SybKlRHSDlvOOZhdPIrr7xTH64l4WixO2cP+wQIcgujkGBPPz6g==, - } - engines: { node: ">=20" } + resolution: {integrity: sha512-2ytDk0kiEj/yu90JOAp44PVPUkO9+jVhyf+SybKlRHSDlvOOZhdPIrr7xTH64l4WixO2cP+wQIcgujkGBPPz6g==} + engines: {node: '>=20'} whatwg-url@5.0.0: - resolution: - { - integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==, - } + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} whatwg-url@7.1.0: - resolution: - { - integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==, - } + resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} which-pm-runs@1.1.0: - resolution: - { - integrity: sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==, - } - engines: { node: ">=4" } + resolution: {integrity: sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==} + engines: {node: '>=4'} which@2.0.2: - resolution: - { - integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==, - } - engines: { node: ">= 8" } + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} hasBin: true why-is-node-running@2.3.0: - resolution: - { - integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} + engines: {node: '>=8'} hasBin: true wicked-good-xpath@1.3.0: - resolution: - { - integrity: sha512-Gd9+TUn5nXdwj/hFsPVx5cuHHiF5Bwuc30jZ4+ronF1qHK5O7HD0sgmXWSEgwKquT3ClLoKPVbO6qGwVwLzvAw==, - } + resolution: {integrity: sha512-Gd9+TUn5nXdwj/hFsPVx5cuHHiF5Bwuc30jZ4+ronF1qHK5O7HD0sgmXWSEgwKquT3ClLoKPVbO6qGwVwLzvAw==} widest-line@5.0.0: - resolution: - { - integrity: sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA==} + engines: {node: '>=18'} wrap-ansi@6.2.0: - resolution: - { - integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} wrap-ansi@7.0.0: - resolution: - { - integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} wrap-ansi@8.1.0: - resolution: - { - integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} wrap-ansi@9.0.2: - resolution: - { - integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==} + engines: {node: '>=18'} wrappy@1.0.2: - resolution: - { - integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==, - } + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} ws@8.18.3: - resolution: - { - integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==, - } - engines: { node: ">=10.0.0" } + resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==} + engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 - utf-8-validate: ">=5.0.2" + utf-8-validate: '>=5.0.2' peerDependenciesMeta: bufferutil: optional: true @@ -10652,234 +6621,160 @@ packages: optional: true xml-name-validator@5.0.0: - resolution: - { - integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} + engines: {node: '>=18'} xmlchars@2.2.0: - resolution: - { - integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==, - } + resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} xxhash-wasm@1.1.0: - resolution: - { - integrity: sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA==, - } + resolution: {integrity: sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA==} y18n@5.0.8: - resolution: - { - integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} yallist@3.1.1: - resolution: - { - integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==, - } + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} yallist@5.0.0: - resolution: - { - integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} + engines: {node: '>=18'} yaml-language-server@1.15.0: - resolution: - { - integrity: sha512-N47AqBDCMQmh6mBLmI6oqxryHRzi33aPFPsJhYy3VTUGCdLHYjGh4FZzpUjRlphaADBBkDmnkM/++KNIOHi5Rw==, - } + resolution: {integrity: sha512-N47AqBDCMQmh6mBLmI6oqxryHRzi33aPFPsJhYy3VTUGCdLHYjGh4FZzpUjRlphaADBBkDmnkM/++KNIOHi5Rw==} hasBin: true yaml@2.2.2: - resolution: - { - integrity: sha512-CBKFWExMn46Foo4cldiChEzn7S7SRV+wqiluAb6xmueD/fGyRHIhX8m14vVGgeFWjN540nKCNVj6P21eQjgTuA==, - } - engines: { node: ">= 14" } + resolution: {integrity: sha512-CBKFWExMn46Foo4cldiChEzn7S7SRV+wqiluAb6xmueD/fGyRHIhX8m14vVGgeFWjN540nKCNVj6P21eQjgTuA==} + engines: {node: '>= 14'} yaml@2.8.0: - resolution: - { - integrity: sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==, - } - engines: { node: ">= 14.6" } + resolution: {integrity: sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==} + engines: {node: '>= 14.6'} hasBin: true yaml@2.8.1: - resolution: - { - integrity: sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==, - } - engines: { node: ">= 14.6" } + resolution: {integrity: sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==} + engines: {node: '>= 14.6'} hasBin: true yargs-parser@20.2.9: - resolution: - { - integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} yargs-parser@21.1.1: - resolution: - { - integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} yargs@16.2.0: - resolution: - { - integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} + engines: {node: '>=10'} yargs@17.7.2: - resolution: - { - integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} yocto-queue@0.1.0: - resolution: - { - integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} yocto-queue@1.2.1: - resolution: - { - integrity: sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==, - } - engines: { node: ">=12.20" } + resolution: {integrity: sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==} + engines: {node: '>=12.20'} yocto-spinner@0.2.3: - resolution: - { - integrity: sha512-sqBChb33loEnkoXte1bLg45bEBsOP9N1kzQh5JZNKj/0rik4zAPTNSAVPj3uQAdc6slYJ0Ksc403G2XgxsJQFQ==, - } - engines: { node: ">=18.19" } + resolution: {integrity: sha512-sqBChb33loEnkoXte1bLg45bEBsOP9N1kzQh5JZNKj/0rik4zAPTNSAVPj3uQAdc6slYJ0Ksc403G2XgxsJQFQ==} + engines: {node: '>=18.19'} yoctocolors-cjs@2.1.3: - resolution: - { - integrity: sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==} + engines: {node: '>=18'} yoctocolors@2.1.1: - resolution: - { - integrity: sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ==} + engines: {node: '>=18'} yoctocolors@2.1.2: - resolution: - { - integrity: sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==} + engines: {node: '>=18'} zod-package-json@1.1.0: - resolution: - { - integrity: sha512-RvEsa3W/NCqEBMtnoE09GRVelA3IqRcKaijEiM6CEGsD19qLurf0HjrYMHwOqImOszlLL0ja63DPJeeU4pm7oQ==, - } - engines: { node: ">=20" } + resolution: {integrity: sha512-RvEsa3W/NCqEBMtnoE09GRVelA3IqRcKaijEiM6CEGsD19qLurf0HjrYMHwOqImOszlLL0ja63DPJeeU4pm7oQ==} + engines: {node: '>=20'} zod-to-json-schema@3.24.6: - resolution: - { - integrity: sha512-h/z3PKvcTcTetyjl1fkj79MHNEjm+HpD6NXheWjzOekY7kV+lwDYnHw+ivHkijnCSMz1yJaWBD9vu/Fcmk+vEg==, - } + resolution: {integrity: sha512-h/z3PKvcTcTetyjl1fkj79MHNEjm+HpD6NXheWjzOekY7kV+lwDYnHw+ivHkijnCSMz1yJaWBD9vu/Fcmk+vEg==} peerDependencies: zod: ^3.24.1 zod-to-ts@1.2.0: - resolution: - { - integrity: sha512-x30XE43V+InwGpvTySRNz9kB7qFU8DlyEy7BsSTCHPH1R0QasMmHWZDCzYm6bVXtj/9NNJAZF3jW8rzFvH5OFA==, - } + resolution: {integrity: sha512-x30XE43V+InwGpvTySRNz9kB7qFU8DlyEy7BsSTCHPH1R0QasMmHWZDCzYm6bVXtj/9NNJAZF3jW8rzFvH5OFA==} peerDependencies: typescript: ^4.9.4 || ^5.0.2 zod: ^3 zod@3.25.76: - resolution: - { - integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==, - } + resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} zwitch@2.0.4: - resolution: - { - integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==, - } + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} snapshots: - "@ampproject/remapping@2.3.0": + + '@ampproject/remapping@2.3.0': dependencies: - "@jridgewell/gen-mapping": 0.3.8 - "@jridgewell/trace-mapping": 0.3.25 + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 - "@ark/attest@0.46.0(typescript@5.8.3)": + '@ark/attest@0.46.0(typescript@5.8.3)': dependencies: - "@ark/fs": 0.46.0 - "@ark/util": 0.46.0 - "@prettier/sync": 0.5.5(prettier@3.5.3) - "@typescript/analyze-trace": 0.10.1 - "@typescript/vfs": 1.6.1(typescript@5.8.3) + '@ark/fs': 0.46.0 + '@ark/util': 0.46.0 + '@prettier/sync': 0.5.5(prettier@3.5.3) + '@typescript/analyze-trace': 0.10.1 + '@typescript/vfs': 1.6.1(typescript@5.8.3) arktype: 2.1.20 prettier: 3.5.3 typescript: 5.8.3 transitivePeerDependencies: - supports-color - "@ark/fs@0.46.0": {} + '@ark/fs@0.46.0': {} - "@ark/schema@0.46.0": + '@ark/schema@0.46.0': dependencies: - "@ark/util": 0.46.0 + '@ark/util': 0.46.0 - "@ark/schema@0.49.0": + '@ark/schema@0.49.0': dependencies: - "@ark/util": 0.49.0 + '@ark/util': 0.49.0 - "@ark/util@0.46.0": {} + '@ark/util@0.46.0': {} - "@ark/util@0.49.0": {} + '@ark/util@0.49.0': {} - "@asamuzakjp/css-color@4.0.5": + '@asamuzakjp/css-color@4.0.5': dependencies: - "@csstools/css-calc": 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) - "@csstools/css-color-parser": 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) - "@csstools/css-parser-algorithms": 3.0.5(@csstools/css-tokenizer@3.0.4) - "@csstools/css-tokenizer": 3.0.4 + '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 lru-cache: 11.2.2 - "@asamuzakjp/dom-selector@6.5.6": + '@asamuzakjp/dom-selector@6.5.6': dependencies: - "@asamuzakjp/nwsapi": 2.3.9 + '@asamuzakjp/nwsapi': 2.3.9 bidi-js: 1.0.3 css-tree: 3.1.0 is-potential-custom-element-name: 1.0.1 lru-cache: 11.2.2 - "@asamuzakjp/nwsapi@2.3.9": {} + '@asamuzakjp/nwsapi@2.3.9': {} - "@astrojs/check@0.9.4(prettier@3.5.3)(typescript@5.8.3)": + '@astrojs/check@0.9.4(prettier@3.5.3)(typescript@5.8.3)': dependencies: - "@astrojs/language-server": 2.15.4(prettier@3.5.3)(typescript@5.8.3) + '@astrojs/language-server': 2.15.4(prettier@3.5.3)(typescript@5.8.3) chokidar: 4.0.3 kleur: 4.1.5 typescript: 5.8.3 @@ -10888,21 +6783,21 @@ snapshots: - prettier - prettier-plugin-astro - "@astrojs/compiler@2.13.0": {} + '@astrojs/compiler@2.13.0': {} - "@astrojs/internal-helpers@0.6.1": {} + '@astrojs/internal-helpers@0.6.1': {} - "@astrojs/internal-helpers@0.7.2": {} + '@astrojs/internal-helpers@0.7.2': {} - "@astrojs/language-server@2.15.4(prettier@3.5.3)(typescript@5.8.3)": + '@astrojs/language-server@2.15.4(prettier@3.5.3)(typescript@5.8.3)': dependencies: - "@astrojs/compiler": 2.13.0 - "@astrojs/yaml2ts": 0.2.2 - "@jridgewell/sourcemap-codec": 1.5.0 - "@volar/kit": 2.4.11(typescript@5.8.3) - "@volar/language-core": 2.4.11 - "@volar/language-server": 2.4.11 - "@volar/language-service": 2.4.11 + '@astrojs/compiler': 2.13.0 + '@astrojs/yaml2ts': 0.2.2 + '@jridgewell/sourcemap-codec': 1.5.0 + '@volar/kit': 2.4.11(typescript@5.8.3) + '@volar/language-core': 2.4.11 + '@volar/language-server': 2.4.11 + '@volar/language-service': 2.4.11 fast-glob: 3.3.3 muggle-string: 0.4.1 volar-service-css: 0.0.62(@volar/language-service@2.4.11) @@ -10919,10 +6814,10 @@ snapshots: transitivePeerDependencies: - typescript - "@astrojs/markdown-remark@6.3.1": + '@astrojs/markdown-remark@6.3.1': dependencies: - "@astrojs/internal-helpers": 0.6.1 - "@astrojs/prism": 3.2.0 + '@astrojs/internal-helpers': 0.6.1 + '@astrojs/prism': 3.2.0 github-slugger: 2.0.0 hast-util-from-html: 2.0.3 hast-util-to-text: 4.0.2 @@ -10945,10 +6840,10 @@ snapshots: transitivePeerDependencies: - supports-color - "@astrojs/markdown-remark@6.3.3": + '@astrojs/markdown-remark@6.3.3': dependencies: - "@astrojs/internal-helpers": 0.6.1 - "@astrojs/prism": 3.3.0 + '@astrojs/internal-helpers': 0.6.1 + '@astrojs/prism': 3.3.0 github-slugger: 2.0.0 hast-util-from-html: 2.0.3 hast-util-to-text: 4.0.2 @@ -10971,10 +6866,10 @@ snapshots: transitivePeerDependencies: - supports-color - "@astrojs/markdown-remark@6.3.6": + '@astrojs/markdown-remark@6.3.6': dependencies: - "@astrojs/internal-helpers": 0.7.2 - "@astrojs/prism": 3.3.0 + '@astrojs/internal-helpers': 0.7.2 + '@astrojs/prism': 3.3.0 github-slugger: 2.0.0 hast-util-from-html: 2.0.3 hast-util-to-text: 4.0.2 @@ -10997,10 +6892,10 @@ snapshots: transitivePeerDependencies: - supports-color - "@astrojs/mdx@4.2.6(astro@5.13.7(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(rollup@4.34.8)(tsx@4.19.3)(typescript@5.8.3)(yaml@2.8.0))": + '@astrojs/mdx@4.2.6(astro@5.13.7(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(rollup@4.34.8)(tsx@4.19.3)(typescript@5.8.3)(yaml@2.8.0))': dependencies: - "@astrojs/markdown-remark": 6.3.1 - "@mdx-js/mdx": 3.1.0(acorn@8.15.0) + '@astrojs/markdown-remark': 6.3.1 + '@mdx-js/mdx': 3.1.0(acorn@8.15.0) acorn: 8.15.0 astro: 5.13.7(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(rollup@4.34.8)(tsx@4.19.3)(typescript@5.8.3)(yaml@2.8.0) es-module-lexer: 1.7.0 @@ -11016,25 +6911,25 @@ snapshots: transitivePeerDependencies: - supports-color - "@astrojs/prism@3.2.0": + '@astrojs/prism@3.2.0': dependencies: prismjs: 1.30.0 - "@astrojs/prism@3.3.0": + '@astrojs/prism@3.3.0': dependencies: prismjs: 1.30.0 - "@astrojs/react@4.3.1(@types/node@24.3.0)(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(jiti@2.5.1)(lightningcss@1.30.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(tsx@4.19.3)(yaml@2.8.0)": + '@astrojs/react@4.3.1(@types/node@24.3.0)(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(jiti@2.5.1)(lightningcss@1.30.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(tsx@4.19.3)(yaml@2.8.0)': dependencies: - "@types/react": 19.1.8 - "@types/react-dom": 19.1.6(@types/react@19.1.8) - "@vitejs/plugin-react": 4.7.0(vite@6.3.6(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0)) + '@types/react': 19.1.8 + '@types/react-dom': 19.1.6(@types/react@19.1.8) + '@vitejs/plugin-react': 4.7.0(vite@6.3.6(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0)) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) ultrahtml: 1.6.0 vite: 6.3.6(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0) transitivePeerDependencies: - - "@types/node" + - '@types/node' - jiti - less - lightningcss @@ -11047,31 +6942,31 @@ snapshots: - tsx - yaml - "@astrojs/rss@4.0.11": + '@astrojs/rss@4.0.11': dependencies: fast-xml-parser: 4.5.3 kleur: 4.1.5 - "@astrojs/sitemap@3.5.0": + '@astrojs/sitemap@3.5.0': dependencies: sitemap: 8.0.0 stream-replace-string: 2.0.0 zod: 3.25.76 - "@astrojs/starlight-tailwind@4.0.1(@astrojs/starlight@0.35.2(astro@5.13.7(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(rollup@4.34.8)(tsx@4.19.3)(typescript@5.8.3)(yaml@2.8.0)))(tailwindcss@4.1.11)": + '@astrojs/starlight-tailwind@4.0.1(@astrojs/starlight@0.35.2(astro@5.13.7(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(rollup@4.34.8)(tsx@4.19.3)(typescript@5.8.3)(yaml@2.8.0)))(tailwindcss@4.1.11)': dependencies: - "@astrojs/starlight": 0.35.2(astro@5.13.7(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(rollup@4.34.8)(tsx@4.19.3)(typescript@5.8.3)(yaml@2.8.0)) + '@astrojs/starlight': 0.35.2(astro@5.13.7(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(rollup@4.34.8)(tsx@4.19.3)(typescript@5.8.3)(yaml@2.8.0)) tailwindcss: 4.1.11 - "@astrojs/starlight@0.35.2(astro@5.13.7(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(rollup@4.34.8)(tsx@4.19.3)(typescript@5.8.3)(yaml@2.8.0))": + '@astrojs/starlight@0.35.2(astro@5.13.7(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(rollup@4.34.8)(tsx@4.19.3)(typescript@5.8.3)(yaml@2.8.0))': dependencies: - "@astrojs/markdown-remark": 6.3.3 - "@astrojs/mdx": 4.2.6(astro@5.13.7(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(rollup@4.34.8)(tsx@4.19.3)(typescript@5.8.3)(yaml@2.8.0)) - "@astrojs/sitemap": 3.5.0 - "@pagefind/default-ui": 1.3.0 - "@types/hast": 3.0.4 - "@types/js-yaml": 4.0.9 - "@types/mdast": 4.0.4 + '@astrojs/markdown-remark': 6.3.3 + '@astrojs/mdx': 4.2.6(astro@5.13.7(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(rollup@4.34.8)(tsx@4.19.3)(typescript@5.8.3)(yaml@2.8.0)) + '@astrojs/sitemap': 3.5.0 + '@pagefind/default-ui': 1.3.0 + '@types/hast': 3.0.4 + '@types/js-yaml': 4.0.9 + '@types/mdast': 4.0.4 astro: 5.13.7(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(rollup@4.34.8)(tsx@4.19.3)(typescript@5.8.3)(yaml@2.8.0) astro-expressive-code: 0.41.2(astro@5.13.7(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(rollup@4.34.8)(tsx@4.19.3)(typescript@5.8.3)(yaml@2.8.0)) bcp-47: 2.1.0 @@ -11096,7 +6991,7 @@ snapshots: transitivePeerDependencies: - supports-color - "@astrojs/tailwind@6.0.2(astro@5.13.7(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(rollup@4.34.8)(tsx@4.19.3)(typescript@5.8.3)(yaml@2.8.0))(tailwindcss@4.1.11)": + '@astrojs/tailwind@6.0.2(astro@5.13.7(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(rollup@4.34.8)(tsx@4.19.3)(typescript@5.8.3)(yaml@2.8.0))(tailwindcss@4.1.11)': dependencies: astro: 5.13.7(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(rollup@4.34.8)(tsx@4.19.3)(typescript@5.8.3)(yaml@2.8.0) autoprefixer: 10.4.21(postcss@8.5.3) @@ -11106,7 +7001,7 @@ snapshots: transitivePeerDependencies: - ts-node - "@astrojs/telemetry@3.3.0": + '@astrojs/telemetry@3.3.0': dependencies: ci-info: 4.3.0 debug: 4.4.3 @@ -11118,30 +7013,30 @@ snapshots: transitivePeerDependencies: - supports-color - "@astrojs/yaml2ts@0.2.2": + '@astrojs/yaml2ts@0.2.2': dependencies: yaml: 2.8.1 - "@babel/code-frame@7.27.1": + '@babel/code-frame@7.27.1': dependencies: - "@babel/helper-validator-identifier": 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 js-tokens: 4.0.0 picocolors: 1.1.1 - "@babel/compat-data@7.28.4": {} + '@babel/compat-data@7.28.4': {} - "@babel/core@7.28.4": + '@babel/core@7.28.4': dependencies: - "@babel/code-frame": 7.27.1 - "@babel/generator": 7.28.3 - "@babel/helper-compilation-targets": 7.27.2 - "@babel/helper-module-transforms": 7.28.3(@babel/core@7.28.4) - "@babel/helpers": 7.28.4 - "@babel/parser": 7.28.4 - "@babel/template": 7.27.2 - "@babel/traverse": 7.28.4 - "@babel/types": 7.28.4 - "@jridgewell/remapping": 2.3.5 + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.3 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.4) + '@babel/helpers': 7.28.4 + '@babel/parser': 7.28.4 + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.4 + '@babel/types': 7.28.4 + '@jridgewell/remapping': 2.3.5 convert-source-map: 2.0.0 debug: 4.4.3 gensync: 1.0.0-beta.2 @@ -11150,186 +7045,186 @@ snapshots: transitivePeerDependencies: - supports-color - "@babel/generator@7.28.3": + '@babel/generator@7.28.3': dependencies: - "@babel/parser": 7.28.4 - "@babel/types": 7.28.4 - "@jridgewell/gen-mapping": 0.3.13 - "@jridgewell/trace-mapping": 0.3.31 + '@babel/parser': 7.28.4 + '@babel/types': 7.28.4 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 jsesc: 3.1.0 - "@babel/helper-compilation-targets@7.27.2": + '@babel/helper-compilation-targets@7.27.2': dependencies: - "@babel/compat-data": 7.28.4 - "@babel/helper-validator-option": 7.27.1 + '@babel/compat-data': 7.28.4 + '@babel/helper-validator-option': 7.27.1 browserslist: 4.26.2 lru-cache: 5.1.1 semver: 6.3.1 - "@babel/helper-globals@7.28.0": {} + '@babel/helper-globals@7.28.0': {} - "@babel/helper-module-imports@7.27.1": + '@babel/helper-module-imports@7.27.1': dependencies: - "@babel/traverse": 7.28.4 - "@babel/types": 7.28.4 + '@babel/traverse': 7.28.4 + '@babel/types': 7.28.4 transitivePeerDependencies: - supports-color - "@babel/helper-module-transforms@7.28.3(@babel/core@7.28.4)": + '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.4)': dependencies: - "@babel/core": 7.28.4 - "@babel/helper-module-imports": 7.27.1 - "@babel/helper-validator-identifier": 7.27.1 - "@babel/traverse": 7.28.4 + '@babel/core': 7.28.4 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@babel/traverse': 7.28.4 transitivePeerDependencies: - supports-color - "@babel/helper-plugin-utils@7.27.1": {} + '@babel/helper-plugin-utils@7.27.1': {} - "@babel/helper-string-parser@7.25.9": {} + '@babel/helper-string-parser@7.25.9': {} - "@babel/helper-string-parser@7.27.1": {} + '@babel/helper-string-parser@7.27.1': {} - "@babel/helper-validator-identifier@7.25.9": {} + '@babel/helper-validator-identifier@7.25.9': {} - "@babel/helper-validator-identifier@7.27.1": {} + '@babel/helper-validator-identifier@7.27.1': {} - "@babel/helper-validator-option@7.27.1": {} + '@babel/helper-validator-option@7.27.1': {} - "@babel/helpers@7.28.4": + '@babel/helpers@7.28.4': dependencies: - "@babel/template": 7.27.2 - "@babel/types": 7.28.4 + '@babel/template': 7.27.2 + '@babel/types': 7.28.4 - "@babel/parser@7.26.9": + '@babel/parser@7.26.9': dependencies: - "@babel/types": 7.26.9 + '@babel/types': 7.26.9 - "@babel/parser@7.27.0": + '@babel/parser@7.27.0': dependencies: - "@babel/types": 7.27.0 + '@babel/types': 7.27.0 - "@babel/parser@7.27.2": + '@babel/parser@7.27.2': dependencies: - "@babel/types": 7.27.1 + '@babel/types': 7.27.1 - "@babel/parser@7.28.4": + '@babel/parser@7.28.4': dependencies: - "@babel/types": 7.28.4 + '@babel/types': 7.28.4 - "@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.28.4)": + '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.28.4)': dependencies: - "@babel/core": 7.28.4 - "@babel/helper-plugin-utils": 7.27.1 + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 - "@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.28.4)": + '@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.28.4)': dependencies: - "@babel/core": 7.28.4 - "@babel/helper-plugin-utils": 7.27.1 + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 - "@babel/runtime@7.26.9": + '@babel/runtime@7.26.9': dependencies: regenerator-runtime: 0.14.1 - "@babel/standalone@7.27.0": {} + '@babel/standalone@7.27.0': {} - "@babel/template@7.27.2": + '@babel/template@7.27.2': dependencies: - "@babel/code-frame": 7.27.1 - "@babel/parser": 7.27.2 - "@babel/types": 7.27.1 + '@babel/code-frame': 7.27.1 + '@babel/parser': 7.27.2 + '@babel/types': 7.27.1 - "@babel/traverse@7.28.4": + '@babel/traverse@7.28.4': dependencies: - "@babel/code-frame": 7.27.1 - "@babel/generator": 7.28.3 - "@babel/helper-globals": 7.28.0 - "@babel/parser": 7.28.4 - "@babel/template": 7.27.2 - "@babel/types": 7.28.4 + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.3 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.28.4 + '@babel/template': 7.27.2 + '@babel/types': 7.28.4 debug: 4.4.3 transitivePeerDependencies: - supports-color - "@babel/types@7.26.5": + '@babel/types@7.26.5': dependencies: - "@babel/helper-string-parser": 7.25.9 - "@babel/helper-validator-identifier": 7.25.9 + '@babel/helper-string-parser': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 - "@babel/types@7.26.9": + '@babel/types@7.26.9': dependencies: - "@babel/helper-string-parser": 7.25.9 - "@babel/helper-validator-identifier": 7.25.9 + '@babel/helper-string-parser': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 - "@babel/types@7.27.0": + '@babel/types@7.27.0': dependencies: - "@babel/helper-string-parser": 7.25.9 - "@babel/helper-validator-identifier": 7.25.9 + '@babel/helper-string-parser': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 - "@babel/types@7.27.1": + '@babel/types@7.27.1': dependencies: - "@babel/helper-string-parser": 7.27.1 - "@babel/helper-validator-identifier": 7.27.1 + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 - "@babel/types@7.28.4": + '@babel/types@7.28.4': dependencies: - "@babel/helper-string-parser": 7.27.1 - "@babel/helper-validator-identifier": 7.27.1 + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 - "@bcoe/v8-coverage@1.0.2": {} + '@bcoe/v8-coverage@1.0.2': {} - "@biomejs/biome@1.9.4": + '@biomejs/biome@1.9.4': optionalDependencies: - "@biomejs/cli-darwin-arm64": 1.9.4 - "@biomejs/cli-darwin-x64": 1.9.4 - "@biomejs/cli-linux-arm64": 1.9.4 - "@biomejs/cli-linux-arm64-musl": 1.9.4 - "@biomejs/cli-linux-x64": 1.9.4 - "@biomejs/cli-linux-x64-musl": 1.9.4 - "@biomejs/cli-win32-arm64": 1.9.4 - "@biomejs/cli-win32-x64": 1.9.4 + '@biomejs/cli-darwin-arm64': 1.9.4 + '@biomejs/cli-darwin-x64': 1.9.4 + '@biomejs/cli-linux-arm64': 1.9.4 + '@biomejs/cli-linux-arm64-musl': 1.9.4 + '@biomejs/cli-linux-x64': 1.9.4 + '@biomejs/cli-linux-x64-musl': 1.9.4 + '@biomejs/cli-win32-arm64': 1.9.4 + '@biomejs/cli-win32-x64': 1.9.4 - "@biomejs/cli-darwin-arm64@1.9.4": + '@biomejs/cli-darwin-arm64@1.9.4': optional: true - "@biomejs/cli-darwin-x64@1.9.4": + '@biomejs/cli-darwin-x64@1.9.4': optional: true - "@biomejs/cli-linux-arm64-musl@1.9.4": + '@biomejs/cli-linux-arm64-musl@1.9.4': optional: true - "@biomejs/cli-linux-arm64@1.9.4": + '@biomejs/cli-linux-arm64@1.9.4': optional: true - "@biomejs/cli-linux-x64-musl@1.9.4": + '@biomejs/cli-linux-x64-musl@1.9.4': optional: true - "@biomejs/cli-linux-x64@1.9.4": + '@biomejs/cli-linux-x64@1.9.4': optional: true - "@biomejs/cli-win32-arm64@1.9.4": + '@biomejs/cli-win32-arm64@1.9.4': optional: true - "@biomejs/cli-win32-x64@1.9.4": + '@biomejs/cli-win32-x64@1.9.4': optional: true - "@bundled-es-modules/cookie@2.0.1": + '@bundled-es-modules/cookie@2.0.1': dependencies: cookie: 0.7.2 optional: true - "@bundled-es-modules/statuses@1.0.1": + '@bundled-es-modules/statuses@1.0.1': dependencies: statuses: 2.0.2 optional: true - "@bundled-es-modules/tough-cookie@0.1.6": + '@bundled-es-modules/tough-cookie@0.1.6': dependencies: - "@types/tough-cookie": 4.0.5 + '@types/tough-cookie': 4.0.5 tough-cookie: 4.1.4 optional: true - "@capsizecss/unpack@2.4.0": + '@capsizecss/unpack@2.4.0': dependencies: blob-to-buffer: 1.2.9 cross-fetch: 3.2.0 @@ -11337,447 +7232,447 @@ snapshots: transitivePeerDependencies: - encoding - "@csstools/color-helpers@5.1.0": {} + '@csstools/color-helpers@5.1.0': {} - "@csstools/css-calc@2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)": + '@csstools/css-calc@2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': dependencies: - "@csstools/css-parser-algorithms": 3.0.5(@csstools/css-tokenizer@3.0.4) - "@csstools/css-tokenizer": 3.0.4 + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 - "@csstools/css-color-parser@3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)": + '@csstools/css-color-parser@3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': dependencies: - "@csstools/color-helpers": 5.1.0 - "@csstools/css-calc": 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) - "@csstools/css-parser-algorithms": 3.0.5(@csstools/css-tokenizer@3.0.4) - "@csstools/css-tokenizer": 3.0.4 + '@csstools/color-helpers': 5.1.0 + '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 - "@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4)": + '@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4)': dependencies: - "@csstools/css-tokenizer": 3.0.4 + '@csstools/css-tokenizer': 3.0.4 - "@csstools/css-syntax-patches-for-csstree@1.0.14(postcss@8.5.6)": + '@csstools/css-syntax-patches-for-csstree@1.0.14(postcss@8.5.6)': dependencies: postcss: 8.5.6 - "@csstools/css-tokenizer@3.0.4": {} + '@csstools/css-tokenizer@3.0.4': {} - "@ctrl/tinycolor@4.1.0": {} + '@ctrl/tinycolor@4.1.0': {} - "@emmetio/abbreviation@2.3.3": + '@emmetio/abbreviation@2.3.3': dependencies: - "@emmetio/scanner": 1.0.4 + '@emmetio/scanner': 1.0.4 - "@emmetio/css-abbreviation@2.1.8": + '@emmetio/css-abbreviation@2.1.8': dependencies: - "@emmetio/scanner": 1.0.4 + '@emmetio/scanner': 1.0.4 - "@emmetio/css-parser@0.4.0": + '@emmetio/css-parser@0.4.0': dependencies: - "@emmetio/stream-reader": 2.2.0 - "@emmetio/stream-reader-utils": 0.1.0 + '@emmetio/stream-reader': 2.2.0 + '@emmetio/stream-reader-utils': 0.1.0 - "@emmetio/html-matcher@1.3.0": + '@emmetio/html-matcher@1.3.0': dependencies: - "@emmetio/scanner": 1.0.4 + '@emmetio/scanner': 1.0.4 - "@emmetio/scanner@1.0.4": {} + '@emmetio/scanner@1.0.4': {} - "@emmetio/stream-reader-utils@0.1.0": {} + '@emmetio/stream-reader-utils@0.1.0': {} - "@emmetio/stream-reader@2.2.0": {} + '@emmetio/stream-reader@2.2.0': {} - "@emnapi/runtime@1.4.3": + '@emnapi/runtime@1.4.3': dependencies: tslib: 2.8.1 optional: true - "@esbuild/aix-ppc64@0.24.2": + '@esbuild/aix-ppc64@0.24.2': optional: true - "@esbuild/aix-ppc64@0.25.10": + '@esbuild/aix-ppc64@0.25.10': optional: true - "@esbuild/aix-ppc64@0.25.5": + '@esbuild/aix-ppc64@0.25.5': optional: true - "@esbuild/aix-ppc64@0.25.6": + '@esbuild/aix-ppc64@0.25.6': optional: true - "@esbuild/aix-ppc64@0.25.9": + '@esbuild/aix-ppc64@0.25.9': optional: true - "@esbuild/android-arm64@0.24.2": + '@esbuild/android-arm64@0.24.2': optional: true - "@esbuild/android-arm64@0.25.10": + '@esbuild/android-arm64@0.25.10': optional: true - "@esbuild/android-arm64@0.25.5": + '@esbuild/android-arm64@0.25.5': optional: true - "@esbuild/android-arm64@0.25.6": + '@esbuild/android-arm64@0.25.6': optional: true - "@esbuild/android-arm64@0.25.9": + '@esbuild/android-arm64@0.25.9': optional: true - "@esbuild/android-arm@0.24.2": + '@esbuild/android-arm@0.24.2': optional: true - "@esbuild/android-arm@0.25.10": + '@esbuild/android-arm@0.25.10': optional: true - "@esbuild/android-arm@0.25.5": + '@esbuild/android-arm@0.25.5': optional: true - "@esbuild/android-arm@0.25.6": + '@esbuild/android-arm@0.25.6': optional: true - "@esbuild/android-arm@0.25.9": + '@esbuild/android-arm@0.25.9': optional: true - "@esbuild/android-x64@0.24.2": + '@esbuild/android-x64@0.24.2': optional: true - "@esbuild/android-x64@0.25.10": + '@esbuild/android-x64@0.25.10': optional: true - "@esbuild/android-x64@0.25.5": + '@esbuild/android-x64@0.25.5': optional: true - "@esbuild/android-x64@0.25.6": + '@esbuild/android-x64@0.25.6': optional: true - "@esbuild/android-x64@0.25.9": + '@esbuild/android-x64@0.25.9': optional: true - "@esbuild/darwin-arm64@0.24.2": + '@esbuild/darwin-arm64@0.24.2': optional: true - "@esbuild/darwin-arm64@0.25.10": + '@esbuild/darwin-arm64@0.25.10': optional: true - "@esbuild/darwin-arm64@0.25.5": + '@esbuild/darwin-arm64@0.25.5': optional: true - "@esbuild/darwin-arm64@0.25.6": + '@esbuild/darwin-arm64@0.25.6': optional: true - "@esbuild/darwin-arm64@0.25.9": + '@esbuild/darwin-arm64@0.25.9': optional: true - "@esbuild/darwin-x64@0.24.2": + '@esbuild/darwin-x64@0.24.2': optional: true - "@esbuild/darwin-x64@0.25.10": + '@esbuild/darwin-x64@0.25.10': optional: true - "@esbuild/darwin-x64@0.25.5": + '@esbuild/darwin-x64@0.25.5': optional: true - "@esbuild/darwin-x64@0.25.6": + '@esbuild/darwin-x64@0.25.6': optional: true - "@esbuild/darwin-x64@0.25.9": + '@esbuild/darwin-x64@0.25.9': optional: true - "@esbuild/freebsd-arm64@0.24.2": + '@esbuild/freebsd-arm64@0.24.2': optional: true - "@esbuild/freebsd-arm64@0.25.10": + '@esbuild/freebsd-arm64@0.25.10': optional: true - "@esbuild/freebsd-arm64@0.25.5": + '@esbuild/freebsd-arm64@0.25.5': optional: true - "@esbuild/freebsd-arm64@0.25.6": + '@esbuild/freebsd-arm64@0.25.6': optional: true - "@esbuild/freebsd-arm64@0.25.9": + '@esbuild/freebsd-arm64@0.25.9': optional: true - "@esbuild/freebsd-x64@0.24.2": + '@esbuild/freebsd-x64@0.24.2': optional: true - "@esbuild/freebsd-x64@0.25.10": + '@esbuild/freebsd-x64@0.25.10': optional: true - "@esbuild/freebsd-x64@0.25.5": + '@esbuild/freebsd-x64@0.25.5': optional: true - "@esbuild/freebsd-x64@0.25.6": + '@esbuild/freebsd-x64@0.25.6': optional: true - "@esbuild/freebsd-x64@0.25.9": + '@esbuild/freebsd-x64@0.25.9': optional: true - "@esbuild/linux-arm64@0.24.2": + '@esbuild/linux-arm64@0.24.2': optional: true - "@esbuild/linux-arm64@0.25.10": + '@esbuild/linux-arm64@0.25.10': optional: true - "@esbuild/linux-arm64@0.25.5": + '@esbuild/linux-arm64@0.25.5': optional: true - "@esbuild/linux-arm64@0.25.6": + '@esbuild/linux-arm64@0.25.6': optional: true - "@esbuild/linux-arm64@0.25.9": + '@esbuild/linux-arm64@0.25.9': optional: true - "@esbuild/linux-arm@0.24.2": + '@esbuild/linux-arm@0.24.2': optional: true - "@esbuild/linux-arm@0.25.10": + '@esbuild/linux-arm@0.25.10': optional: true - "@esbuild/linux-arm@0.25.5": + '@esbuild/linux-arm@0.25.5': optional: true - "@esbuild/linux-arm@0.25.6": + '@esbuild/linux-arm@0.25.6': optional: true - "@esbuild/linux-arm@0.25.9": + '@esbuild/linux-arm@0.25.9': optional: true - "@esbuild/linux-ia32@0.24.2": + '@esbuild/linux-ia32@0.24.2': optional: true - "@esbuild/linux-ia32@0.25.10": + '@esbuild/linux-ia32@0.25.10': optional: true - "@esbuild/linux-ia32@0.25.5": + '@esbuild/linux-ia32@0.25.5': optional: true - "@esbuild/linux-ia32@0.25.6": + '@esbuild/linux-ia32@0.25.6': optional: true - "@esbuild/linux-ia32@0.25.9": + '@esbuild/linux-ia32@0.25.9': optional: true - "@esbuild/linux-loong64@0.24.2": + '@esbuild/linux-loong64@0.24.2': optional: true - "@esbuild/linux-loong64@0.25.10": + '@esbuild/linux-loong64@0.25.10': optional: true - "@esbuild/linux-loong64@0.25.5": + '@esbuild/linux-loong64@0.25.5': optional: true - "@esbuild/linux-loong64@0.25.6": + '@esbuild/linux-loong64@0.25.6': optional: true - "@esbuild/linux-loong64@0.25.9": + '@esbuild/linux-loong64@0.25.9': optional: true - "@esbuild/linux-mips64el@0.24.2": + '@esbuild/linux-mips64el@0.24.2': optional: true - "@esbuild/linux-mips64el@0.25.10": + '@esbuild/linux-mips64el@0.25.10': optional: true - "@esbuild/linux-mips64el@0.25.5": + '@esbuild/linux-mips64el@0.25.5': optional: true - "@esbuild/linux-mips64el@0.25.6": + '@esbuild/linux-mips64el@0.25.6': optional: true - "@esbuild/linux-mips64el@0.25.9": + '@esbuild/linux-mips64el@0.25.9': optional: true - "@esbuild/linux-ppc64@0.24.2": + '@esbuild/linux-ppc64@0.24.2': optional: true - "@esbuild/linux-ppc64@0.25.10": + '@esbuild/linux-ppc64@0.25.10': optional: true - "@esbuild/linux-ppc64@0.25.5": + '@esbuild/linux-ppc64@0.25.5': optional: true - "@esbuild/linux-ppc64@0.25.6": + '@esbuild/linux-ppc64@0.25.6': optional: true - "@esbuild/linux-ppc64@0.25.9": + '@esbuild/linux-ppc64@0.25.9': optional: true - "@esbuild/linux-riscv64@0.24.2": + '@esbuild/linux-riscv64@0.24.2': optional: true - "@esbuild/linux-riscv64@0.25.10": + '@esbuild/linux-riscv64@0.25.10': optional: true - "@esbuild/linux-riscv64@0.25.5": + '@esbuild/linux-riscv64@0.25.5': optional: true - "@esbuild/linux-riscv64@0.25.6": + '@esbuild/linux-riscv64@0.25.6': optional: true - "@esbuild/linux-riscv64@0.25.9": + '@esbuild/linux-riscv64@0.25.9': optional: true - "@esbuild/linux-s390x@0.24.2": + '@esbuild/linux-s390x@0.24.2': optional: true - "@esbuild/linux-s390x@0.25.10": + '@esbuild/linux-s390x@0.25.10': optional: true - "@esbuild/linux-s390x@0.25.5": + '@esbuild/linux-s390x@0.25.5': optional: true - "@esbuild/linux-s390x@0.25.6": + '@esbuild/linux-s390x@0.25.6': optional: true - "@esbuild/linux-s390x@0.25.9": + '@esbuild/linux-s390x@0.25.9': optional: true - "@esbuild/linux-x64@0.24.2": + '@esbuild/linux-x64@0.24.2': optional: true - "@esbuild/linux-x64@0.25.10": + '@esbuild/linux-x64@0.25.10': optional: true - "@esbuild/linux-x64@0.25.5": + '@esbuild/linux-x64@0.25.5': optional: true - "@esbuild/linux-x64@0.25.6": + '@esbuild/linux-x64@0.25.6': optional: true - "@esbuild/linux-x64@0.25.9": + '@esbuild/linux-x64@0.25.9': optional: true - "@esbuild/netbsd-arm64@0.24.2": + '@esbuild/netbsd-arm64@0.24.2': optional: true - "@esbuild/netbsd-arm64@0.25.10": + '@esbuild/netbsd-arm64@0.25.10': optional: true - "@esbuild/netbsd-arm64@0.25.5": + '@esbuild/netbsd-arm64@0.25.5': optional: true - "@esbuild/netbsd-arm64@0.25.6": + '@esbuild/netbsd-arm64@0.25.6': optional: true - "@esbuild/netbsd-arm64@0.25.9": + '@esbuild/netbsd-arm64@0.25.9': optional: true - "@esbuild/netbsd-x64@0.24.2": + '@esbuild/netbsd-x64@0.24.2': optional: true - "@esbuild/netbsd-x64@0.25.10": + '@esbuild/netbsd-x64@0.25.10': optional: true - "@esbuild/netbsd-x64@0.25.5": + '@esbuild/netbsd-x64@0.25.5': optional: true - "@esbuild/netbsd-x64@0.25.6": + '@esbuild/netbsd-x64@0.25.6': optional: true - "@esbuild/netbsd-x64@0.25.9": + '@esbuild/netbsd-x64@0.25.9': optional: true - "@esbuild/openbsd-arm64@0.24.2": + '@esbuild/openbsd-arm64@0.24.2': optional: true - "@esbuild/openbsd-arm64@0.25.10": + '@esbuild/openbsd-arm64@0.25.10': optional: true - "@esbuild/openbsd-arm64@0.25.5": + '@esbuild/openbsd-arm64@0.25.5': optional: true - "@esbuild/openbsd-arm64@0.25.6": + '@esbuild/openbsd-arm64@0.25.6': optional: true - "@esbuild/openbsd-arm64@0.25.9": + '@esbuild/openbsd-arm64@0.25.9': optional: true - "@esbuild/openbsd-x64@0.24.2": + '@esbuild/openbsd-x64@0.24.2': optional: true - "@esbuild/openbsd-x64@0.25.10": + '@esbuild/openbsd-x64@0.25.10': optional: true - "@esbuild/openbsd-x64@0.25.5": + '@esbuild/openbsd-x64@0.25.5': optional: true - "@esbuild/openbsd-x64@0.25.6": + '@esbuild/openbsd-x64@0.25.6': optional: true - "@esbuild/openbsd-x64@0.25.9": + '@esbuild/openbsd-x64@0.25.9': optional: true - "@esbuild/openharmony-arm64@0.25.10": + '@esbuild/openharmony-arm64@0.25.10': optional: true - "@esbuild/openharmony-arm64@0.25.6": + '@esbuild/openharmony-arm64@0.25.6': optional: true - "@esbuild/openharmony-arm64@0.25.9": + '@esbuild/openharmony-arm64@0.25.9': optional: true - "@esbuild/sunos-x64@0.24.2": + '@esbuild/sunos-x64@0.24.2': optional: true - "@esbuild/sunos-x64@0.25.10": + '@esbuild/sunos-x64@0.25.10': optional: true - "@esbuild/sunos-x64@0.25.5": + '@esbuild/sunos-x64@0.25.5': optional: true - "@esbuild/sunos-x64@0.25.6": + '@esbuild/sunos-x64@0.25.6': optional: true - "@esbuild/sunos-x64@0.25.9": + '@esbuild/sunos-x64@0.25.9': optional: true - "@esbuild/win32-arm64@0.24.2": + '@esbuild/win32-arm64@0.24.2': optional: true - "@esbuild/win32-arm64@0.25.10": + '@esbuild/win32-arm64@0.25.10': optional: true - "@esbuild/win32-arm64@0.25.5": + '@esbuild/win32-arm64@0.25.5': optional: true - "@esbuild/win32-arm64@0.25.6": + '@esbuild/win32-arm64@0.25.6': optional: true - "@esbuild/win32-arm64@0.25.9": + '@esbuild/win32-arm64@0.25.9': optional: true - "@esbuild/win32-ia32@0.24.2": + '@esbuild/win32-ia32@0.24.2': optional: true - "@esbuild/win32-ia32@0.25.10": + '@esbuild/win32-ia32@0.25.10': optional: true - "@esbuild/win32-ia32@0.25.5": + '@esbuild/win32-ia32@0.25.5': optional: true - "@esbuild/win32-ia32@0.25.6": + '@esbuild/win32-ia32@0.25.6': optional: true - "@esbuild/win32-ia32@0.25.9": + '@esbuild/win32-ia32@0.25.9': optional: true - "@esbuild/win32-x64@0.24.2": + '@esbuild/win32-x64@0.24.2': optional: true - "@esbuild/win32-x64@0.25.10": + '@esbuild/win32-x64@0.25.10': optional: true - "@esbuild/win32-x64@0.25.5": + '@esbuild/win32-x64@0.25.5': optional: true - "@esbuild/win32-x64@0.25.6": + '@esbuild/win32-x64@0.25.6': optional: true - "@esbuild/win32-x64@0.25.9": + '@esbuild/win32-x64@0.25.9': optional: true - "@expressive-code/core@0.41.2": + '@expressive-code/core@0.41.2': dependencies: - "@ctrl/tinycolor": 4.1.0 + '@ctrl/tinycolor': 4.1.0 hast-util-select: 6.0.4 hast-util-to-html: 9.0.5 hast-util-to-text: 4.0.2 @@ -11787,165 +7682,165 @@ snapshots: unist-util-visit: 5.0.0 unist-util-visit-parents: 6.0.1 - "@expressive-code/plugin-frames@0.41.2": + '@expressive-code/plugin-frames@0.41.2': dependencies: - "@expressive-code/core": 0.41.2 + '@expressive-code/core': 0.41.2 - "@expressive-code/plugin-shiki@0.41.2": + '@expressive-code/plugin-shiki@0.41.2': dependencies: - "@expressive-code/core": 0.41.2 + '@expressive-code/core': 0.41.2 shiki: 3.12.2 - "@expressive-code/plugin-text-markers@0.41.2": + '@expressive-code/plugin-text-markers@0.41.2': dependencies: - "@expressive-code/core": 0.41.2 + '@expressive-code/core': 0.41.2 - "@floating-ui/core@1.7.1": + '@floating-ui/core@1.7.1': dependencies: - "@floating-ui/utils": 0.2.9 + '@floating-ui/utils': 0.2.9 - "@floating-ui/dom@1.7.1": + '@floating-ui/dom@1.7.1': dependencies: - "@floating-ui/core": 1.7.1 - "@floating-ui/utils": 0.2.9 + '@floating-ui/core': 1.7.1 + '@floating-ui/utils': 0.2.9 - "@floating-ui/react-dom@2.1.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0)": + '@floating-ui/react-dom@2.1.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - "@floating-ui/dom": 1.7.1 + '@floating-ui/dom': 1.7.1 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) - "@floating-ui/utils@0.2.9": {} + '@floating-ui/utils@0.2.9': {} - "@gerrit0/mini-shiki@3.13.0": + '@gerrit0/mini-shiki@3.13.0': dependencies: - "@shikijs/engine-oniguruma": 3.13.0 - "@shikijs/langs": 3.13.0 - "@shikijs/themes": 3.13.0 - "@shikijs/types": 3.13.0 - "@shikijs/vscode-textmate": 10.0.2 + '@shikijs/engine-oniguruma': 3.13.0 + '@shikijs/langs': 3.13.0 + '@shikijs/themes': 3.13.0 + '@shikijs/types': 3.13.0 + '@shikijs/vscode-textmate': 10.0.2 - "@img/sharp-darwin-arm64@0.34.2": + '@img/sharp-darwin-arm64@0.34.2': optionalDependencies: - "@img/sharp-libvips-darwin-arm64": 1.1.0 + '@img/sharp-libvips-darwin-arm64': 1.1.0 optional: true - "@img/sharp-darwin-x64@0.34.2": + '@img/sharp-darwin-x64@0.34.2': optionalDependencies: - "@img/sharp-libvips-darwin-x64": 1.1.0 + '@img/sharp-libvips-darwin-x64': 1.1.0 optional: true - "@img/sharp-libvips-darwin-arm64@1.1.0": + '@img/sharp-libvips-darwin-arm64@1.1.0': optional: true - "@img/sharp-libvips-darwin-x64@1.1.0": + '@img/sharp-libvips-darwin-x64@1.1.0': optional: true - "@img/sharp-libvips-linux-arm64@1.1.0": + '@img/sharp-libvips-linux-arm64@1.1.0': optional: true - "@img/sharp-libvips-linux-arm@1.1.0": + '@img/sharp-libvips-linux-arm@1.1.0': optional: true - "@img/sharp-libvips-linux-ppc64@1.1.0": + '@img/sharp-libvips-linux-ppc64@1.1.0': optional: true - "@img/sharp-libvips-linux-s390x@1.1.0": + '@img/sharp-libvips-linux-s390x@1.1.0': optional: true - "@img/sharp-libvips-linux-x64@1.1.0": + '@img/sharp-libvips-linux-x64@1.1.0': optional: true - "@img/sharp-libvips-linuxmusl-arm64@1.1.0": + '@img/sharp-libvips-linuxmusl-arm64@1.1.0': optional: true - "@img/sharp-libvips-linuxmusl-x64@1.1.0": + '@img/sharp-libvips-linuxmusl-x64@1.1.0': optional: true - "@img/sharp-linux-arm64@0.34.2": + '@img/sharp-linux-arm64@0.34.2': optionalDependencies: - "@img/sharp-libvips-linux-arm64": 1.1.0 + '@img/sharp-libvips-linux-arm64': 1.1.0 optional: true - "@img/sharp-linux-arm@0.34.2": + '@img/sharp-linux-arm@0.34.2': optionalDependencies: - "@img/sharp-libvips-linux-arm": 1.1.0 + '@img/sharp-libvips-linux-arm': 1.1.0 optional: true - "@img/sharp-linux-s390x@0.34.2": + '@img/sharp-linux-s390x@0.34.2': optionalDependencies: - "@img/sharp-libvips-linux-s390x": 1.1.0 + '@img/sharp-libvips-linux-s390x': 1.1.0 optional: true - "@img/sharp-linux-x64@0.34.2": + '@img/sharp-linux-x64@0.34.2': optionalDependencies: - "@img/sharp-libvips-linux-x64": 1.1.0 + '@img/sharp-libvips-linux-x64': 1.1.0 optional: true - "@img/sharp-linuxmusl-arm64@0.34.2": + '@img/sharp-linuxmusl-arm64@0.34.2': optionalDependencies: - "@img/sharp-libvips-linuxmusl-arm64": 1.1.0 + '@img/sharp-libvips-linuxmusl-arm64': 1.1.0 optional: true - "@img/sharp-linuxmusl-x64@0.34.2": + '@img/sharp-linuxmusl-x64@0.34.2': optionalDependencies: - "@img/sharp-libvips-linuxmusl-x64": 1.1.0 + '@img/sharp-libvips-linuxmusl-x64': 1.1.0 optional: true - "@img/sharp-wasm32@0.34.2": + '@img/sharp-wasm32@0.34.2': dependencies: - "@emnapi/runtime": 1.4.3 + '@emnapi/runtime': 1.4.3 optional: true - "@img/sharp-win32-arm64@0.34.2": + '@img/sharp-win32-arm64@0.34.2': optional: true - "@img/sharp-win32-ia32@0.34.2": + '@img/sharp-win32-ia32@0.34.2': optional: true - "@img/sharp-win32-x64@0.34.2": + '@img/sharp-win32-x64@0.34.2': optional: true - "@inquirer/ansi@1.0.0": + '@inquirer/ansi@1.0.0': optional: true - "@inquirer/confirm@5.1.18(@types/node@24.5.2)": + '@inquirer/confirm@5.1.18(@types/node@24.5.2)': dependencies: - "@inquirer/core": 10.2.2(@types/node@24.5.2) - "@inquirer/type": 3.0.8(@types/node@24.5.2) + '@inquirer/core': 10.2.2(@types/node@24.5.2) + '@inquirer/type': 3.0.8(@types/node@24.5.2) optionalDependencies: - "@types/node": 24.5.2 + '@types/node': 24.5.2 optional: true - "@inquirer/core@10.2.2(@types/node@24.5.2)": + '@inquirer/core@10.2.2(@types/node@24.5.2)': dependencies: - "@inquirer/ansi": 1.0.0 - "@inquirer/figures": 1.0.13 - "@inquirer/type": 3.0.8(@types/node@24.5.2) + '@inquirer/ansi': 1.0.0 + '@inquirer/figures': 1.0.13 + '@inquirer/type': 3.0.8(@types/node@24.5.2) cli-width: 4.1.0 mute-stream: 2.0.0 signal-exit: 4.1.0 wrap-ansi: 6.2.0 yoctocolors-cjs: 2.1.3 optionalDependencies: - "@types/node": 24.5.2 + '@types/node': 24.5.2 optional: true - "@inquirer/figures@1.0.13": + '@inquirer/figures@1.0.13': optional: true - "@inquirer/type@3.0.8(@types/node@24.5.2)": + '@inquirer/type@3.0.8(@types/node@24.5.2)': optionalDependencies: - "@types/node": 24.5.2 + '@types/node': 24.5.2 optional: true - "@isaacs/balanced-match@4.0.1": {} + '@isaacs/balanced-match@4.0.1': {} - "@isaacs/brace-expansion@5.0.0": + '@isaacs/brace-expansion@5.0.0': dependencies: - "@isaacs/balanced-match": 4.0.1 + '@isaacs/balanced-match': 4.0.1 - "@isaacs/cliui@8.0.2": + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 string-width-cjs: string-width@4.2.3 @@ -11954,101 +7849,101 @@ snapshots: wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 - "@isaacs/fs-minipass@4.0.1": + '@isaacs/fs-minipass@4.0.1': dependencies: minipass: 7.1.2 - "@istanbuljs/schema@0.1.3": {} + '@istanbuljs/schema@0.1.3': {} - "@jridgewell/gen-mapping@0.3.11": + '@jridgewell/gen-mapping@0.3.11': dependencies: - "@jridgewell/sourcemap-codec": 1.5.5 - "@jridgewell/trace-mapping": 0.3.28 + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.28 - "@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/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 - "@jridgewell/gen-mapping@0.3.8": + '@jridgewell/gen-mapping@0.3.8': dependencies: - "@jridgewell/set-array": 1.2.1 - "@jridgewell/sourcemap-codec": 1.5.5 - "@jridgewell/trace-mapping": 0.3.25 + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.25 - "@jridgewell/remapping@2.3.5": + '@jridgewell/remapping@2.3.5': dependencies: - "@jridgewell/gen-mapping": 0.3.13 - "@jridgewell/trace-mapping": 0.3.31 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 - "@jridgewell/resolve-uri@3.1.2": {} + '@jridgewell/resolve-uri@3.1.2': {} - "@jridgewell/set-array@1.2.1": {} + '@jridgewell/set-array@1.2.1': {} - "@jridgewell/sourcemap-codec@1.5.0": {} + '@jridgewell/sourcemap-codec@1.5.0': {} - "@jridgewell/sourcemap-codec@1.5.4": {} + '@jridgewell/sourcemap-codec@1.5.4': {} - "@jridgewell/sourcemap-codec@1.5.5": {} + '@jridgewell/sourcemap-codec@1.5.5': {} - "@jridgewell/trace-mapping@0.3.25": + '@jridgewell/trace-mapping@0.3.25': dependencies: - "@jridgewell/resolve-uri": 3.1.2 - "@jridgewell/sourcemap-codec": 1.5.5 + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 - "@jridgewell/trace-mapping@0.3.28": + '@jridgewell/trace-mapping@0.3.28': dependencies: - "@jridgewell/resolve-uri": 3.1.2 - "@jridgewell/sourcemap-codec": 1.5.5 + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 - "@jridgewell/trace-mapping@0.3.31": + '@jridgewell/trace-mapping@0.3.31': dependencies: - "@jridgewell/resolve-uri": 3.1.2 - "@jridgewell/sourcemap-codec": 1.5.5 + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 - "@jsdevtools/ez-spawn@3.0.4": + '@jsdevtools/ez-spawn@3.0.4': dependencies: call-me-maybe: 1.0.2 cross-spawn: 7.0.6 string-argv: 0.3.2 type-detect: 4.1.0 - "@loaders.gl/core@4.3.4": + '@loaders.gl/core@4.3.4': dependencies: - "@loaders.gl/loader-utils": 4.3.4(@loaders.gl/core@4.3.4) - "@loaders.gl/schema": 4.3.4(@loaders.gl/core@4.3.4) - "@loaders.gl/worker-utils": 4.3.4(@loaders.gl/core@4.3.4) - "@probe.gl/log": 4.1.0 + '@loaders.gl/loader-utils': 4.3.4(@loaders.gl/core@4.3.4) + '@loaders.gl/schema': 4.3.4(@loaders.gl/core@4.3.4) + '@loaders.gl/worker-utils': 4.3.4(@loaders.gl/core@4.3.4) + '@probe.gl/log': 4.1.0 - "@loaders.gl/loader-utils@4.3.4(@loaders.gl/core@4.3.4)": + '@loaders.gl/loader-utils@4.3.4(@loaders.gl/core@4.3.4)': dependencies: - "@loaders.gl/core": 4.3.4 - "@loaders.gl/schema": 4.3.4(@loaders.gl/core@4.3.4) - "@loaders.gl/worker-utils": 4.3.4(@loaders.gl/core@4.3.4) - "@probe.gl/log": 4.1.0 - "@probe.gl/stats": 4.1.0 + '@loaders.gl/core': 4.3.4 + '@loaders.gl/schema': 4.3.4(@loaders.gl/core@4.3.4) + '@loaders.gl/worker-utils': 4.3.4(@loaders.gl/core@4.3.4) + '@probe.gl/log': 4.1.0 + '@probe.gl/stats': 4.1.0 - "@loaders.gl/obj@4.3.4(@loaders.gl/core@4.3.4)": + '@loaders.gl/obj@4.3.4(@loaders.gl/core@4.3.4)': dependencies: - "@loaders.gl/core": 4.3.4 - "@loaders.gl/loader-utils": 4.3.4(@loaders.gl/core@4.3.4) - "@loaders.gl/schema": 4.3.4(@loaders.gl/core@4.3.4) + '@loaders.gl/core': 4.3.4 + '@loaders.gl/loader-utils': 4.3.4(@loaders.gl/core@4.3.4) + '@loaders.gl/schema': 4.3.4(@loaders.gl/core@4.3.4) - "@loaders.gl/schema@4.3.4(@loaders.gl/core@4.3.4)": + '@loaders.gl/schema@4.3.4(@loaders.gl/core@4.3.4)': dependencies: - "@loaders.gl/core": 4.3.4 - "@types/geojson": 7946.0.16 + '@loaders.gl/core': 4.3.4 + '@types/geojson': 7946.0.16 - "@loaders.gl/worker-utils@4.3.4(@loaders.gl/core@4.3.4)": + '@loaders.gl/worker-utils@4.3.4(@loaders.gl/core@4.3.4)': dependencies: - "@loaders.gl/core": 4.3.4 + '@loaders.gl/core': 4.3.4 - "@mdx-js/mdx@3.1.0(acorn@8.15.0)": + '@mdx-js/mdx@3.1.0(acorn@8.15.0)': dependencies: - "@types/estree": 1.0.8 - "@types/estree-jsx": 1.0.5 - "@types/hast": 3.0.4 - "@types/mdx": 2.0.13 + '@types/estree': 1.0.8 + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdx': 2.0.13 collapse-white-space: 2.1.0 devlop: 1.1.0 estree-util-is-identifier-name: 3.0.0 @@ -12073,412 +7968,412 @@ snapshots: - acorn - supports-color - "@monaco-editor/loader@1.5.0": + '@monaco-editor/loader@1.5.0': dependencies: state-local: 1.0.7 - "@monaco-editor/react@4.7.0(monaco-editor@0.53.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)": + '@monaco-editor/react@4.7.0(monaco-editor@0.53.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - "@monaco-editor/loader": 1.5.0 + '@monaco-editor/loader': 1.5.0 monaco-editor: 0.53.0 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) - "@mswjs/interceptors@0.39.6": + '@mswjs/interceptors@0.39.6': dependencies: - "@open-draft/deferred-promise": 2.2.0 - "@open-draft/logger": 0.3.0 - "@open-draft/until": 2.1.0 + '@open-draft/deferred-promise': 2.2.0 + '@open-draft/logger': 0.3.0 + '@open-draft/until': 2.1.0 is-node-process: 1.2.0 outvariant: 1.4.3 strict-event-emitter: 0.5.1 optional: true - "@nodelib/fs.scandir@2.1.5": + '@nodelib/fs.scandir@2.1.5': dependencies: - "@nodelib/fs.stat": 2.0.5 + '@nodelib/fs.stat': 2.0.5 run-parallel: 1.2.0 - "@nodelib/fs.stat@2.0.5": {} + '@nodelib/fs.stat@2.0.5': {} - "@nodelib/fs.walk@1.2.8": + '@nodelib/fs.walk@1.2.8': dependencies: - "@nodelib/fs.scandir": 2.1.5 + '@nodelib/fs.scandir': 2.1.5 fastq: 1.19.0 - "@observablehq/plot@0.6.17": + '@observablehq/plot@0.6.17': dependencies: d3: 7.9.0 interval-tree-1d: 1.0.4 isoformat: 0.2.1 - "@octokit/action@6.1.0": + '@octokit/action@6.1.0': dependencies: - "@octokit/auth-action": 4.1.0 - "@octokit/core": 5.2.1 - "@octokit/plugin-paginate-rest": 9.2.2(@octokit/core@5.2.1) - "@octokit/plugin-rest-endpoint-methods": 10.4.1(@octokit/core@5.2.1) - "@octokit/types": 12.6.0 + '@octokit/auth-action': 4.1.0 + '@octokit/core': 5.2.1 + '@octokit/plugin-paginate-rest': 9.2.2(@octokit/core@5.2.1) + '@octokit/plugin-rest-endpoint-methods': 10.4.1(@octokit/core@5.2.1) + '@octokit/types': 12.6.0 undici: 6.21.2 - "@octokit/auth-action@4.1.0": + '@octokit/auth-action@4.1.0': dependencies: - "@octokit/auth-token": 4.0.0 - "@octokit/types": 13.10.0 + '@octokit/auth-token': 4.0.0 + '@octokit/types': 13.10.0 - "@octokit/auth-token@4.0.0": {} + '@octokit/auth-token@4.0.0': {} - "@octokit/core@5.2.1": + '@octokit/core@5.2.1': dependencies: - "@octokit/auth-token": 4.0.0 - "@octokit/graphql": 7.1.1 - "@octokit/request": 8.4.1 - "@octokit/request-error": 5.1.1 - "@octokit/types": 13.10.0 + '@octokit/auth-token': 4.0.0 + '@octokit/graphql': 7.1.1 + '@octokit/request': 8.4.1 + '@octokit/request-error': 5.1.1 + '@octokit/types': 13.10.0 before-after-hook: 2.2.3 universal-user-agent: 6.0.1 - "@octokit/endpoint@9.0.6": + '@octokit/endpoint@9.0.6': dependencies: - "@octokit/types": 13.10.0 + '@octokit/types': 13.10.0 universal-user-agent: 6.0.1 - "@octokit/graphql@7.1.1": + '@octokit/graphql@7.1.1': dependencies: - "@octokit/request": 8.4.1 - "@octokit/types": 13.10.0 + '@octokit/request': 8.4.1 + '@octokit/types': 13.10.0 universal-user-agent: 6.0.1 - "@octokit/openapi-types@20.0.0": {} + '@octokit/openapi-types@20.0.0': {} - "@octokit/openapi-types@24.2.0": {} + '@octokit/openapi-types@24.2.0': {} - "@octokit/plugin-paginate-rest@9.2.2(@octokit/core@5.2.1)": + '@octokit/plugin-paginate-rest@9.2.2(@octokit/core@5.2.1)': dependencies: - "@octokit/core": 5.2.1 - "@octokit/types": 12.6.0 + '@octokit/core': 5.2.1 + '@octokit/types': 12.6.0 - "@octokit/plugin-rest-endpoint-methods@10.4.1(@octokit/core@5.2.1)": + '@octokit/plugin-rest-endpoint-methods@10.4.1(@octokit/core@5.2.1)': dependencies: - "@octokit/core": 5.2.1 - "@octokit/types": 12.6.0 + '@octokit/core': 5.2.1 + '@octokit/types': 12.6.0 - "@octokit/request-error@5.1.1": + '@octokit/request-error@5.1.1': dependencies: - "@octokit/types": 13.10.0 + '@octokit/types': 13.10.0 deprecation: 2.3.1 once: 1.4.0 - "@octokit/request@8.4.1": + '@octokit/request@8.4.1': dependencies: - "@octokit/endpoint": 9.0.6 - "@octokit/request-error": 5.1.1 - "@octokit/types": 13.10.0 + '@octokit/endpoint': 9.0.6 + '@octokit/request-error': 5.1.1 + '@octokit/types': 13.10.0 universal-user-agent: 6.0.1 - "@octokit/types@12.6.0": + '@octokit/types@12.6.0': dependencies: - "@octokit/openapi-types": 20.0.0 + '@octokit/openapi-types': 20.0.0 - "@octokit/types@13.10.0": + '@octokit/types@13.10.0': dependencies: - "@octokit/openapi-types": 24.2.0 + '@octokit/openapi-types': 24.2.0 - "@open-draft/deferred-promise@2.2.0": + '@open-draft/deferred-promise@2.2.0': optional: true - "@open-draft/logger@0.3.0": + '@open-draft/logger@0.3.0': dependencies: is-node-process: 1.2.0 outvariant: 1.4.3 optional: true - "@open-draft/until@2.1.0": + '@open-draft/until@2.1.0': optional: true - "@oslojs/encoding@1.1.0": {} + '@oslojs/encoding@1.1.0': {} - "@pagefind/darwin-arm64@1.3.0": + '@pagefind/darwin-arm64@1.3.0': optional: true - "@pagefind/darwin-x64@1.3.0": + '@pagefind/darwin-x64@1.3.0': optional: true - "@pagefind/default-ui@1.3.0": {} + '@pagefind/default-ui@1.3.0': {} - "@pagefind/linux-arm64@1.3.0": + '@pagefind/linux-arm64@1.3.0': optional: true - "@pagefind/linux-x64@1.3.0": + '@pagefind/linux-x64@1.3.0': optional: true - "@pagefind/windows-x64@1.3.0": + '@pagefind/windows-x64@1.3.0': optional: true - "@pkgjs/parseargs@0.11.0": + '@pkgjs/parseargs@0.11.0': optional: true - "@polka/url@1.0.0-next.29": {} + '@polka/url@1.0.0-next.29': {} - "@prettier/sync@0.5.5(prettier@3.5.3)": + '@prettier/sync@0.5.5(prettier@3.5.3)': dependencies: make-synchronized: 0.4.2 prettier: 3.5.3 - "@probe.gl/env@4.1.0": {} + '@probe.gl/env@4.1.0': {} - "@probe.gl/log@4.1.0": + '@probe.gl/log@4.1.0': dependencies: - "@probe.gl/env": 4.1.0 + '@probe.gl/env': 4.1.0 - "@probe.gl/stats@4.1.0": {} + '@probe.gl/stats@4.1.0': {} - "@radix-ui/number@1.1.1": {} + '@radix-ui/number@1.1.1': {} - "@radix-ui/primitive@1.1.2": {} + '@radix-ui/primitive@1.1.2': {} - "@radix-ui/react-arrow@1.1.7(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)": + '@radix-ui/react-arrow@1.1.7(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - "@radix-ui/react-primitive": 2.1.3(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) optionalDependencies: - "@types/react": 19.1.8 - "@types/react-dom": 19.1.6(@types/react@19.1.8) + '@types/react': 19.1.8 + '@types/react-dom': 19.1.6(@types/react@19.1.8) - "@radix-ui/react-collection@1.1.7(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)": + '@radix-ui/react-collection@1.1.7(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - "@radix-ui/react-compose-refs": 1.1.2(@types/react@19.1.8)(react@19.1.0) - "@radix-ui/react-context": 1.1.2(@types/react@19.1.8)(react@19.1.0) - "@radix-ui/react-primitive": 2.1.3(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - "@radix-ui/react-slot": 1.2.3(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-slot': 1.2.3(@types/react@19.1.8)(react@19.1.0) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) optionalDependencies: - "@types/react": 19.1.8 - "@types/react-dom": 19.1.6(@types/react@19.1.8) + '@types/react': 19.1.8 + '@types/react-dom': 19.1.6(@types/react@19.1.8) - "@radix-ui/react-compose-refs@1.1.2(@types/react@19.1.8)(react@19.1.0)": + '@radix-ui/react-compose-refs@1.1.2(@types/react@19.1.8)(react@19.1.0)': dependencies: react: 19.1.0 optionalDependencies: - "@types/react": 19.1.8 + '@types/react': 19.1.8 - "@radix-ui/react-context@1.1.2(@types/react@19.1.8)(react@19.1.0)": + '@radix-ui/react-context@1.1.2(@types/react@19.1.8)(react@19.1.0)': dependencies: react: 19.1.0 optionalDependencies: - "@types/react": 19.1.8 + '@types/react': 19.1.8 - "@radix-ui/react-direction@1.1.1(@types/react@19.1.8)(react@19.1.0)": + '@radix-ui/react-direction@1.1.1(@types/react@19.1.8)(react@19.1.0)': dependencies: react: 19.1.0 optionalDependencies: - "@types/react": 19.1.8 + '@types/react': 19.1.8 - "@radix-ui/react-dismissable-layer@1.1.10(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)": + '@radix-ui/react-dismissable-layer@1.1.10(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - "@radix-ui/primitive": 1.1.2 - "@radix-ui/react-compose-refs": 1.1.2(@types/react@19.1.8)(react@19.1.0) - "@radix-ui/react-primitive": 2.1.3(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - "@radix-ui/react-use-callback-ref": 1.1.1(@types/react@19.1.8)(react@19.1.0) - "@radix-ui/react-use-escape-keydown": 1.1.1(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.1.8)(react@19.1.0) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) optionalDependencies: - "@types/react": 19.1.8 - "@types/react-dom": 19.1.6(@types/react@19.1.8) + '@types/react': 19.1.8 + '@types/react-dom': 19.1.6(@types/react@19.1.8) - "@radix-ui/react-focus-guards@1.1.2(@types/react@19.1.8)(react@19.1.0)": + '@radix-ui/react-focus-guards@1.1.2(@types/react@19.1.8)(react@19.1.0)': dependencies: react: 19.1.0 optionalDependencies: - "@types/react": 19.1.8 + '@types/react': 19.1.8 - "@radix-ui/react-focus-scope@1.1.7(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)": + '@radix-ui/react-focus-scope@1.1.7(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - "@radix-ui/react-compose-refs": 1.1.2(@types/react@19.1.8)(react@19.1.0) - "@radix-ui/react-primitive": 2.1.3(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - "@radix-ui/react-use-callback-ref": 1.1.1(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.8)(react@19.1.0) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) optionalDependencies: - "@types/react": 19.1.8 - "@types/react-dom": 19.1.6(@types/react@19.1.8) + '@types/react': 19.1.8 + '@types/react-dom': 19.1.6(@types/react@19.1.8) - "@radix-ui/react-id@1.1.1(@types/react@19.1.8)(react@19.1.0)": + '@radix-ui/react-id@1.1.1(@types/react@19.1.8)(react@19.1.0)': dependencies: - "@radix-ui/react-use-layout-effect": 1.1.1(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.8)(react@19.1.0) react: 19.1.0 optionalDependencies: - "@types/react": 19.1.8 - - "@radix-ui/react-popper@1.2.7(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)": - dependencies: - "@floating-ui/react-dom": 2.1.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - "@radix-ui/react-arrow": 1.1.7(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - "@radix-ui/react-compose-refs": 1.1.2(@types/react@19.1.8)(react@19.1.0) - "@radix-ui/react-context": 1.1.2(@types/react@19.1.8)(react@19.1.0) - "@radix-ui/react-primitive": 2.1.3(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - "@radix-ui/react-use-callback-ref": 1.1.1(@types/react@19.1.8)(react@19.1.0) - "@radix-ui/react-use-layout-effect": 1.1.1(@types/react@19.1.8)(react@19.1.0) - "@radix-ui/react-use-rect": 1.1.1(@types/react@19.1.8)(react@19.1.0) - "@radix-ui/react-use-size": 1.1.1(@types/react@19.1.8)(react@19.1.0) - "@radix-ui/rect": 1.1.1 + '@types/react': 19.1.8 + + '@radix-ui/react-popper@1.2.7(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@floating-ui/react-dom': 2.1.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-arrow': 1.1.7(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-use-rect': 1.1.1(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/rect': 1.1.1 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) optionalDependencies: - "@types/react": 19.1.8 - "@types/react-dom": 19.1.6(@types/react@19.1.8) + '@types/react': 19.1.8 + '@types/react-dom': 19.1.6(@types/react@19.1.8) - "@radix-ui/react-portal@1.1.9(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)": + '@radix-ui/react-portal@1.1.9(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - "@radix-ui/react-primitive": 2.1.3(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - "@radix-ui/react-use-layout-effect": 1.1.1(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.8)(react@19.1.0) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) optionalDependencies: - "@types/react": 19.1.8 - "@types/react-dom": 19.1.6(@types/react@19.1.8) + '@types/react': 19.1.8 + '@types/react-dom': 19.1.6(@types/react@19.1.8) - "@radix-ui/react-primitive@2.1.3(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)": + '@radix-ui/react-primitive@2.1.3(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - "@radix-ui/react-slot": 1.2.3(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-slot': 1.2.3(@types/react@19.1.8)(react@19.1.0) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) optionalDependencies: - "@types/react": 19.1.8 - "@types/react-dom": 19.1.6(@types/react@19.1.8) - - "@radix-ui/react-select@2.2.5(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)": - dependencies: - "@radix-ui/number": 1.1.1 - "@radix-ui/primitive": 1.1.2 - "@radix-ui/react-collection": 1.1.7(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - "@radix-ui/react-compose-refs": 1.1.2(@types/react@19.1.8)(react@19.1.0) - "@radix-ui/react-context": 1.1.2(@types/react@19.1.8)(react@19.1.0) - "@radix-ui/react-direction": 1.1.1(@types/react@19.1.8)(react@19.1.0) - "@radix-ui/react-dismissable-layer": 1.1.10(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - "@radix-ui/react-focus-guards": 1.1.2(@types/react@19.1.8)(react@19.1.0) - "@radix-ui/react-focus-scope": 1.1.7(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - "@radix-ui/react-id": 1.1.1(@types/react@19.1.8)(react@19.1.0) - "@radix-ui/react-popper": 1.2.7(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - "@radix-ui/react-portal": 1.1.9(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - "@radix-ui/react-primitive": 2.1.3(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - "@radix-ui/react-slot": 1.2.3(@types/react@19.1.8)(react@19.1.0) - "@radix-ui/react-use-callback-ref": 1.1.1(@types/react@19.1.8)(react@19.1.0) - "@radix-ui/react-use-controllable-state": 1.2.2(@types/react@19.1.8)(react@19.1.0) - "@radix-ui/react-use-layout-effect": 1.1.1(@types/react@19.1.8)(react@19.1.0) - "@radix-ui/react-use-previous": 1.1.1(@types/react@19.1.8)(react@19.1.0) - "@radix-ui/react-visually-hidden": 1.2.3(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@types/react': 19.1.8 + '@types/react-dom': 19.1.6(@types/react@19.1.8) + + '@radix-ui/react-select@2.2.5(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/number': 1.1.1 + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-dismissable-layer': 1.1.10(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-focus-guards': 1.1.2(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-popper': 1.2.7(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-slot': 1.2.3(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) aria-hidden: 1.2.6 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) react-remove-scroll: 2.7.1(@types/react@19.1.8)(react@19.1.0) optionalDependencies: - "@types/react": 19.1.8 - "@types/react-dom": 19.1.6(@types/react@19.1.8) - - "@radix-ui/react-slider@1.3.5(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)": - dependencies: - "@radix-ui/number": 1.1.1 - "@radix-ui/primitive": 1.1.2 - "@radix-ui/react-collection": 1.1.7(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - "@radix-ui/react-compose-refs": 1.1.2(@types/react@19.1.8)(react@19.1.0) - "@radix-ui/react-context": 1.1.2(@types/react@19.1.8)(react@19.1.0) - "@radix-ui/react-direction": 1.1.1(@types/react@19.1.8)(react@19.1.0) - "@radix-ui/react-primitive": 2.1.3(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - "@radix-ui/react-use-controllable-state": 1.2.2(@types/react@19.1.8)(react@19.1.0) - "@radix-ui/react-use-layout-effect": 1.1.1(@types/react@19.1.8)(react@19.1.0) - "@radix-ui/react-use-previous": 1.1.1(@types/react@19.1.8)(react@19.1.0) - "@radix-ui/react-use-size": 1.1.1(@types/react@19.1.8)(react@19.1.0) + '@types/react': 19.1.8 + '@types/react-dom': 19.1.6(@types/react@19.1.8) + + '@radix-ui/react-slider@1.3.5(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/number': 1.1.1 + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.1.8)(react@19.1.0) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) optionalDependencies: - "@types/react": 19.1.8 - "@types/react-dom": 19.1.6(@types/react@19.1.8) + '@types/react': 19.1.8 + '@types/react-dom': 19.1.6(@types/react@19.1.8) - "@radix-ui/react-slot@1.2.3(@types/react@19.1.8)(react@19.1.0)": + '@radix-ui/react-slot@1.2.3(@types/react@19.1.8)(react@19.1.0)': dependencies: - "@radix-ui/react-compose-refs": 1.1.2(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.8)(react@19.1.0) react: 19.1.0 optionalDependencies: - "@types/react": 19.1.8 + '@types/react': 19.1.8 - "@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.1.8)(react@19.1.0)": + '@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.1.8)(react@19.1.0)': dependencies: react: 19.1.0 optionalDependencies: - "@types/react": 19.1.8 + '@types/react': 19.1.8 - "@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.1.8)(react@19.1.0)": + '@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.1.8)(react@19.1.0)': dependencies: - "@radix-ui/react-use-effect-event": 0.0.2(@types/react@19.1.8)(react@19.1.0) - "@radix-ui/react-use-layout-effect": 1.1.1(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.8)(react@19.1.0) react: 19.1.0 optionalDependencies: - "@types/react": 19.1.8 + '@types/react': 19.1.8 - "@radix-ui/react-use-effect-event@0.0.2(@types/react@19.1.8)(react@19.1.0)": + '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.1.8)(react@19.1.0)': dependencies: - "@radix-ui/react-use-layout-effect": 1.1.1(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.8)(react@19.1.0) react: 19.1.0 optionalDependencies: - "@types/react": 19.1.8 + '@types/react': 19.1.8 - "@radix-ui/react-use-escape-keydown@1.1.1(@types/react@19.1.8)(react@19.1.0)": + '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@19.1.8)(react@19.1.0)': dependencies: - "@radix-ui/react-use-callback-ref": 1.1.1(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.8)(react@19.1.0) react: 19.1.0 optionalDependencies: - "@types/react": 19.1.8 + '@types/react': 19.1.8 - "@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.1.8)(react@19.1.0)": + '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.1.8)(react@19.1.0)': dependencies: react: 19.1.0 optionalDependencies: - "@types/react": 19.1.8 + '@types/react': 19.1.8 - "@radix-ui/react-use-previous@1.1.1(@types/react@19.1.8)(react@19.1.0)": + '@radix-ui/react-use-previous@1.1.1(@types/react@19.1.8)(react@19.1.0)': dependencies: react: 19.1.0 optionalDependencies: - "@types/react": 19.1.8 + '@types/react': 19.1.8 - "@radix-ui/react-use-rect@1.1.1(@types/react@19.1.8)(react@19.1.0)": + '@radix-ui/react-use-rect@1.1.1(@types/react@19.1.8)(react@19.1.0)': dependencies: - "@radix-ui/rect": 1.1.1 + '@radix-ui/rect': 1.1.1 react: 19.1.0 optionalDependencies: - "@types/react": 19.1.8 + '@types/react': 19.1.8 - "@radix-ui/react-use-size@1.1.1(@types/react@19.1.8)(react@19.1.0)": + '@radix-ui/react-use-size@1.1.1(@types/react@19.1.8)(react@19.1.0)': dependencies: - "@radix-ui/react-use-layout-effect": 1.1.1(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.8)(react@19.1.0) react: 19.1.0 optionalDependencies: - "@types/react": 19.1.8 + '@types/react': 19.1.8 - "@radix-ui/react-visually-hidden@1.2.3(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)": + '@radix-ui/react-visually-hidden@1.2.3(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - "@radix-ui/react-primitive": 2.1.3(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) optionalDependencies: - "@types/react": 19.1.8 - "@types/react-dom": 19.1.6(@types/react@19.1.8) + '@types/react': 19.1.8 + '@types/react-dom': 19.1.6(@types/react@19.1.8) - "@radix-ui/rect@1.1.1": {} + '@radix-ui/rect@1.1.1': {} - "@rolldown/pluginutils@1.0.0-beta.27": {} + '@rolldown/pluginutils@1.0.0-beta.27': {} - "@rollup/plugin-alias@5.1.1(rollup@4.34.8)": + '@rollup/plugin-alias@5.1.1(rollup@4.34.8)': optionalDependencies: rollup: 4.34.8 - "@rollup/plugin-commonjs@28.0.3(rollup@4.34.8)": + '@rollup/plugin-commonjs@28.0.3(rollup@4.34.8)': dependencies: - "@rollup/pluginutils": 5.3.0(rollup@4.34.8) + '@rollup/pluginutils': 5.3.0(rollup@4.34.8) commondir: 1.0.1 estree-walker: 2.0.2 fdir: 6.4.6(picomatch@4.0.3) @@ -12488,170 +8383,170 @@ snapshots: optionalDependencies: rollup: 4.34.8 - "@rollup/plugin-json@6.1.0(rollup@4.34.8)": + '@rollup/plugin-json@6.1.0(rollup@4.34.8)': dependencies: - "@rollup/pluginutils": 5.3.0(rollup@4.34.8) + '@rollup/pluginutils': 5.3.0(rollup@4.34.8) optionalDependencies: rollup: 4.34.8 - "@rollup/plugin-node-resolve@16.0.1(rollup@4.34.8)": + '@rollup/plugin-node-resolve@16.0.1(rollup@4.34.8)': dependencies: - "@rollup/pluginutils": 5.3.0(rollup@4.34.8) - "@types/resolve": 1.20.2 + '@rollup/pluginutils': 5.3.0(rollup@4.34.8) + '@types/resolve': 1.20.2 deepmerge: 4.3.1 is-module: 1.0.0 resolve: 1.22.10 optionalDependencies: rollup: 4.34.8 - "@rollup/plugin-replace@6.0.2(rollup@4.34.8)": + '@rollup/plugin-replace@6.0.2(rollup@4.34.8)': dependencies: - "@rollup/pluginutils": 5.3.0(rollup@4.34.8) + '@rollup/pluginutils': 5.3.0(rollup@4.34.8) magic-string: 0.30.19 optionalDependencies: rollup: 4.34.8 - "@rollup/plugin-virtual@3.0.2(rollup@4.34.8)": + '@rollup/plugin-virtual@3.0.2(rollup@4.34.8)': optionalDependencies: rollup: 4.34.8 - "@rollup/pluginutils@5.2.0(rollup@4.34.8)": + '@rollup/pluginutils@5.2.0(rollup@4.34.8)': dependencies: - "@types/estree": 1.0.8 + '@types/estree': 1.0.8 estree-walker: 2.0.2 picomatch: 4.0.3 optionalDependencies: rollup: 4.34.8 - "@rollup/pluginutils@5.3.0(rollup@4.34.8)": + '@rollup/pluginutils@5.3.0(rollup@4.34.8)': dependencies: - "@types/estree": 1.0.8 + '@types/estree': 1.0.8 estree-walker: 2.0.2 picomatch: 4.0.3 optionalDependencies: rollup: 4.34.8 - "@rollup/rollup-android-arm-eabi@4.34.8": + '@rollup/rollup-android-arm-eabi@4.34.8': optional: true - "@rollup/rollup-android-arm64@4.34.8": + '@rollup/rollup-android-arm64@4.34.8': optional: true - "@rollup/rollup-darwin-arm64@4.34.8": + '@rollup/rollup-darwin-arm64@4.34.8': optional: true - "@rollup/rollup-darwin-x64@4.34.8": + '@rollup/rollup-darwin-x64@4.34.8': optional: true - "@rollup/rollup-freebsd-arm64@4.34.8": + '@rollup/rollup-freebsd-arm64@4.34.8': optional: true - "@rollup/rollup-freebsd-x64@4.34.8": + '@rollup/rollup-freebsd-x64@4.34.8': optional: true - "@rollup/rollup-linux-arm-gnueabihf@4.34.8": + '@rollup/rollup-linux-arm-gnueabihf@4.34.8': optional: true - "@rollup/rollup-linux-arm-musleabihf@4.34.8": + '@rollup/rollup-linux-arm-musleabihf@4.34.8': optional: true - "@rollup/rollup-linux-arm64-gnu@4.34.8": + '@rollup/rollup-linux-arm64-gnu@4.34.8': optional: true - "@rollup/rollup-linux-arm64-musl@4.34.8": + '@rollup/rollup-linux-arm64-musl@4.34.8': optional: true - "@rollup/rollup-linux-loongarch64-gnu@4.34.8": + '@rollup/rollup-linux-loongarch64-gnu@4.34.8': optional: true - "@rollup/rollup-linux-powerpc64le-gnu@4.34.8": + '@rollup/rollup-linux-powerpc64le-gnu@4.34.8': optional: true - "@rollup/rollup-linux-riscv64-gnu@4.34.8": + '@rollup/rollup-linux-riscv64-gnu@4.34.8': optional: true - "@rollup/rollup-linux-s390x-gnu@4.34.8": + '@rollup/rollup-linux-s390x-gnu@4.34.8': optional: true - "@rollup/rollup-linux-x64-gnu@4.34.8": + '@rollup/rollup-linux-x64-gnu@4.34.8': optional: true - "@rollup/rollup-linux-x64-musl@4.34.8": + '@rollup/rollup-linux-x64-musl@4.34.8': optional: true - "@rollup/rollup-win32-arm64-msvc@4.34.8": + '@rollup/rollup-win32-arm64-msvc@4.34.8': optional: true - "@rollup/rollup-win32-ia32-msvc@4.34.8": + '@rollup/rollup-win32-ia32-msvc@4.34.8': optional: true - "@rollup/rollup-win32-x64-msvc@4.34.8": + '@rollup/rollup-win32-x64-msvc@4.34.8': optional: true - "@sec-ant/readable-stream@0.4.1": {} + '@sec-ant/readable-stream@0.4.1': {} - "@shikijs/core@3.12.2": + '@shikijs/core@3.12.2': dependencies: - "@shikijs/types": 3.12.2 - "@shikijs/vscode-textmate": 10.0.2 - "@types/hast": 3.0.4 + '@shikijs/types': 3.12.2 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 hast-util-to-html: 9.0.5 - "@shikijs/engine-javascript@3.12.2": + '@shikijs/engine-javascript@3.12.2': dependencies: - "@shikijs/types": 3.12.2 - "@shikijs/vscode-textmate": 10.0.2 + '@shikijs/types': 3.12.2 + '@shikijs/vscode-textmate': 10.0.2 oniguruma-to-es: 4.3.3 - "@shikijs/engine-oniguruma@3.12.2": + '@shikijs/engine-oniguruma@3.12.2': dependencies: - "@shikijs/types": 3.12.2 - "@shikijs/vscode-textmate": 10.0.2 + '@shikijs/types': 3.12.2 + '@shikijs/vscode-textmate': 10.0.2 - "@shikijs/engine-oniguruma@3.13.0": + '@shikijs/engine-oniguruma@3.13.0': dependencies: - "@shikijs/types": 3.13.0 - "@shikijs/vscode-textmate": 10.0.2 + '@shikijs/types': 3.13.0 + '@shikijs/vscode-textmate': 10.0.2 - "@shikijs/langs@3.12.2": + '@shikijs/langs@3.12.2': dependencies: - "@shikijs/types": 3.12.2 + '@shikijs/types': 3.12.2 - "@shikijs/langs@3.13.0": + '@shikijs/langs@3.13.0': dependencies: - "@shikijs/types": 3.13.0 + '@shikijs/types': 3.13.0 - "@shikijs/themes@3.12.2": + '@shikijs/themes@3.12.2': dependencies: - "@shikijs/types": 3.12.2 + '@shikijs/types': 3.12.2 - "@shikijs/themes@3.13.0": + '@shikijs/themes@3.13.0': dependencies: - "@shikijs/types": 3.13.0 + '@shikijs/types': 3.13.0 - "@shikijs/types@3.12.2": + '@shikijs/types@3.12.2': dependencies: - "@shikijs/vscode-textmate": 10.0.2 - "@types/hast": 3.0.4 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 - "@shikijs/types@3.13.0": + '@shikijs/types@3.13.0': dependencies: - "@shikijs/vscode-textmate": 10.0.2 - "@types/hast": 3.0.4 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 - "@shikijs/vscode-textmate@10.0.2": {} + '@shikijs/vscode-textmate@10.0.2': {} - "@sindresorhus/merge-streams@4.0.0": {} + '@sindresorhus/merge-streams@4.0.0': {} - "@stackblitz/sdk@1.11.0": {} + '@stackblitz/sdk@1.11.0': {} - "@swc/helpers@0.5.17": + '@swc/helpers@0.5.17': dependencies: tslib: 2.8.1 - "@tailwindcss/node@4.1.13": + '@tailwindcss/node@4.1.13': dependencies: - "@jridgewell/remapping": 2.3.5 + '@jridgewell/remapping': 2.3.5 enhanced-resolve: 5.18.3 jiti: 2.5.1 lightningcss: 1.30.1 @@ -12659,222 +8554,222 @@ snapshots: source-map-js: 1.2.1 tailwindcss: 4.1.13 - "@tailwindcss/oxide-android-arm64@4.1.13": + '@tailwindcss/oxide-android-arm64@4.1.13': optional: true - "@tailwindcss/oxide-darwin-arm64@4.1.13": + '@tailwindcss/oxide-darwin-arm64@4.1.13': optional: true - "@tailwindcss/oxide-darwin-x64@4.1.13": + '@tailwindcss/oxide-darwin-x64@4.1.13': optional: true - "@tailwindcss/oxide-freebsd-x64@4.1.13": + '@tailwindcss/oxide-freebsd-x64@4.1.13': optional: true - "@tailwindcss/oxide-linux-arm-gnueabihf@4.1.13": + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.13': optional: true - "@tailwindcss/oxide-linux-arm64-gnu@4.1.13": + '@tailwindcss/oxide-linux-arm64-gnu@4.1.13': optional: true - "@tailwindcss/oxide-linux-arm64-musl@4.1.13": + '@tailwindcss/oxide-linux-arm64-musl@4.1.13': optional: true - "@tailwindcss/oxide-linux-x64-gnu@4.1.13": + '@tailwindcss/oxide-linux-x64-gnu@4.1.13': optional: true - "@tailwindcss/oxide-linux-x64-musl@4.1.13": + '@tailwindcss/oxide-linux-x64-musl@4.1.13': optional: true - "@tailwindcss/oxide-wasm32-wasi@4.1.13": + '@tailwindcss/oxide-wasm32-wasi@4.1.13': optional: true - "@tailwindcss/oxide-win32-arm64-msvc@4.1.13": + '@tailwindcss/oxide-win32-arm64-msvc@4.1.13': optional: true - "@tailwindcss/oxide-win32-x64-msvc@4.1.13": + '@tailwindcss/oxide-win32-x64-msvc@4.1.13': optional: true - "@tailwindcss/oxide@4.1.13": + '@tailwindcss/oxide@4.1.13': dependencies: detect-libc: 2.1.0 tar: 7.4.3 optionalDependencies: - "@tailwindcss/oxide-android-arm64": 4.1.13 - "@tailwindcss/oxide-darwin-arm64": 4.1.13 - "@tailwindcss/oxide-darwin-x64": 4.1.13 - "@tailwindcss/oxide-freebsd-x64": 4.1.13 - "@tailwindcss/oxide-linux-arm-gnueabihf": 4.1.13 - "@tailwindcss/oxide-linux-arm64-gnu": 4.1.13 - "@tailwindcss/oxide-linux-arm64-musl": 4.1.13 - "@tailwindcss/oxide-linux-x64-gnu": 4.1.13 - "@tailwindcss/oxide-linux-x64-musl": 4.1.13 - "@tailwindcss/oxide-wasm32-wasi": 4.1.13 - "@tailwindcss/oxide-win32-arm64-msvc": 4.1.13 - "@tailwindcss/oxide-win32-x64-msvc": 4.1.13 - - "@tailwindcss/vite@4.1.13(vite@6.3.6(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0))": - dependencies: - "@tailwindcss/node": 4.1.13 - "@tailwindcss/oxide": 4.1.13 + '@tailwindcss/oxide-android-arm64': 4.1.13 + '@tailwindcss/oxide-darwin-arm64': 4.1.13 + '@tailwindcss/oxide-darwin-x64': 4.1.13 + '@tailwindcss/oxide-freebsd-x64': 4.1.13 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.13 + '@tailwindcss/oxide-linux-arm64-gnu': 4.1.13 + '@tailwindcss/oxide-linux-arm64-musl': 4.1.13 + '@tailwindcss/oxide-linux-x64-gnu': 4.1.13 + '@tailwindcss/oxide-linux-x64-musl': 4.1.13 + '@tailwindcss/oxide-wasm32-wasi': 4.1.13 + '@tailwindcss/oxide-win32-arm64-msvc': 4.1.13 + '@tailwindcss/oxide-win32-x64-msvc': 4.1.13 + + '@tailwindcss/vite@4.1.13(vite@6.3.6(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0))': + dependencies: + '@tailwindcss/node': 4.1.13 + '@tailwindcss/oxide': 4.1.13 tailwindcss: 4.1.13 vite: 6.3.6(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0) - "@testing-library/dom@10.4.0": + '@testing-library/dom@10.4.0': dependencies: - "@babel/code-frame": 7.27.1 - "@babel/runtime": 7.26.9 - "@types/aria-query": 5.0.4 + '@babel/code-frame': 7.27.1 + '@babel/runtime': 7.26.9 + '@types/aria-query': 5.0.4 aria-query: 5.3.0 chalk: 4.1.2 dom-accessibility-api: 0.5.16 lz-string: 1.5.0 pretty-format: 27.5.1 - "@testing-library/user-event@14.6.1(@testing-library/dom@10.4.0)": + '@testing-library/user-event@14.6.1(@testing-library/dom@10.4.0)': dependencies: - "@testing-library/dom": 10.4.0 + '@testing-library/dom': 10.4.0 - "@trysound/sax@0.2.0": {} + '@trysound/sax@0.2.0': {} - "@types/acorn@4.0.6": + '@types/acorn@4.0.6': dependencies: - "@types/estree": 1.0.8 + '@types/estree': 1.0.8 - "@types/aria-query@5.0.4": {} + '@types/aria-query@5.0.4': {} - "@types/babel__core@7.20.5": + '@types/babel__core@7.20.5': dependencies: - "@babel/parser": 7.27.0 - "@babel/types": 7.26.5 - "@types/babel__generator": 7.6.8 - "@types/babel__template": 7.4.4 - "@types/babel__traverse": 7.20.7 + '@babel/parser': 7.27.0 + '@babel/types': 7.26.5 + '@types/babel__generator': 7.6.8 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.20.7 - "@types/babel__generator@7.6.8": + '@types/babel__generator@7.6.8': dependencies: - "@babel/types": 7.26.5 + '@babel/types': 7.26.5 - "@types/babel__standalone@7.1.9": + '@types/babel__standalone@7.1.9': dependencies: - "@babel/parser": 7.26.9 - "@babel/types": 7.26.5 - "@types/babel__core": 7.20.5 - "@types/babel__generator": 7.6.8 - "@types/babel__template": 7.4.4 - "@types/babel__traverse": 7.20.7 + '@babel/parser': 7.26.9 + '@babel/types': 7.26.5 + '@types/babel__core': 7.20.5 + '@types/babel__generator': 7.6.8 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.20.7 - "@types/babel__template@7.4.4": + '@types/babel__template@7.4.4': dependencies: - "@babel/parser": 7.26.9 - "@babel/types": 7.26.5 + '@babel/parser': 7.26.9 + '@babel/types': 7.26.5 - "@types/babel__traverse@7.20.7": + '@types/babel__traverse@7.20.7': dependencies: - "@babel/types": 7.26.5 + '@babel/types': 7.26.5 - "@types/bun@1.2.22(@types/react@19.1.8)": + '@types/bun@1.2.22(@types/react@19.1.8)': dependencies: bun-types: 1.2.22(@types/react@19.1.8) transitivePeerDependencies: - - "@types/react" + - '@types/react' - "@types/chai@5.2.2": + '@types/chai@5.2.2': dependencies: - "@types/deep-eql": 4.0.2 + '@types/deep-eql': 4.0.2 - "@types/cookie@0.6.0": + '@types/cookie@0.6.0': optional: true - "@types/debug@4.1.12": + '@types/debug@4.1.12': dependencies: - "@types/ms": 2.1.0 + '@types/ms': 2.1.0 - "@types/deep-eql@4.0.2": {} + '@types/deep-eql@4.0.2': {} - "@types/dom-mediacapture-record@1.0.22": {} + '@types/dom-mediacapture-record@1.0.22': {} - "@types/estree-jsx@1.0.5": + '@types/estree-jsx@1.0.5': dependencies: - "@types/estree": 1.0.8 + '@types/estree': 1.0.8 - "@types/estree@1.0.6": {} + '@types/estree@1.0.6': {} - "@types/estree@1.0.8": {} + '@types/estree@1.0.8': {} - "@types/fontkit@2.0.8": + '@types/fontkit@2.0.8': dependencies: - "@types/node": 24.3.0 + '@types/node': 24.3.0 - "@types/geojson@7946.0.16": {} + '@types/geojson@7946.0.16': {} - "@types/hast@3.0.4": + '@types/hast@3.0.4': dependencies: - "@types/unist": 3.0.3 + '@types/unist': 3.0.3 - "@types/js-yaml@4.0.9": {} + '@types/js-yaml@4.0.9': {} - "@types/katex@0.16.7": {} + '@types/katex@0.16.7': {} - "@types/mathjax@0.0.40": {} + '@types/mathjax@0.0.40': {} - "@types/mdast@4.0.4": + '@types/mdast@4.0.4': dependencies: - "@types/unist": 3.0.3 + '@types/unist': 3.0.3 - "@types/mdx@2.0.13": {} + '@types/mdx@2.0.13': {} - "@types/moo@0.5.10": {} + '@types/moo@0.5.10': {} - "@types/ms@2.1.0": {} + '@types/ms@2.1.0': {} - "@types/nearley@2.11.5": {} + '@types/nearley@2.11.5': {} - "@types/nlcst@2.0.3": + '@types/nlcst@2.0.3': dependencies: - "@types/unist": 3.0.3 + '@types/unist': 3.0.3 - "@types/node@17.0.45": {} + '@types/node@17.0.45': {} - "@types/node@24.3.0": + '@types/node@24.3.0': dependencies: undici-types: 7.10.0 - "@types/node@24.5.2": + '@types/node@24.5.2': dependencies: undici-types: 7.12.0 - "@types/picomatch@4.0.1": {} + '@types/picomatch@4.0.1': {} - "@types/react-dom@19.1.6(@types/react@19.1.8)": + '@types/react-dom@19.1.6(@types/react@19.1.8)': dependencies: - "@types/react": 19.1.8 + '@types/react': 19.1.8 - "@types/react@19.1.8": + '@types/react@19.1.8': dependencies: csstype: 3.1.3 - "@types/resolve@1.20.2": {} + '@types/resolve@1.20.2': {} - "@types/sax@1.2.7": + '@types/sax@1.2.7': dependencies: - "@types/node": 24.3.0 + '@types/node': 24.3.0 - "@types/statuses@2.0.6": + '@types/statuses@2.0.6': optional: true - "@types/tough-cookie@4.0.5": + '@types/tough-cookie@4.0.5': optional: true - "@types/trusted-types@1.0.6": {} + '@types/trusted-types@1.0.6': {} - "@types/unist@2.0.11": {} + '@types/unist@2.0.11': {} - "@types/unist@3.0.3": {} + '@types/unist@3.0.3': {} - "@types/webxr@0.4.0": {} + '@types/webxr@0.4.0': {} - "@typescript/analyze-trace@0.10.1": + '@typescript/analyze-trace@0.10.1': dependencies: chalk: 4.1.2 exit: 0.1.2 @@ -12885,37 +8780,37 @@ snapshots: treeify: 1.1.0 yargs: 16.2.0 - "@typescript/vfs@1.6.1(typescript@5.8.3)": + '@typescript/vfs@1.6.1(typescript@5.8.3)': dependencies: debug: 4.4.3 typescript: 5.8.3 transitivePeerDependencies: - supports-color - "@ungap/structured-clone@1.3.0": {} + '@ungap/structured-clone@1.3.0': {} - "@vitejs/plugin-basic-ssl@2.1.0(vite@6.3.6(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0))": + '@vitejs/plugin-basic-ssl@2.1.0(vite@6.3.6(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0))': dependencies: vite: 6.3.6(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0) - "@vitejs/plugin-react@4.7.0(vite@6.3.6(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0))": + '@vitejs/plugin-react@4.7.0(vite@6.3.6(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0))': dependencies: - "@babel/core": 7.28.4 - "@babel/plugin-transform-react-jsx-self": 7.27.1(@babel/core@7.28.4) - "@babel/plugin-transform-react-jsx-source": 7.27.1(@babel/core@7.28.4) - "@rolldown/pluginutils": 1.0.0-beta.27 - "@types/babel__core": 7.20.5 + '@babel/core': 7.28.4 + '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.28.4) + '@rolldown/pluginutils': 1.0.0-beta.27 + '@types/babel__core': 7.20.5 react-refresh: 0.17.0 vite: 6.3.6(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0) transitivePeerDependencies: - supports-color - "@vitest/browser@3.2.4(msw@2.10.2(@types/node@24.5.2)(typescript@5.8.3))(vite@6.3.5(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.1))(vitest@3.2.4)": + '@vitest/browser@3.2.4(msw@2.10.2(@types/node@24.5.2)(typescript@5.8.3))(vite@6.3.5(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.1))(vitest@3.2.4)': dependencies: - "@testing-library/dom": 10.4.0 - "@testing-library/user-event": 14.6.1(@testing-library/dom@10.4.0) - "@vitest/mocker": 3.2.4(msw@2.10.2(@types/node@24.5.2)(typescript@5.8.3))(vite@6.3.5(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.1)) - "@vitest/utils": 3.2.4 + '@testing-library/dom': 10.4.0 + '@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.0) + '@vitest/mocker': 3.2.4(msw@2.10.2(@types/node@24.5.2)(typescript@5.8.3))(vite@6.3.5(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.1)) + '@vitest/utils': 3.2.4 magic-string: 0.30.17 sirv: 3.0.1 tinyrainbow: 2.0.0 @@ -12928,12 +8823,12 @@ snapshots: - vite optional: true - "@vitest/browser@3.2.4(msw@2.10.2(@types/node@24.5.2)(typescript@5.8.3))(vite@6.3.6(@types/node@24.5.2)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.1))(vitest@3.2.4)": + '@vitest/browser@3.2.4(msw@2.10.2(@types/node@24.5.2)(typescript@5.8.3))(vite@6.3.6(@types/node@24.5.2)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.1))(vitest@3.2.4)': dependencies: - "@testing-library/dom": 10.4.0 - "@testing-library/user-event": 14.6.1(@testing-library/dom@10.4.0) - "@vitest/mocker": 3.2.4(msw@2.10.2(@types/node@24.5.2)(typescript@5.8.3))(vite@6.3.6(@types/node@24.5.2)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.1)) - "@vitest/utils": 3.2.4 + '@testing-library/dom': 10.4.0 + '@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.0) + '@vitest/mocker': 3.2.4(msw@2.10.2(@types/node@24.5.2)(typescript@5.8.3))(vite@6.3.6(@types/node@24.5.2)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.1)) + '@vitest/utils': 3.2.4 magic-string: 0.30.17 sirv: 3.0.1 tinyrainbow: 2.0.0 @@ -12945,10 +8840,10 @@ snapshots: - utf-8-validate - vite - "@vitest/coverage-v8@3.1.2(@vitest/browser@3.2.4)(vitest@3.2.4)": + '@vitest/coverage-v8@3.1.2(@vitest/browser@3.2.4)(vitest@3.2.4)': dependencies: - "@ampproject/remapping": 2.3.0 - "@bcoe/v8-coverage": 1.0.2 + '@ampproject/remapping': 2.3.0 + '@bcoe/v8-coverage': 1.0.2 debug: 4.4.0 istanbul-lib-coverage: 3.2.2 istanbul-lib-report: 3.0.1 @@ -12961,89 +8856,89 @@ snapshots: tinyrainbow: 2.0.0 vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)(@vitest/browser@3.2.4)(jiti@2.4.2)(jsdom@27.0.0(canvas@3.2.0)(postcss@8.5.6))(lightningcss@1.30.1)(msw@2.10.2(@types/node@24.5.2)(typescript@5.8.3))(tsx@4.19.3)(yaml@2.8.1) optionalDependencies: - "@vitest/browser": 3.2.4(msw@2.10.2(@types/node@24.5.2)(typescript@5.8.3))(vite@6.3.6(@types/node@24.5.2)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.1))(vitest@3.2.4) + '@vitest/browser': 3.2.4(msw@2.10.2(@types/node@24.5.2)(typescript@5.8.3))(vite@6.3.6(@types/node@24.5.2)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.1))(vitest@3.2.4) transitivePeerDependencies: - supports-color - "@vitest/expect@3.2.4": + '@vitest/expect@3.2.4': dependencies: - "@types/chai": 5.2.2 - "@vitest/spy": 3.2.4 - "@vitest/utils": 3.2.4 + '@types/chai': 5.2.2 + '@vitest/spy': 3.2.4 + '@vitest/utils': 3.2.4 chai: 5.2.0 tinyrainbow: 2.0.0 - "@vitest/mocker@3.2.4(msw@2.10.2(@types/node@24.5.2)(typescript@5.8.3))(vite@6.3.5(@types/node@24.5.2)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.1))": + '@vitest/mocker@3.2.4(msw@2.10.2(@types/node@24.5.2)(typescript@5.8.3))(vite@6.3.5(@types/node@24.5.2)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.1))': dependencies: - "@vitest/spy": 3.2.4 + '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.19 optionalDependencies: msw: 2.10.2(@types/node@24.5.2)(typescript@5.8.3) vite: 6.3.5(@types/node@24.5.2)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.1) - "@vitest/mocker@3.2.4(msw@2.10.2(@types/node@24.5.2)(typescript@5.8.3))(vite@6.3.5(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.1))": + '@vitest/mocker@3.2.4(msw@2.10.2(@types/node@24.5.2)(typescript@5.8.3))(vite@6.3.5(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.1))': dependencies: - "@vitest/spy": 3.2.4 + '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.19 optionalDependencies: msw: 2.10.2(@types/node@24.5.2)(typescript@5.8.3) vite: 6.3.5(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.1) - "@vitest/mocker@3.2.4(msw@2.10.2(@types/node@24.5.2)(typescript@5.8.3))(vite@6.3.6(@types/node@24.5.2)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.1))": + '@vitest/mocker@3.2.4(msw@2.10.2(@types/node@24.5.2)(typescript@5.8.3))(vite@6.3.6(@types/node@24.5.2)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.1))': dependencies: - "@vitest/spy": 3.2.4 + '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.19 optionalDependencies: msw: 2.10.2(@types/node@24.5.2)(typescript@5.8.3) vite: 6.3.6(@types/node@24.5.2)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.1) - "@vitest/pretty-format@3.2.4": + '@vitest/pretty-format@3.2.4': dependencies: tinyrainbow: 2.0.0 - "@vitest/runner@3.2.4": + '@vitest/runner@3.2.4': dependencies: - "@vitest/utils": 3.2.4 + '@vitest/utils': 3.2.4 pathe: 2.0.3 strip-literal: 3.0.0 - "@vitest/snapshot@3.2.4": + '@vitest/snapshot@3.2.4': dependencies: - "@vitest/pretty-format": 3.2.4 + '@vitest/pretty-format': 3.2.4 magic-string: 0.30.19 pathe: 2.0.3 - "@vitest/spy@3.2.4": + '@vitest/spy@3.2.4': dependencies: tinyspy: 4.0.3 - "@vitest/utils@3.2.4": + '@vitest/utils@3.2.4': dependencies: - "@vitest/pretty-format": 3.2.4 + '@vitest/pretty-format': 3.2.4 loupe: 3.1.4 tinyrainbow: 2.0.0 - "@volar/kit@2.4.11(typescript@5.8.3)": + '@volar/kit@2.4.11(typescript@5.8.3)': dependencies: - "@volar/language-service": 2.4.11 - "@volar/typescript": 2.4.11 + '@volar/language-service': 2.4.11 + '@volar/typescript': 2.4.11 typesafe-path: 0.2.2 typescript: 5.8.3 vscode-languageserver-textdocument: 1.0.12 vscode-uri: 3.1.0 - "@volar/language-core@2.4.11": + '@volar/language-core@2.4.11': dependencies: - "@volar/source-map": 2.4.11 + '@volar/source-map': 2.4.11 - "@volar/language-server@2.4.11": + '@volar/language-server@2.4.11': dependencies: - "@volar/language-core": 2.4.11 - "@volar/language-service": 2.4.11 - "@volar/typescript": 2.4.11 + '@volar/language-core': 2.4.11 + '@volar/language-service': 2.4.11 + '@volar/typescript': 2.4.11 path-browserify: 1.0.1 request-light: 0.7.0 vscode-languageserver: 9.0.1 @@ -13051,22 +8946,22 @@ snapshots: vscode-languageserver-textdocument: 1.0.12 vscode-uri: 3.1.0 - "@volar/language-service@2.4.11": + '@volar/language-service@2.4.11': dependencies: - "@volar/language-core": 2.4.11 + '@volar/language-core': 2.4.11 vscode-languageserver-protocol: 3.17.5 vscode-languageserver-textdocument: 1.0.12 vscode-uri: 3.1.0 - "@volar/source-map@2.4.11": {} + '@volar/source-map@2.4.11': {} - "@volar/typescript@2.4.11": + '@volar/typescript@2.4.11': dependencies: - "@volar/language-core": 2.4.11 + '@volar/language-core': 2.4.11 path-browserify: 1.0.1 vscode-uri: 3.1.0 - "@vscode/emmet-helper@2.11.0": + '@vscode/emmet-helper@2.11.0': dependencies: emmet: 2.4.11 jsonc-parser: 2.3.1 @@ -13074,21 +8969,21 @@ snapshots: vscode-languageserver-types: 3.17.5 vscode-uri: 3.1.0 - "@vscode/l10n@0.0.18": {} + '@vscode/l10n@0.0.18': {} - "@vtbag/cam-shaft@1.0.6": {} + '@vtbag/cam-shaft@1.0.6': {} - "@vtbag/element-crossing@1.1.0": {} + '@vtbag/element-crossing@1.1.0': {} - "@vtbag/inspection-chamber@1.0.22": {} + '@vtbag/inspection-chamber@1.0.22': {} - "@vtbag/turn-signal@1.3.1": {} + '@vtbag/turn-signal@1.3.1': {} - "@vtbag/utensil-drawer@1.2.11": {} + '@vtbag/utensil-drawer@1.2.11': {} - "@webgpu/types@0.1.63": {} + '@webgpu/types@0.1.63': {} - "@xmldom/xmldom@0.9.8": {} + '@xmldom/xmldom@0.9.8': {} acorn-jsx@5.3.2(acorn@8.15.0): dependencies: @@ -13148,13 +9043,13 @@ snapshots: arktype@2.1.20: dependencies: - "@ark/schema": 0.46.0 - "@ark/util": 0.46.0 + '@ark/schema': 0.46.0 + '@ark/util': 0.46.0 arktype@2.1.22: dependencies: - "@ark/schema": 0.49.0 - "@ark/util": 0.49.0 + '@ark/schema': 0.49.0 + '@ark/util': 0.49.0 array-iterate@2.0.1: {} @@ -13177,21 +9072,21 @@ snapshots: astro-vtbot@2.1.6: dependencies: - "@vtbag/cam-shaft": 1.0.6 - "@vtbag/element-crossing": 1.1.0 - "@vtbag/inspection-chamber": 1.0.22 - "@vtbag/turn-signal": 1.3.1 - "@vtbag/utensil-drawer": 1.2.11 + '@vtbag/cam-shaft': 1.0.6 + '@vtbag/element-crossing': 1.1.0 + '@vtbag/inspection-chamber': 1.0.22 + '@vtbag/turn-signal': 1.3.1 + '@vtbag/utensil-drawer': 1.2.11 astro@5.13.7(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(rollup@4.34.8)(tsx@4.19.3)(typescript@5.8.3)(yaml@2.8.0): dependencies: - "@astrojs/compiler": 2.13.0 - "@astrojs/internal-helpers": 0.7.2 - "@astrojs/markdown-remark": 6.3.6 - "@astrojs/telemetry": 3.3.0 - "@capsizecss/unpack": 2.4.0 - "@oslojs/encoding": 1.1.0 - "@rollup/pluginutils": 5.3.0(rollup@4.34.8) + '@astrojs/compiler': 2.13.0 + '@astrojs/internal-helpers': 0.7.2 + '@astrojs/markdown-remark': 6.3.6 + '@astrojs/telemetry': 3.3.0 + '@capsizecss/unpack': 2.4.0 + '@oslojs/encoding': 1.1.0 + '@rollup/pluginutils': 5.3.0(rollup@4.34.8) acorn: 8.15.0 aria-query: 5.3.2 axobject-query: 4.1.0 @@ -13250,21 +9145,21 @@ snapshots: optionalDependencies: sharp: 0.34.2 transitivePeerDependencies: - - "@azure/app-configuration" - - "@azure/cosmos" - - "@azure/data-tables" - - "@azure/identity" - - "@azure/keyvault-secrets" - - "@azure/storage-blob" - - "@capacitor/preferences" - - "@deno/kv" - - "@netlify/blobs" - - "@planetscale/database" - - "@types/node" - - "@upstash/redis" - - "@vercel/blob" - - "@vercel/functions" - - "@vercel/kv" + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@types/node' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' - aws4fetch - db0 - encoding @@ -13395,8 +9290,8 @@ snapshots: bun-types@1.2.22(@types/react@19.1.8): dependencies: - "@types/node": 24.5.2 - "@types/react": 19.1.8 + '@types/node': 24.5.2 + '@types/react': 19.1.8 bundle-require@5.1.0(esbuild@0.25.6): dependencies: @@ -13651,8 +9546,8 @@ snapshots: cssstyle@5.3.1(postcss@8.5.6): dependencies: - "@asamuzakjp/css-color": 4.0.5 - "@csstools/css-syntax-patches-for-csstree": 1.0.14(postcss@8.5.6) + '@asamuzakjp/css-color': 4.0.5 + '@csstools/css-syntax-patches-for-csstree': 1.0.14(postcss@8.5.6) css-tree: 3.1.0 transitivePeerDependencies: - postcss @@ -13932,8 +9827,8 @@ snapshots: emmet@2.4.11: dependencies: - "@emmetio/abbreviation": 2.3.3 - "@emmetio/css-abbreviation": 2.1.8 + '@emmetio/abbreviation': 2.3.3 + '@emmetio/css-abbreviation': 2.1.8 emoji-regex@10.5.0: {} @@ -13959,160 +9854,160 @@ snapshots: esast-util-from-estree@2.0.0: dependencies: - "@types/estree-jsx": 1.0.5 + '@types/estree-jsx': 1.0.5 devlop: 1.1.0 estree-util-visit: 2.0.0 unist-util-position-from-estree: 2.0.0 esast-util-from-js@2.0.1: dependencies: - "@types/estree-jsx": 1.0.5 + '@types/estree-jsx': 1.0.5 acorn: 8.15.0 esast-util-from-estree: 2.0.0 vfile-message: 4.0.3 esbuild@0.24.2: optionalDependencies: - "@esbuild/aix-ppc64": 0.24.2 - "@esbuild/android-arm": 0.24.2 - "@esbuild/android-arm64": 0.24.2 - "@esbuild/android-x64": 0.24.2 - "@esbuild/darwin-arm64": 0.24.2 - "@esbuild/darwin-x64": 0.24.2 - "@esbuild/freebsd-arm64": 0.24.2 - "@esbuild/freebsd-x64": 0.24.2 - "@esbuild/linux-arm": 0.24.2 - "@esbuild/linux-arm64": 0.24.2 - "@esbuild/linux-ia32": 0.24.2 - "@esbuild/linux-loong64": 0.24.2 - "@esbuild/linux-mips64el": 0.24.2 - "@esbuild/linux-ppc64": 0.24.2 - "@esbuild/linux-riscv64": 0.24.2 - "@esbuild/linux-s390x": 0.24.2 - "@esbuild/linux-x64": 0.24.2 - "@esbuild/netbsd-arm64": 0.24.2 - "@esbuild/netbsd-x64": 0.24.2 - "@esbuild/openbsd-arm64": 0.24.2 - "@esbuild/openbsd-x64": 0.24.2 - "@esbuild/sunos-x64": 0.24.2 - "@esbuild/win32-arm64": 0.24.2 - "@esbuild/win32-ia32": 0.24.2 - "@esbuild/win32-x64": 0.24.2 + '@esbuild/aix-ppc64': 0.24.2 + '@esbuild/android-arm': 0.24.2 + '@esbuild/android-arm64': 0.24.2 + '@esbuild/android-x64': 0.24.2 + '@esbuild/darwin-arm64': 0.24.2 + '@esbuild/darwin-x64': 0.24.2 + '@esbuild/freebsd-arm64': 0.24.2 + '@esbuild/freebsd-x64': 0.24.2 + '@esbuild/linux-arm': 0.24.2 + '@esbuild/linux-arm64': 0.24.2 + '@esbuild/linux-ia32': 0.24.2 + '@esbuild/linux-loong64': 0.24.2 + '@esbuild/linux-mips64el': 0.24.2 + '@esbuild/linux-ppc64': 0.24.2 + '@esbuild/linux-riscv64': 0.24.2 + '@esbuild/linux-s390x': 0.24.2 + '@esbuild/linux-x64': 0.24.2 + '@esbuild/netbsd-arm64': 0.24.2 + '@esbuild/netbsd-x64': 0.24.2 + '@esbuild/openbsd-arm64': 0.24.2 + '@esbuild/openbsd-x64': 0.24.2 + '@esbuild/sunos-x64': 0.24.2 + '@esbuild/win32-arm64': 0.24.2 + '@esbuild/win32-ia32': 0.24.2 + '@esbuild/win32-x64': 0.24.2 esbuild@0.25.10: optionalDependencies: - "@esbuild/aix-ppc64": 0.25.10 - "@esbuild/android-arm": 0.25.10 - "@esbuild/android-arm64": 0.25.10 - "@esbuild/android-x64": 0.25.10 - "@esbuild/darwin-arm64": 0.25.10 - "@esbuild/darwin-x64": 0.25.10 - "@esbuild/freebsd-arm64": 0.25.10 - "@esbuild/freebsd-x64": 0.25.10 - "@esbuild/linux-arm": 0.25.10 - "@esbuild/linux-arm64": 0.25.10 - "@esbuild/linux-ia32": 0.25.10 - "@esbuild/linux-loong64": 0.25.10 - "@esbuild/linux-mips64el": 0.25.10 - "@esbuild/linux-ppc64": 0.25.10 - "@esbuild/linux-riscv64": 0.25.10 - "@esbuild/linux-s390x": 0.25.10 - "@esbuild/linux-x64": 0.25.10 - "@esbuild/netbsd-arm64": 0.25.10 - "@esbuild/netbsd-x64": 0.25.10 - "@esbuild/openbsd-arm64": 0.25.10 - "@esbuild/openbsd-x64": 0.25.10 - "@esbuild/openharmony-arm64": 0.25.10 - "@esbuild/sunos-x64": 0.25.10 - "@esbuild/win32-arm64": 0.25.10 - "@esbuild/win32-ia32": 0.25.10 - "@esbuild/win32-x64": 0.25.10 + '@esbuild/aix-ppc64': 0.25.10 + '@esbuild/android-arm': 0.25.10 + '@esbuild/android-arm64': 0.25.10 + '@esbuild/android-x64': 0.25.10 + '@esbuild/darwin-arm64': 0.25.10 + '@esbuild/darwin-x64': 0.25.10 + '@esbuild/freebsd-arm64': 0.25.10 + '@esbuild/freebsd-x64': 0.25.10 + '@esbuild/linux-arm': 0.25.10 + '@esbuild/linux-arm64': 0.25.10 + '@esbuild/linux-ia32': 0.25.10 + '@esbuild/linux-loong64': 0.25.10 + '@esbuild/linux-mips64el': 0.25.10 + '@esbuild/linux-ppc64': 0.25.10 + '@esbuild/linux-riscv64': 0.25.10 + '@esbuild/linux-s390x': 0.25.10 + '@esbuild/linux-x64': 0.25.10 + '@esbuild/netbsd-arm64': 0.25.10 + '@esbuild/netbsd-x64': 0.25.10 + '@esbuild/openbsd-arm64': 0.25.10 + '@esbuild/openbsd-x64': 0.25.10 + '@esbuild/openharmony-arm64': 0.25.10 + '@esbuild/sunos-x64': 0.25.10 + '@esbuild/win32-arm64': 0.25.10 + '@esbuild/win32-ia32': 0.25.10 + '@esbuild/win32-x64': 0.25.10 esbuild@0.25.5: optionalDependencies: - "@esbuild/aix-ppc64": 0.25.5 - "@esbuild/android-arm": 0.25.5 - "@esbuild/android-arm64": 0.25.5 - "@esbuild/android-x64": 0.25.5 - "@esbuild/darwin-arm64": 0.25.5 - "@esbuild/darwin-x64": 0.25.5 - "@esbuild/freebsd-arm64": 0.25.5 - "@esbuild/freebsd-x64": 0.25.5 - "@esbuild/linux-arm": 0.25.5 - "@esbuild/linux-arm64": 0.25.5 - "@esbuild/linux-ia32": 0.25.5 - "@esbuild/linux-loong64": 0.25.5 - "@esbuild/linux-mips64el": 0.25.5 - "@esbuild/linux-ppc64": 0.25.5 - "@esbuild/linux-riscv64": 0.25.5 - "@esbuild/linux-s390x": 0.25.5 - "@esbuild/linux-x64": 0.25.5 - "@esbuild/netbsd-arm64": 0.25.5 - "@esbuild/netbsd-x64": 0.25.5 - "@esbuild/openbsd-arm64": 0.25.5 - "@esbuild/openbsd-x64": 0.25.5 - "@esbuild/sunos-x64": 0.25.5 - "@esbuild/win32-arm64": 0.25.5 - "@esbuild/win32-ia32": 0.25.5 - "@esbuild/win32-x64": 0.25.5 + '@esbuild/aix-ppc64': 0.25.5 + '@esbuild/android-arm': 0.25.5 + '@esbuild/android-arm64': 0.25.5 + '@esbuild/android-x64': 0.25.5 + '@esbuild/darwin-arm64': 0.25.5 + '@esbuild/darwin-x64': 0.25.5 + '@esbuild/freebsd-arm64': 0.25.5 + '@esbuild/freebsd-x64': 0.25.5 + '@esbuild/linux-arm': 0.25.5 + '@esbuild/linux-arm64': 0.25.5 + '@esbuild/linux-ia32': 0.25.5 + '@esbuild/linux-loong64': 0.25.5 + '@esbuild/linux-mips64el': 0.25.5 + '@esbuild/linux-ppc64': 0.25.5 + '@esbuild/linux-riscv64': 0.25.5 + '@esbuild/linux-s390x': 0.25.5 + '@esbuild/linux-x64': 0.25.5 + '@esbuild/netbsd-arm64': 0.25.5 + '@esbuild/netbsd-x64': 0.25.5 + '@esbuild/openbsd-arm64': 0.25.5 + '@esbuild/openbsd-x64': 0.25.5 + '@esbuild/sunos-x64': 0.25.5 + '@esbuild/win32-arm64': 0.25.5 + '@esbuild/win32-ia32': 0.25.5 + '@esbuild/win32-x64': 0.25.5 esbuild@0.25.6: optionalDependencies: - "@esbuild/aix-ppc64": 0.25.6 - "@esbuild/android-arm": 0.25.6 - "@esbuild/android-arm64": 0.25.6 - "@esbuild/android-x64": 0.25.6 - "@esbuild/darwin-arm64": 0.25.6 - "@esbuild/darwin-x64": 0.25.6 - "@esbuild/freebsd-arm64": 0.25.6 - "@esbuild/freebsd-x64": 0.25.6 - "@esbuild/linux-arm": 0.25.6 - "@esbuild/linux-arm64": 0.25.6 - "@esbuild/linux-ia32": 0.25.6 - "@esbuild/linux-loong64": 0.25.6 - "@esbuild/linux-mips64el": 0.25.6 - "@esbuild/linux-ppc64": 0.25.6 - "@esbuild/linux-riscv64": 0.25.6 - "@esbuild/linux-s390x": 0.25.6 - "@esbuild/linux-x64": 0.25.6 - "@esbuild/netbsd-arm64": 0.25.6 - "@esbuild/netbsd-x64": 0.25.6 - "@esbuild/openbsd-arm64": 0.25.6 - "@esbuild/openbsd-x64": 0.25.6 - "@esbuild/openharmony-arm64": 0.25.6 - "@esbuild/sunos-x64": 0.25.6 - "@esbuild/win32-arm64": 0.25.6 - "@esbuild/win32-ia32": 0.25.6 - "@esbuild/win32-x64": 0.25.6 + '@esbuild/aix-ppc64': 0.25.6 + '@esbuild/android-arm': 0.25.6 + '@esbuild/android-arm64': 0.25.6 + '@esbuild/android-x64': 0.25.6 + '@esbuild/darwin-arm64': 0.25.6 + '@esbuild/darwin-x64': 0.25.6 + '@esbuild/freebsd-arm64': 0.25.6 + '@esbuild/freebsd-x64': 0.25.6 + '@esbuild/linux-arm': 0.25.6 + '@esbuild/linux-arm64': 0.25.6 + '@esbuild/linux-ia32': 0.25.6 + '@esbuild/linux-loong64': 0.25.6 + '@esbuild/linux-mips64el': 0.25.6 + '@esbuild/linux-ppc64': 0.25.6 + '@esbuild/linux-riscv64': 0.25.6 + '@esbuild/linux-s390x': 0.25.6 + '@esbuild/linux-x64': 0.25.6 + '@esbuild/netbsd-arm64': 0.25.6 + '@esbuild/netbsd-x64': 0.25.6 + '@esbuild/openbsd-arm64': 0.25.6 + '@esbuild/openbsd-x64': 0.25.6 + '@esbuild/openharmony-arm64': 0.25.6 + '@esbuild/sunos-x64': 0.25.6 + '@esbuild/win32-arm64': 0.25.6 + '@esbuild/win32-ia32': 0.25.6 + '@esbuild/win32-x64': 0.25.6 esbuild@0.25.9: optionalDependencies: - "@esbuild/aix-ppc64": 0.25.9 - "@esbuild/android-arm": 0.25.9 - "@esbuild/android-arm64": 0.25.9 - "@esbuild/android-x64": 0.25.9 - "@esbuild/darwin-arm64": 0.25.9 - "@esbuild/darwin-x64": 0.25.9 - "@esbuild/freebsd-arm64": 0.25.9 - "@esbuild/freebsd-x64": 0.25.9 - "@esbuild/linux-arm": 0.25.9 - "@esbuild/linux-arm64": 0.25.9 - "@esbuild/linux-ia32": 0.25.9 - "@esbuild/linux-loong64": 0.25.9 - "@esbuild/linux-mips64el": 0.25.9 - "@esbuild/linux-ppc64": 0.25.9 - "@esbuild/linux-riscv64": 0.25.9 - "@esbuild/linux-s390x": 0.25.9 - "@esbuild/linux-x64": 0.25.9 - "@esbuild/netbsd-arm64": 0.25.9 - "@esbuild/netbsd-x64": 0.25.9 - "@esbuild/openbsd-arm64": 0.25.9 - "@esbuild/openbsd-x64": 0.25.9 - "@esbuild/openharmony-arm64": 0.25.9 - "@esbuild/sunos-x64": 0.25.9 - "@esbuild/win32-arm64": 0.25.9 - "@esbuild/win32-ia32": 0.25.9 - "@esbuild/win32-x64": 0.25.9 + '@esbuild/aix-ppc64': 0.25.9 + '@esbuild/android-arm': 0.25.9 + '@esbuild/android-arm64': 0.25.9 + '@esbuild/android-x64': 0.25.9 + '@esbuild/darwin-arm64': 0.25.9 + '@esbuild/darwin-x64': 0.25.9 + '@esbuild/freebsd-arm64': 0.25.9 + '@esbuild/freebsd-x64': 0.25.9 + '@esbuild/linux-arm': 0.25.9 + '@esbuild/linux-arm64': 0.25.9 + '@esbuild/linux-ia32': 0.25.9 + '@esbuild/linux-loong64': 0.25.9 + '@esbuild/linux-mips64el': 0.25.9 + '@esbuild/linux-ppc64': 0.25.9 + '@esbuild/linux-riscv64': 0.25.9 + '@esbuild/linux-s390x': 0.25.9 + '@esbuild/linux-x64': 0.25.9 + '@esbuild/netbsd-arm64': 0.25.9 + '@esbuild/netbsd-x64': 0.25.9 + '@esbuild/openbsd-arm64': 0.25.9 + '@esbuild/openbsd-x64': 0.25.9 + '@esbuild/openharmony-arm64': 0.25.9 + '@esbuild/sunos-x64': 0.25.9 + '@esbuild/win32-arm64': 0.25.9 + '@esbuild/win32-ia32': 0.25.9 + '@esbuild/win32-x64': 0.25.9 escalade@3.2.0: {} @@ -14122,11 +10017,11 @@ snapshots: estree-util-attach-comments@3.0.0: dependencies: - "@types/estree": 1.0.8 + '@types/estree': 1.0.8 estree-util-build-jsx@3.0.1: dependencies: - "@types/estree-jsx": 1.0.5 + '@types/estree-jsx': 1.0.5 devlop: 1.1.0 estree-util-is-identifier-name: 3.0.0 estree-walker: 3.0.3 @@ -14135,31 +10030,31 @@ snapshots: estree-util-scope@1.0.0: dependencies: - "@types/estree": 1.0.8 + '@types/estree': 1.0.8 devlop: 1.1.0 estree-util-to-js@2.0.0: dependencies: - "@types/estree-jsx": 1.0.5 + '@types/estree-jsx': 1.0.5 astring: 1.9.0 source-map: 0.7.4 estree-util-visit@2.0.0: dependencies: - "@types/estree-jsx": 1.0.5 - "@types/unist": 3.0.3 + '@types/estree-jsx': 1.0.5 + '@types/unist': 3.0.3 estree-walker@2.0.2: {} estree-walker@3.0.3: dependencies: - "@types/estree": 1.0.6 + '@types/estree': 1.0.6 eventemitter3@5.0.1: {} execa@9.6.0: dependencies: - "@sindresorhus/merge-streams": 4.0.0 + '@sindresorhus/merge-streams': 4.0.0 cross-spawn: 7.0.6 figures: 6.1.0 get-stream: 9.0.1 @@ -14181,7 +10076,7 @@ snapshots: expressive-code-twoslash@0.5.3(@expressive-code/core@0.41.2)(expressive-code@0.41.2)(typescript@5.8.3): dependencies: - "@expressive-code/core": 0.41.2 + '@expressive-code/core': 0.41.2 expressive-code: 0.41.2 mdast-util-from-markdown: 2.0.2 mdast-util-gfm: 3.1.0 @@ -14193,10 +10088,10 @@ snapshots: expressive-code@0.41.2: dependencies: - "@expressive-code/core": 0.41.2 - "@expressive-code/plugin-frames": 0.41.2 - "@expressive-code/plugin-shiki": 0.41.2 - "@expressive-code/plugin-text-markers": 0.41.2 + '@expressive-code/core': 0.41.2 + '@expressive-code/plugin-frames': 0.41.2 + '@expressive-code/plugin-shiki': 0.41.2 + '@expressive-code/plugin-text-markers': 0.41.2 exsolve@1.0.4: {} @@ -14206,8 +10101,8 @@ snapshots: fast-glob@3.3.3: dependencies: - "@nodelib/fs.stat": 2.0.5 - "@nodelib/fs.walk": 1.2.8 + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 glob-parent: 5.1.2 merge2: 1.4.1 micromatch: 4.0.8 @@ -14254,12 +10149,12 @@ snapshots: fontace@0.3.0: dependencies: - "@types/fontkit": 2.0.8 + '@types/fontkit': 2.0.8 fontkit: 2.0.4 fontkit@2.0.4: dependencies: - "@swc/helpers": 0.5.17 + '@swc/helpers': 0.5.17 brotli: 1.3.3 clone: 2.1.2 dfa: 1.2.0 @@ -14311,7 +10206,7 @@ snapshots: get-stream@9.0.1: dependencies: - "@sec-ant/readable-stream": 0.4.1 + '@sec-ant/readable-stream': 0.4.1 is-stream: 4.0.1 get-tsconfig@4.10.0: @@ -14372,12 +10267,12 @@ snapshots: hast-util-embedded@3.0.0: dependencies: - "@types/hast": 3.0.4 + '@types/hast': 3.0.4 hast-util-is-element: 3.0.0 hast-util-format@1.1.0: dependencies: - "@types/hast": 3.0.4 + '@types/hast': 3.0.4 hast-util-embedded: 3.0.0 hast-util-minify-whitespace: 1.0.1 hast-util-phrasing: 3.0.1 @@ -14387,7 +10282,7 @@ snapshots: hast-util-from-html@2.0.3: dependencies: - "@types/hast": 3.0.4 + '@types/hast': 3.0.4 devlop: 1.1.0 hast-util-from-parse5: 8.0.3 parse5: 7.3.0 @@ -14396,8 +10291,8 @@ snapshots: hast-util-from-parse5@8.0.3: dependencies: - "@types/hast": 3.0.4 - "@types/unist": 3.0.3 + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 devlop: 1.1.0 hastscript: 9.0.1 property-information: 7.0.0 @@ -14407,19 +10302,19 @@ snapshots: hast-util-has-property@3.0.0: dependencies: - "@types/hast": 3.0.4 + '@types/hast': 3.0.4 hast-util-is-body-ok-link@3.0.1: dependencies: - "@types/hast": 3.0.4 + '@types/hast': 3.0.4 hast-util-is-element@3.0.0: dependencies: - "@types/hast": 3.0.4 + '@types/hast': 3.0.4 hast-util-minify-whitespace@1.0.1: dependencies: - "@types/hast": 3.0.4 + '@types/hast': 3.0.4 hast-util-embedded: 3.0.0 hast-util-is-element: 3.0.0 hast-util-whitespace: 3.0.0 @@ -14427,11 +10322,11 @@ snapshots: hast-util-parse-selector@4.0.0: dependencies: - "@types/hast": 3.0.4 + '@types/hast': 3.0.4 hast-util-phrasing@3.0.1: dependencies: - "@types/hast": 3.0.4 + '@types/hast': 3.0.4 hast-util-embedded: 3.0.0 hast-util-has-property: 3.0.0 hast-util-is-body-ok-link: 3.0.1 @@ -14439,9 +10334,9 @@ snapshots: hast-util-raw@9.1.0: dependencies: - "@types/hast": 3.0.4 - "@types/unist": 3.0.3 - "@ungap/structured-clone": 1.3.0 + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + '@ungap/structured-clone': 1.3.0 hast-util-from-parse5: 8.0.3 hast-util-to-parse5: 8.0.0 html-void-elements: 3.0.0 @@ -14455,8 +10350,8 @@ snapshots: hast-util-select@6.0.4: dependencies: - "@types/hast": 3.0.4 - "@types/unist": 3.0.3 + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 bcp-47-match: 2.0.3 comma-separated-tokens: 2.0.3 css-selector-parser: 3.0.5 @@ -14473,9 +10368,9 @@ snapshots: hast-util-to-estree@3.1.3: dependencies: - "@types/estree": 1.0.8 - "@types/estree-jsx": 1.0.5 - "@types/hast": 3.0.4 + '@types/estree': 1.0.8 + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 comma-separated-tokens: 2.0.3 devlop: 1.1.0 estree-util-attach-comments: 3.0.0 @@ -14494,8 +10389,8 @@ snapshots: hast-util-to-html@9.0.5: dependencies: - "@types/hast": 3.0.4 - "@types/unist": 3.0.3 + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 ccount: 2.0.1 comma-separated-tokens: 2.0.3 hast-util-whitespace: 3.0.0 @@ -14508,9 +10403,9 @@ snapshots: hast-util-to-jsx-runtime@2.3.6: dependencies: - "@types/estree": 1.0.8 - "@types/hast": 3.0.4 - "@types/unist": 3.0.3 + '@types/estree': 1.0.8 + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 comma-separated-tokens: 2.0.3 devlop: 1.1.0 estree-util-is-identifier-name: 3.0.0 @@ -14528,7 +10423,7 @@ snapshots: hast-util-to-parse5@8.0.0: dependencies: - "@types/hast": 3.0.4 + '@types/hast': 3.0.4 comma-separated-tokens: 2.0.3 devlop: 1.1.0 property-information: 6.5.0 @@ -14538,22 +10433,22 @@ snapshots: hast-util-to-string@3.0.1: dependencies: - "@types/hast": 3.0.4 + '@types/hast': 3.0.4 hast-util-to-text@4.0.2: dependencies: - "@types/hast": 3.0.4 - "@types/unist": 3.0.3 + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 hast-util-is-element: 3.0.0 unist-util-find-after: 5.0.0 hast-util-whitespace@3.0.0: dependencies: - "@types/hast": 3.0.4 + '@types/hast': 3.0.4 hastscript@9.0.1: dependencies: - "@types/hast": 3.0.4 + '@types/hast': 3.0.4 comma-separated-tokens: 2.0.3 hast-util-parse-selector: 4.0.0 property-information: 7.0.0 @@ -14596,7 +10491,7 @@ snapshots: i18next@23.16.8: dependencies: - "@babel/runtime": 7.26.9 + '@babel/runtime': 7.26.9 iconv-lite@0.6.3: dependencies: @@ -14671,7 +10566,7 @@ snapshots: is-reference@1.2.1: dependencies: - "@types/estree": 1.0.8 + '@types/estree': 1.0.8 is-stream@4.0.1: {} @@ -14699,7 +10594,7 @@ snapshots: istanbul-lib-source-maps@5.0.6: dependencies: - "@jridgewell/trace-mapping": 0.3.25 + '@jridgewell/trace-mapping': 0.3.25 debug: 4.4.3 istanbul-lib-coverage: 3.2.2 transitivePeerDependencies: @@ -14712,13 +10607,13 @@ snapshots: jackspeak@3.4.3: dependencies: - "@isaacs/cliui": 8.0.2 + '@isaacs/cliui': 8.0.2 optionalDependencies: - "@pkgjs/parseargs": 0.11.0 + '@pkgjs/parseargs': 0.11.0 jackspeak@4.1.1: dependencies: - "@isaacs/cliui": 8.0.2 + '@isaacs/cliui': 8.0.2 jiti@1.21.7: {} @@ -14732,9 +10627,9 @@ snapshots: jotai@2.14.0(@babel/core@7.28.4)(@babel/template@7.27.2)(@types/react@19.1.8)(react@19.1.0): optionalDependencies: - "@babel/core": 7.28.4 - "@babel/template": 7.27.2 - "@types/react": 19.1.8 + '@babel/core': 7.28.4 + '@babel/template': 7.27.2 + '@types/react': 19.1.8 react: 19.1.0 joycon@3.1.1: {} @@ -14749,7 +10644,7 @@ snapshots: jsdom@27.0.0(canvas@3.2.0)(postcss@8.5.6): dependencies: - "@asamuzakjp/dom-selector": 6.5.6 + '@asamuzakjp/dom-selector': 6.5.6 cssstyle: 5.3.1(postcss@8.5.6) data-urls: 6.0.0 decimal.js: 10.6.0 @@ -14908,16 +10803,16 @@ snapshots: magic-string@0.30.17: dependencies: - "@jridgewell/sourcemap-codec": 1.5.4 + '@jridgewell/sourcemap-codec': 1.5.4 magic-string@0.30.19: dependencies: - "@jridgewell/sourcemap-codec": 1.5.5 + '@jridgewell/sourcemap-codec': 1.5.5 magicast@0.3.5: dependencies: - "@babel/parser": 7.28.4 - "@babel/types": 7.26.5 + '@babel/parser': 7.28.4 + '@babel/types': 7.26.5 source-map-js: 1.2.1 make-dir@4.0.0: @@ -14965,14 +10860,14 @@ snapshots: mdast-util-definitions@6.0.0: dependencies: - "@types/mdast": 4.0.4 - "@types/unist": 3.0.3 + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 unist-util-visit: 5.0.0 mdast-util-directive@3.1.0: dependencies: - "@types/mdast": 4.0.4 - "@types/unist": 3.0.3 + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 ccount: 2.0.1 devlop: 1.1.0 mdast-util-from-markdown: 2.0.2 @@ -14985,15 +10880,15 @@ snapshots: mdast-util-find-and-replace@3.0.2: dependencies: - "@types/mdast": 4.0.4 + '@types/mdast': 4.0.4 escape-string-regexp: 5.0.0 unist-util-is: 6.0.0 unist-util-visit-parents: 6.0.1 mdast-util-from-markdown@2.0.2: dependencies: - "@types/mdast": 4.0.4 - "@types/unist": 3.0.3 + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 decode-named-character-reference: 1.1.0 devlop: 1.1.0 mdast-util-to-string: 4.0.0 @@ -15009,7 +10904,7 @@ snapshots: mdast-util-gfm-autolink-literal@2.0.1: dependencies: - "@types/mdast": 4.0.4 + '@types/mdast': 4.0.4 ccount: 2.0.1 devlop: 1.1.0 mdast-util-find-and-replace: 3.0.2 @@ -15017,7 +10912,7 @@ snapshots: mdast-util-gfm-footnote@2.1.0: dependencies: - "@types/mdast": 4.0.4 + '@types/mdast': 4.0.4 devlop: 1.1.0 mdast-util-from-markdown: 2.0.2 mdast-util-to-markdown: 2.1.2 @@ -15027,7 +10922,7 @@ snapshots: mdast-util-gfm-strikethrough@2.0.0: dependencies: - "@types/mdast": 4.0.4 + '@types/mdast': 4.0.4 mdast-util-from-markdown: 2.0.2 mdast-util-to-markdown: 2.1.2 transitivePeerDependencies: @@ -15035,7 +10930,7 @@ snapshots: mdast-util-gfm-table@2.0.0: dependencies: - "@types/mdast": 4.0.4 + '@types/mdast': 4.0.4 devlop: 1.1.0 markdown-table: 3.0.4 mdast-util-from-markdown: 2.0.2 @@ -15045,7 +10940,7 @@ snapshots: mdast-util-gfm-task-list-item@2.0.0: dependencies: - "@types/mdast": 4.0.4 + '@types/mdast': 4.0.4 devlop: 1.1.0 mdast-util-from-markdown: 2.0.2 mdast-util-to-markdown: 2.1.2 @@ -15066,8 +10961,8 @@ snapshots: mdast-util-math@3.0.0: dependencies: - "@types/hast": 3.0.4 - "@types/mdast": 4.0.4 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 devlop: 1.1.0 longest-streak: 3.1.0 mdast-util-from-markdown: 2.0.2 @@ -15078,9 +10973,9 @@ snapshots: mdast-util-mdx-expression@2.0.1: dependencies: - "@types/estree-jsx": 1.0.5 - "@types/hast": 3.0.4 - "@types/mdast": 4.0.4 + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 devlop: 1.1.0 mdast-util-from-markdown: 2.0.2 mdast-util-to-markdown: 2.1.2 @@ -15089,10 +10984,10 @@ snapshots: mdast-util-mdx-jsx@3.2.0: dependencies: - "@types/estree-jsx": 1.0.5 - "@types/hast": 3.0.4 - "@types/mdast": 4.0.4 - "@types/unist": 3.0.3 + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 ccount: 2.0.1 devlop: 1.1.0 mdast-util-from-markdown: 2.0.2 @@ -15116,9 +11011,9 @@ snapshots: mdast-util-mdxjs-esm@2.0.1: dependencies: - "@types/estree-jsx": 1.0.5 - "@types/hast": 3.0.4 - "@types/mdast": 4.0.4 + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 devlop: 1.1.0 mdast-util-from-markdown: 2.0.2 mdast-util-to-markdown: 2.1.2 @@ -15127,14 +11022,14 @@ snapshots: mdast-util-phrasing@4.1.0: dependencies: - "@types/mdast": 4.0.4 + '@types/mdast': 4.0.4 unist-util-is: 6.0.0 mdast-util-to-hast@13.2.0: dependencies: - "@types/hast": 3.0.4 - "@types/mdast": 4.0.4 - "@ungap/structured-clone": 1.3.0 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@ungap/structured-clone': 1.3.0 devlop: 1.1.0 micromark-util-sanitize-uri: 2.0.1 trim-lines: 3.0.1 @@ -15144,8 +11039,8 @@ snapshots: mdast-util-to-markdown@2.1.2: dependencies: - "@types/mdast": 4.0.4 - "@types/unist": 3.0.3 + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 longest-streak: 3.1.0 mdast-util-phrasing: 4.1.0 mdast-util-to-string: 4.0.0 @@ -15156,7 +11051,7 @@ snapshots: mdast-util-to-string@4.0.0: dependencies: - "@types/mdast": 4.0.4 + '@types/mdast': 4.0.4 mdn-data@2.0.28: {} @@ -15259,7 +11154,7 @@ snapshots: micromark-extension-math@3.1.0: dependencies: - "@types/katex": 0.16.7 + '@types/katex': 0.16.7 devlop: 1.1.0 katex: 0.16.22 micromark-factory-space: 2.0.1 @@ -15269,7 +11164,7 @@ snapshots: micromark-extension-mdx-expression@3.0.0: dependencies: - "@types/estree": 1.0.8 + '@types/estree': 1.0.8 devlop: 1.1.0 micromark-factory-mdx-expression: 2.0.2 micromark-factory-space: 2.0.1 @@ -15280,8 +11175,8 @@ snapshots: micromark-extension-mdx-jsx@3.0.1: dependencies: - "@types/acorn": 4.0.6 - "@types/estree": 1.0.8 + '@types/acorn': 4.0.6 + '@types/estree': 1.0.8 devlop: 1.1.0 estree-util-is-identifier-name: 3.0.0 micromark-factory-mdx-expression: 2.0.2 @@ -15298,7 +11193,7 @@ snapshots: micromark-extension-mdxjs-esm@3.0.0: dependencies: - "@types/estree": 1.0.8 + '@types/estree': 1.0.8 devlop: 1.1.0 micromark-core-commonmark: 2.0.3 micromark-util-character: 2.1.1 @@ -15334,7 +11229,7 @@ snapshots: micromark-factory-mdx-expression@2.0.2: dependencies: - "@types/estree": 1.0.8 + '@types/estree': 1.0.8 devlop: 1.1.0 micromark-factory-space: 2.0.1 micromark-util-character: 2.1.1 @@ -15398,9 +11293,9 @@ snapshots: micromark-util-events-to-acorn@2.0.2: dependencies: - "@types/acorn": 4.0.6 - "@types/estree": 1.0.8 - "@types/unist": 3.0.3 + '@types/acorn': 4.0.6 + '@types/estree': 1.0.8 + '@types/unist': 3.0.3 devlop: 1.1.0 estree-util-visit: 2.0.0 micromark-util-symbol: 2.0.1 @@ -15436,7 +11331,7 @@ snapshots: micromark@4.0.1: dependencies: - "@types/debug": 4.1.12 + '@types/debug': 4.1.12 debug: 4.4.3 decode-named-character-reference: 1.1.0 devlop: 1.1.0 @@ -15470,7 +11365,7 @@ snapshots: minimatch@10.0.3: dependencies: - "@isaacs/brace-expansion": 5.0.0 + '@isaacs/brace-expansion': 5.0.0 minimatch@9.0.5: dependencies: @@ -15486,7 +11381,7 @@ snapshots: minipass: 7.1.2 mj-context-menu@0.6.1: {} - + mkdirp-classic@0.5.3: optional: true @@ -15519,13 +11414,13 @@ snapshots: monaco-editor@0.53.0: dependencies: - "@types/trusted-types": 1.0.6 + '@types/trusted-types': 1.0.6 moo@0.5.2: {} morphcharts@1.3.2: dependencies: - "@types/webxr": 0.4.0 + '@types/webxr': 0.4.0 gl-matrix: 3.4.4 motion-dom@12.23.7: @@ -15548,15 +11443,15 @@ snapshots: msw@2.10.2(@types/node@24.5.2)(typescript@5.8.3): dependencies: - "@bundled-es-modules/cookie": 2.0.1 - "@bundled-es-modules/statuses": 1.0.1 - "@bundled-es-modules/tough-cookie": 0.1.6 - "@inquirer/confirm": 5.1.18(@types/node@24.5.2) - "@mswjs/interceptors": 0.39.6 - "@open-draft/deferred-promise": 2.2.0 - "@open-draft/until": 2.1.0 - "@types/cookie": 0.6.0 - "@types/statuses": 2.0.6 + '@bundled-es-modules/cookie': 2.0.1 + '@bundled-es-modules/statuses': 1.0.1 + '@bundled-es-modules/tough-cookie': 0.1.6 + '@inquirer/confirm': 5.1.18(@types/node@24.5.2) + '@mswjs/interceptors': 0.39.6 + '@open-draft/deferred-promise': 2.2.0 + '@open-draft/until': 2.1.0 + '@types/cookie': 0.6.0 + '@types/statuses': 2.0.6 graphql: 16.11.0 headers-polyfill: 4.0.3 is-node-process: 1.2.0 @@ -15569,7 +11464,7 @@ snapshots: optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: - - "@types/node" + - '@types/node' optional: true muggle-string@0.4.1: {} @@ -15599,7 +11494,7 @@ snapshots: nlcst-to-string@4.0.0: dependencies: - "@types/nlcst": 2.0.3 + '@types/nlcst': 2.0.3 node-abi@3.77.0: dependencies: @@ -15696,17 +11591,17 @@ snapshots: pagefind@1.3.0: optionalDependencies: - "@pagefind/darwin-arm64": 1.3.0 - "@pagefind/darwin-x64": 1.3.0 - "@pagefind/linux-arm64": 1.3.0 - "@pagefind/linux-x64": 1.3.0 - "@pagefind/windows-x64": 1.3.0 + '@pagefind/darwin-arm64': 1.3.0 + '@pagefind/darwin-x64': 1.3.0 + '@pagefind/linux-arm64': 1.3.0 + '@pagefind/linux-x64': 1.3.0 + '@pagefind/windows-x64': 1.3.0 pako@0.2.9: {} parse-entities@4.0.2: dependencies: - "@types/unist": 2.0.11 + '@types/unist': 2.0.11 character-entities-legacy: 3.0.0 character-reference-invalid: 2.0.1 decode-named-character-reference: 1.1.0 @@ -15716,8 +11611,8 @@ snapshots: parse-latin@7.0.0: dependencies: - "@types/nlcst": 2.0.3 - "@types/unist": 3.0.3 + '@types/nlcst': 2.0.3 + '@types/unist': 3.0.3 nlcst-to-string: 4.0.0 unist-util-modify-children: 4.0.0 unist-util-visit-children: 3.0.0 @@ -15766,8 +11661,8 @@ snapshots: pkg-pr-new@0.0.41: dependencies: - "@jsdevtools/ez-spawn": 3.0.4 - "@octokit/action": 6.1.0 + '@jsdevtools/ez-spawn': 3.0.4 + '@octokit/action': 6.1.0 ignore: 5.3.2 isbinaryfile: 5.0.4 pkg-types: 1.3.1 @@ -16107,7 +12002,7 @@ snapshots: react-style-singleton: 2.2.3(@types/react@19.1.8)(react@19.1.0) tslib: 2.8.1 optionalDependencies: - "@types/react": 19.1.8 + '@types/react': 19.1.8 react-remove-scroll@2.7.1(@types/react@19.1.8)(react@19.1.0): dependencies: @@ -16118,7 +12013,7 @@ snapshots: use-callback-ref: 1.3.3(@types/react@19.1.8)(react@19.1.0) use-sidecar: 1.1.3(@types/react@19.1.8)(react@19.1.0) optionalDependencies: - "@types/react": 19.1.8 + '@types/react': 19.1.8 react-style-singleton@2.2.3(@types/react@19.1.8)(react@19.1.0): dependencies: @@ -16126,7 +12021,7 @@ snapshots: react: 19.1.0 tslib: 2.8.1 optionalDependencies: - "@types/react": 19.1.8 + '@types/react': 19.1.8 react@19.1.0: {} @@ -16140,7 +12035,7 @@ snapshots: recma-build-jsx@1.0.0: dependencies: - "@types/estree": 1.0.8 + '@types/estree': 1.0.8 estree-util-build-jsx: 3.0.1 vfile: 6.0.3 @@ -16156,14 +12051,14 @@ snapshots: recma-parse@1.0.0: dependencies: - "@types/estree": 1.0.8 + '@types/estree': 1.0.8 esast-util-from-js: 2.0.1 unified: 11.0.5 vfile: 6.0.3 recma-stringify@1.0.0: dependencies: - "@types/estree": 1.0.8 + '@types/estree': 1.0.8 estree-util-to-js: 2.0.0 unified: 11.0.5 vfile: 6.0.3 @@ -16186,13 +12081,13 @@ snapshots: rehype-format@5.0.1: dependencies: - "@types/hast": 3.0.4 + '@types/hast': 3.0.4 hast-util-format: 1.1.0 rehype-mathjax@7.1.0: dependencies: - "@types/hast": 3.0.4 - "@types/mathjax": 0.0.40 + '@types/hast': 3.0.4 + '@types/mathjax': 0.0.40 hast-util-to-text: 4.0.2 hastscript: 9.0.1 mathjax-full: 3.2.2 @@ -16202,40 +12097,40 @@ snapshots: rehype-parse@9.0.1: dependencies: - "@types/hast": 3.0.4 + '@types/hast': 3.0.4 hast-util-from-html: 2.0.3 unified: 11.0.5 rehype-raw@7.0.0: dependencies: - "@types/hast": 3.0.4 + '@types/hast': 3.0.4 hast-util-raw: 9.1.0 vfile: 6.0.3 rehype-recma@1.0.0: dependencies: - "@types/estree": 1.0.8 - "@types/hast": 3.0.4 + '@types/estree': 1.0.8 + '@types/hast': 3.0.4 hast-util-to-estree: 3.1.3 transitivePeerDependencies: - supports-color rehype-stringify@10.0.1: dependencies: - "@types/hast": 3.0.4 + '@types/hast': 3.0.4 hast-util-to-html: 9.0.5 unified: 11.0.5 rehype@13.0.2: dependencies: - "@types/hast": 3.0.4 + '@types/hast': 3.0.4 rehype-parse: 9.0.1 rehype-stringify: 10.0.1 unified: 11.0.5 remark-directive@3.0.1: dependencies: - "@types/mdast": 4.0.4 + '@types/mdast': 4.0.4 mdast-util-directive: 3.1.0 micromark-extension-directive: 3.0.2 unified: 11.0.5 @@ -16244,7 +12139,7 @@ snapshots: remark-gfm@4.0.1: dependencies: - "@types/mdast": 4.0.4 + '@types/mdast': 4.0.4 mdast-util-gfm: 3.1.0 micromark-extension-gfm: 3.0.0 remark-parse: 11.0.0 @@ -16255,7 +12150,7 @@ snapshots: remark-math@6.0.0: dependencies: - "@types/mdast": 4.0.4 + '@types/mdast': 4.0.4 mdast-util-math: 3.0.0 micromark-extension-math: 3.1.0 unified: 11.0.5 @@ -16271,7 +12166,7 @@ snapshots: remark-parse@11.0.0: dependencies: - "@types/mdast": 4.0.4 + '@types/mdast': 4.0.4 mdast-util-from-markdown: 2.0.2 micromark-util-types: 2.0.2 unified: 11.0.5 @@ -16280,8 +12175,8 @@ snapshots: remark-rehype@11.1.2: dependencies: - "@types/hast": 3.0.4 - "@types/mdast": 4.0.4 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 mdast-util-to-hast: 13.2.0 unified: 11.0.5 vfile: 6.0.3 @@ -16295,7 +12190,7 @@ snapshots: remark-stringify@11.0.0: dependencies: - "@types/mdast": 4.0.4 + '@types/mdast': 4.0.4 mdast-util-to-markdown: 2.1.2 unified: 11.0.5 @@ -16335,25 +12230,25 @@ snapshots: retext-latin@4.0.0: dependencies: - "@types/nlcst": 2.0.3 + '@types/nlcst': 2.0.3 parse-latin: 7.0.0 unified: 11.0.5 retext-smartypants@6.2.0: dependencies: - "@types/nlcst": 2.0.3 + '@types/nlcst': 2.0.3 nlcst-to-string: 4.0.0 unist-util-visit: 5.0.0 retext-stringify@4.0.0: dependencies: - "@types/nlcst": 2.0.3 + '@types/nlcst': 2.0.3 nlcst-to-string: 4.0.0 unified: 11.0.5 retext@9.0.0: dependencies: - "@types/nlcst": 2.0.3 + '@types/nlcst': 2.0.3 retext-latin: 4.0.0 retext-stringify: 4.0.0 unified: 11.0.5 @@ -16368,31 +12263,31 @@ snapshots: rollup: 4.34.8 typescript: 5.8.3 optionalDependencies: - "@babel/code-frame": 7.27.1 + '@babel/code-frame': 7.27.1 rollup@4.34.8: dependencies: - "@types/estree": 1.0.6 + '@types/estree': 1.0.6 optionalDependencies: - "@rollup/rollup-android-arm-eabi": 4.34.8 - "@rollup/rollup-android-arm64": 4.34.8 - "@rollup/rollup-darwin-arm64": 4.34.8 - "@rollup/rollup-darwin-x64": 4.34.8 - "@rollup/rollup-freebsd-arm64": 4.34.8 - "@rollup/rollup-freebsd-x64": 4.34.8 - "@rollup/rollup-linux-arm-gnueabihf": 4.34.8 - "@rollup/rollup-linux-arm-musleabihf": 4.34.8 - "@rollup/rollup-linux-arm64-gnu": 4.34.8 - "@rollup/rollup-linux-arm64-musl": 4.34.8 - "@rollup/rollup-linux-loongarch64-gnu": 4.34.8 - "@rollup/rollup-linux-powerpc64le-gnu": 4.34.8 - "@rollup/rollup-linux-riscv64-gnu": 4.34.8 - "@rollup/rollup-linux-s390x-gnu": 4.34.8 - "@rollup/rollup-linux-x64-gnu": 4.34.8 - "@rollup/rollup-linux-x64-musl": 4.34.8 - "@rollup/rollup-win32-arm64-msvc": 4.34.8 - "@rollup/rollup-win32-ia32-msvc": 4.34.8 - "@rollup/rollup-win32-x64-msvc": 4.34.8 + '@rollup/rollup-android-arm-eabi': 4.34.8 + '@rollup/rollup-android-arm64': 4.34.8 + '@rollup/rollup-darwin-arm64': 4.34.8 + '@rollup/rollup-darwin-x64': 4.34.8 + '@rollup/rollup-freebsd-arm64': 4.34.8 + '@rollup/rollup-freebsd-x64': 4.34.8 + '@rollup/rollup-linux-arm-gnueabihf': 4.34.8 + '@rollup/rollup-linux-arm-musleabihf': 4.34.8 + '@rollup/rollup-linux-arm64-gnu': 4.34.8 + '@rollup/rollup-linux-arm64-musl': 4.34.8 + '@rollup/rollup-linux-loongarch64-gnu': 4.34.8 + '@rollup/rollup-linux-powerpc64le-gnu': 4.34.8 + '@rollup/rollup-linux-riscv64-gnu': 4.34.8 + '@rollup/rollup-linux-s390x-gnu': 4.34.8 + '@rollup/rollup-linux-x64-gnu': 4.34.8 + '@rollup/rollup-linux-x64-musl': 4.34.8 + '@rollup/rollup-win32-arm64-msvc': 4.34.8 + '@rollup/rollup-win32-ia32-msvc': 4.34.8 + '@rollup/rollup-win32-x64-msvc': 4.34.8 fsevents: 2.3.3 rrweb-cssom@0.8.0: {} @@ -16427,27 +12322,27 @@ snapshots: detect-libc: 2.0.4 semver: 7.7.2 optionalDependencies: - "@img/sharp-darwin-arm64": 0.34.2 - "@img/sharp-darwin-x64": 0.34.2 - "@img/sharp-libvips-darwin-arm64": 1.1.0 - "@img/sharp-libvips-darwin-x64": 1.1.0 - "@img/sharp-libvips-linux-arm": 1.1.0 - "@img/sharp-libvips-linux-arm64": 1.1.0 - "@img/sharp-libvips-linux-ppc64": 1.1.0 - "@img/sharp-libvips-linux-s390x": 1.1.0 - "@img/sharp-libvips-linux-x64": 1.1.0 - "@img/sharp-libvips-linuxmusl-arm64": 1.1.0 - "@img/sharp-libvips-linuxmusl-x64": 1.1.0 - "@img/sharp-linux-arm": 0.34.2 - "@img/sharp-linux-arm64": 0.34.2 - "@img/sharp-linux-s390x": 0.34.2 - "@img/sharp-linux-x64": 0.34.2 - "@img/sharp-linuxmusl-arm64": 0.34.2 - "@img/sharp-linuxmusl-x64": 0.34.2 - "@img/sharp-wasm32": 0.34.2 - "@img/sharp-win32-arm64": 0.34.2 - "@img/sharp-win32-ia32": 0.34.2 - "@img/sharp-win32-x64": 0.34.2 + '@img/sharp-darwin-arm64': 0.34.2 + '@img/sharp-darwin-x64': 0.34.2 + '@img/sharp-libvips-darwin-arm64': 1.1.0 + '@img/sharp-libvips-darwin-x64': 1.1.0 + '@img/sharp-libvips-linux-arm': 1.1.0 + '@img/sharp-libvips-linux-arm64': 1.1.0 + '@img/sharp-libvips-linux-ppc64': 1.1.0 + '@img/sharp-libvips-linux-s390x': 1.1.0 + '@img/sharp-libvips-linux-x64': 1.1.0 + '@img/sharp-libvips-linuxmusl-arm64': 1.1.0 + '@img/sharp-libvips-linuxmusl-x64': 1.1.0 + '@img/sharp-linux-arm': 0.34.2 + '@img/sharp-linux-arm64': 0.34.2 + '@img/sharp-linux-s390x': 0.34.2 + '@img/sharp-linux-x64': 0.34.2 + '@img/sharp-linuxmusl-arm64': 0.34.2 + '@img/sharp-linuxmusl-x64': 0.34.2 + '@img/sharp-wasm32': 0.34.2 + '@img/sharp-win32-arm64': 0.34.2 + '@img/sharp-win32-ia32': 0.34.2 + '@img/sharp-win32-x64': 0.34.2 shebang-command@2.0.0: dependencies: @@ -16457,14 +12352,14 @@ snapshots: shiki@3.12.2: dependencies: - "@shikijs/core": 3.12.2 - "@shikijs/engine-javascript": 3.12.2 - "@shikijs/engine-oniguruma": 3.12.2 - "@shikijs/langs": 3.12.2 - "@shikijs/themes": 3.12.2 - "@shikijs/types": 3.12.2 - "@shikijs/vscode-textmate": 10.0.2 - "@types/hast": 3.0.4 + '@shikijs/core': 3.12.2 + '@shikijs/engine-javascript': 3.12.2 + '@shikijs/engine-oniguruma': 3.12.2 + '@shikijs/langs': 3.12.2 + '@shikijs/themes': 3.12.2 + '@shikijs/types': 3.12.2 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 siginfo@2.0.0: {} @@ -16488,7 +12383,7 @@ snapshots: sirv@3.0.1: dependencies: - "@polka/url": 1.0.0-next.29 + '@polka/url': 1.0.0-next.29 mrmime: 2.0.1 totalist: 3.0.1 @@ -16496,8 +12391,8 @@ snapshots: sitemap@8.0.0: dependencies: - "@types/node": 17.0.45 - "@types/sax": 1.2.7 + '@types/node': 17.0.45 + '@types/sax': 1.2.7 arg: 5.0.2 sax: 1.4.1 @@ -16517,7 +12412,7 @@ snapshots: speech-rule-engine@4.1.2: dependencies: - "@xmldom/xmldom": 0.9.8 + '@xmldom/xmldom': 0.9.8 commander: 13.1.0 wicked-good-xpath: 1.3.0 @@ -16531,10 +12426,10 @@ snapshots: starlight-blog@0.23.2(@astrojs/starlight@0.35.2(astro@5.13.7(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(rollup@4.34.8)(tsx@4.19.3)(typescript@5.8.3)(yaml@2.8.0)))(astro@5.13.7(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(rollup@4.34.8)(tsx@4.19.3)(typescript@5.8.3)(yaml@2.8.0)): dependencies: - "@astrojs/markdown-remark": 6.3.1 - "@astrojs/mdx": 4.2.6(astro@5.13.7(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(rollup@4.34.8)(tsx@4.19.3)(typescript@5.8.3)(yaml@2.8.0)) - "@astrojs/rss": 4.0.11 - "@astrojs/starlight": 0.35.2(astro@5.13.7(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(rollup@4.34.8)(tsx@4.19.3)(typescript@5.8.3)(yaml@2.8.0)) + '@astrojs/markdown-remark': 6.3.1 + '@astrojs/mdx': 4.2.6(astro@5.13.7(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(rollup@4.34.8)(tsx@4.19.3)(typescript@5.8.3)(yaml@2.8.0)) + '@astrojs/rss': 4.0.11 + '@astrojs/starlight': 0.35.2(astro@5.13.7(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(rollup@4.34.8)(tsx@4.19.3)(typescript@5.8.3)(yaml@2.8.0)) astro-remote: 0.3.3 github-slugger: 2.0.0 marked: 15.0.7 @@ -16548,7 +12443,7 @@ snapshots: starlight-typedoc@0.19.0(@astrojs/starlight@0.35.2(astro@5.13.7(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(rollup@4.34.8)(tsx@4.19.3)(typescript@5.8.3)(yaml@2.8.0)))(typedoc-plugin-markdown@4.4.2(typedoc@0.28.13(typescript@5.8.3)))(typedoc@0.28.13(typescript@5.8.3)): dependencies: - "@astrojs/starlight": 0.35.2(astro@5.13.7(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(rollup@4.34.8)(tsx@4.19.3)(typescript@5.8.3)(yaml@2.8.0)) + '@astrojs/starlight': 0.35.2(astro@5.13.7(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(rollup@4.34.8)(tsx@4.19.3)(typescript@5.8.3)(yaml@2.8.0)) github-slugger: 2.0.0 typedoc: 0.28.13(typescript@5.8.3) typedoc-plugin-markdown: 4.4.2(typedoc@0.28.13(typescript@5.8.3)) @@ -16633,7 +12528,7 @@ snapshots: sucrase@3.35.0: dependencies: - "@jridgewell/gen-mapping": 0.3.11 + '@jridgewell/gen-mapping': 0.3.11 commander: 4.1.1 glob: 10.4.5 lines-and-columns: 1.2.4 @@ -16649,7 +12544,7 @@ snapshots: svgo@3.3.2: dependencies: - "@trysound/sax": 0.2.0 + '@trysound/sax': 0.2.0 commander: 7.2.0 css-select: 5.1.0 css-tree: 2.3.1 @@ -16688,7 +12583,7 @@ snapshots: tar@7.4.3: dependencies: - "@isaacs/fs-minipass": 4.0.1 + '@isaacs/fs-minipass': 4.0.1 chownr: 3.0.0 minipass: 7.1.2 minizlib: 3.0.2 @@ -16697,7 +12592,7 @@ snapshots: test-exclude@7.0.1: dependencies: - "@istanbuljs/schema": 0.1.3 + '@istanbuljs/schema': 0.1.3 glob: 10.4.5 minimatch: 9.0.5 @@ -16864,7 +12759,7 @@ snapshots: twoslash@0.2.12(typescript@5.8.3): dependencies: - "@typescript/vfs": 1.6.1(typescript@5.8.3) + '@typescript/vfs': 1.6.1(typescript@5.8.3) twoslash-protocol: 0.2.12 typescript: 5.8.3 transitivePeerDependencies: @@ -16884,7 +12779,7 @@ snapshots: typedoc@0.28.13(typescript@5.8.3): dependencies: - "@gerrit0/mini-shiki": 3.13.0 + '@gerrit0/mini-shiki': 3.13.0 lunr: 2.3.9 markdown-it: 14.1.0 minimatch: 9.0.5 @@ -16909,12 +12804,12 @@ snapshots: unbuild@3.5.0(typescript@5.8.3): dependencies: - "@rollup/plugin-alias": 5.1.1(rollup@4.34.8) - "@rollup/plugin-commonjs": 28.0.3(rollup@4.34.8) - "@rollup/plugin-json": 6.1.0(rollup@4.34.8) - "@rollup/plugin-node-resolve": 16.0.1(rollup@4.34.8) - "@rollup/plugin-replace": 6.0.2(rollup@4.34.8) - "@rollup/pluginutils": 5.2.0(rollup@4.34.8) + '@rollup/plugin-alias': 5.1.1(rollup@4.34.8) + '@rollup/plugin-commonjs': 28.0.3(rollup@4.34.8) + '@rollup/plugin-json': 6.1.0(rollup@4.34.8) + '@rollup/plugin-node-resolve': 16.0.1(rollup@4.34.8) + '@rollup/plugin-replace': 6.0.2(rollup@4.34.8) + '@rollup/pluginutils': 5.2.0(rollup@4.34.8) citty: 0.1.6 consola: 3.4.0 defu: 6.1.4 @@ -16962,7 +12857,7 @@ snapshots: unified@11.0.5: dependencies: - "@types/unist": 3.0.3 + '@types/unist': 3.0.3 bail: 2.0.2 devlop: 1.1.0 extend: 3.0.2 @@ -16978,47 +12873,47 @@ snapshots: unist-util-find-after@5.0.0: dependencies: - "@types/unist": 3.0.3 + '@types/unist': 3.0.3 unist-util-is: 6.0.0 unist-util-is@6.0.0: dependencies: - "@types/unist": 3.0.3 + '@types/unist': 3.0.3 unist-util-modify-children@4.0.0: dependencies: - "@types/unist": 3.0.3 + '@types/unist': 3.0.3 array-iterate: 2.0.1 unist-util-position-from-estree@2.0.0: dependencies: - "@types/unist": 3.0.3 + '@types/unist': 3.0.3 unist-util-position@5.0.0: dependencies: - "@types/unist": 3.0.3 + '@types/unist': 3.0.3 unist-util-remove-position@5.0.0: dependencies: - "@types/unist": 3.0.3 + '@types/unist': 3.0.3 unist-util-visit: 5.0.0 unist-util-stringify-position@4.0.0: dependencies: - "@types/unist": 3.0.3 + '@types/unist': 3.0.3 unist-util-visit-children@3.0.0: dependencies: - "@types/unist": 3.0.3 + '@types/unist': 3.0.3 unist-util-visit-parents@6.0.1: dependencies: - "@types/unist": 3.0.3 + '@types/unist': 3.0.3 unist-util-is: 6.0.0 unist-util-visit@5.0.0: dependencies: - "@types/unist": 3.0.3 + '@types/unist': 3.0.3 unist-util-is: 6.0.0 unist-util-visit-parents: 6.0.1 @@ -17085,7 +12980,7 @@ snapshots: react: 19.1.0 tslib: 2.8.1 optionalDependencies: - "@types/react": 19.1.8 + '@types/react': 19.1.8 use-sidecar@1.1.3(@types/react@19.1.8)(react@19.1.0): dependencies: @@ -17093,7 +12988,7 @@ snapshots: react: 19.1.0 tslib: 2.8.1 optionalDependencies: - "@types/react": 19.1.8 + '@types/react': 19.1.8 util-deprecate@1.0.2: {} @@ -17101,27 +12996,27 @@ snapshots: vfile-location@5.0.3: dependencies: - "@types/unist": 3.0.3 + '@types/unist': 3.0.3 vfile: 6.0.3 vfile-message@4.0.2: dependencies: - "@types/unist": 3.0.3 + '@types/unist': 3.0.3 unist-util-stringify-position: 4.0.0 vfile-message@4.0.3: dependencies: - "@types/unist": 3.0.3 + '@types/unist': 3.0.3 unist-util-stringify-position: 4.0.0 vfile@6.0.3: dependencies: - "@types/unist": 3.0.3 + '@types/unist': 3.0.3 vfile-message: 4.0.3 vite-imagetools@7.1.0(rollup@4.34.8): dependencies: - "@rollup/pluginutils": 5.2.0(rollup@4.34.8) + '@rollup/pluginutils': 5.2.0(rollup@4.34.8) imagetools-core: 7.1.0 sharp: 0.34.2 transitivePeerDependencies: @@ -17135,7 +13030,7 @@ snapshots: pathe: 2.0.3 vite: 6.3.6(@types/node@24.5.2)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.1) transitivePeerDependencies: - - "@types/node" + - '@types/node' - jiti - less - lightningcss @@ -17156,7 +13051,7 @@ snapshots: pathe: 2.0.3 vite: 6.3.6(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.1) transitivePeerDependencies: - - "@types/node" + - '@types/node' - jiti - less - lightningcss @@ -17182,7 +13077,7 @@ snapshots: rollup: 4.34.8 tinyglobby: 0.2.15 optionalDependencies: - "@types/node": 24.5.2 + '@types/node': 24.5.2 fsevents: 2.3.3 jiti: 2.4.2 lightningcss: 1.30.1 @@ -17198,7 +13093,7 @@ snapshots: rollup: 4.34.8 tinyglobby: 0.2.15 optionalDependencies: - "@types/node": 24.5.2 + '@types/node': 24.5.2 fsevents: 2.3.3 jiti: 2.5.1 lightningcss: 1.30.1 @@ -17214,7 +13109,7 @@ snapshots: rollup: 4.34.8 tinyglobby: 0.2.15 optionalDependencies: - "@types/node": 24.3.0 + '@types/node': 24.3.0 fsevents: 2.3.3 jiti: 2.5.1 lightningcss: 1.30.1 @@ -17230,7 +13125,7 @@ snapshots: rollup: 4.34.8 tinyglobby: 0.2.15 optionalDependencies: - "@types/node": 24.5.2 + '@types/node': 24.5.2 fsevents: 2.3.3 jiti: 2.4.2 lightningcss: 1.30.1 @@ -17246,7 +13141,7 @@ snapshots: rollup: 4.34.8 tinyglobby: 0.2.15 optionalDependencies: - "@types/node": 24.5.2 + '@types/node': 24.5.2 fsevents: 2.3.3 jiti: 2.5.1 lightningcss: 1.30.1 @@ -17259,14 +13154,14 @@ snapshots: vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)(@vitest/browser@3.2.4)(jiti@2.4.2)(jsdom@27.0.0(canvas@3.2.0)(postcss@8.5.6))(lightningcss@1.30.1)(msw@2.10.2(@types/node@24.5.2)(typescript@5.8.3))(tsx@4.19.3)(yaml@2.8.1): dependencies: - "@types/chai": 5.2.2 - "@vitest/expect": 3.2.4 - "@vitest/mocker": 3.2.4(msw@2.10.2(@types/node@24.5.2)(typescript@5.8.3))(vite@6.3.5(@types/node@24.5.2)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.1)) - "@vitest/pretty-format": 3.2.4 - "@vitest/runner": 3.2.4 - "@vitest/snapshot": 3.2.4 - "@vitest/spy": 3.2.4 - "@vitest/utils": 3.2.4 + '@types/chai': 5.2.2 + '@vitest/expect': 3.2.4 + '@vitest/mocker': 3.2.4(msw@2.10.2(@types/node@24.5.2)(typescript@5.8.3))(vite@6.3.5(@types/node@24.5.2)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.1)) + '@vitest/pretty-format': 3.2.4 + '@vitest/runner': 3.2.4 + '@vitest/snapshot': 3.2.4 + '@vitest/spy': 3.2.4 + '@vitest/utils': 3.2.4 chai: 5.2.0 debug: 4.4.1 expect-type: 1.2.1 @@ -17283,9 +13178,9 @@ snapshots: vite-node: 3.2.4(@types/node@24.5.2)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.1) why-is-node-running: 2.3.0 optionalDependencies: - "@types/debug": 4.1.12 - "@types/node": 24.5.2 - "@vitest/browser": 3.2.4(msw@2.10.2(@types/node@24.5.2)(typescript@5.8.3))(vite@6.3.6(@types/node@24.5.2)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.1))(vitest@3.2.4) + '@types/debug': 4.1.12 + '@types/node': 24.5.2 + '@vitest/browser': 3.2.4(msw@2.10.2(@types/node@24.5.2)(typescript@5.8.3))(vite@6.3.6(@types/node@24.5.2)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.1))(vitest@3.2.4) jsdom: 27.0.0(canvas@3.2.0)(postcss@8.5.6) transitivePeerDependencies: - jiti @@ -17303,14 +13198,14 @@ snapshots: vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)(@vitest/browser@3.2.4)(jiti@2.5.1)(jsdom@27.0.0(canvas@3.2.0)(postcss@8.5.6))(lightningcss@1.30.1)(msw@2.10.2(@types/node@24.5.2)(typescript@5.8.3))(tsx@4.19.3)(yaml@2.8.1): dependencies: - "@types/chai": 5.2.2 - "@vitest/expect": 3.2.4 - "@vitest/mocker": 3.2.4(msw@2.10.2(@types/node@24.5.2)(typescript@5.8.3))(vite@6.3.5(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.1)) - "@vitest/pretty-format": 3.2.4 - "@vitest/runner": 3.2.4 - "@vitest/snapshot": 3.2.4 - "@vitest/spy": 3.2.4 - "@vitest/utils": 3.2.4 + '@types/chai': 5.2.2 + '@vitest/expect': 3.2.4 + '@vitest/mocker': 3.2.4(msw@2.10.2(@types/node@24.5.2)(typescript@5.8.3))(vite@6.3.5(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.1)) + '@vitest/pretty-format': 3.2.4 + '@vitest/runner': 3.2.4 + '@vitest/snapshot': 3.2.4 + '@vitest/spy': 3.2.4 + '@vitest/utils': 3.2.4 chai: 5.2.0 debug: 4.4.1 expect-type: 1.2.1 @@ -17327,9 +13222,9 @@ snapshots: vite-node: 3.2.4(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.1) why-is-node-running: 2.3.0 optionalDependencies: - "@types/debug": 4.1.12 - "@types/node": 24.5.2 - "@vitest/browser": 3.2.4(msw@2.10.2(@types/node@24.5.2)(typescript@5.8.3))(vite@6.3.5(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.1))(vitest@3.2.4) + '@types/debug': 4.1.12 + '@types/node': 24.5.2 + '@vitest/browser': 3.2.4(msw@2.10.2(@types/node@24.5.2)(typescript@5.8.3))(vite@6.3.5(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.1))(vitest@3.2.4) jsdom: 27.0.0(canvas@3.2.0)(postcss@8.5.6) transitivePeerDependencies: - jiti @@ -17351,16 +13246,16 @@ snapshots: vscode-languageserver-textdocument: 1.0.12 vscode-uri: 3.1.0 optionalDependencies: - "@volar/language-service": 2.4.11 + '@volar/language-service': 2.4.11 volar-service-emmet@0.0.62(@volar/language-service@2.4.11): dependencies: - "@emmetio/css-parser": 0.4.0 - "@emmetio/html-matcher": 1.3.0 - "@vscode/emmet-helper": 2.11.0 + '@emmetio/css-parser': 0.4.0 + '@emmetio/html-matcher': 1.3.0 + '@vscode/emmet-helper': 2.11.0 vscode-uri: 3.1.0 optionalDependencies: - "@volar/language-service": 2.4.11 + '@volar/language-service': 2.4.11 volar-service-html@0.0.62(@volar/language-service@2.4.11): dependencies: @@ -17368,20 +13263,20 @@ snapshots: vscode-languageserver-textdocument: 1.0.12 vscode-uri: 3.1.0 optionalDependencies: - "@volar/language-service": 2.4.11 + '@volar/language-service': 2.4.11 volar-service-prettier@0.0.62(@volar/language-service@2.4.11)(prettier@3.5.3): dependencies: vscode-uri: 3.1.0 optionalDependencies: - "@volar/language-service": 2.4.11 + '@volar/language-service': 2.4.11 prettier: 3.5.3 volar-service-typescript-twoslash-queries@0.0.62(@volar/language-service@2.4.11): dependencies: vscode-uri: 3.1.0 optionalDependencies: - "@volar/language-service": 2.4.11 + '@volar/language-service': 2.4.11 volar-service-typescript@0.0.62(@volar/language-service@2.4.11): dependencies: @@ -17392,25 +13287,25 @@ snapshots: vscode-nls: 5.2.0 vscode-uri: 3.1.0 optionalDependencies: - "@volar/language-service": 2.4.11 + '@volar/language-service': 2.4.11 volar-service-yaml@0.0.62(@volar/language-service@2.4.11): dependencies: vscode-uri: 3.1.0 yaml-language-server: 1.15.0 optionalDependencies: - "@volar/language-service": 2.4.11 + '@volar/language-service': 2.4.11 vscode-css-languageservice@6.3.2: dependencies: - "@vscode/l10n": 0.0.18 + '@vscode/l10n': 0.0.18 vscode-languageserver-textdocument: 1.0.12 vscode-languageserver-types: 3.17.5 vscode-uri: 3.1.0 vscode-html-languageservice@5.3.1: dependencies: - "@vscode/l10n": 0.0.18 + '@vscode/l10n': 0.0.18 vscode-languageserver-textdocument: 1.0.12 vscode-languageserver-types: 3.17.5 vscode-uri: 3.1.0 @@ -17481,8 +13376,7 @@ snapshots: wgsl-wasm-transpiler-bundler@0.0.1: {} - wgsl_reflect@https://codeload.github.com/mhawryluk/wgsl_reflect/tar.gz/85994fdc8d8a3abbb4f79baf3891e54eed0c1c63: - {} + wgsl_reflect@https://codeload.github.com/mhawryluk/wgsl_reflect/tar.gz/85994fdc8d8a3abbb4f79baf3891e54eed0c1c63: {} whatwg-encoding@3.1.1: dependencies: From 9e34138254dcbb83bbd232c3c595829af74e4c38 Mon Sep 17 00:00:00 2001 From: Szymon Szulc Date: Mon, 29 Sep 2025 17:31:31 +0200 Subject: [PATCH 57/64] nits --- .../content/docs/ecosystem/typegpu-noise.mdx | 2 +- .../src/examples/tests/uniformity/meta.json | 3 ++- .../src/examples/tests/uniformity/prngs.ts | 10 ++-------- packages/typegpu-noise/src/index.ts | 19 ++++++++++++++++--- 4 files changed, 21 insertions(+), 13 deletions(-) diff --git a/apps/typegpu-docs/src/content/docs/ecosystem/typegpu-noise.mdx b/apps/typegpu-docs/src/content/docs/ecosystem/typegpu-noise.mdx index 83d28cc00..0321944aa 100644 --- a/apps/typegpu-docs/src/content/docs/ecosystem/typegpu-noise.mdx +++ b/apps/typegpu-docs/src/content/docs/ecosystem/typegpu-noise.mdx @@ -1,4 +1,4 @@ ---- +e--- title: "@typegpu/noise" --- diff --git a/apps/typegpu-docs/src/examples/tests/uniformity/meta.json b/apps/typegpu-docs/src/examples/tests/uniformity/meta.json index b53380f0b..10c4c3a1a 100644 --- a/apps/typegpu-docs/src/examples/tests/uniformity/meta.json +++ b/apps/typegpu-docs/src/examples/tests/uniformity/meta.json @@ -1,5 +1,6 @@ { "title": "Uniformity", "category": "tests", - "tags": ["experimental"] + "tags": ["experimental"], + "dev": true } diff --git a/apps/typegpu-docs/src/examples/tests/uniformity/prngs.ts b/apps/typegpu-docs/src/examples/tests/uniformity/prngs.ts index 622b12a4a..9d2033742 100644 --- a/apps/typegpu-docs/src/examples/tests/uniformity/prngs.ts +++ b/apps/typegpu-docs/src/examples/tests/uniformity/prngs.ts @@ -1,14 +1,9 @@ -import { - BPETER, - DefaultGenerator, - type StatefulGenerator, -} from '@typegpu/noise'; +import { BPETER, type StatefulGenerator } from '@typegpu/noise'; import { LCG } from './lcg.ts'; export const PRNG = { - BPETER: 'bpeter', - DEFAULT_GENERATOR: 'default', + BPETER: 'bpeter (default)', LCG: 'lcg', } as const; @@ -16,7 +11,6 @@ export type PRNG = typeof PRNG[keyof typeof PRNG]; const PRNG_MAP = { [PRNG.BPETER]: BPETER, - [PRNG.DEFAULT_GENERATOR]: DefaultGenerator, [PRNG.LCG]: LCG, }; diff --git a/packages/typegpu-noise/src/index.ts b/packages/typegpu-noise/src/index.ts index ca4fd6269..97dc584cf 100644 --- a/packages/typegpu-noise/src/index.ts +++ b/packages/typegpu-noise/src/index.ts @@ -21,22 +21,35 @@ import { export const randf: { /** - * Sets the private seed of the thread. + * Threads do not share the generator's `State`. + * As a result, unless you change the seed in each thread, + * each thread will produce the same sequence. + * `randf.randSeed` sets the private seed of the thread. * @param seed seed value to set. For the best results, should be in [-1000, 1000] range. */ seed: typeof randSeed; /** - * Sets the private seed of the thread. + * Threads do not share the generator's `State`. + * As a result, unless you change the seed in each thread, + * each thread will produce the same sequence. + * `randf.randSeed2` sets the private seed of the thread. * @param seed seed value to set. For the best results, all elements should be in [-1000, 1000] range. */ seed2: typeof randSeed2; /** + * Threads do not share the generator's `State`. + * As a result, unless you change the seed in each thread, + * each thread will produce the same sequence. + * `randf.randSeed3` sets the private seed of the thread. * Sets the private seed of the thread. * @param seed seed value to set. For the best results, all elements should be in [-1000, 1000] range. */ seed3: typeof randSeed3; /** - * Sets the private seed of the thread. + * Threads do not share the generator's `State`. + * As a result, unless you change the seed in each thread, + * each thread will produce the same sequence. + * `randf.randSeed4` sets the private seed of the thread. * @param seed seed value to set. For the best results, all elements should be in [-1000, 1000] range. */ seed4: typeof randSeed4; From c89dc3bd00da62b21913dcc7691f80f25d77e0f2 Mon Sep 17 00:00:00 2001 From: Szymon Szulc Date: Mon, 29 Sep 2025 22:11:28 +0200 Subject: [PATCH 58/64] typo --- apps/typegpu-docs/src/content/docs/ecosystem/typegpu-noise.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/typegpu-docs/src/content/docs/ecosystem/typegpu-noise.mdx b/apps/typegpu-docs/src/content/docs/ecosystem/typegpu-noise.mdx index 0321944aa..83d28cc00 100644 --- a/apps/typegpu-docs/src/content/docs/ecosystem/typegpu-noise.mdx +++ b/apps/typegpu-docs/src/content/docs/ecosystem/typegpu-noise.mdx @@ -1,4 +1,4 @@ -e--- +--- title: "@typegpu/noise" --- From 8c9a9a9aa4f13def26f6c016d0ad33ee3b3368f6 Mon Sep 17 00:00:00 2001 From: Szymon Szulc Date: Mon, 29 Sep 2025 22:26:45 +0200 Subject: [PATCH 59/64] shellless --- .../content/docs/ecosystem/typegpu-noise.mdx | 31 ++++++++++--------- .../src/examples/tests/uniformity/index.ts | 3 +- .../src/examples/tests/uniformity/lcg.ts | 28 ++++++++++------- packages/typegpu-noise/src/generator.ts | 10 +++--- .../examples/individual/uniformity.test.ts | 4 +-- 5 files changed, 41 insertions(+), 35 deletions(-) diff --git a/apps/typegpu-docs/src/content/docs/ecosystem/typegpu-noise.mdx b/apps/typegpu-docs/src/content/docs/ecosystem/typegpu-noise.mdx index 83d28cc00..e2feb2a2a 100644 --- a/apps/typegpu-docs/src/content/docs/ecosystem/typegpu-noise.mdx +++ b/apps/typegpu-docs/src/content/docs/ecosystem/typegpu-noise.mdx @@ -286,13 +286,12 @@ const f = tgpu['~unstable'].computeFn({ workgroupSize: [1] })(() => { }); // ---cut--- import { - randomGeneratorShell, randomGeneratorSlot, type StatefulGenerator, } from '@typegpu/noise'; -const LCG: StatefulGenerator = (() => { - const seed = tgpu['~unstable'].privateVar(d.u32); +export const LCG: StatefulGenerator = (() => { + const seed = tgpu.privateVar(d.u32); const u32ToFloat = tgpu.fn([d.u32], d.f32)`(val){ let exponent: u32 = 0x3f800000; @@ -302,29 +301,33 @@ const LCG: StatefulGenerator = (() => { }`; return { - seed: tgpu.fn([d.f32])((value) => { + seed: (value: number) => { + 'kernel'; seed.$ = d.u32(value * std.pow(32, 3)); - }), - seed2: tgpu.fn([d.vec2f])((value) => { + }, + seed2: (value: d.v2f) => { + 'kernel'; seed.$ = d.u32(value.x * std.pow(32, 3) + value.y * std.pow(32, 2)); - }), - seed3: tgpu.fn([d.vec3f])((value) => { + }, + seed3: (value: d.v3f) => { + 'kernel'; seed.$ = d.u32( value.x * std.pow(32, 3) + value.y * std.pow(32, 2) + value.z * std.pow(32, 1), ); - }), - seed4: tgpu.fn([d.vec4f])((value) => { + }, + seed4: (value: d.v4f) => { + 'kernel'; seed.$ = d.u32( value.x * std.pow(32, 3) + value.y * std.pow(32, 2) + value.z * std.pow(32, 1) + value.w * std.pow(32, 0), ); - }), - sample: randomGeneratorShell(() => { + }, + sample: () => { 'kernel'; - seed.$ = seed.$ * 1664525 + 1013904223; // implicit modulo 2 ^ 32 + seed.$ = seed.$ * 1664525 + 1013904223; // % 2 ^ 32 return u32ToFloat(seed.$); - }), + }, }; })(); diff --git a/apps/typegpu-docs/src/examples/tests/uniformity/index.ts b/apps/typegpu-docs/src/examples/tests/uniformity/index.ts index 08850de75..3de6ceb89 100644 --- a/apps/typegpu-docs/src/examples/tests/uniformity/index.ts +++ b/apps/typegpu-docs/src/examples/tests/uniformity/index.ts @@ -2,7 +2,7 @@ import tgpu, { type TgpuRenderPipeline } from 'typegpu'; import * as d from 'typegpu/data'; import * as c from './constants.ts'; -import { PRNG } from './prngs.ts'; +import type { PRNG } from './prngs.ts'; import { executePipeline, preparePipeline } from './helpers.ts'; const root = await tgpu.init(); @@ -62,7 +62,6 @@ export const controls = { 'Test Resolution': import.meta.env.DEV && { onButtonClick: () => { c.prngs - .filter((prng) => prng !== PRNG.DEFAULT_GENERATOR) .map((prng) => tgpu.resolve({ externals: { diff --git a/apps/typegpu-docs/src/examples/tests/uniformity/lcg.ts b/apps/typegpu-docs/src/examples/tests/uniformity/lcg.ts index 147d609ae..739b09bb9 100644 --- a/apps/typegpu-docs/src/examples/tests/uniformity/lcg.ts +++ b/apps/typegpu-docs/src/examples/tests/uniformity/lcg.ts @@ -1,10 +1,10 @@ import tgpu from 'typegpu'; import * as d from 'typegpu/data'; import * as std from 'typegpu/std'; -import { randomGeneratorShell, type StatefulGenerator } from '@typegpu/noise'; +import type { StatefulGenerator } from '@typegpu/noise'; export const LCG: StatefulGenerator = (() => { - const seed = tgpu['~unstable'].privateVar(d.u32); + const seed = tgpu.privateVar(d.u32); const u32ToFloat = tgpu.fn([d.u32], d.f32)`(val){ let exponent: u32 = 0x3f800000; @@ -14,28 +14,32 @@ export const LCG: StatefulGenerator = (() => { }`; return { - seed: tgpu.fn([d.f32])((value) => { + seed: (value: number) => { + 'kernel'; seed.$ = d.u32(value * std.pow(32, 3)); - }), - seed2: tgpu.fn([d.vec2f])((value) => { + }, + seed2: (value: d.v2f) => { + 'kernel'; seed.$ = d.u32(value.x * std.pow(32, 3) + value.y * std.pow(32, 2)); - }), - seed3: tgpu.fn([d.vec3f])((value) => { + }, + seed3: (value: d.v3f) => { + 'kernel'; seed.$ = d.u32( value.x * std.pow(32, 3) + value.y * std.pow(32, 2) + value.z * std.pow(32, 1), ); - }), - seed4: tgpu.fn([d.vec4f])((value) => { + }, + seed4: (value: d.v4f) => { + 'kernel'; seed.$ = d.u32( value.x * std.pow(32, 3) + value.y * std.pow(32, 2) + value.z * std.pow(32, 1) + value.w * std.pow(32, 0), ); - }), - sample: randomGeneratorShell(() => { + }, + sample: () => { 'kernel'; seed.$ = seed.$ * 1664525 + 1013904223; // % 2 ^ 32 return u32ToFloat(seed.$); - }), + }, }; })(); diff --git a/packages/typegpu-noise/src/generator.ts b/packages/typegpu-noise/src/generator.ts index 070642aa3..f1c4e1047 100644 --- a/packages/typegpu-noise/src/generator.ts +++ b/packages/typegpu-noise/src/generator.ts @@ -3,11 +3,11 @@ import * as d from 'typegpu/data'; import { add, cos, dot, fract } from 'typegpu/std'; export interface StatefulGenerator { - seed: TgpuFn<(seed: d.F32) => d.Void>; - seed2: TgpuFn<(seed: d.Vec2f) => d.Void>; - seed3: TgpuFn<(seed: d.Vec3f) => d.Void>; - seed4: TgpuFn<(seed: d.Vec4f) => d.Void>; - sample: TgpuFn<() => d.F32>; + seed: TgpuFn<(seed: d.F32) => d.Void> | ((seed: number) => void); + seed2: TgpuFn<(seed: d.Vec2f) => d.Void> | ((seed: d.v2f) => void); + seed3: TgpuFn<(seed: d.Vec3f) => d.Void> | ((seed: d.v3f) => void); + seed4: TgpuFn<(seed: d.Vec4f) => d.Void> | ((seed: d.v4f) => void); + sample: TgpuFn<() => d.F32> | (() => number); } export const randomGeneratorShell: TgpuFnShell<[], d.F32> = tgpu.fn([], d.f32); diff --git a/packages/typegpu/tests/examples/individual/uniformity.test.ts b/packages/typegpu/tests/examples/individual/uniformity.test.ts index e2dc188e6..45e341f9a 100644 --- a/packages/typegpu/tests/examples/individual/uniformity.test.ts +++ b/packages/typegpu/tests/examples/individual/uniformity.test.ts @@ -91,12 +91,12 @@ describe('uniformity test example', () => { var seed_8: u32; - fn seed2_7(value: vec2f) { + fn item_7(value: vec2f) { seed_8 = u32(((value.x * 32768) + (value.y * 1024))); } fn randSeed2_6(seed: vec2f) { - seed2_7(seed); + item_7(seed); } fn u32ToFloat_11(val: u32) -> f32{ From 339309a9b4faf31b8f34c2fbefc7bd724ee7e58f Mon Sep 17 00:00:00 2001 From: Szymon Szulc Date: Tue, 30 Sep 2025 16:33:14 +0200 Subject: [PATCH 60/64] optional seeds --- .../src/content/docs/ecosystem/typegpu-noise.mdx | 14 -------------- .../src/examples/tests/uniformity/constants.ts | 2 +- .../src/examples/tests/uniformity/lcg.ts | 14 -------------- packages/typegpu-noise/src/generator.ts | 6 +++--- packages/typegpu-noise/src/random.ts | 6 +++--- 5 files changed, 7 insertions(+), 35 deletions(-) diff --git a/apps/typegpu-docs/src/content/docs/ecosystem/typegpu-noise.mdx b/apps/typegpu-docs/src/content/docs/ecosystem/typegpu-noise.mdx index e2feb2a2a..d0ec2e415 100644 --- a/apps/typegpu-docs/src/content/docs/ecosystem/typegpu-noise.mdx +++ b/apps/typegpu-docs/src/content/docs/ecosystem/typegpu-noise.mdx @@ -309,20 +309,6 @@ export const LCG: StatefulGenerator = (() => { 'kernel'; seed.$ = d.u32(value.x * std.pow(32, 3) + value.y * std.pow(32, 2)); }, - seed3: (value: d.v3f) => { - 'kernel'; - seed.$ = d.u32( - value.x * std.pow(32, 3) + value.y * std.pow(32, 2) + - value.z * std.pow(32, 1), - ); - }, - seed4: (value: d.v4f) => { - 'kernel'; - seed.$ = d.u32( - value.x * std.pow(32, 3) + value.y * std.pow(32, 2) + - value.z * std.pow(32, 1) + value.w * std.pow(32, 0), - ); - }, sample: () => { 'kernel'; seed.$ = seed.$ * 1664525 + 1013904223; // % 2 ^ 32 diff --git a/apps/typegpu-docs/src/examples/tests/uniformity/constants.ts b/apps/typegpu-docs/src/examples/tests/uniformity/constants.ts index 8422a66bd..ec44a5fb8 100644 --- a/apps/typegpu-docs/src/examples/tests/uniformity/constants.ts +++ b/apps/typegpu-docs/src/examples/tests/uniformity/constants.ts @@ -2,5 +2,5 @@ import { PRNG } from './prngs.ts'; export const gridSizes = [10, 25, 50, 100, 200, 500, 700, 1000]; export const initialGridSize = gridSizes[3]; -export const initialPRNG = PRNG.DEFAULT_GENERATOR; +export const initialPRNG = PRNG.BPETER; export const prngs: PRNG[] = Object.values(PRNG); diff --git a/apps/typegpu-docs/src/examples/tests/uniformity/lcg.ts b/apps/typegpu-docs/src/examples/tests/uniformity/lcg.ts index 739b09bb9..2a19b638d 100644 --- a/apps/typegpu-docs/src/examples/tests/uniformity/lcg.ts +++ b/apps/typegpu-docs/src/examples/tests/uniformity/lcg.ts @@ -22,20 +22,6 @@ export const LCG: StatefulGenerator = (() => { 'kernel'; seed.$ = d.u32(value.x * std.pow(32, 3) + value.y * std.pow(32, 2)); }, - seed3: (value: d.v3f) => { - 'kernel'; - seed.$ = d.u32( - value.x * std.pow(32, 3) + value.y * std.pow(32, 2) + - value.z * std.pow(32, 1), - ); - }, - seed4: (value: d.v4f) => { - 'kernel'; - seed.$ = d.u32( - value.x * std.pow(32, 3) + value.y * std.pow(32, 2) + - value.z * std.pow(32, 1) + value.w * std.pow(32, 0), - ); - }, sample: () => { 'kernel'; seed.$ = seed.$ * 1664525 + 1013904223; // % 2 ^ 32 diff --git a/packages/typegpu-noise/src/generator.ts b/packages/typegpu-noise/src/generator.ts index f1c4e1047..da76accfa 100644 --- a/packages/typegpu-noise/src/generator.ts +++ b/packages/typegpu-noise/src/generator.ts @@ -4,9 +4,9 @@ import { add, cos, dot, fract } from 'typegpu/std'; export interface StatefulGenerator { seed: TgpuFn<(seed: d.F32) => d.Void> | ((seed: number) => void); - seed2: TgpuFn<(seed: d.Vec2f) => d.Void> | ((seed: d.v2f) => void); - seed3: TgpuFn<(seed: d.Vec3f) => d.Void> | ((seed: d.v3f) => void); - seed4: TgpuFn<(seed: d.Vec4f) => d.Void> | ((seed: d.v4f) => void); + seed2?: TgpuFn<(seed: d.Vec2f) => d.Void> | ((seed: d.v2f) => void); + seed3?: TgpuFn<(seed: d.Vec3f) => d.Void> | ((seed: d.v3f) => void); + seed4?: TgpuFn<(seed: d.Vec4f) => d.Void> | ((seed: d.v4f) => void); sample: TgpuFn<() => d.F32> | (() => number); } diff --git a/packages/typegpu-noise/src/random.ts b/packages/typegpu-noise/src/random.ts index 6e49fb699..fa25334ce 100644 --- a/packages/typegpu-noise/src/random.ts +++ b/packages/typegpu-noise/src/random.ts @@ -27,17 +27,17 @@ export const randSeed: TgpuFn<(seed: d.F32) => d.Void> = tgpu export const randSeed2: TgpuFn<(seed: d.Vec2f) => d.Void> = tgpu .fn([d.vec2f])((seed) => { - randomGeneratorSlot.value.seed2(seed); + (randomGeneratorSlot.value.seed2 as (seed: d.v2f) => void)(seed); }); export const randSeed3: TgpuFn<(seed: d.Vec3f) => d.Void> = tgpu .fn([d.vec3f])((seed) => { - randomGeneratorSlot.value.seed3(seed); + (randomGeneratorSlot.value.seed3 as (seed: d.v3f) => void)(seed); }); export const randSeed4: TgpuFn<(seed: d.Vec4f) => d.Void> = tgpu .fn([d.vec4f])((seed) => { - randomGeneratorSlot.value.seed4(seed); + (randomGeneratorSlot.value.seed4 as (seed: d.v4f) => void)(seed); }); export const randFloat01: TgpuFn<() => d.F32> = tgpu From 3f112be1e64f4e35b8e3c698e15013c92b60a114 Mon Sep 17 00:00:00 2001 From: Szymon Szulc Date: Wed, 1 Oct 2025 12:12:27 +0200 Subject: [PATCH 61/64] more descriptive function name --- .../typegpu-docs/src/content/docs/ecosystem/typegpu-noise.mdx | 4 ++-- apps/typegpu-docs/src/examples/tests/uniformity/lcg.ts | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/typegpu-docs/src/content/docs/ecosystem/typegpu-noise.mdx b/apps/typegpu-docs/src/content/docs/ecosystem/typegpu-noise.mdx index d0ec2e415..7f18a6cc4 100644 --- a/apps/typegpu-docs/src/content/docs/ecosystem/typegpu-noise.mdx +++ b/apps/typegpu-docs/src/content/docs/ecosystem/typegpu-noise.mdx @@ -293,7 +293,7 @@ import { export const LCG: StatefulGenerator = (() => { const seed = tgpu.privateVar(d.u32); - const u32ToFloat = tgpu.fn([d.u32], d.f32)`(val){ + const u32To01Float = tgpu.fn([d.u32], d.f32)`(val){ let exponent: u32 = 0x3f800000; let mantissa: u32 = 0x007fffff & val; var ufloat: u32 = (exponent | mantissa); @@ -312,7 +312,7 @@ export const LCG: StatefulGenerator = (() => { sample: () => { 'kernel'; seed.$ = seed.$ * 1664525 + 1013904223; // % 2 ^ 32 - return u32ToFloat(seed.$); + return u32To01Float(seed.$); }, }; })(); diff --git a/apps/typegpu-docs/src/examples/tests/uniformity/lcg.ts b/apps/typegpu-docs/src/examples/tests/uniformity/lcg.ts index 2a19b638d..32641daf1 100644 --- a/apps/typegpu-docs/src/examples/tests/uniformity/lcg.ts +++ b/apps/typegpu-docs/src/examples/tests/uniformity/lcg.ts @@ -6,7 +6,7 @@ import type { StatefulGenerator } from '@typegpu/noise'; export const LCG: StatefulGenerator = (() => { const seed = tgpu.privateVar(d.u32); - const u32ToFloat = tgpu.fn([d.u32], d.f32)`(val){ + const u32To01Float = tgpu.fn([d.u32], d.f32)`(val){ let exponent: u32 = 0x3f800000; let mantissa: u32 = 0x007fffff & val; var ufloat: u32 = (exponent | mantissa); @@ -25,7 +25,7 @@ export const LCG: StatefulGenerator = (() => { sample: () => { 'kernel'; seed.$ = seed.$ * 1664525 + 1013904223; // % 2 ^ 32 - return u32ToFloat(seed.$); + return u32To01Float(seed.$); }, }; })(); From eb33788e69ad21b8a332cec858cb1d4f969010cc Mon Sep 17 00:00:00 2001 From: Szymon Szulc Date: Thu, 2 Oct 2025 12:16:40 +0200 Subject: [PATCH 62/64] Fix example test --- packages/typegpu/tests/examples/individual/uniformity.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/typegpu/tests/examples/individual/uniformity.test.ts b/packages/typegpu/tests/examples/individual/uniformity.test.ts index 45e341f9a..a54cd9a07 100644 --- a/packages/typegpu/tests/examples/individual/uniformity.test.ts +++ b/packages/typegpu/tests/examples/individual/uniformity.test.ts @@ -99,7 +99,7 @@ describe('uniformity test example', () => { item_7(seed); } - fn u32ToFloat_11(val: u32) -> f32{ + fn u32To01Float_11(val: u32) -> f32{ let exponent: u32 = 0x3f800000; let mantissa: u32 = 0x007fffff & val; var ufloat: u32 = (exponent | mantissa); @@ -108,7 +108,7 @@ describe('uniformity test example', () => { fn item_10() -> f32 { seed_8 = ((seed_8 * 1664525) + 1013904223); - return u32ToFloat_11(seed_8); + return u32To01Float_11(seed_8); } fn randFloat01_9() -> f32 { From 917588636ae55fe6e66a695f955a097ae389edd4 Mon Sep 17 00:00:00 2001 From: Szymon Szulc Date: Thu, 30 Oct 2025 11:57:58 +0100 Subject: [PATCH 63/64] review fixes --- .../src/content/docs/ecosystem/typegpu-noise.mdx | 6 +++--- .../src/examples/tests/uniformity/helpers.ts | 6 +++--- .../src/examples/tests/uniformity/lcg.ts | 6 +++--- .../src/examples/tests/uniformity/vertex.ts | 14 -------------- 4 files changed, 9 insertions(+), 23 deletions(-) delete mode 100644 apps/typegpu-docs/src/examples/tests/uniformity/vertex.ts diff --git a/apps/typegpu-docs/src/content/docs/ecosystem/typegpu-noise.mdx b/apps/typegpu-docs/src/content/docs/ecosystem/typegpu-noise.mdx index bd7c2d754..d3ad79c2b 100644 --- a/apps/typegpu-docs/src/content/docs/ecosystem/typegpu-noise.mdx +++ b/apps/typegpu-docs/src/content/docs/ecosystem/typegpu-noise.mdx @@ -302,15 +302,15 @@ export const LCG: StatefulGenerator = (() => { return { seed: (value: number) => { - 'kernel'; + 'use gpu'; seed.$ = d.u32(value * std.pow(32, 3)); }, seed2: (value: d.v2f) => { - 'kernel'; + 'use gpu'; seed.$ = d.u32(value.x * std.pow(32, 3) + value.y * std.pow(32, 2)); }, sample: () => { - 'kernel'; + 'use gpu'; seed.$ = seed.$ * 1664525 + 1013904223; // % 2 ^ 32 return u32To01Float(seed.$); }, diff --git a/apps/typegpu-docs/src/examples/tests/uniformity/helpers.ts b/apps/typegpu-docs/src/examples/tests/uniformity/helpers.ts index d77ebce83..af3594af5 100644 --- a/apps/typegpu-docs/src/examples/tests/uniformity/helpers.ts +++ b/apps/typegpu-docs/src/examples/tests/uniformity/helpers.ts @@ -1,8 +1,8 @@ -import type { TgpuRenderPipeline, TgpuRoot, TgpuUniform } from 'typegpu'; import { randomGeneratorSlot } from '@typegpu/noise'; +import type { TgpuRenderPipeline, TgpuRoot, TgpuUniform } from 'typegpu'; +import { fullScreenTriangle } from 'typegpu/common'; import type * as d from 'typegpu/data'; -import { fullScreenTriangleVertexShader } from './vertex.ts'; import { bindFullScreenGridFSWithUniforms } from './fragment.ts'; import { getPRNG, type PRNG } from './prngs.ts'; @@ -15,7 +15,7 @@ export const preparePipeline = ( ): TgpuRenderPipeline => root['~unstable'] .with(randomGeneratorSlot, getPRNG(prng)) - .withVertex(fullScreenTriangleVertexShader, {}) + .withVertex(fullScreenTriangle, {}) .withFragment( bindFullScreenGridFSWithUniforms(gridSizeUniform, canvasRatioUniform), { diff --git a/apps/typegpu-docs/src/examples/tests/uniformity/lcg.ts b/apps/typegpu-docs/src/examples/tests/uniformity/lcg.ts index 32641daf1..54af69a15 100644 --- a/apps/typegpu-docs/src/examples/tests/uniformity/lcg.ts +++ b/apps/typegpu-docs/src/examples/tests/uniformity/lcg.ts @@ -15,15 +15,15 @@ export const LCG: StatefulGenerator = (() => { return { seed: (value: number) => { - 'kernel'; + 'use gpu'; seed.$ = d.u32(value * std.pow(32, 3)); }, seed2: (value: d.v2f) => { - 'kernel'; + 'use gpu'; seed.$ = d.u32(value.x * std.pow(32, 3) + value.y * std.pow(32, 2)); }, sample: () => { - 'kernel'; + 'use gpu'; seed.$ = seed.$ * 1664525 + 1013904223; // % 2 ^ 32 return u32To01Float(seed.$); }, diff --git a/apps/typegpu-docs/src/examples/tests/uniformity/vertex.ts b/apps/typegpu-docs/src/examples/tests/uniformity/vertex.ts deleted file mode 100644 index a818ba642..000000000 --- a/apps/typegpu-docs/src/examples/tests/uniformity/vertex.ts +++ /dev/null @@ -1,14 +0,0 @@ -import tgpu from 'typegpu'; -import * as d from 'typegpu/data'; - -export const fullScreenTriangleVertexShader = tgpu['~unstable'].vertexFn({ - in: { vertexIndex: d.builtin.vertexIndex }, - out: { pos: d.builtin.position, uv: d.vec2f }, -})((input) => { - const pos = [d.vec2f(-1, -1), d.vec2f(3, -1), d.vec2f(-1, 3)]; - - return { - pos: d.vec4f(pos[input.vertexIndex], 0.0, 1.0), - uv: pos[input.vertexIndex], - }; -}); From 969b27002e25242f292a9bc4d4b7dc04020f7651 Mon Sep 17 00:00:00 2001 From: Szymon Szulc Date: Thu, 30 Oct 2025 11:58:58 +0100 Subject: [PATCH 64/64] update wgsl test --- .../examples/individual/uniformity.test.ts | 32 +++++++++++-------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/packages/typegpu/tests/examples/individual/uniformity.test.ts b/packages/typegpu/tests/examples/individual/uniformity.test.ts index a54cd9a07..ccaa44b5a 100644 --- a/packages/typegpu/tests/examples/individual/uniformity.test.ts +++ b/packages/typegpu/tests/examples/individual/uniformity.test.ts @@ -20,18 +20,20 @@ describe('uniformity test example', () => { }, device); expect(shaderCodes).toMatchInlineSnapshot(` - "struct fullScreenTriangleVertexShader_Output_1 { + "struct fullScreenTriangle_Input_1 { + @builtin(vertex_index) vertexIndex: u32, + } + + struct fullScreenTriangle_Output_2 { @builtin(position) pos: vec4f, @location(0) uv: vec2f, } - struct fullScreenTriangleVertexShader_Input_2 { - @builtin(vertex_index) vertexIndex: u32, - } + @vertex fn fullScreenTriangle_0(in: fullScreenTriangle_Input_1) -> fullScreenTriangle_Output_2 { + const pos = array(vec2f(-1, -1), vec2f(3, -1), vec2f(-1, 3)); + const uv = array(vec2f(0, 1), vec2f(2, 1), vec2f(0, -1)); - @vertex fn fullScreenTriangleVertexShader_0(input: fullScreenTriangleVertexShader_Input_2) -> fullScreenTriangleVertexShader_Output_1 { - var pos = array(vec2f(-1, -1), vec2f(3, -1), vec2f(-1, 3)); - return fullScreenTriangleVertexShader_Output_1(vec4f(pos[input.vertexIndex], 0, 1), pos[input.vertexIndex]); + return fullScreenTriangle_Output_2(vec4f(pos[in.vertexIndex], 0, 1), uv[in.vertexIndex]); } @group(0) @binding(0) var canvasRatioUniform_4: f32; @@ -71,18 +73,20 @@ describe('uniformity test example', () => { return vec4f(vec3f(randFloat01_9()), 1); } - struct fullScreenTriangleVertexShader_Output_1 { + struct fullScreenTriangle_Input_1 { + @builtin(vertex_index) vertexIndex: u32, + } + + struct fullScreenTriangle_Output_2 { @builtin(position) pos: vec4f, @location(0) uv: vec2f, } - struct fullScreenTriangleVertexShader_Input_2 { - @builtin(vertex_index) vertexIndex: u32, - } + @vertex fn fullScreenTriangle_0(in: fullScreenTriangle_Input_1) -> fullScreenTriangle_Output_2 { + const pos = array(vec2f(-1, -1), vec2f(3, -1), vec2f(-1, 3)); + const uv = array(vec2f(0, 1), vec2f(2, 1), vec2f(0, -1)); - @vertex fn fullScreenTriangleVertexShader_0(input: fullScreenTriangleVertexShader_Input_2) -> fullScreenTriangleVertexShader_Output_1 { - var pos = array(vec2f(-1, -1), vec2f(3, -1), vec2f(-1, 3)); - return fullScreenTriangleVertexShader_Output_1(vec4f(pos[input.vertexIndex], 0, 1), pos[input.vertexIndex]); + return fullScreenTriangle_Output_2(vec4f(pos[in.vertexIndex], 0, 1), uv[in.vertexIndex]); } @group(0) @binding(0) var canvasRatioUniform_4: f32;

( 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 From 04c2d14e683492fb19d6cd8f08ef802282eb2dea Mon Sep 17 00:00:00 2001 From: Szymon Szulc Date: Tue, 19 Aug 2025 11:37:53 +0200 Subject: [PATCH 24/64] Left console.logs --- .../src/content/examples/simple/probability/executor.ts | 2 -- .../src/content/examples/simple/probability/index.ts | 3 --- 2 files changed, 5 deletions(-) diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/executor.ts b/apps/typegpu-docs/src/content/examples/simple/probability/executor.ts index c62e750d6..4f9671666 100644 --- a/apps/typegpu-docs/src/content/examples/simple/probability/executor.ts +++ b/apps/typegpu-docs/src/content/examples/simple/probability/executor.ts @@ -91,8 +91,6 @@ export class Executor { return this.#samples.slice(0, this.#count); } - console.log('running pipeline'); - const pipeline = this.#root['~unstable'] .with(this.#sampleBufferSlot, this.#samplesBuffer.as('mutable')) .with(this.#distributionSlot, distribution) diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/index.ts b/apps/typegpu-docs/src/content/examples/simple/probability/index.ts index f70048ea4..958568b4f 100644 --- a/apps/typegpu-docs/src/content/examples/simple/probability/index.ts +++ b/apps/typegpu-docs/src/content/examples/simple/probability/index.ts @@ -55,7 +55,6 @@ export const controls = { options: c.executionModes, onSelectChange: async (value: ExecutionMode) => { if (currentExecutionMode === value) { - console.log(1); return; } @@ -69,7 +68,6 @@ export const controls = { options: c.distributions, onSelectChange: async (value: Distribution) => { if (currentDistribution === value) { - console.log(2); return; } @@ -88,7 +86,6 @@ export const controls = { options: c.numSamplesOptions, onSelectChange: async (value: number) => { if (value === executor.count) { - console.log(3); return; } From da6696e276513bc6d69fa9652979ccd500b749f1 Mon Sep 17 00:00:00 2001 From: Szymon Szulc Date: Tue, 19 Aug 2025 17:16:51 +0200 Subject: [PATCH 25/64] Not working animations - need to store transition buffer, change only when counts change ;( --- .../examples/simple/probability/constants.ts | 4 +- .../examples/simple/probability/executor.ts | 5 ++ .../examples/simple/probability/index.ts | 4 +- .../examples/simple/probability/plotter.ts | 54 ++++++++++++++++++- 4 files changed, 62 insertions(+), 5 deletions(-) diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/constants.ts b/apps/typegpu-docs/src/content/examples/simple/probability/constants.ts index bb2856e85..f984f3011 100644 --- a/apps/typegpu-docs/src/content/examples/simple/probability/constants.ts +++ b/apps/typegpu-docs/src/content/examples/simple/probability/constants.ts @@ -3,8 +3,8 @@ import { Distribution, ExecutionMode } from './types.ts'; export const cameraPositionGeo = [0, 0, 0.5]; export const cameraPositionHist = [0, 0, 0.2]; export const initialCameraAngle = 15; -export const initialNumSamples = 5000; -export const numSamplesOptions = [100, 500, 1000, 5000, 10000, 50000]; +export const initialNumSamples = 2000; +export const numSamplesOptions = [100, 1000, 2000, 5000, 10000, 50000]; export const initialDistribution: Distribution = Distribution.SAMPLE; export const distributions: Distribution[] = Object.values(Distribution); export const initialExecutionMode: ExecutionMode = ExecutionMode.SINGLE; diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/executor.ts b/apps/typegpu-docs/src/content/examples/simple/probability/executor.ts index 4f9671666..f2a923faf 100644 --- a/apps/typegpu-docs/src/content/examples/simple/probability/executor.ts +++ b/apps/typegpu-docs/src/content/examples/simple/probability/executor.ts @@ -91,6 +91,11 @@ export class Executor { return this.#samples.slice(0, this.#count); } + if (forceReExec) { + this.#maxCount = 0; + this.count = this.#count; + } + const pipeline = this.#root['~unstable'] .with(this.#sampleBufferSlot, this.#samplesBuffer.as('mutable')) .with(this.#distributionSlot, distribution) diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/index.ts b/apps/typegpu-docs/src/content/examples/simple/probability/index.ts index 958568b4f..dcd08537a 100644 --- a/apps/typegpu-docs/src/content/examples/simple/probability/index.ts +++ b/apps/typegpu-docs/src/content/examples/simple/probability/index.ts @@ -36,7 +36,7 @@ const replot = async ( } samples = await verdict(prng.prng, forceReExec); - plotter.plot(samples, prng); + plotter.plot(samples, prng, animate); }; await replot(currentDistribution, currentExecutionMode); @@ -75,7 +75,7 @@ export const controls = { await replot( currentDistribution, currentExecutionMode, - true, + false, true, ); plotter.resetView(getCameraPosition(currentDistribution)); diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/plotter.ts b/apps/typegpu-docs/src/content/examples/simple/probability/plotter.ts index 51a59cbc2..65e34bec8 100644 --- a/apps/typegpu-docs/src/content/examples/simple/probability/plotter.ts +++ b/apps/typegpu-docs/src/content/examples/simple/probability/plotter.ts @@ -15,6 +15,8 @@ const defaultColorSpread = 32; const defaultMinValue = -10; const defaultMaxValue = 10; const heightToBase = 7; +const transitionTime = 1000; // milliseconds +const defaultStaggering = 1; // geometric const defaultSize = 0.17; @@ -35,9 +37,11 @@ export class Plotter { defaultColorSpread, false, ); + this.#core.config.transitionStaggering = defaultStaggering; + this.#core.renderer.transitionTime = 1; } - plot(samples: d.v3f[], prng: PRNG) { + async plot(samples: d.v3f[], prng: PRNG, animate = false) { switch (prng.plotType) { case PlotType.GEOMETRIC: { @@ -67,7 +71,15 @@ export class Plotter { ); } + if (animate) { + this.makeRoomForNewPlot(); + } + this.#plotGeometric(data, this.#core); + + if (animate) { + await this.distributionsTransition(); + } } break; case PlotType.CONTINUOUS: @@ -133,7 +145,15 @@ export class Plotter { data.sizeX = guessedBinXZSize; data.sizeZ = guessedBinXZSize; + if (animate) { + this.makeRoomForNewPlot(); + } + this.#plotHistogram(data, this.#core, false); + + if (animate) { + await this.distributionsTransition(); + } } break; case PlotType.DISCRETE: @@ -193,7 +213,15 @@ export class Plotter { data.sizeX = guessedBinXZSize; data.sizeZ = guessedBinXZSize; + if (animate) { + this.makeRoomForNewPlot(); + } + this.#plotHistogram(data, this.#core, true); + + if (animate) { + await this.distributionsTransition(); + } } break; } @@ -217,6 +245,30 @@ export class Plotter { this.#core.camera.setPosition(cameraPos, true); } + makeRoomForNewPlot() { + this.#core.renderer.transitionBuffers[0].swap(); + this.#core.renderer.transitionTime = 0; + } + + distributionsTransition(): Promise { + const start = performance.now(); + + return new Promise((resolve) => { + const animateTransition = (time: number) => { + const duration = Math.max(time - start, 0); + + this.#core.renderer.transitionTime = duration / transitionTime; + + if (duration < transitionTime) { + requestAnimationFrame(animateTransition); + } else { + resolve(); + } + }; + requestAnimationFrame(animateTransition); + }); + } + #plotGeometric(data: GeometricData, core: MorphCharts.Core) { const transitionBuffer = this.#core.renderer.createTransitionBuffer( data.ids, From 028ba896dbdf619d5faa4a6c89b73e59cb5deec9 Mon Sep 17 00:00:00 2001 From: Szymon Szulc Date: Wed, 20 Aug 2025 09:59:24 +0200 Subject: [PATCH 26/64] Fixed force reexe --- .../examples/simple/probability/executor.ts | 15 ++++++++++----- .../content/examples/simple/probability/index.ts | 4 ++-- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/executor.ts b/apps/typegpu-docs/src/content/examples/simple/probability/executor.ts index f2a923faf..379554637 100644 --- a/apps/typegpu-docs/src/content/examples/simple/probability/executor.ts +++ b/apps/typegpu-docs/src/content/examples/simple/probability/executor.ts @@ -85,13 +85,13 @@ export class Executor { async executeSingleWorker( distribution: TgpuFn<() => d.Vec3f>, - forceReExec = false, + forceReexec = false, ): Promise { - if (this.#samples.length !== 0 && !forceReExec) { + if (this.#samples.length !== 0 && !forceReexec) { return this.#samples.slice(0, this.#count); } - if (forceReExec) { + if (forceReexec) { this.#maxCount = 0; this.count = this.#count; } @@ -110,12 +110,17 @@ export class Executor { async executeMoreWorkers( distribution: TgpuFn<() => d.Vec3f>, - forceReExec = false, + forceReexec = false, ): Promise { - if (this.#samples.length !== 0 && !forceReExec) { + if (this.#samples.length !== 0 && !forceReexec) { return this.#samples.slice(0, this.#count); } + if (forceReexec) { + this.#maxCount = 0; + this.count = this.#count; + } + const pipeline = this.#root['~unstable'] .with(this.#sampleBufferSlot, this.#samplesBuffer.as('mutable')) .with(this.#distributionSlot, distribution) diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/index.ts b/apps/typegpu-docs/src/content/examples/simple/probability/index.ts index dcd08537a..a2db15629 100644 --- a/apps/typegpu-docs/src/content/examples/simple/probability/index.ts +++ b/apps/typegpu-docs/src/content/examples/simple/probability/index.ts @@ -18,7 +18,7 @@ const replot = async ( currentDistribution: Distribution, execMod: ExecutionMode, animate = false, - forceReExec = false, + forceReexec = false, ) => { let samples = undefined; let verdict = undefined; @@ -35,7 +35,7 @@ const replot = async ( } } - samples = await verdict(prng.prng, forceReExec); + samples = await verdict(prng.prng, forceReexec); plotter.plot(samples, prng, animate); }; From 515d56e0befff1872d6e13ac064056ba7d24f930 Mon Sep 17 00:00:00 2001 From: Szymon Szulc Date: Wed, 20 Aug 2025 11:46:09 +0200 Subject: [PATCH 27/64] Working transitions! --- .../examples/simple/probability/index.ts | 2 +- .../examples/simple/probability/plotter.ts | 157 +++++++++++------- 2 files changed, 99 insertions(+), 60 deletions(-) diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/index.ts b/apps/typegpu-docs/src/content/examples/simple/probability/index.ts index a2db15629..5cd9e6189 100644 --- a/apps/typegpu-docs/src/content/examples/simple/probability/index.ts +++ b/apps/typegpu-docs/src/content/examples/simple/probability/index.ts @@ -59,7 +59,7 @@ export const controls = { } currentExecutionMode = value; - await replot(currentDistribution, currentExecutionMode, false, true); + await replot(currentDistribution, currentExecutionMode, true, true); plotter.resetView(getCameraPosition(currentDistribution)); }, }, diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/plotter.ts b/apps/typegpu-docs/src/content/examples/simple/probability/plotter.ts index 65e34bec8..5826c9c4e 100644 --- a/apps/typegpu-docs/src/content/examples/simple/probability/plotter.ts +++ b/apps/typegpu-docs/src/content/examples/simple/probability/plotter.ts @@ -1,5 +1,6 @@ import * as MorphCharts from 'morphcharts'; import type * as d from 'typegpu/data'; +import { clamp } from 'typegpu/std'; import { type GeometricData, @@ -15,8 +16,9 @@ const defaultColorSpread = 32; const defaultMinValue = -10; const defaultMaxValue = 10; const heightToBase = 7; -const transitionTime = 1000; // milliseconds -const defaultStaggering = 1; +const transitionTime = 500; // milliseconds +const defaultStaggering = 0.7; +const defaultAxesSwapMoment = 1; // geometric const defaultSize = 0.17; @@ -24,6 +26,9 @@ const defaultSize = 0.17; export class Plotter { readonly #core; readonly #palette; + #transitionBuffer: MorphCharts.ITransitionBufferVisual | undefined = + undefined; + #count = 0; constructor() { this.#core = new MorphCharts.Core({ @@ -38,27 +43,32 @@ export class Plotter { false, ); this.#core.config.transitionStaggering = defaultStaggering; - this.#core.renderer.transitionTime = 1; + this.#core.renderer.transitionTime = 1; // it is number from [0, 1] indicating the state of the animation - 1 means current } async plot(samples: d.v3f[], prng: PRNG, animate = false) { + let needNewBuffer = false; + if (samples.length !== this.#count) { + needNewBuffer = true; + this.#count = samples.length; + } + switch (prng.plotType) { case PlotType.GEOMETRIC: { - const count = samples.length; const data: GeometricData = { - count, - ids: new Uint32Array(count), - positionsX: new Float64Array(count), - positionsY: new Float64Array(count), - positionsZ: new Float64Array(count), - sizes: new Float64Array(count), - dists: new Float64Array(count), + count: this.#count, + ids: new Uint32Array(this.#count), + positionsX: new Float64Array(this.#count), + positionsY: new Float64Array(this.#count), + positionsZ: new Float64Array(this.#count), + sizes: new Float64Array(this.#count), + dists: new Float64Array(this.#count), }; const origin = (prng as GeometricPRNG).origin; - for (let i = 0; i < count; i++) { + for (let i = 0; i < this.#count; i++) { data.ids[i] = i; data.positionsX[i] = samples[i].x; data.positionsY[i] = samples[i].y; @@ -71,23 +81,30 @@ export class Plotter { ); } - if (animate) { + if (animate && !needNewBuffer) { this.makeRoomForNewPlot(); } - this.#plotGeometric(data, this.#core); + this.#plotGeometric(data, this.#core, needNewBuffer); - if (animate) { + if (animate && !needNewBuffer) { await this.distributionsTransition(); } } break; case PlotType.CONTINUOUS: { - const samplesFiltered = samples.filter((sample) => - sample.x >= defaultMinValue && sample.x <= defaultMaxValue - ); - const count = samplesFiltered.length; + // if we want to animate the transition between the old and new plots, + // we need to have the same number of samples, + // that's why I clamp them instead of filtering + const samplesFiltered = samples.map((sample) => ({ + ...sample, + x: sample.x < defaultMinValue + ? defaultMinValue + : sample.x > defaultMaxValue + ? defaultMaxValue + : sample.x, + })); const { minSample, maxSample } = samplesFiltered.reduce( (acc, sample) => ({ @@ -100,15 +117,15 @@ export class Plotter { }, ); - const optimalBinCount = 2 * Math.ceil(Math.log2(count)) + 1; // always odd + const optimalBinCount = 2 * Math.ceil(Math.log2(this.#count)) + 1; // always odd const binXWidth = (maxSample - minSample) / optimalBinCount; const data: HistogramData = { - count, - ids: new Uint32Array(count), - binIdsX: new Uint32Array(count), - binIdsZ: new Uint32Array(count), - values: new Float64Array(count), + count: this.#count, + ids: new Uint32Array(this.#count), + binIdsX: new Uint32Array(this.#count), + binIdsZ: new Uint32Array(this.#count), + values: new Float64Array(this.#count), binsX: optimalBinCount, binsZ: 1, binsWidth: binXWidth, @@ -121,7 +138,7 @@ export class Plotter { const binSizes = new Uint32Array(optimalBinCount); binSizes.fill(0); - for (let i = 0; i < count; i++) { + for (let i = 0; i < this.#count; i++) { data.ids[i] = i; data.binIdsZ[i] = 0; data.binIdsX[i] = Math.min( @@ -135,7 +152,7 @@ export class Plotter { (acc, size) => Math.max(acc, size), 0, ); - for (let i = 0; i < count; i++) { + for (let i = 0; i < this.#count; i++) { data.values[i] = binSizes[data.binIdsX[i]] / maxBinCount; } @@ -145,20 +162,19 @@ export class Plotter { data.sizeX = guessedBinXZSize; data.sizeZ = guessedBinXZSize; - if (animate) { + if (animate && !needNewBuffer) { this.makeRoomForNewPlot(); } - this.#plotHistogram(data, this.#core, false); + this.#plotHistogram(data, this.#core, false, needNewBuffer); - if (animate) { + if (animate && !needNewBuffer) { await this.distributionsTransition(); } } break; case PlotType.DISCRETE: { - const count = samples.length; const samplesRounded = samples.map((sample) => Math.round(sample.x)); const uniqueValues = samplesRounded.reduce((map, value) => { @@ -180,11 +196,11 @@ export class Plotter { const uniqueRange = maxValue - minValue + 1; const data: HistogramData = { - count, - ids: new Uint32Array(count), - binIdsX: new Uint32Array(count), - binIdsZ: new Uint32Array(count), - values: new Float64Array(count), + count: this.#count, + ids: new Uint32Array(this.#count), + binIdsX: new Uint32Array(this.#count), + binIdsZ: new Uint32Array(this.#count), + values: new Float64Array(this.#count), binsX: uniqueRange, binsZ: 1, binsWidth: 1, @@ -199,7 +215,7 @@ export class Plotter { 0, ); - for (let i = 0; i < count; i++) { + for (let i = 0; i < this.#count; i++) { data.ids[i] = i; data.binIdsZ[i] = 0; data.binIdsX[i] = samplesRounded[i] - minValue; @@ -213,13 +229,13 @@ export class Plotter { data.sizeX = guessedBinXZSize; data.sizeZ = guessedBinXZSize; - if (animate) { + if (animate && !needNewBuffer) { this.makeRoomForNewPlot(); } - this.#plotHistogram(data, this.#core, true); + this.#plotHistogram(data, this.#core, true, needNewBuffer); - if (animate) { + if (animate && !needNewBuffer) { await this.distributionsTransition(); } } @@ -246,8 +262,9 @@ export class Plotter { } makeRoomForNewPlot() { - this.#core.renderer.transitionBuffers[0].swap(); - this.#core.renderer.transitionTime = 0; + (this.#transitionBuffer as MorphCharts.ITransitionBufferVisual).swap(); + this.#core.renderer.transitionTime = 0; // it is number from [0, 1] indicating the state of the animation - 0 means previous + this.#core.renderer.axesVisibility = MorphCharts.AxesVisibility.none; } distributionsTransition(): Promise { @@ -255,9 +272,18 @@ export class Plotter { return new Promise((resolve) => { const animateTransition = (time: number) => { - const duration = Math.max(time - start, 0); + const duration = time - start; - this.#core.renderer.transitionTime = duration / transitionTime; + this.#core.renderer.transitionTime = clamp( + duration / transitionTime, + 0, + 1, + ); + + this.#core.renderer.axesVisibility = + this.#core.renderer.transitionTime < defaultAxesSwapMoment + ? MorphCharts.AxesVisibility.none + : MorphCharts.AxesVisibility.current; if (duration < transitionTime) { requestAnimationFrame(animateTransition); @@ -269,21 +295,28 @@ export class Plotter { }); } - #plotGeometric(data: GeometricData, core: MorphCharts.Core) { - const transitionBuffer = this.#core.renderer.createTransitionBuffer( - data.ids, - ); - this.#core.renderer.transitionBuffers = [transitionBuffer]; - transitionBuffer.currentBuffer.unitType = MorphCharts.UnitType.sphere; - transitionBuffer.currentPalette.colors = this.#palette; + #plotGeometric( + data: GeometricData, + core: MorphCharts.Core, + needNewBuffer: boolean, + ) { + if (this.#transitionBuffer === undefined || needNewBuffer) { + this.#transitionBuffer = this.#core.renderer.createTransitionBuffer( + data.ids, + ); + } + + this.#core.renderer.transitionBuffers = [this.#transitionBuffer]; + this.#transitionBuffer.currentBuffer.unitType = MorphCharts.UnitType.sphere; + this.#transitionBuffer.currentPalette.colors = this.#palette; const scatter = new MorphCharts.Layouts.Scatter(this.#core); - scatter.layout(transitionBuffer.currentBuffer, data.ids, { + scatter.layout(this.#transitionBuffer.currentBuffer, data.ids, { positionsX: data.positionsX, positionsY: data.positionsY, positionsZ: data.positionsZ, }); - scatter.update(transitionBuffer.currentBuffer, data.ids, { + scatter.update(this.#transitionBuffer.currentBuffer, data.ids, { sizes: data.sizes, sizeScaling: 0.1, colors: data.dists, @@ -312,14 +345,20 @@ export class Plotter { data: HistogramData, core: MorphCharts.Core, isDiscreteX: boolean, + needNewBuffer: boolean, ) { - const transitionBuffer = core.renderer.createTransitionBuffer(data.ids); - core.renderer.transitionBuffers = [transitionBuffer]; - transitionBuffer.currentBuffer.unitType = MorphCharts.UnitType.block; - transitionBuffer.currentPalette.colors = this.#palette; + if (this.#transitionBuffer === undefined || needNewBuffer) { + this.#transitionBuffer = this.#core.renderer.createTransitionBuffer( + data.ids, + ); + } + + core.renderer.transitionBuffers = [this.#transitionBuffer]; + this.#transitionBuffer.currentBuffer.unitType = MorphCharts.UnitType.block; + this.#transitionBuffer.currentPalette.colors = this.#palette; const stack = new MorphCharts.Layouts.Stack(core); - stack.layout(transitionBuffer.currentBuffer, data.ids, { + stack.layout(this.#transitionBuffer.currentBuffer, data.ids, { binsX: data.binsX, binsZ: data.binsZ, binIdsX: data.binIdsX, @@ -329,7 +368,7 @@ export class Plotter { spacingX: 1, spacingZ: 1, }); - stack.update(transitionBuffer.currentBuffer, data.ids, { + stack.update(this.#transitionBuffer.currentBuffer, data.ids, { colors: data.values, padding: 0.025, }); From 70f85c562221c0578c6215e58fcf73ead1733670 Mon Sep 17 00:00:00 2001 From: Szymon Szulc Date: Wed, 20 Aug 2025 11:47:19 +0200 Subject: [PATCH 28/64] Not this bool --- .../src/content/examples/simple/probability/index.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/index.ts b/apps/typegpu-docs/src/content/examples/simple/probability/index.ts index 5cd9e6189..fe9616978 100644 --- a/apps/typegpu-docs/src/content/examples/simple/probability/index.ts +++ b/apps/typegpu-docs/src/content/examples/simple/probability/index.ts @@ -59,7 +59,7 @@ export const controls = { } currentExecutionMode = value; - await replot(currentDistribution, currentExecutionMode, true, true); + await replot(currentDistribution, currentExecutionMode, false, true); plotter.resetView(getCameraPosition(currentDistribution)); }, }, @@ -75,7 +75,7 @@ export const controls = { await replot( currentDistribution, currentExecutionMode, - false, + true, true, ); plotter.resetView(getCameraPosition(currentDistribution)); From 8c5d66b6ab5fa01f8c5428f477645c495c95f73f Mon Sep 17 00:00:00 2001 From: Szymon Szulc Date: Wed, 20 Aug 2025 12:00:36 +0200 Subject: [PATCH 29/64] Fixed seed --- .../src/content/examples/simple/probability/executor.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/executor.ts b/apps/typegpu-docs/src/content/examples/simple/probability/executor.ts index 379554637..f63767096 100644 --- a/apps/typegpu-docs/src/content/examples/simple/probability/executor.ts +++ b/apps/typegpu-docs/src/content/examples/simple/probability/executor.ts @@ -55,11 +55,11 @@ export class Executor { }); this.#dataMoreWorkersFunc = tgpu['~unstable'].computeFn({ - in: { gid: d.builtin.globalInvocationId }, + in: { gid: d.builtin.globalInvocationId, count: d.builtin.numWorkgroups }, workgroupSize: [1], })((input) => { const gid = input.gid; - randf.seed(d.f32(gid.x)); + randf.seed(d.f32(gid.x) / input.count.x); sampleBufferSlotTempAlias.$[gid.x] = distributionSlotTempAlias.$(); }); } From 03afea47006f76c11ec7ce054d793ac3d2aafd17 Mon Sep 17 00:00:00 2001 From: Szymon Szulc Date: Wed, 20 Aug 2025 12:09:06 +0200 Subject: [PATCH 30/64] Docs update --- .../src/content/docs/ecosystem/typegpu-noise.mdx | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/apps/typegpu-docs/src/content/docs/ecosystem/typegpu-noise.mdx b/apps/typegpu-docs/src/content/docs/ecosystem/typegpu-noise.mdx index a62d44a9d..7db232db2 100644 --- a/apps/typegpu-docs/src/content/docs/ecosystem/typegpu-noise.mdx +++ b/apps/typegpu-docs/src/content/docs/ecosystem/typegpu-noise.mdx @@ -80,6 +80,7 @@ Does this mean we allow object access inside of WGSL shaders?... yes, yes we do The `@typegpu/noise` package provides a pseudo-random number generator (PRNG) that generates uniformly distributed random numbers in the range `[0, 1)`. Each call to `randf.sample` returns the next random float in the sequence, allowing for predictable and repeatable results. The seed can be set or reset using a set of `randf.seedN` functions, where `N` is the number of components our seed has. + ```ts twoslash import tgpu from 'typegpu'; import * as d from 'typegpu/data'; @@ -100,6 +101,10 @@ const main = tgpu['~unstable'].fragmentFn({ }); ``` +:::tip +Due to limited float precision, for large seeds the samples tend to repeat quickly. To avoid this, keep the seed in the range `[0, 1]`. +::: + There are higher-level utilities built on top of `randf.sample`: ### Discrete From 2839bfed93a7a579ab466fa51aad5ced95e9caba Mon Sep 17 00:00:00 2001 From: Szymon Szulc Date: Wed, 20 Aug 2025 14:27:50 +0200 Subject: [PATCH 31/64] Math in docs --- apps/typegpu-docs/astro.config.mjs | 12 +- apps/typegpu-docs/package.json | 2 + .../content/docs/ecosystem/typegpu-noise.mdx | 22 ++- .../examples/simple/probability/helpers.ts | 2 +- apps/typegpu-docs/src/mathjax.css | 3 + packages/typegpu-noise/src/random.ts | 2 +- pnpm-lock.yaml | 138 ++++++++++++++++++ 7 files changed, 174 insertions(+), 7 deletions(-) create mode 100644 apps/typegpu-docs/src/mathjax.css diff --git a/apps/typegpu-docs/astro.config.mjs b/apps/typegpu-docs/astro.config.mjs index 1dc05a6d8..f21d5b3d8 100644 --- a/apps/typegpu-docs/astro.config.mjs +++ b/apps/typegpu-docs/astro.config.mjs @@ -11,6 +11,8 @@ import typegpu from 'unplugin-typegpu/rollup'; import { imagetools } from 'vite-imagetools'; import wasm from 'vite-plugin-wasm'; import basicSsl from '@vitejs/plugin-basic-ssl'; +import rehypeMathJax from 'rehype-mathjax'; +import remarkMath from 'remark-math'; /** * @template T @@ -25,6 +27,10 @@ const DEV = import.meta.env.DEV; export default defineConfig({ site: 'https://docs.swmansion.com', base: 'TypeGPU', + markdown: { + remarkPlugins: [remarkMath], + rehypePlugins: [rehypeMathJax], + }, vite: { // Allowing query params, for invalidation plugins: [ @@ -48,7 +54,11 @@ export default defineConfig({ integrations: [ starlight({ title: 'TypeGPU', - customCss: ['./src/tailwind.css', './src/fonts/font-face.css'], + customCss: [ + './src/tailwind.css', + './src/fonts/font-face.css', + './src/mathjax.css', + ], plugins: stripFalsy([ starlightBlog({ navigation: 'none', diff --git a/apps/typegpu-docs/package.json b/apps/typegpu-docs/package.json index 8ef9910de..0012451af 100644 --- a/apps/typegpu-docs/package.json +++ b/apps/typegpu-docs/package.json @@ -44,6 +44,8 @@ "pathe": "^2.0.3", "react": "^19.1.0", "react-dom": "^19.1.0", + "rehype-mathjax": "^7.1.0", + "remark-math": "^6.0.0", "remeda": "^2.21.2", "sharp": "^0.34.2", "starlight-blog": "^0.23.2", diff --git a/apps/typegpu-docs/src/content/docs/ecosystem/typegpu-noise.mdx b/apps/typegpu-docs/src/content/docs/ecosystem/typegpu-noise.mdx index 7db232db2..729f1025e 100644 --- a/apps/typegpu-docs/src/content/docs/ecosystem/typegpu-noise.mdx +++ b/apps/typegpu-docs/src/content/docs/ecosystem/typegpu-noise.mdx @@ -105,16 +105,30 @@ const main = tgpu['~unstable'].fragmentFn({ Due to limited float precision, for large seeds the samples tend to repeat quickly. To avoid this, keep the seed in the range `[0, 1]`. ::: -There are higher-level utilities built on top of `randf.sample`: +There are higher-level utilities built on top of `randf.sample`. Most of the distributions can be derived from the fact that cumulative distribution functions (CDFs) are uniformly distributed on`[0, 1]` and can be easily inverted to generate random variables. We provide insights for probability enthusiasts. Let's assume $U \sim \mathrm{Uniform}[0, 1) \sim \mathrm{randf.sample}$ : ### Discrete - `bernoulli` - returns 1 with probability `p`, and 0 otherwise. You can think of it as the flip of a biased coin. `p` must be in the range `[0, 1]` +$$ +\mathrm{Bernoulli}(p) = \begin{cases} +1 & \text{if } U \leq p \\ +0 & \text{otherwise} +\end{cases} +$$ ### Continuous - `sampleExclusive` - works the same as `sample`, but returns a value strictly between 0 and 1 - `exponential` - returns a number based on the exponential distribution with a given `rate`. The `rate` must be greater than 0. It is commonly used for modeling the time until an event occurs -- `normal` - returns a number based on the normal (Gaussian) distribution with a given mean (`mu`) and standard deviation (`sigma`). `sigma` must be `>= 0` -- `cauchy` - returns a number based on the Cauchy distribution with a given origin point (`x0`, `gamma`). `gamma` must be `>= 0` +$$ +\mathrm{Exponential}(\lambda) = -\frac{1}{\lambda} \ln(1 - U) +$$ + +- `normal` - returns a number based on the normal (Gaussian) distribution with a given mean (`mu`) and standard deviation (`sigma`). `sigma` must be `> 0`. Following transformation is called Box-Muller transform +$$ +\mathrm{Normal}(\mu, \sigma) = \mu + \sigma \sin(2 \pi U_1) \sqrt{-2 \ln(U_2)} +$$ + +- `cauchy` - returns a number based on the Cauchy distribution with a given origin point (`x0`, `gamma`). `gamma` must be `> 0`. It can be interpreted as the probability distribution of the x-intercept of a light ray from the origin. ### Geometric - `inUnitCircle` - returns a random 2D vector uniformly distributed inside a unit circle @@ -123,7 +137,7 @@ There are higher-level utilities built on top of `randf.sample`: - `onUnitCube` - returns a random 3D vector uniformly distributed on the surface of a unit cube - `inHemisphere` - returns a random 3D vector uniformly distributed inside an upper hemisphere oriented according to a given normal vector - `onHemisphere` - returns a random 3D vector uniformly distributed on the surface of an upper hemisphere oriented according to a given normal vector -- `inUnitSphere` - returns a random 3D vector uniformly distributed inside a unit sphere +- `inUnitSphere` - returns a random 3D vector uniformly distributed inside a unit sphere. Thanks to the nature of the normal distribution, we can derive this distribution by sampling three coordinates from the $\mathrm{Normal}(0, 1)$ and normalizing the result (this gives us a direction vector). Finally, we choose the radius as $\sqrt[3]{U}$ - `onUnitSphere` - returns a random 3D vector uniformly distributed on the surface of a unit sphere ## Perlin noise diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/helpers.ts b/apps/typegpu-docs/src/content/examples/simple/probability/helpers.ts index db6dd9055..d9e3f9a2f 100644 --- a/apps/typegpu-docs/src/content/examples/simple/probability/helpers.ts +++ b/apps/typegpu-docs/src/content/examples/simple/probability/helpers.ts @@ -51,7 +51,7 @@ const distributionPRNGs = { }, [Distribution.BERNOULLI]: { plotType: PlotType.DISCRETE, - prng: tgpu.fn([], d.vec3f)(() => d.vec3f(randf.bernoulli(0.5))), + prng: tgpu.fn([], d.vec3f)(() => d.vec3f(randf.bernoulli(0.7))), }, [Distribution.SAMPLE]: { plotType: PlotType.CONTINUOUS, diff --git a/apps/typegpu-docs/src/mathjax.css b/apps/typegpu-docs/src/mathjax.css new file mode 100644 index 000000000..82c64aad0 --- /dev/null +++ b/apps/typegpu-docs/src/mathjax.css @@ -0,0 +1,3 @@ +.MathJax svg { + display: inline !important; +} diff --git a/packages/typegpu-noise/src/random.ts b/packages/typegpu-noise/src/random.ts index a4c9fb364..762493cc1 100644 --- a/packages/typegpu-noise/src/random.ts +++ b/packages/typegpu-noise/src/random.ts @@ -160,5 +160,5 @@ export const randBernoulli: TgpuFn<(p: d.F32) => d.F32> = tgpu .fn([d.f32], d.f32)((p) => { const u = randomGeneratorSlot.value.sample(); - return step(p, u); + return step(u, p); }); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0b3a9685f..fed5bbeef 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -218,6 +218,12 @@ importers: react-dom: specifier: ^19.1.0 version: 19.1.0(react@19.1.0) + rehype-mathjax: + specifier: ^7.1.0 + version: 7.1.0 + remark-math: + specifier: ^6.0.0 + version: 6.0.0 remeda: specifier: ^2.21.2 version: 2.21.2 @@ -2533,6 +2539,12 @@ packages: '@types/js-yaml@4.0.9': resolution: {integrity: sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==} + '@types/katex@0.16.7': + resolution: {integrity: sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ==} + + '@types/mathjax@0.0.40': + resolution: {integrity: sha512-rHusx08LCg92WJxrsM3SPjvLTSvK5C+gealtSuhKbEOcUZfWlwigaFoPLf6Dfxhg4oryN5qP9Sj7zOQ4HYXINw==} + '@types/mdast@4.0.4': resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} @@ -2710,6 +2722,10 @@ packages: '@webgpu/types@0.1.63': resolution: {integrity: sha512-s9Kuh0nE/2+nKrvmKNMB2fE5Zlr3DL2t3OFKM55v5jRcfCOxbkOHhQoshoFum5mmXIfEtRXtLCWmkeTJsVjE9w==} + '@xmldom/xmldom@0.9.8': + resolution: {integrity: sha512-p96FSY54r+WJ50FIOsCOjyj/wavs8921hG5+kVMmZgKcvIKxMXHTrjNJvRgWa/zuX3B6t2lijLNFaOyuxUH+2A==} + engines: {node: '>=14.6'} + acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -3024,6 +3040,10 @@ packages: comma-separated-tokens@2.0.3: resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + commander@13.1.0: + resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==} + engines: {node: '>=18'} + commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} @@ -3035,6 +3055,10 @@ packages: resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} engines: {node: '>= 10'} + commander@8.3.0: + resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} + engines: {node: '>= 12'} + common-ancestor-path@1.0.1: resolution: {integrity: sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==} @@ -3435,6 +3459,10 @@ packages: resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} engines: {node: '>=12'} + esm@3.2.25: + resolution: {integrity: sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==} + engines: {node: '>=6'} + estree-util-attach-comments@3.0.0: resolution: {integrity: sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==} @@ -3952,6 +3980,10 @@ packages: engines: {node: '>=10'} hasBin: true + katex@0.16.22: + resolution: {integrity: sha512-XCHRdUw4lf3SKBaJe4EvgqIuWwkPSo9XoeO8GjQW94Bp7TWv9hNhzZjZ+OH9yf1UmLygb7DIT5GSFQiyt16zYg==} + hasBin: true + kleur@3.0.3: resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} engines: {node: '>=6'} @@ -4142,6 +4174,9 @@ packages: engines: {node: '>= 18'} hasBin: true + mathjax-full@3.2.2: + resolution: {integrity: sha512-+LfG9Fik+OuI8SLwsiR02IVdjcnRCy5MufYLi0C3TdMT56L/pjB0alMVGgoWJF8pN9Rc7FESycZB9BMNWIid5w==} + mdast-util-definitions@6.0.0: resolution: {integrity: sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ==} @@ -4172,6 +4207,9 @@ packages: mdast-util-gfm@3.1.0: resolution: {integrity: sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==} + mdast-util-math@3.0.0: + resolution: {integrity: sha512-Tl9GBNeG/AhJnQM221bJR2HPvLOSnLE/T9cJI9tlc6zwQk2nPk/4f0cHkOdEixQPC/j8UtKDdITswvLAy1OZ1w==} + mdast-util-mdx-expression@2.0.1: resolution: {integrity: sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==} @@ -4212,6 +4250,9 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} + mhchemparser@4.2.1: + resolution: {integrity: sha512-kYmyrCirqJf3zZ9t/0wGgRZ4/ZJw//VwaRVGA75C4nhE60vtnIzhl9J9ndkX/h6hxSN7pjg/cE0VxbnNM+bnDQ==} + micromark-core-commonmark@2.0.3: resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} @@ -4239,6 +4280,9 @@ packages: micromark-extension-gfm@3.0.0: resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} + micromark-extension-math@3.1.0: + resolution: {integrity: sha512-lvEqd+fHjATVs+2v/8kg9i5Q0AP2k85H0WUOwpIVvUML8BapsMvh1XAogmQjOCsLpoKRCVQqEkQBB3NhVBcsOg==} + micromark-extension-mdx-expression@3.0.0: resolution: {integrity: sha512-sI0nwhUDz97xyzqJAbHQhp5TfaxEvZZZ2JDqUo+7NvyIYG6BZ5CPPqj2ogUoPJlmXHBnyZUzISg9+oUmU6tUjQ==} @@ -4347,6 +4391,9 @@ packages: resolution: {integrity: sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==} engines: {node: '>= 18'} + mj-context-menu@0.6.1: + resolution: {integrity: sha512-7NO5s6n10TIV96d4g2uDpG7ZDpIhMh0QNfGdJw/W47JswFcosz457wqz/b5sAKvl12sxINGFCn80NZHKwxQEXA==} + mkdirp@3.0.1: resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} engines: {node: '>=10'} @@ -4996,6 +5043,9 @@ packages: rehype-format@5.0.1: resolution: {integrity: sha512-zvmVru9uB0josBVpr946OR8ui7nJEdzZobwLOOqHb/OOD88W0Vk2SqLwoVOj0fM6IPCCO6TaV9CvQvJMWwukFQ==} + rehype-mathjax@7.1.0: + resolution: {integrity: sha512-mJHNpoqCC5UZ24OKx0wNjlzV18qeJz/Q/LtEjxXzt8vqrZ1Z3GxQnVrHcF5/PogcXUK8cWwJ4U/LWOQWEiABHw==} + rehype-parse@9.0.1: resolution: {integrity: sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag==} @@ -5017,6 +5067,9 @@ packages: remark-gfm@4.0.1: resolution: {integrity: sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==} + remark-math@6.0.0: + resolution: {integrity: sha512-MMqgnP74Igy+S3WwnhQ7kqGlEerTETXMvJhrUzDikVZ2/uogJCb+WHUg97hK9/jcfc0dkD73s3LN8zU49cTEtA==} + remark-mdx@3.1.0: resolution: {integrity: sha512-Ngl/H3YXyBV9RcRNdlYsZujAmhsxwzxpDzpDEhFBVAGthS4GDgnctpDjgFl/ULx5UEDzqtW1cyBSNKqYYrqLBA==} @@ -5204,10 +5257,15 @@ packages: 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 space-separated-tokens@2.0.2: resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + speech-rule-engine@4.1.2: + resolution: {integrity: sha512-S6ji+flMEga+1QU79NDbwZ8Ivf0S/MpupQQiIC0rTpU/ZTKgcajijJJb1OcByBQDjrXCN1/DJtGz4ZJeBMPGJw==} + hasBin: true + split-on-first@3.0.0: resolution: {integrity: sha512-qxQJTx2ryR0Dw0ITYyekNQWpz6f8dGd7vffGNflQQ3Iqj9NJ6qiZ7ELpZsJ/QBhIVAiDfXdag3+Gp8RvWa62AA==} engines: {node: '>=12'} @@ -5952,6 +6010,9 @@ packages: engines: {node: '>=8'} hasBin: true + wicked-good-xpath@1.3.0: + resolution: {integrity: sha512-Gd9+TUn5nXdwj/hFsPVx5cuHHiF5Bwuc30jZ4+ronF1qHK5O7HD0sgmXWSEgwKquT3ClLoKPVbO6qGwVwLzvAw==} + widest-line@5.0.0: resolution: {integrity: sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA==} engines: {node: '>=18'} @@ -7903,6 +7964,10 @@ snapshots: '@types/js-yaml@4.0.9': {} + '@types/katex@0.16.7': {} + + '@types/mathjax@0.0.40': {} + '@types/mdast@4.0.4': dependencies: '@types/unist': 3.0.3 @@ -8131,6 +8196,8 @@ snapshots: '@webgpu/types@0.1.63': {} + '@xmldom/xmldom@0.9.8': {} + acorn-jsx@5.3.2(acorn@8.15.0): dependencies: acorn: 8.15.0 @@ -8539,12 +8606,16 @@ snapshots: comma-separated-tokens@2.0.3: {} + commander@13.1.0: {} + commander@2.20.3: {} commander@4.1.1: {} commander@7.2.0: {} + commander@8.3.0: {} + common-ancestor-path@1.0.1: {} commondir@1.0.1: {} @@ -9036,6 +9107,8 @@ snapshots: escape-string-regexp@5.0.0: {} + esm@3.2.25: {} + estree-util-attach-comments@3.0.0: dependencies: '@types/estree': 1.0.8 @@ -9648,6 +9721,10 @@ snapshots: jsonparse: 1.3.1 through2: 4.0.2 + katex@0.16.22: + dependencies: + commander: 8.3.0 + kleur@3.0.3: {} kleur@4.1.5: {} @@ -9794,6 +9871,13 @@ snapshots: marked@15.0.7: {} + mathjax-full@3.2.2: + dependencies: + esm: 3.2.25 + mhchemparser: 4.2.1 + mj-context-menu: 0.6.1 + speech-rule-engine: 4.1.2 + mdast-util-definitions@6.0.0: dependencies: '@types/mdast': 4.0.4 @@ -9895,6 +9979,18 @@ snapshots: transitivePeerDependencies: - supports-color + mdast-util-math@3.0.0: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + longest-streak: 3.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + unist-util-remove-position: 5.0.0 + transitivePeerDependencies: + - supports-color + mdast-util-mdx-expression@2.0.1: dependencies: '@types/estree-jsx': 1.0.5 @@ -9987,6 +10083,8 @@ snapshots: merge2@1.4.1: {} + mhchemparser@4.2.1: {} + micromark-core-commonmark@2.0.3: dependencies: decode-named-character-reference: 1.1.0 @@ -10074,6 +10172,16 @@ snapshots: micromark-util-combine-extensions: 2.0.1 micromark-util-types: 2.0.2 + micromark-extension-math@3.1.0: + dependencies: + '@types/katex': 0.16.7 + devlop: 1.1.0 + katex: 0.16.22 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + micromark-extension-mdx-expression@3.0.0: dependencies: '@types/estree': 1.0.8 @@ -10286,6 +10394,8 @@ snapshots: dependencies: minipass: 7.1.2 + mj-context-menu@0.6.1: {} + mkdirp@3.0.1: {} mkdist@2.2.0(typescript@5.8.3): @@ -10933,6 +11043,17 @@ snapshots: '@types/hast': 3.0.4 hast-util-format: 1.1.0 + rehype-mathjax@7.1.0: + dependencies: + '@types/hast': 3.0.4 + '@types/mathjax': 0.0.40 + hast-util-to-text: 4.0.2 + hastscript: 9.0.1 + mathjax-full: 3.2.2 + unified: 11.0.5 + unist-util-visit-parents: 6.0.1 + vfile: 6.0.3 + rehype-parse@9.0.1: dependencies: '@types/hast': 3.0.4 @@ -10986,6 +11107,15 @@ snapshots: transitivePeerDependencies: - supports-color + remark-math@6.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-math: 3.0.0 + micromark-extension-math: 3.1.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + remark-mdx@3.1.0: dependencies: mdast-util-mdx: 3.0.0 @@ -11252,6 +11382,12 @@ snapshots: space-separated-tokens@2.0.2: {} + speech-rule-engine@4.1.2: + dependencies: + '@xmldom/xmldom': 0.9.8 + commander: 13.1.0 + wicked-good-xpath: 1.3.0 + split-on-first@3.0.0: {} split2@3.2.2: @@ -12010,6 +12146,8 @@ snapshots: siginfo: 2.0.0 stackback: 0.0.2 + wicked-good-xpath@1.3.0: {} + widest-line@5.0.0: dependencies: string-width: 7.2.0 From b85304e599ffeae2eac9f51e0ab2024a520a760b Mon Sep 17 00:00:00 2001 From: Szymon Szulc Date: Wed, 20 Aug 2025 16:13:38 +0200 Subject: [PATCH 32/64] Refactor in plotter --- .../examples/simple/probability/constants.ts | 2 +- .../examples/simple/probability/executor.ts | 1 + .../examples/simple/probability/plotter.ts | 367 ++++++++++-------- .../examples/simple/probability/types.ts | 8 +- 4 files changed, 202 insertions(+), 176 deletions(-) diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/constants.ts b/apps/typegpu-docs/src/content/examples/simple/probability/constants.ts index f984f3011..f0fed9c81 100644 --- a/apps/typegpu-docs/src/content/examples/simple/probability/constants.ts +++ b/apps/typegpu-docs/src/content/examples/simple/probability/constants.ts @@ -5,7 +5,7 @@ export const cameraPositionHist = [0, 0, 0.2]; export const initialCameraAngle = 15; export const initialNumSamples = 2000; export const numSamplesOptions = [100, 1000, 2000, 5000, 10000, 50000]; -export const initialDistribution: Distribution = Distribution.SAMPLE; +export const initialDistribution: Distribution = Distribution.NORMAL; export const distributions: Distribution[] = Object.values(Distribution); export const initialExecutionMode: ExecutionMode = ExecutionMode.SINGLE; export const executionModes: ExecutionMode[] = Object.values(ExecutionMode); diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/executor.ts b/apps/typegpu-docs/src/content/examples/simple/probability/executor.ts index f63767096..07f11b0ff 100644 --- a/apps/typegpu-docs/src/content/examples/simple/probability/executor.ts +++ b/apps/typegpu-docs/src/content/examples/simple/probability/executor.ts @@ -29,6 +29,7 @@ export class Executor { count > 0, 'Count cannot be 0. Cannot create buffer of size 0', ); + this.#root = root; this.#count = count; this.#maxCount = count; diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/plotter.ts b/apps/typegpu-docs/src/content/examples/simple/probability/plotter.ts index 5826c9c4e..9a4256aa0 100644 --- a/apps/typegpu-docs/src/content/examples/simple/probability/plotter.ts +++ b/apps/typegpu-docs/src/content/examples/simple/probability/plotter.ts @@ -56,190 +56,56 @@ export class Plotter { switch (prng.plotType) { case PlotType.GEOMETRIC: { - const data: GeometricData = { - count: this.#count, - ids: new Uint32Array(this.#count), - positionsX: new Float64Array(this.#count), - positionsY: new Float64Array(this.#count), - positionsZ: new Float64Array(this.#count), - sizes: new Float64Array(this.#count), - dists: new Float64Array(this.#count), - }; - - const origin = (prng as GeometricPRNG).origin; - - for (let i = 0; i < this.#count; i++) { - data.ids[i] = i; - data.positionsX[i] = samples[i].x; - data.positionsY[i] = samples[i].y; - data.positionsZ[i] = samples[i].z; - data.sizes[i] = defaultSize; - data.dists[i] = Math.sqrt( - (data.positionsX[i] - origin.x) ** 2 + - (data.positionsY[i] - origin.y) ** 2 + - (data.positionsZ[i] - origin.z) ** 2, - ); - } - - if (animate && !needNewBuffer) { - this.makeRoomForNewPlot(); - } - - this.#plotGeometric(data, this.#core, needNewBuffer); - - if (animate && !needNewBuffer) { - await this.distributionsTransition(); - } + const data = this.#prepareGeometricData( + samples, + prng as GeometricPRNG, + ); + + await this.#handlePlotting( + () => this.#plotGeometric(data, this.#core, needNewBuffer), + animate, + needNewBuffer, + ); } break; case PlotType.CONTINUOUS: { - // if we want to animate the transition between the old and new plots, - // we need to have the same number of samples, - // that's why I clamp them instead of filtering - const samplesFiltered = samples.map((sample) => ({ - ...sample, - x: sample.x < defaultMinValue - ? defaultMinValue - : sample.x > defaultMaxValue - ? defaultMaxValue - : sample.x, - })); - - const { minSample, maxSample } = samplesFiltered.reduce( - (acc, sample) => ({ - minSample: Math.min(acc.minSample, sample.x), - maxSample: Math.max(acc.maxSample, sample.x), - }), - { - minSample: Number.POSITIVE_INFINITY, - maxSample: Number.NEGATIVE_INFINITY, - }, - ); + const data = this.#prepareContinuousData(samples); - const optimalBinCount = 2 * Math.ceil(Math.log2(this.#count)) + 1; // always odd - const binXWidth = (maxSample - minSample) / optimalBinCount; - - const data: HistogramData = { - count: this.#count, - ids: new Uint32Array(this.#count), - binIdsX: new Uint32Array(this.#count), - binIdsZ: new Uint32Array(this.#count), - values: new Float64Array(this.#count), - binsX: optimalBinCount, - binsZ: 1, - binsWidth: binXWidth, - sizeX: 1, - sizeZ: 1, - minX: minSample, - maxX: maxSample, - }; - - const binSizes = new Uint32Array(optimalBinCount); - binSizes.fill(0); - - for (let i = 0; i < this.#count; i++) { - data.ids[i] = i; - data.binIdsZ[i] = 0; - data.binIdsX[i] = Math.min( - Math.floor((samplesFiltered[i].x - minSample) / binXWidth), - optimalBinCount - 1, - ); - binSizes[data.binIdsX[i]]++; - } - - const maxBinCount = binSizes.reduce( - (acc, size) => Math.max(acc, size), - 0, + await this.#handlePlotting( + () => this.#plotHistogram(data, this.#core, false, needNewBuffer), + animate, + needNewBuffer, ); - for (let i = 0; i < this.#count; i++) { - data.values[i] = binSizes[data.binIdsX[i]] / maxBinCount; - } - - const guessedBinXZSize = Math.floor( - (maxBinCount / heightToBase) ** (1 / 3), - ); - data.sizeX = guessedBinXZSize; - data.sizeZ = guessedBinXZSize; - - if (animate && !needNewBuffer) { - this.makeRoomForNewPlot(); - } - - this.#plotHistogram(data, this.#core, false, needNewBuffer); - - if (animate && !needNewBuffer) { - await this.distributionsTransition(); - } } break; case PlotType.DISCRETE: { - const samplesRounded = samples.map((sample) => Math.round(sample.x)); - - const uniqueValues = samplesRounded.reduce((map, value) => { - map.set(value, (map.get(value) || 0) + 1); - return map; - }, new Map()); - - const { minValue, maxValue } = [...uniqueValues.keys()].reduce( - (acc, value) => ({ - minValue: Math.min(acc.minValue, value), - maxValue: Math.max(acc.maxValue, value), - }), - { - minValue: Number.POSITIVE_INFINITY, - maxValue: Number.NEGATIVE_INFINITY, - }, - ); + const data = this.#prepareDiscreteData(samples); - const uniqueRange = maxValue - minValue + 1; - - const data: HistogramData = { - count: this.#count, - ids: new Uint32Array(this.#count), - binIdsX: new Uint32Array(this.#count), - binIdsZ: new Uint32Array(this.#count), - values: new Float64Array(this.#count), - binsX: uniqueRange, - binsZ: 1, - binsWidth: 1, - sizeX: 1, - sizeZ: 1, - minX: minValue, - maxX: maxValue, - }; - - const dominantFreq = uniqueValues.values().reduce( - (acc, freq) => Math.max(acc, freq), - 0, + await this.#handlePlotting( + () => this.#plotHistogram(data, this.#core, true, needNewBuffer), + animate, + needNewBuffer, ); + } + break; + } + } - for (let i = 0; i < this.#count; i++) { - data.ids[i] = i; - data.binIdsZ[i] = 0; - data.binIdsX[i] = samplesRounded[i] - minValue; - data.values[i] = (uniqueValues.get(samplesRounded[i]) as number) / - dominantFreq; - } - - const guessedBinXZSize = Math.floor( - (dominantFreq / heightToBase) ** (1 / 3), - ); - data.sizeX = guessedBinXZSize; - data.sizeZ = guessedBinXZSize; - - if (animate && !needNewBuffer) { - this.makeRoomForNewPlot(); - } + async #handlePlotting( + subplotter: () => void, + animate: boolean, + needNewBuffer: boolean, + ) { + if (animate && !needNewBuffer) { + this.#makeRoomForNewPlot(); + } - this.#plotHistogram(data, this.#core, true, needNewBuffer); + subplotter(); - if (animate && !needNewBuffer) { - await this.distributionsTransition(); - } - } - break; + if (animate && !needNewBuffer) { + await this.#distributionsTransition(); } } @@ -261,13 +127,13 @@ export class Plotter { this.#core.camera.setPosition(cameraPos, true); } - makeRoomForNewPlot() { + #makeRoomForNewPlot() { (this.#transitionBuffer as MorphCharts.ITransitionBufferVisual).swap(); this.#core.renderer.transitionTime = 0; // it is number from [0, 1] indicating the state of the animation - 0 means previous this.#core.renderer.axesVisibility = MorphCharts.AxesVisibility.none; } - distributionsTransition(): Promise { + #distributionsTransition(): Promise { const start = performance.now(); return new Promise((resolve) => { @@ -295,6 +161,35 @@ export class Plotter { }); } + #prepareGeometricData(samples: d.v3f[], prng: GeometricPRNG): GeometricData { + const data: GeometricData = { + count: this.#count, + ids: new Uint32Array(this.#count), + positionsX: new Float64Array(this.#count), + positionsY: new Float64Array(this.#count), + positionsZ: new Float64Array(this.#count), + sizes: new Float64Array(this.#count), + dists: new Float64Array(this.#count), + }; + + const origin = prng.origin; + + for (let i = 0; i < this.#count; i++) { + data.ids[i] = i; + data.positionsX[i] = samples[i].x; + data.positionsY[i] = samples[i].y; + data.positionsZ[i] = samples[i].z; + data.sizes[i] = defaultSize; + data.dists[i] = Math.sqrt( + (data.positionsX[i] - origin.x) ** 2 + + (data.positionsY[i] - origin.y) ** 2 + + (data.positionsZ[i] - origin.z) ** 2, + ); + } + + return data; + } + #plotGeometric( data: GeometricData, core: MorphCharts.Core, @@ -341,6 +236,136 @@ export class Plotter { ]; } + #prepareContinuousData(samples: d.v3f[]): HistogramData { + // if we want to animate the transition between the old and new plots, + // we need to have the same number of samples, + // that's why I clamp them instead of filtering + const samplesFiltered = samples.map((sample) => ({ + ...sample, + x: sample.x < defaultMinValue + ? defaultMinValue + : sample.x > defaultMaxValue + ? defaultMaxValue + : sample.x, + })); + + const { minSample, maxSample } = samplesFiltered.reduce( + (acc, sample) => ({ + minSample: Math.min(acc.minSample, sample.x), + maxSample: Math.max(acc.maxSample, sample.x), + }), + { + minSample: Number.POSITIVE_INFINITY, + maxSample: Number.NEGATIVE_INFINITY, + }, + ); + + const optimalBinCount = 2 * Math.ceil(Math.log2(this.#count)) + 1; // always odd + const binXWidth = (maxSample - minSample) / optimalBinCount; + + const data: HistogramData = { + count: this.#count, + ids: new Uint32Array(this.#count), + binIdsX: new Uint32Array(this.#count), + binIdsZ: new Uint32Array(this.#count), + values: new Float64Array(this.#count), + binsX: optimalBinCount, + binsZ: 1, + binsWidth: binXWidth, + sizeX: 1, + sizeZ: 1, + minX: minSample, + maxX: maxSample, + }; + + const binSizes = new Uint32Array(optimalBinCount); + binSizes.fill(0); + + for (let i = 0; i < this.#count; i++) { + data.ids[i] = i; + data.binIdsZ[i] = 0; + data.binIdsX[i] = Math.min( + Math.floor((samplesFiltered[i].x - minSample) / binXWidth), + optimalBinCount - 1, + ); + binSizes[data.binIdsX[i]]++; + } + + const maxBinCount = binSizes.reduce( + (acc, size) => Math.max(acc, size), + 0, + ); + for (let i = 0; i < this.#count; i++) { + data.values[i] = binSizes[data.binIdsX[i]] / maxBinCount; + } + + const guessedBinXZSize = Math.floor( + (maxBinCount / heightToBase) ** (1 / 3), + ); + data.sizeX = guessedBinXZSize; + data.sizeZ = guessedBinXZSize; + + return data; + } + + #prepareDiscreteData(samples: d.v3f[]): HistogramData { + const samplesRounded = samples.map((sample) => Math.round(sample.x)); + + const uniqueValues = samplesRounded.reduce((map, value) => { + map.set(value, (map.get(value) || 0) + 1); + return map; + }, new Map()); + + const { minValue, maxValue } = [...uniqueValues.keys()].reduce( + (acc, value) => ({ + minValue: Math.min(acc.minValue, value), + maxValue: Math.max(acc.maxValue, value), + }), + { + minValue: Number.POSITIVE_INFINITY, + maxValue: Number.NEGATIVE_INFINITY, + }, + ); + + const uniqueRange = maxValue - minValue + 1; + + const data: HistogramData = { + count: this.#count, + ids: new Uint32Array(this.#count), + binIdsX: new Uint32Array(this.#count), + binIdsZ: new Uint32Array(this.#count), + values: new Float64Array(this.#count), + binsX: uniqueRange, + binsZ: 1, + binsWidth: 1, + sizeX: 1, + sizeZ: 1, + minX: minValue, + maxX: maxValue, + }; + + const dominantFreq = uniqueValues.values().reduce( + (acc, freq) => Math.max(acc, freq), + 0, + ); + + for (let i = 0; i < this.#count; i++) { + data.ids[i] = i; + data.binIdsZ[i] = 0; + data.binIdsX[i] = samplesRounded[i] - minValue; + data.values[i] = (uniqueValues.get(samplesRounded[i]) as number) / + dominantFreq; + } + + const guessedBinXZSize = Math.floor( + (dominantFreq / heightToBase) ** (1 / 3), + ); + data.sizeX = guessedBinXZSize; + data.sizeZ = guessedBinXZSize; + + return data; + } + #plotHistogram( data: HistogramData, core: MorphCharts.Core, diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/types.ts b/apps/typegpu-docs/src/content/examples/simple/probability/types.ts index 4b743bea9..a115b7141 100644 --- a/apps/typegpu-docs/src/content/examples/simple/probability/types.ts +++ b/apps/typegpu-docs/src/content/examples/simple/probability/types.ts @@ -64,15 +64,15 @@ export const Distribution = { export type Distribution = typeof Distribution[keyof typeof Distribution]; -export type PRNG = - & { plotType: PlotType } - & (GeometricPRNG | ContinuousPRNG); +export type PRNG = GeometricPRNG | SimplePRNG; export interface GeometricPRNG { + plotType: PlotType; prng: TgpuFn<() => d.Vec3f>; origin: d.v3f; } -export interface ContinuousPRNG { +export interface SimplePRNG { + plotType: PlotType; prng: TgpuFn<() => d.Vec3f>; } From 88e6b66c4bde018e885f3947fc10b9491f3ef628 Mon Sep 17 00:00:00 2001 From: Szymon Szulc Date: Wed, 20 Aug 2025 16:13:38 +0200 Subject: [PATCH 33/64] Refactor in plotter --- apps/typegpu-docs/src/mathjax.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/typegpu-docs/src/mathjax.css b/apps/typegpu-docs/src/mathjax.css index 82c64aad0..1d4264374 100644 --- a/apps/typegpu-docs/src/mathjax.css +++ b/apps/typegpu-docs/src/mathjax.css @@ -1,3 +1,3 @@ .MathJax svg { - display: inline !important; + display: inline !important; } From 516ba058ac7c6266740e99647e66d31aec14e002 Mon Sep 17 00:00:00 2001 From: Szymon Szulc Date: Thu, 21 Aug 2025 12:37:27 +0200 Subject: [PATCH 34/64] Added controls popup --- .../examples/simple/probability/index.html | 40 ++++++++++++++++--- .../examples/simple/probability/index.ts | 19 +++++++++ .../examples/simple/probability/meta.json | 2 +- .../examples/simple/probability/plotter.ts | 2 +- 4 files changed, 56 insertions(+), 7 deletions(-) diff --git a/apps/typegpu-docs/src/content/examples/simple/probability/index.html b/apps/typegpu-docs/src/content/examples/simple/probability/index.html index df26af4f7..beab602b6 100644 --- a/apps/typegpu-docs/src/content/examples/simple/probability/index.html +++ b/apps/typegpu-docs/src/content/examples/simple/probability/index.html @@ -1,7 +1,37 @@