@assemblyline-agents/pi 0.1.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.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 OpenEve contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,19 @@
1
+ # @assemblyline-agents/pi
2
+
3
+ The canonical Pi agent loop for Assembly Line, packaged behind the framework's internal `AgentHarness` runtime contract.
4
+
5
+ It adapts the Pi agent engine (`@earendil-works/pi-agent-core` / `@earendil-works/pi-ai`) to Assembly Line's harness interface: model resolution and defaults, tool descriptors, continuations, media inputs, and usage accounting. OpenRouter calls retain the provider generation ID and reconcile native input/output/cache/reasoning tokens plus the charged credit receipt; local catalog-price calculations are discarded rather than reported as spend. The Assembly Line runtime uses this harness to drive agent turns; it is included automatically when you install the umbrella `@assemblyline-agents/sdk` package.
6
+
7
+ ## Install
8
+
9
+ ```sh
10
+ npm install @assemblyline-agents/pi
11
+ ```
12
+
13
+ ## Part of Assembly Line
14
+
15
+ This package is part of [Assembly Line](https://github.com/jasonbadeaux/openeve), a vendor-neutral, filesystem-first framework for durable AI agents. See the developer documentation in [docs/developers/](https://github.com/jasonbadeaux/openeve/tree/main/docs/developers) for setup, agent authoring, and deployment guides.
16
+
17
+ ## License
18
+
19
+ MIT
@@ -0,0 +1,32 @@
1
+ import { type AgentHarness, type HarnessContinuation, type JsonObject } from "@assemblyline-agents/core";
2
+ export { assistantText, createDefaultPiModels, injectOpenRouterVideoInputs, listPiModelSpecs, openRouterGenerationAccounting, openRouterModelInputModalities, piMessageAccounting, PiHarnessRunError, piUsageToRuntime, resolvePiModel, runPiAgentLoop, type RunPiAgentLoopOptions, type RunPiAgentLoopResult, type OpenRouterGenerationAccountingOptions, type PiMessageAccounting } from "./pi-harness.js";
3
+ export { classifyModelError, resolveModelRetryConfig, streamSimpleWithRetry, type ModelRetryConfig, type ModelRetryEventInfo, type ModelStreamOutcome } from "./model-stream-retry.js";
4
+ export { boundModelOutput } from "@assemblyline-agents/core";
5
+ export { capPiToolResults, compactPiTranscript, estimateTranscriptTokens, isSummaryMessage, transcriptContextWindow, DEFAULT_TRANSCRIPT_CONTEXT_WINDOW, TRANSCRIPT_SUMMARY_PREFIX, type PiTranscriptCapResult, type PiTranscriptCompactionInput } from "./transcript-trim.js";
6
+ export declare const PI_HARNESS_ID = "pi";
7
+ export declare const PI_CONTINUATION_VERSION = 1;
8
+ /**
9
+ * Default OpenEve {@link AgentHarness} wrapping the Pi agent loop. All
10
+ * Pi-specific behavior lives here: AgentTool adaptation, the terminate
11
+ * stop-signal on pause, usage mapping, `mode: "continue"` resume, and
12
+ * continuation transcript splicing. `@earendil-works` code is loaded lazily.
13
+ */
14
+ export declare function piAgentHarness(options?: {
15
+ models?: unknown;
16
+ fetch?: typeof fetch;
17
+ }): AgentHarness;
18
+ /** Up-convert a legacy flat `pi.continuation` payload into the opaque envelope form. */
19
+ export declare function legacyPiContinuation(data: JsonObject): HarnessContinuation;
20
+ /**
21
+ * Extract the trailing assistant text from a persisted pi continuation.
22
+ * Used by crash recovery: when the final model response was produced but the
23
+ * delivery was never recorded, the answer still lives in the newest
24
+ * continuation checkpoint. Returns undefined for non-pi continuations,
25
+ * unknown shapes, or transcripts that do not end in assistant text.
26
+ */
27
+ export declare function assistantTextFromContinuation(continuation: {
28
+ harness: string;
29
+ version: number;
30
+ state: JsonObject;
31
+ }): string | undefined;
32
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,YAAY,EAMjB,KAAK,mBAAmB,EAMxB,KAAK,UAAU,EAEhB,MAAM,2BAA2B,CAAC;AASnC,OAAO,EACL,aAAa,EACb,qBAAqB,EACrB,2BAA2B,EAC3B,gBAAgB,EAChB,8BAA8B,EAC9B,8BAA8B,EAC9B,mBAAmB,EACnB,iBAAiB,EACjB,gBAAgB,EAChB,cAAc,EACd,cAAc,EACd,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,EACzB,KAAK,qCAAqC,EAC1C,KAAK,mBAAmB,EACzB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,kBAAkB,EAClB,uBAAuB,EACvB,qBAAqB,EACrB,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACxB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,wBAAwB,EACxB,gBAAgB,EAChB,uBAAuB,EACvB,iCAAiC,EACjC,yBAAyB,EACzB,KAAK,qBAAqB,EAC1B,KAAK,2BAA2B,EACjC,MAAM,sBAAsB,CAAC;AAG9B,eAAO,MAAM,aAAa,OAAO,CAAC;AAClC,eAAO,MAAM,uBAAuB,IAAI,CAAC;AAEzC;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,KAAK,CAAA;CAAO,GAAG,YAAY,CAsMrG;AAED,wFAAwF;AACxF,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,UAAU,GAAG,mBAAmB,CAI1E;AAaD;;;;;;GAMG;AACH,wBAAgB,6BAA6B,CAAC,YAAY,EAAE;IAC1D,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,UAAU,CAAC;CACnB,GAAG,MAAM,GAAG,SAAS,CAgBrB"}
package/dist/index.js ADDED
@@ -0,0 +1,503 @@
1
+ import { boundModelOutput } from "@assemblyline-agents/core";
2
+ import { capPiToolResults, compactPiTranscript, estimateTranscriptTokens, transcriptContextWindow } from "./transcript-trim.js";
3
+ export { assistantText, createDefaultPiModels, injectOpenRouterVideoInputs, listPiModelSpecs, openRouterGenerationAccounting, openRouterModelInputModalities, piMessageAccounting, PiHarnessRunError, piUsageToRuntime, resolvePiModel, runPiAgentLoop } from "./pi-harness.js";
4
+ export { classifyModelError, resolveModelRetryConfig, streamSimpleWithRetry } from "./model-stream-retry.js";
5
+ export { boundModelOutput } from "@assemblyline-agents/core";
6
+ export { capPiToolResults, compactPiTranscript, estimateTranscriptTokens, isSummaryMessage, transcriptContextWindow, DEFAULT_TRANSCRIPT_CONTEXT_WINDOW, TRANSCRIPT_SUMMARY_PREFIX } from "./transcript-trim.js";
7
+ export const PI_HARNESS_ID = "pi";
8
+ export const PI_CONTINUATION_VERSION = 1;
9
+ /**
10
+ * Default OpenEve {@link AgentHarness} wrapping the Pi agent loop. All
11
+ * Pi-specific behavior lives here: AgentTool adaptation, the terminate
12
+ * stop-signal on pause, usage mapping, `mode: "continue"` resume, and
13
+ * continuation transcript splicing. `@earendil-works` code is loaded lazily.
14
+ */
15
+ export function piAgentHarness(options = {}) {
16
+ let defaultModels;
17
+ const resolveModels = async (env) => {
18
+ if (options.models)
19
+ return options.models;
20
+ if (!defaultModels) {
21
+ const { createDefaultPiModels } = await import("./pi-harness.js");
22
+ defaultModels = await createDefaultPiModels(env);
23
+ }
24
+ return defaultModels;
25
+ };
26
+ return {
27
+ id: PI_HARNESS_ID,
28
+ continuationVersion: PI_CONTINUATION_VERSION,
29
+ async runTurn(input, ctx) {
30
+ const { piMessageAccounting, runPiAgentLoop } = await import("./pi-harness.js");
31
+ const models = await resolveModels(ctx.env);
32
+ const trackedMessages = [];
33
+ let pendingToolCallId;
34
+ let continuationMedia = [];
35
+ const pauseState = { paused: false };
36
+ const buildTools = async () => (await ctx.tools()).map((tool) => piAgentTool(tool, ctx, pauseState, (toolCallId) => {
37
+ // First pause wins: the run parks on the first paused call in a
38
+ // batch, and resume splices its result at that placeholder.
39
+ if (pauseState.paused)
40
+ return;
41
+ pauseState.paused = true;
42
+ pendingToolCallId = toolCallId;
43
+ }));
44
+ const loopOptions = {
45
+ models,
46
+ modelSpec: ctx.modelSpec,
47
+ systemPrompt: ctx.systemPrompt,
48
+ recentHistory: [],
49
+ tools: buildTools,
50
+ env: ctx.env,
51
+ sessionId: ctx.sessionId,
52
+ // Once any call in a batch pauses, stamp terminate onto every later
53
+ // finalized call so the batch stops; shouldStop backstops the case
54
+ // where the pauser finalized after its parallel siblings.
55
+ afterToolCall: async () => (pauseState.paused ? { terminate: true } : undefined),
56
+ shouldStop: () => pauseState.paused || (ctx.shouldStop?.() ?? false),
57
+ onModelRetry: async (info, state) => {
58
+ await ctx.emit({
59
+ type: "model_retry",
60
+ iteration: state.requestIteration,
61
+ attempt: info.attempt,
62
+ delayMs: info.delayMs,
63
+ error: info.error,
64
+ ...(info.status !== undefined ? { status: info.status } : {})
65
+ });
66
+ },
67
+ onRequestStarted: async ({ model, context }, state) => {
68
+ const started = {
69
+ type: "request_started",
70
+ iteration: state.requestIteration,
71
+ toolNames: context.tools?.map((tool) => tool.name) ?? [],
72
+ provider: model.provider,
73
+ billingMode: "api_key"
74
+ };
75
+ if (ctx.captureContent) {
76
+ const requestMessages = piMessagesToContent(context.messages ?? []);
77
+ addMediaMetadataToLatestUser(requestMessages, continuationMedia);
78
+ started.requestMessages = requestMessages;
79
+ }
80
+ await ctx.emit(started);
81
+ },
82
+ onEvent: async (event, state) => {
83
+ if (event.type === "message_update" && event.assistantMessageEvent.type === "text_delta") {
84
+ // Ephemeral token deltas: the runtime fans these out to live run
85
+ // streams and never persists them.
86
+ await ctx.emit({
87
+ type: "response_delta",
88
+ iteration: state.requestIteration,
89
+ delta: event.assistantMessageEvent.delta
90
+ });
91
+ return;
92
+ }
93
+ if (event.type === "message_end") {
94
+ trackedMessages.push(event.message);
95
+ return;
96
+ }
97
+ if (event.type !== "turn_end" || event.message.role !== "assistant")
98
+ return;
99
+ const accounting = await piMessageAccounting(event.message, {
100
+ env: ctx.env,
101
+ ...(options.fetch ? { fetch: options.fetch } : {})
102
+ });
103
+ await ctx.emit(responseCompletedEvent(event.message, state.requestIteration, accounting, ctx.captureContent === true));
104
+ if (ctx.onIterationCheckpoint) {
105
+ await ctx.onIterationCheckpoint(piContinuation(trackedMessages, pendingToolCallId, continuationMedia));
106
+ }
107
+ }
108
+ };
109
+ if (ctx.reasoning)
110
+ loopOptions.reasoning = ctx.reasoning;
111
+ if (ctx.maxIterations !== undefined)
112
+ loopOptions.maxIterations = ctx.maxIterations;
113
+ if (ctx.signal)
114
+ loopOptions.signal = ctx.signal;
115
+ if (options.fetch)
116
+ loopOptions.fetch = options.fetch;
117
+ if (input.kind === "resume") {
118
+ const state = piContinuationState(input.continuation.state);
119
+ continuationMedia = state.media;
120
+ let messages = state.messages;
121
+ if (input.toolResult) {
122
+ messages = replacePiToolResult(messages, state.pendingToolCallId, input.toolResult.toolName, input.toolResult.output, input.toolResult.media);
123
+ }
124
+ trackedMessages.push(...messages);
125
+ loopOptions.messages = messages;
126
+ if (input.message !== undefined) {
127
+ // Follow-up: prompt with the restored transcript plus a new user message.
128
+ loopOptions.message = input.message;
129
+ const followupMedia = input.media ?? [];
130
+ continuationMedia = [...continuationMedia, ...followupMedia.filter((item) => item.type === "video")];
131
+ loopOptions.media = [...state.media, ...followupMedia];
132
+ }
133
+ else {
134
+ if (state.media.length > 0)
135
+ loopOptions.media = state.media;
136
+ loopOptions.mode = "continue";
137
+ }
138
+ }
139
+ else {
140
+ const initialMessages = input.recentHistory.map((content) => ({
141
+ role: "user",
142
+ content: [{ type: "text", text: content }],
143
+ timestamp: Date.now()
144
+ }));
145
+ trackedMessages.push(...initialMessages);
146
+ loopOptions.messages = initialMessages;
147
+ loopOptions.message = input.message;
148
+ if (input.media) {
149
+ loopOptions.media = input.media;
150
+ continuationMedia = input.media.filter((item) => item.type === "video");
151
+ }
152
+ }
153
+ const loop = await runPiAgentLoop(loopOptions);
154
+ const result = {
155
+ response: loop.response,
156
+ continuation: piContinuation(loop.messages, pendingToolCallId, continuationMedia)
157
+ };
158
+ if (pauseState.paused) {
159
+ result.paused = true;
160
+ }
161
+ else if (loop.stoppedReason) {
162
+ result.stoppedReason = loop.stoppedReason;
163
+ }
164
+ return result;
165
+ },
166
+ async trimContinuation(continuation, budget, ctx) {
167
+ if (continuation.harness !== PI_HARNESS_ID)
168
+ return undefined;
169
+ const state = piContinuationState(continuation.state);
170
+ const capped = capPiToolResults(state.messages, budget.keepRecentTokens, budget.toolResultCapChars);
171
+ let messages = capped.messages;
172
+ let compacted = false;
173
+ let tokensBefore;
174
+ // The provider-reported count is exact for the stored transcript; once
175
+ // capping rewrote it, fall back to the estimate of what will be sent.
176
+ const gateTokens = capped.cappedToolResults > 0
177
+ ? estimateTranscriptTokens(messages)
178
+ : budget.lastInputTokens ?? estimateTranscriptTokens(messages);
179
+ const models = await resolveModels(ctx.env);
180
+ const window = transcriptContextWindow(models, ctx.modelSpec);
181
+ if (gateTokens > window - budget.reserveTokens) {
182
+ const compactedMessages = await compactPiTranscript({
183
+ messages,
184
+ models,
185
+ modelSpec: ctx.modelSpec,
186
+ reserveTokens: budget.reserveTokens,
187
+ keepRecentTokens: budget.keepRecentTokens,
188
+ signal: ctx.signal
189
+ });
190
+ if (!compactedMessages) {
191
+ throw new Error("Transcript exceeds the context budget and has no compactable turns.");
192
+ }
193
+ messages = compactedMessages;
194
+ compacted = true;
195
+ tokensBefore = gateTokens;
196
+ }
197
+ // Conversation resumes never replay stored media: stale base64 payloads
198
+ // grow the request every turn and the transcript retains the text trail.
199
+ return {
200
+ continuation: piContinuation(messages, undefined, []),
201
+ compacted,
202
+ cappedToolResults: capped.cappedToolResults,
203
+ ...(tokensBefore !== undefined ? { tokensBefore } : {})
204
+ };
205
+ }
206
+ };
207
+ }
208
+ /** Up-convert a legacy flat `pi.continuation` payload into the opaque envelope form. */
209
+ export function legacyPiContinuation(data) {
210
+ const state = { messages: Array.isArray(data.messages) ? data.messages : [] };
211
+ if (typeof data.pendingToolCallId === "string")
212
+ state.pendingToolCallId = data.pendingToolCallId;
213
+ return { harness: PI_HARNESS_ID, version: PI_CONTINUATION_VERSION, state };
214
+ }
215
+ function piContinuation(messages, pendingToolCallId, media = []) {
216
+ const state = jsonClone({ messages });
217
+ if (pendingToolCallId)
218
+ state.pendingToolCallId = pendingToolCallId;
219
+ if (media.length > 0)
220
+ state.media = jsonClone(media);
221
+ return { harness: PI_HARNESS_ID, version: PI_CONTINUATION_VERSION, state };
222
+ }
223
+ /**
224
+ * Extract the trailing assistant text from a persisted pi continuation.
225
+ * Used by crash recovery: when the final model response was produced but the
226
+ * delivery was never recorded, the answer still lives in the newest
227
+ * continuation checkpoint. Returns undefined for non-pi continuations,
228
+ * unknown shapes, or transcripts that do not end in assistant text.
229
+ */
230
+ export function assistantTextFromContinuation(continuation) {
231
+ if (continuation.harness !== PI_HARNESS_ID)
232
+ return undefined;
233
+ try {
234
+ const { messages } = piContinuationState(continuation.state);
235
+ const last = messages.at(-1);
236
+ if (!last || last.role !== "assistant" || !Array.isArray(last.content))
237
+ return undefined;
238
+ const text = last.content
239
+ .filter((block) => Boolean(block) && typeof block === "object" && block.type === "text" &&
240
+ typeof block.text === "string")
241
+ .map((block) => block.text)
242
+ .join("");
243
+ return text.trim().length > 0 ? text : undefined;
244
+ }
245
+ catch {
246
+ return undefined;
247
+ }
248
+ }
249
+ function piContinuationState(state) {
250
+ const messages = Array.isArray(state.messages) ? state.messages : [];
251
+ const media = Array.isArray(state.media)
252
+ ? state.media.filter(isHarnessInputMedia).map((item) => jsonClone(item))
253
+ : [];
254
+ const out = {
255
+ messages,
256
+ media
257
+ };
258
+ if (typeof state.pendingToolCallId === "string")
259
+ out.pendingToolCallId = state.pendingToolCallId;
260
+ return out;
261
+ }
262
+ function piAgentTool(tool, ctx, pauseState, onPause) {
263
+ const agentTool = {
264
+ name: tool.name,
265
+ label: tool.name,
266
+ description: tool.description,
267
+ parameters: tool.inputSchema,
268
+ execute: async (toolCallId, params) => {
269
+ if (pauseState.paused) {
270
+ // The run already parked on an earlier call in this batch: skip the
271
+ // side effect entirely and mark the placeholder terminal so the
272
+ // batch stops.
273
+ return piToolResult({ skipped: true, reason: "The run paused before this tool executed; it did not run." }, true);
274
+ }
275
+ const outcome = await ctx.executeTool({ toolCallId, name: tool.name, input: params });
276
+ if (outcome.kind === "pause") {
277
+ // Track pi's own model call id — it matches the transcript's pause
278
+ // placeholder, so resume can replace it with the real tool result.
279
+ // (The runtime's outcome.toolCallId is its tool-call *record* id.)
280
+ onPause(toolCallId);
281
+ return piToolResult(outcome.output, true, outcome.media);
282
+ }
283
+ return piToolResult(outcome.output, false, outcome.media);
284
+ }
285
+ };
286
+ // Pause-capable tools serialize their whole batch (pi-agent-core runs a
287
+ // batch sequentially when any member is sequential); everything else runs
288
+ // in parallel.
289
+ if (tool.execution === "sequential")
290
+ agentTool.executionMode = "sequential";
291
+ return agentTool;
292
+ }
293
+ function responseCompletedEvent(message, iteration, accounting, captureContent) {
294
+ const event = {
295
+ type: "response_completed",
296
+ iteration,
297
+ toolCallCount: message.content.filter((block) => block.type === "toolCall").length,
298
+ usage: accounting.usage,
299
+ billingMode: accounting.billingMode
300
+ };
301
+ if (message.stopReason !== undefined)
302
+ event.finishReason = message.stopReason;
303
+ if (message.provider !== undefined)
304
+ event.provider = message.provider;
305
+ const responseModel = message.responseModel ?? message.model;
306
+ if (responseModel !== undefined)
307
+ event.responseModel = responseModel;
308
+ if (accounting.providerRequestId)
309
+ event.providerRequestId = accounting.providerRequestId;
310
+ if (accounting.providerReceipt)
311
+ event.providerReceipt = accounting.providerReceipt;
312
+ if (captureContent) {
313
+ const text = collectContentText(message.content);
314
+ const toolCalls = collectContentToolCalls(message.content);
315
+ const responseContent = {};
316
+ if (text)
317
+ responseContent.text = text;
318
+ if (toolCalls.length > 0)
319
+ responseContent.toolCalls = toolCalls;
320
+ if (responseContent.text !== undefined || responseContent.toolCalls !== undefined) {
321
+ event.responseContent = responseContent;
322
+ }
323
+ }
324
+ return event;
325
+ }
326
+ /** Maps the transcript sent to the model into engine-neutral content messages. */
327
+ function piMessagesToContent(messages) {
328
+ return messages.map((message) => piMessageToContent(message));
329
+ }
330
+ function piMessageToContent(message) {
331
+ const role = message.role === "assistant" ? "assistant" : message.role === "toolResult" ? "tool" : "user";
332
+ const out = { role };
333
+ const text = collectContentText(message.content);
334
+ if (text)
335
+ out.text = text;
336
+ const media = collectContentMedia(message.content);
337
+ if (media.length > 0)
338
+ out.media = media;
339
+ const toolCalls = collectContentToolCalls(message.content);
340
+ if (toolCalls.length > 0)
341
+ out.toolCalls = toolCalls;
342
+ if (message.role === "toolResult") {
343
+ const output = message.details ?? (text || null);
344
+ out.toolResult =
345
+ typeof message.toolCallId === "string" ? { toolCallId: message.toolCallId, output } : { output };
346
+ }
347
+ return out;
348
+ }
349
+ function collectContentText(content) {
350
+ if (!Array.isArray(content))
351
+ return "";
352
+ const parts = [];
353
+ for (const block of content) {
354
+ if (isRecord(block) && block.type === "text" && typeof block.text === "string")
355
+ parts.push(block.text);
356
+ }
357
+ return parts.join("");
358
+ }
359
+ function collectContentToolCalls(content) {
360
+ if (!Array.isArray(content))
361
+ return [];
362
+ const calls = [];
363
+ for (const block of content) {
364
+ if (isRecord(block) && block.type === "toolCall" && typeof block.name === "string") {
365
+ const call = { name: block.name, arguments: block.input ?? {} };
366
+ if (typeof block.id === "string")
367
+ call.id = block.id;
368
+ calls.push(call);
369
+ }
370
+ }
371
+ return calls;
372
+ }
373
+ function collectContentMedia(content) {
374
+ if (!Array.isArray(content))
375
+ return [];
376
+ const media = [];
377
+ for (const block of content) {
378
+ if (!isRecord(block) || block.type !== "image" || typeof block.mimeType !== "string")
379
+ continue;
380
+ media.push({ type: "image", mimeType: block.mimeType });
381
+ }
382
+ return media;
383
+ }
384
+ function addMediaMetadataToLatestUser(messages, media) {
385
+ if (media.length === 0)
386
+ return;
387
+ let user;
388
+ for (let index = messages.length - 1; index >= 0; index -= 1) {
389
+ if (messages[index]?.role === "user") {
390
+ user = messages[index];
391
+ break;
392
+ }
393
+ }
394
+ if (!user)
395
+ return;
396
+ user.media = [
397
+ ...(user.media ?? []),
398
+ ...media.map((item) => {
399
+ const metadata = {
400
+ type: item.type,
401
+ mimeType: item.mimeType
402
+ };
403
+ if (item.name)
404
+ metadata.name = item.name;
405
+ if (item.path)
406
+ metadata.path = item.path;
407
+ return metadata;
408
+ })
409
+ ];
410
+ }
411
+ function isRecord(value) {
412
+ return Boolean(value) && typeof value === "object" && !Array.isArray(value);
413
+ }
414
+ function isHarnessInputMedia(value) {
415
+ return isRecord(value) &&
416
+ (value.type === "image" || value.type === "video") &&
417
+ typeof value.data === "string" &&
418
+ typeof value.mimeType === "string";
419
+ }
420
+ function piToolResult(value, terminate = false, media = undefined) {
421
+ const details = boundModelOutput(value);
422
+ const text = typeof details === "string" ? details : JSON.stringify(details);
423
+ const result = {
424
+ content: [
425
+ { type: "text", text },
426
+ ...(media ?? [])
427
+ .filter((item) => item.type === "image")
428
+ .map((item) => ({ type: "image", data: item.data, mimeType: item.mimeType })),
429
+ ...toolVideoNotice(media)
430
+ ],
431
+ details
432
+ };
433
+ if (terminate)
434
+ result.terminate = true;
435
+ return result;
436
+ }
437
+ function replacePiToolResult(messages, toolCallId, toolName, value, media) {
438
+ const details = boundModelOutput(value);
439
+ const text = typeof details === "string" ? details : JSON.stringify(details);
440
+ const next = messages.map((message) => ({ ...message }));
441
+ const targetIndex = findToolResultIndex(next, toolCallId);
442
+ const resolvedToolCallId = toolCallId ?? inferLastAssistantToolCallId(next, toolName) ?? `connection:${toolName}`;
443
+ const replacement = {
444
+ role: "toolResult",
445
+ toolCallId: resolvedToolCallId,
446
+ toolName,
447
+ content: [
448
+ { type: "text", text },
449
+ ...(media ?? [])
450
+ .filter((item) => item.type === "image")
451
+ .map((item) => ({ type: "image", data: item.data, mimeType: item.mimeType })),
452
+ ...toolVideoNotice(media)
453
+ ],
454
+ details,
455
+ isError: false,
456
+ timestamp: Date.now()
457
+ };
458
+ if (targetIndex >= 0) {
459
+ next[targetIndex] = replacement;
460
+ return next.slice(0, targetIndex + 1);
461
+ }
462
+ next.push(replacement);
463
+ return next;
464
+ }
465
+ function findToolResultIndex(messages, toolCallId) {
466
+ for (let index = messages.length - 1; index >= 0; index -= 1) {
467
+ const message = messages[index];
468
+ if (!isToolResultMessage(message))
469
+ continue;
470
+ if (!toolCallId || message.toolCallId === toolCallId)
471
+ return index;
472
+ }
473
+ return -1;
474
+ }
475
+ function inferLastAssistantToolCallId(messages, toolName) {
476
+ for (let index = messages.length - 1; index >= 0; index -= 1) {
477
+ const message = messages[index];
478
+ if (!message || message.role !== "assistant")
479
+ continue;
480
+ for (let blockIndex = message.content.length - 1; blockIndex >= 0; blockIndex -= 1) {
481
+ const block = message.content[blockIndex];
482
+ if (block && block.type === "toolCall" && block.name === toolName)
483
+ return block.id;
484
+ }
485
+ }
486
+ return undefined;
487
+ }
488
+ function isToolResultMessage(message) {
489
+ return Boolean(message && typeof message === "object" && "role" in message && message.role === "toolResult");
490
+ }
491
+ function toolVideoNotice(media) {
492
+ const videos = (media ?? []).filter((item) => item.type === "video");
493
+ if (videos.length === 0)
494
+ return [];
495
+ return [{
496
+ type: "text",
497
+ text: `[OpenEve: ${videos.length} video tool result(s) were not sent as native Pi tool-result content. No frames were extracted. Use a video-capable attachment turn or explicitly request a frame-based review.]`
498
+ }];
499
+ }
500
+ function jsonClone(value) {
501
+ return JSON.parse(JSON.stringify(value ?? null));
502
+ }
503
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,gBAAgB,EAejB,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,wBAAwB,EACxB,uBAAuB,EACxB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,aAAa,EACb,qBAAqB,EACrB,2BAA2B,EAC3B,gBAAgB,EAChB,8BAA8B,EAC9B,8BAA8B,EAC9B,mBAAmB,EACnB,iBAAiB,EACjB,gBAAgB,EAChB,cAAc,EACd,cAAc,EAKf,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,kBAAkB,EAClB,uBAAuB,EACvB,qBAAqB,EAItB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,wBAAwB,EACxB,gBAAgB,EAChB,uBAAuB,EACvB,iCAAiC,EACjC,yBAAyB,EAG1B,MAAM,sBAAsB,CAAC;AAG9B,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,CAAC;AAClC,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC;AAEzC;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,UAAsD,EAAE;IACrF,IAAI,aAAiC,CAAC;IACtC,MAAM,aAAa,GAAG,KAAK,EAAE,GAAuC,EAAmB,EAAE;QACvF,IAAI,OAAO,CAAC,MAAM;YAAE,OAAO,OAAO,CAAC,MAAgB,CAAC;QACpD,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,MAAM,EAAE,qBAAqB,EAAE,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,CAAC;YAClE,aAAa,GAAG,MAAM,qBAAqB,CAAC,GAAG,CAAC,CAAC;QACnD,CAAC;QACD,OAAO,aAAa,CAAC;IACvB,CAAC,CAAC;IACF,OAAO;QACL,EAAE,EAAE,aAAa;QACjB,mBAAmB,EAAE,uBAAuB;QAC5C,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG;YACtB,MAAM,EACJ,mBAAmB,EACnB,cAAc,EACf,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,CAAC;YACpC,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC5C,MAAM,eAAe,GAAmB,EAAE,CAAC;YAC3C,IAAI,iBAAqC,CAAC;YAC1C,IAAI,iBAAiB,GAAwB,EAAE,CAAC;YAChD,MAAM,UAAU,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;YACrC,MAAM,UAAU,GAAG,KAAK,IAA+B,EAAE,CACvD,CAAC,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAC/B,WAAW,CAAC,IAAI,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC,UAAU,EAAE,EAAE;gBAChD,gEAAgE;gBAChE,4DAA4D;gBAC5D,IAAI,UAAU,CAAC,MAAM;oBAAE,OAAO;gBAC9B,UAAU,CAAC,MAAM,GAAG,IAAI,CAAC;gBACzB,iBAAiB,GAAG,UAAU,CAAC;YACjC,CAAC,CAAC,CACH,CAAC;YACJ,MAAM,WAAW,GAA0B;gBACzC,MAAM;gBACN,SAAS,EAAE,GAAG,CAAC,SAAS;gBACxB,YAAY,EAAE,GAAG,CAAC,YAAY;gBAC9B,aAAa,EAAE,EAAE;gBACjB,KAAK,EAAE,UAAU;gBACjB,GAAG,EAAE,GAAG,CAAC,GAAG;gBACZ,SAAS,EAAE,GAAG,CAAC,SAAS;gBACxB,oEAAoE;gBACpE,mEAAmE;gBACnE,0DAA0D;gBAC1D,aAAa,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;gBAChF,UAAU,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,EAAE,IAAI,KAAK,CAAC;gBACpE,YAAY,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE;oBAClC,MAAM,GAAG,CAAC,IAAI,CAAC;wBACb,IAAI,EAAE,aAAa;wBACnB,SAAS,EAAE,KAAK,CAAC,gBAAgB;wBACjC,OAAO,EAAE,IAAI,CAAC,OAAO;wBACrB,OAAO,EAAE,IAAI,CAAC,OAAO;wBACrB,KAAK,EAAE,IAAI,CAAC,KAAK;wBACjB,GAAG,CAAC,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;qBAC9D,CAAC,CAAC;gBACL,CAAC;gBACD,gBAAgB,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,EAAE;oBACpD,MAAM,OAAO,GAAsB;wBACjC,IAAI,EAAE,iBAAiB;wBACvB,SAAS,EAAE,KAAK,CAAC,gBAAgB;wBACjC,SAAS,EAAE,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;wBACxD,QAAQ,EAAE,KAAK,CAAC,QAAQ;wBACxB,WAAW,EAAE,SAAS;qBACvB,CAAC;oBACF,IAAI,GAAG,CAAC,cAAc,EAAE,CAAC;wBACvB,MAAM,eAAe,GAAG,mBAAmB,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;wBACpE,4BAA4B,CAAC,eAAe,EAAE,iBAAiB,CAAC,CAAC;wBACjE,OAAO,CAAC,eAAe,GAAG,eAAe,CAAC;oBAC5C,CAAC;oBACD,MAAM,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBAC1B,CAAC;gBACD,OAAO,EAAE,KAAK,EAAE,KAAiB,EAAE,KAAK,EAAE,EAAE;oBAC1C,IAAI,KAAK,CAAC,IAAI,KAAK,gBAAgB,IAAI,KAAK,CAAC,qBAAqB,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;wBACzF,iEAAiE;wBACjE,mCAAmC;wBACnC,MAAM,GAAG,CAAC,IAAI,CAAC;4BACb,IAAI,EAAE,gBAAgB;4BACtB,SAAS,EAAE,KAAK,CAAC,gBAAgB;4BACjC,KAAK,EAAE,KAAK,CAAC,qBAAqB,CAAC,KAAK;yBACzC,CAAC,CAAC;wBACH,OAAO;oBACT,CAAC;oBACD,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;wBACjC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;wBACpC,OAAO;oBACT,CAAC;oBACD,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,WAAW;wBAAE,OAAO;oBAC5E,MAAM,UAAU,GAAG,MAAM,mBAAmB,CAAC,KAAK,CAAC,OAAO,EAAE;wBAC1D,GAAG,EAAE,GAAG,CAAC,GAAG;wBACZ,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;qBACnD,CAAC,CAAC;oBACH,MAAM,GAAG,CAAC,IAAI,CACZ,sBAAsB,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,gBAAgB,EAAE,UAAU,EAAE,GAAG,CAAC,cAAc,KAAK,IAAI,CAAC,CACvG,CAAC;oBACF,IAAI,GAAG,CAAC,qBAAqB,EAAE,CAAC;wBAC9B,MAAM,GAAG,CAAC,qBAAqB,CAAC,cAAc,CAAC,eAAe,EAAE,iBAAiB,EAAE,iBAAiB,CAAC,CAAC,CAAC;oBACzG,CAAC;gBACH,CAAC;aACF,CAAC;YACF,IAAI,GAAG,CAAC,SAAS;gBAAE,WAAW,CAAC,SAAS,GAAG,GAAG,CAAC,SAAS,CAAC;YACzD,IAAI,GAAG,CAAC,aAAa,KAAK,SAAS;gBAAE,WAAW,CAAC,aAAa,GAAG,GAAG,CAAC,aAAa,CAAC;YACnF,IAAI,GAAG,CAAC,MAAM;gBAAE,WAAW,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;YAChD,IAAI,OAAO,CAAC,KAAK;gBAAE,WAAW,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;YACrD,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC5B,MAAM,KAAK,GAAG,mBAAmB,CAAC,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;gBAC5D,iBAAiB,GAAG,KAAK,CAAC,KAAK,CAAC;gBAChC,IAAI,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;gBAC9B,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;oBACrB,QAAQ,GAAG,mBAAmB,CAC5B,QAAQ,EACR,KAAK,CAAC,iBAAiB,EACvB,KAAK,CAAC,UAAU,CAAC,QAAQ,EACzB,KAAK,CAAC,UAAU,CAAC,MAAM,EACvB,KAAK,CAAC,UAAU,CAAC,KAAK,CACvB,CAAC;gBACJ,CAAC;gBACD,eAAe,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC;gBAClC,WAAW,CAAC,QAAQ,GAAG,QAAQ,CAAC;gBAChC,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;oBAChC,0EAA0E;oBAC1E,WAAW,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;oBACpC,MAAM,aAAa,GAAG,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC;oBACxC,iBAAiB,GAAG,CAAC,GAAG,iBAAiB,EAAE,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC;oBACrG,WAAW,CAAC,KAAK,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,EAAE,GAAG,aAAa,CAAC,CAAC;gBACzD,CAAC;qBAAM,CAAC;oBACN,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;wBAAE,WAAW,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;oBAC5D,WAAW,CAAC,IAAI,GAAG,UAAU,CAAC;gBAChC,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,MAAM,eAAe,GAAG,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,OAAO,EAAgB,EAAE,CAAC,CAAC;oBAC1E,IAAI,EAAE,MAAM;oBACZ,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;oBAC1C,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;iBACtB,CAAC,CAAC,CAAC;gBACJ,eAAe,CAAC,IAAI,CAAC,GAAG,eAAe,CAAC,CAAC;gBACzC,WAAW,CAAC,QAAQ,GAAG,eAAe,CAAC;gBACvC,WAAW,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;gBACpC,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;oBAChB,WAAW,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;oBAChC,iBAAiB,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC;gBAC1E,CAAC;YACH,CAAC;YACD,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC,WAAW,CAAC,CAAC;YAC/C,MAAM,MAAM,GAAoB;gBAC9B,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,YAAY,EAAE,cAAc,CAAC,IAAI,CAAC,QAAQ,EAAE,iBAAiB,EAAE,iBAAiB,CAAC;aAClF,CAAC;YACF,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC;gBACtB,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC;YACvB,CAAC;iBAAM,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;gBAC9B,MAAM,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;YAC5C,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,KAAK,CAAC,gBAAgB,CACpB,YAAiC,EACjC,MAA+B,EAC/B,GAAyF;YAEzF,IAAI,YAAY,CAAC,OAAO,KAAK,aAAa;gBAAE,OAAO,SAAS,CAAC;YAC7D,MAAM,KAAK,GAAG,mBAAmB,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;YACtD,MAAM,MAAM,GAAG,gBAAgB,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAAC,kBAAkB,CAAC,CAAC;YACpG,IAAI,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;YAC/B,IAAI,SAAS,GAAG,KAAK,CAAC;YACtB,IAAI,YAAgC,CAAC;YACrC,uEAAuE;YACvE,sEAAsE;YACtE,MAAM,UAAU,GAAG,MAAM,CAAC,iBAAiB,GAAG,CAAC;gBAC7C,CAAC,CAAC,wBAAwB,CAAC,QAAQ,CAAC;gBACpC,CAAC,CAAC,MAAM,CAAC,eAAe,IAAI,wBAAwB,CAAC,QAAQ,CAAC,CAAC;YACjE,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC5C,MAAM,MAAM,GAAG,uBAAuB,CAAC,MAAM,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;YAC9D,IAAI,UAAU,GAAG,MAAM,GAAG,MAAM,CAAC,aAAa,EAAE,CAAC;gBAC/C,MAAM,iBAAiB,GAAG,MAAM,mBAAmB,CAAC;oBAClD,QAAQ;oBACR,MAAM;oBACN,SAAS,EAAE,GAAG,CAAC,SAAS;oBACxB,aAAa,EAAE,MAAM,CAAC,aAAa;oBACnC,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;oBACzC,MAAM,EAAE,GAAG,CAAC,MAAM;iBACnB,CAAC,CAAC;gBACH,IAAI,CAAC,iBAAiB,EAAE,CAAC;oBACvB,MAAM,IAAI,KAAK,CAAC,qEAAqE,CAAC,CAAC;gBACzF,CAAC;gBACD,QAAQ,GAAG,iBAAiB,CAAC;gBAC7B,SAAS,GAAG,IAAI,CAAC;gBACjB,YAAY,GAAG,UAAU,CAAC;YAC5B,CAAC;YACD,wEAAwE;YACxE,yEAAyE;YACzE,OAAO;gBACL,YAAY,EAAE,cAAc,CAAC,QAAQ,EAAE,SAAS,EAAE,EAAE,CAAC;gBACrD,SAAS;gBACT,iBAAiB,EAAE,MAAM,CAAC,iBAAiB;gBAC3C,GAAG,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACxD,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC;AAED,wFAAwF;AACxF,MAAM,UAAU,oBAAoB,CAAC,IAAgB;IACnD,MAAM,KAAK,GAAe,EAAE,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IAC1F,IAAI,OAAO,IAAI,CAAC,iBAAiB,KAAK,QAAQ;QAAE,KAAK,CAAC,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,CAAC;IACjG,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,uBAAuB,EAAE,KAAK,EAAE,CAAC;AAC7E,CAAC;AAED,SAAS,cAAc,CACrB,QAAwB,EACxB,iBAAqC,EACrC,QAA6B,EAAE;IAE/B,MAAM,KAAK,GAAG,SAAS,CAAC,EAAE,QAAQ,EAAa,CAAe,CAAC;IAC/D,IAAI,iBAAiB;QAAE,KAAK,CAAC,iBAAiB,GAAG,iBAAiB,CAAC;IACnE,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;QAAE,KAAK,CAAC,KAAK,GAAG,SAAS,CAAC,KAAK,CAAU,CAAC;IAC9D,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,uBAAuB,EAAE,KAAK,EAAE,CAAC;AAC7E,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,6BAA6B,CAAC,YAI7C;IACC,IAAI,YAAY,CAAC,OAAO,KAAK,aAAa;QAAE,OAAO,SAAS,CAAC;IAC7D,IAAI,CAAC;QACH,MAAM,EAAE,QAAQ,EAAE,GAAG,mBAAmB,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;QAC7D,MAAM,IAAI,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7B,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;YAAE,OAAO,SAAS,CAAC;QACzF,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO;aACtB,MAAM,CAAC,CAAC,KAAK,EAA2C,EAAE,CACzD,OAAO,CAAC,KAAK,CAAC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAK,KAA4B,CAAC,IAAI,KAAK,MAAM;YAC5F,OAAQ,KAA4B,CAAC,IAAI,KAAK,QAAQ,CAAC;aACxD,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;aAC1B,IAAI,CAAC,EAAE,CAAC,CAAC;QACZ,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;IACnD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,mBAAmB,CAC1B,KAAiB;IAEjB,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAE,KAAK,CAAC,QAAsC,CAAC,CAAC,CAAC,EAAE,CAAC;IACpG,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;QACtC,CAAC,CAAE,KAAK,CAAC,KAAmB,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACvF,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,GAAG,GAAyF;QAChG,QAAQ;QACR,KAAK;KACN,CAAC;IACF,IAAI,OAAO,KAAK,CAAC,iBAAiB,KAAK,QAAQ;QAAE,GAAG,CAAC,iBAAiB,GAAG,KAAK,CAAC,iBAAiB,CAAC;IACjG,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,WAAW,CAClB,IAA2B,EAC3B,GAAwB,EACxB,UAA+B,EAC/B,OAAiD;IAEjD,MAAM,SAAS,GAAmB;QAChC,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,KAAK,EAAE,IAAI,CAAC,IAAI;QAChB,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,UAAU,EAAE,IAAI,CAAC,WAAoB;QACrC,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAqC,EAAE;YACvE,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC;gBACtB,oEAAoE;gBACpE,gEAAgE;gBAChE,eAAe;gBACf,OAAO,YAAY,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,2DAA2D,EAAE,EAAE,IAAI,CAAC,CAAC;YACpH,CAAC;YACD,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,WAAW,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;YACtF,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBAC7B,mEAAmE;gBACnE,mEAAmE;gBACnE,mEAAmE;gBACnE,OAAO,CAAC,UAAU,CAAC,CAAC;gBACpB,OAAO,YAAY,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;YAC3D,CAAC;YACD,OAAO,YAAY,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;QAC5D,CAAC;KACF,CAAC;IACF,wEAAwE;IACxE,0EAA0E;IAC1E,eAAe;IACf,IAAI,IAAI,CAAC,SAAS,KAAK,YAAY;QAAE,SAAS,CAAC,aAAa,GAAG,YAAY,CAAC;IAC5E,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,sBAAsB,CAC7B,OAA2B,EAC3B,SAAiB,EACjB,UAKC,EACD,cAAuB;IAEvB,MAAM,KAAK,GAAsB;QAC/B,IAAI,EAAE,oBAAoB;QAC1B,SAAS;QACT,aAAa,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,MAAM;QAClF,KAAK,EAAE,UAAU,CAAC,KAAK;QACvB,WAAW,EAAE,UAAU,CAAC,WAAW;KACpC,CAAC;IACF,IAAI,OAAO,CAAC,UAAU,KAAK,SAAS;QAAE,KAAK,CAAC,YAAY,GAAG,OAAO,CAAC,UAAU,CAAC;IAC9E,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS;QAAE,KAAK,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IACtE,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,IAAI,OAAO,CAAC,KAAK,CAAC;IAC7D,IAAI,aAAa,KAAK,SAAS;QAAE,KAAK,CAAC,aAAa,GAAG,aAAa,CAAC;IACrE,IAAI,UAAU,CAAC,iBAAiB;QAAE,KAAK,CAAC,iBAAiB,GAAG,UAAU,CAAC,iBAAiB,CAAC;IACzF,IAAI,UAAU,CAAC,eAAe;QAAE,KAAK,CAAC,eAAe,GAAG,UAAU,CAAC,eAAe,CAAC;IACnF,IAAI,cAAc,EAAE,CAAC;QACnB,MAAM,IAAI,GAAG,kBAAkB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACjD,MAAM,SAAS,GAAG,uBAAuB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC3D,MAAM,eAAe,GAA4D,EAAE,CAAC;QACpF,IAAI,IAAI;YAAE,eAAe,CAAC,IAAI,GAAG,IAAI,CAAC;QACtC,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC;YAAE,eAAe,CAAC,SAAS,GAAG,SAAS,CAAC;QAChE,IAAI,eAAe,CAAC,IAAI,KAAK,SAAS,IAAI,eAAe,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YAClF,KAAK,CAAC,eAAe,GAAG,eAAe,CAAC;QAC1C,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAUD,kFAAkF;AAClF,SAAS,mBAAmB,CAAC,QAAkC;IAC7D,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC;AAChE,CAAC;AAED,SAAS,kBAAkB,CAAC,OAAsB;IAChD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;IAC1G,MAAM,GAAG,GAA0B,EAAE,IAAI,EAAE,CAAC;IAC5C,MAAM,IAAI,GAAG,kBAAkB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACjD,IAAI,IAAI;QAAE,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC;IAC1B,MAAM,KAAK,GAAG,mBAAmB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACnD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;QAAE,GAAG,CAAC,KAAK,GAAG,KAAK,CAAC;IACxC,MAAM,SAAS,GAAG,uBAAuB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3D,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC;QAAE,GAAG,CAAC,SAAS,GAAG,SAAS,CAAC;IACpD,IAAI,OAAO,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC;QACjD,GAAG,CAAC,UAAU;YACZ,OAAO,OAAO,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC;IACrG,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,kBAAkB,CAAC,OAAgB;IAC1C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;QAAE,OAAO,EAAE,CAAC;IACvC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;YAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACzG,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACxB,CAAC;AAED,SAAS,uBAAuB,CAAC,OAAgB;IAC/C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;QAAE,OAAO,EAAE,CAAC;IACvC,MAAM,KAAK,GAA6B,EAAE,CAAC;IAC3C,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACnF,MAAM,IAAI,GAA2B,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC;YACxF,IAAI,OAAO,KAAK,CAAC,EAAE,KAAK,QAAQ;gBAAE,IAAI,CAAC,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC;YACrD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnB,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,mBAAmB,CAAC,OAAgB;IAC3C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;QAAE,OAAO,EAAE,CAAC;IACvC,MAAM,KAAK,GAAgD,EAAE,CAAC;IAC9D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,IAAI,OAAO,KAAK,CAAC,QAAQ,KAAK,QAAQ;YAAE,SAAS;QAC/F,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC1D,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,4BAA4B,CACnC,QAAiC,EACjC,KAA0B;IAE1B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAC/B,IAAI,IAAuC,CAAC;IAC5C,KAAK,IAAI,KAAK,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QAC7D,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE,IAAI,KAAK,MAAM,EAAE,CAAC;YACrC,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;YACvB,MAAM;QACR,CAAC;IACH,CAAC;IACD,IAAI,CAAC,IAAI;QAAE,OAAO;IAClB,IAAI,CAAC,KAAK,GAAG;QACX,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;QACrB,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YACpB,MAAM,QAAQ,GAAwD;gBACpE,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,QAAQ,EAAE,IAAI,CAAC,QAAQ;aACxB,CAAC;YACF,IAAI,IAAI,CAAC,IAAI;gBAAE,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;YACzC,IAAI,IAAI,CAAC,IAAI;gBAAE,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;YACzC,OAAO,QAAQ,CAAC;QAClB,CAAC,CAAC;KACH,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,CAAC,KAAK,CAAC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAc;IACzC,OAAO,QAAQ,CAAC,KAAK,CAAC;QACpB,CAAC,KAAK,CAAC,IAAI,KAAK,OAAO,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC;QAClD,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;QAC9B,OAAO,KAAK,CAAC,QAAQ,KAAK,QAAQ,CAAC;AACvC,CAAC;AAED,SAAS,YAAY,CACnB,KAAc,EACd,SAAS,GAAG,KAAK,EACjB,QAAyC,SAAS;IAElD,MAAM,OAAO,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;IACxC,MAAM,IAAI,GAAG,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IAC7E,MAAM,MAAM,GAA6B;QACvC,OAAO,EAAE;YACP,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;YACtB,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;iBACb,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC;iBACvC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,OAAgB,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;YACxF,GAAG,eAAe,CAAC,KAAK,CAAC;SAC1B;QACD,OAAO;KACR,CAAC;IACF,IAAI,SAAS;QAAE,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC;IACvC,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,mBAAmB,CAC1B,QAAwB,EACxB,UAA8B,EAC9B,QAAgB,EAChB,KAAc,EACd,KAAsC;IAEtC,MAAM,OAAO,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;IACxC,MAAM,IAAI,GAAG,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IAC7E,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,OAAO,EAAE,CAAC,CAAmB,CAAC;IAC3E,MAAM,WAAW,GAAG,mBAAmB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAC1D,MAAM,kBAAkB,GAAG,UAAU,IAAI,4BAA4B,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,cAAc,QAAQ,EAAE,CAAC;IAClH,MAAM,WAAW,GAAiB;QAChC,IAAI,EAAE,YAAY;QAClB,UAAU,EAAE,kBAAkB;QAC9B,QAAQ;QACR,OAAO,EAAE;YACP,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;YACtB,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;iBACb,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC;iBACvC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,OAAgB,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;YACxF,GAAG,eAAe,CAAC,KAAK,CAAC;SAC1B;QACD,OAAO;QACP,OAAO,EAAE,KAAK;QACd,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;KACtB,CAAC;IACF,IAAI,WAAW,IAAI,CAAC,EAAE,CAAC;QACrB,IAAI,CAAC,WAAW,CAAC,GAAG,WAAW,CAAC;QAChC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,GAAG,CAAC,CAAC,CAAC;IACxC,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACvB,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,mBAAmB,CAAC,QAAwB,EAAE,UAA8B;IACnF,KAAK,IAAI,KAAK,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QAC7D,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;QAChC,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC;YAAE,SAAS;QAC5C,IAAI,CAAC,UAAU,IAAI,OAAO,CAAC,UAAU,KAAK,UAAU;YAAE,OAAO,KAAK,CAAC;IACrE,CAAC;IACD,OAAO,CAAC,CAAC,CAAC;AACZ,CAAC;AAED,SAAS,4BAA4B,CAAC,QAAwB,EAAE,QAAgB;IAC9E,KAAK,IAAI,KAAK,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QAC7D,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;QAChC,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW;YAAE,SAAS;QACvD,KAAK,IAAI,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,UAAU,IAAI,CAAC,EAAE,UAAU,IAAI,CAAC,EAAE,CAAC;YACnF,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YAC1C,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ;gBAAE,OAAO,KAAK,CAAC,EAAE,CAAC;QACrF,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,mBAAmB,CAAC,OAAiC;IAC5D,OAAO,OAAO,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,MAAM,IAAI,OAAO,IAAI,OAAO,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC;AAC/G,CAAC;AAED,SAAS,eAAe,CAAC,KAAsC;IAC7D,MAAM,MAAM,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC;IACrE,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACnC,OAAO,CAAC;YACN,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,aAAa,MAAM,CAAC,MAAM,kLAAkL;SACnN,CAAC,CAAC;AACL,CAAC;AAED,SAAS,SAAS,CAAI,KAAQ;IAC5B,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,IAAI,CAAC,CAAM,CAAC;AACxD,CAAC"}