@veryfront/ext-llm-anthropic 0.1.1186 → 0.1.1189

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -43,7 +43,8 @@ Automatic `max_tokens` defaults based on model family:
43
43
 
44
44
  | Model | Default max_tokens |
45
45
  | ---------------------------- | ------------------ |
46
- | Claude Opus/Sonnet 4.6 | 128,000 |
46
+ | Claude Opus 4.8/4.7/4.6 | 128,000 |
47
+ | Claude Sonnet 4.6 | 64,000 |
47
48
  | Claude Opus/Sonnet/Haiku 4.5 | 64,000 |
48
49
  | Claude Opus 4.1 | 32,000 |
49
50
  | Claude 3 Haiku | 4,096 |
@@ -70,6 +71,20 @@ Effort-to-budget mapping: `low` = 1024, `medium` = 4096, `high` = 16384, `max` =
70
71
 
71
72
  When thinking is enabled, `temperature` and `topP` are automatically dropped (Anthropic rejects the combo).
72
73
 
74
+ ### Exact Replay
75
+
76
+ Thinking, redacted thinking, ordinary `tool_use`, server-tool calls, and
77
+ server-tool results are retained in assistant provider metadata for later
78
+ turns. Manual callers must carry that metadata forward with the canonical
79
+ assistant message.
80
+
81
+ Raw replay is limited to six assistant messages, 4,096 total content blocks,
82
+ and 8 MiB. When canonical calls or provider-executed results survive, their
83
+ IDs, names, semantic inputs or results, multiplicity, and interleaving must
84
+ match the raw blocks before transport. Structurally valid raw-only history is
85
+ accepted only when the corresponding canonical projection is absent, for
86
+ example after compaction.
87
+
73
88
  ### Prompt Caching
74
89
 
75
90
  Control cache breakpoints via `cacheControl`:
@@ -103,7 +118,13 @@ Already-versioned IDs (e.g. `anthropic.code_execution_20250522`) pass through ve
103
118
 
104
119
  ### MCP Servers
105
120
 
106
- Pass Anthropic-native MCP servers via `mcpServers`. Keys are automatically converted from camelCase to snake_case:
121
+ Pass Anthropic-native MCP server connection details via `mcpServers`. The runtime validates
122
+ that every server has a unique name and an absolute HTTPS URL, emits the current
123
+ `mcp_servers` wire shape, and adds the required
124
+ `mcp-client-2025-11-20` beta without dropping unrelated caller betas.
125
+
126
+ Every server is paired with exactly one `mcp_toolset`. When no toolset is supplied, the
127
+ runtime generates one that enables all tools:
107
128
 
108
129
  ```ts
109
130
  runtime.doGenerate({
@@ -112,15 +133,80 @@ runtime.doGenerate({
112
133
  type: "url",
113
134
  url: "https://example.com/mcp",
114
135
  name: "my-server",
115
- authorizationToken: "Bearer ...",
116
- toolConfiguration: {
117
- enabled: true,
118
- allowedTools: ["search"],
136
+ authorizationToken: "opaque-access-token",
137
+ }],
138
+ });
139
+ ```
140
+
141
+ For current per-tool configuration, add a provider tool whose `name` exactly matches the
142
+ MCP server name. Camel-case arguments are converted recursively to Anthropic's wire names:
143
+
144
+ ```ts
145
+ runtime.doGenerate({
146
+ prompt: [...],
147
+ mcpServers: [{
148
+ type: "url",
149
+ url: "https://example.com/mcp",
150
+ name: "my-server",
151
+ authorizationToken: "opaque-access-token",
152
+ }],
153
+ tools: [{
154
+ type: "provider",
155
+ id: "anthropic.mcp_toolset",
156
+ name: "my-server",
157
+ args: {
158
+ defaultConfig: {
159
+ enabled: false,
160
+ deferLoading: true,
161
+ },
162
+ configs: {
163
+ search: {
164
+ enabled: true,
165
+ deferLoading: false,
166
+ },
167
+ },
119
168
  },
120
169
  }],
121
170
  });
122
171
  ```
123
172
 
