@mongodb-js/agent-engine-sdk-langgraph 0.11.3

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.
Files changed (128) hide show
  1. package/CHANGELOG.md +39 -0
  2. package/LICENSE.md +201 -0
  3. package/README.md +149 -0
  4. package/dist/agent.d.ts +53 -0
  5. package/dist/agent.d.ts.map +1 -0
  6. package/dist/agent.js +508 -0
  7. package/dist/agent.js.map +1 -0
  8. package/dist/backends/tool_sandbox.d.ts +15 -0
  9. package/dist/backends/tool_sandbox.d.ts.map +1 -0
  10. package/dist/backends/tool_sandbox.js +15 -0
  11. package/dist/backends/tool_sandbox.js.map +1 -0
  12. package/dist/backends/toolpod.d.ts +68 -0
  13. package/dist/backends/toolpod.d.ts.map +1 -0
  14. package/dist/backends/toolpod.js +451 -0
  15. package/dist/backends/toolpod.js.map +1 -0
  16. package/dist/call_interrupt.d.ts +20 -0
  17. package/dist/call_interrupt.d.ts.map +1 -0
  18. package/dist/call_interrupt.js +23 -0
  19. package/dist/call_interrupt.js.map +1 -0
  20. package/dist/checkpoint_branch.d.ts +58 -0
  21. package/dist/checkpoint_branch.d.ts.map +1 -0
  22. package/dist/checkpoint_branch.js +239 -0
  23. package/dist/checkpoint_branch.js.map +1 -0
  24. package/dist/checkpointer.d.ts +21 -0
  25. package/dist/checkpointer.d.ts.map +1 -0
  26. package/dist/checkpointer.js +31 -0
  27. package/dist/checkpointer.js.map +1 -0
  28. package/dist/deep_agent.d.ts +49 -0
  29. package/dist/deep_agent.d.ts.map +1 -0
  30. package/dist/deep_agent.js +110 -0
  31. package/dist/deep_agent.js.map +1 -0
  32. package/dist/deep_agent_checkpointer.d.ts +11 -0
  33. package/dist/deep_agent_checkpointer.d.ts.map +1 -0
  34. package/dist/deep_agent_checkpointer.js +19 -0
  35. package/dist/deep_agent_checkpointer.js.map +1 -0
  36. package/dist/deep_agent_task.d.ts +26 -0
  37. package/dist/deep_agent_task.d.ts.map +1 -0
  38. package/dist/deep_agent_task.js +49 -0
  39. package/dist/deep_agent_task.js.map +1 -0
  40. package/dist/durable_deep_agent.d.ts +23 -0
  41. package/dist/durable_deep_agent.d.ts.map +1 -0
  42. package/dist/durable_deep_agent.js +176 -0
  43. package/dist/durable_deep_agent.js.map +1 -0
  44. package/dist/durable_message_identity.d.ts +5 -0
  45. package/dist/durable_message_identity.d.ts.map +1 -0
  46. package/dist/durable_message_identity.js +106 -0
  47. package/dist/durable_message_identity.js.map +1 -0
  48. package/dist/durable_session.d.ts +30 -0
  49. package/dist/durable_session.d.ts.map +1 -0
  50. package/dist/durable_session.js +400 -0
  51. package/dist/durable_session.js.map +1 -0
  52. package/dist/durable_subgraphs.d.ts +13 -0
  53. package/dist/durable_subgraphs.d.ts.map +1 -0
  54. package/dist/durable_subgraphs.js +82 -0
  55. package/dist/durable_subgraphs.js.map +1 -0
  56. package/dist/durable_tools.d.ts +12 -0
  57. package/dist/durable_tools.d.ts.map +1 -0
  58. package/dist/durable_tools.js +41 -0
  59. package/dist/durable_tools.js.map +1 -0
  60. package/dist/execution_session.d.ts +63 -0
  61. package/dist/execution_session.d.ts.map +1 -0
  62. package/dist/execution_session.js +300 -0
  63. package/dist/execution_session.js.map +1 -0
  64. package/dist/index.d.ts +19 -0
  65. package/dist/index.d.ts.map +1 -0
  66. package/dist/index.js +17 -0
  67. package/dist/index.js.map +1 -0
  68. package/dist/llm_adapter.d.ts +41 -0
  69. package/dist/llm_adapter.d.ts.map +1 -0
  70. package/dist/llm_adapter.js +177 -0
  71. package/dist/llm_adapter.js.map +1 -0
  72. package/dist/messages.d.ts +56 -0
  73. package/dist/messages.d.ts.map +1 -0
  74. package/dist/messages.js +592 -0
  75. package/dist/messages.js.map +1 -0
  76. package/dist/node_logger_adapter.d.ts +51 -0
  77. package/dist/node_logger_adapter.d.ts.map +1 -0
  78. package/dist/node_logger_adapter.js +163 -0
  79. package/dist/node_logger_adapter.js.map +1 -0
  80. package/dist/platform_checkpointer.d.ts +70 -0
  81. package/dist/platform_checkpointer.d.ts.map +1 -0
  82. package/dist/platform_checkpointer.js +252 -0
  83. package/dist/platform_checkpointer.js.map +1 -0
  84. package/dist/query.d.ts +103 -0
  85. package/dist/query.d.ts.map +1 -0
  86. package/dist/query.js +623 -0
  87. package/dist/query.js.map +1 -0
  88. package/dist/runtime.d.ts +336 -0
  89. package/dist/runtime.d.ts.map +1 -0
  90. package/dist/runtime.js +881 -0
  91. package/dist/runtime.js.map +1 -0
  92. package/dist/secure_llm.d.ts +93 -0
  93. package/dist/secure_llm.d.ts.map +1 -0
  94. package/dist/secure_llm.js +423 -0
  95. package/dist/secure_llm.js.map +1 -0
  96. package/dist/session_factory.d.ts +6 -0
  97. package/dist/session_factory.d.ts.map +1 -0
  98. package/dist/session_factory.js +29 -0
  99. package/dist/session_factory.js.map +1 -0
  100. package/dist/session_fork.d.ts +76 -0
  101. package/dist/session_fork.d.ts.map +1 -0
  102. package/dist/session_fork.js +428 -0
  103. package/dist/session_fork.js.map +1 -0
  104. package/dist/subagents.d.ts +37 -0
  105. package/dist/subagents.d.ts.map +1 -0
  106. package/dist/subagents.js +67 -0
  107. package/dist/subagents.js.map +1 -0
  108. package/dist/suspend.d.ts +27 -0
  109. package/dist/suspend.d.ts.map +1 -0
  110. package/dist/suspend.js +87 -0
  111. package/dist/suspend.js.map +1 -0
  112. package/dist/thread_id.d.ts +30 -0
  113. package/dist/thread_id.d.ts.map +1 -0
  114. package/dist/thread_id.js +69 -0
  115. package/dist/thread_id.js.map +1 -0
  116. package/dist/workflow_json.d.ts +11 -0
  117. package/dist/workflow_json.d.ts.map +1 -0
  118. package/dist/workflow_json.js +49 -0
  119. package/dist/workflow_json.js.map +1 -0
  120. package/dist/workflow_message.d.ts +11 -0
  121. package/dist/workflow_message.d.ts.map +1 -0
  122. package/dist/workflow_message.js +179 -0
  123. package/dist/workflow_message.js.map +1 -0
  124. package/dist/workflow_state.d.ts +7 -0
  125. package/dist/workflow_state.d.ts.map +1 -0
  126. package/dist/workflow_state.js +62 -0
  127. package/dist/workflow_state.js.map +1 -0
  128. package/package.json +66 -0
