@selvajs/server 0.2.0-beta.3 → 0.2.0-beta.4
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.
- package/LICENSE +1 -1
- package/README.md +32 -0
- package/dist/compute/client-cache.d.ts.map +1 -1
- package/dist/compute/client-cache.js +6 -0
- package/dist/compute/client-cache.js.map +1 -1
- package/dist/compute/safe-url.d.ts.map +1 -1
- package/dist/compute/safe-url.js +16 -0
- package/dist/compute/safe-url.js.map +1 -1
- package/dist/compute/solve-cache-single-flight.d.ts +8 -1
- package/dist/compute/solve-cache-single-flight.d.ts.map +1 -1
- package/dist/compute/solve-cache-single-flight.js +4 -2
- package/dist/compute/solve-cache-single-flight.js.map +1 -1
- package/dist/compute/solve-pipeline.d.ts.map +1 -1
- package/dist/compute/solve-pipeline.js +3 -1
- package/dist/compute/solve-pipeline.js.map +1 -1
- package/package.json +14 -18
- package/dist/access/__tests__/project-access-input.test.d.ts +0 -2
- package/dist/access/__tests__/project-access-input.test.d.ts.map +0 -1
- package/dist/access/__tests__/project-access-input.test.js +0 -146
- package/dist/access/__tests__/project-access-input.test.js.map +0 -1
- package/dist/compute/__tests__/client-cache.test.d.ts +0 -11
- package/dist/compute/__tests__/client-cache.test.d.ts.map +0 -1
- package/dist/compute/__tests__/client-cache.test.js +0 -218
- package/dist/compute/__tests__/client-cache.test.js.map +0 -1
- package/dist/compute/__tests__/definition-byte-cache.test.d.ts +0 -2
- package/dist/compute/__tests__/definition-byte-cache.test.d.ts.map +0 -1
- package/dist/compute/__tests__/definition-byte-cache.test.js +0 -107
- package/dist/compute/__tests__/definition-byte-cache.test.js.map +0 -1
- package/dist/compute/__tests__/rate-limit.test.d.ts +0 -2
- package/dist/compute/__tests__/rate-limit.test.d.ts.map +0 -1
- package/dist/compute/__tests__/rate-limit.test.js +0 -98
- package/dist/compute/__tests__/rate-limit.test.js.map +0 -1
- package/dist/compute/__tests__/remote-definition.test.d.ts +0 -11
- package/dist/compute/__tests__/remote-definition.test.d.ts.map +0 -1
- package/dist/compute/__tests__/remote-definition.test.js +0 -114
- package/dist/compute/__tests__/remote-definition.test.js.map +0 -1
- package/dist/compute/__tests__/safe-url.test.d.ts +0 -2
- package/dist/compute/__tests__/safe-url.test.d.ts.map +0 -1
- package/dist/compute/__tests__/safe-url.test.js +0 -71
- package/dist/compute/__tests__/safe-url.test.js.map +0 -1
- package/dist/compute/__tests__/solve-cache.test.d.ts +0 -13
- package/dist/compute/__tests__/solve-cache.test.d.ts.map +0 -1
- package/dist/compute/__tests__/solve-cache.test.js +0 -234
- package/dist/compute/__tests__/solve-cache.test.js.map +0 -1
- package/dist/compute/__tests__/solve-pipeline.test.d.ts +0 -11
- package/dist/compute/__tests__/solve-pipeline.test.d.ts.map +0 -1
- package/dist/compute/__tests__/solve-pipeline.test.js +0 -557
- package/dist/compute/__tests__/solve-pipeline.test.js.map +0 -1
- package/dist/compute/__tests__/transform-input.test.d.ts +0 -14
- package/dist/compute/__tests__/transform-input.test.d.ts.map +0 -1
- package/dist/compute/__tests__/transform-input.test.js +0 -120
- package/dist/compute/__tests__/transform-input.test.js.map +0 -1
- package/dist/definitions/__tests__/definition-service.test.d.ts +0 -14
- package/dist/definitions/__tests__/definition-service.test.d.ts.map +0 -1
- package/dist/definitions/__tests__/definition-service.test.js +0 -95
- package/dist/definitions/__tests__/definition-service.test.js.map +0 -1
- package/dist/definitions/__tests__/load-for-render.test.d.ts +0 -8
- package/dist/definitions/__tests__/load-for-render.test.d.ts.map +0 -1
- package/dist/definitions/__tests__/load-for-render.test.js +0 -196
- package/dist/definitions/__tests__/load-for-render.test.js.map +0 -1
- package/dist/definitions/__tests__/schema-extraction.test.d.ts +0 -11
- package/dist/definitions/__tests__/schema-extraction.test.d.ts.map +0 -1
- package/dist/definitions/__tests__/schema-extraction.test.js +0 -115
- package/dist/definitions/__tests__/schema-extraction.test.js.map +0 -1
- package/dist/http/__tests__/body-size.test.d.ts +0 -2
- package/dist/http/__tests__/body-size.test.d.ts.map +0 -1
- package/dist/http/__tests__/body-size.test.js +0 -24
- package/dist/http/__tests__/body-size.test.js.map +0 -1
- package/dist/http/__tests__/route-classifier.test.d.ts +0 -2
- package/dist/http/__tests__/route-classifier.test.d.ts.map +0 -1
- package/dist/http/__tests__/route-classifier.test.js +0 -54
- package/dist/http/__tests__/route-classifier.test.js.map +0 -1
- package/dist/http/__tests__/safe-redirect.test.d.ts +0 -2
- package/dist/http/__tests__/safe-redirect.test.d.ts.map +0 -1
- package/dist/http/__tests__/safe-redirect.test.js +0 -44
- package/dist/http/__tests__/safe-redirect.test.js.map +0 -1
- package/dist/http/__tests__/security-headers.test.d.ts +0 -2
- package/dist/http/__tests__/security-headers.test.d.ts.map +0 -1
- package/dist/http/__tests__/security-headers.test.js +0 -24
- package/dist/http/__tests__/security-headers.test.js.map +0 -1
- package/dist/ops/__tests__/semver.test.d.ts +0 -2
- package/dist/ops/__tests__/semver.test.d.ts.map +0 -1
- package/dist/ops/__tests__/semver.test.js +0 -38
- package/dist/ops/__tests__/semver.test.js.map +0 -1
- package/dist/providers/__tests__/create-selva-providers.test.d.ts +0 -7
- package/dist/providers/__tests__/create-selva-providers.test.d.ts.map +0 -1
- package/dist/providers/__tests__/create-selva-providers.test.js +0 -135
- package/dist/providers/__tests__/create-selva-providers.test.js.map +0 -1
- package/dist/tokens/__tests__/token-codec.test.d.ts +0 -2
- package/dist/tokens/__tests__/token-codec.test.d.ts.map +0 -1
- package/dist/tokens/__tests__/token-codec.test.js +0 -50
- package/dist/tokens/__tests__/token-codec.test.js.map +0 -1
- package/src/access/__tests__/project-access-input.test.ts +0 -175
- package/src/access/index.ts +0 -9
- package/src/access/project-access-input.ts +0 -145
- package/src/compute/__tests__/client-cache.test.ts +0 -244
- package/src/compute/__tests__/definition-byte-cache.test.ts +0 -129
- package/src/compute/__tests__/rate-limit.test.ts +0 -106
- package/src/compute/__tests__/remote-definition.test.ts +0 -140
- package/src/compute/__tests__/safe-url.test.ts +0 -72
- package/src/compute/__tests__/solve-cache.test.ts +0 -268
- package/src/compute/__tests__/solve-pipeline.test.ts +0 -660
- package/src/compute/__tests__/transform-input.test.ts +0 -162
- package/src/compute/client-cache.ts +0 -321
- package/src/compute/definition-byte-cache.ts +0 -168
- package/src/compute/index.ts +0 -82
- package/src/compute/limits.ts +0 -237
- package/src/compute/memory-solve-cache.ts +0 -0
- package/src/compute/rate-limit.ts +0 -110
- package/src/compute/remote-definition.ts +0 -149
- package/src/compute/safe-url.ts +0 -186
- package/src/compute/solve-cache-envelope.ts +0 -98
- package/src/compute/solve-cache-key.ts +0 -85
- package/src/compute/solve-cache-single-flight.ts +0 -59
- package/src/compute/solve-pipeline.ts +0 -603
- package/src/compute/transform-input.ts +0 -66
- package/src/definitions/__tests__/definition-service.test.ts +0 -131
- package/src/definitions/__tests__/load-for-render.test.ts +0 -244
- package/src/definitions/__tests__/schema-extraction.test.ts +0 -137
- package/src/definitions/definition-service.ts +0 -247
- package/src/definitions/index.ts +0 -22
- package/src/definitions/load-for-render.ts +0 -272
- package/src/definitions/schema-extraction.ts +0 -117
- package/src/errors/SentryErrorReporter.ts +0 -88
- package/src/errors/index.ts +0 -3
- package/src/http/__tests__/body-size.test.ts +0 -27
- package/src/http/__tests__/route-classifier.test.ts +0 -60
- package/src/http/__tests__/safe-redirect.test.ts +0 -47
- package/src/http/__tests__/security-headers.test.ts +0 -29
- package/src/http/body-size.ts +0 -24
- package/src/http/index.ts +0 -10
- package/src/http/redirect.ts +0 -16
- package/src/http/route-classifier.ts +0 -74
- package/src/http/security-headers.ts +0 -42
- package/src/index.ts +0 -27
- package/src/ops/__tests__/semver.test.ts +0 -42
- package/src/ops/index.ts +0 -3
- package/src/ops/semver.ts +0 -60
- package/src/providers/__tests__/create-selva-providers.test.ts +0 -172
- package/src/providers/__tests__/fixtures/override-config.mjs +0 -8
- package/src/providers/create-selva-providers.ts +0 -241
- package/src/providers/index.ts +0 -12
- package/src/tokens/__tests__/token-codec.test.ts +0 -63
- package/src/tokens/index.ts +0 -8
- package/src/tokens/token-codec.ts +0 -86
|
@@ -1,557 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tests for `runSolvePipeline` — the transport-agnostic solve core (K3).
|
|
3
|
-
*
|
|
4
|
-
* `@selvajs/compute` is mocked so the pipeline runs without a live compute
|
|
5
|
-
* server: `TreeBuilder.fromInputParams` returns a marker tree and the scheduler
|
|
6
|
-
* is a stub whose `solve` we script per test (resolve a response, throw an
|
|
7
|
-
* AbortError, etc.). That isolates the pipeline's own behavior — outcome
|
|
8
|
-
* classification, size cap, gzip, and the Server-Timing / version envelope.
|
|
9
|
-
*/
|
|
10
|
-
import { describe, it, expect, vi } from 'vitest';
|
|
11
|
-
import { gunzipSync } from 'node:zlib';
|
|
12
|
-
// --- Mock @selvajs/compute -------------------------------------------------
|
|
13
|
-
// The factory is hoisted above module top-level, so the RhinoComputeError
|
|
14
|
-
// stand-in is declared INSIDE it. The pipeline classifies shed outcomes with
|
|
15
|
-
// `err instanceof RhinoComputeError && err.code === ErrorCodes.QUEUE_*`, so the
|
|
16
|
-
// mock must export a real class + the code constants. Tests import the mocked
|
|
17
|
-
// `RhinoComputeError` below to construct instances the pipeline recognizes.
|
|
18
|
-
vi.mock('@selvajs/compute', () => {
|
|
19
|
-
class RhinoComputeError extends Error {
|
|
20
|
-
code;
|
|
21
|
-
statusCode;
|
|
22
|
-
context;
|
|
23
|
-
constructor(message, code, options) {
|
|
24
|
-
super(message);
|
|
25
|
-
this.name = 'RhinoComputeError';
|
|
26
|
-
this.code = code;
|
|
27
|
-
this.statusCode = options?.statusCode;
|
|
28
|
-
this.context = options?.context;
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
return {
|
|
32
|
-
TreeBuilder: {
|
|
33
|
-
fromInputParams: (params) => ({ __tree: true, count: params.length })
|
|
34
|
-
},
|
|
35
|
-
// transform-input.ts (imported by the pipeline) calls processInput; return
|
|
36
|
-
// the raw shape as an InputParam so filtering/mapping runs end-to-end.
|
|
37
|
-
processInput: (raw) => raw,
|
|
38
|
-
// The L2 key module hashes over stableStringify — a deterministic sorted-key
|
|
39
|
-
// JSON is enough for the tests (real impl sorts recursively).
|
|
40
|
-
stableStringify: (value) => JSON.stringify(value),
|
|
41
|
-
RhinoComputeError,
|
|
42
|
-
ErrorCodes: { QUEUE_FULL: 'QUEUE_FULL', QUEUE_TIMEOUT: 'QUEUE_TIMEOUT' }
|
|
43
|
-
};
|
|
44
|
-
});
|
|
45
|
-
// The mocked class, typed loosely for constructing test errors. The `as` cast
|
|
46
|
-
// keeps the 3-arg (message, code, options) signature the pipeline's mock uses.
|
|
47
|
-
import { RhinoComputeError as MockRhinoComputeError } from '@selvajs/compute';
|
|
48
|
-
const makeShedError = (message, code, options) => new MockRhinoComputeError(message, code, options);
|
|
49
|
-
import { runSolvePipeline, COMPUTE_CONTRACT_VERSION, COMPUTE_VERSION_HEADER, deriveSolveCacheInputKey, encodeSolveCacheEntry } from '../index.js';
|
|
50
|
-
import { gzipSync } from 'node:zlib';
|
|
51
|
-
/** A CachedClient stub whose scheduler.solve is scripted per test. */
|
|
52
|
-
function fakeClient(solve) {
|
|
53
|
-
return {
|
|
54
|
-
client: {},
|
|
55
|
-
scheduler: { solve },
|
|
56
|
-
rhinoTiming: { last: null, seq: 0 },
|
|
57
|
-
solveMeta: { last: null, seq: 0 }
|
|
58
|
-
};
|
|
59
|
-
}
|
|
60
|
-
function baseArgs(over = {}) {
|
|
61
|
-
return {
|
|
62
|
-
definitionSource: new Uint8Array([1, 2, 3]),
|
|
63
|
-
inputs: [{ id: 'a', paramType: 'number', nickname: 'A' }],
|
|
64
|
-
values: { a: 5 },
|
|
65
|
-
client: fakeClient(async () => ({ values: [], errors: [], warnings: [] })),
|
|
66
|
-
responseMaxBytes: 10 * 1024 * 1024,
|
|
67
|
-
maxSolveDurationMs: 100_000,
|
|
68
|
-
acceptEncoding: '',
|
|
69
|
-
signal: new AbortController().signal,
|
|
70
|
-
loadStartMs: performance.now(),
|
|
71
|
-
defLoadMs: 1.5,
|
|
72
|
-
prepMarks: [['body', 0.2]],
|
|
73
|
-
...over
|
|
74
|
-
};
|
|
75
|
-
}
|
|
76
|
-
describe('runSolvePipeline — success', () => {
|
|
77
|
-
it('returns an ok envelope with a JSON body and the version header', async () => {
|
|
78
|
-
const result = { values: [{ id: 'out' }], errors: [], warnings: ['w'] };
|
|
79
|
-
const outcome = await runSolvePipeline(baseArgs({ client: fakeClient(async () => result) }));
|
|
80
|
-
expect(outcome.kind).toBe('ok');
|
|
81
|
-
if (outcome.kind !== 'ok')
|
|
82
|
-
return;
|
|
83
|
-
expect(outcome.errorCount).toBe(0);
|
|
84
|
-
expect(outcome.warningCount).toBe(1);
|
|
85
|
-
expect(outcome.envelope.encoding).toBeUndefined();
|
|
86
|
-
expect(JSON.parse(outcome.envelope.body)).toEqual(result);
|
|
87
|
-
expect(outcome.envelope.headers[COMPUTE_VERSION_HEADER]).toBe(String(COMPUTE_CONTRACT_VERSION));
|
|
88
|
-
expect(outcome.envelope.headers['Content-Type']).toBe('application/json');
|
|
89
|
-
expect(outcome.envelope.headers['Content-Length']).toBe(String(Buffer.byteLength(outcome.envelope.body)));
|
|
90
|
-
});
|
|
91
|
-
it('only sends inputs with a paramType to the tree builder', async () => {
|
|
92
|
-
let seenTree;
|
|
93
|
-
const outcome = await runSolvePipeline(baseArgs({
|
|
94
|
-
inputs: [
|
|
95
|
-
{ id: 'a', paramType: 'number', nickname: 'A' },
|
|
96
|
-
{ id: 'b', nickname: 'B' } // no paramType → filtered out
|
|
97
|
-
],
|
|
98
|
-
client: fakeClient(async (_def, tree) => {
|
|
99
|
-
seenTree = tree;
|
|
100
|
-
return { errors: [], warnings: [] };
|
|
101
|
-
})
|
|
102
|
-
}));
|
|
103
|
-
expect(outcome.kind).toBe('ok');
|
|
104
|
-
expect(seenTree).toEqual({ __tree: true, count: 1 });
|
|
105
|
-
});
|
|
106
|
-
it('forwards the abort signal to the scheduler', async () => {
|
|
107
|
-
const controller = new AbortController();
|
|
108
|
-
let seenSignal;
|
|
109
|
-
await runSolvePipeline(baseArgs({
|
|
110
|
-
signal: controller.signal,
|
|
111
|
-
client: fakeClient(async (_d, _t, opts) => {
|
|
112
|
-
seenSignal = opts.signal;
|
|
113
|
-
return { errors: [], warnings: [] };
|
|
114
|
-
})
|
|
115
|
-
}));
|
|
116
|
-
expect(seenSignal).toBe(controller.signal);
|
|
117
|
-
});
|
|
118
|
-
});
|
|
119
|
-
describe('runSolvePipeline — gzip', () => {
|
|
120
|
-
it('compresses when Accept-Encoding allows and the body is over 1 KB', async () => {
|
|
121
|
-
// A payload comfortably over the 1 KB gzip threshold.
|
|
122
|
-
const big = { values: Array.from({ length: 500 }, (_, i) => ({ i, s: 'xxxxxxxxxx' })) };
|
|
123
|
-
const outcome = await runSolvePipeline(baseArgs({ acceptEncoding: 'gzip, br', client: fakeClient(async () => big) }));
|
|
124
|
-
expect(outcome.kind).toBe('ok');
|
|
125
|
-
if (outcome.kind !== 'ok')
|
|
126
|
-
return;
|
|
127
|
-
expect(outcome.envelope.encoding).toBe('gzip');
|
|
128
|
-
expect(outcome.envelope.headers['Content-Encoding']).toBe('gzip');
|
|
129
|
-
expect(outcome.envelope.headers['Vary']).toBe('Accept-Encoding');
|
|
130
|
-
// The gzip body round-trips back to the original JSON.
|
|
131
|
-
const inflated = gunzipSync(Buffer.from(outcome.envelope.body)).toString();
|
|
132
|
-
expect(JSON.parse(inflated)).toEqual(big);
|
|
133
|
-
expect(outcome.envelope.metrics.compressedBytes).toBeGreaterThan(0);
|
|
134
|
-
});
|
|
135
|
-
it('does NOT compress when Accept-Encoding lacks gzip', async () => {
|
|
136
|
-
const big = { values: Array.from({ length: 500 }, (_, i) => ({ i, s: 'xxxxxxxxxx' })) };
|
|
137
|
-
const outcome = await runSolvePipeline(baseArgs({ acceptEncoding: 'br', client: fakeClient(async () => big) }));
|
|
138
|
-
expect(outcome.kind).toBe('ok');
|
|
139
|
-
if (outcome.kind !== 'ok')
|
|
140
|
-
return;
|
|
141
|
-
expect(outcome.envelope.encoding).toBeUndefined();
|
|
142
|
-
expect(outcome.envelope.headers['Content-Encoding']).toBeUndefined();
|
|
143
|
-
expect(outcome.envelope.metrics.compressedBytes).toBeNull();
|
|
144
|
-
});
|
|
145
|
-
it('does NOT compress a tiny body even with gzip advertised', async () => {
|
|
146
|
-
const outcome = await runSolvePipeline(baseArgs({ acceptEncoding: 'gzip', client: fakeClient(async () => ({ ok: 1 })) }));
|
|
147
|
-
expect(outcome.kind).toBe('ok');
|
|
148
|
-
if (outcome.kind !== 'ok')
|
|
149
|
-
return;
|
|
150
|
-
expect(outcome.envelope.encoding).toBeUndefined();
|
|
151
|
-
});
|
|
152
|
-
});
|
|
153
|
-
describe('runSolvePipeline — failure outcomes', () => {
|
|
154
|
-
it('classifies the scheduler deadline (AbortError, signal NOT aborted) as timeout', async () => {
|
|
155
|
-
const outcome = await runSolvePipeline(baseArgs({
|
|
156
|
-
maxSolveDurationMs: 42_000,
|
|
157
|
-
client: fakeClient(async () => {
|
|
158
|
-
const e = new Error('aborted');
|
|
159
|
-
e.name = 'AbortError';
|
|
160
|
-
throw e;
|
|
161
|
-
})
|
|
162
|
-
}));
|
|
163
|
-
expect(outcome.kind).toBe('timeout');
|
|
164
|
-
if (outcome.kind !== 'timeout')
|
|
165
|
-
return;
|
|
166
|
-
expect(outcome.message).toContain('42s');
|
|
167
|
-
expect(outcome.durationMs).toBeGreaterThanOrEqual(0);
|
|
168
|
-
});
|
|
169
|
-
it('classifies AbortError with the request signal aborted as client_abort', async () => {
|
|
170
|
-
const controller = new AbortController();
|
|
171
|
-
controller.abort();
|
|
172
|
-
const outcome = await runSolvePipeline(baseArgs({
|
|
173
|
-
signal: controller.signal,
|
|
174
|
-
client: fakeClient(async () => {
|
|
175
|
-
const e = new Error('aborted');
|
|
176
|
-
e.name = 'AbortError';
|
|
177
|
-
throw e;
|
|
178
|
-
})
|
|
179
|
-
}));
|
|
180
|
-
expect(outcome.kind).toBe('client_abort');
|
|
181
|
-
});
|
|
182
|
-
it('R3: a client disconnect while QUEUED forwards the signal and settles client_abort without a result', async () => {
|
|
183
|
-
// Models the queued-disconnect path the package fix (ISSUES 46) closes: the
|
|
184
|
-
// signal fires while the item waits in the FIFO, the scheduler settles it
|
|
185
|
-
// ABORTED (rejects with AbortError) and never runs compute. The pipeline's
|
|
186
|
-
// job — verified here — is to (a) hand the request signal to scheduler.solve
|
|
187
|
-
// so that prune can happen, and (b) classify the aborted-signal reject as
|
|
188
|
-
// client_abort (→ 499), never leaking a compute result.
|
|
189
|
-
const controller = new AbortController();
|
|
190
|
-
let seenSignal;
|
|
191
|
-
const outcome = await runSolvePipeline(baseArgs({
|
|
192
|
-
signal: controller.signal,
|
|
193
|
-
client: fakeClient(async (_d, _t, opts) => {
|
|
194
|
-
seenSignal = opts.signal;
|
|
195
|
-
// The disconnect arrives while queued: abort, then settle ABORTED —
|
|
196
|
-
// compute output is never produced (the loader throws, never returns).
|
|
197
|
-
controller.abort();
|
|
198
|
-
const e = new Error('aborted while queued');
|
|
199
|
-
e.name = 'AbortError';
|
|
200
|
-
throw e;
|
|
201
|
-
})
|
|
202
|
-
}));
|
|
203
|
-
expect(seenSignal).toBe(controller.signal); // scheduler CAN observe the disconnect
|
|
204
|
-
expect(outcome.kind).toBe('client_abort'); // → 499, not a 500/compute_error
|
|
205
|
-
});
|
|
206
|
-
it('classifies any other throw as compute_error carrying the original error', async () => {
|
|
207
|
-
const boom = new TypeError('fetch failed');
|
|
208
|
-
const outcome = await runSolvePipeline(baseArgs({
|
|
209
|
-
client: fakeClient(async () => {
|
|
210
|
-
throw boom;
|
|
211
|
-
})
|
|
212
|
-
}));
|
|
213
|
-
expect(outcome.kind).toBe('compute_error');
|
|
214
|
-
if (outcome.kind !== 'compute_error')
|
|
215
|
-
return;
|
|
216
|
-
expect(outcome.error).toBe(boom);
|
|
217
|
-
});
|
|
218
|
-
it('returns too_large when the serialized result exceeds responseMaxBytes', async () => {
|
|
219
|
-
const outcome = await runSolvePipeline(baseArgs({
|
|
220
|
-
responseMaxBytes: 10, // tiny cap
|
|
221
|
-
client: fakeClient(async () => ({ values: 'a bigger than ten bytes payload' }))
|
|
222
|
-
}));
|
|
223
|
-
expect(outcome.kind).toBe('too_large');
|
|
224
|
-
});
|
|
225
|
-
it('classifies a QUEUE_FULL rejection as shed(queue_full) with a Retry-After hint', async () => {
|
|
226
|
-
const outcome = await runSolvePipeline(baseArgs({
|
|
227
|
-
client: fakeClient(async () => {
|
|
228
|
-
throw makeShedError('queue full', 'QUEUE_FULL', {
|
|
229
|
-
statusCode: 503,
|
|
230
|
-
context: { queueDepth: 8, maxQueueDepth: 8 }
|
|
231
|
-
});
|
|
232
|
-
})
|
|
233
|
-
}));
|
|
234
|
-
expect(outcome.kind).toBe('shed');
|
|
235
|
-
if (outcome.kind !== 'shed')
|
|
236
|
-
return;
|
|
237
|
-
expect(outcome.reason).toBe('queue_full');
|
|
238
|
-
expect(outcome.retryAfterSeconds).toBeGreaterThan(0);
|
|
239
|
-
expect(outcome.message).toBeTruthy();
|
|
240
|
-
});
|
|
241
|
-
it('classifies a QUEUE_TIMEOUT rejection as shed(queue_timeout)', async () => {
|
|
242
|
-
const outcome = await runSolvePipeline(baseArgs({
|
|
243
|
-
client: fakeClient(async () => {
|
|
244
|
-
throw makeShedError('queued too long', 'QUEUE_TIMEOUT', {
|
|
245
|
-
statusCode: 503,
|
|
246
|
-
context: { waitedMs: 5000, queueWaitMs: 3000 }
|
|
247
|
-
});
|
|
248
|
-
})
|
|
249
|
-
}));
|
|
250
|
-
expect(outcome.kind).toBe('shed');
|
|
251
|
-
if (outcome.kind !== 'shed')
|
|
252
|
-
return;
|
|
253
|
-
expect(outcome.reason).toBe('queue_timeout');
|
|
254
|
-
expect(outcome.retryAfterSeconds).toBeGreaterThan(0);
|
|
255
|
-
});
|
|
256
|
-
it('does NOT shed a RhinoComputeError with an unrelated code (stays compute_error)', async () => {
|
|
257
|
-
const boom = makeShedError('server exploded', 'UNKNOWN_ERROR', {
|
|
258
|
-
statusCode: 500
|
|
259
|
-
});
|
|
260
|
-
const outcome = await runSolvePipeline(baseArgs({
|
|
261
|
-
client: fakeClient(async () => {
|
|
262
|
-
throw boom;
|
|
263
|
-
})
|
|
264
|
-
}));
|
|
265
|
-
expect(outcome.kind).toBe('compute_error');
|
|
266
|
-
if (outcome.kind !== 'compute_error')
|
|
267
|
-
return;
|
|
268
|
-
expect(outcome.error).toBe(boom);
|
|
269
|
-
});
|
|
270
|
-
});
|
|
271
|
-
describe('runSolvePipeline — Server-Timing', () => {
|
|
272
|
-
it('emits the core phases and echoes prep marks as p_*', async () => {
|
|
273
|
-
const outcome = await runSolvePipeline(baseArgs({
|
|
274
|
-
defLoadMs: 12.3,
|
|
275
|
-
prepMarks: [
|
|
276
|
-
['body', 0.5],
|
|
277
|
-
['client', 3.1]
|
|
278
|
-
],
|
|
279
|
-
client: fakeClient(async () => ({ errors: [], warnings: [] }))
|
|
280
|
-
}));
|
|
281
|
-
expect(outcome.kind).toBe('ok');
|
|
282
|
-
if (outcome.kind !== 'ok')
|
|
283
|
-
return;
|
|
284
|
-
const st = outcome.envelope.headers['Server-Timing'];
|
|
285
|
-
expect(st).toContain('load;dur=12.3');
|
|
286
|
-
expect(st).toContain('tree;dur=');
|
|
287
|
-
expect(st).toContain('solve;dur=');
|
|
288
|
-
expect(st).toContain('serialize;dur=');
|
|
289
|
-
expect(st).toContain('total;dur=');
|
|
290
|
-
expect(st).toContain('p_body;dur=0.5');
|
|
291
|
-
expect(st).toContain('p_client;dur=3.1');
|
|
292
|
-
});
|
|
293
|
-
it('splits solve into rhino_* + compute_link when the client reported server timing', async () => {
|
|
294
|
-
// The real callbacks fire DURING the solve: onServerTiming per compute
|
|
295
|
-
// call, onSettle per settle — each bumps its seq. Mimic both so the
|
|
296
|
-
// pipeline's attribution guard (exactly one write since the snapshot,
|
|
297
|
-
// settle not fromCache) sees this request's own telemetry.
|
|
298
|
-
const client = fakeClient(async () => {
|
|
299
|
-
client.rhinoTiming.seq += 1;
|
|
300
|
-
client.rhinoTiming.last = { decode: 5, solve: 20, encode: 3 };
|
|
301
|
-
client.solveMeta.seq += 1;
|
|
302
|
-
client.solveMeta.last = { fromCache: false, definitionReuploaded: false };
|
|
303
|
-
return { errors: [], warnings: [] };
|
|
304
|
-
});
|
|
305
|
-
const outcome = await runSolvePipeline(baseArgs({ client }));
|
|
306
|
-
expect(outcome.kind).toBe('ok');
|
|
307
|
-
if (outcome.kind !== 'ok')
|
|
308
|
-
return;
|
|
309
|
-
const st = outcome.envelope.headers['Server-Timing'];
|
|
310
|
-
expect(st).toContain('rhino_decode;dur=5.0');
|
|
311
|
-
expect(st).toContain('rhino_solve;dur=20.0');
|
|
312
|
-
expect(st).toContain('rhino_encode;dur=3.0');
|
|
313
|
-
expect(st).toContain('compute_link;dur=');
|
|
314
|
-
});
|
|
315
|
-
it('surfaces selva_cache + def_reupload verdicts as 0/1 flags', async () => {
|
|
316
|
-
const client = fakeClient(async () => {
|
|
317
|
-
client.solveMeta.seq += 1;
|
|
318
|
-
client.solveMeta.last = { fromCache: true, definitionReuploaded: false };
|
|
319
|
-
return { errors: [], warnings: [] };
|
|
320
|
-
});
|
|
321
|
-
const outcome = await runSolvePipeline(baseArgs({ client }));
|
|
322
|
-
expect(outcome.kind).toBe('ok');
|
|
323
|
-
if (outcome.kind !== 'ok')
|
|
324
|
-
return;
|
|
325
|
-
const st = outcome.envelope.headers['Server-Timing'];
|
|
326
|
-
expect(st).toContain('selva_cache;dur=1');
|
|
327
|
-
expect(st).toContain('def_reupload;dur=0');
|
|
328
|
-
});
|
|
329
|
-
it('does not attribute stale telemetry a previous request left on the warm client', async () => {
|
|
330
|
-
// The holders are shared per-server. Data written before this solve's
|
|
331
|
-
// snapshot (seq unchanged during the solve) must not leak into this
|
|
332
|
-
// request's Server-Timing.
|
|
333
|
-
const client = fakeClient(async () => ({ errors: [], warnings: [] }));
|
|
334
|
-
client.rhinoTiming = { last: { decode: 99, solve: 99, encode: 99 }, seq: 3 };
|
|
335
|
-
client.solveMeta = { last: { fromCache: true }, seq: 5 };
|
|
336
|
-
const outcome = await runSolvePipeline(baseArgs({ client }));
|
|
337
|
-
expect(outcome.kind).toBe('ok');
|
|
338
|
-
if (outcome.kind !== 'ok')
|
|
339
|
-
return;
|
|
340
|
-
expect(outcome.envelope.headers['Server-Timing']).not.toContain('rhino_decode');
|
|
341
|
-
expect(outcome.envelope.headers['Server-Timing']).not.toContain('selva_cache');
|
|
342
|
-
});
|
|
343
|
-
it('drops telemetry when a concurrent request also settled in the window (audit B6)', async () => {
|
|
344
|
-
// With maxConcurrentSolves > 1 two solves can interleave. More than one
|
|
345
|
-
// settle since this request's snapshot makes the shared slots ambiguous —
|
|
346
|
-
// the pipeline must omit the segments rather than report another
|
|
347
|
-
// request's cache verdict / rhino timing as ours.
|
|
348
|
-
const client = fakeClient(async () => {
|
|
349
|
-
// Our own solve's callbacks…
|
|
350
|
-
client.rhinoTiming.seq += 1;
|
|
351
|
-
client.rhinoTiming.last = { decode: 5, solve: 20, encode: 3 };
|
|
352
|
-
client.solveMeta.seq += 1;
|
|
353
|
-
client.solveMeta.last = { fromCache: false, definitionReuploaded: false };
|
|
354
|
-
// …then a concurrent request settles before we read.
|
|
355
|
-
client.rhinoTiming.seq += 1;
|
|
356
|
-
client.rhinoTiming.last = { decode: 1, solve: 1, encode: 1 };
|
|
357
|
-
client.solveMeta.seq += 1;
|
|
358
|
-
client.solveMeta.last = { fromCache: true };
|
|
359
|
-
return { errors: [], warnings: [] };
|
|
360
|
-
});
|
|
361
|
-
const outcome = await runSolvePipeline(baseArgs({ client }));
|
|
362
|
-
expect(outcome.kind).toBe('ok');
|
|
363
|
-
if (outcome.kind !== 'ok')
|
|
364
|
-
return;
|
|
365
|
-
const st = outcome.envelope.headers['Server-Timing'];
|
|
366
|
-
expect(st).not.toContain('selva_cache');
|
|
367
|
-
expect(st).not.toContain('rhino_decode');
|
|
368
|
-
});
|
|
369
|
-
it('emits def_bytes=skipped when the byteRefOutcome shows load() never ran (pointer solve)', async () => {
|
|
370
|
-
const outcome = await runSolvePipeline(baseArgs({
|
|
371
|
-
byteRefOutcome: { loaded: false, fromCache: false },
|
|
372
|
-
client: fakeClient(async () => ({ errors: [], warnings: [] }))
|
|
373
|
-
}));
|
|
374
|
-
expect(outcome.kind).toBe('ok');
|
|
375
|
-
if (outcome.kind !== 'ok')
|
|
376
|
-
return;
|
|
377
|
-
expect(outcome.envelope.headers['Server-Timing']).toContain('def_bytes;desc=skipped');
|
|
378
|
-
});
|
|
379
|
-
it('emits def_bytes=hit when bytes were served from the warm cache', async () => {
|
|
380
|
-
const outcome = await runSolvePipeline(baseArgs({
|
|
381
|
-
byteRefOutcome: { loaded: true, fromCache: true },
|
|
382
|
-
client: fakeClient(async () => ({ errors: [], warnings: [] }))
|
|
383
|
-
}));
|
|
384
|
-
expect(outcome.kind).toBe('ok');
|
|
385
|
-
if (outcome.kind !== 'ok')
|
|
386
|
-
return;
|
|
387
|
-
expect(outcome.envelope.headers['Server-Timing']).toContain('def_bytes;desc=hit');
|
|
388
|
-
});
|
|
389
|
-
it('emits def_bytes=miss when the loader was called', async () => {
|
|
390
|
-
const outcome = await runSolvePipeline(baseArgs({
|
|
391
|
-
byteRefOutcome: { loaded: true, fromCache: false },
|
|
392
|
-
client: fakeClient(async () => ({ errors: [], warnings: [] }))
|
|
393
|
-
}));
|
|
394
|
-
expect(outcome.kind).toBe('ok');
|
|
395
|
-
if (outcome.kind !== 'ok')
|
|
396
|
-
return;
|
|
397
|
-
expect(outcome.envelope.headers['Server-Timing']).toContain('def_bytes;desc=miss');
|
|
398
|
-
});
|
|
399
|
-
it('omits def_bytes entirely for a raw-bytes solve (no byteRefOutcome)', async () => {
|
|
400
|
-
const outcome = await runSolvePipeline(baseArgs({ client: fakeClient(async () => ({ errors: [], warnings: [] })) }));
|
|
401
|
-
expect(outcome.kind).toBe('ok');
|
|
402
|
-
if (outcome.kind !== 'ok')
|
|
403
|
-
return;
|
|
404
|
-
expect(outcome.envelope.headers['Server-Timing']).not.toContain('def_bytes');
|
|
405
|
-
});
|
|
406
|
-
it('never attributes rhino timing to a Selva-cache hit (no compute call of ours)', async () => {
|
|
407
|
-
// Our request was served from the in-process cache while a concurrent
|
|
408
|
-
// request's compute call produced the only rhino timing in the window.
|
|
409
|
-
const client = fakeClient(async () => {
|
|
410
|
-
client.rhinoTiming.seq += 1; // the OTHER request's compute call
|
|
411
|
-
client.rhinoTiming.last = { decode: 7, solve: 70, encode: 7 };
|
|
412
|
-
client.solveMeta.seq += 1; // our own settle — a cache hit
|
|
413
|
-
client.solveMeta.last = { fromCache: true };
|
|
414
|
-
return { errors: [], warnings: [] };
|
|
415
|
-
});
|
|
416
|
-
const outcome = await runSolvePipeline(baseArgs({ client }));
|
|
417
|
-
expect(outcome.kind).toBe('ok');
|
|
418
|
-
if (outcome.kind !== 'ok')
|
|
419
|
-
return;
|
|
420
|
-
const st = outcome.envelope.headers['Server-Timing'];
|
|
421
|
-
expect(st).toContain('selva_cache;dur=1');
|
|
422
|
-
expect(st).not.toContain('rhino_decode');
|
|
423
|
-
});
|
|
424
|
-
});
|
|
425
|
-
// ============================================================================
|
|
426
|
-
// L2 durable solve cache hook (Phase 3.4)
|
|
427
|
-
// ============================================================================
|
|
428
|
-
describe('runSolvePipeline — L2 solve cache', () => {
|
|
429
|
-
const config = { computeServerId: 'srv-1' };
|
|
430
|
-
/** A hook backed by a Map, recording lookups/stores for assertions. */
|
|
431
|
-
function fakeHook(seed) {
|
|
432
|
-
const store = seed ?? new Map();
|
|
433
|
-
const lookups = [];
|
|
434
|
-
const stores = [];
|
|
435
|
-
const hook = {
|
|
436
|
-
configSubset: config,
|
|
437
|
-
lookup: async (key) => {
|
|
438
|
-
lookups.push(key);
|
|
439
|
-
return store.get(key) ?? null;
|
|
440
|
-
},
|
|
441
|
-
store: (key, entry) => {
|
|
442
|
-
stores.push(key);
|
|
443
|
-
store.set(key, entry);
|
|
444
|
-
}
|
|
445
|
-
};
|
|
446
|
-
return { hook, store, lookups, stores };
|
|
447
|
-
}
|
|
448
|
-
it('a miss solves, then write-throughs the gzipped envelope and marks l2_cache;dur=0', async () => {
|
|
449
|
-
const result = { values: [{ id: 'out' }], errors: [], warnings: ['w'] };
|
|
450
|
-
let solves = 0;
|
|
451
|
-
const { hook, store, stores } = fakeHook();
|
|
452
|
-
const outcome = await runSolvePipeline(baseArgs({
|
|
453
|
-
client: fakeClient(async () => {
|
|
454
|
-
solves += 1;
|
|
455
|
-
return result;
|
|
456
|
-
}),
|
|
457
|
-
acceptEncoding: 'gzip',
|
|
458
|
-
solveCache: hook
|
|
459
|
-
}));
|
|
460
|
-
expect(outcome.kind).toBe('ok');
|
|
461
|
-
if (outcome.kind !== 'ok')
|
|
462
|
-
return;
|
|
463
|
-
expect(solves).toBe(1);
|
|
464
|
-
expect(outcome.envelope.headers['Server-Timing']).toContain('l2_cache;dur=0');
|
|
465
|
-
// Write-through happened — one entry stored under the derived key.
|
|
466
|
-
expect(stores).toHaveLength(1);
|
|
467
|
-
expect(store.size).toBe(1);
|
|
468
|
-
});
|
|
469
|
-
it('a hit returns the stored envelope WITHOUT solving and marks l2_cache;dur=1', async () => {
|
|
470
|
-
const result = { values: [{ id: 'cached' }], errors: [], warnings: [] };
|
|
471
|
-
const serialized = JSON.stringify(result);
|
|
472
|
-
// Pre-seed the store at the key the pipeline will derive for these inputs.
|
|
473
|
-
const args = baseArgs({ acceptEncoding: 'gzip' });
|
|
474
|
-
const tree = { __tree: true, count: 1 }; // matches the mock TreeBuilder output
|
|
475
|
-
const inputKey = deriveSolveCacheInputKey(tree, config).hash;
|
|
476
|
-
const entry = encodeSolveCacheEntry({ errorCount: 0, warningCount: 0, serializedBytes: serialized.length, inputHash: inputKey }, new Uint8Array(gzipSync(Buffer.from(serialized))));
|
|
477
|
-
const seed = new Map([[inputKey, entry]]);
|
|
478
|
-
const { hook } = fakeHook(seed);
|
|
479
|
-
let solves = 0;
|
|
480
|
-
const outcome = await runSolvePipeline({
|
|
481
|
-
...args,
|
|
482
|
-
client: fakeClient(async () => {
|
|
483
|
-
solves += 1;
|
|
484
|
-
return { values: [], errors: [], warnings: [] };
|
|
485
|
-
}),
|
|
486
|
-
solveCache: hook
|
|
487
|
-
});
|
|
488
|
-
expect(outcome.kind).toBe('ok');
|
|
489
|
-
if (outcome.kind !== 'ok')
|
|
490
|
-
return;
|
|
491
|
-
expect(solves).toBe(0); // never solved — served from L2
|
|
492
|
-
expect(outcome.envelope.encoding).toBe('gzip');
|
|
493
|
-
expect(gunzipSync(outcome.envelope.body).toString()).toBe(serialized);
|
|
494
|
-
expect(outcome.envelope.headers['Server-Timing']).toContain('l2_cache;dur=1');
|
|
495
|
-
});
|
|
496
|
-
it('a hit for a non-gzip client gunzips the stored body back to JSON', async () => {
|
|
497
|
-
const result = { values: [{ id: 'x' }], errors: [], warnings: [] };
|
|
498
|
-
const serialized = JSON.stringify(result);
|
|
499
|
-
const tree = { __tree: true, count: 1 };
|
|
500
|
-
const inputKey = deriveSolveCacheInputKey(tree, config).hash;
|
|
501
|
-
const entry = encodeSolveCacheEntry({ errorCount: 0, warningCount: 0, serializedBytes: serialized.length, inputHash: inputKey }, new Uint8Array(gzipSync(Buffer.from(serialized))));
|
|
502
|
-
const { hook } = fakeHook(new Map([[inputKey, entry]]));
|
|
503
|
-
const outcome = await runSolvePipeline(baseArgs({ acceptEncoding: '', solveCache: hook }));
|
|
504
|
-
expect(outcome.kind).toBe('ok');
|
|
505
|
-
if (outcome.kind !== 'ok')
|
|
506
|
-
return;
|
|
507
|
-
expect(outcome.envelope.encoding).toBeUndefined();
|
|
508
|
-
expect(outcome.envelope.body).toBe(serialized);
|
|
509
|
-
});
|
|
510
|
-
it('a stored entry whose inputHash mismatches is ignored (collision defense) and re-solves', async () => {
|
|
511
|
-
// Seed the derived key with an entry carrying a DIFFERENT inputHash — a
|
|
512
|
-
// (hypothetical) storage-key collision must not serve the wrong geometry.
|
|
513
|
-
const tree = { __tree: true, count: 1 };
|
|
514
|
-
const inputKey = deriveSolveCacheInputKey(tree, config).hash;
|
|
515
|
-
const wrong = encodeSolveCacheEntry({ errorCount: 0, warningCount: 0, serializedBytes: 2, inputHash: 'not-the-real-hash' }, new Uint8Array(gzipSync(Buffer.from('{}'))));
|
|
516
|
-
const { hook } = fakeHook(new Map([[inputKey, wrong]]));
|
|
517
|
-
let solves = 0;
|
|
518
|
-
const outcome = await runSolvePipeline(baseArgs({
|
|
519
|
-
client: fakeClient(async () => {
|
|
520
|
-
solves += 1;
|
|
521
|
-
return { values: [{ id: 'fresh' }], errors: [], warnings: [] };
|
|
522
|
-
}),
|
|
523
|
-
solveCache: hook
|
|
524
|
-
}));
|
|
525
|
-
expect(outcome.kind).toBe('ok');
|
|
526
|
-
if (outcome.kind !== 'ok')
|
|
527
|
-
return;
|
|
528
|
-
expect(solves).toBe(1); // fell through to a real solve
|
|
529
|
-
});
|
|
530
|
-
it('omits l2_cache from Server-Timing when no hook is passed', async () => {
|
|
531
|
-
const outcome = await runSolvePipeline(baseArgs());
|
|
532
|
-
expect(outcome.kind).toBe('ok');
|
|
533
|
-
if (outcome.kind !== 'ok')
|
|
534
|
-
return;
|
|
535
|
-
expect(outcome.envelope.headers['Server-Timing']).not.toContain('l2_cache');
|
|
536
|
-
});
|
|
537
|
-
it('a lookup that rejects is treated as a miss (best-effort), then solves', async () => {
|
|
538
|
-
let solves = 0;
|
|
539
|
-
const hook = {
|
|
540
|
-
configSubset: config,
|
|
541
|
-
lookup: async () => {
|
|
542
|
-
throw new Error('backend down');
|
|
543
|
-
},
|
|
544
|
-
store: () => { }
|
|
545
|
-
};
|
|
546
|
-
const outcome = await runSolvePipeline(baseArgs({
|
|
547
|
-
client: fakeClient(async () => {
|
|
548
|
-
solves += 1;
|
|
549
|
-
return { values: [], errors: [], warnings: [] };
|
|
550
|
-
}),
|
|
551
|
-
solveCache: hook
|
|
552
|
-
}));
|
|
553
|
-
expect(outcome.kind).toBe('ok');
|
|
554
|
-
expect(solves).toBe(1);
|
|
555
|
-
});
|
|
556
|
-
});
|
|
557
|
-
//# sourceMappingURL=solve-pipeline.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"solve-pipeline.test.js","sourceRoot":"","sources":["../../../src/compute/__tests__/solve-pipeline.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAGvC,8EAA8E;AAC9E,0EAA0E;AAC1E,6EAA6E;AAC7E,gFAAgF;AAChF,8EAA8E;AAC9E,4EAA4E;AAC5E,EAAE,CAAC,IAAI,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,MAAM,iBAAkB,SAAQ,KAAK;QACpC,IAAI,CAAS;QACb,UAAU,CAAU;QACpB,OAAO,CAA2B;QAClC,YACC,OAAe,EACf,IAAY,EACZ,OAAoE;YAEpE,KAAK,CAAC,OAAO,CAAC,CAAC;YACf,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;YAChC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;YACjB,IAAI,CAAC,UAAU,GAAG,OAAO,EAAE,UAAU,CAAC;YACtC,IAAI,CAAC,OAAO,GAAG,OAAO,EAAE,OAAO,CAAC;QACjC,CAAC;KACD;IACD,OAAO;QACN,WAAW,EAAE;YACZ,eAAe,EAAE,CAAC,MAAiB,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;SAChF;QACD,2EAA2E;QAC3E,uEAAuE;QACvE,YAAY,EAAE,CAAC,GAAe,EAAE,EAAE,CAAC,GAAG;QACtC,6EAA6E;QAC7E,8DAA8D;QAC9D,eAAe,EAAE,CAAC,KAAc,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;QAC1D,iBAAiB;QACjB,UAAU,EAAE,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE;KACxE,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,8EAA8E;AAC9E,+EAA+E;AAC/E,OAAO,EAAE,iBAAiB,IAAI,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAC9E,MAAM,aAAa,GAAG,CACrB,OAAe,EACf,IAAsD,EACtD,OAAoE,EACnE,EAAE,CACH,IAAK,qBAIM,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;AAErC,OAAO,EACN,gBAAgB,EAChB,wBAAwB,EACxB,sBAAsB,EACtB,wBAAwB,EACxB,qBAAqB,EAKrB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAarC,sEAAsE;AACtE,SAAS,UAAU,CAAC,KAAgB;IACnC,OAAO;QACN,MAAM,EAAE,EAAuB;QAC/B,SAAS,EAAE,EAAE,KAAK,EAA+B;QACjD,WAAW,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,EAAE;QACnC,SAAS,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,EAAE;KACjC,CAAC;AACH,CAAC;AAED,SAAS,QAAQ,CAAC,OAAmC,EAAE;IACtD,OAAO;QACN,gBAAgB,EAAE,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAC3C,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAAmB,CAAC;QAC1E,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE;QAChB,MAAM,EAAE,UAAU,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;QAC1E,gBAAgB,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI;QAClC,kBAAkB,EAAE,OAAO;QAC3B,cAAc,EAAE,EAAE;QAClB,MAAM,EAAE,IAAI,eAAe,EAAE,CAAC,MAAM;QACpC,WAAW,EAAE,WAAW,CAAC,GAAG,EAAE;QAC9B,SAAS,EAAE,GAAG;QACd,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC1B,GAAG,IAAI;KACP,CAAC;AACH,CAAC;AAED,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;IAC3C,EAAE,CAAC,gEAAgE,EAAE,KAAK,IAAI,EAAE;QAC/E,MAAM,MAAM,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;QACxE,MAAM,OAAO,GAAG,MAAM,gBAAgB,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,KAAK,IAAI,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7F,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChC,IAAI,OAAO,CAAC,IAAI,KAAK,IAAI;YAAE,OAAO;QAClC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACnC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACrC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,aAAa,EAAE,CAAC;QAClD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAc,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACpE,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,wBAAwB,CAAC,CAAC,CAAC;QAChG,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAC1E,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CACtD,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAc,CAAC,CAAC,CAC1D,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;QACvE,IAAI,QAAiB,CAAC;QACtB,MAAM,OAAO,GAAG,MAAM,gBAAgB,CACrC,QAAQ,CAAC;YACR,MAAM,EAAE;gBACP,EAAE,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAAmB;gBAChE,EAAE,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAmB,CAAC,8BAA8B;aAC1E;YACD,MAAM,EAAE,UAAU,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;gBACvC,QAAQ,GAAG,IAAI,CAAC;gBAChB,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;YACrC,CAAC,CAAC;SACF,CAAC,CACF,CAAC;QACF,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChC,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;QAC3D,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,IAAI,UAAmC,CAAC;QACxC,MAAM,gBAAgB,CACrB,QAAQ,CAAC;YACR,MAAM,EAAE,UAAU,CAAC,MAAM;YACzB,MAAM,EAAE,UAAU,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE;gBACzC,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC;gBACzB,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;YACrC,CAAC,CAAC;SACF,CAAC,CACF,CAAC;QACF,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;IACxC,EAAE,CAAC,kEAAkE,EAAE,KAAK,IAAI,EAAE;QACjF,sDAAsD;QACtD,MAAM,GAAG,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,EAAE,CAAC;QACxF,MAAM,OAAO,GAAG,MAAM,gBAAgB,CACrC,QAAQ,CAAC,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,CAAC,KAAK,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAC7E,CAAC;QACF,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChC,IAAI,OAAO,CAAC,IAAI,KAAK,IAAI;YAAE,OAAO;QAClC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC/C,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAClE,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QACjE,uDAAuD;QACvD,MAAM,QAAQ,GAAG,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAkB,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;QACzF,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC1C,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;QAClE,MAAM,GAAG,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,EAAE,CAAC;QACxF,MAAM,OAAO,GAAG,MAAM,gBAAgB,CACrC,QAAQ,CAAC,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,KAAK,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CACvE,CAAC;QACF,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChC,IAAI,OAAO,CAAC,IAAI,KAAK,IAAI;YAAE,OAAO;QAClC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,aAAa,EAAE,CAAC;QAClD,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;QACrE,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;QACxE,MAAM,OAAO,GAAG,MAAM,gBAAgB,CACrC,QAAQ,CAAC,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CACjF,CAAC;QACF,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChC,IAAI,OAAO,CAAC,IAAI,KAAK,IAAI;YAAE,OAAO;QAClC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,aAAa,EAAE,CAAC;IACnD,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,qCAAqC,EAAE,GAAG,EAAE;IACpD,EAAE,CAAC,+EAA+E,EAAE,KAAK,IAAI,EAAE;QAC9F,MAAM,OAAO,GAAG,MAAM,gBAAgB,CACrC,QAAQ,CAAC;YACR,kBAAkB,EAAE,MAAM;YAC1B,MAAM,EAAE,UAAU,CAAC,KAAK,IAAI,EAAE;gBAC7B,MAAM,CAAC,GAAG,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC;gBAC/B,CAAC,CAAC,IAAI,GAAG,YAAY,CAAC;gBACtB,MAAM,CAAC,CAAC;YACT,CAAC,CAAC;SACF,CAAC,CACF,CAAC;QACF,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACrC,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS;YAAE,OAAO;QACvC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACzC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uEAAuE,EAAE,KAAK,IAAI,EAAE;QACtF,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,UAAU,CAAC,KAAK,EAAE,CAAC;QACnB,MAAM,OAAO,GAAG,MAAM,gBAAgB,CACrC,QAAQ,CAAC;YACR,MAAM,EAAE,UAAU,CAAC,MAAM;YACzB,MAAM,EAAE,UAAU,CAAC,KAAK,IAAI,EAAE;gBAC7B,MAAM,CAAC,GAAG,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC;gBAC/B,CAAC,CAAC,IAAI,GAAG,YAAY,CAAC;gBACtB,MAAM,CAAC,CAAC;YACT,CAAC,CAAC;SACF,CAAC,CACF,CAAC;QACF,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oGAAoG,EAAE,KAAK,IAAI,EAAE;QACnH,4EAA4E;QAC5E,0EAA0E;QAC1E,2EAA2E;QAC3E,6EAA6E;QAC7E,0EAA0E;QAC1E,wDAAwD;QACxD,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,IAAI,UAAmC,CAAC;QACxC,MAAM,OAAO,GAAG,MAAM,gBAAgB,CACrC,QAAQ,CAAC;YACR,MAAM,EAAE,UAAU,CAAC,MAAM;YACzB,MAAM,EAAE,UAAU,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE;gBACzC,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC;gBACzB,oEAAoE;gBACpE,uEAAuE;gBACvE,UAAU,CAAC,KAAK,EAAE,CAAC;gBACnB,MAAM,CAAC,GAAG,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;gBAC5C,CAAC,CAAC,IAAI,GAAG,YAAY,CAAC;gBACtB,MAAM,CAAC,CAAC;YACT,CAAC,CAAC;SACF,CAAC,CACF,CAAC;QACF,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,uCAAuC;QACnF,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,iCAAiC;IAC7E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yEAAyE,EAAE,KAAK,IAAI,EAAE;QACxF,MAAM,IAAI,GAAG,IAAI,SAAS,CAAC,cAAc,CAAC,CAAC;QAC3C,MAAM,OAAO,GAAG,MAAM,gBAAgB,CACrC,QAAQ,CAAC;YACR,MAAM,EAAE,UAAU,CAAC,KAAK,IAAI,EAAE;gBAC7B,MAAM,IAAI,CAAC;YACZ,CAAC,CAAC;SACF,CAAC,CACF,CAAC;QACF,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC3C,IAAI,OAAO,CAAC,IAAI,KAAK,eAAe;YAAE,OAAO;QAC7C,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uEAAuE,EAAE,KAAK,IAAI,EAAE;QACtF,MAAM,OAAO,GAAG,MAAM,gBAAgB,CACrC,QAAQ,CAAC;YACR,gBAAgB,EAAE,EAAE,EAAE,WAAW;YACjC,MAAM,EAAE,UAAU,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,iCAAiC,EAAE,CAAC,CAAC;SAC/E,CAAC,CACF,CAAC;QACF,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+EAA+E,EAAE,KAAK,IAAI,EAAE;QAC9F,MAAM,OAAO,GAAG,MAAM,gBAAgB,CACrC,QAAQ,CAAC;YACR,MAAM,EAAE,UAAU,CAAC,KAAK,IAAI,EAAE;gBAC7B,MAAM,aAAa,CAAC,YAAY,EAAE,YAAY,EAAE;oBAC/C,UAAU,EAAE,GAAG;oBACf,OAAO,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE;iBAC5C,CAAC,CAAC;YACJ,CAAC,CAAC;SACF,CAAC,CACF,CAAC;QACF,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAClC,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM;YAAE,OAAO;QACpC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC1C,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QACrD,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;QAC5E,MAAM,OAAO,GAAG,MAAM,gBAAgB,CACrC,QAAQ,CAAC;YACR,MAAM,EAAE,UAAU,CAAC,KAAK,IAAI,EAAE;gBAC7B,MAAM,aAAa,CAAC,iBAAiB,EAAE,eAAe,EAAE;oBACvD,UAAU,EAAE,GAAG;oBACf,OAAO,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE;iBAC9C,CAAC,CAAC;YACJ,CAAC,CAAC;SACF,CAAC,CACF,CAAC;QACF,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAClC,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM;YAAE,OAAO;QACpC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC7C,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gFAAgF,EAAE,KAAK,IAAI,EAAE;QAC/F,MAAM,IAAI,GAAG,aAAa,CAAC,iBAAiB,EAAE,eAAe,EAAE;YAC9D,UAAU,EAAE,GAAG;SACf,CAAC,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,gBAAgB,CACrC,QAAQ,CAAC;YACR,MAAM,EAAE,UAAU,CAAC,KAAK,IAAI,EAAE;gBAC7B,MAAM,IAAI,CAAC;YACZ,CAAC,CAAC;SACF,CAAC,CACF,CAAC;QACF,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC3C,IAAI,OAAO,CAAC,IAAI,KAAK,eAAe;YAAE,OAAO;QAC7C,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,kCAAkC,EAAE,GAAG,EAAE;IACjD,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;QACnE,MAAM,OAAO,GAAG,MAAM,gBAAgB,CACrC,QAAQ,CAAC;YACR,SAAS,EAAE,IAAI;YACf,SAAS,EAAE;gBACV,CAAC,MAAM,EAAE,GAAG,CAAC;gBACb,CAAC,QAAQ,EAAE,GAAG,CAAC;aACf;YACD,MAAM,EAAE,UAAU,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;SAC9D,CAAC,CACF,CAAC;QACF,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChC,IAAI,OAAO,CAAC,IAAI,KAAK,IAAI;YAAE,OAAO;QAClC,MAAM,EAAE,GAAG,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QACrD,MAAM,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;QACtC,MAAM,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QAClC,MAAM,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QACnC,MAAM,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;QACvC,MAAM,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QACnC,MAAM,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;QACvC,MAAM,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iFAAiF,EAAE,KAAK,IAAI,EAAE;QAChG,uEAAuE;QACvE,oEAAoE;QACpE,sEAAsE;QACtE,2DAA2D;QAC3D,MAAM,MAAM,GAAiB,UAAU,CAAC,KAAK,IAAI,EAAE;YAClD,MAAM,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC,CAAC;YAC5B,MAAM,CAAC,WAAW,CAAC,IAAI,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;YAC9D,MAAM,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,CAAC;YAC1B,MAAM,CAAC,SAAS,CAAC,IAAI,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,oBAAoB,EAAE,KAAK,EAAE,CAAC;YAC1E,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;QACrC,CAAC,CAAC,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,gBAAgB,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;QAC7D,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChC,IAAI,OAAO,CAAC,IAAI,KAAK,IAAI;YAAE,OAAO;QAClC,MAAM,EAAE,GAAG,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QACrD,MAAM,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;QAC7C,MAAM,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;QAC7C,MAAM,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;QAC7C,MAAM,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;QAC1E,MAAM,MAAM,GAAiB,UAAU,CAAC,KAAK,IAAI,EAAE;YAClD,MAAM,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,CAAC;YAC1B,MAAM,CAAC,SAAS,CAAC,IAAI,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,oBAAoB,EAAE,KAAK,EAAE,CAAC;YACzE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;QACrC,CAAC,CAAC,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,gBAAgB,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;QAC7D,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChC,IAAI,OAAO,CAAC,IAAI,KAAK,IAAI;YAAE,OAAO;QAClC,MAAM,EAAE,GAAG,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QACrD,MAAM,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;QAC1C,MAAM,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+EAA+E,EAAE,KAAK,IAAI,EAAE;QAC9F,sEAAsE;QACtE,oEAAoE;QACpE,2BAA2B;QAC3B,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;QACtE,MAAM,CAAC,WAAW,GAAG,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;QAC7E,MAAM,CAAC,SAAS,GAAG,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;QACzD,MAAM,OAAO,GAAG,MAAM,gBAAgB,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;QAC7D,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChC,IAAI,OAAO,CAAC,IAAI,KAAK,IAAI;YAAE,OAAO;QAClC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;QAChF,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;IAChF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iFAAiF,EAAE,KAAK,IAAI,EAAE;QAChG,wEAAwE;QACxE,0EAA0E;QAC1E,iEAAiE;QACjE,kDAAkD;QAClD,MAAM,MAAM,GAAiB,UAAU,CAAC,KAAK,IAAI,EAAE;YAClD,6BAA6B;YAC7B,MAAM,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC,CAAC;YAC5B,MAAM,CAAC,WAAW,CAAC,IAAI,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;YAC9D,MAAM,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,CAAC;YAC1B,MAAM,CAAC,SAAS,CAAC,IAAI,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,oBAAoB,EAAE,KAAK,EAAE,CAAC;YAC1E,qDAAqD;YACrD,MAAM,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC,CAAC;YAC5B,MAAM,CAAC,WAAW,CAAC,IAAI,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;YAC7D,MAAM,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,CAAC;YAC1B,MAAM,CAAC,SAAS,CAAC,IAAI,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;YAC5C,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;QACrC,CAAC,CAAC,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,gBAAgB,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;QAC7D,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChC,IAAI,OAAO,CAAC,IAAI,KAAK,IAAI;YAAE,OAAO;QAClC,MAAM,EAAE,GAAG,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QACrD,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QACxC,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wFAAwF,EAAE,KAAK,IAAI,EAAE;QACvG,MAAM,OAAO,GAAG,MAAM,gBAAgB,CACrC,QAAQ,CAAC;YACR,cAAc,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE;YACnD,MAAM,EAAE,UAAU,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;SAC9D,CAAC,CACF,CAAC;QACF,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChC,IAAI,OAAO,CAAC,IAAI,KAAK,IAAI;YAAE,OAAO;QAClC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,SAAS,CAAC,wBAAwB,CAAC,CAAC;IACvF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gEAAgE,EAAE,KAAK,IAAI,EAAE;QAC/E,MAAM,OAAO,GAAG,MAAM,gBAAgB,CACrC,QAAQ,CAAC;YACR,cAAc,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE;YACjD,MAAM,EAAE,UAAU,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;SAC9D,CAAC,CACF,CAAC;QACF,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChC,IAAI,OAAO,CAAC,IAAI,KAAK,IAAI;YAAE,OAAO;QAClC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;IACnF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;QAChE,MAAM,OAAO,GAAG,MAAM,gBAAgB,CACrC,QAAQ,CAAC;YACR,cAAc,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE;YAClD,MAAM,EAAE,UAAU,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;SAC9D,CAAC,CACF,CAAC;QACF,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChC,IAAI,OAAO,CAAC,IAAI,KAAK,IAAI;YAAE,OAAO;QAClC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;IACpF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oEAAoE,EAAE,KAAK,IAAI,EAAE;QACnF,MAAM,OAAO,GAAG,MAAM,gBAAgB,CACrC,QAAQ,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAC5E,CAAC;QACF,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChC,IAAI,OAAO,CAAC,IAAI,KAAK,IAAI;YAAE,OAAO;QAClC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IAC9E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8EAA8E,EAAE,KAAK,IAAI,EAAE;QAC7F,sEAAsE;QACtE,uEAAuE;QACvE,MAAM,MAAM,GAAiB,UAAU,CAAC,KAAK,IAAI,EAAE;YAClD,MAAM,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,mCAAmC;YAChE,MAAM,CAAC,WAAW,CAAC,IAAI,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;YAC9D,MAAM,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,+BAA+B;YAC1D,MAAM,CAAC,SAAS,CAAC,IAAI,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;YAC5C,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;QACrC,CAAC,CAAC,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,gBAAgB,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;QAC7D,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChC,IAAI,OAAO,CAAC,IAAI,KAAK,IAAI;YAAE,OAAO;QAClC,MAAM,EAAE,GAAG,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QACrD,MAAM,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;QAC1C,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,+EAA+E;AAC/E,0CAA0C;AAC1C,+EAA+E;AAE/E,QAAQ,CAAC,mCAAmC,EAAE,GAAG,EAAE;IAClD,MAAM,MAAM,GAAG,EAAE,eAAe,EAAE,OAAO,EAAE,CAAC;IAE5C,uEAAuE;IACvE,SAAS,QAAQ,CAAC,IAA8B;QAC/C,MAAM,KAAK,GAAG,IAAI,IAAI,IAAI,GAAG,EAAsB,CAAC;QACpD,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,MAAM,IAAI,GAA2B;YACpC,YAAY,EAAE,MAAM;YACpB,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;gBACrB,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAClB,OAAO,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC;YAC/B,CAAC;YACD,KAAK,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;gBACrB,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACjB,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YACvB,CAAC;SACD,CAAC;QACF,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IACzC,CAAC;IAED,EAAE,CAAC,kFAAkF,EAAE,KAAK,IAAI,EAAE;QACjG,MAAM,MAAM,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;QACxE,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,QAAQ,EAAE,CAAC;QAC3C,MAAM,OAAO,GAAG,MAAM,gBAAgB,CACrC,QAAQ,CAAC;YACR,MAAM,EAAE,UAAU,CAAC,KAAK,IAAI,EAAE;gBAC7B,MAAM,IAAI,CAAC,CAAC;gBACZ,OAAO,MAAM,CAAC;YACf,CAAC,CAAC;YACF,cAAc,EAAE,MAAM;YACtB,UAAU,EAAE,IAAI;SAChB,CAAC,CACF,CAAC;QACF,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChC,IAAI,OAAO,CAAC,IAAI,KAAK,IAAI;YAAE,OAAO;QAClC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACvB,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;QAC9E,mEAAmE;QACnE,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC/B,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4EAA4E,EAAE,KAAK,IAAI,EAAE;QAC3F,MAAM,MAAM,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;QACxE,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAC1C,2EAA2E;QAC3E,MAAM,IAAI,GAAG,QAAQ,CAAC,EAAE,cAAc,EAAE,MAAM,EAAE,CAAC,CAAC;QAClD,MAAM,IAAI,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,sCAAsC;QAC/E,MAAM,QAAQ,GAAG,wBAAwB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC;QAC7D,MAAM,KAAK,GAAG,qBAAqB,CAClC,EAAE,UAAU,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,eAAe,EAAE,UAAU,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,EAC3F,IAAI,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CACjD,CAAC;QACF,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;QAC1C,MAAM,EAAE,IAAI,EAAE,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;QAEhC,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,MAAM,OAAO,GAAG,MAAM,gBAAgB,CAAC;YACtC,GAAG,IAAI;YACP,MAAM,EAAE,UAAU,CAAC,KAAK,IAAI,EAAE;gBAC7B,MAAM,IAAI,CAAC,CAAC;gBACZ,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;YACjD,CAAC,CAAC;YACF,UAAU,EAAE,IAAI;SAChB,CAAC,CAAC;QACH,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChC,IAAI,OAAO,CAAC,IAAI,KAAK,IAAI;YAAE,OAAO;QAClC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,gCAAgC;QACxD,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC/C,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAkB,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACpF,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;IAC/E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kEAAkE,EAAE,KAAK,IAAI,EAAE;QACjF,MAAM,MAAM,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;QACnE,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAC1C,MAAM,IAAI,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;QACxC,MAAM,QAAQ,GAAG,wBAAwB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC;QAC7D,MAAM,KAAK,GAAG,qBAAqB,CAClC,EAAE,UAAU,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,eAAe,EAAE,UAAU,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,EAC3F,IAAI,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CACjD,CAAC;QACF,MAAM,EAAE,IAAI,EAAE,GAAG,QAAQ,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACxD,MAAM,OAAO,GAAG,MAAM,gBAAgB,CAAC,QAAQ,CAAC,EAAE,cAAc,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAC3F,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChC,IAAI,OAAO,CAAC,IAAI,KAAK,IAAI;YAAE,OAAO;QAClC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,aAAa,EAAE,CAAC;QAClD,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wFAAwF,EAAE,KAAK,IAAI,EAAE;QACvG,wEAAwE;QACxE,0EAA0E;QAC1E,MAAM,IAAI,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;QACxC,MAAM,QAAQ,GAAG,wBAAwB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC;QAC7D,MAAM,KAAK,GAAG,qBAAqB,CAClC,EAAE,UAAU,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,eAAe,EAAE,CAAC,EAAE,SAAS,EAAE,mBAAmB,EAAE,EACtF,IAAI,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAC3C,CAAC;QACF,MAAM,EAAE,IAAI,EAAE,GAAG,QAAQ,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACxD,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,MAAM,OAAO,GAAG,MAAM,gBAAgB,CACrC,QAAQ,CAAC;YACR,MAAM,EAAE,UAAU,CAAC,KAAK,IAAI,EAAE;gBAC7B,MAAM,IAAI,CAAC,CAAC;gBACZ,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;YAChE,CAAC,CAAC;YACF,UAAU,EAAE,IAAI;SAChB,CAAC,CACF,CAAC;QACF,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChC,IAAI,OAAO,CAAC,IAAI,KAAK,IAAI;YAAE,OAAO;QAClC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,+BAA+B;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;QACzE,MAAM,OAAO,GAAG,MAAM,gBAAgB,CAAC,QAAQ,EAAE,CAAC,CAAC;QACnD,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChC,IAAI,OAAO,CAAC,IAAI,KAAK,IAAI;YAAE,OAAO;QAClC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IAC7E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uEAAuE,EAAE,KAAK,IAAI,EAAE;QACtF,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,MAAM,IAAI,GAA2B;YACpC,YAAY,EAAE,MAAM;YACpB,MAAM,EAAE,KAAK,IAAI,EAAE;gBAClB,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC,CAAC;YACjC,CAAC;YACD,KAAK,EAAE,GAAG,EAAE,GAAE,CAAC;SACf,CAAC;QACF,MAAM,OAAO,GAAG,MAAM,gBAAgB,CACrC,QAAQ,CAAC;YACR,MAAM,EAAE,UAAU,CAAC,KAAK,IAAI,EAAE;gBAC7B,MAAM,IAAI,CAAC,CAAC;gBACZ,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;YACjD,CAAC,CAAC;YACF,UAAU,EAAE,IAAI;SAChB,CAAC,CACF,CAAC;QACF,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACxB,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC"}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tests for `transformInputParameter` — the adapter that turns a persisted `SchemaInput`
|
|
3
|
-
* (plus the user's chosen value) into the `@selvajs/compute` `InputParam` that
|
|
4
|
-
* `TreeBuilder.fromInputParams` serializes for the solve.
|
|
5
|
-
*
|
|
6
|
-
* The adapter delegates to the package's `processInput`, so these assert the
|
|
7
|
-
* package-aligned behavior: correct `paramType` for every type (not the old
|
|
8
|
-
* coerce-everything-to-Text), and `default` carrying the user's value. Where a value/
|
|
9
|
-
* default is absent, `processInput` leaves `default` undefined and `fromInputParams`
|
|
10
|
-
* omits the input entirely — letting Grasshopper use its own internal default rather
|
|
11
|
-
* than forcing `''`/`false`.
|
|
12
|
-
*/
|
|
13
|
-
export {};
|
|
14
|
-
//# sourceMappingURL=transform-input.test.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"transform-input.test.d.ts","sourceRoot":"","sources":["../../../src/compute/__tests__/transform-input.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG"}
|