173
+ The previously documented convenience form remains supported and is translated to the
174
+ current MCPToolset allowlist contract:
175
+
176
+ ```ts
177
+ mcpServers: [{
178
+ type: "url",
179
+ url: "https://example.com/mcp",
180
+ name: "my-server",
181
+ toolConfiguration: {
182
+ enabled: true,
183
+ allowedTools: ["search"],
184
+ },
185
+ }];
186
+ ```
187
+
188
+ Do not configure the same server or toolset through both `mcpServers` and raw
189
+ `providerOptions`. Ambiguous definitions, duplicate names/toolsets, dangling toolsets,
190
+ unknown MCP fields, non-HTTPS URLs, and malformed tool configuration fail before a network
191
+ request is made. If raw `mcp_servers` and `tools` are supplied through `providerOptions`,
192
+ they must already use Anthropic's current wire contract:
193
+
194
+ ```ts
195
+ providerOptions: {
196
+ anthropic: {
197
+ mcp_servers: [{
198
+ type: "url",
199
+ url: "https://example.com/mcp",
200
+ name: "my-server",
201
+ }],
202
+ tools: [{
203
+ type: "mcp_toolset",
204
+ mcp_server_name: "my-server",
205
+ }],
206
+ },
207
+ }
208
+ ```
209
+
124
210
  ### Container
125
211
 
126
212
  Pass `anthropicContainer` to attach a container context to the request (for computer-use sessions).
