@ai-sdk/code-mode 1.0.77 → 1.0.80
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/dist/approval-continuation.js +48 -74
- package/dist/approval-continuation.js.map +1 -1
- package/dist/approval.js +12 -23
- package/dist/approval.js.map +1 -1
- package/dist/code-mode-tool.js +39 -51
- package/dist/code-mode-tool.js.map +1 -1
- package/dist/continuation-capability.js +74 -105
- package/dist/continuation-capability.js.map +1 -1
- package/dist/direct-tool-call.js +9 -3
- package/dist/direct-tool-call.js.map +1 -1
- package/dist/errors.js +109 -96
- package/dist/errors.js.map +1 -1
- package/dist/host-interrupt.js +7 -12
- package/dist/host-interrupt.js.map +1 -1
- package/dist/index.d.ts +172 -163
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -61
- package/dist/interrupt-continuation.js +54 -90
- package/dist/interrupt-continuation.js.map +1 -1
- package/dist/run-code-mode.js +292 -494
- package/dist/run-code-mode.js.map +1 -1
- package/dist/tool-invocation.js +98 -176
- package/dist/tool-invocation.js.map +1 -1
- package/dist/tool-prompt.js +254 -392
- package/dist/tool-prompt.js.map +1 -1
- package/dist/types.js +1 -1
- package/dist/utils/serialization.js +23 -39
- package/dist/utils/serialization.js.map +1 -1
- package/package.json +6 -6
- package/dist/index.js.map +0 -1
- package/dist/types.js.map +0 -1
|
@@ -1,108 +1,72 @@
|
|
|
1
|
-
import {
|
|
2
|
-
hasValidCodeModeContinuationCapability,
|
|
3
|
-
verifyCodeModeContinuation
|
|
4
|
-
} from "./continuation-capability.js";
|
|
5
1
|
import { CodeModeProtocolError } from "./errors.js";
|
|
2
|
+
import { hasValidCodeModeContinuationCapability, verifyCodeModeContinuation } from "./continuation-capability.js";
|
|
6
3
|
import { runCodeMode } from "./run-code-mode.js";
|
|
4
|
+
//#region src/interrupt-continuation.ts
|
|
7
5
|
function isCodeModeInterrupt(value, continuationSecurity = {}) {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
} catch {
|
|
16
|
-
return false;
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
return false;
|
|
6
|
+
if (isRecord(value) && value.type === "code-mode-interrupt" && typeof value.interruptId === "string" && typeof value.toolCallId === "string" && typeof value.toolName === "string" && typeof value.outerToolCallId === "string" && isRecord(value.payload) && typeof value.payload.kind === "string" && isRecord(value.continuation) && hasValidCodeModeContinuationCapability(value.continuation, continuationSecurity)) try {
|
|
7
|
+
assertInterruptMatchesLedger(value);
|
|
8
|
+
return true;
|
|
9
|
+
} catch {
|
|
10
|
+
return false;
|
|
11
|
+
}
|
|
12
|
+
return false;
|
|
20
13
|
}
|
|
21
|
-
async function continueCodeModeInterrupt({
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
};
|
|
37
|
-
return await runCodeMode({
|
|
38
|
-
js: interrupt.continuation.js,
|
|
39
|
-
tools,
|
|
40
|
-
options,
|
|
41
|
-
continuation: interrupt.continuation,
|
|
42
|
-
interruptResolution,
|
|
43
|
-
...toolExecutionOptions !== void 0 ? { toolExecutionOptions } : {}
|
|
44
|
-
});
|
|
14
|
+
async function continueCodeModeInterrupt({ interrupt, resolution, tools, options = {}, toolExecutionOptions }) {
|
|
15
|
+
verifyCodeModeContinuation(interrupt.continuation, options.continuationSecurity);
|
|
16
|
+
assertInterruptMatchesLedger(interrupt);
|
|
17
|
+
const interruptResolution = {
|
|
18
|
+
interruptId: interrupt.interruptId,
|
|
19
|
+
resolution
|
|
20
|
+
};
|
|
21
|
+
return await runCodeMode({
|
|
22
|
+
js: interrupt.continuation.js,
|
|
23
|
+
tools,
|
|
24
|
+
options,
|
|
25
|
+
continuation: interrupt.continuation,
|
|
26
|
+
interruptResolution,
|
|
27
|
+
...toolExecutionOptions !== void 0 ? { toolExecutionOptions } : {}
|
|
28
|
+
});
|
|
45
29
|
}
|
|
46
30
|
function getCodeModeInterrupt(result, continuationSecurity = {}) {
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
for (const part of parts) {
|
|
60
|
-
if (!isRecord(part)) {
|
|
61
|
-
continue;
|
|
62
|
-
}
|
|
63
|
-
const interrupt = readInterruptValue(part.output, continuationSecurity);
|
|
64
|
-
if (interrupt !== void 0) {
|
|
65
|
-
return interrupt;
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
}
|
|
31
|
+
const direct = readInterruptValue(result, continuationSecurity);
|
|
32
|
+
if (direct !== void 0) return direct;
|
|
33
|
+
if (!isRecord(result)) return;
|
|
34
|
+
for (const key of ["toolResults", "content"]) {
|
|
35
|
+
const parts = result[key];
|
|
36
|
+
if (!Array.isArray(parts)) continue;
|
|
37
|
+
for (const part of parts) {
|
|
38
|
+
if (!isRecord(part)) continue;
|
|
39
|
+
const interrupt = readInterruptValue(part.output, continuationSecurity);
|
|
40
|
+
if (interrupt !== void 0) return interrupt;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
69
43
|
}
|
|
70
44
|
function unwrapCodeModeResult(result, continuationSecurity = {}) {
|
|
71
|
-
|
|
72
|
-
|
|
45
|
+
const interrupt = getCodeModeInterrupt(result, continuationSecurity);
|
|
46
|
+
return interrupt === void 0 ? {
|
|
47
|
+
status: "completed",
|
|
48
|
+
output: result
|
|
49
|
+
} : {
|
|
50
|
+
status: "interrupted",
|
|
51
|
+
interrupt
|
|
52
|
+
};
|
|
73
53
|
}
|
|
74
54
|
function readInterruptValue(value, continuationSecurity) {
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
}
|
|
78
|
-
if (isRecord(value) && (value.type === "json" || value.type === "text") && "value" in value) {
|
|
79
|
-
return readInterruptValue(value.value, continuationSecurity);
|
|
80
|
-
}
|
|
55
|
+
if (isCodeModeInterrupt(value, continuationSecurity)) return value;
|
|
56
|
+
if (isRecord(value) && (value.type === "json" || value.type === "text") && "value" in value) return readInterruptValue(value.value, continuationSecurity);
|
|
81
57
|
}
|
|
82
58
|
function assertInterruptMatchesLedger(interrupt) {
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
);
|
|
87
|
-
}
|
|
88
|
-
const pending = interrupt.continuation.pendingInterruptions[interrupt.continuation.resolutions.length];
|
|
89
|
-
if (pending === void 0 || pending.interruptId !== interrupt.interruptId || pending.toolCallId !== interrupt.toolCallId || pending.toolName !== interrupt.toolName || !jsonEqual(pending.input, interrupt.input) || !jsonEqual(pending.payload, interrupt.payload)) {
|
|
90
|
-
throw new CodeModeProtocolError(
|
|
91
|
-
"Code-mode interrupt metadata does not match the signed continuation ledger.",
|
|
92
|
-
{ interruptId: interrupt.interruptId }
|
|
93
|
-
);
|
|
94
|
-
}
|
|
59
|
+
if (interrupt.continuation.outerToolCallId !== interrupt.outerToolCallId) throw new CodeModeProtocolError("Code-mode interrupt outer tool call id does not match its continuation.");
|
|
60
|
+
const pending = interrupt.continuation.pendingInterruptions[interrupt.continuation.resolutions.length];
|
|
61
|
+
if (pending === void 0 || pending.interruptId !== interrupt.interruptId || pending.toolCallId !== interrupt.toolCallId || pending.toolName !== interrupt.toolName || !jsonEqual(pending.input, interrupt.input) || !jsonEqual(pending.payload, interrupt.payload)) throw new CodeModeProtocolError("Code-mode interrupt metadata does not match the signed continuation ledger.", { interruptId: interrupt.interruptId });
|
|
95
62
|
}
|
|
96
63
|
function jsonEqual(left, right) {
|
|
97
|
-
|
|
64
|
+
return JSON.stringify(left) === JSON.stringify(right);
|
|
98
65
|
}
|
|
99
66
|
function isRecord(value) {
|
|
100
|
-
|
|
67
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
101
68
|
}
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
isCodeModeInterrupt,
|
|
106
|
-
unwrapCodeModeResult
|
|
107
|
-
};
|
|
69
|
+
//#endregion
|
|
70
|
+
export { continueCodeModeInterrupt, getCodeModeInterrupt, isCodeModeInterrupt, unwrapCodeModeResult };
|
|
71
|
+
|
|
108
72
|
//# sourceMappingURL=interrupt-continuation.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/interrupt-continuation.ts"],"sourcesContent":["import {\n hasValidCodeModeContinuationCapability,\n verifyCodeModeContinuation,\n} from './continuation-capability.js';\nimport { CodeModeProtocolError } from './errors.js';\nimport { runCodeMode } from './run-code-mode.js';\nimport type {\n CodeModeContinuationSecurityOptions,\n CodeModeInterrupt,\n CodeModeInterruptPayload,\n CodeModeInterruptResolution,\n CodeModeOptions,\n CodeModeToolExecutionOptions,\n CodeModeToolSet,\n CodeModeUnwrappedResult,\n} from './types.js';\n\nexport function isCodeModeInterrupt(\n value: unknown,\n continuationSecurity: CodeModeContinuationSecurityOptions = {},\n): value is CodeModeInterrupt {\n if (\n isRecord(value) &&\n value.type === 'code-mode-interrupt' &&\n typeof value.interruptId === 'string' &&\n typeof value.toolCallId === 'string' &&\n typeof value.toolName === 'string' &&\n typeof value.outerToolCallId === 'string' &&\n isRecord(value.payload) &&\n typeof value.payload.kind === 'string' &&\n isRecord(value.continuation) &&\n hasValidCodeModeContinuationCapability(\n value.continuation,\n continuationSecurity,\n )\n ) {\n try {\n assertInterruptMatchesLedger(value as unknown as CodeModeInterrupt);\n return true;\n } catch {\n return false;\n }\n }\n return false;\n}\n\nexport async function continueCodeModeInterrupt<\n TPayload extends CodeModeInterruptPayload = CodeModeInterruptPayload,\n TResolution = unknown,\n>({\n interrupt,\n resolution,\n tools,\n options = {},\n toolExecutionOptions,\n}: {\n interrupt: CodeModeInterrupt<TPayload>;\n resolution: TResolution;\n tools: CodeModeToolSet;\n options?: CodeModeOptions;\n toolExecutionOptions?: Partial<CodeModeToolExecutionOptions>;\n}): Promise<unknown> {\n verifyCodeModeContinuation(\n interrupt.continuation,\n options.continuationSecurity,\n );\n assertInterruptMatchesLedger(interrupt);\n\n const interruptResolution: CodeModeInterruptResolution<TResolution> = {\n interruptId: interrupt.interruptId,\n resolution,\n };\n return await runCodeMode({\n js: interrupt.continuation.js,\n tools,\n options,\n continuation: interrupt.continuation,\n interruptResolution,\n ...(toolExecutionOptions !== undefined ? { toolExecutionOptions } : {}),\n });\n}\n\nexport function getCodeModeInterrupt(\n result: unknown,\n continuationSecurity: CodeModeContinuationSecurityOptions = {},\n): CodeModeInterrupt | undefined {\n const direct = readInterruptValue(result, continuationSecurity);\n if (direct !== undefined) {\n return direct;\n }\n if (!isRecord(result)) {\n return undefined;\n }\n\n for (const key of ['toolResults', 'content'] as const) {\n const parts = result[key];\n if (!Array.isArray(parts)) {\n continue;\n }\n for (const part of parts) {\n if (!isRecord(part)) {\n continue;\n }\n const interrupt = readInterruptValue(part.output, continuationSecurity);\n if (interrupt !== undefined) {\n return interrupt;\n }\n }\n }\n}\n\nexport function unwrapCodeModeResult(\n result: unknown,\n continuationSecurity: CodeModeContinuationSecurityOptions = {},\n): CodeModeUnwrappedResult {\n const interrupt = getCodeModeInterrupt(result, continuationSecurity);\n return interrupt === undefined\n ? { status: 'completed', output: result }\n : { status: 'interrupted', interrupt };\n}\n\nfunction readInterruptValue(\n value: unknown,\n continuationSecurity: CodeModeContinuationSecurityOptions,\n): CodeModeInterrupt | undefined {\n if (isCodeModeInterrupt(value, continuationSecurity)) {\n return value;\n }\n if (\n isRecord(value) &&\n (value.type === 'json' || value.type === 'text') &&\n 'value' in value\n ) {\n return readInterruptValue(value.value, continuationSecurity);\n }\n}\n\nfunction assertInterruptMatchesLedger(interrupt: CodeModeInterrupt): void {\n if (interrupt.continuation.outerToolCallId !== interrupt.outerToolCallId) {\n throw new CodeModeProtocolError(\n 'Code-mode interrupt outer tool call id does not match its continuation.',\n );\n }\n const pending =\n interrupt.continuation.pendingInterruptions[\n interrupt.continuation.resolutions.length\n ];\n if (\n pending === undefined ||\n pending.interruptId !== interrupt.interruptId ||\n pending.toolCallId !== interrupt.toolCallId ||\n pending.toolName !== interrupt.toolName ||\n !jsonEqual(pending.input, interrupt.input) ||\n !jsonEqual(pending.payload, interrupt.payload)\n ) {\n throw new CodeModeProtocolError(\n 'Code-mode interrupt metadata does not match the signed continuation ledger.',\n { interruptId: interrupt.interruptId },\n );\n }\n}\n\nfunction jsonEqual(left: unknown, right: unknown): boolean {\n return JSON.stringify(left) === JSON.stringify(right);\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"interrupt-continuation.js","names":[],"sources":["../src/interrupt-continuation.ts"],"sourcesContent":["import {\n hasValidCodeModeContinuationCapability,\n verifyCodeModeContinuation,\n} from './continuation-capability.js';\nimport { CodeModeProtocolError } from './errors.js';\nimport { runCodeMode } from './run-code-mode.js';\nimport type {\n CodeModeContinuationSecurityOptions,\n CodeModeInterrupt,\n CodeModeInterruptPayload,\n CodeModeInterruptResolution,\n CodeModeOptions,\n CodeModeToolExecutionOptions,\n CodeModeToolSet,\n CodeModeUnwrappedResult,\n} from './types.js';\n\nexport function isCodeModeInterrupt(\n value: unknown,\n continuationSecurity: CodeModeContinuationSecurityOptions = {},\n): value is CodeModeInterrupt {\n if (\n isRecord(value) &&\n value.type === 'code-mode-interrupt' &&\n typeof value.interruptId === 'string' &&\n typeof value.toolCallId === 'string' &&\n typeof value.toolName === 'string' &&\n typeof value.outerToolCallId === 'string' &&\n isRecord(value.payload) &&\n typeof value.payload.kind === 'string' &&\n isRecord(value.continuation) &&\n hasValidCodeModeContinuationCapability(\n value.continuation,\n continuationSecurity,\n )\n ) {\n try {\n assertInterruptMatchesLedger(value as unknown as CodeModeInterrupt);\n return true;\n } catch {\n return false;\n }\n }\n return false;\n}\n\nexport async function continueCodeModeInterrupt<\n TPayload extends CodeModeInterruptPayload = CodeModeInterruptPayload,\n TResolution = unknown,\n>({\n interrupt,\n resolution,\n tools,\n options = {},\n toolExecutionOptions,\n}: {\n interrupt: CodeModeInterrupt<TPayload>;\n resolution: TResolution;\n tools: CodeModeToolSet;\n options?: CodeModeOptions;\n toolExecutionOptions?: Partial<CodeModeToolExecutionOptions>;\n}): Promise<unknown> {\n verifyCodeModeContinuation(\n interrupt.continuation,\n options.continuationSecurity,\n );\n assertInterruptMatchesLedger(interrupt);\n\n const interruptResolution: CodeModeInterruptResolution<TResolution> = {\n interruptId: interrupt.interruptId,\n resolution,\n };\n return await runCodeMode({\n js: interrupt.continuation.js,\n tools,\n options,\n continuation: interrupt.continuation,\n interruptResolution,\n ...(toolExecutionOptions !== undefined ? { toolExecutionOptions } : {}),\n });\n}\n\nexport function getCodeModeInterrupt(\n result: unknown,\n continuationSecurity: CodeModeContinuationSecurityOptions = {},\n): CodeModeInterrupt | undefined {\n const direct = readInterruptValue(result, continuationSecurity);\n if (direct !== undefined) {\n return direct;\n }\n if (!isRecord(result)) {\n return undefined;\n }\n\n for (const key of ['toolResults', 'content'] as const) {\n const parts = result[key];\n if (!Array.isArray(parts)) {\n continue;\n }\n for (const part of parts) {\n if (!isRecord(part)) {\n continue;\n }\n const interrupt = readInterruptValue(part.output, continuationSecurity);\n if (interrupt !== undefined) {\n return interrupt;\n }\n }\n }\n}\n\nexport function unwrapCodeModeResult(\n result: unknown,\n continuationSecurity: CodeModeContinuationSecurityOptions = {},\n): CodeModeUnwrappedResult {\n const interrupt = getCodeModeInterrupt(result, continuationSecurity);\n return interrupt === undefined\n ? { status: 'completed', output: result }\n : { status: 'interrupted', interrupt };\n}\n\nfunction readInterruptValue(\n value: unknown,\n continuationSecurity: CodeModeContinuationSecurityOptions,\n): CodeModeInterrupt | undefined {\n if (isCodeModeInterrupt(value, continuationSecurity)) {\n return value;\n }\n if (\n isRecord(value) &&\n (value.type === 'json' || value.type === 'text') &&\n 'value' in value\n ) {\n return readInterruptValue(value.value, continuationSecurity);\n }\n}\n\nfunction assertInterruptMatchesLedger(interrupt: CodeModeInterrupt): void {\n if (interrupt.continuation.outerToolCallId !== interrupt.outerToolCallId) {\n throw new CodeModeProtocolError(\n 'Code-mode interrupt outer tool call id does not match its continuation.',\n );\n }\n const pending =\n interrupt.continuation.pendingInterruptions[\n interrupt.continuation.resolutions.length\n ];\n if (\n pending === undefined ||\n pending.interruptId !== interrupt.interruptId ||\n pending.toolCallId !== interrupt.toolCallId ||\n pending.toolName !== interrupt.toolName ||\n !jsonEqual(pending.input, interrupt.input) ||\n !jsonEqual(pending.payload, interrupt.payload)\n ) {\n throw new CodeModeProtocolError(\n 'Code-mode interrupt metadata does not match the signed continuation ledger.',\n { interruptId: interrupt.interruptId },\n );\n }\n}\n\nfunction jsonEqual(left: unknown, right: unknown): boolean {\n return JSON.stringify(left) === JSON.stringify(right);\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n"],"mappings":";;;;AAiBA,SAAgB,oBACd,OACA,uBAA4D,CAAC,GACjC;CAC5B,IACE,SAAS,KAAK,KACd,MAAM,SAAS,yBACf,OAAO,MAAM,gBAAgB,YAC7B,OAAO,MAAM,eAAe,YAC5B,OAAO,MAAM,aAAa,YAC1B,OAAO,MAAM,oBAAoB,YACjC,SAAS,MAAM,OAAO,KACtB,OAAO,MAAM,QAAQ,SAAS,YAC9B,SAAS,MAAM,YAAY,KAC3B,uCACE,MAAM,cACN,oBACF,GAEA,IAAI;EACF,6BAA6B,KAAqC;EAClE,OAAO;CACT,QAAQ;EACN,OAAO;CACT;CAEF,OAAO;AACT;AAEA,eAAsB,0BAGpB,EACA,WACA,YACA,OACA,UAAU,CAAC,GACX,wBAOmB;CACnB,2BACE,UAAU,cACV,QAAQ,oBACV;CACA,6BAA6B,SAAS;CAEtC,MAAM,sBAAgE;EACpE,aAAa,UAAU;EACvB;CACF;CACA,OAAO,MAAM,YAAY;EACvB,IAAI,UAAU,aAAa;EAC3B;EACA;EACA,cAAc,UAAU;EACxB;EACA,GAAI,yBAAyB,KAAA,IAAY,EAAE,qBAAqB,IAAI,CAAC;CACvE,CAAC;AACH;AAEA,SAAgB,qBACd,QACA,uBAA4D,CAAC,GAC9B;CAC/B,MAAM,SAAS,mBAAmB,QAAQ,oBAAoB;CAC9D,IAAI,WAAW,KAAA,GACb,OAAO;CAET,IAAI,CAAC,SAAS,MAAM,GAClB;CAGF,KAAK,MAAM,OAAO,CAAC,eAAe,SAAS,GAAY;EACrD,MAAM,QAAQ,OAAO;EACrB,IAAI,CAAC,MAAM,QAAQ,KAAK,GACtB;EAEF,KAAK,MAAM,QAAQ,OAAO;GACxB,IAAI,CAAC,SAAS,IAAI,GAChB;GAEF,MAAM,YAAY,mBAAmB,KAAK,QAAQ,oBAAoB;GACtE,IAAI,cAAc,KAAA,GAChB,OAAO;EAEX;CACF;AACF;AAEA,SAAgB,qBACd,QACA,uBAA4D,CAAC,GACpC;CACzB,MAAM,YAAY,qBAAqB,QAAQ,oBAAoB;CACnE,OAAO,cAAc,KAAA,IACjB;EAAE,QAAQ;EAAa,QAAQ;CAAO,IACtC;EAAE,QAAQ;EAAe;CAAU;AACzC;AAEA,SAAS,mBACP,OACA,sBAC+B;CAC/B,IAAI,oBAAoB,OAAO,oBAAoB,GACjD,OAAO;CAET,IACE,SAAS,KAAK,MACb,MAAM,SAAS,UAAU,MAAM,SAAS,WACzC,WAAW,OAEX,OAAO,mBAAmB,MAAM,OAAO,oBAAoB;AAE/D;AAEA,SAAS,6BAA6B,WAAoC;CACxE,IAAI,UAAU,aAAa,oBAAoB,UAAU,iBACvD,MAAM,IAAI,sBACR,yEACF;CAEF,MAAM,UACJ,UAAU,aAAa,qBACrB,UAAU,aAAa,YAAY;CAEvC,IACE,YAAY,KAAA,KACZ,QAAQ,gBAAgB,UAAU,eAClC,QAAQ,eAAe,UAAU,cACjC,QAAQ,aAAa,UAAU,YAC/B,CAAC,UAAU,QAAQ,OAAO,UAAU,KAAK,KACzC,CAAC,UAAU,QAAQ,SAAS,UAAU,OAAO,GAE7C,MAAM,IAAI,sBACR,+EACA,EAAE,aAAa,UAAU,YAAY,CACvC;AAEJ;AAEA,SAAS,UAAU,MAAe,OAAyB;CACzD,OAAO,KAAK,UAAU,IAAI,MAAM,KAAK,UAAU,KAAK;AACtD;AAEA,SAAS,SAAS,OAAkD;CAClE,OAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E"}
|