@vune-ui/execution 0.1.20

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.
@@ -0,0 +1,578 @@
1
+ import { BackendCapability, ExecutionRegion, ExecutionTelemetry, ResidentBuffer, } from "./index.js";
2
+ export var ResidentWasmOpcode;
3
+ (function (ResidentWasmOpcode) {
4
+ ResidentWasmOpcode[ResidentWasmOpcode["End"] = 0] = "End";
5
+ ResidentWasmOpcode[ResidentWasmOpcode["Kernel"] = 1] = "Kernel";
6
+ ResidentWasmOpcode[ResidentWasmOpcode["ConstF32"] = 2] = "ConstF32";
7
+ ResidentWasmOpcode[ResidentWasmOpcode["LoadColumn"] = 3] = "LoadColumn";
8
+ ResidentWasmOpcode[ResidentWasmOpcode["Index"] = 4] = "Index";
9
+ ResidentWasmOpcode[ResidentWasmOpcode["Capture"] = 5] = "Capture";
10
+ ResidentWasmOpcode[ResidentWasmOpcode["Positive"] = 6] = "Positive";
11
+ ResidentWasmOpcode[ResidentWasmOpcode["Negative"] = 7] = "Negative";
12
+ ResidentWasmOpcode[ResidentWasmOpcode["Not"] = 8] = "Not";
13
+ ResidentWasmOpcode[ResidentWasmOpcode["Add"] = 9] = "Add";
14
+ ResidentWasmOpcode[ResidentWasmOpcode["Subtract"] = 10] = "Subtract";
15
+ ResidentWasmOpcode[ResidentWasmOpcode["Multiply"] = 11] = "Multiply";
16
+ ResidentWasmOpcode[ResidentWasmOpcode["Divide"] = 12] = "Divide";
17
+ ResidentWasmOpcode[ResidentWasmOpcode["LessThan"] = 13] = "LessThan";
18
+ ResidentWasmOpcode[ResidentWasmOpcode["LessEqual"] = 14] = "LessEqual";
19
+ ResidentWasmOpcode[ResidentWasmOpcode["GreaterThan"] = 15] = "GreaterThan";
20
+ ResidentWasmOpcode[ResidentWasmOpcode["GreaterEqual"] = 16] = "GreaterEqual";
21
+ ResidentWasmOpcode[ResidentWasmOpcode["Equal"] = 17] = "Equal";
22
+ ResidentWasmOpcode[ResidentWasmOpcode["NotEqual"] = 18] = "NotEqual";
23
+ ResidentWasmOpcode[ResidentWasmOpcode["And"] = 19] = "And";
24
+ ResidentWasmOpcode[ResidentWasmOpcode["Or"] = 20] = "Or";
25
+ ResidentWasmOpcode[ResidentWasmOpcode["Select"] = 21] = "Select";
26
+ ResidentWasmOpcode[ResidentWasmOpcode["StoreTemp"] = 22] = "StoreTemp";
27
+ ResidentWasmOpcode[ResidentWasmOpcode["Commit"] = 23] = "Commit";
28
+ })(ResidentWasmOpcode || (ResidentWasmOpcode = {}));
29
+ function activeResidentRows(binding, ranges) {
30
+ if (!ranges || ranges.length === 0)
31
+ return binding.length;
32
+ let rows = 0;
33
+ for (const range of ranges)
34
+ rows += Math.max(0, range.end - range.start);
35
+ return rows;
36
+ }
37
+ function linearCostModel(samples) {
38
+ if (samples.length < 2)
39
+ return null;
40
+ let sumX = 0;
41
+ let sumY = 0;
42
+ let sumXX = 0;
43
+ let sumXY = 0;
44
+ for (const sample of samples) {
45
+ sumX += sample.work;
46
+ sumY += sample.totalMs;
47
+ sumXX += sample.work * sample.work;
48
+ sumXY += sample.work * sample.totalMs;
49
+ }
50
+ const count = samples.length;
51
+ const denominator = count * sumXX - sumX * sumX;
52
+ if (Math.abs(denominator) < Number.EPSILON)
53
+ return null;
54
+ const perWork = Math.max(0, (count * sumXY - sumX * sumY) / denominator);
55
+ const fixed = Math.max(0, (sumY - perWork * sumX) / count);
56
+ return Object.freeze({ fixed, perWork });
57
+ }
58
+ /**
59
+ * Predict JS vs AOT SIMD from compiler-known kernel cost and the actual dirty
60
+ * row count. Only the uncertain crossover band is benchmarked. Measured
61
+ * samples continuously replace the conservative bootstrap thresholds with a
62
+ * per-region linear cost model.
63
+ */
64
+ export class ResidentAdaptiveNativeScheduler {
65
+ lowWorkThreshold;
66
+ highWorkThreshold;
67
+ minimumPredictionMargin;
68
+ sampleCapacity;
69
+ #jsSamples = [];
70
+ #wasmSamples = [];
71
+ #last = Object.freeze({
72
+ choice: "calibrate",
73
+ activeRows: 0,
74
+ weightedWork: 0,
75
+ predictedJsMs: null,
76
+ predictedWasmMs: null,
77
+ jsSamples: 0,
78
+ wasmSamples: 0,
79
+ });
80
+ constructor(options = {}) {
81
+ this.lowWorkThreshold = Math.max(1, Number(options.lowWorkThreshold ?? 4_000));
82
+ this.highWorkThreshold = Math.max(this.lowWorkThreshold + 1, Number(options.highWorkThreshold ?? 12_000));
83
+ this.minimumPredictionMargin = Math.min(0.5, Math.max(0, Number(options.minimumPredictionMargin ?? 0.08)));
84
+ this.sampleCapacity = Math.max(4, Math.floor(options.sampleCapacity ?? 24));
85
+ }
86
+ work(binding, options = {}) {
87
+ const activeRows = activeResidentRows(binding, options.ranges);
88
+ const profile = binding.program.costProfile;
89
+ const weightedOps = Math.max(1, profile?.weightedOpsPerItem ?? binding.program.operationCount);
90
+ const suitability = Math.max(0.25, profile?.simdSuitability ?? (binding.directBackend === "wasm-aot-simd" ? 1 : 0.5));
91
+ const branchPenalty = 1 + (profile?.branchPressure ?? 0) * 0.35;
92
+ return Object.freeze({
93
+ activeRows,
94
+ weightedWork: activeRows * weightedOps * branchPenalty / suitability,
95
+ });
96
+ }
97
+ choose(binding, options = {}) {
98
+ const { activeRows, weightedWork } = this.work(binding, options);
99
+ const jsModel = linearCostModel(this.#jsSamples);
100
+ const wasmModel = linearCostModel(this.#wasmSamples);
101
+ let predictedJsMs = null;
102
+ let predictedWasmMs = null;
103
+ let choice;
104
+ if (jsModel && wasmModel) {
105
+ predictedJsMs = jsModel.fixed + jsModel.perWork * weightedWork;
106
+ predictedWasmMs = wasmModel.fixed + wasmModel.perWork * weightedWork;
107
+ const smaller = Math.min(predictedJsMs, predictedWasmMs);
108
+ const margin = smaller <= 0 ? 0 : Math.abs(predictedJsMs - predictedWasmMs) / smaller;
109
+ choice = margin < this.minimumPredictionMargin
110
+ ? "calibrate"
111
+ : predictedWasmMs < predictedJsMs ? "wasm" : "packed-js";
112
+ }
113
+ else if (binding.directBackend !== "wasm-aot-simd") {
114
+ choice = "calibrate";
115
+ }
116
+ else if (weightedWork <= this.lowWorkThreshold) {
117
+ choice = "packed-js";
118
+ }
119
+ else if (weightedWork >= this.highWorkThreshold) {
120
+ choice = "wasm";
121
+ }
122
+ else {
123
+ choice = "calibrate";
124
+ }
125
+ this.#last = Object.freeze({
126
+ choice,
127
+ activeRows,
128
+ weightedWork,
129
+ predictedJsMs,
130
+ predictedWasmMs,
131
+ jsSamples: this.#jsSamples.length,
132
+ wasmSamples: this.#wasmSamples.length,
133
+ });
134
+ return choice;
135
+ }
136
+ record(backend, binding, options, totalMs) {
137
+ const { weightedWork } = this.work(binding, options);
138
+ const target = backend === "packed-js" ? this.#jsSamples : this.#wasmSamples;
139
+ target.push(Object.freeze({ work: weightedWork, totalMs }));
140
+ if (target.length > this.sampleCapacity)
141
+ target.splice(0, target.length - this.sampleCapacity);
142
+ }
143
+ snapshot() {
144
+ return this.#last;
145
+ }
146
+ }
147
+ const ERROR_MESSAGES = Object.freeze({
148
+ 1: "program ended without an End opcode",
149
+ 2: "nested or malformed kernel group",
150
+ 3: "kernel output count exceeds the resident ABI",
151
+ 4: "operand stack underflow or overflow",
152
+ 5: "column index is outside the bound layout",
153
+ 6: "capture index is outside the bound capture table",
154
+ 7: "program contains an unsupported opcode",
155
+ 8: "kernel output commit is malformed",
156
+ 9: "resident pointer table is invalid",
157
+ 10: "resident dirty range is invalid",
158
+ });
159
+ function now() {
160
+ const clock = globalThis.performance;
161
+ return clock?.now() ?? Date.now();
162
+ }
163
+ function asBytes(bytes) {
164
+ return bytes instanceof Uint8Array ? bytes : new Uint8Array(bytes);
165
+ }
166
+ function isSharedMemory(memory) {
167
+ return typeof SharedArrayBuffer !== "undefined" && memory.buffer instanceof SharedArrayBuffer;
168
+ }
169
+ function pagesFor(byteLength) {
170
+ if (!Number.isSafeInteger(byteLength) || byteLength <= 0)
171
+ throw new RangeError("resident WASM byteLength must be positive");
172
+ return Math.max(2, Math.ceil(byteLength / 65536));
173
+ }
174
+ /** A fixed-size memory cannot detach resident views through `memory.grow()`. */
175
+ export function createResidentWasmMemory(byteLength, shared = false) {
176
+ const pages = pagesFor(byteLength);
177
+ if (shared && typeof SharedArrayBuffer === "undefined")
178
+ throw new Error("SharedArrayBuffer is unavailable");
179
+ return new WebAssembly.Memory({ initial: pages, maximum: pages, ...(shared ? { shared: true } : {}) });
180
+ }
181
+ async function instantiateVariant(bytes, memory) {
182
+ const result = await WebAssembly.instantiate(asBytes(bytes), { env: { memory } });
183
+ return "instance" in result ? result.instance : result;
184
+ }
185
+ /**
186
+ * Instantiate SIMD when the engine validates it, otherwise use the checked-in
187
+ * scalar module. Both variants import the caller's already-resident memory.
188
+ */
189
+ export async function instantiateResidentWasmRuntime(options) {
190
+ const shared = isSharedMemory(options.memory);
191
+ let instance;
192
+ let variant = "scalar";
193
+ if (options.preferSimd !== false) {
194
+ try {
195
+ instance = await instantiateVariant(options.simdBytes, options.memory);
196
+ variant = "simd";
197
+ }
198
+ catch {
199
+ // Scalar remains the required correctness fallback.
200
+ }
201
+ }
202
+ instance ??= await instantiateVariant(options.scalarBytes, options.memory);
203
+ const exports = instance.exports;
204
+ if (typeof exports.resident_execute !== "function" || typeof exports.resident_alloc !== "function") {
205
+ throw new TypeError("resident WASM module does not implement the execution ABI");
206
+ }
207
+ if ((exports.resident_simd_enabled() === 1) !== (variant === "simd")) {
208
+ throw new TypeError("resident WASM module variant does not match its capability export");
209
+ }
210
+ let sealed = false;
211
+ const runtime = {
212
+ memory: options.memory,
213
+ instance,
214
+ exports,
215
+ variant,
216
+ shared,
217
+ fixedByteLength: options.memory.buffer.byteLength,
218
+ get sealed() { return sealed; },
219
+ allocate(bytes, alignment = 16) {
220
+ if (sealed)
221
+ throw new Error("resident WASM memory is sealed; create a new region instead of rebinding it");
222
+ if (!Number.isSafeInteger(bytes) || bytes <= 0)
223
+ throw new RangeError("resident allocation must be positive");
224
+ const pointer = exports.resident_alloc(bytes, alignment);
225
+ if (pointer === 0)
226
+ throw new RangeError(`resident WASM memory capacity exceeded while allocating ${bytes} bytes`);
227
+ return pointer;
228
+ },
229
+ seal() { sealed = true; },
230
+ };
231
+ return runtime;
232
+ }
233
+ export async function defaultResidentWasmAssetReader(url) {
234
+ const URLConstructor = globalThis.URL;
235
+ const parsed = new URLConstructor(url);
236
+ if (parsed.protocol === "file:") {
237
+ const moduleName = "node:fs/promises";
238
+ const fileSystem = await import(moduleName);
239
+ return fileSystem.readFile(parsed);
240
+ }
241
+ const fetchFunction = globalThis.fetch;
242
+ if (!fetchFunction)
243
+ throw new Error(`No resident WASM asset reader is available for ${parsed.href}`);
244
+ const response = await fetchFunction(parsed.href);
245
+ if (!response.ok)
246
+ throw new Error(`Failed to load resident WASM (${response.status}): ${parsed.href}`);
247
+ return response.arrayBuffer();
248
+ }
249
+ /** Load the copied package assets without making every consumer inject bytes. */
250
+ export async function loadDefaultResidentWasmRuntime(options) {
251
+ const URLConstructor = globalThis.URL;
252
+ const shared = isSharedMemory(options.memory);
253
+ const prefix = shared ? "resident-kernel-shared-" : "resident-kernel-";
254
+ const assetReader = options.assetReader ?? defaultResidentWasmAssetReader;
255
+ const simdUrl = new URLConstructor(`./wasm/${prefix}simd.wasm`, import.meta.url).href;
256
+ const scalarUrl = new URLConstructor(`./wasm/${prefix}scalar.wasm`, import.meta.url).href;
257
+ const [simdBytes, scalarBytes] = await Promise.all([assetReader(simdUrl), assetReader(scalarUrl)]);
258
+ return instantiateResidentWasmRuntime({
259
+ memory: options.memory,
260
+ simdBytes,
261
+ scalarBytes,
262
+ preferSimd: options.preferSimd,
263
+ });
264
+ }
265
+ function assertDenseF32Layout(layout) {
266
+ if (layout.fields.length === 0 || layout.fields.length > 64)
267
+ throw new TypeError("resident WASM supports 1 through 64 columns");
268
+ const length = layout.fields[0].length;
269
+ for (const field of layout.fields) {
270
+ if (field.type !== "f32" || field.byteStride !== 4 || field.length !== length) {
271
+ throw new TypeError("resident WASM requires equal-length dense f32 columns");
272
+ }
273
+ }
274
+ return length;
275
+ }
276
+ function instantiateDirectResidentExecutor(bytes, entrypoint, memory) {
277
+ try {
278
+ const directBytes = bytes.buffer instanceof ArrayBuffer
279
+ ? new Uint8Array(bytes.buffer, bytes.byteOffset, bytes.byteLength)
280
+ : Uint8Array.from(bytes);
281
+ const module = new WebAssembly.Module(directBytes);
282
+ const instance = new WebAssembly.Instance(module, { env: { memory } });
283
+ const candidate = instance.exports[entrypoint];
284
+ return typeof candidate === "function" ? candidate : undefined;
285
+ }
286
+ catch {
287
+ return undefined;
288
+ }
289
+ }
290
+ /** Allocate the authoritative columns and all fixed ABI metadata in one memory. */
291
+ export function bindResidentWasmRegion(runtime, layout, program, options = {}) {
292
+ if (runtime.sealed)
293
+ throw new Error("resident WASM runtime is already bound");
294
+ const length = assertDenseF32Layout(layout);
295
+ if (program.fieldNames.length !== layout.fields.length
296
+ || program.fieldNames.some((name, index) => layout.fields[index]?.name !== name)) {
297
+ throw new TypeError("resident WASM program fields do not match the authoritative BufferLayout");
298
+ }
299
+ const maxRanges = options.maxRanges ?? 64;
300
+ if (!Number.isSafeInteger(maxRanges) || maxRanges <= 0)
301
+ throw new RangeError("maxRanges must be positive");
302
+ const storagePointer = runtime.allocate(layout.byteLength, layout.alignment);
303
+ const views = layout.fields.map(field => new Float32Array(runtime.memory.buffer, storagePointer + field.byteOffset, field.length));
304
+ const columnPointersPointer = runtime.allocate(layout.fields.length * 4, 4);
305
+ const columnPointers = new Uint32Array(runtime.memory.buffer, columnPointersPointer, layout.fields.length);
306
+ layout.fields.forEach((field, index) => { columnPointers[index] = storagePointer + field.byteOffset; });
307
+ const programPointer = runtime.allocate(program.words.byteLength, 4);
308
+ new Uint32Array(runtime.memory.buffer, programPointer, program.words.length).set(program.words);
309
+ const rangesPointer = runtime.allocate(maxRanges * 2 * 4, 4);
310
+ const ranges = new Uint32Array(runtime.memory.buffer, rangesPointer, maxRanges * 2);
311
+ const captureSlots = Math.max(1, program.captureNames.length);
312
+ const capturesPointer = runtime.allocate(captureSlots * 4, 4);
313
+ const captures = new Float32Array(runtime.memory.buffer, capturesPointer, captureSlots);
314
+ const controlPointer = runtime.allocate(16 * 4, 4);
315
+ const control = new Int32Array(runtime.memory.buffer, controlPointer, 16);
316
+ const buffer = runtime.shared
317
+ ? ResidentBuffer.sharedWasm(layout, runtime.memory, views)
318
+ : ResidentBuffer.wasm(layout, runtime.memory, views);
319
+ let directExecute;
320
+ let directBackend;
321
+ if (!runtime.shared && runtime.variant === "simd"
322
+ && program.directSimdModuleBytes && program.directSimdEntrypoint === "resident_execute_direct_simd") {
323
+ directExecute = instantiateDirectResidentExecutor(program.directSimdModuleBytes, program.directSimdEntrypoint, runtime.memory);
324
+ if (directExecute)
325
+ directBackend = "wasm-aot-simd";
326
+ }
327
+ if (!runtime.shared && !directExecute && program.directModuleBytes && program.directEntrypoint === "resident_execute_direct") {
328
+ directExecute = instantiateDirectResidentExecutor(program.directModuleBytes, program.directEntrypoint, runtime.memory);
329
+ if (directExecute)
330
+ directBackend = "wasm-aot-scalar";
331
+ }
332
+ runtime.seal();
333
+ return Object.freeze({
334
+ runtime,
335
+ program,
336
+ buffer,
337
+ length,
338
+ programPointer,
339
+ columnPointersPointer,
340
+ columnPointers,
341
+ rangesPointer,
342
+ ranges,
343
+ capturesPointer,
344
+ captures,
345
+ controlPointer,
346
+ control,
347
+ ...(directExecute ? { directExecute } : {}),
348
+ ...(directBackend ? { directBackend } : {}),
349
+ boundStorageEpoch: buffer.storageEpoch,
350
+ boundMemoryBuffer: runtime.memory.buffer,
351
+ });
352
+ }
353
+ function validateBinding(binding) {
354
+ if (binding.runtime.memory.buffer !== binding.boundMemoryBuffer) {
355
+ throw new Error("storage-epoch-changed: WebAssembly.Memory grew after resident binding");
356
+ }
357
+ if (binding.buffer.storageEpoch !== binding.boundStorageEpoch) {
358
+ throw new Error("storage-epoch-changed: ResidentBuffer views were rebound");
359
+ }
360
+ }
361
+ export function prepareResidentWasmExecution(binding, options) {
362
+ const started = now();
363
+ const ranges = options.ranges ?? [{ start: 0, end: binding.length }];
364
+ if (ranges.length * 2 > binding.ranges.length)
365
+ throw new RangeError("resident execution exceeds the bound dirty-range capacity");
366
+ ranges.forEach((range, index) => {
367
+ if (!Number.isSafeInteger(range.start) || !Number.isSafeInteger(range.end)
368
+ || range.start < 0 || range.end < range.start || range.end > binding.length) {
369
+ throw new RangeError("resident execution range is outside authoritative storage");
370
+ }
371
+ binding.ranges[index * 2] = range.start;
372
+ binding.ranges[index * 2 + 1] = range.end;
373
+ });
374
+ const captures = options.captures;
375
+ if (binding.program.captureNames.length > 0) {
376
+ if (!(captures instanceof Float32Array) || captures.length !== binding.program.captureNames.length) {
377
+ throw new TypeError("resident WASM captures must be a compiler-ordered Float32Array");
378
+ }
379
+ binding.captures.set(captures);
380
+ }
381
+ else if (captures && captures.length !== 0) {
382
+ throw new TypeError("resident WASM program declares no captures");
383
+ }
384
+ return Object.freeze({
385
+ rangeCount: ranges.length,
386
+ synchronizationBytes: (ranges.length * 2 + binding.program.captureNames.length) * 4,
387
+ synchronizationMs: now() - started,
388
+ });
389
+ }
390
+ /** Convert logical row ranges to byte ranges for every resident SoA column. */
391
+ export function markResidentWasmRanges(binding, ranges = [{ start: 0, end: binding.length }]) {
392
+ const byteRanges = [];
393
+ for (const field of binding.buffer.layout.fields) {
394
+ for (const range of ranges) {
395
+ const start = field.byteOffset + range.start * field.byteStride;
396
+ const end = range.start === range.end
397
+ ? start
398
+ : field.byteOffset + (range.end - 1) * field.byteStride + 4;
399
+ byteRanges.push({ start, end });
400
+ }
401
+ }
402
+ return binding.buffer.markWrittenRanges(byteRanges);
403
+ }
404
+ /** Execute one fused program call without packing rows or reconstructing objects. */
405
+ export function executeResidentWasm(binding, options = {}) {
406
+ validateBinding(binding);
407
+ const totalStarted = now();
408
+ const metadata = prepareResidentWasmExecution(binding, options);
409
+ const computeStarted = now();
410
+ const result = binding.directExecute
411
+ ? binding.directExecute(binding.columnPointersPointer, binding.rangesPointer, metadata.rangeCount, binding.capturesPointer)
412
+ : binding.runtime.exports.resident_execute(binding.programPointer, binding.program.words.length, binding.columnPointersPointer, binding.columnPointers.length, binding.rangesPointer, metadata.rangeCount, binding.capturesPointer, binding.program.captureNames.length);
413
+ const computeMs = now() - computeStarted;
414
+ if (result !== 0)
415
+ throw new Error(`resident WASM execution failed (${result}): ${ERROR_MESSAGES[result] ?? "unknown ABI error"}`);
416
+ const contentVersion = markResidentWasmRanges(binding, options.ranges);
417
+ return Object.freeze({
418
+ backend: binding.directBackend ?? (binding.runtime.variant === "simd" ? "wasm-simd" : "wasm-scalar"),
419
+ computeMs,
420
+ transferBytes: 0,
421
+ transferMs: 0,
422
+ materializationBytes: 0,
423
+ materializationMs: 0,
424
+ readbackBytes: 0,
425
+ readbackMs: 0,
426
+ synchronizationBytes: metadata.synchronizationBytes,
427
+ synchronizationMs: metadata.synchronizationMs,
428
+ totalMs: now() - totalStarted,
429
+ wasmCalls: 1,
430
+ storageEpoch: binding.buffer.storageEpoch,
431
+ contentVersion,
432
+ });
433
+ }
434
+ /**
435
+ * Alternate the mandatory packed-JS and WASM executors over the same
436
+ * authoritative TypedArrays, then cache promotion only after a measured win.
437
+ */
438
+ export class ResidentWasmPromotion {
439
+ telemetry;
440
+ binding;
441
+ region;
442
+ packedJs;
443
+ minimumSamples;
444
+ minimumMargin;
445
+ experimental;
446
+ scheduler;
447
+ #decision = "benchmarking";
448
+ #reason = "insufficient-measured-samples";
449
+ #executions = 0;
450
+ #synchronizationBytes = 0;
451
+ constructor(options) {
452
+ if (typeof options.packedJs !== "function")
453
+ throw new TypeError("packed-js-baseline-required");
454
+ this.binding = options.binding;
455
+ this.region = options.region;
456
+ this.packedJs = options.packedJs;
457
+ this.telemetry = options.telemetry ?? new ExecutionTelemetry();
458
+ this.minimumSamples = Math.max(1, Math.floor(options.minimumSamples ?? 5));
459
+ this.minimumMargin = Math.min(0.9, Math.max(0, options.minimumMargin ?? 0.10));
460
+ this.scheduler = options.scheduler ?? new ResidentAdaptiveNativeScheduler();
461
+ this.experimental = options.experimental === true;
462
+ const rejection = this.#eligibilityRejection();
463
+ if (rejection) {
464
+ this.#decision = "rejected";
465
+ this.#reason = rejection;
466
+ }
467
+ }
468
+ #eligibilityRejection() {
469
+ if (!this.experimental)
470
+ return "experimental-disabled";
471
+ if (this.region.lifetime === "single-use")
472
+ return "single-use-region";
473
+ if (!this.region.noMaterialization)
474
+ return "object-materialization";
475
+ if (!this.region.noReadback)
476
+ return "readback-required";
477
+ if (this.region.source !== this.binding.buffer || this.region.sink !== this.binding.buffer)
478
+ return "storage-not-authoritative";
479
+ const capability = new BackendCapability({
480
+ backend: "wasm-simd",
481
+ available: true,
482
+ residentKinds: ["wasm", "shared-wasm"],
483
+ supportsPersistentMemory: true,
484
+ supportsSharedMemory: true,
485
+ supportsGpuSink: false,
486
+ });
487
+ return capability.supports(this.region) ? null : "storage-not-wasm-resident";
488
+ }
489
+ execute(options = {}) {
490
+ if (this.#decision === "rejected")
491
+ throw new Error(`resident WASM promotion rejected: ${this.#reason}`);
492
+ this.#executions += 1;
493
+ const predicted = this.scheduler.choose(this.binding, options);
494
+ if (predicted === "packed-js") {
495
+ this.#decision = "packed-js";
496
+ this.#reason = this.scheduler.snapshot().predictedJsMs === null ? "predicted-win" : "learned-win";
497
+ return this.#runPackedJs(options);
498
+ }
499
+ if (predicted === "wasm") {
500
+ this.#decision = "wasm";
501
+ this.#reason = this.scheduler.snapshot().predictedWasmMs === null ? "predicted-win" : "learned-win";
502
+ return this.#runWasm(options);
503
+ }
504
+ this.#decision = "benchmarking";
505
+ this.#reason = "crossover-calibration";
506
+ const baseline = this.telemetry.recentPackedJsBaseline();
507
+ const wasmBackend = this.binding.directBackend ?? (this.binding.runtime.variant === "simd" ? "wasm-simd" : "wasm-scalar");
508
+ const candidate = this.telemetry.recentAggregate(wasmBackend);
509
+ const backend = !baseline || (candidate !== null && baseline.samples <= candidate.samples)
510
+ ? this.#runPackedJs(options)
511
+ : this.#runWasm(options);
512
+ this.#updateDecision();
513
+ return backend;
514
+ }
515
+ #runPackedJs(options) {
516
+ const started = now();
517
+ this.packedJs();
518
+ const elapsed = now() - started;
519
+ markResidentWasmRanges(this.binding, options.ranges);
520
+ this.telemetry.record({
521
+ backend: "packed-js",
522
+ computeMs: elapsed,
523
+ transferBytes: 0,
524
+ transferMs: 0,
525
+ materializationMs: 0,
526
+ readbackBytes: 0,
527
+ readbackMs: 0,
528
+ synchronizationMs: 0,
529
+ totalMs: elapsed,
530
+ });
531
+ this.scheduler.record("packed-js", this.binding, options, elapsed);
532
+ return "packed-js";
533
+ }
534
+ #runWasm(options) {
535
+ const metrics = executeResidentWasm(this.binding, options);
536
+ this.#synchronizationBytes += metrics.synchronizationBytes;
537
+ this.telemetry.record(metrics);
538
+ this.scheduler.record("wasm", this.binding, options, metrics.totalMs);
539
+ return metrics.backend;
540
+ }
541
+ #updateDecision() {
542
+ const wasmBackend = this.binding.directBackend ?? (this.binding.runtime.variant === "simd" ? "wasm-simd" : "wasm-scalar");
543
+ const baseline = this.telemetry.recentPackedJsBaseline();
544
+ const candidate = this.telemetry.recentAggregate(wasmBackend);
545
+ if (!baseline || !candidate || baseline.samples < this.minimumSamples || candidate.samples < this.minimumSamples)
546
+ return;
547
+ const comparison = this.telemetry.compareRecentWithPackedJs(wasmBackend);
548
+ const measuredRatio = comparison.ratio ?? Number.POSITIVE_INFINITY;
549
+ if (comparison.wins && measuredRatio <= 1 - this.minimumMargin) {
550
+ this.#decision = "wasm";
551
+ this.#reason = "measured-win";
552
+ }
553
+ else {
554
+ this.#decision = "packed-js";
555
+ this.#reason = "no-measured-win";
556
+ }
557
+ }
558
+ snapshot() {
559
+ const wasmBackend = this.binding.directBackend ?? (this.binding.runtime.variant === "simd" ? "wasm-simd" : "wasm-scalar");
560
+ const comparison = this.telemetry.compareRecentWithPackedJs(wasmBackend);
561
+ return Object.freeze({
562
+ decision: this.#decision,
563
+ reason: this.#reason,
564
+ variant: this.binding.runtime.variant,
565
+ backend: wasmBackend,
566
+ baseline: this.telemetry.recentPackedJsBaseline(),
567
+ candidate: this.telemetry.recentAggregate(wasmBackend),
568
+ measuredRatio: comparison.ratio,
569
+ executions: this.#executions,
570
+ scheduler: this.scheduler.snapshot(),
571
+ transferBytes: 0,
572
+ materializationBytes: 0,
573
+ readbackBytes: 0,
574
+ synchronizationBytes: this.#synchronizationBytes,
575
+ });
576
+ }
577
+ }
578
+ //# sourceMappingURL=resident-wasm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resident-wasm.js","sourceRoot":"","sources":["../src/resident-wasm.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,kBAAkB,EAClB,cAAc,GAIf,MAAM,YAAY,CAAC;AAEpB,MAAM,CAAN,IAAkB,kBAyBjB;AAzBD,WAAkB,kBAAkB;IAClC,yDAAO,CAAA;IACP,+DAAU,CAAA;IACV,mEAAY,CAAA;IACZ,uEAAc,CAAA;IACd,6DAAS,CAAA;IACT,iEAAW,CAAA;IACX,mEAAY,CAAA;IACZ,mEAAY,CAAA;IACZ,yDAAO,CAAA;IACP,yDAAO,CAAA;IACP,oEAAa,CAAA;IACb,oEAAa,CAAA;IACb,gEAAW,CAAA;IACX,oEAAa,CAAA;IACb,sEAAc,CAAA;IACd,0EAAgB,CAAA;IAChB,4EAAiB,CAAA;IACjB,8DAAU,CAAA;IACV,oEAAa,CAAA;IACb,0DAAQ,CAAA;IACR,wDAAO,CAAA;IACP,gEAAW,CAAA;IACX,sEAAc,CAAA;IACd,gEAAW,CAAA;AACb,CAAC,EAzBiB,kBAAkB,KAAlB,kBAAkB,QAyBnC;AA0JD,SAAS,kBAAkB,CAAC,OAA4B,EAAE,MAA8C;IACtG,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,OAAO,CAAC,MAAM,CAAC;IAC1D,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,KAAK,MAAM,KAAK,IAAI,MAAM;QAAE,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;IACzE,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,eAAe,CAAC,OAAsC;IAC7D,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IACpC,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC;QACpB,IAAI,IAAI,MAAM,CAAC,OAAO,CAAC;QACvB,KAAK,IAAI,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;QACnC,KAAK,IAAI,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC;IACxC,CAAC;IACD,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC;IAC7B,MAAM,WAAW,GAAG,KAAK,GAAG,KAAK,GAAG,IAAI,GAAG,IAAI,CAAC;IAChD,IAAI,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,MAAM,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IACxD,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,KAAK,GAAG,KAAK,GAAG,IAAI,GAAG,IAAI,CAAC,GAAG,WAAW,CAAC,CAAC;IACzE,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,IAAI,GAAG,OAAO,GAAG,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC;IAC3D,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;AAC3C,CAAC;AAED;;;;;GAKG;AACH,MAAM,OAAO,+BAA+B;IACjC,gBAAgB,CAAS;IACzB,iBAAiB,CAAS;IAC1B,uBAAuB,CAAS;IAChC,cAAc,CAAS;IAChC,UAAU,GAAyB,EAAE,CAAC;IACtC,YAAY,GAAyB,EAAE,CAAC;IACxC,KAAK,GAAsC,MAAM,CAAC,MAAM,CAAC;QACvD,MAAM,EAAE,WAAW;QACnB,UAAU,EAAE,CAAC;QACb,YAAY,EAAE,CAAC;QACf,aAAa,EAAE,IAAI;QACnB,eAAe,EAAE,IAAI;QACrB,SAAS,EAAE,CAAC;QACZ,WAAW,EAAE,CAAC;KACf,CAAC,CAAC;IAEH,YAAY,UAKP,EAAE;QACL,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,gBAAgB,IAAI,KAAK,CAAC,CAAC,CAAC;QAC/E,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,gBAAgB,GAAG,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,iBAAiB,IAAI,MAAM,CAAC,CAAC,CAAC;QAC1G,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,uBAAuB,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;QAC3G,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC,CAAC;IAC9E,CAAC;IAED,IAAI,CAAC,OAA4B,EAAE,UAAwC,EAAE;QAC3E,MAAM,UAAU,GAAG,kBAAkB,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QAC/D,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC;QAC5C,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,kBAAkB,IAAI,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;QAC/F,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,eAAe,IAAI,CAAC,OAAO,CAAC,aAAa,KAAK,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACtH,MAAM,aAAa,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,cAAc,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC;QAChE,OAAO,MAAM,CAAC,MAAM,CAAC;YACnB,UAAU;YACV,YAAY,EAAE,UAAU,GAAG,WAAW,GAAG,aAAa,GAAG,WAAW;SACrE,CAAC,CAAC;IACL,CAAC;IAED,MAAM,CAAC,OAA4B,EAAE,UAAwC,EAAE;QAC7E,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACjE,MAAM,OAAO,GAAG,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACjD,MAAM,SAAS,GAAG,eAAe,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACrD,IAAI,aAAa,GAAkB,IAAI,CAAC;QACxC,IAAI,eAAe,GAAkB,IAAI,CAAC;QAC1C,IAAI,MAAqC,CAAC;QAE1C,IAAI,OAAO,IAAI,SAAS,EAAE,CAAC;YACzB,aAAa,GAAG,OAAO,CAAC,KAAK,GAAG,OAAO,CAAC,OAAO,GAAG,YAAY,CAAC;YAC/D,eAAe,GAAG,SAAS,CAAC,KAAK,GAAG,SAAS,CAAC,OAAO,GAAG,YAAY,CAAC;YACrE,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,eAAe,CAAC,CAAC;YACzD,MAAM,MAAM,GAAG,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,GAAG,eAAe,CAAC,GAAG,OAAO,CAAC;YACtF,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC,uBAAuB;gBAC5C,CAAC,CAAC,WAAW;gBACb,CAAC,CAAC,eAAe,GAAG,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC;QAC7D,CAAC;aAAM,IAAI,OAAO,CAAC,aAAa,KAAK,eAAe,EAAE,CAAC;YACrD,MAAM,GAAG,WAAW,CAAC;QACvB,CAAC;aAAM,IAAI,YAAY,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACjD,MAAM,GAAG,WAAW,CAAC;QACvB,CAAC;aAAM,IAAI,YAAY,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAClD,MAAM,GAAG,MAAM,CAAC;QAClB,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,WAAW,CAAC;QACvB,CAAC;QAED,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC;YACzB,MAAM;YACN,UAAU;YACV,YAAY;YACZ,aAAa;YACb,eAAe;YACf,SAAS,EAAE,IAAI,CAAC,UAAU,CAAC,MAAM;YACjC,WAAW,EAAE,IAAI,CAAC,YAAY,CAAC,MAAM;SACtC,CAAC,CAAC;QACH,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,CAAC,OAA6B,EAAE,OAA4B,EAAE,OAAqC,EAAE,OAAe;QACxH,MAAM,EAAE,YAAY,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACrD,MAAM,MAAM,GAAG,OAAO,KAAK,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC;QAC7E,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;QAC5D,IAAI,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,cAAc;YAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC;IACjG,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;CACF;AAED,MAAM,cAAc,GAAqC,MAAM,CAAC,MAAM,CAAC;IACrE,CAAC,EAAE,qCAAqC;IACxC,CAAC,EAAE,kCAAkC;IACrC,CAAC,EAAE,8CAA8C;IACjD,CAAC,EAAE,qCAAqC;IACxC,CAAC,EAAE,0CAA0C;IAC7C,CAAC,EAAE,kDAAkD;IACrD,CAAC,EAAE,wCAAwC;IAC3C,CAAC,EAAE,mCAAmC;IACtC,CAAC,EAAE,mCAAmC;IACtC,EAAE,EAAE,iCAAiC;CACtC,CAAC,CAAC;AAEH,SAAS,GAAG;IACV,MAAM,KAAK,GAAI,UAAkD,CAAC,WAAW,CAAC;IAC9E,OAAO,KAAK,EAAE,GAAG,EAAE,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;AACpC,CAAC;AAED,SAAS,OAAO,CAAC,KAA+B;IAC9C,OAAO,KAAK,YAAY,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC;AACrE,CAAC;AAED,SAAS,cAAc,CAAC,MAA0B;IAChD,OAAO,OAAO,iBAAiB,KAAK,WAAW,IAAI,MAAM,CAAC,MAAM,YAAY,iBAAiB,CAAC;AAChG,CAAC;AAED,SAAS,QAAQ,CAAC,UAAkB;IAClC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,UAAU,CAAC,IAAI,UAAU,IAAI,CAAC;QAAE,MAAM,IAAI,UAAU,CAAC,2CAA2C,CAAC,CAAC;IAC5H,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC;AACpD,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,wBAAwB,CAAC,UAAkB,EAAE,MAAM,GAAG,KAAK;IACzE,MAAM,KAAK,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC;IACnC,IAAI,MAAM,IAAI,OAAO,iBAAiB,KAAK,WAAW;QAAE,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;IAC5G,OAAO,IAAI,WAAW,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;AACzG,CAAC;AAED,KAAK,UAAU,kBAAkB,CAC/B,KAA+B,EAC/B,MAA0B;IAE1B,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,EAAE,CAEnC,CAAC;IAC9C,OAAO,UAAU,IAAI,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC;AACzD,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,8BAA8B,CAAC,OAKnD;IACA,MAAM,MAAM,GAAG,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC9C,IAAI,QAA0C,CAAC;IAC/C,IAAI,OAAO,GAAwB,QAAQ,CAAC;IAC5C,IAAI,OAAO,CAAC,UAAU,KAAK,KAAK,EAAE,CAAC;QACjC,IAAI,CAAC;YACH,QAAQ,GAAG,MAAM,kBAAkB,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;YACvE,OAAO,GAAG,MAAM,CAAC;QACnB,CAAC;QAAC,MAAM,CAAC;YACP,oDAAoD;QACtD,CAAC;IACH,CAAC;IACD,QAAQ,KAAK,MAAM,kBAAkB,CAAC,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IAC3E,MAAM,OAAO,GAAG,QAAQ,CAAC,OAA8B,CAAC;IACxD,IAAI,OAAO,OAAO,CAAC,gBAAgB,KAAK,UAAU,IAAI,OAAO,OAAO,CAAC,cAAc,KAAK,UAAU,EAAE,CAAC;QACnG,MAAM,IAAI,SAAS,CAAC,2DAA2D,CAAC,CAAC;IACnF,CAAC;IACD,IAAI,CAAC,OAAO,CAAC,qBAAqB,EAAE,KAAK,CAAC,CAAC,KAAK,CAAC,OAAO,KAAK,MAAM,CAAC,EAAE,CAAC;QACrE,MAAM,IAAI,SAAS,CAAC,mEAAmE,CAAC,CAAC;IAC3F,CAAC;IACD,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,MAAM,OAAO,GAAwB;QACnC,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,QAAQ;QACR,OAAO;QACP,OAAO;QACP,MAAM;QACN,eAAe,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU;QACjD,IAAI,MAAM,KAAK,OAAO,MAAM,CAAC,CAAC,CAAC;QAC/B,QAAQ,CAAC,KAAK,EAAE,SAAS,GAAG,EAAE;YAC5B,IAAI,MAAM;gBAAE,MAAM,IAAI,KAAK,CAAC,6EAA6E,CAAC,CAAC;YAC3G,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC;gBAAE,MAAM,IAAI,UAAU,CAAC,sCAAsC,CAAC,CAAC;YAC7G,MAAM,OAAO,GAAG,OAAO,CAAC,cAAc,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;YACzD,IAAI,OAAO,KAAK,CAAC;gBAAE,MAAM,IAAI,UAAU,CAAC,2DAA2D,KAAK,QAAQ,CAAC,CAAC;YAClH,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,IAAI,KAAK,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC;KAC1B,CAAC;IACF,OAAO,OAAO,CAAC;AACjB,CAAC;AAID,MAAM,CAAC,KAAK,UAAU,8BAA8B,CAAC,GAAW;IAC9D,MAAM,cAAc,GAAI,UAEtB,CAAC,GAAG,CAAC;IACP,MAAM,MAAM,GAAG,IAAI,cAAc,CAAC,GAAG,CAAC,CAAC;IACvC,IAAI,MAAM,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QAChC,MAAM,UAAU,GAAG,kBAAkB,CAAC;QACtC,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,UAAU,CAAqD,CAAC;QAChG,OAAO,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACrC,CAAC;IACD,MAAM,aAAa,GAAI,UAErB,CAAC,KAAK,CAAC;IACT,IAAI,CAAC,aAAa;QAAE,MAAM,IAAI,KAAK,CAAC,kDAAkD,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IACrG,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAClD,IAAI,CAAC,QAAQ,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,QAAQ,CAAC,MAAM,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IACvG,OAAO,QAAQ,CAAC,WAAW,EAAE,CAAC;AAChC,CAAC;AAED,iFAAiF;AACjF,MAAM,CAAC,KAAK,UAAU,8BAA8B,CAAC,OAInD;IACA,MAAM,cAAc,GAAI,UAEtB,CAAC,GAAG,CAAC;IACP,MAAM,MAAM,GAAG,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC9C,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,kBAAkB,CAAC;IACvE,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,8BAA8B,CAAC;IAC1E,MAAM,OAAO,GAAG,IAAI,cAAc,CAAC,UAAU,MAAM,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;IACtF,MAAM,SAAS,GAAG,IAAI,cAAc,CAAC,UAAU,MAAM,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;IAC1F,MAAM,CAAC,SAAS,EAAE,WAAW,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IACnG,OAAO,8BAA8B,CAAC;QACpC,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,SAAS;QACT,WAAW;QACX,UAAU,EAAE,OAAO,CAAC,UAAU;KAC/B,CAAC,CAAC;AACL,CAAC;AAED,SAAS,oBAAoB,CAAC,MAAoB;IAChD,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,EAAE;QAAE,MAAM,IAAI,SAAS,CAAC,6CAA6C,CAAC,CAAC;IAChI,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,MAAM,CAAC;IACxC,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClC,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK,IAAI,KAAK,CAAC,UAAU,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC9E,MAAM,IAAI,SAAS,CAAC,uDAAuD,CAAC,CAAC;QAC/E,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,iCAAiC,CACxC,KAAiB,EACjB,UAAkB,EAClB,MAA0B;IAE1B,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,YAAY,WAAW;YACrD,CAAC,CAAC,IAAI,UAAU,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC;YAClE,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3B,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC,MAAM,CAAC,WAA2B,CAAC,CAAC;QACnE,MAAM,QAAQ,GAAG,IAAI,WAAW,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;QACvE,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAC/C,OAAO,OAAO,SAAS,KAAK,UAAU,CAAC,CAAC,CAAC,SAAsC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC9F,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,sBAAsB,CACpC,OAA4B,EAC5B,MAAoB,EACpB,OAA4B,EAC5B,UAA4C,EAAE;IAE9C,IAAI,OAAO,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;IAC9E,MAAM,MAAM,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAC5C,IAAI,OAAO,CAAC,UAAU,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,MAAM;WACjD,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;QACnF,MAAM,IAAI,SAAS,CAAC,0EAA0E,CAAC,CAAC;IAClG,CAAC;IACD,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC;IAC1C,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC,IAAI,SAAS,IAAI,CAAC;QAAE,MAAM,IAAI,UAAU,CAAC,4BAA4B,CAAC,CAAC;IAE3G,MAAM,cAAc,GAAG,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;IAC7E,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,cAAc,GAAG,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IACnI,MAAM,qBAAqB,GAAG,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5E,MAAM,cAAc,GAAG,IAAI,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,qBAAqB,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC3G,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,GAAG,cAAc,CAAC,KAAK,CAAC,GAAG,cAAc,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;IACxG,MAAM,cAAc,GAAG,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;IACrE,IAAI,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,cAAc,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAChG,MAAM,aAAa,GAAG,OAAO,CAAC,QAAQ,CAAC,SAAS,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAC7D,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,EAAE,SAAS,GAAG,CAAC,CAAC,CAAC;IACpF,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IAC9D,MAAM,eAAe,GAAG,OAAO,CAAC,QAAQ,CAAC,YAAY,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAC9D,MAAM,QAAQ,GAAG,IAAI,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,eAAe,EAAE,YAAY,CAAC,CAAC;IACxF,MAAM,cAAc,GAAG,OAAO,CAAC,QAAQ,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IACnD,MAAM,OAAO,GAAG,IAAI,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,cAAc,EAAE,EAAE,CAAC,CAAC;IAC1E,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM;QAC3B,CAAC,CAAC,cAAc,CAAC,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC;QAC1D,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACvD,IAAI,aAAoD,CAAC;IACzD,IAAI,aAAmD,CAAC;IACxD,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,OAAO,KAAK,MAAM;WAC5C,OAAO,CAAC,qBAAqB,IAAI,OAAO,CAAC,oBAAoB,KAAK,8BAA8B,EAAE,CAAC;QACtG,aAAa,GAAG,iCAAiC,CAAC,OAAO,CAAC,qBAAqB,EAAE,OAAO,CAAC,oBAAoB,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QAC/H,IAAI,aAAa;YAAE,aAAa,GAAG,eAAe,CAAC;IACrD,CAAC;IACD,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,aAAa,IAAI,OAAO,CAAC,iBAAiB,IAAI,OAAO,CAAC,gBAAgB,KAAK,yBAAyB,EAAE,CAAC;QAC7H,aAAa,GAAG,iCAAiC,CAAC,OAAO,CAAC,iBAAiB,EAAE,OAAO,CAAC,gBAAgB,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QACvH,IAAI,aAAa;YAAE,aAAa,GAAG,iBAAiB,CAAC;IACvD,CAAC;IACD,OAAO,CAAC,IAAI,EAAE,CAAC;IACf,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,OAAO;QACP,OAAO;QACP,MAAM;QACN,MAAM;QACN,cAAc;QACd,qBAAqB;QACrB,cAAc;QACd,aAAa;QACb,MAAM;QACN,eAAe;QACf,QAAQ;QACR,cAAc;QACd,OAAO;QACP,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3C,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3C,iBAAiB,EAAE,MAAM,CAAC,YAAY;QACtC,iBAAiB,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM;KACzC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,eAAe,CAAC,OAA4B;IACnD,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,KAAK,OAAO,CAAC,iBAAiB,EAAE,CAAC;QAChE,MAAM,IAAI,KAAK,CAAC,uEAAuE,CAAC,CAAC;IAC3F,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,CAAC,YAAY,KAAK,OAAO,CAAC,iBAAiB,EAAE,CAAC;QAC9D,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;IAC9E,CAAC;AACH,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAC,OAA4B,EAAE,OAAqC;IAK9G,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC;IACtB,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACrE,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM;QAAE,MAAM,IAAI,UAAU,CAAC,2DAA2D,CAAC,CAAC;IACjI,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;QAC9B,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC;eACrE,KAAK,CAAC,KAAK,GAAG,CAAC,IAAI,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,GAAG,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;YAC9E,MAAM,IAAI,UAAU,CAAC,2DAA2D,CAAC,CAAC;QACpF,CAAC;QACD,OAAO,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC;QACxC,OAAO,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC;IAC5C,CAAC,CAAC,CAAC;IACH,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAClC,IAAI,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5C,IAAI,CAAC,CAAC,QAAQ,YAAY,YAAY,CAAC,IAAI,QAAQ,CAAC,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;YACnG,MAAM,IAAI,SAAS,CAAC,gEAAgE,CAAC,CAAC;QACxF,CAAC;QACD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACjC,CAAC;SAAM,IAAI,QAAQ,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7C,MAAM,IAAI,SAAS,CAAC,4CAA4C,CAAC,CAAC;IACpE,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,UAAU,EAAE,MAAM,CAAC,MAAM;QACzB,oBAAoB,EAAE,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC;QACnF,iBAAiB,EAAE,GAAG,EAAE,GAAG,OAAO;KACnC,CAAC,CAAC;AACL,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,sBAAsB,CACpC,OAA4B,EAC5B,SAA8D,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;IAEjG,MAAM,UAAU,GAA0C,EAAE,CAAC;IAC7D,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QACjD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,MAAM,KAAK,GAAG,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,UAAU,CAAC;YAChE,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,KAAK,KAAK,CAAC,GAAG;gBACnC,CAAC,CAAC,KAAK;gBACP,CAAC,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC;YAC9D,UAAU,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC,MAAM,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;AACtD,CAAC;AAED,qFAAqF;AACrF,MAAM,UAAU,mBAAmB,CACjC,OAA4B,EAC5B,UAAwC,EAAE;IAE1C,eAAe,CAAC,OAAO,CAAC,CAAC;IACzB,MAAM,YAAY,GAAG,GAAG,EAAE,CAAC;IAC3B,MAAM,QAAQ,GAAG,4BAA4B,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAChE,MAAM,cAAc,GAAG,GAAG,EAAE,CAAC;IAC7B,MAAM,MAAM,GAAG,OAAO,CAAC,aAAa;QAClC,CAAC,CAAC,OAAO,CAAC,aAAa,CACrB,OAAO,CAAC,qBAAqB,EAC7B,OAAO,CAAC,aAAa,EACrB,QAAQ,CAAC,UAAU,EACnB,OAAO,CAAC,eAAe,CACxB;QACD,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,gBAAgB,CACxC,OAAO,CAAC,cAAc,EACtB,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,EAC5B,OAAO,CAAC,qBAAqB,EAC7B,OAAO,CAAC,cAAc,CAAC,MAAM,EAC7B,OAAO,CAAC,aAAa,EACrB,QAAQ,CAAC,UAAU,EACnB,OAAO,CAAC,eAAe,EACvB,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,MAAM,CACpC,CAAC;IACJ,MAAM,SAAS,GAAG,GAAG,EAAE,GAAG,cAAc,CAAC;IACzC,IAAI,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,MAAM,MAAM,cAAc,CAAC,MAAM,CAAC,IAAI,mBAAmB,EAAE,CAAC,CAAC;IAClI,MAAM,cAAc,GAAG,sBAAsB,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IACvE,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,OAAO,EAAE,OAAO,CAAC,aAAa,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,KAAK,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,aAAa,CAAC;QACpG,SAAS;QACT,aAAa,EAAE,CAAC;QAChB,UAAU,EAAE,CAAC;QACb,oBAAoB,EAAE,CAAC;QACvB,iBAAiB,EAAE,CAAC;QACpB,aAAa,EAAE,CAAC;QAChB,UAAU,EAAE,CAAC;QACb,oBAAoB,EAAE,QAAQ,CAAC,oBAAoB;QACnD,iBAAiB,EAAE,QAAQ,CAAC,iBAAiB;QAC7C,OAAO,EAAE,GAAG,EAAE,GAAG,YAAY;QAC7B,SAAS,EAAE,CAAC;QACZ,YAAY,EAAE,OAAO,CAAC,MAAM,CAAC,YAAY;QACzC,cAAc;KACf,CAAC,CAAC;AACL,CAAC;AAoBD;;;GAGG;AACH,MAAM,OAAO,qBAAqB;IACvB,SAAS,CAAqB;IAC9B,OAAO,CAAsB;IAC7B,MAAM,CAAkB;IACxB,QAAQ,CAAa;IACrB,cAAc,CAAS;IACvB,aAAa,CAAS;IACtB,YAAY,CAAU;IACtB,SAAS,CAAkC;IACpD,SAAS,GAAkC,cAAc,CAAC;IAC1D,OAAO,GAAiC,+BAA+B,CAAC;IACxE,WAAW,GAAG,CAAC,CAAC;IAChB,qBAAqB,GAAG,CAAC,CAAC;IAE1B,YAAY,OAUV;QACA,IAAI,OAAO,OAAO,CAAC,QAAQ,KAAK,UAAU;YAAE,MAAM,IAAI,SAAS,CAAC,6BAA6B,CAAC,CAAC;QAC/F,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QAC/B,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAC7B,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;QACjC,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,IAAI,kBAAkB,EAAE,CAAC;QAC/D,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,cAAc,IAAI,CAAC,CAAC,CAAC,CAAC;QAC3E,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,aAAa,IAAI,IAAI,CAAC,CAAC,CAAC;QAC/E,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,IAAI,+BAA+B,EAAE,CAAC;QAC5E,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,KAAK,IAAI,CAAC;QAClD,MAAM,SAAS,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAC/C,IAAI,SAAS,EAAE,CAAC;YACd,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC;YAC5B,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,qBAAqB;QACnB,IAAI,CAAC,IAAI,CAAC,YAAY;YAAE,OAAO,uBAAuB,CAAC;QACvD,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,KAAK,YAAY;YAAE,OAAO,mBAAmB,CAAC;QACtE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,iBAAiB;YAAE,OAAO,wBAAwB,CAAC;QACpE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU;YAAE,OAAO,mBAAmB,CAAC;QACxD,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,IAAI,CAAC,OAAO,CAAC,MAAM;YAAE,OAAO,2BAA2B,CAAC;QAC/H,MAAM,UAAU,GAAG,IAAI,iBAAiB,CAAC;YACvC,OAAO,EAAE,WAAW;YACpB,SAAS,EAAE,IAAI;YACf,aAAa,EAAE,CAAC,MAAM,EAAE,aAAa,CAAC;YACtC,wBAAwB,EAAE,IAAI;YAC9B,oBAAoB,EAAE,IAAI;YAC1B,eAAe,EAAE,KAAK;SACvB,CAAC,CAAC;QACH,OAAO,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,2BAA2B,CAAC;IAC/E,CAAC;IAED,OAAO,CAAC,UAAwC,EAAE;QAChD,IAAI,IAAI,CAAC,SAAS,KAAK,UAAU;YAAE,MAAM,IAAI,KAAK,CAAC,qCAAqC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;QACxG,IAAI,CAAC,WAAW,IAAI,CAAC,CAAC;QACtB,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC/D,IAAI,SAAS,KAAK,WAAW,EAAE,CAAC;YAC9B,IAAI,CAAC,SAAS,GAAG,WAAW,CAAC;YAC7B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,aAAa,KAAK,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,aAAa,CAAC;YAClG,OAAO,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QACpC,CAAC;QACD,IAAI,SAAS,KAAK,MAAM,EAAE,CAAC;YACzB,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC;YACxB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,eAAe,KAAK,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,aAAa,CAAC;YACpG,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAChC,CAAC;QAED,IAAI,CAAC,SAAS,GAAG,cAAc,CAAC;QAChC,IAAI,CAAC,OAAO,GAAG,uBAAuB,CAAC;QACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,sBAAsB,EAAE,CAAC;QACzD,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,KAAK,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;QAC1H,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC;QAC9D,MAAM,OAAO,GAAG,CAAC,QAAQ,IAAI,CAAC,SAAS,KAAK,IAAI,IAAI,QAAQ,CAAC,OAAO,IAAI,SAAS,CAAC,OAAO,CAAC;YACxF,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC;YAC5B,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC3B,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,YAAY,CAAC,OAAqC;QAChD,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC;QACtB,IAAI,CAAC,QAAQ,EAAE,CAAC;QAChB,MAAM,OAAO,GAAG,GAAG,EAAE,GAAG,OAAO,CAAC;QAChC,sBAAsB,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QACrD,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;YACpB,OAAO,EAAE,WAAW;YACpB,SAAS,EAAE,OAAO;YAClB,aAAa,EAAE,CAAC;YAChB,UAAU,EAAE,CAAC;YACb,iBAAiB,EAAE,CAAC;YACpB,aAAa,EAAE,CAAC;YAChB,UAAU,EAAE,CAAC;YACb,iBAAiB,EAAE,CAAC;YACpB,OAAO,EAAE,OAAO;SACjB,CAAC,CAAC;QACH,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,WAAW,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QACnE,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,QAAQ,CAAC,OAAqC;QAC5C,MAAM,OAAO,GAAG,mBAAmB,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC3D,IAAI,CAAC,qBAAqB,IAAI,OAAO,CAAC,oBAAoB,CAAC;QAC3D,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC/B,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;QACtE,OAAO,OAAO,CAAC,OAAO,CAAC;IACzB,CAAC;IAED,eAAe;QACb,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,KAAK,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;QAC1H,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,sBAAsB,EAAE,CAAC;QACzD,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC;QAC9D,IAAI,CAAC,QAAQ,IAAI,CAAC,SAAS,IAAI,QAAQ,CAAC,OAAO,GAAG,IAAI,CAAC,cAAc,IAAI,SAAS,CAAC,OAAO,GAAG,IAAI,CAAC,cAAc;YAAE,OAAO;QACzH,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,yBAAyB,CAAC,WAAW,CAAC,CAAC;QACzE,MAAM,aAAa,GAAG,UAAU,CAAC,KAAK,IAAI,MAAM,CAAC,iBAAiB,CAAC;QACnE,IAAI,UAAU,CAAC,IAAI,IAAI,aAAa,IAAI,CAAC,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;YAC/D,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC;YACxB,IAAI,CAAC,OAAO,GAAG,cAAc,CAAC;QAChC,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,SAAS,GAAG,WAAW,CAAC;YAC7B,IAAI,CAAC,OAAO,GAAG,iBAAiB,CAAC;QACnC,CAAC;IACH,CAAC;IAED,QAAQ;QACN,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,KAAK,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;QAC1H,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,yBAAyB,CAAC,WAAW,CAAC,CAAC;QACzE,OAAO,MAAM,CAAC,MAAM,CAAC;YACnB,QAAQ,EAAE,IAAI,CAAC,SAAS;YACxB,MAAM,EAAE,IAAI,CAAC,OAAO;YACpB,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO;YACrC,OAAO,EAAE,WAAW;YACpB,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,sBAAsB,EAAE;YACjD,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,WAAW,CAAC;YACtD,aAAa,EAAE,UAAU,CAAC,KAAK;YAC/B,UAAU,EAAE,IAAI,CAAC,WAAW;YAC5B,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE;YACpC,aAAa,EAAE,CAAC;YAChB,oBAAoB,EAAE,CAAC;YACvB,aAAa,EAAE,CAAC;YAChB,oBAAoB,EAAE,IAAI,CAAC,qBAAqB;SACjD,CAAC,CAAC;IACL,CAAC;CACF"}