@contenthero/mcp 0.4.12 → 0.4.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,35 @@
1
+ /**
2
+ * How a model is PRESENTED, remembered from the catalog the server already fetches.
3
+ *
4
+ * ## ⭐⭐ THIS IS NOT THE CACHE THAT WAS DELETED
5
+ *
6
+ * This package once fetched the whole model catalog on every chip and kept a module-level copy behind a
7
+ * `catch` that returned the RAW ID. An id reads enough like a label that a failed fetch surfaced as a chip
8
+ * flickering between kebab case and title case, with nothing logging why. Deleting it was correct.
9
+ *
10
+ * Two things are different here. A failure renders NO CHIP, never an id: the map is simply empty and every
11
+ * card loads without one, which is exactly what happens today. And it costs no request of its own, because
12
+ * `resolveModelEnums` already calls `listModels` at startup for the tool enums and these fields ride along
13
+ * in the same rows.
14
+ *
15
+ * ## Why it exists at all
16
+ *
17
+ * The prompt, the model and the shape are all decided at SUBMIT, but a card used to show none of them until
18
+ * the generation FINISHED and the completed row carried its own provenance. So the entire loading period,
19
+ * which is the part a person actually watches, was placeholders and nothing else.
20
+ *
21
+ * ⛔ IT LIVES IN ITS OWN MODULE because `server.ts` reads it and `models.ts` writes it. Putting it in
22
+ * either one makes those two import each other, and a cycle between the tool definitions and the catalog
23
+ * resolver is the kind of thing that works until a bundler orders them differently.
24
+ */
25
+ import type { ModelInfo } from '@contenthero/sdk';
26
+ export interface ModelChip {
27
+ name: string;
28
+ brandColor: string | null;
29
+ iconKey: string | null;
30
+ }
31
+ /** Replace what is known about every model. Called once per catalog fetch. */
32
+ export declare function rememberModelPresentation(models: readonly ModelInfo[]): void;
33
+ /** The chip for a model id, or null when the catalog does not name it. Null means render nothing. */
34
+ export declare function modelChipFor(modelId: string | null | undefined): ModelChip | null;
35
+ //# sourceMappingURL=model-presentation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-presentation.d.ts","sourceRoot":"","sources":["../src/model-presentation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAEjD,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;CACvB;AAID,8EAA8E;AAC9E,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,SAAS,SAAS,EAAE,GAAG,IAAI,CAY5E;AAED,qGAAqG;AACrG,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,SAAS,GAAG,IAAI,CAEjF"}
package/dist/models.d.ts CHANGED
@@ -21,7 +21,7 @@
21
21
  */
22
22
  import type { ContentHero } from '@contenthero/sdk';
23
23
  /** Fallback image-generation models (used only if discovery is unreachable). */
24
- export declare const IMAGE_MODELS_FALLBACK: readonly ["nano-banana-2", "nano-banana", "nano-banana-pro", "seedream-5-lite", "gpt-image-2", "flux-2-pro", "flux-1-kontext"];
24
+ export declare const IMAGE_MODELS_FALLBACK: readonly ["nano-banana-2", "nano-banana", "nano-banana-pro", "seedream-5-lite", "gpt-image-2", "flux-2-pro", "flux-1-kontext-pro"];
25
25
  /** Fallback video-generation models (used only if discovery is unreachable). */
26
26
  export declare const VIDEO_MODELS_FALLBACK: readonly ["veo-3.1-fast", "veo-3.1-quality", "seedance-2", "seedance-2-fast", "kling-3.0", "kling-2.6", "kling-3.0-motion-control", "kling-2.6-motion-control", "wan-2.6"];
27
27
  /** Fallback audio-generation models (used only if discovery is unreachable). */