@@ -0,0 +1,176 @@
1
+ /**
2
+ * Durable operation-path boundaries for Deep Agent task delegation.
3
+ *
4
+ * Deep Agent exposes subagent dispatch through the public `task` tool and
5
+ * middleware hooks, rather than as a compiled child graph:
6
+ * https://docs.langchain.com/oss/javascript/deepagents/subagents
7
+ *
8
+ * Same-step `task` siblings stamp ToolCall-id ordinals after FinalizeStep.
9
+ * Stamping in `afterModel` would key those ordinals to the model step, which
10
+ * FinalizeStep then leaves behind.
11
+ *
12
+ * Port of `durable_deep_agent.py`.
13
+ */
14
+ import { AsyncLocalStorage } from "node:async_hooks";
15
+ import { createMiddleware } from "langchain";
16
+ import { isHumanMessage, isToolMessage, } from "@langchain/core/messages";
17
+ import { childOperationBoundaryScope, currentAttemptContext, preallocateChildOperationOrdinals, currentPendingChildOperationBatch, setPendingChildOperationBatch, } from "@mongodb-js/agent-engine-runner-shared";
18
+ import { parseTaskCall } from "./deep_agent_task.js";
19
+ import { UnsupportedDurableGraphError } from "./platform_checkpointer.js";
20
+ const activeTaskCallId = new AsyncLocalStorage();
21
+ function messagesFromState(state) {
22
+ if (state === null || typeof state !== "object")
23
+ return [];
24
+ const messages = state.messages;
25
+ return Array.isArray(messages) ? messages : [];
26
+ }
27
+ /**
28
+ * Assign a deterministic id to one message. LangChain's serializer emits only
29
+ * keys present in `lc_kwargs`, so a late-added `id` must be mirrored there or
30
+ * checkpointed messages silently lose it (same as `assignBaseMessageId`).
31
+ */
32
+ function assignMessageId(message, id) {
33
+ message.id = id;
34
+ const kwargs = message.lc_kwargs;
35
+ if (kwargs !== undefined && kwargs !== null && typeof kwargs === "object") {
36
+ kwargs["id"] = id;
37
+ }
38
+ }
39
+ /**
40
+ * Replace Deep Agent's generated message ids before LangGraph persists them.
41
+ * No-op outside a task scope, so native sessions keep provider ids.
42
+ */
43
+ export function stampDeepAgentMessageIds(messages) {
44
+ const taskCallId = activeTaskCallId.getStore();
45
+ if (taskCallId === undefined)
46
+ return;
47
+ messages.forEach((message, index) => {
48
+ // isHumanMessage/isToolMessage key off getType(), matching messages a
49
+ // nested graph created through its own @langchain/core module copy —
50
+ // instanceof would miss those.
51
+ if (isHumanMessage(message)) {
52
+ assignMessageId(message, `durable-deep-agent-input:${taskCallId}:${index}`);
53
+ }
54
+ else if (isToolMessage(message)) {
55
+ assignMessageId(message, `durable-deep-agent-tool-result:${taskCallId}:${message.tool_call_id}`);
56
+ }
57
+ });
58
+ }
59
+ function stampTaskResultMessageId(result, toolCallId) {
60
+ if (isToolMessage(result)) {
61
+ assignMessageId(result, `durable-deep-agent-task-result:${toolCallId}`);
62
+ return;
63
+ }
64
+ const update = result.update;
65
+ if (update === null || typeof update !== "object" || Array.isArray(update)) {
66
+ return;
67
+ }
68
+ const messages = update["messages"];
69
+ if (!Array.isArray(messages))
70
+ return;
71
+ for (const message of messages) {
72
+ if (isToolMessage(message) && message.tool_call_id === toolCallId) {
73
+ assignMessageId(message, `durable-deep-agent-task-result:${toolCallId}`);
74
+ }
75
+ }
76
+ }
77
+ export function createDurableDeepAgentMiddleware(options) {
78
+ const unsupportedSubagentNames = options.unsupportedSubagentNames ?? new Set();
79
+ const boundaryFromTask = (toolCall) => {
80
+ const taskCall = parseTaskCall(toolCall);
81
+ if (taskCall === null)
82
+ return null;
83
+ if (taskCall.toolCallId === "") {
84
+ throw new Error("durable Deep Agent task requires a non-empty tool call ID");
85
+ }
86
+ if (taskCall.subagentName === "") {
87
+ throw new Error("durable Deep Agent task requires a non-empty subagent type");
88
+ }
89
+ if (unsupportedSubagentNames.has(taskCall.subagentName)) {
90
+ throw new UnsupportedDurableGraphError(`compiled Deep Agent subagent '${taskCall.subagentName}' must use ` +
91
+ "checkpointer=None; independent child checkpointers are not supported " +
92
+ "during durable execution");
93
+ }
94
+ return {
95
+ name: taskCall.subagentName,
96
+ occurrenceKey: taskCall.toolCallId,
97
+ };
98
+ };
99
+ const taskBoundary = (toolCall) => {
100
+ if (currentAttemptContext() === null)
101
+ return null;
102
+ return boundaryFromTask(toolCall);
103
+ };
104
+ const taskBoundariesFromState = (state) => {
105
+ const messages = messagesFromState(state);
106
+ if (messages.length === 0)
107
+ return [];
108
+ const last = messages[messages.length - 1];
109
+ const toolCalls = last?.tool_calls ?? [];
110
+ if (!Array.isArray(toolCalls))
111
+ return [];
112
+ const boundaries = [];
113
+ for (const toolCall of toolCalls) {
114
+ const candidate = boundaryFromTask(toolCall);
115
+ if (candidate !== null)
116
+ boundaries.push(candidate);
117
+ }
118
+ return boundaries;
119
+ };
120
+ const pendingBoundaries = (state) => {
121
+ const fromState = taskBoundariesFromState(state);
122
+ if (fromState.length > 0)
123
+ return fromState;
124
+ return currentPendingChildOperationBatch();
125
+ };
126
+ const preallocatePendingTaskBatch = (toolCall, state) => {
127
+ // Phase 2: stamp on the ToolNode superstep, after FinalizeStep advanced
128
+ // the root step counter. Skip if this wrap is not in the stashed batch
129
+ // (sequential later-step task calls must first-seen-allocate).
130
+ if (currentAttemptContext() === null)
131
+ return;
132
+ const current = boundaryFromTask(toolCall);
133
+ if (current === null)
134
+ return;
135
+ const pending = pendingBoundaries(state);
136
+ if (pending.length === 0 ||
137
+ !pending.some((candidate) => candidate.name === current.name &&
138
+ candidate.occurrenceKey === current.occurrenceKey)) {
139
+ return;
140
+ }
141
+ preallocateChildOperationOrdinals(pending);
142
+ setPendingChildOperationBatch([]);
143
+ };
144
+ return createMiddleware({
145
+ name: "durableDeepAgentMiddleware",
146
+ afterModel: (state) => {
147
+ // Phase 1: validate and stash. Stamping here would key ordinals to the
148
+ // model step, which FinalizeStep then leaves behind. Mutate the
149
+ // attempt-scoped holder so Pregel worker copies see the batch.
150
+ if (currentAttemptContext() === null)
151
+ return undefined;
152
+ setPendingChildOperationBatch(taskBoundariesFromState(state));
153
+ return undefined;
154
+ },
155
+ wrapToolCall: (request, handler) => {
156
+ preallocatePendingTaskBatch(request.toolCall, request.state);
157
+ const boundary = taskBoundary(request.toolCall);
158
+ if (boundary === null)
159
+ return handler(request);
160
+ return activeTaskCallId.run(boundary.occurrenceKey, () => {
161
+ const result = childOperationBoundaryScope(boundary, () => handler(request));
162
+ // Both branches may be a promise; stamp after settlement so the
163
+ // returned Command/ToolMessage carries the deterministic id.
164
+ if (result instanceof Promise) {
165
+ return result.then((settled) => {
166
+ stampTaskResultMessageId(settled, boundary.occurrenceKey);
167
+ return settled;
168
+ });
169
+ }
170
+ stampTaskResultMessageId(result, boundary.occurrenceKey);
171
+ return result;
172
+ });
173
+ },
174
+ });
175
+ }
176
+ //# sourceMappingURL=durable_deep_agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"durable_deep_agent.js","sourceRoot":"","sources":["../src/durable_deep_agent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /** Stable identities for messages emitted by durable LangGraph nodes. */
2
+ import { type CompiledStateGraph } from "@langchain/langgraph";
3
+ /** Stamp missing durable message IDs before named LangGraph reducers run. */
4
+ export declare function installDurableMessageIdentity(graph: CompiledStateGraph<unknown, unknown>): void;
5
+ //# sourceMappingURL=durable_message_identity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"durable_message_identity.d.ts","sourceRoot":"","sources":["../src/durable_message_identity.ts"],"names":[],"mappings":"AAAA,yEAAyE;AAWzE,OAAO,EAKL,KAAK,kBAAkB,EACxB,MAAM,sBAAsB,CAAC;AAsI9B,6EAA6E;AAC7E,wBAAgB,6BAA6B,CAC3C,KAAK,EAAE,kBAAkB,CAAC,OAAO,EAAE,OAAO,CAAC,GAC1C,IAAI,CAgCN"}
@@ -0,0 +1,106 @@
1
+ /** Stable identities for messages emitted by durable LangGraph nodes. */
2
+ import { createHash } from "node:crypto";
3
+ import { RemoveMessage, coerceMessageLikeToMessage, } from "@langchain/core/messages";
4
+ import { RunnableLambda } from "@langchain/core/runnables";
5
+ import { Overwrite, isCommand, messagesStateReducer, } from "@langchain/langgraph";
6
+ import { currentAttemptContext, currentOperationPath, currentStepOrdinal, } from "@mongodb-js/agent-engine-runner-shared";
7
+ const installedNodes = new WeakSet();
8
+ function durableMessageId(nodeName, outputPath) {
9
+ const attempt = currentAttemptContext();
10
+ if (attempt === null) {
11
+ throw new Error("durable message identity requires an active attempt");
12
+ }
13
+ const { executionId } = attempt.workflowIdentity;
14
+ const operationPath = currentOperationPath().segments.map((segment) => [
15
+ segment.name,
16
+ segment.ordinal.toString(),
17
+ ]);
18
+ const producer = JSON.stringify([operationPath, nodeName, outputPath]);
19
+ const producerHash = createHash("sha256").update(producer).digest("hex");
20
+ return `durable-message:${executionId}:${currentStepOrdinal()}:${producerHash}`;
21
+ }
22
+ function assignBaseMessageId(message, nodeName, path) {
23
+ if ((message.id === null || message.id === undefined) &&
24
+ !RemoveMessage.isInstance(message)) {
25
+ const id = durableMessageId(nodeName, path);
26
+ message.id = id;
27
+ message.lc_kwargs.id = id;
28
+ }
29
+ }
30
+ function assignMessageId(value, nodeName, path) {
31
+ const message = coerceMessageLikeToMessage(value);
32
+ assignBaseMessageId(message, nodeName, path);
33
+ return message;
34
+ }
35
+ function assignMessageUpdateIds(value, nodeName, path) {
36
+ if (Overwrite.isInstance(value) && "__overwrite__" in value) {
37
+ const overwrite = value;
38
+ const normalized = assignMessageUpdateIds(overwrite.__overwrite__, nodeName, [...path, "__overwrite__"]);
39
+ return value instanceof Overwrite
40
+ ? new Overwrite(normalized)
41
+ : { ...overwrite, __overwrite__: normalized };
42
+ }
43
+ if (Array.isArray(value)) {
44
+ return value.map((item, index) => assignMessageId(item, nodeName, [...path, index]));
45
+ }
46
+ return assignMessageId(value, nodeName, path);
47
+ }
48
+ function assignStateUpdateIds(value, nodeName, path, messageChannels) {
49
+ if (value === null || typeof value !== "object")
50
+ return value;
51
+ const update = value;
52
+ for (const channel of messageChannels) {
53
+ if (channel in update) {
54
+ update[channel] = assignMessageUpdateIds(update[channel], nodeName, [
55
+ ...path,
56
+ channel,
57
+ ]);
58
+ }
59
+ }
60
+ return update;
61
+ }
62
+ function withDurableMessageIdentity(output, nodeName, messageChannels) {
63
+ if (currentAttemptContext() === null)
64
+ return output;
65
+ if (isCommand(output)) {
66
+ const command = output;
67
+ if (command.update !== null &&
68
+ typeof command.update === "object" &&
69
+ !Array.isArray(command.update)) {
70
+ assignStateUpdateIds(command.update, nodeName, ["update"], messageChannels);
71
+ }
72
+ // Tuple-pair and implicit-root updates remain LangGraph-owned shapes.
73
+ return command;
74
+ }
75
+ return assignStateUpdateIds(output, nodeName, [], messageChannels);
76
+ }
77
+ /** Stamp missing durable message IDs before named LangGraph reducers run. */
78
+ export function installDurableMessageIdentity(graph) {
79
+ const source = graph;
80
+ const discovered = source.getSubgraphs?.call(graph, undefined, true);
81
+ const graphs = [
82
+ ...(discovered === undefined
83
+ ? []
84
+ : [...discovered].map(([, subgraph]) => subgraph)),
85
+ graph,
86
+ ];
87
+ for (const compiled of graphs) {
88
+ const { channels, nodes } = compiled;
89
+ if (nodes === undefined)
90
+ continue;
91
+ const messageChannels = new Set(Object.entries(channels ?? {})
92
+ .filter(([name, channel]) => name !== "__root__" && channel.operator === messagesStateReducer)
93
+ .map(([name]) => name));
94
+ if (messageChannels.size === 0)
95
+ continue;
96
+ for (const [nodeName, node] of Object.entries(nodes)) {
97
+ if (nodeName.startsWith("__") || installedNodes.has(node))
98
+ continue;
99
+ node.bound = node.bound.pipe(new RunnableLambda({
100
+ func: (output) => withDurableMessageIdentity(output, nodeName, messageChannels),
101
+ }));
102
+ installedNodes.add(node);
103
+ }
104
+ }
105
+ }
106
+ //# sourceMappingURL=durable_message_identity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"durable_message_identity.js","sourceRoot":"","sources":["../src/durable_message_identity.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /** OE-attempt-scoped LangGraph session behavior. */
2
+ import type { BaseMessage } from "@langchain/core/messages";
3
+ import type { RunnableConfig } from "@langchain/core/runnables";
4
+ import { Command, type CompiledStateGraph, type Interrupt } from "@langchain/langgraph";
5
+ import type { AgentInput, AgentOutput, StreamEvent, RequestContext } from "@mongodb-js/agent-engine-sdk";
6
+ import { type AttemptContext } from "@mongodb-js/agent-engine-runner-shared";
7
+ import { ExecutionSession, type PreparedRun, type SessionOptions } from "./execution_session.js";
8
+ import type { PlatformCheckpointer } from "./platform_checkpointer.js";
9
+ export interface DurableExecution {
10
+ readonly attempt: AttemptContext;
11
+ readonly checkpointer: PlatformCheckpointer;
12
+ readonly executionId: string;
13
+ }
14
+ export declare class DurableSession extends ExecutionSession {
15
+ readonly resumed: boolean;
16
+ private readonly attempt;
17
+ private readonly checkpointer;
18
+ private readonly executionId;
19
+ private readonly resumeActivityIds;
20
+ private resumeFrontierSettled;
21
+ constructor(graph: CompiledStateGraph<unknown, unknown>, ctx: RequestContext, input: AgentInput, options: SessionOptions, execution: DurableExecution);
22
+ prepareRun(): Promise<PreparedRun>;
23
+ invokeInterrupt(config: RunnableConfig, response: string, messages: readonly unknown[]): Promise<Command | AgentOutput | null>;
24
+ streamInterrupt(config: RunnableConfig, captured: readonly Interrupt[], messages: readonly BaseMessage[]): Promise<Command | StreamEvent | null>;
25
+ private settlePendingInterrupts;
26
+ complete(): Promise<void>;
27
+ close(): Promise<void>;
28
+ runInGraphScope<T>(fn: () => T): T;
29
+ }
30
+ //# sourceMappingURL=durable_session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"durable_session.d.ts","sourceRoot":"","sources":["../src/durable_session.ts"],"names":[],"mappings":"AAAA,oDAAoD;AAIpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EACL,OAAO,EAIP,KAAK,kBAAkB,EACvB,KAAK,SAAS,EACf,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EACV,UAAU,EACV,WAAW,EACX,WAAW,EACX,cAAc,EACf,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAuBL,KAAK,cAAc,EAKpB,MAAM,wCAAwC,CAAC;AAEhD,OAAO,EACL,gBAAgB,EAChB,KAAK,WAAW,EAChB,KAAK,cAAc,EACpB,MAAM,wBAAwB,CAAC;AAQhC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AA0LvE,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;IACjC,QAAQ,CAAC,YAAY,EAAE,oBAAoB,CAAC;IAC5C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAiGD,qBAAa,cAAe,SAAQ,gBAAgB;IAClD,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiB;IACzC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAuB;IACpD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAsB;IACxD,OAAO,CAAC,qBAAqB,CAAS;gBAGpC,KAAK,EAAE,kBAAkB,CAAC,OAAO,EAAE,OAAO,CAAC,EAC3C,GAAG,EAAE,cAAc,EACnB,KAAK,EAAE,UAAU,EACjB,OAAO,EAAE,cAAc,EACvB,SAAS,EAAE,gBAAgB;IAiCvB,UAAU,IAAI,OAAO,CAAC,WAAW,CAAC;IAiClC,eAAe,CACnB,MAAM,EAAE,cAAc,EACtB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,SAAS,OAAO,EAAE,GAC3B,OAAO,CAAC,OAAO,GAAG,WAAW,GAAG,IAAI,CAAC;IAclC,eAAe,CACnB,MAAM,EAAE,cAAc,EACtB,QAAQ,EAAE,SAAS,SAAS,EAAE,EAC9B,QAAQ,EAAE,SAAS,WAAW,EAAE,GAC/B,OAAO,CAAC,OAAO,GAAG,WAAW,GAAG,IAAI,CAAC;YAW1B,uBAAuB;IA0JrC,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IASnB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAInB,eAAe,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC;CAK5C"}