@marifold/service 0.69.0 → 0.71.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WorkspaceRequestContext = exports.WORKSPACE_CONTEXT_HEADER = void 0;
4
+ const node_crypto_1 = require("node:crypto");
5
+ exports.WORKSPACE_CONTEXT_HEADER = 'x-marifold-workspace-context';
6
+ /** Fastify injection creates its own async context. Bind authenticated bridge
7
+ * provenance with an unguessable, process-local ticket instead of trusting a
8
+ * client-supplied device ID or relying on AsyncLocalStorage propagation. */
9
+ class WorkspaceRequestContext {
10
+ tickets = new Map();
11
+ async inject(context, operation) {
12
+ const ticket = (0, node_crypto_1.randomBytes)(32).toString('hex');
13
+ this.tickets.set(ticket, context);
14
+ try {
15
+ return await operation({ [exports.WORKSPACE_CONTEXT_HEADER]: ticket });
16
+ }
17
+ finally {
18
+ this.tickets.delete(ticket);
19
+ }
20
+ }
21
+ resolve(headers) {
22
+ const ticket = headers[exports.WORKSPACE_CONTEXT_HEADER];
23
+ if (ticket === undefined)
24
+ return undefined;
25
+ const context = typeof ticket === 'string' ? this.tickets.get(ticket) : undefined;
26
+ if (!context)
27
+ throw new Error('Invalid workspace request provenance.');
28
+ return context;
29
+ }
30
+ }
31
+ exports.WorkspaceRequestContext = WorkspaceRequestContext;
32
+ //# sourceMappingURL=WorkspaceRequestContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorkspaceRequestContext.js","sourceRoot":"","sources":["../src/WorkspaceRequestContext.ts"],"names":[],"mappings":";;;AAAA,6CAA0C;AAG7B,QAAA,wBAAwB,GAAG,8BAA8B,CAAC;AACvE;;4EAE4E;AAC5E;IACU,OAAO,GAAG,IAAI,GAAG,EAAqC,CAAC;IAC/D,KAAK,CAAC,MAAM,CACV,OAAkC,EAClC,SAA0D;QAE1D,MAAM,MAAM,GAAG,IAAA,yBAAW,EAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC/C,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAClC,IAAI,CAAC;YACH,OAAO,MAAM,SAAS,CAAC,EAAE,CAAC,QAAA,wBAAwB,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;QACjE,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;IACD,OAAO,CAAC,OAAsD;QAC5D,MAAM,MAAM,GAAG,OAAO,CAAC,QAAA,wBAAwB,CAAC,CAAC;QACjD,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO,SAAS,CAAC;QAC3C,MAAM,OAAO,GAAG,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAClF,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;QACvE,OAAO,OAAO,CAAC;IACjB,CAAC;CACF"}
@@ -0,0 +1,8 @@
1
+ import type { WorkspaceRequestContext } from './WorkspaceRequestContext';
2
+ import type { FastifyInstance } from 'fastify';
3
+ import { WorkspaceManager, type RunRegistry, type WorkspaceOperationContext } from '@marifold/core';
4
+ /** Only application resources can traverse the bridge. Device-local configuration
5
+ * and workspace connection management are never forwarded to another workspace. */
6
+ export declare function workspaceApiPath(method: string, raw: string): boolean;
7
+ export declare function registerWorkspaceRoutes(server: FastifyInstance, manager: WorkspaceManager, registry: RunRegistry, contextStore: WorkspaceRequestContext, executor: (operation: string, input: unknown, context: WorkspaceOperationContext) => Promise<unknown>, token?: string, cancelExecution?: (workspaceId: string) => void): void;
8
+ //# sourceMappingURL=WorkspaceRoutes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorkspaceRoutes.d.ts","sourceRoot":"","sources":["../src/WorkspaceRoutes.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAGzE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,EAA+C,gBAAgB,EAAsB,KAAK,WAAW,EAAE,KAAK,yBAAyB,EAAE,MAAM,gBAAgB,CAAC;AAGrK;mFACmF;AACnF,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAYrE;AACD,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,eAAe,EACvB,OAAO,EAAE,gBAAgB,EACzB,QAAQ,EAAE,WAAW,EACrB,YAAY,EAAE,uBAAuB,EACrC,QAAQ,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,yBAAyB,KAAK,OAAO,CAAC,OAAO,CAAC,EACrG,KAAK,CAAC,EAAE,MAAM,EACd,eAAe,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,GAC9C,IAAI,CAqON"}
@@ -0,0 +1,266 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.workspaceApiPath = workspaceApiPath;
37
+ exports.registerWorkspaceRoutes = registerWorkspaceRoutes;
38
+ const Sse_1 = require("./Sse");
39
+ const fs = __importStar(require("node:fs"));
40
+ const node_stream_1 = require("node:stream");
41
+ const core_1 = require("@marifold/core");
42
+ const Validation_1 = require("./Validation");
43
+ /** Only application resources can traverse the bridge. Device-local configuration
44
+ * and workspace connection management are never forwarded to another workspace. */
45
+ function workspaceApiPath(method, raw) {
46
+ if (!['GET', 'POST', 'PUT', 'PATCH', 'DELETE'].includes(method) || raw.length > 2048 || /[\\\x00-\x1f#]/.test(raw))
47
+ return false;
48
+ const pathname = raw.split('?')[0];
49
+ if (/%2f|%5c|%2e/i.test(pathname) || pathname.split('/').some((p) => p === '.' || p === '..'))
50
+ return false;
51
+ return (/^\/v1\/(status|changes|ask|config|providers|models|profiles|sessions|skills|apps|app-instances|runs|tasks|schedules|terminal)(?:\/[A-Za-z0-9_%.-]+)*$/.test(pathname) &&
52
+ !pathname.endsWith('/events') &&
53
+ !(pathname === '/v1/config' && !['GET', 'PATCH'].includes(method)));
54
+ }
55
+ function registerWorkspaceRoutes(server, manager, registry, contextStore, executor, token, cancelExecution) {
56
+ const application = async (operation, input, context) => {
57
+ const body = (0, Validation_1.objectBody)(input);
58
+ if (operation === 'run.events') {
59
+ const runId = (0, Validation_1.requiredString)(body.runId, 'runId');
60
+ const run = registry.require(runId);
61
+ const after = typeof body.after === 'number' && Number.isSafeInteger(body.after) && body.after >= 0 ? body.after : 0;
62
+ const events = [];
63
+ const stop = new AbortController();
64
+ const timer = setTimeout(() => stop.abort(), 1000);
65
+ try {
66
+ for await (const event of registry.events(runId, after, stop.signal)) {
67
+ events.push(event);
68
+ if (events.length >= 128)
69
+ break;
70
+ }
71
+ }
72
+ finally {
73
+ clearTimeout(timer);
74
+ }
75
+ return { run, events };
76
+ }
77
+ if (operation === 'artifact.read') {
78
+ const runId = (0, Validation_1.requiredString)(body.runId, 'runId');
79
+ const artifactId = (0, Validation_1.requiredString)(body.artifactId, 'artifactId');
80
+ const run = registry.require(runId);
81
+ const origin = registry.artifactOrigin(runId, artifactId);
82
+ const e = origin.run.execution;
83
+ if (!run.artifacts?.some((a) => a.id === artifactId))
84
+ throw new Error('Artifact not found.');
85
+ const offset = body.offset;
86
+ if (typeof offset !== 'number' || !Number.isSafeInteger(offset) || offset < 0)
87
+ throw new Error('Invalid artifact offset.');
88
+ const length = (0, core_1.artifactReadLength)(body.length);
89
+ if (e && e.executionDeviceId !== manager.store.get(e.workspaceId).hostDeviceId)
90
+ return manager.execute(e.workspaceId, e.executionDeviceId, 'executor.artifact', {
91
+ runId: origin.run.id,
92
+ artifactId: origin.artifactId,
93
+ offset,
94
+ length,
95
+ });
96
+ const artifact = registry.requireArtifact(runId, artifactId);
97
+ if (offset > artifact.size)
98
+ throw new Error('Invalid artifact offset.');
99
+ const fd = fs.openSync(artifact.path, fs.constants.O_RDONLY | fs.constants.O_NOFOLLOW);
100
+ try {
101
+ const bytes = Buffer.alloc(Math.min(length, artifact.size - offset));
102
+ const n = fs.readSync(fd, bytes, 0, bytes.length, offset);
103
+ return { data: bytes.subarray(0, n).toString('base64'), size: artifact.size };
104
+ }
105
+ finally {
106
+ fs.closeSync(fd);
107
+ }
108
+ }
109
+ if (operation !== 'api')
110
+ throw new Error('Unsupported workspace operation.');
111
+ const method = (0, Validation_1.requiredString)(body.method, 'method');
112
+ const url = (0, Validation_1.requiredString)(body.path, 'path');
113
+ if (!workspaceApiPath(method, url))
114
+ throw new Error('This operation is not available through a workspace bridge.');
115
+ if (url === '/v1/config' && method === 'PATCH') {
116
+ const patch = (0, Validation_1.objectBody)(body.body);
117
+ const key = (0, Validation_1.requiredString)(patch.key, 'key');
118
+ if (!/^(default\.|memory\.|agent\.|web_search\.(enabled|max_results|provider|api_key_env|scrape)$)/.test(key))
119
+ throw new Error('This setting belongs to the host device and must be edited locally.');
120
+ }
121
+ const response = await contextStore.inject(context, (provenance) => server.inject({
122
+ method: method,
123
+ url,
124
+ headers: {
125
+ ...provenance,
126
+ ...(token ? { authorization: `Bearer ${token}` } : {}),
127
+ ...(body.body !== undefined ? { 'content-type': 'application/json' } : {}),
128
+ },
129
+ ...(body.body !== undefined ? { payload: JSON.stringify(body.body) } : {}),
130
+ }));
131
+ const contentType = response.headers['content-type'];
132
+ return {
133
+ status: response.statusCode,
134
+ contentType,
135
+ disposition: response.headers['content-disposition'],
136
+ body: response.rawPayload.toString('base64'),
137
+ };
138
+ };
139
+ manager.start(application, executor);
140
+ server.get('/v1/workspaces', async () => ({
141
+ ok: true,
142
+ workspaces: manager.list(),
143
+ defaultId: manager.store.defaultId(),
144
+ }));
145
+ server.post('/v1/workspaces', async (request) => {
146
+ const b = (0, Validation_1.objectBody)(request.body);
147
+ return {
148
+ ok: true,
149
+ ...(await manager.create((0, Validation_1.requiredString)(b.name, 'name'), (0, Validation_1.requiredString)(b.bridgeUrl, 'bridgeUrl'), (0, Validation_1.requiredString)(b.registrationToken, 'registrationToken'))),
150
+ };
151
+ });
152
+ server.post('/v1/workspaces/join', async (request) => {
153
+ const b = (0, Validation_1.objectBody)(request.body);
154
+ return {
155
+ ok: true,
156
+ workspace: await manager.add((0, Validation_1.requiredString)(b.bridgeUrl, 'bridgeUrl'), (0, Validation_1.requiredString)(b.invitation, 'invitation'), b.executor === true),
157
+ };
158
+ });
159
+ server.put('/v1/workspaces/default', async (request) => {
160
+ const b = (0, Validation_1.objectBody)(request.body);
161
+ manager.store.setDefault((0, Validation_1.requiredString)(b.id, 'id'));
162
+ return { ok: true, defaultId: manager.store.defaultId() };
163
+ });
164
+ server.put('/v1/workspaces/:id/executor', async (request) => {
165
+ const body = (0, Validation_1.objectBody)(request.body);
166
+ if (typeof body.enabled !== 'boolean')
167
+ throw new Error('enabled must be a boolean.');
168
+ const id = manager.store.get(request.params.id).id;
169
+ if (!body.enabled)
170
+ cancelExecution?.(id);
171
+ await manager.setExecutor(id, body.enabled);
172
+ return { ok: true, enabled: body.enabled };
173
+ });
174
+ server.delete('/v1/workspaces/:id', async (request) => {
175
+ const id = manager.store.get(request.params.id).id;
176
+ cancelExecution?.(id);
177
+ await manager.remove(id);
178
+ return { ok: true };
179
+ });
180
+ server.post('/v1/workspaces/:id/manage/:operation', async (request) => {
181
+ if (!['rename', 'invite', 'devices', 'revoke'].includes(request.params.operation))
182
+ throw new Error('Unknown workspace operation.');
183
+ return {
184
+ ok: true,
185
+ ...(await manager.request(request.params.id, request.params.operation, request.body ?? {})),
186
+ };
187
+ });
188
+ server.get('/v1/workspaces/:id/run-events/:runId', async (request) => ({
189
+ ok: true,
190
+ ...(await manager.request(request.params.id, 'run.events', {
191
+ runId: request.params.runId,
192
+ after: Number(request.query.after ?? 0),
193
+ })),
194
+ }));
195
+ server.get('/v1/workspaces/:id/api/v1/runs/:runId/events', async (request, reply) => {
196
+ let after = Number(request.headers['last-event-id'] ?? request.query.after ?? 0);
197
+ if (!Number.isSafeInteger(after) || after < 0)
198
+ throw new Error('Invalid event cursor.');
199
+ const poll = () => manager.request(request.params.id, 'run.events', { runId: request.params.runId, after });
200
+ let batch = await poll();
201
+ let closed = false;
202
+ reply.hijack();
203
+ reply.raw.on('close', () => {
204
+ closed = true;
205
+ });
206
+ reply.raw.writeHead(200, Sse_1.SSE_HEADERS);
207
+ const stop = (0, Sse_1.startSseHeartbeat)(reply);
208
+ try {
209
+ while (!closed) {
210
+ for (const { seq, event } of batch.events) {
211
+ if (seq <= after)
212
+ continue;
213
+ (0, Sse_1.writeSse)(reply, event.type, event, seq);
214
+ after = seq;
215
+ }
216
+ if (batch.run.finishedAt && after >= batch.run.eventCount)
217
+ break;
218
+ batch = await poll();
219
+ }
220
+ }
221
+ catch {
222
+ /* Closing preserves the client's last sequence for reconnect. */
223
+ }
224
+ finally {
225
+ stop();
226
+ if (!closed)
227
+ reply.raw.end();
228
+ }
229
+ });
230
+ server.all('/v1/workspaces/:id/api/*', async (request, reply) => {
231
+ const suffix = request.url.slice(request.url.indexOf('/api/') + 4);
232
+ if (!workspaceApiPath(request.method, suffix))
233
+ throw new Error('Unsupported workspace application route.');
234
+ const artifact = /^\/v1\/runs\/([^/]+)\/artifacts\/([^/?]+)$/.exec(suffix);
235
+ if (request.method === 'GET' && artifact) {
236
+ const response = (await manager.request(request.params.id, 'api', {
237
+ method: 'GET',
238
+ path: `/v1/runs/${artifact[1]}`,
239
+ }));
240
+ const run = JSON.parse(Buffer.from(response.body, 'base64').toString('utf8')).run;
241
+ const item = run?.artifacts?.find((a) => a.id === artifact[2]);
242
+ if (!item)
243
+ return reply
244
+ .code(404)
245
+ .send({ ok: false, error: { code: 'ARTIFACT_NOT_FOUND', message: 'Artifact not found.' } });
246
+ reply
247
+ .type(item.mediaType)
248
+ .header('content-disposition', `attachment; filename*=UTF-8''${encodeURIComponent(item.name)}`);
249
+ return reply.send(node_stream_1.Readable.from((0, core_1.workspaceArtifactStream)(item.size, (offset, length) => manager.request(request.params.id, 'artifact.read', {
250
+ runId: artifact[1],
251
+ artifactId: artifact[2],
252
+ offset,
253
+ length,
254
+ }))));
255
+ }
256
+ const result = (await manager.request(request.params.id, 'api', { method: request.method, path: suffix, ...(request.body !== undefined ? { body: request.body } : {}) }, typeof request.headers['idempotency-key'] === 'string' ? request.headers['idempotency-key'] : undefined));
257
+ reply.code(result.status);
258
+ if (result.disposition)
259
+ reply.header('content-disposition', result.disposition);
260
+ if (result.contentType)
261
+ reply.type(result.contentType);
262
+ return reply.send(Buffer.from(result.body, 'base64'));
263
+ });
264
+ server.addHook('onClose', async () => manager.close());
265
+ }
266
+ //# sourceMappingURL=WorkspaceRoutes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorkspaceRoutes.js","sourceRoot":"","sources":["../src/WorkspaceRoutes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { FastifyInstance } from 'fastify';
2
+ import type { MarifoldRuntime } from '@marifold/core';
3
+ /** Schedule configuration is shared; scheduled execution always stays on the host. */
4
+ export declare function registerWorkspaceScheduleRoutes(server: FastifyInstance, runtime: MarifoldRuntime): void;
5
+ //# sourceMappingURL=WorkspaceScheduleRoutes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorkspaceScheduleRoutes.d.ts","sourceRoot":"","sources":["../src/WorkspaceScheduleRoutes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAGtD,sFAAsF;AACtF,wBAAgB,+BAA+B,CAAC,MAAM,EAAE,eAAe,EAAE,OAAO,EAAE,eAAe,GAAG,IAAI,CAmCvG"}
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.registerWorkspaceScheduleRoutes = registerWorkspaceScheduleRoutes;
4
+ const Validation_1 = require("./Validation");
5
+ /** Schedule configuration is shared; scheduled execution always stays on the host. */
6
+ function registerWorkspaceScheduleRoutes(server, runtime) {
7
+ server.post('/v1/schedules', async (request) => {
8
+ const body = (0, Validation_1.objectBody)(request.body);
9
+ return {
10
+ ok: true,
11
+ schedule: runtime.createSchedule({
12
+ name: (0, Validation_1.requiredString)(body.name, 'name'),
13
+ objective: (0, Validation_1.requiredString)(body.objective, 'objective'),
14
+ cron: (0, Validation_1.requiredString)(body.cron, 'cron'),
15
+ ...(0, Validation_1.optionalStringField)('profile', body.profile),
16
+ ...(0, Validation_1.optionalBooleanField)('enabled', body.enabled),
17
+ }),
18
+ };
19
+ });
20
+ server.patch('/v1/schedules/:id', async (request) => {
21
+ const body = (0, Validation_1.objectBody)(request.body);
22
+ return {
23
+ ok: true,
24
+ schedule: runtime.updateSchedule(request.params.id, {
25
+ ...(0, Validation_1.optionalStringField)('name', body.name),
26
+ ...(0, Validation_1.optionalStringField)('objective', body.objective),
27
+ ...(0, Validation_1.optionalStringField)('cron', body.cron),
28
+ ...(0, Validation_1.optionalStringField)('profile', body.profile),
29
+ ...(0, Validation_1.optionalBooleanField)('enabled', body.enabled),
30
+ }),
31
+ };
32
+ });
33
+ server.delete('/v1/schedules/:id', async (request) => ({
34
+ ok: true,
35
+ deleted: runtime.deleteSchedule(request.params.id),
36
+ }));
37
+ server.post('/v1/schedules/:id/run', async (request) => ({
38
+ ok: true,
39
+ ...(await runtime.runScheduleUnattended(request.params.id)),
40
+ }));
41
+ }
42
+ //# sourceMappingURL=WorkspaceScheduleRoutes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorkspaceScheduleRoutes.js","sourceRoot":"","sources":["../src/WorkspaceScheduleRoutes.ts"],"names":[],"mappings":";;;AAEA,6CAAqG;AAErG,sFAAsF;AACtF,yCAAgD,MAAuB,EAAE,OAAwB;IAC/F,MAAM,CAAC,IAAI,CAAC,eAAe,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QAC7C,MAAM,IAAI,GAAG,IAAA,uBAAU,EAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACtC,OAAO;YACL,EAAE,EAAE,IAAI;YACR,QAAQ,EAAE,OAAO,CAAC,cAAc,CAAC;gBAC/B,IAAI,EAAE,IAAA,2BAAc,EAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC;gBACvC,SAAS,EAAE,IAAA,2BAAc,EAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC;gBACtD,IAAI,EAAE,IAAA,2BAAc,EAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC;gBACvC,GAAG,IAAA,gCAAmB,EAAC,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC;gBAC/C,GAAG,IAAA,iCAAoB,EAAC,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC;aACjD,CAAC;SACH,CAAC;IACJ,CAAC,CAAC,CAAC;IACH,MAAM,CAAC,KAAK,CAA6B,mBAAmB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QAC9E,MAAM,IAAI,GAAG,IAAA,uBAAU,EAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACtC,OAAO;YACL,EAAE,EAAE,IAAI;YACR,QAAQ,EAAE,OAAO,CAAC,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE;gBAClD,GAAG,IAAA,gCAAmB,EAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC;gBACzC,GAAG,IAAA,gCAAmB,EAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnD,GAAG,IAAA,gCAAmB,EAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC;gBACzC,GAAG,IAAA,gCAAmB,EAAC,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC;gBAC/C,GAAG,IAAA,iCAAoB,EAAC,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC;aACjD,CAAC;SACH,CAAC;IACJ,CAAC,CAAC,CAAC;IACH,MAAM,CAAC,MAAM,CAA6B,mBAAmB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;QACjF,EAAE,EAAE,IAAI;QACR,OAAO,EAAE,OAAO,CAAC,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;KACnD,CAAC,CAAC,CAAC;IACJ,MAAM,CAAC,IAAI,CAA6B,uBAAuB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;QACnF,EAAE,EAAE,IAAI;QACR,GAAG,CAAC,MAAM,OAAO,CAAC,qBAAqB,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;KAC5D,CAAC,CAAC,CAAC;AACN,CAAC"}