@@ -68,7 +68,7 @@ export declare const BOARD_TYPES: readonly ["character", "pose", "mascot", "crea
68
68
  /** Short selection guidance baked into the generate_board boardType description. */
69
69
  export declare const BOARD_TYPE_GUIDANCE = "character = a person or figure. pose = a pose / action sheet. mascot = a brand mascot. creature = a creature or animal. weapon = a weapon. vehicle = a vehicle. object = a prop or object. location = an environment. shot = a multi-shot storyboard in one image.";
70
70
  /** Short selection guidance baked into each generate tool's modelId description. */
71
- export declare const IMAGE_MODEL_GUIDANCE = "nano-banana-2 = strong general default (1K/2K/4K). gpt-image-2 = best text rendering (resolution 1K/2K/4K, no quality param). flux-2-pro (mode pro|flex) / seedream-5-lite / nano-banana-pro = alternatives. flux-1-kontext (mode pro|max) = edit/recreate. Pass referenceImages for image-to-image / editing; pass mode for flux models.";
71
+ export declare const IMAGE_MODEL_GUIDANCE = "nano-banana-2 = strong general default (1K/2K/4K). gpt-image-2 = best text rendering (resolution 1K/2K/4K, no quality param). flux-2-pro / seedream-5-lite / nano-banana-pro = alternatives. flux-1-kontext-pro = edit/recreate. Higher tiers are separate ids, not a parameter: flux-2-flex, flux-1-kontext-max, wan-2.7-image-pro. Pass referenceImages for image-to-image / editing.";
72
72
  export declare const VIDEO_MODEL_GUIDANCE = "veo-3.1-fast / veo-3.1-quality = high quality clips with audio. seedance-2 / seedance-2-fast = multimodal references; startFrame(+endFrame) = frame mode, referenceImages/Videos/Audio = references mode. kling-3.0 (per-shot via shots) / kling-2.6 = strong motion. wan-2.6 (multiShot for multi-shot mode) = alternative. The motion-control variants require an input image plus an input video.";
73
73
  export declare const AUDIO_MODEL_GUIDANCE = "elevenlabs-tts = text to speech (needs text + voiceId). elevenlabs-music = music from a prompt. elevenlabs-sound-effects = a sound effect from a prompt.";
74
74
  export declare const EDIT_AUDIO_MODEL_GUIDANCE = "The audio-processing model. Each transforms audio input into audio output. elevenlabs-voice-isolator = remove background noise and music, leaving clean speech (synchronous). auphonic-enhance = level loudness and clean up background noise (asynchronous; poll get_generation_status).";
@@ -1 +1 @@
1
- {"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../src/models.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAEnD,gFAAgF;AAChF,eAAO,MAAM,qBAAqB,gIAQxB,CAAA;AAEV,gFAAgF;AAChF,eAAO,MAAM,qBAAqB,4KAUxB,CAAA;AAEV,gFAAgF;AAChF,eAAO,MAAM,qBAAqB,6EAIxB,CAAA;AAEV,uGAAuG;AACvG,eAAO,MAAM,0BAA0B,4DAA6D,CAAA;AAEpG,uEAAuE;AACvE,eAAO,MAAM,uBAAuB,yDAA0D,CAAA;AAE9F,wEAAwE;AACxE,eAAO,MAAM,wBAAwB,+DAAgE,CAAA;AAQrG,+DAA+D;AAC/D,MAAM,MAAM,SAAS,GAAG,CAAC,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC,CAAA;AAE7C,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,SAAS,CAAA;IAChB,KAAK,EAAE,SAAS,CAAA;IAChB,KAAK,EAAE,SAAS,CAAA;IAChB,0FAA0F;IAC1F,SAAS,EAAE,SAAS,CAAA;IACpB,OAAO,EAAE,SAAS,CAAA;IAClB,OAAO,EAAE,SAAS,CAAA;IAClB,2EAA2E;IAC3E,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,CAAA;CACtD;AAMD;;;;;GAKG;AACH,wBAAgB,kBAAkB,IAAI,kBAAkB,CAUvD;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,CAAC,SAAS,EAAE,MAAM,WAAW,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAuDjG;AAED;;;;;GAKG;AACH,eAAO,MAAM,WAAW,yGAUd,CAAA;AAEV,oFAAoF;AACpF,eAAO,MAAM,mBAAmB,uQACsO,CAAA;AAEtQ,oFAAoF;AACpF,eAAO,MAAM,oBAAoB,8UAC4S,CAAA;AAE7U,eAAO,MAAM,oBAAoB,yYACuW,CAAA;AAExY,eAAO,MAAM,oBAAoB,6JAC2H,CAAA;AAE5J,eAAO,MAAM,yBAAyB,8RACuP,CAAA;AAE7R,eAAO,MAAM,sBAAsB,yKACqI,CAAA;AAExK,eAAO,MAAM,uBAAuB,+MAC0K,CAAA"}
1
+ {"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../src/models.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAGnD,gFAAgF;AAChF,eAAO,MAAM,qBAAqB,oIAQxB,CAAA;AAEV,gFAAgF;AAChF,eAAO,MAAM,qBAAqB,4KAUxB,CAAA;AAEV,gFAAgF;AAChF,eAAO,MAAM,qBAAqB,6EAIxB,CAAA;AAEV,uGAAuG;AACvG,eAAO,MAAM,0BAA0B,4DAA6D,CAAA;AAEpG,uEAAuE;AACvE,eAAO,MAAM,uBAAuB,yDAA0D,CAAA;AAE9F,wEAAwE;AACxE,eAAO,MAAM,wBAAwB,+DAAgE,CAAA;AAQrG,+DAA+D;AAC/D,MAAM,MAAM,SAAS,GAAG,CAAC,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC,CAAA;AAE7C,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,SAAS,CAAA;IAChB,KAAK,EAAE,SAAS,CAAA;IAChB,KAAK,EAAE,SAAS,CAAA;IAChB,0FAA0F;IAC1F,SAAS,EAAE,SAAS,CAAA;IACpB,OAAO,EAAE,SAAS,CAAA;IAClB,OAAO,EAAE,SAAS,CAAA;IAClB,2EAA2E;IAC3E,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,CAAA;CACtD;AAMD;;;;;GAKG;AACH,wBAAgB,kBAAkB,IAAI,kBAAkB,CAUvD;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,CAAC,SAAS,EAAE,MAAM,WAAW,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA6DjG;AAED;;;;;GAKG;AACH,eAAO,MAAM,WAAW,yGAUd,CAAA;AAEV,oFAAoF;AACpF,eAAO,MAAM,mBAAmB,uQACsO,CAAA;AAEtQ,oFAAoF;AACpF,eAAO,MAAM,oBAAoB,4XAC0V,CAAA;AAE3X,eAAO,MAAM,oBAAoB,yYACuW,CAAA;AAExY,eAAO,MAAM,oBAAoB,6JAC2H,CAAA;AAE5J,eAAO,MAAM,yBAAyB,8RACuP,CAAA;AAE7R,eAAO,MAAM,sBAAsB,yKACqI,CAAA;AAExK,eAAO,MAAM,uBAAuB,+MAC0K,CAAA"}
package/dist/server.d.ts CHANGED
@@ -29,6 +29,7 @@
29
29
  * (generate / upscale / lip-sync) gets a tool whose schema only carries its own
30
30
  * fields, and per-tool modelId enums prevent cross-type model misuse.
31
31
  */
32
+ import type { Implementation } from '@modelcontextprotocol/sdk/types.js';
32
33
  import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
33
34
  import { ContentHero, type Generation } from '@contenthero/sdk';
34
35
  export { GENERATION_WIDGET_URI } from './widget-uri.js';
@@ -79,6 +80,57 @@ import { type GeneratedAttachment } from './format.js';
79
80
  * unlocks this, and it is its own piece of work rather than a prerequisite for rendering.
80
81
  */
81
82
  export declare function attachmentsFor(gen: Generation): Promise<GeneratedAttachment[]>;
83
+ /**
84
+ * ⭐⭐⭐ **WHY AN IMAGE WAS NOT ATTACHED, AS A VALUE RATHER THAN AS SILENCE.**
85
+ *
86
+ * `fetchImageBytes` returned `null` for five genuinely different reasons and the summary line reported one
87
+ * number: "0 image(s) attached below". That cost a week. Two separate defects were live at once (a rewrite
88
+ * rule that had stopped firing, and masters that outgrew every budget) and the result could not distinguish
89
+ * them from a network blip, so every theory was equally consistent with the evidence.
90
+ *
91
+ * ⛔ **A COUNT IS NOT A DIAGNOSIS.** Whatever replaces this must keep naming the cause. The rule the codebase
92
+ * keeps relearning: a sentinel that collapses distinct failures into one value moves the defect into every
93
+ * caller, and here the caller was a person reading a transcript.
94
+ */
95
+ type ImageSkipReason = 'host-not-allowed' | 'fetch-failed' | 'not-ok' | 'not-an-image'
96
+ /** Bigger than the whole per-result allowance: it would never have fit, at any position in the call. */
97
+ | 'over-budget'
98
+ /**
99
+ * Small enough on its own, but the earlier items in this call had already spent the shared allowance.
100
+ *
101
+ * ⭐ DISTINCT FROM `over-budget` BECAUSE THE FIX IS DIFFERENT AND THE READER CAN ACT ON IT. "Too large"
102
+ * invites resizing an asset that is already small; "ask for fewer items" is the actual remedy, and it is
103
+ * the reading that tells you the tail of a long batch was truncated rather than broken.
104
+ */
105
+ | 'budget-spent';
106
+ /**
107
+ * ⭐⭐⭐ **THE ONE PLACE THAT DECIDES HOW MUCH OF A RESULT MAY BE BYTES.**
108
+ *
109
+ * Two call sites needed this and each had its own answer, which is how the same defect appeared twice at
110
+ * different levels: `attachmentsFor` capped PER ITEM while the host's ceiling is per RESULT, and `get_media`
111
+ * fetched up to TEN images in parallel with no cap at all (10 x 840 KB is 8 MB against a 1 MB limit).
112
+ *
113
+ * ⛔ SEQUENTIAL, DELIBERATELY. The budget is shared state, so a parallel fetch cannot know what the others
114
+ * already spent and every one of them would pass a check the set as a whole fails. Most calls carry one to
115
+ * three items, so the latency is small and the alternative is a ceiling that holds only by luck.
116
+ *
117
+ * Returns one entry per input, positionally aligned with what was asked for. An entry that did not attach
118
+ * carries WHY, because the count alone is not diagnosable: see `ImageSkipReason`.
119
+ */
120
+ export interface InlinedImage {
121
+ image: {
122
+ data: string;
123
+ mimeType: string;
124
+ } | null;
125
+ /** Set only when `image` is null. Short enough to print in a result line. */
126
+ skipped?: string;
127
+ /**
128
+ * The machine-readable cause, so a formatter can decide what to SAY about a set of them without parsing
129
+ * the sentence it is about to print. "Ask for fewer items" is advice about the whole call, so it belongs
130
+ * once at the end rather than repeated per item.
131
+ */
132
+ reason?: ImageSkipReason;
133
+ }
82
134
  /**
83
135
  * ⛔⛔ **THE DISPLAY NAME IS NO LONGER RESOLVED HERE. `Generation.modelDisplayName` CARRIES IT.**
84
136
  *
@@ -116,6 +168,30 @@ export interface BuildServerOptions {
116
168
  * enums are supplied pre-resolved, and the backend client is resolved per call.
117
169
  */
118
170
  export declare function registerTools(server: McpServer, opts: RegisterToolsOptions): void;
171
+ /**
172
+ * ⭐⭐⭐ **WHO THIS SERVER SAYS IT IS, FOR BOTH TRANSPORTS, FROM ONE PLACE.**
173
+ *
174
+ * The stdio server named itself `contenthero` here. The HOSTED server never named itself at all: the app's
175
+ * route calls `createMcpHandler(register, {}, config)` and that empty second argument is `serverOptions`,
176
+ * so `mcp-handler` fell back to its own default, `"mcp-typescript server on vercel"`.
177
+ *
178
+ * ⛔⛔ **AND THAT DEFAULT IS WHAT A USER NAMES THE CONNECTION.** Measured in Gemini 2026-09-21: the "Save
179
+ * your custom app" dialog pre-filled **"Mcp Typescript Server On Vercel"** next to our laurel mark and a
180
+ * correct list of 88 tools. Every person connecting over the hosted transport has been offered someone
181
+ * else's build-tool name as our product name, in the one dialog that decides what they will call us
182
+ * forever. Claude and ChatGPT never surfaced it, so nothing made it visible until a host put it in a text
183
+ * field.
184
+ *
185
+ * ⚠️ EXPORTED, NOT RESTATED. A second literal in the app's route would be a third spelling of one identity
186
+ * across two repos, which is the same shape as the widget uri problem: correct on the day it is typed and
187
+ * silently stale afterwards.
188
+ *
189
+ * ⛔ The VERSION half used to parse `../package.json` relative to `import.meta.url` inside a try/catch
190
+ * returning '0.0.0'. Same defect as the widget read and the same blast radius: under a bundler the path
191
+ * does not exist, so the hosted server reported 0.0.0 and the catch made it silent. A version is a
192
+ * build-time fact, so it is generated alongside the widget and no path resolution is left to get wrong.
193
+ */
194
+ export declare const SERVER_INFO: Implementation;
119
195
  /**
120
196
  * Build a stdio-style server bound to a single env-configured client. The model
121
197
  * enums are resolved live from the discovery catalog (the client has a key).
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAenE,OAAO,EACL,WAAW,EAcX,KAAK,UAAU,EAChB,MAAM,kBAAkB,CAAA;AAazB,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAA;AAEvD,OAAO,EAEL,KAAK,kBAAkB,EASxB,MAAM,aAAa,CAAA;AACpB,OAAO,EAeL,KAAK,mBAAmB,EA+DzB,MAAM,aAAa,CAAA;AAgLpB;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,cAAc,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAwDpF;AAoPD;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,iFAAiF;AACjF,MAAM,MAAM,SAAS,GAAG,CAAC,KAAK,CAAC,EAAE,OAAO,KAAK,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAAA;AAE/E,MAAM,WAAW,oBAAoB;IACnC,8EAA8E;IAC9E,SAAS,EAAE,SAAS,CAAA;IACpB,2EAA2E;IAC3E,MAAM,EAAE,kBAAkB,CAAA;CAC3B;AAED,MAAM,WAAW,kBAAkB;IACjC,kFAAkF;IAClF,SAAS,CAAC,EAAE,MAAM,WAAW,CAAA;CAC9B;AAYD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,oBAAoB,GAAG,IAAI,CAyoGjF;AAeD;;;GAGG;AACH,wBAAsB,WAAW,CAAC,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,SAAS,CAAC,CAMtF"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAA;AACxE,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAgBnE,OAAO,EACL,WAAW,EAcX,KAAK,UAAU,EAChB,MAAM,kBAAkB,CAAA;AAazB,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAA;AAEvD,OAAO,EAEL,KAAK,kBAAkB,EASxB,MAAM,aAAa,CAAA;AACpB,OAAO,EAeL,KAAK,mBAAmB,EAgEzB,MAAM,aAAa,CAAA;AA4LpB;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,cAAc,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAoEpF;AAqGD;;;;;;;;;;;GAWG;AACH,KAAK,eAAe,GAChB,kBAAkB,GAClB,cAAc,GACd,QAAQ,GACR,cAAc;AAChB,wGAAwG;GACtG,aAAa;AACf;;;;;;GAMG;GACD,cAAc,CAAA;AA8HlB;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAA;IAChD,6EAA6E;IAC7E,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB;;;;OAIG;IACH,MAAM,CAAC,EAAE,eAAe,CAAA;CACzB;AA+KD;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,iFAAiF;AACjF,MAAM,MAAM,SAAS,GAAG,CAAC,KAAK,CAAC,EAAE,OAAO,KAAK,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAAA;AAE/E,MAAM,WAAW,oBAAoB;IACnC,8EAA8E;IAC9E,SAAS,EAAE,SAAS,CAAA;IACpB,2EAA2E;IAC3E,MAAM,EAAE,kBAAkB,CAAA;CAC3B;AAED,MAAM,WAAW,kBAAkB;IACjC,kFAAkF;IAClF,SAAS,CAAC,EAAE,MAAM,WAAW,CAAA;CAC9B;AAYD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,oBAAoB,GAAG,IAAI,CA8yGjF;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,eAAO,MAAM,WAAW,EAAE,cA2BzB,CAAA;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAAC,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,SAAS,CAAC,CAMtF"}