@@ -1,3 +1,14 @@
1
+ declare global {
2
+ interface Object {
3
+ /**
4
+ * Determines whether an object has a property with the specified name.
5
+ * @param o An object.
6
+ * @param v A property name.
7
+ */
8
+ hasOwn(o: object, v: PropertyKey): boolean;
9
+ }
10
+ }
11
+ export {};
1
12
  declare global {
2
13
  interface Array<T> {
3
14
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"_dnt.polyfills.d.ts","sourceRoot":"","sources":["../src/_dnt.polyfills.ts"],"names":[],"mappings":"AACA,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,KAAK,CAAC,CAAC;QACf;;;;;;;;WAQG;QACH,QAAQ,CAAC,CAAC,SAAS,CAAC,EAClB,SAAS,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,KAAK,IAAI,CAAC,EACxE,OAAO,CAAC,EAAE,GAAG,GACZ,CAAC,GAAG,SAAS,CAAC;QACjB,QAAQ,CACN,SAAS,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,OAAO,EACzD,OAAO,CAAC,EAAE,GAAG,GACZ,CAAC,GAAG,SAAS,CAAC;QAEjB;;;;;;;;WAQG;QACH,aAAa,CACX,SAAS,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,OAAO,EACzD,OAAO,CAAC,EAAE,GAAG,GACZ,MAAM,CAAC;KACX;IACD,UAAU,UAAU;QAClB;;;;;;;;WAQG;QACH,QAAQ,CAAC,CAAC,SAAS,MAAM,EACvB,SAAS,EAAE,CACP,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,UAAU,KAChB,KAAK,IAAI,CAAC,EACf,OAAO,CAAC,EAAE,GAAG,GACZ,CAAC,GAAG,SAAS,CAAC;QACjB,QAAQ,CACJ,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,KAAK,OAAO,EACvE,OAAO,CAAC,EAAE,GAAG,GACd,MAAM,GAAG,SAAS,CAAC;QAEtB;;;;;;;;WAQG;QACH,aAAa,CACT,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,KAAK,OAAO,EACvE,OAAO,CAAC,EAAE,GAAG,GACd,MAAM,CAAC;KACX;CACF;AA4CD,OAAO,EAAE,CAAC"}
1
+ {"version":3,"file":"_dnt.polyfills.d.ts","sourceRoot":"","sources":["../src/_dnt.polyfills.ts"],"names":[],"mappings":"AAeA,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QACd;;;;WAIG;QACH,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC;KAC5C;CACF;AAED,OAAO,EAAE,CAAC;AAEV,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,KAAK,CAAC,CAAC;QACf;;;;;;;;WAQG;QACH,QAAQ,CAAC,CAAC,SAAS,CAAC,EAClB,SAAS,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,KAAK,IAAI,CAAC,EACxE,OAAO,CAAC,EAAE,GAAG,GACZ,CAAC,GAAG,SAAS,CAAC;QACjB,QAAQ,CACN,SAAS,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,OAAO,EACzD,OAAO,CAAC,EAAE,GAAG,GACZ,CAAC,GAAG,SAAS,CAAC;QAEjB;;;;;;;;WAQG;QACH,aAAa,CACX,SAAS,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,OAAO,EACzD,OAAO,CAAC,EAAE,GAAG,GACZ,MAAM,CAAC;KACX;IACD,UAAU,UAAU;QAClB;;;;;;;;WAQG;QACH,QAAQ,CAAC,CAAC,SAAS,MAAM,EACvB,SAAS,EAAE,CACP,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,UAAU,KAChB,KAAK,IAAI,CAAC,EACf,OAAO,CAAC,EAAE,GAAG,GACZ,CAAC,GAAG,SAAS,CAAC;QACjB,QAAQ,CACJ,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,KAAK,OAAO,EACvE,OAAO,CAAC,EAAE,GAAG,GACd,MAAM,GAAG,SAAS,CAAC;QAEtB;;;;;;;;WAQG;QACH,aAAa,CACT,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,KAAK,OAAO,EACvE,OAAO,CAAC,EAAE,GAAG,GACd,MAAM,CAAC;KACX;CACF;AA4CD,OAAO,EAAE,CAAC"}
@@ -1,3 +1,17 @@
1
+ // https://github.com/tc39/proposal-accessible-object-hasownproperty/blob/main/polyfill.js
2
+ if (!Object.hasOwn) {
3
+ Object.defineProperty(Object, "hasOwn", {
4
+ value: function (object, property) {
5
+ if (object == null) {
6
+ throw new TypeError("Cannot convert undefined or null to object");
7
+ }
8
+ return Object.prototype.hasOwnProperty.call(Object(object), property);
9
+ },
10
+ configurable: true,
11
+ enumerable: false,
12
+ writable: true,
13
+ });
14
+ }
1
15
  function findLastIndex(self, callbackfn, that) {
2
16
  const boundFunc = that === undefined ? callbackfn : callbackfn.bind(that);
3
17
  let index = self.length - 1;
@@ -0,0 +1,27 @@
1
+ export type AnthropicCitation = {
2
+ type: "char_location" | "page_location" | "content_block_location" | "web_search_result_location" | "search_result_location";
3
+ citedText: string;
4
+ url?: string;
5
+ title?: string;
6
+ encryptedIndex?: string;
7
+ source?: string;
8
+ fileId?: string;
9
+ startCharIndex?: number;
10
+ endCharIndex?: number;
11
+ startBlockIndex?: number;
12
+ endBlockIndex?: number;
13
+ startPageNumber?: number;
14
+ endPageNumber?: number;
15
+ documentIndex?: number;
16
+ documentTitle?: string;
17
+ searchResultIndex?: number;
18
+ };
19
+ /**
20
+ * Validates and normalizes the current Messages API citation union.
21
+ *
22
+ * Citation records are provider-controlled protocol data. Returning
23
+ * `undefined` for any malformed or unknown variant lets callers fail the
24
+ * successful response closed instead of silently discarding attribution.
25
+ */
26
+ export declare function normalizeAnthropicCitation(raw: unknown): AnthropicCitation | undefined;
27
+ //# sourceMappingURL=anthropic-citations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic-citations.d.ts","sourceRoot":"","sources":["../src/anthropic-citations.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EACA,eAAe,GACf,eAAe,GACf,wBAAwB,GACxB,4BAA4B,GAC5B,wBAAwB,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B,CAAC;AA8CF;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CACxC,GAAG,EAAE,OAAO,GACX,iBAAiB,GAAG,SAAS,CAsH/B"}
@@ -0,0 +1,138 @@
1
+ import { readRecord } from "veryfront/provider/shared";
2
+ function readRequiredString(record, field) {
3
+ const value = record[field];
4
+ return typeof value === "string" ? value : undefined;
5
+ }
6
+ function readOptionalNullableString(record, field) {
7
+ const value = record[field];
8
+ return value === undefined || value === null || typeof value === "string" ? value : undefined;
9
+ }
10
+ function readNonNegativeInteger(record, field) {
11
+ const value = record[field];
12
+ return typeof value === "number" &&
13
+ Number.isSafeInteger(value) &&
14
+ value >= 0
15
+ ? value
16
+ : undefined;
17
+ }
18
+ function hasValidOptionalNullableString(record, field) {
19
+ return record[field] === undefined ||
20
+ record[field] === null ||
21
+ typeof record[field] === "string";
22
+ }
23
+ function withOptionalString(key, value) {
24
+ return typeof value === "string" ? { [key]: value } : {};
25
+ }
26
+ /**
27
+ * Validates and normalizes the current Messages API citation union.
28
+ *
29
+ * Citation records are provider-controlled protocol data. Returning
30
+ * `undefined` for any malformed or unknown variant lets callers fail the
31
+ * successful response closed instead of silently discarding attribution.
32
+ */
33
+ export function normalizeAnthropicCitation(raw) {
34
+ const record = readRecord(raw);
35
+ if (!record || typeof record.type !== "string")
36
+ return undefined;
37
+ const citedText = readRequiredString(record, "cited_text");
38
+ if (citedText === undefined)
39
+ return undefined;
40
+ if (record.type === "web_search_result_location") {
41
+ const url = readRequiredString(record, "url");
42
+ const encryptedIndex = readRequiredString(record, "encrypted_index");
43
+ const title = readOptionalNullableString(record, "title");
44
+ if (url === undefined ||
45
+ encryptedIndex === undefined ||
46
+ !hasValidOptionalNullableString(record, "title")) {
47
+ return undefined;
48
+ }
49
+ return {
50
+ type: record.type,
51
+ citedText,
52
+ url,
53
+ encryptedIndex,
54
+ ...withOptionalString("title", title),
55
+ };
56
+ }
57
+ if (record.type === "search_result_location") {
58
+ const source = readRequiredString(record, "source");
59
+ const title = readOptionalNullableString(record, "title");
60
+ const searchResultIndex = readNonNegativeInteger(record, "search_result_index");
61
+ const startBlockIndex = readNonNegativeInteger(record, "start_block_index");
62
+ const endBlockIndex = readNonNegativeInteger(record, "end_block_index");
63
+ if (source === undefined ||
64
+ searchResultIndex === undefined ||
65
+ startBlockIndex === undefined ||
66
+ endBlockIndex === undefined ||
67
+ endBlockIndex <= startBlockIndex ||
68
+ !hasValidOptionalNullableString(record, "title")) {
69
+ return undefined;
70
+ }
71
+ return {
72
+ type: record.type,
73
+ citedText,
74
+ source,
75
+ searchResultIndex,
76
+ startBlockIndex,
77
+ endBlockIndex,
78
+ ...withOptionalString("title", title),
79
+ };
80
+ }
81
+ const documentIndex = readNonNegativeInteger(record, "document_index");
82
+ const documentTitle = readOptionalNullableString(record, "document_title");
83
+ const fileId = readOptionalNullableString(record, "file_id");
84
+ if (documentIndex === undefined ||
85
+ !hasValidOptionalNullableString(record, "document_title") ||
86
+ !hasValidOptionalNullableString(record, "file_id")) {
87
+ return undefined;
88
+ }
89
+ const common = {
90
+ citedText,
91
+ documentIndex,
92
+ ...withOptionalString("documentTitle", documentTitle),
93
+ ...withOptionalString("fileId", fileId),
94
+ };
95
+ if (record.type === "char_location") {
96
+ const startCharIndex = readNonNegativeInteger(record, "start_char_index");
97
+ const endCharIndex = readNonNegativeInteger(record, "end_char_index");
98
+ return startCharIndex !== undefined &&
99
+ endCharIndex !== undefined &&
100
+ endCharIndex >= startCharIndex
101
+ ? {
102
+ type: record.type,
103
+ ...common,
104
+ startCharIndex,
105
+ endCharIndex,
106
+ }
107
+ : undefined;
108
+ }
109
+ if (record.type === "page_location") {
110
+ const startPageNumber = readNonNegativeInteger(record, "start_page_number");
111
+ const endPageNumber = readNonNegativeInteger(record, "end_page_number");
112
+ return startPageNumber !== undefined &&
113
+ endPageNumber !== undefined &&
114
+ endPageNumber >= startPageNumber
115
+ ? {
116
+ type: record.type,
117
+ ...common,
118
+ startPageNumber,
119
+ endPageNumber,
120
+ }
121
+ : undefined;
122
+ }
123
+ if (record.type === "content_block_location") {
124
+ const startBlockIndex = readNonNegativeInteger(record, "start_block_index");
125
+ const endBlockIndex = readNonNegativeInteger(record, "end_block_index");
126
+ return startBlockIndex !== undefined &&
127
+ endBlockIndex !== undefined &&
128
+ endBlockIndex > startBlockIndex
129
+ ? {
130
+ type: record.type,
131
+ ...common,
132
+ startBlockIndex,
133
+ endBlockIndex,
134
+ }
135
+ : undefined;
136
+ }
137
+ return undefined;
138
+ }
@@ -0,0 +1,36 @@
1
+ type AnthropicMcpToolConfig = {
2
+ enabled?: boolean;
3
+ defer_loading?: boolean;
4
+ };
5
+ type AnthropicMcpToolset = {
6
+ type: "mcp_toolset";
7
+ mcp_server_name: string;
8
+ default_config?: AnthropicMcpToolConfig;
9
+ configs?: Record<string, AnthropicMcpToolConfig>;
10
+ cache_control?: {
11
+ type: "ephemeral";
12
+ ttl?: "5m" | "1h";
13
+ };
14
+ };
15
+ export type AnthropicMcpRequestConfiguration = {
16
+ servers: Array<Record<string, unknown>>;
17
+ defaultToolsets: AnthropicMcpToolset[];
18
+ legacyConfiguredServerNames: ReadonlySet<string>;
19
+ };
20
+ /**
21
+ * Validate and translate the existing camelCase MCP convenience option into
22
+ * Anthropic's current MCP server and MCPToolset wire objects.
23
+ */
24
+ export declare function normalizeAnthropicMcpServers(rawServers: unknown): AnthropicMcpRequestConfiguration | undefined;
25
+ /**
26
+ * Convert generic provider-tool arguments without rewriting the dynamic tool
27
+ * names used as keys in `configs`.
28
+ */
29
+ export declare function normalizeAnthropicMcpToolsetArgs(rawArgs: Record<string, unknown>): Omit<AnthropicMcpToolset, "type" | "mcp_server_name">;
30
+ /**
31
+ * Validate the final request after raw provider options have been merged.
32
+ * Returns whether the current MCP connector beta is required.
33
+ */
34
+ export declare function assertAnthropicMcpRequestContract(body: Record<string, unknown>): boolean;
35
+ export {};
36
+ //# sourceMappingURL=anthropic-mcp-request.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic-mcp-request.d.ts","sourceRoot":"","sources":["../src/anthropic-mcp-request.ts"],"names":[],"mappings":"AAAA,KAAK,sBAAsB,GAAG;IAC5B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB,CAAC;AAEF,KAAK,mBAAmB,GAAG;IACzB,IAAI,EAAE,aAAa,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,sBAAsB,CAAC;IACxC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC;IACjD,aAAa,CAAC,EAAE;QACd,IAAI,EAAE,WAAW,CAAC;QAClB,GAAG,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;KACnB,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,gCAAgC,GAAG;IAC7C,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACxC,eAAe,EAAE,mBAAmB,EAAE,CAAC;IACvC,2BAA2B,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CAClD,CAAC;AAoJF;;;GAGG;AACH,wBAAgB,4BAA4B,CAC1C,UAAU,EAAE,OAAO,GAClB,gCAAgC,GAAG,SAAS,CAoF9C;AA6BD;;;GAGG;AACH,wBAAgB,gCAAgC,CAC9C,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,IAAI,CAAC,mBAAmB,EAAE,MAAM,GAAG,iBAAiB,CAAC,CAqDvD;AAiGD;;;GAGG;AACH,wBAAgB,iCAAiC,CAC/C,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAmET"}