@hy-sde-org/dsh-code-runtime-kernels 0.1.1-rc.2 → 0.1.5-rc.1
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/README.md +42 -3
- package/README.zh.md +39 -3
- package/dist/core/kernel.d.ts +55 -2
- package/dist/core/kernel.d.ts.map +1 -1
- package/dist/core/kernel.js +83 -8
- package/dist/core/kernel.js.map +1 -1
- package/dist/core/protocol.d.ts +17 -0
- package/dist/core/protocol.d.ts.map +1 -1
- package/dist/core/session.d.ts +15 -0
- package/dist/core/session.d.ts.map +1 -1
- package/dist/core/session.js +86 -11
- package/dist/core/session.js.map +1 -1
- package/dist/index.d.ts +67 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +198 -38
- package/dist/index.js.map +1 -1
- package/dist/nodejs/runner.d.ts +1 -1
- package/dist/nodejs/runner.js +168 -3
- package/dist/nodejs/runner.js.map +1 -1
- package/dist/python/runner.d.ts +1 -1
- package/dist/python/runner.d.ts.map +1 -1
- package/dist/python/runner.js +366 -1
- package/dist/python/runner.js.map +1 -1
- package/package.json +29 -25
package/dist/core/session.js
CHANGED
|
@@ -8,6 +8,21 @@
|
|
|
8
8
|
* per-session promise chain.
|
|
9
9
|
* @module @hy-sde-org/dsh-code-runtime-kernels/src/core/session
|
|
10
10
|
*/
|
|
11
|
+
import { randomUUID } from 'node:crypto';
|
|
12
|
+
import { rmSync } from 'node:fs';
|
|
13
|
+
/**
|
|
14
|
+
* Thrown when a fresh kernel's preload (the configured "toolbox") failed to
|
|
15
|
+
* settle; carries the preload run's result so the user's run surfaces a real
|
|
16
|
+
* exception instead of a bare startup failure.
|
|
17
|
+
*/
|
|
18
|
+
class KernelPreloadError extends Error {
|
|
19
|
+
result;
|
|
20
|
+
constructor(result) {
|
|
21
|
+
super(result.message || 'kernel preload failed');
|
|
22
|
+
this.result = result;
|
|
23
|
+
this.name = 'KernelPreloadError';
|
|
24
|
+
}
|
|
25
|
+
}
|
|
11
26
|
/**
|
|
12
27
|
* Registers sessions and schedules every run onto its session's serialization
|
|
13
28
|
* tail. A session kernel that died mid-run (or was killed settling a prior
|
|
@@ -85,6 +100,15 @@ export class SessionRegistry {
|
|
|
85
100
|
}, this.#config.sessionIdleMs);
|
|
86
101
|
session.idleTimer.unref();
|
|
87
102
|
}
|
|
103
|
+
/**
|
|
104
|
+
* Throw when the registry is already disposed. Reads the field fresh, so a
|
|
105
|
+
* check after an await point cannot be narrowed away by an earlier one.
|
|
106
|
+
*/
|
|
107
|
+
#assertNotDisposed() {
|
|
108
|
+
if (this.#disposed) {
|
|
109
|
+
throw new Error(`${this.#config.label} session registry disposed while acquiring kernel`);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
88
112
|
async #acquireKernel(sessionId, session) {
|
|
89
113
|
if (session.kernel !== null && session.kernel.isAlive())
|
|
90
114
|
return session.kernel;
|
|
@@ -93,47 +117,81 @@ export class SessionRegistry {
|
|
|
93
117
|
await previous.shutdown().catch(() => { });
|
|
94
118
|
session.kernel = null;
|
|
95
119
|
}
|
|
96
|
-
|
|
97
|
-
throw new Error(`${this.#config.label} session registry disposed while acquiring kernel`);
|
|
98
|
-
}
|
|
120
|
+
this.#assertNotDisposed();
|
|
99
121
|
if (this.#sessions.get(sessionId) !== session) {
|
|
100
122
|
throw new Error(`${this.#config.label} session invalidated while acquiring kernel`);
|
|
101
123
|
}
|
|
102
124
|
const kernel = await this.#config.start();
|
|
103
|
-
// oxlint-disable-next-line typescript/no-unnecessary-condition -- set by disposeAll elsewhere
|
|
104
125
|
if (this.#disposed) {
|
|
105
126
|
await kernel.shutdown().catch(() => { });
|
|
106
|
-
|
|
127
|
+
this.#assertNotDisposed();
|
|
107
128
|
}
|
|
108
129
|
if (this.#sessions.get(sessionId) !== session) {
|
|
109
130
|
await kernel.shutdown().catch(() => { });
|
|
110
131
|
throw new Error(`${this.#config.label} session invalidated while acquiring kernel`);
|
|
111
132
|
}
|
|
112
133
|
session.kernel = kernel;
|
|
134
|
+
const preload = this.#config.preload?.();
|
|
135
|
+
if (preload !== undefined && preload.length > 0) {
|
|
136
|
+
// Hidden first cell: no snapshot spec, so the restore (and its notice)
|
|
137
|
+
// still belongs to the user's first real exec. A failed preload must
|
|
138
|
+
// not leave a half-configured kernel behind; fail the run instead.
|
|
139
|
+
const prepared = await kernel.execute(`preload-${randomUUID()}`, preload, [], {});
|
|
140
|
+
if (prepared.status !== 'ok' || prepared.killed || prepared.cancelled) {
|
|
141
|
+
await kernel.shutdown().catch(() => { });
|
|
142
|
+
session.kernel = null;
|
|
143
|
+
throw new KernelPreloadError(prepared);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
113
146
|
return kernel;
|
|
114
147
|
}
|
|
115
148
|
async #runOnSession(session, sessionId, code, bindings, options) {
|
|
116
149
|
if (options.reset === true) {
|
|
117
150
|
// Reset first, then acquire: prior kernel state is discarded and its
|
|
118
|
-
// shutdown completes before the fresh kernel answers this run.
|
|
151
|
+
// shutdown completes before the fresh kernel answers this run. The
|
|
152
|
+
// snapshot is deleted between the two, so the fresh kernel must not
|
|
153
|
+
// restore the state the reset just discarded.
|
|
119
154
|
const previous = session.kernel;
|
|
120
155
|
if (previous !== null) {
|
|
121
156
|
session.kernel = null;
|
|
122
157
|
clearTimeout(session.idleTimer);
|
|
123
158
|
await previous.shutdown().catch(() => { });
|
|
124
159
|
}
|
|
160
|
+
this.#deleteSnapshot(sessionId);
|
|
161
|
+
}
|
|
162
|
+
let kernel;
|
|
163
|
+
try {
|
|
164
|
+
kernel = await this.#acquireKernel(sessionId, session);
|
|
165
|
+
}
|
|
166
|
+
catch (error) {
|
|
167
|
+
if (error instanceof KernelPreloadError)
|
|
168
|
+
return error.result;
|
|
169
|
+
throw error;
|
|
125
170
|
}
|
|
126
|
-
let kernel = await this.#acquireKernel(sessionId, session);
|
|
127
171
|
const first = await this.#executeOnce(kernel, sessionId, code, bindings, options);
|
|
128
172
|
// A kernel that died or was killed settling the run is replaced once and
|
|
129
|
-
// the run retried; otherwise return what we got.
|
|
130
|
-
|
|
131
|
-
|
|
173
|
+
// the run retried; otherwise return what we got. A result that came back
|
|
174
|
+
// `cancelled` with the caller still live and the kernel no longer alive is
|
|
175
|
+
// the same dead-kernel case: the runner died settling the cancellation, so
|
|
176
|
+
// a fresh kernel gets one retry (mirrors omp's dead-kernel recovery in
|
|
177
|
+
// `kernel-session-registry.executeOnSession`).
|
|
178
|
+
if (session !== this.#sessions.get(sessionId))
|
|
179
|
+
return first;
|
|
180
|
+
const dead = !kernel.isAlive();
|
|
181
|
+
const cancelledButAlive = first.cancelled && !(options.signal?.aborted === true) && dead;
|
|
182
|
+
if (!first.killed && !cancelledButAlive)
|
|
132
183
|
return first;
|
|
133
184
|
await kernel.shutdown().catch(() => { });
|
|
134
185
|
if (session !== this.#sessions.get(sessionId))
|
|
135
186
|
return first;
|
|
136
|
-
|
|
187
|
+
try {
|
|
188
|
+
kernel = await this.#acquireKernel(sessionId, session);
|
|
189
|
+
}
|
|
190
|
+
catch (error) {
|
|
191
|
+
if (error instanceof KernelPreloadError)
|
|
192
|
+
return error.result;
|
|
193
|
+
throw error;
|
|
194
|
+
}
|
|
137
195
|
const second = await this.#executeOnce(kernel, sessionId, code, bindings, options);
|
|
138
196
|
if (second.killed) {
|
|
139
197
|
// Give up restoring state: report the second outcome with the first's
|
|
@@ -143,11 +201,28 @@ export class SessionRegistry {
|
|
|
143
201
|
return second;
|
|
144
202
|
}
|
|
145
203
|
#executeOnce(kernel, sessionId, code, bindings, options) {
|
|
204
|
+
const snapshot = this.#config.snapshot?.(sessionId);
|
|
146
205
|
return kernel.execute(sessionId, code, bindings, {
|
|
147
206
|
...options.signal !== undefined ? { signal: options.signal } : {},
|
|
148
207
|
...options.cwd !== undefined ? { cwd: options.cwd } : {},
|
|
149
208
|
...options.env !== undefined ? { env: options.env } : {},
|
|
209
|
+
...snapshot !== undefined ? { snapshot } : {},
|
|
150
210
|
});
|
|
151
211
|
}
|
|
212
|
+
/** Best-effort delete of one session's snapshot file (ignore missing/denied). */
|
|
213
|
+
#deleteSnapshot(sessionId) {
|
|
214
|
+
const spec = this.#config.snapshot?.(sessionId);
|
|
215
|
+
if (spec === undefined)
|
|
216
|
+
return;
|
|
217
|
+
try {
|
|
218
|
+
rmSync(spec.path, { force: true });
|
|
219
|
+
}
|
|
220
|
+
catch {
|
|
221
|
+
// A failed delete leaves a stale snapshot: the kernel will restore it,
|
|
222
|
+
// which is exactly the surprising outcome reset must prevent. Report by
|
|
223
|
+
// name instead of certifying state was discarded.
|
|
224
|
+
console.warn(`dsh-code-runtime-kernels: could not remove snapshot ${JSON.stringify(spec.path)} for session ${JSON.stringify(sessionId)}`);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
152
227
|
}
|
|
153
228
|
//# sourceMappingURL=session.js.map
|
package/dist/core/session.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/core/session.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/core/session.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -14,10 +14,11 @@ import { Context } from '@deepseek-ai/cordis';
|
|
|
14
14
|
import z from '@deepseek-ai/schemastery';
|
|
15
15
|
import type { CodeBindingNamespace, CodeJsonValue, CodeRunResult } from '@deepseek-ai/dsh-code-runtime';
|
|
16
16
|
import type { TerminalCallView, TerminalResultView, ToolResult } from '@deepseek-ai/dsh-tools';
|
|
17
|
+
import type { KernelSandboxProvider } from './core/kernel.ts';
|
|
17
18
|
/** Cordis plugin name for loader diagnostics. */
|
|
18
19
|
export declare const name = "code-runtime-kernels";
|
|
19
20
|
/** Services this plugin requires: the tool registry and the system-prompt builder. */
|
|
20
|
-
export declare const inject:
|
|
21
|
+
export declare const inject: string[];
|
|
21
22
|
/**
|
|
22
23
|
* Plugin config: which languages are enabled, and every execution cap
|
|
23
24
|
* (changeable from any cordis.yml that mounts this plugin).
|
|
@@ -27,6 +28,12 @@ export interface Config {
|
|
|
27
28
|
languages?: ('python' | 'typescript')[];
|
|
28
29
|
/** Explicit python executable. Defaults to `python3` on PATH (fails loud at first spawn when absent). */
|
|
29
30
|
pythonPath?: string;
|
|
31
|
+
/**
|
|
32
|
+
* Python execution semantics: `stdlib` (default, self-contained runner) or
|
|
33
|
+
* `ipykernel` (real IPython shell: magics, `!cmd`, display — the interpreter
|
|
34
|
+
* must have IPython/ipykernel installed; the runner fails loud otherwise).
|
|
35
|
+
*/
|
|
36
|
+
pythonImpl?: 'stdlib' | 'ipykernel';
|
|
30
37
|
/** Explicit node executable. Defaults to `node` on PATH (fails loud at first spawn when absent). */
|
|
31
38
|
nodePath?: string;
|
|
32
39
|
/** Cooperative tool-call timeout budget (ms) for `run_kernel_code` (default 30000). */
|
|
@@ -35,6 +42,8 @@ export interface Config {
|
|
|
35
42
|
maxWallMs?: number;
|
|
36
43
|
/** Hard cap on combined serialized log-, completion-, and failure-message bytes. */
|
|
37
44
|
maxOutputBytes?: number;
|
|
45
|
+
/** Per-line output cap (chars): a longer line is clipped with a `…` marker. */
|
|
46
|
+
maxOutputLineChars?: number;
|
|
38
47
|
/** Reap a session idle for at least this many ms; `0` disables reaping. */
|
|
39
48
|
sessionIdleMs?: number;
|
|
40
49
|
/** Wait after SIGINT before SIGTERM, then the same again before SIGKILL. */
|
|
@@ -43,6 +52,38 @@ export interface Config {
|
|
|
43
52
|
startupTimeoutMs?: number;
|
|
44
53
|
/** Grace period for the kernel to exit after an `exit` frame. */
|
|
45
54
|
shutdownGraceMs?: number;
|
|
55
|
+
/**
|
|
56
|
+
* Namespace persistence: each successful run snapshots the session's kernel
|
|
57
|
+
* namespace to disk, and a fresh kernel for that session restores it once
|
|
58
|
+
* (so state survives kernel death and a full plugin restart). `false`
|
|
59
|
+
* disables; `snapshotDir` sets the root (default `~/.dsh/code-runtime-kernels/state`,
|
|
60
|
+
* language + session-hash subdirectories).
|
|
61
|
+
*/
|
|
62
|
+
snapshot?: boolean;
|
|
63
|
+
/** Root directory for session snapshots (ignored when `snapshot` is false). */
|
|
64
|
+
snapshotDir?: string;
|
|
65
|
+
/** Combined byte cap for one snapshot file; entries past it are skipped by name. */
|
|
66
|
+
snapshotMaxBytes?: number;
|
|
67
|
+
/** Per-entry byte cap; an entry larger than this is skipped and named. */
|
|
68
|
+
snapshotMaxEntryBytes?: number;
|
|
69
|
+
/**
|
|
70
|
+
* Session "toolbox": one preload source per language. It runs as a hidden
|
|
71
|
+
* first cell of every fresh session kernel (before the snapshot restore,
|
|
72
|
+
* so restored names shadow same-named helpers; user state wins). A preload
|
|
73
|
+
* failure fails the triggering run like an exception.
|
|
74
|
+
*/
|
|
75
|
+
preload?: {
|
|
76
|
+
python?: string;
|
|
77
|
+
typescript?: string;
|
|
78
|
+
};
|
|
79
|
+
/** Confine kernel subprocesses through the sandbox seam (default false = unconfined). */
|
|
80
|
+
sandboxConfinement?: boolean;
|
|
81
|
+
/** The confine capability (see `SandboxProvider` in `@deepseek-ai/dsh-sandbox`); required when `sandboxConfinement` is true. */
|
|
82
|
+
sandboxProvider?: KernelSandboxProvider;
|
|
83
|
+
/** Writable root under `workspace-write` confinement (defaults to the process cwd). */
|
|
84
|
+
sandboxWorkspaceRoot?: string;
|
|
85
|
+
/** File-effect mode for kernels under confinement (default `workspace-write`). */
|
|
86
|
+
sandboxMode?: 'read-only' | 'workspace-write';
|
|
46
87
|
}
|
|
47
88
|
/** Schemastery schema for {@link Config}: defaults filled at load time. */
|
|
48
89
|
export declare const Config: z<Config>;
|
|
@@ -50,7 +91,11 @@ export declare const Config: z<Config>;
|
|
|
50
91
|
export interface KernelRunRequest {
|
|
51
92
|
/** Which kernel to run the program in (`'python'` presents as `language: python`, `'typescript'` as the SDK). */
|
|
52
93
|
language: 'python' | 'typescript';
|
|
53
|
-
/**
|
|
94
|
+
/**
|
|
95
|
+
* The program source. Typescript runs as an async-function body (top-level
|
|
96
|
+
* `await`/`return` work); python runs as a module (top-level `await` works,
|
|
97
|
+
* the last expression is the value).
|
|
98
|
+
*/
|
|
54
99
|
code: string;
|
|
55
100
|
/** Optional persistent-kernel identity: runs sharing one keep kernel state. */
|
|
56
101
|
sessionId?: string;
|
|
@@ -88,13 +133,31 @@ export declare class KernelManager {
|
|
|
88
133
|
* disposed manager, an invalid binding namespace). With a non-empty
|
|
89
134
|
* `sessionId` the program runs in that session's persistent kernel and
|
|
90
135
|
* `executionCount` is reported; `reset: true` discards prior state first.
|
|
136
|
+
*
|
|
137
|
+
* `onOutputLimit` is a best-effort spill hook called only when the run's
|
|
138
|
+
* output crosses `maxOutputBytes`: it receives the FULL captured program
|
|
139
|
+
* output (the same bytes that just overflowed the result budget) and may
|
|
140
|
+
* persist them somewhere recoverable. Returning a retrieval hint rewrites
|
|
141
|
+
* the `output-limit` message so the caller can recover the dropped tail;
|
|
142
|
+
* returning `undefined` (no backend, no owner, storage failure) keeps the
|
|
143
|
+
* truncated result untouched. The manager never awaits this beyond a
|
|
144
|
+
* best-effort `catch` — spill failure cannot fail the program.
|
|
145
|
+
*/
|
|
146
|
+
run(request: KernelRunRequest, onOutputLimit?: (content: string) => Promise<string | undefined>): Promise<KernelRunResult>;
|
|
147
|
+
/**
|
|
148
|
+
* Map a kernel outcome onto the failure taxonomy through the output ledger.
|
|
149
|
+
* Budget expiry owns a run that hit the wall clock (whether or not the
|
|
150
|
+
* kernel survived to acknowledge it); everything else interrupted is an
|
|
151
|
+
* abort; a died kernel is an abort unless the budget already owns the run.
|
|
91
152
|
*/
|
|
92
|
-
run(request: KernelRunRequest): Promise<KernelRunResult>;
|
|
93
153
|
/**
|
|
94
154
|
* Map a kernel outcome onto the failure taxonomy through the output ledger.
|
|
95
155
|
* Budget expiry owns a run that hit the wall clock (whether or not the
|
|
96
156
|
* kernel survived to acknowledge it); everything else interrupted is an
|
|
97
157
|
* abort; a died kernel is an abort unless the budget already owns the run.
|
|
158
|
+
*
|
|
159
|
+
* An `output-limit` outcome additionally consults `onOutputLimit` to spill
|
|
160
|
+
* the full captured output, best-effort (never awaited past a catch).
|
|
98
161
|
*/
|
|
99
162
|
private finalize;
|
|
100
163
|
/** Reject malformed binding globals or typed-error declarations as contract misuse. */
|
|
@@ -131,5 +194,5 @@ export declare function presentRunKernelCodeResult(_args: RunKernelCodeArgs, res
|
|
|
131
194
|
* the plugin), and register `run_kernel_code` against `ctx.tools` so a plain
|
|
132
195
|
* upstream harness exposes the persistent kernels with zero source changes.
|
|
133
196
|
*/
|
|
134
|
-
export declare function apply(ctx: Context, config: Config):
|
|
197
|
+
export declare function apply(ctx: Context, config: Config): void;
|
|
135
198
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAMH,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAE7C,OAAO,CAAC,MAAM,0BAA0B,CAAA;AAOxC,OAAO,KAAK,EACV,oBAAoB,EACpB,aAAa,EAEb,aAAa,EACd,MAAM,+BAA+B,CAAA;AAEtC,OAAO,KAAK,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AAG9F,OAAO,KAAK,EAAoB,qBAAqB,EAAE,MAAM,kBAAkB,CAAA;AAK/E,iDAAiD;AACjD,eAAO,MAAM,IAAI,yBAAyB,CAAA;AAE1C,sFAAsF;AACtF,eAAO,MAAM,MAAM,UAA4B,CAAA;AAE/C;;;GAGG;AACH,MAAM,WAAW,MAAM;IACrB,iFAAiF;IACjF,SAAS,CAAC,EAAE,CAAC,QAAQ,GAAG,YAAY,CAAC,EAAE,CAAA;IACvC,yGAAyG;IACzG,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB;;;;OAIG;IACH,UAAU,CAAC,EAAE,QAAQ,GAAG,WAAW,CAAA;IACnC,oGAAoG;IACpG,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,uFAAuF;IACvF,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,+FAA+F;IAC/F,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,oFAAoF;IACpF,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,+EAA+E;IAC/E,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,2EAA2E;IAC3E,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,4EAA4E;IAC5E,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAC9B,0EAA0E;IAC1E,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,iEAAiE;IACjE,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB;;;;;;OAMG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,+EAA+E;IAC/E,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,oFAAoF;IACpF,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,0EAA0E;IAC1E,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAC9B;;;;;OAKG;IACH,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IAClD,yFAAyF;IACzF,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B,gIAAgI;IAChI,eAAe,CAAC,EAAE,qBAAqB,CAAA;IACvC,uFAAuF;IACvF,oBAAoB,CAAC,EAAE,MAAM,CAAA;IAC7B,kFAAkF;IAClF,WAAW,CAAC,EAAE,WAAW,GAAG,iBAAiB,CAAA;CAC9C;AAUD,2EAA2E;AAC3E,eAAO,MAAM,MAAM,EAAE,CAAC,CAAC,MAAM,CAsB3B,CAAA;AA0BF,kHAAkH;AAClH,MAAM,WAAW,gBAAgB;IAC/B,iHAAiH;IACjH,QAAQ,EAAE,QAAQ,GAAG,YAAY,CAAA;IACjC;;;;OAIG;IACH,IAAI,EAAE,MAAM,CAAA;IACZ,+EAA+E;IAC/E,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,gEAAgE;IAChE,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,mFAAmF;IACnF,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB,uFAAuF;IACvF,QAAQ,CAAC,EAAE,oBAAoB,EAAE,CAAA;CAClC;AAED;;;;;GAKG;AACH,MAAM,MAAM,eAAe,GAAG,aAAa,GAAG;IAAE,cAAc,CAAC,EAAE,MAAM,CAAA;CAAE,CAAA;AA2EzE;;;;;;GAMG;AACH,qBAAa,aAAa;;gBAOZ,MAAM,EAAE,MAAM;IA2G1B,sEAAsE;IAChE,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAK/B;;;;;;;;;;;;;;;OAeG;IACG,GAAG,CACP,OAAO,EAAE,gBAAgB,EACzB,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,GAC/D,OAAO,CAAC,eAAe,CAAC;IAoG3B;;;;;OAKG;IACH;;;;;;;;OAQG;YACW,QAAQ;IA6DtB,uFAAuF;IACvF,OAAO,CAAC,gBAAgB;CA6BzB;AAcD,0EAA0E;AAC1E,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,QAAQ,GAAG,YAAY,CAAA;IACjC,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB;AAED,iGAAiG;AACjG,MAAM,MAAM,kBAAkB,GAAG,eAAe,CAAA;AAiBhD,qIAAqI;AACrI,MAAM,MAAM,iBAAiB,GAAG;IAC9B,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,aAAa,CAAA;IACrB,KAAK,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAA;IACzC,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,IAAI,EAAE,MAAM,EAAE,CAAA;CACf,CAAA;AAED,gFAAgF;AAChF,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,kBAAkB,GAAG,iBAAiB,CAU9E;AAED,oGAAoG;AACpG,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,iBAAiB,GAAG,gBAAgB,CAMlF;AAED,mGAAmG;AACnG,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,iBAAiB,EAAE,MAAM,EAAE,UAAU,GAAG,kBAAkB,GAAG,SAAS,CAavH;AAED;;;;GAIG;AACH,wBAAgB,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAyFxD"}
|