@vessel-dsp/runtime 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/README.md +178 -0
  2. package/dist/admission.d.ts +94 -0
  3. package/dist/admission.d.ts.map +1 -0
  4. package/dist/admission.js +209 -0
  5. package/dist/admission.js.map +1 -0
  6. package/dist/calibrate.d.ts +104 -0
  7. package/dist/calibrate.d.ts.map +1 -0
  8. package/dist/calibrate.js +420 -0
  9. package/dist/calibrate.js.map +1 -0
  10. package/dist/chain-advisories.d.ts +71 -0
  11. package/dist/chain-advisories.d.ts.map +1 -0
  12. package/dist/chain-advisories.js +268 -0
  13. package/dist/chain-advisories.js.map +1 -0
  14. package/dist/chain-scale.d.ts +82 -0
  15. package/dist/chain-scale.d.ts.map +1 -0
  16. package/dist/chain-scale.js +121 -0
  17. package/dist/chain-scale.js.map +1 -0
  18. package/dist/chain-slot.d.ts +130 -0
  19. package/dist/chain-slot.d.ts.map +1 -0
  20. package/dist/chain-slot.js +105 -0
  21. package/dist/chain-slot.js.map +1 -0
  22. package/dist/chain.d.ts +113 -0
  23. package/dist/chain.d.ts.map +1 -0
  24. package/dist/chain.js +355 -0
  25. package/dist/chain.js.map +1 -0
  26. package/dist/index.d.ts +14 -0
  27. package/dist/index.d.ts.map +1 -0
  28. package/dist/index.js +18 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/numeric-pivot.d.ts +4 -0
  31. package/dist/numeric-pivot.d.ts.map +1 -0
  32. package/dist/numeric-pivot.js +192 -0
  33. package/dist/numeric-pivot.js.map +1 -0
  34. package/dist/reference-runtime.d.ts +1080 -0
  35. package/dist/reference-runtime.d.ts.map +1 -0
  36. package/dist/reference-runtime.js +6743 -0
  37. package/dist/reference-runtime.js.map +1 -0
  38. package/dist/settle.d.ts +359 -0
  39. package/dist/settle.d.ts.map +1 -0
  40. package/dist/settle.js +900 -0
  41. package/dist/settle.js.map +1 -0
  42. package/dist/supply-ground.d.ts +22 -0
  43. package/dist/supply-ground.d.ts.map +1 -0
  44. package/dist/supply-ground.js +62 -0
  45. package/dist/supply-ground.js.map +1 -0
  46. package/dist/supply.d.ts +30 -0
  47. package/dist/supply.d.ts.map +1 -0
  48. package/dist/supply.js +10 -0
  49. package/dist/supply.js.map +1 -0
  50. package/dist/taper.d.ts +10 -0
  51. package/dist/taper.d.ts.map +1 -0
  52. package/dist/taper.js +34 -0
  53. package/dist/taper.js.map +1 -0
  54. package/dist/v2-wasm-engine.d.ts +91 -0
  55. package/dist/v2-wasm-engine.d.ts.map +1 -0
  56. package/dist/v2-wasm-engine.js +296 -0
  57. package/dist/v2-wasm-engine.js.map +1 -0
  58. package/dist/wasm/v2_dsp.cjs +22 -0
  59. package/dist/wasm/v2_dsp.wasm +0 -0
  60. package/package.json +62 -0
@@ -0,0 +1,359 @@
1
+ import type { Program } from "@vessel-dsp/compiler";
2
+ export type SettleOptions = {
3
+ /** Length of each measurement window, seconds. */
4
+ readonly windowSeconds: number;
5
+ /** Consecutive window pairs that must agree before the level is called settled. */
6
+ readonly consecutive: number;
7
+ /** How close two consecutive windows must be, in dB. */
8
+ readonly stableDb: number;
9
+ /** Render lengths to try in turn; the last is the giving-up point. */
10
+ readonly ladderSeconds: readonly number[];
11
+ };
12
+ /**
13
+ * Defaults measured against the corpus rather than chosen: 0.5 s resolves a 1.5 s settle without
14
+ * splitting hairs, and 0.25 dB is below the run-to-run spread.
15
+ *
16
+ * **The top rung is deliberately above anything the corpus reaches, and that is the point.** It was
17
+ * 16 s, justified as "covers `marshall-jcm800`, the slowest row found (settles at 16.0 s)" — which
18
+ * is not a bound, it is a coincidence. A ladder whose maximum equals the population maximum cannot
19
+ * tell *settled at the last rung* from *never settled*: both produce the same row, and jcm800's
20
+ * gain of 0.00 — the packet called the one real remaining amp defect all afternoon — was read at
21
+ * exactly that edge every time.
22
+ *
23
+ * Re-measured on a 64 s ladder, jcm800 settles at **10 s** and holds flat to five digits out to
24
+ * 64 s, so the diagnosis survives and the 16.0 s figure was an artifact of the two settling
25
+ * criteria this module used to have (see `windowLevel`). The rung is raised anyway: the reason to
26
+ * have headroom is not that anything needed it, it is that without it a maximum reading is
27
+ * ambiguous. Same argument as a screen needing a *no valid measurement* state distinct from a
28
+ * negative result. It costs nothing for a packet that settles earlier.
29
+ */
30
+ export declare const SETTLE_DEFAULTS: SettleOptions;
31
+ /** A level below this is numerical noise, not a measurement. */
32
+ export declare const FLAT_AT_ZERO_RMS = 0.000001;
33
+ /** `true` when a settled verdict cannot distinguish a dead circuit from one still coming up. */
34
+ export declare function isFlatAtZero(rms: number): boolean;
35
+ export type Settled = {
36
+ /** rms of the window the level settled in. */
37
+ readonly rms: number;
38
+ /** Seconds into the render at which it settled. */
39
+ readonly seconds: number;
40
+ };
41
+ /**
42
+ * The first window at which the level holds still, or `null` if it never does.
43
+ *
44
+ * Pure, so an instrument that renders its own audio — in a browser page, through the WASM console,
45
+ * or anywhere else this module cannot reach — can still share the policy by handing over its
46
+ * window levels.
47
+ */
48
+ export declare function findSettled(windowRms: readonly number[], options?: SettleOptions): Settled | null;
49
+ /**
50
+ * A driven level and the part of it attributable to the input, **from one shared window**.
51
+ *
52
+ * Returned as a pair on purpose. `measureSettledSignal` used to return the attributable rms
53
+ * alone, which left a caller wanting an attributable *fraction* to fetch the total from
54
+ * `measureSettled` — a separate call that settles on its **own** window. Every such pairing is
55
+ * one careless line from the differencing defect this module already documents, and it happened:
56
+ * `marshall-jcm800` was measured at **106.2% attributable**, a signal larger than its own total,
57
+ * hours after the same two-window error had been found and fixed at a different call site.
58
+ *
59
+ * The fix lived in a call site rather than in the shape of the measurement, so it did not
60
+ * transfer to the next instrument someone reached for. Handing back both numbers from the same
61
+ * window makes the wrong version unreachable rather than merely discouraged.
62
+ */
63
+ export type AttributedMeasurement = SettledMeasurement & {
64
+ /** Total driven rms about its mean, over the **same** window the signal came from. */
65
+ readonly total: number;
66
+ /** `signal / total`, clamped to [0, 1]; `null` when the total is zero. */
67
+ readonly attributable: number | null;
68
+ };
69
+ export type SettledMeasurement = {
70
+ /** `null` when the render never settled: no level rather than a wrong one. */
71
+ readonly rms: number | null;
72
+ readonly peak: number;
73
+ readonly settleSeconds: number | null;
74
+ readonly renderedSeconds: number;
75
+ /** `true` when the settled level is indistinguishable from numerical noise. */
76
+ readonly flatAtZero: boolean;
77
+ };
78
+ /**
79
+ * Render a program until its output level stops moving, and report that level.
80
+ *
81
+ * The runtime is stateful across `process()` calls, so this walks forward through one continuous
82
+ * render rather than restarting per rung — which both costs less and is the only honest way to
83
+ * measure a circuit that is still charging.
84
+ *
85
+ * `sampleAt` is the stimulus, in volts, as a function of absolute sample index; passing the same
86
+ * function every instrument uses is what makes two measurements comparable.
87
+ */
88
+ export declare function measureSettled(program: Program, sampleRate: number, sampleAt: (index: number) => number, options?: SettleOptions): SettledMeasurement;
89
+ /** One node's response to the input, separated from whatever it does without one. */
90
+ export type InputAttributableNode = {
91
+ readonly blockId: string;
92
+ readonly node: number;
93
+ /** Amplitude present with the stimulus but not without it. */
94
+ readonly signalVolts: number;
95
+ readonly loudVolts: number;
96
+ readonly silentVolts: number;
97
+ };
98
+ /**
99
+ * Per-node AC attributable to the input: render twice, once driven and once silent, and
100
+ * difference the two.
101
+ *
102
+ * **A plain per-node amplitude list is unreadable on anything with a mains supply.**
103
+ * `mesa-boogie-dual-rectifier` carries 495 V of rail ripple, which occupies the top of any such
104
+ * list and buries a preamp running at 132 V — the signal was invisible until the two renders were
105
+ * differenced, and then the fault (power-tube grids sitting on the fixed bias rail with no drive
106
+ * node at all) fell out in one reading. Pedals have supply ripple too, so this is not an
107
+ * amp-only tool.
108
+ *
109
+ * Both renders settle first, via the same policy as everything else here, because differencing
110
+ * two unsettled renders subtracts one transient from another.
111
+ */
112
+ export declare function measureInputAttributable(program: Program, sampleRate: number, sampleAt: (index: number) => number, options?: SettleOptions): readonly InputAttributableNode[];
113
+ /**
114
+ * The settled output level **attributable to the input**: render driven, render silent, subtract,
115
+ * and measure the remainder.
116
+ *
117
+ * **Plain output rms is a ceiling, not a level, on anything with a mains supply.** Ripple adds to
118
+ * the measurement, so `rms >= signal`, and by an amount that differs per packet. Every amp gain
119
+ * figure taken before this existed is an upper bound: a corpus "healthy band" of 19-190 was a band
120
+ * of ceilings, and the bimodal gap that appeared to validate the threshold was a gap between
121
+ * ceilings rather than between signals.
122
+ *
123
+ * The direction of the bias is the point, and it is the opposite of the one that broke the phase
124
+ * screen. Ripple is common-mode, so it drove *correlation* toward +1 and manufactured defects that
125
+ * were not there; it is additive, so it drives *magnitude* upward and hides defects that are. Same
126
+ * contaminant, opposite direction, because one statistic summed a phase relationship and the other
127
+ * a magnitude — which is what determines which way a statistic lies, not merely how much.
128
+ */
129
+ /** One drive's behaviour over a window shared with every other drive in the same call. */
130
+ export type SharedWindowMeasurement = {
131
+ /** rms about the mean, in volts: the audio, with any DC pedestal removed. */
132
+ readonly rms: number;
133
+ /** The pedestal itself, which is a different finding from the audio. */
134
+ readonly dc: number;
135
+ readonly peak: number;
136
+ };
137
+ /**
138
+ * Render each drive of one program to the **shared window**, keeping what it renders.
139
+ *
140
+ * **This exists because the two functions below rendered every drive twice.** Each made one pass
141
+ * per drive to find its settle point and a second pass per drive to capture the window -- and both
142
+ * passes feed the runtime an identical input, so the second recomputes exactly what the first
143
+ * already produced. `boss-ch-1` never settles and cost **2441 s** of one corpus run, more than any
144
+ * other packet, and half of that was the recomputation.
145
+ *
146
+ * **The first attempt at this was wrong, and the timing control is what said so.** It advanced
147
+ * every drive in lockstep and stopped only when *all* of them had settled -- which means one drive
148
+ * that never settles drags every other drive through the whole ladder. On `boss-sp-1-spectrum`
149
+ * that was **2.9x slower** than the version it replaced, reproducibly, on an idle machine. A drive
150
+ * that has settled must **stop**, not keep pace with the slowest one.
151
+ *
152
+ * So each drive advances on its own and stops at its own settle point, every window it renders is
153
+ * kept, and once the shared window is known each drive is advanced from where it stopped to that
154
+ * window. Per drive the render is `skip + 1` windows, which is the minimum possible: every drive
155
+ * has to reach the shared window, and none of it is rendered twice.
156
+ *
157
+ * **Exactness is the argument.** The runtime is deterministic and the input is identical, so the
158
+ * window handed back is the window the second pass would have produced, sample for sample.
159
+ *
160
+ * `settleAt[d]` is the window index **after** drive `d` settled, or -1 if it never did -- the
161
+ * convention the two-pass version used, so each caller keeps its own rule for a drive that never
162
+ * settles.
163
+ */
164
+ /**
165
+ * Which settle criterion produced a measurement.
166
+ *
167
+ * **Recorded per row, not just per run.** With a fallback, two packets in the same run can be
168
+ * measured by different criteria — and a future diff that compares a `fine` row against a `coarse`
169
+ * row would read the criterion change as *movement*. That is the instrument-digest problem at a
170
+ * finer grain, and **the digest gate cannot see it**, because both criteria live in the same
171
+ * unchanged file. One field closes the hole before it exists.
172
+ */
173
+ export type SettleCriterion = "fine" | "coarse" | "unsettled";
174
+ /**
175
+ * Measure several drive levels over ONE window, after every one of them has settled.
176
+ *
177
+ * **Two drives measured at their own settle points are not two views of one state.** Mains ripple
178
+ * has a phase tied to absolute time, so comparing or subtracting windows captured at different
179
+ * offsets does not cancel it and can double it — measured directly on 2026-09-09, where letting a
180
+ * driven and a silent render each stop at its own settle time reported `fender-twin-reverb` with
181
+ * more signal than total output and `hiwatt-dr103`, then believed to be a working amp, with a
182
+ * signal of exactly zero.
183
+ *
184
+ * `measureSettledSignal` is the two-drive difference case of this. This exists because callers
185
+ * needing three or more levels — quiet, loud and silent, which is what a liveness screen compares —
186
+ * were otherwise reimplementing the settle-then-capture policy themselves, and **a shared policy
187
+ * module only helps if the callers can get what they need from it.** Every instrument that
188
+ * hardcoded its own render window instead was wrong by up to 42 dB on the amp corpus.
189
+ *
190
+ * The window is the latest settle point across the drives, so every render is steady across it. A
191
+ * drive that never settles does not veto the others: it contributes nothing to the choice of
192
+ * window and is reported over the same one, which is a level taken late rather than no level.
193
+ */
194
+ export declare function measureSharedWindow(program: Program, sampleRate: number, sampleAt: (index: number) => number, drives: readonly number[], options?: SettleOptions): {
195
+ /** `null` when no drive settled at all; the measurements are then taken at the ladder's end. */
196
+ readonly settleSeconds: number | null;
197
+ readonly measurements: readonly SharedWindowMeasurement[];
198
+ /** Which criterion produced this row. Record it beside the verdict. */
199
+ readonly criterion: SettleCriterion;
200
+ };
201
+ export declare function measureSettledSignal(program: Program, sampleRate: number, sampleAt: (index: number) => number, options?: SettleOptions): AttributedMeasurement;
202
+ /**
203
+ * Known-answer controls for the measurement primitives here.
204
+ *
205
+ * **Every measurement function should have an input whose answer is known independently of the
206
+ * measurement.** Today both broken instruments were in the position of never having been pointed
207
+ * at one: broadband plate correlation was never checked against a circuit whose phase relationship
208
+ * was known, and `measureSettledSignal` shipped with an alignment defect that a single identity
209
+ * assertion would have caught before it produced a table with more signal than total output.
210
+ *
211
+ * The identity here is the cheapest control that exists: **difference a render against itself and
212
+ * the answer must be exactly zero.** Any misalignment, window mismatch, or off-by-one in the sample
213
+ * range breaks it immediately and loudly.
214
+ */
215
+ export declare function settleSelfCheck(program: Program, sampleRate: number, sampleAt: (index: number) => number, options?: SettleOptions): {
216
+ readonly name: string;
217
+ readonly ok: boolean;
218
+ readonly detail: string;
219
+ }[];
220
+ /**
221
+ * The result of rendering something until it holds still, in the three-outcome shape every screen
222
+ * in this repo needs: a value, a refusal, or a diverged solve. Never a number it could not stand
223
+ * behind.
224
+ *
225
+ * It is a discriminated union rather than a nullable number **so the refusal cannot be read as a
226
+ * measurement by accident**: `.rms` does not exist until `status` has been narrowed, which is the
227
+ * compiler enforcing what a convention could only ask for.
228
+ */
229
+ export type SettledRender = {
230
+ readonly status: "settled";
231
+ /** Seconds into the render at which the level stopped moving. */
232
+ readonly seconds: number;
233
+ /** rms about the mean of the settled window -- the same policy `findSettled` used. */
234
+ readonly rms: number;
235
+ readonly peak: number;
236
+ readonly dc: number;
237
+ /** The settled window's samples, so spectral work happens on settled audio. */
238
+ readonly tail: Float64Array;
239
+ } | {
240
+ readonly status: "unsettled";
241
+ /** How long it rendered before giving up: the ladder's last rung. */
242
+ readonly triedSeconds: number;
243
+ /** Window levels, so a caller can see whether it was drifting or oscillating. */
244
+ readonly windows: readonly number[];
245
+ } | {
246
+ readonly status: "nonfinite";
247
+ readonly atSample: number;
248
+ };
249
+ /** What to render. Everything is optional; the bare call renders silence. */
250
+ export type SettledRenderOptions = {
251
+ readonly sampleRate?: number;
252
+ /** Test tone frequency. Omit or set 0 for an idle render. */
253
+ readonly hz?: number;
254
+ /** Test tone amplitude. */
255
+ readonly drive?: number;
256
+ /**
257
+ * A stimulus in volts as a function of absolute sample index, for anything `hz`/`drive`
258
+ * cannot express -- a multi-tone probe, a sweep, a recorded input. Takes precedence over
259
+ * `hz`/`drive`. Same shape `measureSettled` already takes, so the two stay comparable.
260
+ */
261
+ readonly sampleAt?: (index: number) => number;
262
+ /**
263
+ * Control positions to set before rendering, as `[id, position]` pairs.
264
+ *
265
+ * Here because the commonest reason to render twice is to move one knob, and a helper that
266
+ * cannot do that sends the caller back to `new ReferenceRuntime` -- which is the path this
267
+ * exists to displace. A control question is a settling question like any other:
268
+ * `boss-bd-2-blues-driver`'s LEVEL was called dead off a 50 ms render.
269
+ */
270
+ readonly controls?: readonly (readonly [string, number])[];
271
+ readonly settle?: SettleOptions;
272
+ };
273
+ export declare function settledRender(program: Program, options?: SettledRenderOptions): SettledRender;
274
+ /** Thrown by `settledLevel` rather than returning a level it could not settle. */
275
+ export declare class SettleRefusal extends Error {
276
+ }
277
+ /**
278
+ * `settledRender`'s level as a bare number, throwing rather than returning one it cannot stand
279
+ * behind. The one-line form for a scratch probe: `const rms = settledLevel(program)`.
280
+ *
281
+ * Throwing is the point. A scratch script that ignores a return code still reports a number; one
282
+ * that throws stops, which is the loud failure the three-outcome rule asks for.
283
+ */
284
+ export declare function settledLevel(program: Program, options?: SettledRenderOptions): number;
285
+ /**
286
+ * Settle a program once, then measure it at each control setting in turn **on the same runtime**.
287
+ *
288
+ * **Why this and not a settle-point cache.** The obvious saving is to remember each packet's
289
+ * settle time and skip the search, but measurement says the search is not the cost: a windowed
290
+ * `settledRender` runs within **3%** of a single `process()` call of the same duration, because
291
+ * `findSettled` already stops the moment the level holds. What costs is *rendering to settle at
292
+ * all*, and a fresh runtime pays the full start-up transient every time — charging supplies over
293
+ * ten seconds to move one knob.
294
+ *
295
+ * Continuing on a runtime that has already settled pays it once:
296
+ *
297
+ * | packet | initial settle | re-settle after a knob move |
298
+ * | --- | --- | --- |
299
+ * | `marshall-jcm800` | 10 s, 15.9 s wall | 1.5 s, 2.36 s — **6.7x cheaper** |
300
+ * | `hiwatt-dr103` | 9 s, 23.0 s wall | 1.5 s, 3.84 s — **6.0x cheaper** |
301
+ * | `orange-rockerverb` | 1.5 s | 1.5 s — 1.0x, already at the floor |
302
+ *
303
+ * The floor is `consecutive` stable windows, currently 1.5 s, so a packet that settles that fast
304
+ * gains nothing and loses nothing. The gain is concentrated where the expense is.
305
+ *
306
+ * **The cost of the trick, stated rather than hidden: this is order-dependent by construction.**
307
+ * A circuit with memory — a latch, a sag-dependent bias, an envelope with a long tail — can land
308
+ * somewhere different depending on which setting preceded it, where independent renders cannot.
309
+ * That is also *more* physical than restarting, since a real pedal is never power-cycled between
310
+ * knob positions. `sweepIsOrderIndependent` checks it directly by sweeping forwards and backwards,
311
+ * and a caller measuring a latching circuit should use `settledRender` per point instead.
312
+ */
313
+ export declare function settledSweep(program: Program, points: readonly (readonly (readonly [string, number])[])[], options?: SettledRenderOptions): readonly SettledRender[];
314
+ /**
315
+ * Does sharing a runtime change the answer? Compare a sweep against independent renders.
316
+ *
317
+ * **This replaces an order check, which was the wrong question.** `sweepIsOrderIndependent` asked
318
+ * whether sweeping forwards and backwards agreed, and on `boss-lm-2` — a limiter — it answered
319
+ * **true** while the sweep was wrong by **84 dB**:
320
+ *
321
+ * ```
322
+ * swept: 1.067e-6 1.057e-6 1.067e-6 1.058e-6
323
+ * independent: 1.821e-2 1.056e-6 1.821e-2 1.056e-6
324
+ * ```
325
+ *
326
+ * The hazard is not the *sequence* of points, it is sharing state at all. `settledSweep` settles
327
+ * once before the first point, and for an envelope circuit that initial settle drives the
328
+ * compressor into gain reduction that no later point recovers from — so every point is poisoned
329
+ * *equally*, forwards and backwards alike, and an order check sees perfect agreement.
330
+ *
331
+ * The only sound validation is against the thing the sweep is an optimisation of. Circuits at risk
332
+ * are the ones carrying state across a control change: compressors, limiters, noise gates,
333
+ * envelope filters, slow LFOs, anything with a long-tailed bias.
334
+ */
335
+ export declare function sweepMatchesIndependent(program: Program, points: readonly (readonly (readonly [string, number])[])[], options?: SettledRenderOptions, toleranceDb?: number): boolean;
336
+ /**
337
+ * **Sweep where it is safe, and fall back where it is not.**
338
+ *
339
+ * Verifies one point against an independent render — the cheapest check that can catch a shared
340
+ * state hazard — and re-measures the whole packet independently when they disagree. A packet that
341
+ * carries no state across a control change pays one extra render; one that does gets the right
342
+ * answer instead of a fast wrong one.
343
+ *
344
+ * The verified point is the **first**, because that is the one immediately after the shared
345
+ * initial settle and therefore the most exposed to it.
346
+ */
347
+ export declare function settledSweepVerified(program: Program, points: readonly (readonly (readonly [string, number])[])[], options?: SettledRenderOptions, toleranceDb?: number): {
348
+ readonly results: readonly SettledRender[];
349
+ readonly shared: boolean;
350
+ };
351
+ /**
352
+ * Does this program give the same swept answers backwards as forwards?
353
+ *
354
+ * `settledSweep`'s saving comes from not restarting, which makes it order-dependent for any
355
+ * circuit carrying state across a control change. This is the check: sweep the points, sweep them
356
+ * reversed, and compare the levels. `false` means the packet needs independent renders.
357
+ */
358
+ export declare function sweepIsOrderIndependent(program: Program, points: readonly (readonly (readonly [string, number])[])[], options?: SettledRenderOptions, tolerance?: number): boolean;
359
+ //# sourceMappingURL=settle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settle.d.ts","sourceRoot":"","sources":["../src/settle.ts"],"names":[],"mappings":"AA8BA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAGpD,MAAM,MAAM,aAAa,GAAG;IAC3B,kDAAkD;IAClD,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,mFAAmF;IACnF,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,wDAAwD;IACxD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,sEAAsE;IACtE,QAAQ,CAAC,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;CAC1C,CAAC;AAEF;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,eAAe,EAAE,aAK7B,CAAC;AAEF,gEAAgE;AAChE,eAAO,MAAM,gBAAgB,WAAO,CAAC;AAErC,gGAAgG;AAChG,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAEjD;AAED,MAAM,MAAM,OAAO,GAAG;IACrB,8CAA8C;IAC9C,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,mDAAmD;IACnD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,WAAW,CAC1B,SAAS,EAAE,SAAS,MAAM,EAAE,EAC5B,OAAO,GAAE,aAA+B,GACtC,OAAO,GAAG,IAAI,CAchB;AA0BD;;;;;;;;;;;;;GAaG;AACH,MAAM,MAAM,qBAAqB,GAAG,kBAAkB,GAAG;IACxD,sFAAsF;IACtF,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,0EAA0E;IAC1E,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CACrC,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAChC,8EAA8E;IAC9E,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,+EAA+E;IAC/E,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;CAC7B,CAAC;AAEF;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAC7B,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,EACnC,OAAO,GAAE,aAA+B,GACtC,kBAAkB,CA8CpB;AAED,qFAAqF;AACrF,MAAM,MAAM,qBAAqB,GAAG;IACnC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,8DAA8D;IAC9D,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC7B,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,wBAAgB,wBAAwB,CACvC,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,EACnC,OAAO,GAAE,aAA+B,GACtC,SAAS,qBAAqB,EAAE,CAuElC;AAED;;;;;;;;;;;;;;;GAeG;AACH,0FAA0F;AAC1F,MAAM,MAAM,uBAAuB,GAAG;IACrC,6EAA6E;IAC7E,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,wEAAwE;IACxE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH;;;;;;;;GAQG;AACH,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,QAAQ,GAAG,WAAW,CAAC;AAwH9D;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,mBAAmB,CAClC,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,EACnC,MAAM,EAAE,SAAS,MAAM,EAAE,EACzB,OAAO,GAAE,aAA+B,GACtC;IACF,gGAAgG;IAChG,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,QAAQ,CAAC,YAAY,EAAE,SAAS,uBAAuB,EAAE,CAAC;IAC1D,uEAAuE;IACvE,QAAQ,CAAC,SAAS,EAAE,eAAe,CAAC;CACpC,CA+BA;AAED,wBAAgB,oBAAoB,CACnC,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,EACnC,OAAO,GAAE,aAA+B,GACtC,qBAAqB,CAmEvB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,eAAe,CAC9B,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,EACnC,OAAO,GAAE,aAA+B,GACtC;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,EAAE,CA2J5E;AAED;;;;;;;;GAQG;AACH,MAAM,MAAM,aAAa,GACtB;IACA,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;IAC3B,iEAAiE;IACjE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,sFAAsF;IACtF,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,+EAA+E;IAC/E,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;CAC3B,GACD;IACA,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,qEAAqE;IACrE,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,iFAAiF;IACjF,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;CACnC,GACD;IAAE,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC;AAE/D,6EAA6E;AAC7E,MAAM,MAAM,oBAAoB,GAAG;IAClC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,6DAA6D;IAC7D,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IACrB,2BAA2B;IAC3B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB;;;;OAIG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IAC9C;;;;;;;OAOG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;IAC3D,QAAQ,CAAC,MAAM,CAAC,EAAE,aAAa,CAAC;CAChC,CAAC;AAgCF,wBAAgB,aAAa,CAC5B,OAAO,EAAE,OAAO,EAChB,OAAO,GAAE,oBAAyB,GAChC,aAAa,CAgDf;AAED,kFAAkF;AAClF,qBAAa,aAAc,SAAQ,KAAK;CAAG;AAE3C;;;;;;GAMG;AACH,wBAAgB,YAAY,CAC3B,OAAO,EAAE,OAAO,EAChB,OAAO,GAAE,oBAAyB,GAChC,MAAM,CAWR;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAgB,YAAY,CAC3B,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,EAC3D,OAAO,GAAE,oBAAyB,GAChC,SAAS,aAAa,EAAE,CA8E1B;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,uBAAuB,CACtC,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,EAC3D,OAAO,GAAE,oBAAyB,EAClC,WAAW,SAAM,GACf,OAAO,CAcT;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CACnC,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,EAC3D,OAAO,GAAE,oBAAyB,EAClC,WAAW,SAAM,GACf;IAAE,QAAQ,CAAC,OAAO,EAAE,SAAS,aAAa,EAAE,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;CAAE,CAyB1E;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CACtC,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,EAC3D,OAAO,GAAE,oBAAyB,EAClC,SAAS,SAAO,GACd,OAAO,CAYT"}